StyleValue.h 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029
  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@gmail.com>
  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. class StyleValue : public RefCounted<StyleValue> {
  194. public:
  195. virtual ~StyleValue();
  196. enum class Type {
  197. Invalid,
  198. Inherit,
  199. Initial,
  200. String,
  201. Length,
  202. Color,
  203. Identifier,
  204. Image,
  205. CustomProperty,
  206. Numeric,
  207. ValueList,
  208. Calculated,
  209. Background,
  210. BackgroundRepeat,
  211. Border,
  212. BorderRadius,
  213. BoxShadow,
  214. Flex,
  215. FlexFlow,
  216. Font,
  217. ListStyle,
  218. Overflow,
  219. TextDecoration,
  220. };
  221. Type type() const { return m_type; }
  222. bool is_inherit() const { return type() == Type::Inherit; }
  223. bool is_initial() const { return type() == Type::Initial; }
  224. bool is_color() const { return type() == Type::Color; }
  225. bool is_identifier() const { return type() == Type::Identifier || is_auto(); }
  226. bool is_image() const { return type() == Type::Image; }
  227. bool is_string() const { return type() == Type::String; }
  228. virtual bool is_length() const { return type() == Type::Length; }
  229. bool is_custom_property() const { return type() == Type::CustomProperty; }
  230. bool is_numeric() const { return type() == Type::Numeric; }
  231. bool is_value_list() const { return type() == Type::ValueList; }
  232. bool is_calculated() const { return type() == Type::Calculated; }
  233. bool is_background() const { return type() == Type::Background; }
  234. bool is_background_repeat() const { return type() == Type::BackgroundRepeat; }
  235. bool is_border() const { return type() == Type::Border; }
  236. bool is_border_radius() const { return type() == Type::BorderRadius; }
  237. bool is_box_shadow() const { return type() == Type::BoxShadow; }
  238. bool is_flex() const { return type() == Type::Flex; }
  239. bool is_flex_flow() const { return type() == Type::FlexFlow; }
  240. bool is_font() const { return type() == Type::Font; }
  241. bool is_list_style() const { return type() == Type::ListStyle; }
  242. bool is_overflow() const { return type() == Type::Overflow; }
  243. bool is_text_decoration() const { return type() == Type::TextDecoration; }
  244. bool is_builtin() const { return is_inherit() || is_initial(); }
  245. bool is_builtin_or_dynamic() const
  246. {
  247. return is_inherit() || is_initial() || is_custom_property() || is_calculated();
  248. }
  249. virtual String to_string() const = 0;
  250. virtual Length to_length() const { return Length::make_auto(); }
  251. virtual Color to_color(const DOM::Document&) const { return {}; }
  252. CSS::ValueID to_identifier() const;
  253. virtual bool is_auto() const { return false; }
  254. bool operator==(const StyleValue& other) const { return equals(other); }
  255. bool operator!=(const StyleValue& other) const { return !(*this == other); }
  256. virtual bool equals(const StyleValue& other) const
  257. {
  258. if (type() != other.type())
  259. return false;
  260. return to_string() == other.to_string();
  261. }
  262. protected:
  263. explicit StyleValue(Type);
  264. private:
  265. Type m_type { Type::Invalid };
  266. };
  267. // FIXME: Allow for fallback
  268. class CustomStyleValue : public StyleValue {
  269. public:
  270. static NonnullRefPtr<CustomStyleValue> create(const String& custom_property_name)
  271. {
  272. return adopt_ref(*new CustomStyleValue(custom_property_name));
  273. }
  274. String custom_property_name() const { return m_custom_property_name; }
  275. String to_string() const override { return m_custom_property_name; }
  276. private:
  277. explicit CustomStyleValue(const String& custom_property_name)
  278. : StyleValue(Type::CustomProperty)
  279. , m_custom_property_name(custom_property_name)
  280. {
  281. }
  282. String m_custom_property_name {};
  283. };
  284. class NumericStyleValue : public StyleValue {
  285. public:
  286. static NonnullRefPtr<NumericStyleValue> create(float value)
  287. {
  288. return adopt_ref(*new NumericStyleValue(value));
  289. }
  290. virtual bool is_length() const override { return m_value == 0; }
  291. virtual Length to_length() const override { return Length(0, Length::Type::Px); }
  292. float value() const { return m_value; }
  293. String to_string() const override { return String::formatted("{}", m_value); }
  294. private:
  295. explicit NumericStyleValue(float value)
  296. : StyleValue(Type::Numeric)
  297. , m_value(value)
  298. {
  299. }
  300. float m_value { 0 };
  301. };
  302. class StringStyleValue : public StyleValue {
  303. public:
  304. static NonnullRefPtr<StringStyleValue> create(const String& string)
  305. {
  306. return adopt_ref(*new StringStyleValue(string));
  307. }
  308. virtual ~StringStyleValue() override { }
  309. String to_string() const override { return m_string; }
  310. private:
  311. explicit StringStyleValue(const String& string)
  312. : StyleValue(Type::String)
  313. , m_string(string)
  314. {
  315. }
  316. String m_string;
  317. };
  318. class BoxShadowStyleValue : public StyleValue {
  319. public:
  320. static NonnullRefPtr<BoxShadowStyleValue> create(Length const& offset_x, Length const& offset_y, Length const& blur_radius, Color const& color)
  321. {
  322. return adopt_ref(*new BoxShadowStyleValue(offset_x, offset_y, blur_radius, color));
  323. }
  324. virtual ~BoxShadowStyleValue() override { }
  325. Length const& offset_x() const { return m_offset_x; }
  326. Length const& offset_y() const { return m_offset_y; }
  327. Length const& blur_radius() const { return m_blur_radius; }
  328. Color const& color() const { return m_color; }
  329. String to_string() const override { return String::formatted("BoxShadow offset_x: {}, offset_y: {}, blur_radius: {}, color: {}",
  330. m_offset_x.to_string(), m_offset_y.to_string(), m_blur_radius.to_string(), m_color.to_string()); }
  331. private:
  332. explicit BoxShadowStyleValue(Length const& offset_x, Length const& offset_y, Length const& blur_radius, Color const& color)
  333. : StyleValue(Type::BoxShadow)
  334. , m_offset_x(offset_x)
  335. , m_offset_y(offset_y)
  336. , m_blur_radius(blur_radius)
  337. , m_color(color)
  338. {
  339. }
  340. Length m_offset_x;
  341. Length m_offset_y;
  342. Length m_blur_radius;
  343. Color m_color;
  344. };
  345. class LengthStyleValue : public StyleValue {
  346. public:
  347. static NonnullRefPtr<LengthStyleValue> create(const Length& length)
  348. {
  349. return adopt_ref(*new LengthStyleValue(length));
  350. }
  351. virtual ~LengthStyleValue() override { }
  352. virtual String to_string() const override { return m_length.to_string(); }
  353. virtual Length to_length() const override { return m_length; }
  354. const Length& length() const { return m_length; }
  355. virtual bool is_auto() const override { return m_length.is_auto(); }
  356. virtual bool equals(const StyleValue& other) const override
  357. {
  358. if (type() != other.type())
  359. return false;
  360. return m_length == static_cast<const LengthStyleValue&>(other).m_length;
  361. }
  362. private:
  363. explicit LengthStyleValue(const Length& length)
  364. : StyleValue(Type::Length)
  365. , m_length(length)
  366. {
  367. }
  368. Length m_length;
  369. };
  370. class CalculatedStyleValue : public StyleValue {
  371. public:
  372. struct CalcSum;
  373. struct CalcSumPartWithOperator;
  374. struct CalcProduct;
  375. struct CalcProductPartWithOperator;
  376. struct CalcNumberSum;
  377. struct CalcNumberSumPartWithOperator;
  378. struct CalcNumberProduct;
  379. struct CalcNumberProductPartWithOperator;
  380. using CalcNumberValue = Variant<float, NonnullOwnPtr<CalcNumberSum>>;
  381. using CalcValue = Variant<float, CSS::Length, NonnullOwnPtr<CalcSum>>;
  382. // This represents that: https://drafts.csswg.org/css-values-3/#calc-syntax
  383. struct CalcSum {
  384. CalcSum(NonnullOwnPtr<CalcProduct> first_calc_product, NonnullOwnPtrVector<CalcSumPartWithOperator> additional)
  385. : first_calc_product(move(first_calc_product))
  386. , zero_or_more_additional_calc_products(move(additional)) {};
  387. NonnullOwnPtr<CalcProduct> first_calc_product;
  388. NonnullOwnPtrVector<CalcSumPartWithOperator> zero_or_more_additional_calc_products;
  389. };
  390. struct CalcNumberSum {
  391. CalcNumberSum(NonnullOwnPtr<CalcNumberProduct> first_calc_number_product, NonnullOwnPtrVector<CalcNumberSumPartWithOperator> additional)
  392. : first_calc_number_product(move(first_calc_number_product))
  393. , zero_or_more_additional_calc_number_products(move(additional)) {};
  394. NonnullOwnPtr<CalcNumberProduct> first_calc_number_product;
  395. NonnullOwnPtrVector<CalcNumberSumPartWithOperator> zero_or_more_additional_calc_number_products;
  396. };
  397. struct CalcProduct {
  398. CalcValue first_calc_value;
  399. NonnullOwnPtrVector<CalcProductPartWithOperator> zero_or_more_additional_calc_values;
  400. };
  401. struct CalcSumPartWithOperator {
  402. enum Operation {
  403. Add,
  404. Subtract,
  405. };
  406. CalcSumPartWithOperator(Operation op, NonnullOwnPtr<CalcProduct> calc_product)
  407. : op(op)
  408. , calc_product(move(calc_product)) {};
  409. Operation op;
  410. NonnullOwnPtr<CalcProduct> calc_product;
  411. };
  412. struct CalcProductPartWithOperator {
  413. enum {
  414. Multiply,
  415. Divide,
  416. } op;
  417. Variant<CalcValue, CalcNumberValue> value;
  418. };
  419. struct CalcNumberProduct {
  420. CalcNumberValue first_calc_number_value;
  421. NonnullOwnPtrVector<CalcNumberProductPartWithOperator> zero_or_more_additional_calc_number_values;
  422. };
  423. struct CalcNumberProductPartWithOperator {
  424. enum {
  425. Multiply,
  426. Divide,
  427. } op;
  428. CalcNumberValue value;
  429. };
  430. struct CalcNumberSumPartWithOperator {
  431. enum Operation {
  432. Add,
  433. Subtract,
  434. };
  435. CalcNumberSumPartWithOperator(Operation op, NonnullOwnPtr<CalcNumberProduct> calc_number_product)
  436. : op(op)
  437. , calc_number_product(move(calc_number_product)) {};
  438. Operation op;
  439. NonnullOwnPtr<CalcNumberProduct> calc_number_product;
  440. };
  441. static NonnullRefPtr<CalculatedStyleValue> create(String const& expression_string, NonnullOwnPtr<CalcSum> calc_sum)
  442. {
  443. return adopt_ref(*new CalculatedStyleValue(expression_string, move(calc_sum)));
  444. }
  445. String to_string() const override { return m_expression_string; }
  446. NonnullOwnPtr<CalcSum> const& expression() const { return m_expression; }
  447. private:
  448. explicit CalculatedStyleValue(String const& expression_string, NonnullOwnPtr<CalcSum> calc_sum)
  449. : StyleValue(Type::Calculated)
  450. , m_expression_string(expression_string)
  451. , m_expression(move(calc_sum))
  452. {
  453. }
  454. String m_expression_string;
  455. NonnullOwnPtr<CalcSum> m_expression;
  456. };
  457. class InitialStyleValue final : public StyleValue {
  458. public:
  459. static NonnullRefPtr<InitialStyleValue> create() { return adopt_ref(*new InitialStyleValue); }
  460. virtual ~InitialStyleValue() override { }
  461. String to_string() const override { return "initial"; }
  462. private:
  463. InitialStyleValue()
  464. : StyleValue(Type::Initial)
  465. {
  466. }
  467. };
  468. class InheritStyleValue final : public StyleValue {
  469. public:
  470. static NonnullRefPtr<InheritStyleValue> create() { return adopt_ref(*new InheritStyleValue); }
  471. virtual ~InheritStyleValue() override { }
  472. String to_string() const override { return "inherit"; }
  473. private:
  474. InheritStyleValue()
  475. : StyleValue(Type::Inherit)
  476. {
  477. }
  478. };
  479. class ColorStyleValue : public StyleValue {
  480. public:
  481. static NonnullRefPtr<ColorStyleValue> create(Color color)
  482. {
  483. return adopt_ref(*new ColorStyleValue(color));
  484. }
  485. virtual ~ColorStyleValue() override { }
  486. Color color() const { return m_color; }
  487. String to_string() const override { return m_color.to_string(); }
  488. Color to_color(const DOM::Document&) const override { return m_color; }
  489. virtual bool equals(const StyleValue& other) const override
  490. {
  491. if (type() != other.type())
  492. return false;
  493. return m_color == static_cast<const ColorStyleValue&>(other).m_color;
  494. }
  495. private:
  496. explicit ColorStyleValue(Color color)
  497. : StyleValue(Type::Color)
  498. , m_color(color)
  499. {
  500. }
  501. Color m_color;
  502. };
  503. class IdentifierStyleValue final : public StyleValue {
  504. public:
  505. static NonnullRefPtr<IdentifierStyleValue> create(CSS::ValueID id)
  506. {
  507. return adopt_ref(*new IdentifierStyleValue(id));
  508. }
  509. virtual ~IdentifierStyleValue() override { }
  510. CSS::ValueID id() const { return m_id; }
  511. virtual String to_string() const override;
  512. virtual Color to_color(const DOM::Document&) const override;
  513. virtual bool equals(const StyleValue& other) const override
  514. {
  515. if (type() != other.type())
  516. return false;
  517. return m_id == static_cast<const IdentifierStyleValue&>(other).m_id;
  518. }
  519. private:
  520. explicit IdentifierStyleValue(CSS::ValueID id)
  521. : StyleValue(Type::Identifier)
  522. , m_id(id)
  523. {
  524. }
  525. CSS::ValueID m_id { CSS::ValueID::Invalid };
  526. };
  527. class ImageStyleValue final
  528. : public StyleValue
  529. , public ImageResourceClient {
  530. public:
  531. static NonnullRefPtr<ImageStyleValue> create(const URL& url, DOM::Document& document) { return adopt_ref(*new ImageStyleValue(url, document)); }
  532. virtual ~ImageStyleValue() override { }
  533. String to_string() const override { return String::formatted("Image({})", m_url.to_string()); }
  534. const Gfx::Bitmap* bitmap() const { return m_bitmap; }
  535. private:
  536. ImageStyleValue(const URL&, DOM::Document&);
  537. // ^ResourceClient
  538. virtual void resource_did_load() override;
  539. URL m_url;
  540. WeakPtr<DOM::Document> m_document;
  541. RefPtr<Gfx::Bitmap> m_bitmap;
  542. };
  543. class BackgroundStyleValue final : public StyleValue {
  544. public:
  545. static NonnullRefPtr<BackgroundStyleValue> create(
  546. NonnullRefPtr<StyleValue> color,
  547. NonnullRefPtr<StyleValue> image,
  548. NonnullRefPtr<StyleValue> repeat_x,
  549. NonnullRefPtr<StyleValue> repeat_y)
  550. {
  551. return adopt_ref(*new BackgroundStyleValue(color, image, repeat_x, repeat_y));
  552. }
  553. virtual ~BackgroundStyleValue() override { }
  554. NonnullRefPtr<StyleValue> color() const { return m_color; }
  555. NonnullRefPtr<StyleValue> image() const { return m_image; }
  556. NonnullRefPtr<StyleValue> repeat_x() const { return m_repeat_x; }
  557. NonnullRefPtr<StyleValue> repeat_y() const { return m_repeat_y; }
  558. virtual String to_string() const override
  559. {
  560. return String::formatted("Background color: {}, image: {}, repeat: {}/{}", m_color->to_string(), m_image->to_string(), m_repeat_x->to_string(), m_repeat_y->to_string());
  561. }
  562. private:
  563. BackgroundStyleValue(
  564. NonnullRefPtr<StyleValue> color,
  565. NonnullRefPtr<StyleValue> image,
  566. NonnullRefPtr<StyleValue> repeat_x,
  567. NonnullRefPtr<StyleValue> repeat_y)
  568. : StyleValue(Type::Background)
  569. , m_color(color)
  570. , m_image(image)
  571. , m_repeat_x(repeat_x)
  572. , m_repeat_y(repeat_y)
  573. {
  574. }
  575. NonnullRefPtr<StyleValue> m_color;
  576. NonnullRefPtr<StyleValue> m_image;
  577. // FIXME: background-position
  578. // FIXME: background-size
  579. NonnullRefPtr<StyleValue> m_repeat_x;
  580. NonnullRefPtr<StyleValue> m_repeat_y;
  581. // FIXME: background-attachment
  582. // FIXME: background-clip
  583. // FIXME: background-origin
  584. };
  585. class BackgroundRepeatStyleValue final : public StyleValue {
  586. public:
  587. static NonnullRefPtr<BackgroundRepeatStyleValue> create(NonnullRefPtr<StyleValue> repeat_x, NonnullRefPtr<StyleValue> repeat_y)
  588. {
  589. return adopt_ref(*new BackgroundRepeatStyleValue(repeat_x, repeat_y));
  590. }
  591. virtual ~BackgroundRepeatStyleValue() override { }
  592. NonnullRefPtr<StyleValue> repeat_x() const { return m_repeat_x; }
  593. NonnullRefPtr<StyleValue> repeat_y() const { return m_repeat_y; }
  594. virtual String to_string() const override
  595. {
  596. return String::formatted("{} {}", m_repeat_x->to_string(), m_repeat_y->to_string());
  597. }
  598. private:
  599. BackgroundRepeatStyleValue(NonnullRefPtr<StyleValue> repeat_x, NonnullRefPtr<StyleValue> repeat_y)
  600. : StyleValue(Type::BackgroundRepeat)
  601. , m_repeat_x(repeat_x)
  602. , m_repeat_y(repeat_y)
  603. {
  604. }
  605. NonnullRefPtr<StyleValue> m_repeat_x;
  606. NonnullRefPtr<StyleValue> m_repeat_y;
  607. };
  608. class BorderStyleValue final : public StyleValue {
  609. public:
  610. static NonnullRefPtr<BorderStyleValue> create(
  611. NonnullRefPtr<StyleValue> border_width,
  612. NonnullRefPtr<StyleValue> border_style,
  613. NonnullRefPtr<StyleValue> border_color)
  614. {
  615. return adopt_ref(*new BorderStyleValue(border_width, border_style, border_color));
  616. }
  617. virtual ~BorderStyleValue() override { }
  618. NonnullRefPtr<StyleValue> border_width() const { return m_border_width; }
  619. NonnullRefPtr<StyleValue> border_style() const { return m_border_style; }
  620. NonnullRefPtr<StyleValue> border_color() const { return m_border_color; }
  621. virtual String to_string() const override
  622. {
  623. 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());
  624. }
  625. private:
  626. BorderStyleValue(
  627. NonnullRefPtr<StyleValue> border_width,
  628. NonnullRefPtr<StyleValue> border_style,
  629. NonnullRefPtr<StyleValue> border_color)
  630. : StyleValue(Type::Border)
  631. , m_border_width(border_width)
  632. , m_border_style(border_style)
  633. , m_border_color(border_color)
  634. {
  635. }
  636. NonnullRefPtr<StyleValue> m_border_width;
  637. NonnullRefPtr<StyleValue> m_border_style;
  638. NonnullRefPtr<StyleValue> m_border_color;
  639. };
  640. class BorderRadiusStyleValue final : public StyleValue {
  641. public:
  642. static NonnullRefPtr<BorderRadiusStyleValue> create(Length const& horizontal_radius, Length const& vertical_radius)
  643. {
  644. return adopt_ref(*new BorderRadiusStyleValue(horizontal_radius, vertical_radius));
  645. }
  646. virtual ~BorderRadiusStyleValue() override { }
  647. Length const& horizontal_radius() const { return m_horizontal_radius; }
  648. Length const& vertical_radius() const { return m_vertical_radius; }
  649. bool is_elliptical() const { return m_is_elliptical; }
  650. // FIXME: Remove this once we support elliptical border-radius in Layout/Node.
  651. virtual Length to_length() const override { return horizontal_radius(); }
  652. virtual String to_string() const override
  653. {
  654. return String::formatted("{} / {}", m_horizontal_radius.to_string(), m_vertical_radius.to_string());
  655. }
  656. private:
  657. BorderRadiusStyleValue(Length const& horizontal_radius, Length const& vertical_radius)
  658. : StyleValue(Type::BorderRadius)
  659. , m_horizontal_radius(horizontal_radius)
  660. , m_vertical_radius(vertical_radius)
  661. {
  662. m_is_elliptical = (m_horizontal_radius != m_vertical_radius);
  663. }
  664. bool m_is_elliptical;
  665. Length m_horizontal_radius;
  666. Length m_vertical_radius;
  667. };
  668. class FlexStyleValue final : public StyleValue {
  669. public:
  670. static NonnullRefPtr<FlexStyleValue> create(
  671. NonnullRefPtr<StyleValue> grow,
  672. NonnullRefPtr<StyleValue> shrink,
  673. NonnullRefPtr<StyleValue> basis)
  674. {
  675. return adopt_ref(*new FlexStyleValue(grow, shrink, basis));
  676. }
  677. virtual ~FlexStyleValue() override { }
  678. NonnullRefPtr<StyleValue> grow() const { return m_grow; }
  679. NonnullRefPtr<StyleValue> shrink() const { return m_shrink; }
  680. NonnullRefPtr<StyleValue> basis() const { return m_basis; }
  681. virtual String to_string() const override
  682. {
  683. return String::formatted("Flex grow: {}, shrink: {}, basis: {}", m_grow->to_string(), m_shrink->to_string(), m_basis->to_string());
  684. }
  685. private:
  686. FlexStyleValue(
  687. NonnullRefPtr<StyleValue> grow,
  688. NonnullRefPtr<StyleValue> shrink,
  689. NonnullRefPtr<StyleValue> basis)
  690. : StyleValue(Type::Flex)
  691. , m_grow(grow)
  692. , m_shrink(shrink)
  693. , m_basis(basis)
  694. {
  695. }
  696. NonnullRefPtr<StyleValue> m_grow;
  697. NonnullRefPtr<StyleValue> m_shrink;
  698. NonnullRefPtr<StyleValue> m_basis;
  699. };
  700. class FlexFlowStyleValue final : public StyleValue {
  701. public:
  702. static NonnullRefPtr<FlexFlowStyleValue> create(NonnullRefPtr<StyleValue> flex_direction, NonnullRefPtr<StyleValue> flex_wrap)
  703. {
  704. return adopt_ref(*new FlexFlowStyleValue(flex_direction, flex_wrap));
  705. }
  706. virtual ~FlexFlowStyleValue() override { }
  707. NonnullRefPtr<StyleValue> flex_direction() const { return m_flex_direction; }
  708. NonnullRefPtr<StyleValue> flex_wrap() const { return m_flex_wrap; }
  709. virtual String to_string() const override
  710. {
  711. return String::formatted("FlexFlow flex_direction: {}, flex_wrap: {}", m_flex_direction->to_string(), m_flex_wrap->to_string());
  712. }
  713. private:
  714. FlexFlowStyleValue(NonnullRefPtr<StyleValue> flex_direction, NonnullRefPtr<StyleValue> flex_wrap)
  715. : StyleValue(Type::FlexFlow)
  716. , m_flex_direction(flex_direction)
  717. , m_flex_wrap(flex_wrap)
  718. {
  719. }
  720. NonnullRefPtr<StyleValue> m_flex_direction;
  721. NonnullRefPtr<StyleValue> m_flex_wrap;
  722. };
  723. class FontStyleValue final : public StyleValue {
  724. public:
  725. 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)); }
  726. virtual ~FontStyleValue() override { }
  727. NonnullRefPtr<StyleValue> font_style() const { return m_font_style; }
  728. NonnullRefPtr<StyleValue> font_weight() const { return m_font_weight; }
  729. NonnullRefPtr<StyleValue> font_size() const { return m_font_size; }
  730. NonnullRefPtr<StyleValue> line_height() const { return m_line_height; }
  731. NonnullRefPtr<StyleValue> font_families() const { return m_font_families; }
  732. virtual String to_string() const override
  733. {
  734. return String::formatted("Font style: {}, weight: {}, size: {}, line_height: {}, families: {}",
  735. 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());
  736. }
  737. private:
  738. FontStyleValue(NonnullRefPtr<StyleValue> font_style, NonnullRefPtr<StyleValue> font_weight, NonnullRefPtr<StyleValue> font_size, NonnullRefPtr<StyleValue> line_height, NonnullRefPtr<StyleValue> font_families)
  739. : StyleValue(Type::Font)
  740. , m_font_style(font_style)
  741. , m_font_weight(font_weight)
  742. , m_font_size(font_size)
  743. , m_line_height(line_height)
  744. , m_font_families(font_families)
  745. {
  746. }
  747. NonnullRefPtr<StyleValue> m_font_style;
  748. NonnullRefPtr<StyleValue> m_font_weight;
  749. NonnullRefPtr<StyleValue> m_font_size;
  750. NonnullRefPtr<StyleValue> m_line_height;
  751. NonnullRefPtr<StyleValue> m_font_families;
  752. // FIXME: Implement font-stretch and font-variant.
  753. };
  754. class ListStyleStyleValue final : public StyleValue {
  755. public:
  756. static NonnullRefPtr<ListStyleStyleValue> create(
  757. NonnullRefPtr<StyleValue> position,
  758. NonnullRefPtr<StyleValue> image,
  759. NonnullRefPtr<StyleValue> style_type)
  760. {
  761. return adopt_ref(*new ListStyleStyleValue(position, image, style_type));
  762. }
  763. virtual ~ListStyleStyleValue() override { }
  764. NonnullRefPtr<StyleValue> position() const { return m_position; }
  765. NonnullRefPtr<StyleValue> image() const { return m_image; }
  766. NonnullRefPtr<StyleValue> style_type() const { return m_style_type; }
  767. virtual String to_string() const override
  768. {
  769. return String::formatted("ListStyle position: {}, image: {}, style_type: {}", m_position->to_string(), m_image->to_string(), m_style_type->to_string());
  770. }
  771. private:
  772. ListStyleStyleValue(
  773. NonnullRefPtr<StyleValue> position,
  774. NonnullRefPtr<StyleValue> image,
  775. NonnullRefPtr<StyleValue> style_type)
  776. : StyleValue(Type::ListStyle)
  777. , m_position(position)
  778. , m_image(image)
  779. , m_style_type(style_type)
  780. {
  781. }
  782. NonnullRefPtr<StyleValue> m_position;
  783. NonnullRefPtr<StyleValue> m_image;
  784. NonnullRefPtr<StyleValue> m_style_type;
  785. };
  786. class OverflowStyleValue final : public StyleValue {
  787. public:
  788. static NonnullRefPtr<OverflowStyleValue> create(NonnullRefPtr<StyleValue> overflow_x, NonnullRefPtr<StyleValue> overflow_y)
  789. {
  790. return adopt_ref(*new OverflowStyleValue(overflow_x, overflow_y));
  791. }
  792. virtual ~OverflowStyleValue() override { }
  793. NonnullRefPtr<StyleValue> overflow_x() const { return m_overflow_x; }
  794. NonnullRefPtr<StyleValue> overflow_y() const { return m_overflow_y; }
  795. virtual String to_string() const override
  796. {
  797. return String::formatted("{} {}", m_overflow_x->to_string(), m_overflow_y->to_string());
  798. }
  799. private:
  800. OverflowStyleValue(NonnullRefPtr<StyleValue> overflow_x, NonnullRefPtr<StyleValue> overflow_y)
  801. : StyleValue(Type::Overflow)
  802. , m_overflow_x(overflow_x)
  803. , m_overflow_y(overflow_y)
  804. {
  805. }
  806. NonnullRefPtr<StyleValue> m_overflow_x;
  807. NonnullRefPtr<StyleValue> m_overflow_y;
  808. };
  809. class TextDecorationStyleValue final : public StyleValue {
  810. public:
  811. static NonnullRefPtr<TextDecorationStyleValue> create(
  812. NonnullRefPtr<StyleValue> line,
  813. NonnullRefPtr<StyleValue> style,
  814. NonnullRefPtr<StyleValue> color)
  815. {
  816. return adopt_ref(*new TextDecorationStyleValue(line, style, color));
  817. }
  818. virtual ~TextDecorationStyleValue() override { }
  819. NonnullRefPtr<StyleValue> line() const { return m_line; }
  820. NonnullRefPtr<StyleValue> style() const { return m_style; }
  821. NonnullRefPtr<StyleValue> color() const { return m_color; }
  822. virtual String to_string() const override
  823. {
  824. return String::formatted("TextDecoration line: {}, style: {}, color: {}", m_line->to_string(), m_style->to_string(), m_color->to_string());
  825. }
  826. private:
  827. TextDecorationStyleValue(
  828. NonnullRefPtr<StyleValue> line,
  829. NonnullRefPtr<StyleValue> style,
  830. NonnullRefPtr<StyleValue> color)
  831. : StyleValue(Type::TextDecoration)
  832. , m_line(line)
  833. , m_style(style)
  834. , m_color(color)
  835. {
  836. }
  837. NonnullRefPtr<StyleValue> m_line;
  838. NonnullRefPtr<StyleValue> m_style;
  839. NonnullRefPtr<StyleValue> m_color;
  840. };
  841. class StyleValueList final : public StyleValue {
  842. public:
  843. static NonnullRefPtr<StyleValueList> create(NonnullRefPtrVector<StyleValue>&& values) { return adopt_ref(*new StyleValueList(move(values))); }
  844. NonnullRefPtrVector<StyleValue> const& values() const { return m_values; }
  845. virtual String to_string() const
  846. {
  847. StringBuilder builder;
  848. builder.appendff("List[{}](", m_values.size());
  849. for (size_t i = 0; i < m_values.size(); ++i) {
  850. if (i)
  851. builder.append(',');
  852. builder.append(m_values[i].to_string());
  853. }
  854. builder.append(')');
  855. return builder.to_string();
  856. }
  857. private:
  858. StyleValueList(NonnullRefPtrVector<StyleValue>&& values)
  859. : StyleValue(Type::ValueList)
  860. , m_values(move(values))
  861. {
  862. }
  863. NonnullRefPtrVector<StyleValue> m_values;
  864. };
  865. inline CSS::ValueID StyleValue::to_identifier() const
  866. {
  867. if (is_identifier())
  868. return static_cast<const IdentifierStyleValue&>(*this).id();
  869. if (is_auto())
  870. return CSS::ValueID::Auto;
  871. return CSS::ValueID::Invalid;
  872. }
  873. }