| 
									
										
										
										
											2020-01-18 09:38:21 +01:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> | 
					
						
							|  |  |  |  * All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Redistribution and use in source and binary forms, with or without | 
					
						
							|  |  |  |  * modification, are permitted provided that the following conditions are met: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 1. Redistributions of source code must retain the above copyright notice, this | 
					
						
							|  |  |  |  *    list of conditions and the following disclaimer. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | 
					
						
							|  |  |  |  *    this list of conditions and the following disclaimer in the documentation | 
					
						
							|  |  |  |  *    and/or other materials provided with the distribution. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | 
					
						
							|  |  |  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
					
						
							|  |  |  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 
					
						
							|  |  |  |  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | 
					
						
							|  |  |  |  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 
					
						
							|  |  |  |  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | 
					
						
							|  |  |  |  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | 
					
						
							|  |  |  |  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | 
					
						
							|  |  |  |  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
					
						
							|  |  |  |  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-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
										 |  |  | 
 | 
					
						
							|  |  |  | enum class ValueID { | 
					
						
							|  |  |  |     Invalid, | 
					
						
							|  |  |  |     VendorSpecificLink, | 
					
						
							| 
									
										
										
										
											2020-05-25 14:54:27 -04:00
										 |  |  |     VendorSpecificPaletteDesktopBackground, | 
					
						
							|  |  |  |     VendorSpecificPaletteActiveWindowBorder1, | 
					
						
							|  |  |  |     VendorSpecificPaletteActiveWindowBorder2, | 
					
						
							|  |  |  |     VendorSpecificPaletteActiveWindowTitle, | 
					
						
							|  |  |  |     VendorSpecificPaletteInactiveWindowBorder1, | 
					
						
							|  |  |  |     VendorSpecificPaletteInactiveWindowBorder2, | 
					
						
							|  |  |  |     VendorSpecificPaletteInactiveWindowTitle, | 
					
						
							|  |  |  |     VendorSpecificPaletteMovingWindowBorder1, | 
					
						
							|  |  |  |     VendorSpecificPaletteMovingWindowBorder2, | 
					
						
							|  |  |  |     VendorSpecificPaletteMovingWindowTitle, | 
					
						
							|  |  |  |     VendorSpecificPaletteHighlightWindowBorder1, | 
					
						
							|  |  |  |     VendorSpecificPaletteHighlightWindowBorder2, | 
					
						
							|  |  |  |     VendorSpecificPaletteHighlightWindowTitle, | 
					
						
							|  |  |  |     VendorSpecificPaletteMenuStripe, | 
					
						
							|  |  |  |     VendorSpecificPaletteMenuBase, | 
					
						
							|  |  |  |     VendorSpecificPaletteMenuBaseText, | 
					
						
							|  |  |  |     VendorSpecificPaletteMenuSelection, | 
					
						
							|  |  |  |     VendorSpecificPaletteMenuSelectionText, | 
					
						
							|  |  |  |     VendorSpecificPaletteWindow, | 
					
						
							|  |  |  |     VendorSpecificPaletteWindowText, | 
					
						
							|  |  |  |     VendorSpecificPaletteButton, | 
					
						
							|  |  |  |     VendorSpecificPaletteButtonText, | 
					
						
							|  |  |  |     VendorSpecificPaletteBase, | 
					
						
							|  |  |  |     VendorSpecificPaletteBaseText, | 
					
						
							|  |  |  |     VendorSpecificPaletteThreedHighlight, | 
					
						
							|  |  |  |     VendorSpecificPaletteThreedShadow1, | 
					
						
							|  |  |  |     VendorSpecificPaletteThreedShadow2, | 
					
						
							|  |  |  |     VendorSpecificPaletteHoverHighlight, | 
					
						
							|  |  |  |     VendorSpecificPaletteSelection, | 
					
						
							|  |  |  |     VendorSpecificPaletteSelectionText, | 
					
						
							|  |  |  |     VendorSpecificPaletteInactiveSelection, | 
					
						
							|  |  |  |     VendorSpecificPaletteInactiveSelectionText, | 
					
						
							|  |  |  |     VendorSpecificPaletteRubberBandFill, | 
					
						
							|  |  |  |     VendorSpecificPaletteRubberBandBorder, | 
					
						
							|  |  |  |     VendorSpecificPaletteLink, | 
					
						
							|  |  |  |     VendorSpecificPaletteActiveLink, | 
					
						
							|  |  |  |     VendorSpecificPaletteVisitedLink, | 
					
						
							|  |  |  |     VendorSpecificPaletteRuler, | 
					
						
							|  |  |  |     VendorSpecificPaletteRulerBorder, | 
					
						
							|  |  |  |     VendorSpecificPaletteRulerActiveText, | 
					
						
							|  |  |  |     VendorSpecificPaletteRulerInactiveText, | 
					
						
							|  |  |  |     VendorSpecificPaletteTextCursor, | 
					
						
							|  |  |  |     VendorSpecificPaletteFocusOutline, | 
					
						
							|  |  |  |     VendorSpecificPaletteSyntaxComment, | 
					
						
							|  |  |  |     VendorSpecificPaletteSyntaxNumber, | 
					
						
							|  |  |  |     VendorSpecificPaletteSyntaxString, | 
					
						
							|  |  |  |     VendorSpecificPaletteSyntaxType, | 
					
						
							|  |  |  |     VendorSpecificPaletteSyntaxPunctuation, | 
					
						
							|  |  |  |     VendorSpecificPaletteSyntaxOperator, | 
					
						
							|  |  |  |     VendorSpecificPaletteSyntaxKeyword, | 
					
						
							|  |  |  |     VendorSpecificPaletteSyntaxControlKeyword, | 
					
						
							|  |  |  |     VendorSpecificPaletteSyntaxIdentifier, | 
					
						
							|  |  |  |     VendorSpecificPaletteSyntaxPreprocessorStatement, | 
					
						
							|  |  |  |     VendorSpecificPaletteSyntaxPreprocessorValue, | 
					
						
							| 
									
										
										
										
											2019-10-16 20:32:17 +02:00
										 |  |  |     Center, | 
					
						
							|  |  |  |     Left, | 
					
						
							|  |  |  |     Right, | 
					
						
							| 
									
										
										
										
											2019-10-20 12:30:25 +02:00
										 |  |  |     Justify, | 
					
						
							| 
									
										
										
										
											2020-06-13 10:54:58 +02:00
										 |  |  |     VendorSpecificCenter, | 
					
						
							| 
									
										
										
										
											2020-12-14 15:56:01 +01:00
										 |  |  |     Bold, | 
					
						
							|  |  |  |     Bolder, | 
					
						
							|  |  |  |     Large, | 
					
						
							|  |  |  |     Larger, | 
					
						
							|  |  |  |     Lighter, | 
					
						
							|  |  |  |     Medium, | 
					
						
							|  |  |  |     Normal, | 
					
						
							|  |  |  |     Small, | 
					
						
							|  |  |  |     Smaller, | 
					
						
							|  |  |  |     XLarge, | 
					
						
							|  |  |  |     XSmall, | 
					
						
							|  |  |  |     XxLarge, | 
					
						
							|  |  |  |     XxSmall, | 
					
						
							|  |  |  |     XxxLarge, | 
					
						
							| 
									
										
										
										
											2020-12-14 18:47:00 +01:00
										 |  |  |     Static, | 
					
						
							|  |  |  |     Relative, | 
					
						
							|  |  |  |     Absolute, | 
					
						
							|  |  |  |     Fixed, | 
					
						
							|  |  |  |     Sticky, | 
					
						
							| 
									
										
										
										
											2020-12-14 22:22:35 +01:00
										 |  |  |     Both, | 
					
						
							|  |  |  |     None, | 
					
						
							|  |  |  |     Hidden, | 
					
						
							|  |  |  |     Dotted, | 
					
						
							|  |  |  |     Dashed, | 
					
						
							|  |  |  |     Solid, | 
					
						
							|  |  |  |     Double, | 
					
						
							|  |  |  |     Groove, | 
					
						
							|  |  |  |     Ridge, | 
					
						
							|  |  |  |     Inset, | 
					
						
							|  |  |  |     Outset, | 
					
						
							|  |  |  |     Nowrap, | 
					
						
							|  |  |  |     Pre, | 
					
						
							|  |  |  |     PreLine, | 
					
						
							|  |  |  |     PreWrap, | 
					
						
							|  |  |  |     Block, | 
					
						
							|  |  |  |     Inline, | 
					
						
							|  |  |  |     InlineBlock, | 
					
						
							|  |  |  |     ListItem, | 
					
						
							|  |  |  |     Table, | 
					
						
							|  |  |  |     TableRow, | 
					
						
							|  |  |  |     TableCell, | 
					
						
							|  |  |  |     TableHeaderGroup, | 
					
						
							|  |  |  |     TableRowGroup, | 
					
						
							|  |  |  |     TableFooterGroup, | 
					
						
							| 
									
										
										
										
											2020-12-15 13:36:27 +01:00
										 |  |  |     Underline, | 
					
						
							|  |  |  |     Overline, | 
					
						
							|  |  |  |     LineThrough, | 
					
						
							|  |  |  |     Blink, | 
					
						
							| 
									
										
										
										
											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, | 
					
						
							|  |  |  |     VendorSpecificCenter, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-15 13:36:27 +01:00
										 |  |  | enum class TextDecorationLine { | 
					
						
							|  |  |  |     None, | 
					
						
							|  |  |  |     Underline, | 
					
						
							|  |  |  |     Overline, | 
					
						
							|  |  |  |     LineThrough, | 
					
						
							|  |  |  |     Blink, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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, | 
					
						
							| 
									
										
										
										
											2020-06-24 16:22:16 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-04 16:11:55 +01:00
										 |  |  | enum class LineStyle { | 
					
						
							|  |  |  |     None, | 
					
						
							|  |  |  |     Hidden, | 
					
						
							|  |  |  |     Dotted, | 
					
						
							|  |  |  |     Dashed, | 
					
						
							|  |  |  |     Solid, | 
					
						
							|  |  |  |     Double, | 
					
						
							|  |  |  |     Groove, | 
					
						
							|  |  |  |     Ridge, | 
					
						
							|  |  |  |     Inset, | 
					
						
							|  |  |  |     Outset, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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, | 
					
						
							| 
									
										
										
										
											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; } | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-07-04 15:49:16 +02:00
										 |  |  |         return adopt(*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
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-07-04 15:49:16 +02:00
										 |  |  |         return adopt(*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(); } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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: | 
					
						
							|  |  |  |     static NonnullRefPtr<InitialStyleValue> create() { return adopt(*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: | 
					
						
							|  |  |  |     static NonnullRefPtr<InheritStyleValue> create() { return adopt(*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) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return adopt(*new ColorStyleValue(color)); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							|  |  |  | 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) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return adopt(*new IdentifierStyleValue(id)); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											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: | 
					
						
							| 
									
										
										
										
											2020-07-26 19:37:56 +02:00
										 |  |  |     static NonnullRefPtr<ImageStyleValue> create(const URL& url, DOM::Document& document) { return adopt(*new ImageStyleValue(url, document)); } | 
					
						
							| 
									
										
										
										
											2020-06-02 13:51:30 +02:00
										 |  |  |     virtual ~ImageStyleValue() override { } | 
					
						
							| 
									
										
										
										
											2019-10-19 11:49:46 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     String to_string() const override { return String::format("Image{%s}", m_url.to_string().characters()); } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | } |