StyleValue.h 30 KB

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