mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 00:42:44 +00:00 
			
		
		
		
	LibWeb: Implement ImageStyleValue parsing
Later we will want to make a distinction between URL and Image values, but this works for now.
This commit is contained in:
		
							parent
							
								
									82f3228dd2
								
							
						
					
					
						commit
						6e08b200d4
					
				
					 3 changed files with 36 additions and 6 deletions
				
			
		|  | @ -34,12 +34,12 @@ ParsingContext::ParsingContext() | |||
| { | ||||
| } | ||||
| 
 | ||||
| ParsingContext::ParsingContext(DOM::Document const& document) | ||||
| ParsingContext::ParsingContext(DOM::Document& document) | ||||
|     : m_document(&document) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| ParsingContext::ParsingContext(DOM::ParentNode const& parent_node) | ||||
| ParsingContext::ParsingContext(DOM::ParentNode& parent_node) | ||||
|     : m_document(&parent_node.document()) | ||||
| { | ||||
| } | ||||
|  | @ -1589,6 +1589,26 @@ RefPtr<StyleValue> Parser::parse_string_value(ParsingContext const&, StyleCompon | |||
|     return {}; | ||||
| } | ||||
| 
 | ||||
| RefPtr<StyleValue> Parser::parse_image_value(ParsingContext const& context, StyleComponentValueRule const& component_value) | ||||
| { | ||||
|     if (component_value.is(Token::Type::Url)) | ||||
|         return ImageStyleValue::create(context.complete_url(component_value.token().url()), *context.document()); | ||||
|     if (component_value.is_function() && component_value.function().name().equals_ignoring_case("url")) { | ||||
|         auto& function_values = component_value.function().values(); | ||||
|         // FIXME: Handle url-modifiers. https://www.w3.org/TR/css-values-4/#url-modifiers
 | ||||
|         for (size_t i = 0; i < function_values.size(); ++i) { | ||||
|             auto& value = function_values[i]; | ||||
|             if (value.is(Token::Type::Whitespace)) | ||||
|                 continue; | ||||
|             if (value.is(Token::Type::String)) | ||||
|                 return ImageStyleValue::create(context.complete_url(value.token().string()), *context.document()); | ||||
|         } | ||||
|     } | ||||
|     // FIXME: Handle gradients.
 | ||||
| 
 | ||||
|     return {}; | ||||
| } | ||||
| 
 | ||||
| RefPtr<StyleValue> Parser::parse_css_value(PropertyID property_id, TokenStream<StyleComponentValueRule>& tokens) | ||||
| { | ||||
|     dbgln_if(CSS_PARSER_TRACE, "Parser::parse_css_value"); | ||||
|  | @ -1653,6 +1673,9 @@ RefPtr<StyleValue> Parser::parse_css_value(ParsingContext const& context, Proper | |||
|     if (auto string = parse_string_value(context, component_value)) | ||||
|         return string; | ||||
| 
 | ||||
|     if (auto image = parse_image_value(context, component_value)) | ||||
|         return image; | ||||
| 
 | ||||
|     return {}; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -32,15 +32,15 @@ enum class PropertyID; | |||
| class ParsingContext { | ||||
| public: | ||||
|     ParsingContext(); | ||||
|     explicit ParsingContext(DOM::Document const&); | ||||
|     explicit ParsingContext(DOM::ParentNode const&); | ||||
|     explicit ParsingContext(DOM::Document&); | ||||
|     explicit ParsingContext(DOM::ParentNode&); | ||||
| 
 | ||||
|     bool in_quirks_mode() const; | ||||
| 
 | ||||
|     DOM::Document* document() const { return m_document; } | ||||
|     URL complete_url(String const&) const; | ||||
| 
 | ||||
| private: | ||||
|     const DOM::Document* m_document { nullptr }; | ||||
|     DOM::Document* m_document { nullptr }; | ||||
| }; | ||||
| 
 | ||||
| template<typename T> | ||||
|  | @ -174,6 +174,7 @@ private: | |||
|     static RefPtr<StyleValue> parse_identifier_value(ParsingContext const&, StyleComponentValueRule const&); | ||||
|     static RefPtr<StyleValue> parse_color_value(ParsingContext const&, StyleComponentValueRule const&); | ||||
|     static RefPtr<StyleValue> parse_string_value(ParsingContext const&, StyleComponentValueRule const&); | ||||
|     static RefPtr<StyleValue> parse_image_value(ParsingContext const&, StyleComponentValueRule const&); | ||||
| 
 | ||||
|     ParsingContext m_context; | ||||
| 
 | ||||
|  |  | |||
|  | @ -76,6 +76,12 @@ public: | |||
|         return m_value.string_view(); | ||||
|     } | ||||
| 
 | ||||
|     StringView url() const | ||||
|     { | ||||
|         VERIFY(m_type == Type::Url); | ||||
|         return m_value.string_view(); | ||||
|     } | ||||
| 
 | ||||
|     bool is(NumberType number_type) const { return is(Token::Type::Number) && m_number_type == number_type; } | ||||
| 
 | ||||
|     int integer() const | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Sam Atkins
						Sam Atkins