StyleValue.h 42 KB

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