StyleValue.h 26 KB

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