| 
									
										
										
										
											2020-01-18 09:38:21 +01:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> | 
					
						
							| 
									
										
										
										
											2021-07-04 17:17:23 +02:00
										 |  |  |  * Copyright (c) 2021, Tobias Christiansen <tobi@tobyase.de> | 
					
						
							| 
									
										
										
										
											2020-01-18 09:38:21 +01:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2021-04-22 01:24:48 -07:00
										 |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							| 
									
										
										
										
											2020-01-18 09:38:21 +01:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-20 23:25:25 +02:00
										 |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-21 18:58:45 +02:00
										 |  |  | #include <AK/RefCounted.h>
 | 
					
						
							| 
									
										
										
										
											2019-06-22 21:48:21 +02:00
										 |  |  | #include <AK/RefPtr.h>
 | 
					
						
							| 
									
										
										
										
											2019-09-28 22:18:19 +02:00
										 |  |  | #include <AK/String.h>
 | 
					
						
							| 
									
										
										
										
											2019-06-22 21:48:21 +02:00
										 |  |  | #include <AK/StringView.h>
 | 
					
						
							| 
									
										
										
										
											2019-10-19 11:49:46 +02:00
										 |  |  | #include <AK/URL.h>
 | 
					
						
							|  |  |  | #include <AK/WeakPtr.h>
 | 
					
						
							| 
									
										
										
										
											2020-02-06 12:07:05 +01:00
										 |  |  | #include <LibGfx/Bitmap.h>
 | 
					
						
							| 
									
										
										
										
											2020-06-02 13:51:30 +02:00
										 |  |  | #include <LibGfx/Color.h>
 | 
					
						
							| 
									
										
										
										
											2020-03-07 10:32:51 +01:00
										 |  |  | #include <LibWeb/CSS/Length.h>
 | 
					
						
							|  |  |  | #include <LibWeb/CSS/PropertyID.h>
 | 
					
						
							| 
									
										
										
										
											2020-12-15 20:39:09 +01:00
										 |  |  | #include <LibWeb/CSS/ValueID.h>
 | 
					
						
							| 
									
										
										
										
											2020-07-21 16:23:08 +02:00
										 |  |  | #include <LibWeb/Forward.h>
 | 
					
						
							| 
									
										
										
										
											2020-06-05 23:32:23 +02:00
										 |  |  | #include <LibWeb/Loader/ImageResource.h>
 | 
					
						
							| 
									
										
										
										
											2019-06-20 23:25:25 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-21 16:23:08 +02:00
										 |  |  | namespace Web::CSS { | 
					
						
							| 
									
										
										
										
											2019-10-06 10:25:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-23 17:29:15 +01:00
										 |  |  | enum class Position { | 
					
						
							|  |  |  |     Static, | 
					
						
							|  |  |  |     Relative, | 
					
						
							|  |  |  |     Absolute, | 
					
						
							|  |  |  |     Fixed, | 
					
						
							|  |  |  |     Sticky, | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2020-06-23 23:28:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | enum class TextAlign { | 
					
						
							|  |  |  |     Left, | 
					
						
							|  |  |  |     Center, | 
					
						
							|  |  |  |     Right, | 
					
						
							|  |  |  |     Justify, | 
					
						
							| 
									
										
										
										
											2020-12-15 20:39:09 +01:00
										 |  |  |     LibwebCenter, | 
					
						
							| 
									
										
										
										
											2020-06-23 23:28:40 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-15 13:36:27 +01:00
										 |  |  | enum class TextDecorationLine { | 
					
						
							|  |  |  |     None, | 
					
						
							|  |  |  |     Underline, | 
					
						
							|  |  |  |     Overline, | 
					
						
							|  |  |  |     LineThrough, | 
					
						
							|  |  |  |     Blink, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-15 14:15:49 +01:00
										 |  |  | enum class TextTransform { | 
					
						
							|  |  |  |     None, | 
					
						
							|  |  |  |     Capitalize, | 
					
						
							|  |  |  |     Uppercase, | 
					
						
							|  |  |  |     Lowercase, | 
					
						
							|  |  |  |     FullWidth, | 
					
						
							|  |  |  |     FullSizeKana, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-24 16:22:16 +02:00
										 |  |  | enum class Display { | 
					
						
							|  |  |  |     None, | 
					
						
							|  |  |  |     Block, | 
					
						
							|  |  |  |     Inline, | 
					
						
							|  |  |  |     InlineBlock, | 
					
						
							|  |  |  |     ListItem, | 
					
						
							|  |  |  |     Table, | 
					
						
							|  |  |  |     TableRow, | 
					
						
							|  |  |  |     TableCell, | 
					
						
							| 
									
										
										
										
											2020-07-05 19:51:49 +02:00
										 |  |  |     TableHeaderGroup, | 
					
						
							| 
									
										
										
										
											2020-06-24 16:22:16 +02:00
										 |  |  |     TableRowGroup, | 
					
						
							| 
									
										
										
										
											2020-07-05 19:51:49 +02:00
										 |  |  |     TableFooterGroup, | 
					
						
							| 
									
										
										
										
											2021-01-07 14:40:02 +01:00
										 |  |  |     TableColumn, | 
					
						
							|  |  |  |     TableColumnGroup, | 
					
						
							|  |  |  |     TableCaption, | 
					
						
							| 
									
										
										
										
											2021-01-18 17:32:34 +01:00
										 |  |  |     Flex, | 
					
						
							| 
									
										
										
										
											2020-06-24 16:22:16 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-18 17:41:57 +01:00
										 |  |  | enum class FlexDirection { | 
					
						
							|  |  |  |     Row, | 
					
						
							|  |  |  |     RowReverse, | 
					
						
							|  |  |  |     Column, | 
					
						
							|  |  |  |     ColumnReverse, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-30 12:11:32 +02:00
										 |  |  | enum class FlexWrap { | 
					
						
							|  |  |  |     Nowrap, | 
					
						
							|  |  |  |     Wrap, | 
					
						
							|  |  |  |     WrapReverse | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-30 14:23:43 +02:00
										 |  |  | enum class FlexBasis { | 
					
						
							|  |  |  |     Content, | 
					
						
							|  |  |  |     Length | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-24 16:37:44 +02:00
										 |  |  | enum class WhiteSpace { | 
					
						
							|  |  |  |     Normal, | 
					
						
							|  |  |  |     Pre, | 
					
						
							|  |  |  |     Nowrap, | 
					
						
							|  |  |  |     PreLine, | 
					
						
							|  |  |  |     PreWrap, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-26 15:08:42 +02:00
										 |  |  | enum class Float { | 
					
						
							|  |  |  |     None, | 
					
						
							|  |  |  |     Left, | 
					
						
							|  |  |  |     Right, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-06 01:45:51 +01:00
										 |  |  | enum class Clear { | 
					
						
							|  |  |  |     None, | 
					
						
							|  |  |  |     Left, | 
					
						
							|  |  |  |     Right, | 
					
						
							|  |  |  |     Both, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-21 17:41:00 +00:00
										 |  |  | enum class Cursor { | 
					
						
							|  |  |  |     Auto, | 
					
						
							|  |  |  |     Default, | 
					
						
							|  |  |  |     None, | 
					
						
							|  |  |  |     ContextMenu, | 
					
						
							|  |  |  |     Help, | 
					
						
							|  |  |  |     Pointer, | 
					
						
							|  |  |  |     Progress, | 
					
						
							|  |  |  |     Wait, | 
					
						
							|  |  |  |     Cell, | 
					
						
							|  |  |  |     Crosshair, | 
					
						
							|  |  |  |     Text, | 
					
						
							|  |  |  |     VerticalText, | 
					
						
							|  |  |  |     Alias, | 
					
						
							|  |  |  |     Copy, | 
					
						
							|  |  |  |     Move, | 
					
						
							|  |  |  |     NoDrop, | 
					
						
							|  |  |  |     NotAllowed, | 
					
						
							|  |  |  |     Grab, | 
					
						
							|  |  |  |     Grabbing, | 
					
						
							|  |  |  |     EResize, | 
					
						
							|  |  |  |     NResize, | 
					
						
							|  |  |  |     NeResize, | 
					
						
							|  |  |  |     NwResize, | 
					
						
							|  |  |  |     SResize, | 
					
						
							|  |  |  |     SeResize, | 
					
						
							|  |  |  |     SwResize, | 
					
						
							|  |  |  |     WResize, | 
					
						
							|  |  |  |     EwResize, | 
					
						
							|  |  |  |     NsResize, | 
					
						
							|  |  |  |     NeswResize, | 
					
						
							|  |  |  |     NwseResize, | 
					
						
							|  |  |  |     ColResize, | 
					
						
							|  |  |  |     RowResize, | 
					
						
							|  |  |  |     AllScroll, | 
					
						
							|  |  |  |     ZoomIn, | 
					
						
							|  |  |  |     ZoomOut, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-04 16:11:55 +01:00
										 |  |  | enum class LineStyle { | 
					
						
							|  |  |  |     None, | 
					
						
							|  |  |  |     Hidden, | 
					
						
							|  |  |  |     Dotted, | 
					
						
							|  |  |  |     Dashed, | 
					
						
							|  |  |  |     Solid, | 
					
						
							|  |  |  |     Double, | 
					
						
							|  |  |  |     Groove, | 
					
						
							|  |  |  |     Ridge, | 
					
						
							|  |  |  |     Inset, | 
					
						
							|  |  |  |     Outset, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-15 16:50:39 +01:00
										 |  |  | enum class ListStyleType { | 
					
						
							|  |  |  |     None, | 
					
						
							|  |  |  |     Disc, | 
					
						
							|  |  |  |     Circle, | 
					
						
							|  |  |  |     Square, | 
					
						
							|  |  |  |     Decimal, | 
					
						
							| 
									
										
										
										
											2021-04-22 22:14:24 +02:00
										 |  |  |     DecimalLeadingZero, | 
					
						
							| 
									
										
										
										
											2021-04-22 23:39:18 +02:00
										 |  |  |     LowerAlpha, | 
					
						
							|  |  |  |     LowerLatin, | 
					
						
							| 
									
										
										
										
											2021-07-04 17:17:23 +02:00
										 |  |  |     LowerRoman, | 
					
						
							| 
									
										
										
										
											2021-04-22 23:52:15 +02:00
										 |  |  |     UpperAlpha, | 
					
						
							|  |  |  |     UpperLatin, | 
					
						
							| 
									
										
										
										
											2021-07-04 17:17:23 +02:00
										 |  |  |     UpperRoman, | 
					
						
							| 
									
										
										
										
											2020-12-15 16:50:39 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-22 15:20:31 +01:00
										 |  |  | enum class Overflow : u8 { | 
					
						
							|  |  |  |     Auto, | 
					
						
							|  |  |  |     Clip, | 
					
						
							|  |  |  |     Hidden, | 
					
						
							|  |  |  |     Scroll, | 
					
						
							|  |  |  |     Visible, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-02 15:41:29 -04:00
										 |  |  | enum class Repeat : u8 { | 
					
						
							|  |  |  |     NoRepeat, | 
					
						
							|  |  |  |     Repeat, | 
					
						
							|  |  |  |     Round, | 
					
						
							|  |  |  |     Space, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-16 18:38:26 +02:00
										 |  |  | enum class JustifyContent { | 
					
						
							|  |  |  |     FlexStart, | 
					
						
							|  |  |  |     FlexEnd, | 
					
						
							|  |  |  |     Center, | 
					
						
							|  |  |  |     SpaceBetween, | 
					
						
							|  |  |  |     SpaceAround, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-21 15:29:31 +02:00
										 |  |  | class StyleValue : public RefCounted<StyleValue> { | 
					
						
							| 
									
										
										
										
											2019-06-20 23:25:25 +02:00
										 |  |  | public: | 
					
						
							|  |  |  |     virtual ~StyleValue(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-03 07:55:22 +02:00
										 |  |  |     enum class Type { | 
					
						
							| 
									
										
										
										
											2019-06-20 23:25:25 +02:00
										 |  |  |         Invalid, | 
					
						
							|  |  |  |         Inherit, | 
					
						
							|  |  |  |         Initial, | 
					
						
							| 
									
										
										
										
											2019-07-03 07:55:22 +02:00
										 |  |  |         String, | 
					
						
							|  |  |  |         Length, | 
					
						
							| 
									
										
										
										
											2019-09-28 22:18:19 +02:00
										 |  |  |         Color, | 
					
						
							| 
									
										
										
										
											2019-10-06 10:25:08 +02:00
										 |  |  |         Identifier, | 
					
						
							| 
									
										
										
										
											2019-10-19 11:49:46 +02:00
										 |  |  |         Image, | 
					
						
							| 
									
										
										
										
											2020-03-23 17:29:15 +01:00
										 |  |  |         Position, | 
					
						
							| 
									
										
										
										
											2021-05-24 22:46:19 +02:00
										 |  |  |         CustomProperty, | 
					
						
							| 
									
										
										
										
											2021-06-03 21:59:41 +02:00
										 |  |  |         Numeric, | 
					
						
							| 
									
										
										
										
											2019-06-20 23:25:25 +02:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Type type() const { return m_type; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-08 07:14:23 +02:00
										 |  |  |     bool is_inherit() const { return type() == Type::Inherit; } | 
					
						
							|  |  |  |     bool is_initial() const { return type() == Type::Initial; } | 
					
						
							| 
									
										
										
										
											2019-09-29 18:05:37 +02:00
										 |  |  |     bool is_color() const { return type() == Type::Color; } | 
					
						
							| 
									
										
										
										
											2019-10-06 10:25:08 +02:00
										 |  |  |     bool is_identifier() const { return type() == Type::Identifier; } | 
					
						
							| 
									
										
										
										
											2019-10-19 11:49:46 +02:00
										 |  |  |     bool is_image() const { return type() == Type::Image; } | 
					
						
							| 
									
										
										
										
											2019-11-18 11:49:19 +01:00
										 |  |  |     bool is_string() const { return type() == Type::String; } | 
					
						
							|  |  |  |     bool is_length() const { return type() == Type::Length; } | 
					
						
							| 
									
										
										
										
											2020-03-23 17:29:15 +01:00
										 |  |  |     bool is_position() const { return type() == Type::Position; } | 
					
						
							| 
									
										
										
										
											2021-05-24 22:46:19 +02:00
										 |  |  |     bool is_custom_property() const { return type() == Type::CustomProperty; } | 
					
						
							| 
									
										
										
										
											2021-06-03 21:59:41 +02:00
										 |  |  |     bool is_numeric() const { return type() == Type::Numeric; } | 
					
						
							| 
									
										
										
										
											2019-07-08 07:14:23 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-25 06:31:47 +02:00
										 |  |  |     virtual String to_string() const = 0; | 
					
						
							| 
									
										
										
										
											2020-06-24 11:08:46 +02:00
										 |  |  |     virtual Length to_length() const { return Length::make_auto(); } | 
					
						
							| 
									
										
										
										
											2020-07-26 19:37:56 +02:00
										 |  |  |     virtual Color to_color(const DOM::Document&) const { return {}; } | 
					
						
							| 
									
										
										
										
											2019-06-25 06:31:47 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-15 13:36:27 +01:00
										 |  |  |     CSS::ValueID to_identifier() const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-18 08:09:56 +02:00
										 |  |  |     virtual bool is_auto() const { return false; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-14 15:04:13 +01:00
										 |  |  |     bool operator==(const StyleValue& other) const { return equals(other); } | 
					
						
							|  |  |  |     bool operator!=(const StyleValue& other) const { return !(*this == other); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual bool equals(const StyleValue& other) const | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (type() != other.type()) | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         return to_string() == other.to_string(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-20 23:25:25 +02:00
										 |  |  | protected: | 
					
						
							|  |  |  |     explicit StyleValue(Type); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     Type m_type { Type::Invalid }; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2019-06-22 21:48:21 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-24 22:46:19 +02:00
										 |  |  | // FIXME: Allow for fallback
 | 
					
						
							|  |  |  | class CustomStyleValue : public StyleValue { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     static NonnullRefPtr<CustomStyleValue> create(const String& custom_property_name) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return adopt_ref(*new CustomStyleValue(custom_property_name)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     String custom_property_name() const { return m_custom_property_name; } | 
					
						
							|  |  |  |     String to_string() const override { return m_custom_property_name; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     explicit CustomStyleValue(const String& custom_property_name) | 
					
						
							|  |  |  |         : StyleValue(Type::CustomProperty) | 
					
						
							|  |  |  |         , m_custom_property_name(custom_property_name) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     String m_custom_property_name {}; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-03 21:59:41 +02:00
										 |  |  | class NumericStyleValue : public StyleValue { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     static NonnullRefPtr<NumericStyleValue> create(float value) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return adopt_ref(*new NumericStyleValue(value)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     float value() const { return m_value; } | 
					
						
							|  |  |  |     String to_string() const override { return String::formatted("{}", m_value); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     explicit NumericStyleValue(float value) | 
					
						
							|  |  |  |         : StyleValue(Type::Numeric) | 
					
						
							|  |  |  |         , m_value(value) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     float m_value { 0 }; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-03 07:55:22 +02:00
										 |  |  | class StringStyleValue : public StyleValue { | 
					
						
							| 
									
										
										
										
											2019-06-22 21:48:21 +02:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2019-07-04 15:49:16 +02:00
										 |  |  |     static NonnullRefPtr<StringStyleValue> create(const String& string) | 
					
						
							| 
									
										
										
										
											2019-06-22 21:48:21 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-04-23 16:46:57 +02:00
										 |  |  |         return adopt_ref(*new StringStyleValue(string)); | 
					
						
							| 
									
										
										
										
											2019-06-22 21:48:21 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-06-02 13:51:30 +02:00
										 |  |  |     virtual ~StringStyleValue() override { } | 
					
						
							| 
									
										
										
										
											2019-06-22 21:48:21 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-25 06:31:47 +02:00
										 |  |  |     String to_string() const override { return m_string; } | 
					
						
							| 
									
										
										
										
											2019-06-22 21:48:21 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2019-07-04 15:49:16 +02:00
										 |  |  |     explicit StringStyleValue(const String& string) | 
					
						
							|  |  |  |         : StyleValue(Type::String) | 
					
						
							|  |  |  |         , m_string(string) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-22 21:48:21 +02:00
										 |  |  |     String m_string; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2019-07-03 07:55:22 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | class LengthStyleValue : public StyleValue { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2019-07-04 15:49:16 +02:00
										 |  |  |     static NonnullRefPtr<LengthStyleValue> create(const Length& length) | 
					
						
							| 
									
										
										
										
											2019-07-03 07:55:22 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-04-23 16:46:57 +02:00
										 |  |  |         return adopt_ref(*new LengthStyleValue(length)); | 
					
						
							| 
									
										
										
										
											2019-07-03 07:55:22 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-06-02 13:51:30 +02:00
										 |  |  |     virtual ~LengthStyleValue() override { } | 
					
						
							| 
									
										
										
										
											2019-07-03 07:55:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-26 08:05:14 +02:00
										 |  |  |     virtual String to_string() const override { return m_length.to_string(); } | 
					
						
							|  |  |  |     virtual Length to_length() const override { return m_length; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const Length& length() const { return m_length; } | 
					
						
							| 
									
										
										
										
											2019-07-03 07:55:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-18 08:09:56 +02:00
										 |  |  |     virtual bool is_auto() const override { return m_length.is_auto(); } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-15 19:39:33 +01:00
										 |  |  |     virtual bool equals(const StyleValue& other) const override | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (type() != other.type()) | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         return m_length == static_cast<const LengthStyleValue&>(other).m_length; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-03 07:55:22 +02:00
										 |  |  | private: | 
					
						
							| 
									
										
										
										
											2019-07-04 15:49:16 +02:00
										 |  |  |     explicit LengthStyleValue(const Length& length) | 
					
						
							|  |  |  |         : StyleValue(Type::Length) | 
					
						
							|  |  |  |         , m_length(length) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-03 07:55:22 +02:00
										 |  |  |     Length m_length; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2019-07-08 07:14:23 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | class InitialStyleValue final : public StyleValue { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2021-04-23 16:46:57 +02:00
										 |  |  |     static NonnullRefPtr<InitialStyleValue> create() { return adopt_ref(*new InitialStyleValue); } | 
					
						
							| 
									
										
										
										
											2020-06-02 13:51:30 +02:00
										 |  |  |     virtual ~InitialStyleValue() override { } | 
					
						
							| 
									
										
										
										
											2019-07-08 07:14:23 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     String to_string() const override { return "initial"; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     InitialStyleValue() | 
					
						
							|  |  |  |         : StyleValue(Type::Initial) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class InheritStyleValue final : public StyleValue { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2021-04-23 16:46:57 +02:00
										 |  |  |     static NonnullRefPtr<InheritStyleValue> create() { return adopt_ref(*new InheritStyleValue); } | 
					
						
							| 
									
										
										
										
											2020-06-02 13:51:30 +02:00
										 |  |  |     virtual ~InheritStyleValue() override { } | 
					
						
							| 
									
										
										
										
											2019-07-08 07:14:23 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     String to_string() const override { return "inherit"; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     InheritStyleValue() | 
					
						
							|  |  |  |         : StyleValue(Type::Inherit) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2019-09-28 22:18:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | class ColorStyleValue : public StyleValue { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     static NonnullRefPtr<ColorStyleValue> create(Color color) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-04-23 16:46:57 +02:00
										 |  |  |         return adopt_ref(*new ColorStyleValue(color)); | 
					
						
							| 
									
										
										
										
											2019-09-28 22:18:19 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-06-02 13:51:30 +02:00
										 |  |  |     virtual ~ColorStyleValue() override { } | 
					
						
							| 
									
										
										
										
											2019-09-28 22:18:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Color color() const { return m_color; } | 
					
						
							| 
									
										
										
										
											2019-10-03 16:11:46 +02:00
										 |  |  |     String to_string() const override { return m_color.to_string(); } | 
					
						
							| 
									
										
										
										
											2020-07-26 19:37:56 +02:00
										 |  |  |     Color to_color(const DOM::Document&) const override { return m_color; } | 
					
						
							| 
									
										
										
										
											2019-09-28 22:18:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-15 19:39:33 +01:00
										 |  |  |     virtual bool equals(const StyleValue& other) const override | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (type() != other.type()) | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         return m_color == static_cast<const ColorStyleValue&>(other).m_color; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-28 22:18:19 +02:00
										 |  |  | private: | 
					
						
							|  |  |  |     explicit ColorStyleValue(Color color) | 
					
						
							|  |  |  |         : StyleValue(Type::Color) | 
					
						
							|  |  |  |         , m_color(color) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Color m_color; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2019-10-06 10:25:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | class IdentifierStyleValue final : public StyleValue { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     static NonnullRefPtr<IdentifierStyleValue> create(CSS::ValueID id) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-04-23 16:46:57 +02:00
										 |  |  |         return adopt_ref(*new IdentifierStyleValue(id)); | 
					
						
							| 
									
										
										
										
											2019-10-06 10:25:08 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-06-02 13:51:30 +02:00
										 |  |  |     virtual ~IdentifierStyleValue() override { } | 
					
						
							| 
									
										
										
										
											2019-10-06 10:25:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     CSS::ValueID id() const { return m_id; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual String to_string() const override; | 
					
						
							| 
									
										
										
										
											2020-07-26 19:37:56 +02:00
										 |  |  |     virtual Color to_color(const DOM::Document&) const override; | 
					
						
							| 
									
										
										
										
											2019-10-06 10:25:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-14 15:04:13 +01:00
										 |  |  |     virtual bool equals(const StyleValue& other) const override | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (type() != other.type()) | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         return m_id == static_cast<const IdentifierStyleValue&>(other).m_id; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-06 10:25:08 +02:00
										 |  |  | private: | 
					
						
							|  |  |  |     explicit IdentifierStyleValue(CSS::ValueID id) | 
					
						
							|  |  |  |         : StyleValue(Type::Identifier) | 
					
						
							|  |  |  |         , m_id(id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     CSS::ValueID m_id { CSS::ValueID::Invalid }; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2019-10-19 11:49:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-02 13:51:30 +02:00
										 |  |  | class ImageStyleValue final | 
					
						
							|  |  |  |     : public StyleValue | 
					
						
							| 
									
										
										
										
											2020-06-05 23:32:23 +02:00
										 |  |  |     , public ImageResourceClient { | 
					
						
							| 
									
										
										
										
											2019-10-19 11:49:46 +02:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2021-04-23 16:46:57 +02:00
										 |  |  |     static NonnullRefPtr<ImageStyleValue> create(const URL& url, DOM::Document& document) { return adopt_ref(*new ImageStyleValue(url, document)); } | 
					
						
							| 
									
										
										
										
											2020-06-02 13:51:30 +02:00
										 |  |  |     virtual ~ImageStyleValue() override { } | 
					
						
							| 
									
										
										
										
											2019-10-19 11:49:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-03 14:05:46 +01:00
										 |  |  |     String to_string() const override { return String::formatted("Image({})", m_url.to_string()); } | 
					
						
							| 
									
										
										
										
											2019-10-19 11:49:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-06 11:56:38 +01:00
										 |  |  |     const Gfx::Bitmap* bitmap() const { return m_bitmap; } | 
					
						
							| 
									
										
										
										
											2019-10-19 11:49:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							| 
									
										
										
										
											2020-07-26 19:37:56 +02:00
										 |  |  |     ImageStyleValue(const URL&, DOM::Document&); | 
					
						
							| 
									
										
										
										
											2019-10-19 11:49:46 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-02 13:51:30 +02:00
										 |  |  |     // ^ResourceClient
 | 
					
						
							|  |  |  |     virtual void resource_did_load() override; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-19 11:49:46 +02:00
										 |  |  |     URL m_url; | 
					
						
							| 
									
										
										
										
											2020-07-26 19:37:56 +02:00
										 |  |  |     WeakPtr<DOM::Document> m_document; | 
					
						
							| 
									
										
										
										
											2020-02-06 11:56:38 +01:00
										 |  |  |     RefPtr<Gfx::Bitmap> m_bitmap; | 
					
						
							| 
									
										
										
										
											2019-10-19 11:49:46 +02:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2020-03-07 10:27:02 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-15 13:36:27 +01:00
										 |  |  | inline CSS::ValueID StyleValue::to_identifier() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (is_identifier()) | 
					
						
							|  |  |  |         return static_cast<const IdentifierStyleValue&>(*this).id(); | 
					
						
							|  |  |  |     return CSS::ValueID::Invalid; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-07 10:27:02 +01:00
										 |  |  | } |