StyleValue.h 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2021, Tobias Christiansen <tobyase@serenityos.org>
  4. * Copyright (c) 2021, Sam Atkins <atkinssj@serenityos.org>
  5. *
  6. * SPDX-License-Identifier: BSD-2-Clause
  7. */
  8. #pragma once
  9. #include <AK/NonnullOwnPtr.h>
  10. #include <AK/NonnullOwnPtrVector.h>
  11. #include <AK/NonnullRefPtrVector.h>
  12. #include <AK/RefCounted.h>
  13. #include <AK/RefPtr.h>
  14. #include <AK/String.h>
  15. #include <AK/StringView.h>
  16. #include <AK/URL.h>
  17. #include <AK/Variant.h>
  18. #include <AK/Vector.h>
  19. #include <AK/WeakPtr.h>
  20. #include <LibGfx/Bitmap.h>
  21. #include <LibGfx/Color.h>
  22. #include <LibWeb/CSS/Length.h>
  23. #include <LibWeb/CSS/Parser/StyleComponentValueRule.h>
  24. #include <LibWeb/CSS/PropertyID.h>
  25. #include <LibWeb/CSS/ValueID.h>
  26. #include <LibWeb/Forward.h>
  27. #include <LibWeb/Loader/ImageResource.h>
  28. namespace Web::CSS {
  29. enum class Position {
  30. Static,
  31. Relative,
  32. Absolute,
  33. Fixed,
  34. Sticky,
  35. };
  36. enum class TextAlign {
  37. Left,
  38. Center,
  39. Right,
  40. Justify,
  41. LibwebCenter,
  42. };
  43. enum class TextDecorationLine {
  44. None,
  45. Underline,
  46. Overline,
  47. LineThrough,
  48. Blink,
  49. };
  50. enum class TextTransform {
  51. None,
  52. Capitalize,
  53. Uppercase,
  54. Lowercase,
  55. FullWidth,
  56. FullSizeKana,
  57. };
  58. enum class Display {
  59. None,
  60. Block,
  61. Inline,
  62. InlineBlock,
  63. ListItem,
  64. Table,
  65. TableRow,
  66. TableCell,
  67. TableHeaderGroup,
  68. TableRowGroup,
  69. TableFooterGroup,
  70. TableColumn,
  71. TableColumnGroup,
  72. TableCaption,
  73. Flex,
  74. };
  75. enum class FlexDirection {
  76. Row,
  77. RowReverse,
  78. Column,
  79. ColumnReverse,
  80. };
  81. enum class FlexWrap {
  82. Nowrap,
  83. Wrap,
  84. WrapReverse
  85. };
  86. enum class FlexBasis {
  87. Content,
  88. Length,
  89. Auto,
  90. };
  91. enum class WhiteSpace {
  92. Normal,
  93. Pre,
  94. Nowrap,
  95. PreLine,
  96. PreWrap,
  97. };
  98. enum class Float {
  99. None,
  100. Left,
  101. Right,
  102. };
  103. enum class Clear {
  104. None,
  105. Left,
  106. Right,
  107. Both,
  108. };
  109. enum class Cursor {
  110. Auto,
  111. Default,
  112. None,
  113. ContextMenu,
  114. Help,
  115. Pointer,
  116. Progress,
  117. Wait,
  118. Cell,
  119. Crosshair,
  120. Text,
  121. VerticalText,
  122. Alias,
  123. Copy,
  124. Move,
  125. NoDrop,
  126. NotAllowed,
  127. Grab,
  128. Grabbing,
  129. EResize,
  130. NResize,
  131. NeResize,
  132. NwResize,
  133. SResize,
  134. SeResize,
  135. SwResize,
  136. WResize,
  137. EwResize,
  138. NsResize,
  139. NeswResize,
  140. NwseResize,
  141. ColResize,
  142. RowResize,
  143. AllScroll,
  144. ZoomIn,
  145. ZoomOut,
  146. };
  147. enum class LineStyle {
  148. None,
  149. Hidden,
  150. Dotted,
  151. Dashed,
  152. Solid,
  153. Double,
  154. Groove,
  155. Ridge,
  156. Inset,
  157. Outset,
  158. };
  159. enum class ListStyleType {
  160. None,
  161. Disc,
  162. Circle,
  163. Square,
  164. Decimal,
  165. DecimalLeadingZero,
  166. LowerAlpha,
  167. LowerLatin,
  168. LowerRoman,
  169. UpperAlpha,
  170. UpperLatin,
  171. UpperRoman,
  172. };
  173. enum class Overflow : u8 {
  174. Auto,
  175. Clip,
  176. Hidden,
  177. Scroll,
  178. Visible,
  179. };
  180. enum class Repeat : u8 {
  181. NoRepeat,
  182. Repeat,
  183. Round,
  184. Space,
  185. };
  186. enum class JustifyContent {
  187. FlexStart,
  188. FlexEnd,
  189. Center,
  190. SpaceBetween,
  191. SpaceAround,
  192. };
  193. enum class AlignItems {
  194. FlexStart,
  195. FlexEnd,
  196. Center,
  197. Baseline,
  198. Stretch,
  199. };
  200. enum class TransformFunction {
  201. TranslateY,
  202. };
  203. class StyleValue : public RefCounted<StyleValue> {
  204. public:
  205. virtual ~StyleValue();
  206. enum class Type {
  207. Invalid,
  208. Inherit,
  209. Initial,
  210. Unset,
  211. String,
  212. Length,
  213. Color,
  214. Identifier,
  215. Image,
  216. CustomProperty,
  217. Numeric,
  218. ValueList,
  219. Calculated,
  220. Background,
  221. BackgroundRepeat,
  222. Border,
  223. BorderRadius,
  224. CombinedBorderRadius,
  225. BoxShadow,
  226. Flex,
  227. FlexFlow,
  228. Font,
  229. ListStyle,
  230. Overflow,
  231. TextDecoration,
  232. Transformation,
  233. };
  234. Type type() const { return m_type; }
  235. bool is_inherit() const { return type() == Type::Inherit; }
  236. bool is_initial() const { return type() == Type::Initial; }
  237. bool is_unset() const { return type() == Type::Unset; }
  238. bool is_color() const;
  239. bool is_identifier() const { return type() == Type::Identifier || is_auto(); }
  240. bool is_image() const { return type() == Type::Image; }
  241. bool is_string() const { return type() == Type::String; }
  242. virtual bool is_length() const { return type() == Type::Length; }
  243. bool is_custom_property() const { return type() == Type::CustomProperty; }
  244. bool is_numeric() const { return type() == Type::Numeric; }
  245. bool is_value_list() const { return type() == Type::ValueList; }
  246. bool is_calculated() const { return type() == Type::Calculated; }
  247. bool is_background() const { return type() == Type::Background; }
  248. bool is_background_repeat() const { return type() == Type::BackgroundRepeat; }
  249. bool is_border() const { return type() == Type::Border; }
  250. bool is_border_radius() const { return type() == Type::BorderRadius; }
  251. bool is_box_shadow() const { return type() == Type::BoxShadow; }
  252. bool is_flex() const { return type() == Type::Flex; }
  253. bool is_flex_flow() const { return type() == Type::FlexFlow; }
  254. bool is_font() const { return type() == Type::Font; }
  255. bool is_list_style() const { return type() == Type::ListStyle; }
  256. bool is_overflow() const { return type() == Type::Overflow; }
  257. bool is_text_decoration() const { return type() == Type::TextDecoration; }
  258. bool is_transformation() const { return type() == Type::Transformation; }
  259. bool is_builtin() const { return is_inherit() || is_initial() || is_unset(); }
  260. bool is_builtin_or_dynamic() const
  261. {
  262. return is_builtin() || is_custom_property() || is_calculated();
  263. }
  264. virtual String to_string() const = 0;
  265. virtual Length to_length() const { return {}; }
  266. virtual Color to_color(Layout::NodeWithStyle const&) const { return {}; }
  267. CSS::ValueID to_identifier() const;
  268. virtual bool is_auto() const { return false; }
  269. bool operator==(const StyleValue& other) const { return equals(other); }
  270. bool operator!=(const StyleValue& other) const { return !(*this == other); }
  271. virtual bool equals(const StyleValue& other) const
  272. {
  273. if (type() != other.type())
  274. return false;
  275. return to_string() == other.to_string();
  276. }
  277. protected:
  278. explicit StyleValue(Type);
  279. private:
  280. Type m_type { Type::Invalid };
  281. };
  282. // FIXME: Allow for fallback
  283. class CustomStyleValue : public StyleValue {
  284. public:
  285. static NonnullRefPtr<CustomStyleValue> create(const String& custom_property_name)
  286. {
  287. return adopt_ref(*new CustomStyleValue(custom_property_name));
  288. }
  289. String custom_property_name() const { return m_custom_property_name; }
  290. String to_string() const override { return m_custom_property_name; }
  291. private:
  292. explicit CustomStyleValue(const String& custom_property_name)
  293. : StyleValue(Type::CustomProperty)
  294. , m_custom_property_name(custom_property_name)
  295. {
  296. }
  297. String m_custom_property_name {};
  298. };
  299. class NumericStyleValue : public StyleValue {
  300. public:
  301. static NonnullRefPtr<NumericStyleValue> create(float value)
  302. {
  303. return adopt_ref(*new NumericStyleValue(value));
  304. }
  305. virtual bool is_length() const override { return m_value == 0; }
  306. virtual Length to_length() const override { return Length(0, Length::Type::Px); }
  307. float value() const { return m_value; }
  308. String to_string() const override { return String::formatted("{}", m_value); }
  309. virtual bool equals(StyleValue const& other) const override
  310. {
  311. if (type() != other.type())
  312. return false;
  313. return m_value == static_cast<NumericStyleValue const&>(other).m_value;
  314. }
  315. private:
  316. explicit NumericStyleValue(float value)
  317. : StyleValue(Type::Numeric)
  318. , m_value(value)
  319. {
  320. }
  321. float m_value { 0 };
  322. };
  323. class StringStyleValue : public StyleValue {
  324. public:
  325. static NonnullRefPtr<StringStyleValue> create(const String& string)
  326. {
  327. return adopt_ref(*new StringStyleValue(string));
  328. }
  329. virtual ~StringStyleValue() override { }
  330. String to_string() const override { return m_string; }
  331. private:
  332. explicit StringStyleValue(const String& string)
  333. : StyleValue(Type::String)
  334. , m_string(string)
  335. {
  336. }
  337. String m_string;
  338. };
  339. class BoxShadowStyleValue : public StyleValue {
  340. public:
  341. static NonnullRefPtr<BoxShadowStyleValue> create(Length const& offset_x, Length const& offset_y, Length const& blur_radius, Color const& color)
  342. {
  343. return adopt_ref(*new BoxShadowStyleValue(offset_x, offset_y, blur_radius, color));
  344. }
  345. virtual ~BoxShadowStyleValue() override { }
  346. Length const& offset_x() const { return m_offset_x; }
  347. Length const& offset_y() const { return m_offset_y; }
  348. Length const& blur_radius() const { return m_blur_radius; }
  349. Color const& color() const { return m_color; }
  350. String to_string() const override { return String::formatted("BoxShadow offset_x: {}, offset_y: {}, blur_radius: {}, color: {}",
  351. m_offset_x.to_string(), m_offset_y.to_string(), m_blur_radius.to_string(), m_color.to_string()); }
  352. private:
  353. explicit BoxShadowStyleValue(Length const& offset_x, Length const& offset_y, Length const& blur_radius, Color const& color)
  354. : StyleValue(Type::BoxShadow)
  355. , m_offset_x(offset_x)
  356. , m_offset_y(offset_y)
  357. , m_blur_radius(blur_radius)
  358. , m_color(color)
  359. {
  360. }
  361. Length m_offset_x;
  362. Length m_offset_y;
  363. Length m_blur_radius;
  364. Color m_color;
  365. };
  366. class LengthStyleValue : public StyleValue {
  367. public:
  368. static NonnullRefPtr<LengthStyleValue> create(const Length& length)
  369. {
  370. return adopt_ref(*new LengthStyleValue(length));
  371. }
  372. virtual ~LengthStyleValue() override { }
  373. virtual String to_string() const override { return m_length.to_string(); }
  374. virtual Length to_length() const override { return m_length; }
  375. const Length& length() const { return m_length; }
  376. virtual bool is_auto() const override { return m_length.is_auto(); }
  377. virtual bool equals(const StyleValue& other) const override
  378. {
  379. if (type() != other.type())
  380. return false;
  381. return m_length == static_cast<const LengthStyleValue&>(other).m_length;
  382. }
  383. private:
  384. explicit LengthStyleValue(const Length& length)
  385. : StyleValue(Type::Length)
  386. , m_length(length)
  387. {
  388. }
  389. Length m_length;
  390. };
  391. class CalculatedStyleValue : public StyleValue {
  392. public:
  393. struct CalcSum;
  394. struct CalcSumPartWithOperator;
  395. struct CalcProduct;
  396. struct CalcProductPartWithOperator;
  397. struct CalcNumberSum;
  398. struct CalcNumberSumPartWithOperator;
  399. struct CalcNumberProduct;
  400. struct CalcNumberProductPartWithOperator;
  401. using CalcNumberValue = Variant<float, NonnullOwnPtr<CalcNumberSum>>;
  402. using CalcValue = Variant<float, CSS::Length, NonnullOwnPtr<CalcSum>>;
  403. // This represents that: https://drafts.csswg.org/css-values-3/#calc-syntax
  404. struct CalcSum {
  405. CalcSum(NonnullOwnPtr<CalcProduct> first_calc_product, NonnullOwnPtrVector<CalcSumPartWithOperator> additional)
  406. : first_calc_product(move(first_calc_product))
  407. , zero_or_more_additional_calc_products(move(additional)) {};
  408. NonnullOwnPtr<CalcProduct> first_calc_product;
  409. NonnullOwnPtrVector<CalcSumPartWithOperator> zero_or_more_additional_calc_products;
  410. };
  411. struct CalcNumberSum {
  412. CalcNumberSum(NonnullOwnPtr<CalcNumberProduct> first_calc_number_product, NonnullOwnPtrVector<CalcNumberSumPartWithOperator> additional)
  413. : first_calc_number_product(move(first_calc_number_product))
  414. , zero_or_more_additional_calc_number_products(move(additional)) {};
  415. NonnullOwnPtr<CalcNumberProduct> first_calc_number_product;
  416. NonnullOwnPtrVector<CalcNumberSumPartWithOperator> zero_or_more_additional_calc_number_products;
  417. };
  418. struct CalcProduct {
  419. CalcValue first_calc_value;
  420. NonnullOwnPtrVector<CalcProductPartWithOperator> zero_or_more_additional_calc_values;
  421. };
  422. struct CalcSumPartWithOperator {
  423. enum Operation {
  424. Add,
  425. Subtract,
  426. };
  427. CalcSumPartWithOperator(Operation op, NonnullOwnPtr<CalcProduct> calc_product)
  428. : op(op)
  429. , calc_product(move(calc_product)) {};
  430. Operation op;
  431. NonnullOwnPtr<CalcProduct> calc_product;
  432. };
  433. struct CalcProductPartWithOperator {
  434. enum {
  435. Multiply,
  436. Divide,
  437. } op;
  438. Variant<CalcValue, CalcNumberValue> value;
  439. };
  440. struct CalcNumberProduct {
  441. CalcNumberValue first_calc_number_value;
  442. NonnullOwnPtrVector<CalcNumberProductPartWithOperator> zero_or_more_additional_calc_number_values;
  443. };
  444. struct CalcNumberProductPartWithOperator {
  445. enum {
  446. Multiply,
  447. Divide,
  448. } op;
  449. CalcNumberValue value;
  450. };
  451. struct CalcNumberSumPartWithOperator {
  452. enum Operation {
  453. Add,
  454. Subtract,
  455. };
  456. CalcNumberSumPartWithOperator(Operation op, NonnullOwnPtr<CalcNumberProduct> calc_number_product)
  457. : op(op)
  458. , calc_number_product(move(calc_number_product)) {};
  459. Operation op;
  460. NonnullOwnPtr<CalcNumberProduct> calc_number_product;
  461. };
  462. static NonnullRefPtr<CalculatedStyleValue> create(String const& expression_string, NonnullOwnPtr<CalcSum> calc_sum)
  463. {
  464. return adopt_ref(*new CalculatedStyleValue(expression_string, move(calc_sum)));
  465. }
  466. String to_string() const override { return m_expression_string; }
  467. NonnullOwnPtr<CalcSum> const& expression() const { return m_expression; }
  468. private:
  469. explicit CalculatedStyleValue(String const& expression_string, NonnullOwnPtr<CalcSum> calc_sum)
  470. : StyleValue(Type::Calculated)
  471. , m_expression_string(expression_string)
  472. , m_expression(move(calc_sum))
  473. {
  474. }
  475. String m_expression_string;
  476. NonnullOwnPtr<CalcSum> m_expression;
  477. };
  478. class InitialStyleValue final : public StyleValue {
  479. public:
  480. static NonnullRefPtr<InitialStyleValue> the()
  481. {
  482. static NonnullRefPtr<InitialStyleValue> instance = adopt_ref(*new InitialStyleValue);
  483. return instance;
  484. }
  485. virtual ~InitialStyleValue() override { }
  486. String to_string() const override { return "initial"; }
  487. private:
  488. InitialStyleValue()
  489. : StyleValue(Type::Initial)
  490. {
  491. }
  492. };
  493. class InheritStyleValue final : public StyleValue {
  494. public:
  495. static NonnullRefPtr<InheritStyleValue> the()
  496. {
  497. static NonnullRefPtr<InheritStyleValue> instance = adopt_ref(*new InheritStyleValue);
  498. return instance;
  499. }
  500. virtual ~InheritStyleValue() override { }
  501. String to_string() const override { return "inherit"; }
  502. private:
  503. InheritStyleValue()
  504. : StyleValue(Type::Inherit)
  505. {
  506. }
  507. };
  508. class UnsetStyleValue final : public StyleValue {
  509. public:
  510. static NonnullRefPtr<UnsetStyleValue> the()
  511. {
  512. static NonnullRefPtr<UnsetStyleValue> instance = adopt_ref(*new UnsetStyleValue);
  513. return instance;
  514. }
  515. virtual ~UnsetStyleValue() override { }
  516. String to_string() const override { return "unset"; }
  517. private:
  518. UnsetStyleValue()
  519. : StyleValue(Type::Unset)
  520. {
  521. }
  522. };
  523. class ColorStyleValue : public StyleValue {
  524. public:
  525. static NonnullRefPtr<ColorStyleValue> create(Color color)
  526. {
  527. return adopt_ref(*new ColorStyleValue(color));
  528. }
  529. virtual ~ColorStyleValue() override { }
  530. Color color() const { return m_color; }
  531. String to_string() const override { return m_color.to_string(); }
  532. Color to_color(Layout::NodeWithStyle const&) const override { return m_color; }
  533. virtual bool equals(const StyleValue& other) const override
  534. {
  535. if (type() != other.type())
  536. return false;
  537. return m_color == static_cast<const ColorStyleValue&>(other).m_color;
  538. }
  539. private:
  540. explicit ColorStyleValue(Color color)
  541. : StyleValue(Type::Color)
  542. , m_color(color)
  543. {
  544. }
  545. Color m_color;
  546. };
  547. class IdentifierStyleValue final : public StyleValue {
  548. public:
  549. static NonnullRefPtr<IdentifierStyleValue> create(CSS::ValueID id)
  550. {
  551. return adopt_ref(*new IdentifierStyleValue(id));
  552. }
  553. virtual ~IdentifierStyleValue() override { }
  554. CSS::ValueID id() const { return m_id; }
  555. virtual String to_string() const override;
  556. virtual Color to_color(Layout::NodeWithStyle const& node) const override;
  557. virtual bool equals(const StyleValue& other) const override
  558. {
  559. if (type() != other.type())
  560. return false;
  561. return m_id == static_cast<const IdentifierStyleValue&>(other).m_id;
  562. }
  563. private:
  564. explicit IdentifierStyleValue(CSS::ValueID id)
  565. : StyleValue(Type::Identifier)
  566. , m_id(id)
  567. {
  568. }
  569. CSS::ValueID m_id { CSS::ValueID::Invalid };
  570. };
  571. class ImageStyleValue final
  572. : public StyleValue
  573. , public ImageResourceClient {
  574. public:
  575. static NonnullRefPtr<ImageStyleValue> create(const AK::URL& url, DOM::Document& document) { return adopt_ref(*new ImageStyleValue(url, document)); }
  576. virtual ~ImageStyleValue() override { }
  577. String to_string() const override { return String::formatted("Image({})", m_url.to_string()); }
  578. const Gfx::Bitmap* bitmap() const { return m_bitmap; }
  579. private:
  580. ImageStyleValue(const AK::URL&, DOM::Document&);
  581. // ^ResourceClient
  582. virtual void resource_did_load() override;
  583. AK::URL m_url;
  584. WeakPtr<DOM::Document> m_document;
  585. RefPtr<Gfx::Bitmap> m_bitmap;
  586. };
  587. class BackgroundStyleValue final : public StyleValue {
  588. public:
  589. static NonnullRefPtr<BackgroundStyleValue> create(
  590. NonnullRefPtr<StyleValue> color,
  591. NonnullRefPtr<StyleValue> image,
  592. NonnullRefPtr<StyleValue> repeat_x,
  593. NonnullRefPtr<StyleValue> repeat_y)
  594. {
  595. return adopt_ref(*new BackgroundStyleValue(color, image, repeat_x, repeat_y));
  596. }
  597. virtual ~BackgroundStyleValue() override { }
  598. NonnullRefPtr<StyleValue> color() const { return m_color; }
  599. NonnullRefPtr<StyleValue> image() const { return m_image; }
  600. NonnullRefPtr<StyleValue> repeat_x() const { return m_repeat_x; }
  601. NonnullRefPtr<StyleValue> repeat_y() const { return m_repeat_y; }
  602. virtual String to_string() const override
  603. {
  604. return String::formatted("{} {} {} {}", m_color->to_string(), m_image->to_string(), m_repeat_x->to_string(), m_repeat_y->to_string());
  605. }
  606. private:
  607. BackgroundStyleValue(
  608. NonnullRefPtr<StyleValue> color,
  609. NonnullRefPtr<StyleValue> image,
  610. NonnullRefPtr<StyleValue> repeat_x,
  611. NonnullRefPtr<StyleValue> repeat_y)
  612. : StyleValue(Type::Background)
  613. , m_color(color)
  614. , m_image(image)
  615. , m_repeat_x(repeat_x)
  616. , m_repeat_y(repeat_y)
  617. {
  618. }
  619. NonnullRefPtr<StyleValue> m_color;
  620. NonnullRefPtr<StyleValue> m_image;
  621. // FIXME: background-position
  622. // FIXME: background-size
  623. NonnullRefPtr<StyleValue> m_repeat_x;
  624. NonnullRefPtr<StyleValue> m_repeat_y;
  625. // FIXME: background-attachment
  626. // FIXME: background-clip
  627. // FIXME: background-origin
  628. };
  629. class BackgroundRepeatStyleValue final : public StyleValue {
  630. public:
  631. static NonnullRefPtr<BackgroundRepeatStyleValue> create(NonnullRefPtr<StyleValue> repeat_x, NonnullRefPtr<StyleValue> repeat_y)
  632. {
  633. return adopt_ref(*new BackgroundRepeatStyleValue(repeat_x, repeat_y));
  634. }
  635. virtual ~BackgroundRepeatStyleValue() override { }
  636. NonnullRefPtr<StyleValue> repeat_x() const { return m_repeat_x; }
  637. NonnullRefPtr<StyleValue> repeat_y() const { return m_repeat_y; }
  638. virtual String to_string() const override
  639. {
  640. return String::formatted("{} {}", m_repeat_x->to_string(), m_repeat_y->to_string());
  641. }
  642. private:
  643. BackgroundRepeatStyleValue(NonnullRefPtr<StyleValue> repeat_x, NonnullRefPtr<StyleValue> repeat_y)
  644. : StyleValue(Type::BackgroundRepeat)
  645. , m_repeat_x(repeat_x)
  646. , m_repeat_y(repeat_y)
  647. {
  648. }
  649. NonnullRefPtr<StyleValue> m_repeat_x;
  650. NonnullRefPtr<StyleValue> m_repeat_y;
  651. };
  652. class BorderStyleValue final : public StyleValue {
  653. public:
  654. static NonnullRefPtr<BorderStyleValue> create(
  655. NonnullRefPtr<StyleValue> border_width,
  656. NonnullRefPtr<StyleValue> border_style,
  657. NonnullRefPtr<StyleValue> border_color)
  658. {
  659. return adopt_ref(*new BorderStyleValue(border_width, border_style, border_color));
  660. }
  661. virtual ~BorderStyleValue() override { }
  662. NonnullRefPtr<StyleValue> border_width() const { return m_border_width; }
  663. NonnullRefPtr<StyleValue> border_style() const { return m_border_style; }
  664. NonnullRefPtr<StyleValue> border_color() const { return m_border_color; }
  665. virtual String to_string() const override
  666. {
  667. return String::formatted("Border border_width: {}, border_style: {}, border_color: {}", m_border_width->to_string(), m_border_style->to_string(), m_border_color->to_string());
  668. }
  669. private:
  670. BorderStyleValue(
  671. NonnullRefPtr<StyleValue> border_width,
  672. NonnullRefPtr<StyleValue> border_style,
  673. NonnullRefPtr<StyleValue> border_color)
  674. : StyleValue(Type::Border)
  675. , m_border_width(border_width)
  676. , m_border_style(border_style)
  677. , m_border_color(border_color)
  678. {
  679. }
  680. NonnullRefPtr<StyleValue> m_border_width;
  681. NonnullRefPtr<StyleValue> m_border_style;
  682. NonnullRefPtr<StyleValue> m_border_color;
  683. };
  684. class BorderRadiusStyleValue final : public StyleValue {
  685. public:
  686. static NonnullRefPtr<BorderRadiusStyleValue> create(Length const& horizontal_radius, Length const& vertical_radius)
  687. {
  688. return adopt_ref(*new BorderRadiusStyleValue(horizontal_radius, vertical_radius));
  689. }
  690. virtual ~BorderRadiusStyleValue() override { }
  691. Length const& horizontal_radius() const { return m_horizontal_radius; }
  692. Length const& vertical_radius() const { return m_vertical_radius; }
  693. bool is_elliptical() const { return m_is_elliptical; }
  694. // FIXME: Remove this once we support elliptical border-radius in Layout/Node.
  695. virtual Length to_length() const override { return horizontal_radius(); }
  696. virtual String to_string() const override
  697. {
  698. return String::formatted("{} / {}", m_horizontal_radius.to_string(), m_vertical_radius.to_string());
  699. }
  700. virtual bool equals(StyleValue const& other) const override
  701. {
  702. if (type() != other.type())
  703. return false;
  704. auto& other_value = static_cast<BorderRadiusStyleValue const&>(other);
  705. return m_is_elliptical == other_value.m_is_elliptical
  706. && m_horizontal_radius == other_value.m_horizontal_radius
  707. && m_vertical_radius == other_value.m_vertical_radius;
  708. }
  709. private:
  710. BorderRadiusStyleValue(Length const& horizontal_radius, Length const& vertical_radius)
  711. : StyleValue(Type::BorderRadius)
  712. , m_horizontal_radius(horizontal_radius)
  713. , m_vertical_radius(vertical_radius)
  714. {
  715. m_is_elliptical = (m_horizontal_radius != m_vertical_radius);
  716. }
  717. bool m_is_elliptical;
  718. Length m_horizontal_radius;
  719. Length m_vertical_radius;
  720. };
  721. class CombinedBorderRadiusStyleValue final : public StyleValue {
  722. public:
  723. static NonnullRefPtr<CombinedBorderRadiusStyleValue> create(NonnullRefPtr<BorderRadiusStyleValue> top_left, NonnullRefPtr<BorderRadiusStyleValue> top_right, NonnullRefPtr<BorderRadiusStyleValue> bottom_right, NonnullRefPtr<BorderRadiusStyleValue> bottom_left)
  724. {
  725. return adopt_ref(*new CombinedBorderRadiusStyleValue(top_left, top_right, bottom_right, bottom_left));
  726. }
  727. virtual ~CombinedBorderRadiusStyleValue() override { }
  728. NonnullRefPtr<BorderRadiusStyleValue> top_left() const { return m_top_left; }
  729. NonnullRefPtr<BorderRadiusStyleValue> top_right() const { return m_top_right; }
  730. NonnullRefPtr<BorderRadiusStyleValue> bottom_right() const { return m_bottom_right; }
  731. NonnullRefPtr<BorderRadiusStyleValue> bottom_left() const { return m_bottom_left; }
  732. virtual String to_string() const override
  733. {
  734. return String::formatted("{} {} {} {} / {} {} {} {}", m_top_left->horizontal_radius().to_string(), m_top_right->horizontal_radius().to_string(), m_bottom_right->horizontal_radius().to_string(), m_bottom_left->horizontal_radius().to_string(), m_top_left->vertical_radius().to_string(), m_top_right->vertical_radius().to_string(), m_bottom_right->vertical_radius().to_string(), m_bottom_left->vertical_radius().to_string());
  735. }
  736. private:
  737. CombinedBorderRadiusStyleValue(NonnullRefPtr<BorderRadiusStyleValue> top_left, NonnullRefPtr<BorderRadiusStyleValue> top_right, NonnullRefPtr<BorderRadiusStyleValue> bottom_right, NonnullRefPtr<BorderRadiusStyleValue> bottom_left)
  738. : StyleValue(Type::CombinedBorderRadius)
  739. , m_top_left(top_left)
  740. , m_top_right(top_right)
  741. , m_bottom_right(bottom_right)
  742. , m_bottom_left(bottom_left)
  743. {
  744. }
  745. NonnullRefPtr<BorderRadiusStyleValue> m_top_left;
  746. NonnullRefPtr<BorderRadiusStyleValue> m_top_right;
  747. NonnullRefPtr<BorderRadiusStyleValue> m_bottom_right;
  748. NonnullRefPtr<BorderRadiusStyleValue> m_bottom_left;
  749. };
  750. class FlexStyleValue final : public StyleValue {
  751. public:
  752. static NonnullRefPtr<FlexStyleValue> create(
  753. NonnullRefPtr<StyleValue> grow,
  754. NonnullRefPtr<StyleValue> shrink,
  755. NonnullRefPtr<StyleValue> basis)
  756. {
  757. return adopt_ref(*new FlexStyleValue(grow, shrink, basis));
  758. }
  759. virtual ~FlexStyleValue() override { }
  760. NonnullRefPtr<StyleValue> grow() const { return m_grow; }
  761. NonnullRefPtr<StyleValue> shrink() const { return m_shrink; }
  762. NonnullRefPtr<StyleValue> basis() const { return m_basis; }
  763. virtual String to_string() const override
  764. {
  765. return String::formatted("Flex grow: {}, shrink: {}, basis: {}", m_grow->to_string(), m_shrink->to_string(), m_basis->to_string());
  766. }
  767. private:
  768. FlexStyleValue(
  769. NonnullRefPtr<StyleValue> grow,
  770. NonnullRefPtr<StyleValue> shrink,
  771. NonnullRefPtr<StyleValue> basis)
  772. : StyleValue(Type::Flex)
  773. , m_grow(grow)
  774. , m_shrink(shrink)
  775. , m_basis(basis)
  776. {
  777. }
  778. NonnullRefPtr<StyleValue> m_grow;
  779. NonnullRefPtr<StyleValue> m_shrink;
  780. NonnullRefPtr<StyleValue> m_basis;
  781. };
  782. class FlexFlowStyleValue final : public StyleValue {
  783. public:
  784. static NonnullRefPtr<FlexFlowStyleValue> create(NonnullRefPtr<StyleValue> flex_direction, NonnullRefPtr<StyleValue> flex_wrap)
  785. {
  786. return adopt_ref(*new FlexFlowStyleValue(flex_direction, flex_wrap));
  787. }
  788. virtual ~FlexFlowStyleValue() override { }
  789. NonnullRefPtr<StyleValue> flex_direction() const { return m_flex_direction; }
  790. NonnullRefPtr<StyleValue> flex_wrap() const { return m_flex_wrap; }
  791. virtual String to_string() const override
  792. {
  793. return String::formatted("FlexFlow flex_direction: {}, flex_wrap: {}", m_flex_direction->to_string(), m_flex_wrap->to_string());
  794. }
  795. private:
  796. FlexFlowStyleValue(NonnullRefPtr<StyleValue> flex_direction, NonnullRefPtr<StyleValue> flex_wrap)
  797. : StyleValue(Type::FlexFlow)
  798. , m_flex_direction(flex_direction)
  799. , m_flex_wrap(flex_wrap)
  800. {
  801. }
  802. NonnullRefPtr<StyleValue> m_flex_direction;
  803. NonnullRefPtr<StyleValue> m_flex_wrap;
  804. };
  805. class FontStyleValue final : public StyleValue {
  806. public:
  807. static NonnullRefPtr<FontStyleValue> create(NonnullRefPtr<StyleValue> font_style, NonnullRefPtr<StyleValue> font_weight, NonnullRefPtr<StyleValue> font_size, NonnullRefPtr<StyleValue> line_height, NonnullRefPtr<StyleValue> font_families) { return adopt_ref(*new FontStyleValue(font_style, font_weight, font_size, line_height, font_families)); }
  808. virtual ~FontStyleValue() override { }
  809. NonnullRefPtr<StyleValue> font_style() const { return m_font_style; }
  810. NonnullRefPtr<StyleValue> font_weight() const { return m_font_weight; }
  811. NonnullRefPtr<StyleValue> font_size() const { return m_font_size; }
  812. NonnullRefPtr<StyleValue> line_height() const { return m_line_height; }
  813. NonnullRefPtr<StyleValue> font_families() const { return m_font_families; }
  814. virtual String to_string() const override
  815. {
  816. return String::formatted("Font style: {}, weight: {}, size: {}, line_height: {}, families: {}",
  817. m_font_style->to_string(), m_font_weight->to_string(), m_font_size->to_string(), m_line_height->to_string(), m_font_families->to_string());
  818. }
  819. private:
  820. FontStyleValue(NonnullRefPtr<StyleValue> font_style, NonnullRefPtr<StyleValue> font_weight, NonnullRefPtr<StyleValue> font_size, NonnullRefPtr<StyleValue> line_height, NonnullRefPtr<StyleValue> font_families)
  821. : StyleValue(Type::Font)
  822. , m_font_style(font_style)
  823. , m_font_weight(font_weight)
  824. , m_font_size(font_size)
  825. , m_line_height(line_height)
  826. , m_font_families(font_families)
  827. {
  828. }
  829. NonnullRefPtr<StyleValue> m_font_style;
  830. NonnullRefPtr<StyleValue> m_font_weight;
  831. NonnullRefPtr<StyleValue> m_font_size;
  832. NonnullRefPtr<StyleValue> m_line_height;
  833. NonnullRefPtr<StyleValue> m_font_families;
  834. // FIXME: Implement font-stretch and font-variant.
  835. };
  836. class ListStyleStyleValue final : public StyleValue {
  837. public:
  838. static NonnullRefPtr<ListStyleStyleValue> create(
  839. NonnullRefPtr<StyleValue> position,
  840. NonnullRefPtr<StyleValue> image,
  841. NonnullRefPtr<StyleValue> style_type)
  842. {
  843. return adopt_ref(*new ListStyleStyleValue(position, image, style_type));
  844. }
  845. virtual ~ListStyleStyleValue() override { }
  846. NonnullRefPtr<StyleValue> position() const { return m_position; }
  847. NonnullRefPtr<StyleValue> image() const { return m_image; }
  848. NonnullRefPtr<StyleValue> style_type() const { return m_style_type; }
  849. virtual String to_string() const override
  850. {
  851. return String::formatted("ListStyle position: {}, image: {}, style_type: {}", m_position->to_string(), m_image->to_string(), m_style_type->to_string());
  852. }
  853. private:
  854. ListStyleStyleValue(
  855. NonnullRefPtr<StyleValue> position,
  856. NonnullRefPtr<StyleValue> image,
  857. NonnullRefPtr<StyleValue> style_type)
  858. : StyleValue(Type::ListStyle)
  859. , m_position(position)
  860. , m_image(image)
  861. , m_style_type(style_type)
  862. {
  863. }
  864. NonnullRefPtr<StyleValue> m_position;
  865. NonnullRefPtr<StyleValue> m_image;
  866. NonnullRefPtr<StyleValue> m_style_type;
  867. };
  868. class OverflowStyleValue final : public StyleValue {
  869. public:
  870. static NonnullRefPtr<OverflowStyleValue> create(NonnullRefPtr<StyleValue> overflow_x, NonnullRefPtr<StyleValue> overflow_y)
  871. {
  872. return adopt_ref(*new OverflowStyleValue(overflow_x, overflow_y));
  873. }
  874. virtual ~OverflowStyleValue() override { }
  875. NonnullRefPtr<StyleValue> overflow_x() const { return m_overflow_x; }
  876. NonnullRefPtr<StyleValue> overflow_y() const { return m_overflow_y; }
  877. virtual String to_string() const override
  878. {
  879. return String::formatted("{} {}", m_overflow_x->to_string(), m_overflow_y->to_string());
  880. }
  881. private:
  882. OverflowStyleValue(NonnullRefPtr<StyleValue> overflow_x, NonnullRefPtr<StyleValue> overflow_y)
  883. : StyleValue(Type::Overflow)
  884. , m_overflow_x(overflow_x)
  885. , m_overflow_y(overflow_y)
  886. {
  887. }
  888. NonnullRefPtr<StyleValue> m_overflow_x;
  889. NonnullRefPtr<StyleValue> m_overflow_y;
  890. };
  891. class TextDecorationStyleValue final : public StyleValue {
  892. public:
  893. static NonnullRefPtr<TextDecorationStyleValue> create(
  894. NonnullRefPtr<StyleValue> line,
  895. NonnullRefPtr<StyleValue> style,
  896. NonnullRefPtr<StyleValue> color)
  897. {
  898. return adopt_ref(*new TextDecorationStyleValue(line, style, color));
  899. }
  900. virtual ~TextDecorationStyleValue() override { }
  901. NonnullRefPtr<StyleValue> line() const { return m_line; }
  902. NonnullRefPtr<StyleValue> style() const { return m_style; }
  903. NonnullRefPtr<StyleValue> color() const { return m_color; }
  904. virtual String to_string() const override
  905. {
  906. return String::formatted("TextDecoration line: {}, style: {}, color: {}", m_line->to_string(), m_style->to_string(), m_color->to_string());
  907. }
  908. private:
  909. TextDecorationStyleValue(
  910. NonnullRefPtr<StyleValue> line,
  911. NonnullRefPtr<StyleValue> style,
  912. NonnullRefPtr<StyleValue> color)
  913. : StyleValue(Type::TextDecoration)
  914. , m_line(line)
  915. , m_style(style)
  916. , m_color(color)
  917. {
  918. }
  919. NonnullRefPtr<StyleValue> m_line;
  920. NonnullRefPtr<StyleValue> m_style;
  921. NonnullRefPtr<StyleValue> m_color;
  922. };
  923. class TransformationStyleValue final : public StyleValue {
  924. public:
  925. static NonnullRefPtr<TransformationStyleValue> create(CSS::TransformFunction transform_function, NonnullRefPtrVector<StyleValue>&& values)
  926. {
  927. return adopt_ref(*new TransformationStyleValue(transform_function, move(values)));
  928. }
  929. virtual ~TransformationStyleValue() override { }
  930. CSS::TransformFunction transform_function() const { return m_transform_function; }
  931. NonnullRefPtrVector<StyleValue> values() const { return m_values; }
  932. virtual String to_string() const override
  933. {
  934. return String::formatted("TransformationStyleValue");
  935. }
  936. private:
  937. TransformationStyleValue(CSS::TransformFunction transform_function, NonnullRefPtrVector<StyleValue>&& values)
  938. : StyleValue(Type::Transformation)
  939. , m_transform_function(transform_function)
  940. , m_values(move(values))
  941. {
  942. }
  943. CSS::TransformFunction m_transform_function;
  944. NonnullRefPtrVector<StyleValue> m_values;
  945. };
  946. class StyleValueList final : public StyleValue {
  947. public:
  948. static NonnullRefPtr<StyleValueList> create(NonnullRefPtrVector<StyleValue>&& values) { return adopt_ref(*new StyleValueList(move(values))); }
  949. NonnullRefPtrVector<StyleValue> const& values() const { return m_values; }
  950. virtual String to_string() const
  951. {
  952. StringBuilder builder;
  953. builder.appendff("List[{}](", m_values.size());
  954. for (size_t i = 0; i < m_values.size(); ++i) {
  955. if (i)
  956. builder.append(',');
  957. builder.append(m_values[i].to_string());
  958. }
  959. builder.append(')');
  960. return builder.to_string();
  961. }
  962. private:
  963. StyleValueList(NonnullRefPtrVector<StyleValue>&& values)
  964. : StyleValue(Type::ValueList)
  965. , m_values(move(values))
  966. {
  967. }
  968. NonnullRefPtrVector<StyleValue> m_values;
  969. };
  970. inline CSS::ValueID StyleValue::to_identifier() const
  971. {
  972. if (is_identifier())
  973. return static_cast<const IdentifierStyleValue&>(*this).id();
  974. if (is_auto())
  975. return CSS::ValueID::Auto;
  976. return CSS::ValueID::Invalid;
  977. }
  978. }