mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 17:52:45 +00:00 
			
		
		
		
	LibHTML: Add Document::get_element_by_id() and get_elements_by_name()
These will be useful for implementing various things. They don't do any caching at the moment, but that might become valuable in the future. To facilitate this change, I also made it possible to abort a tree walk with for_each_in_subtree() by returning IterationDecision::Break from the callback.
This commit is contained in:
		
							parent
							
								
									465a33443c
								
							
						
					
					
						commit
						4d9740ecef
					
				
					 5 changed files with 57 additions and 11 deletions
				
			
		|  | @ -193,9 +193,9 @@ void Document::layout() | |||
| void Document::update_style() | ||||
| { | ||||
|     for_each_in_subtree([&](Node& node) { | ||||
|         if (!node.needs_style_update()) | ||||
|             return; | ||||
|         to<Element>(node).recompute_style(); | ||||
|         if (node.needs_style_update()) | ||||
|             to<Element>(node).recompute_style(); | ||||
|         return IterationDecision::Continue; | ||||
|     }); | ||||
|     update_layout(); | ||||
| } | ||||
|  | @ -242,3 +242,27 @@ void Document::set_hovered_node(Node* node) | |||
| 
 | ||||
|     invalidate_style(); | ||||
| } | ||||
| 
 | ||||
| const Element* Document::get_element_by_id(const String& id) const | ||||
| { | ||||
|     const Element* element = nullptr; | ||||
|     for_each_in_subtree([&](auto& node) { | ||||
|         if (is<Element>(node) && to<Element>(node).attribute("id") == id) { | ||||
|             element = &to<Element>(node); | ||||
|             return IterationDecision::Break; | ||||
|         } | ||||
|         return IterationDecision::Continue; | ||||
|     }); | ||||
|     return element; | ||||
| } | ||||
| 
 | ||||
| Vector<const Element*> Document::get_elements_by_name(const String& name) const | ||||
| { | ||||
|     Vector<const Element*> elements; | ||||
|     for_each_in_subtree([&](auto& node) { | ||||
|         if (is<Element>(node) && to<Element>(node).attribute("name") == name) | ||||
|             elements.append(&to<Element>(node)); | ||||
|         return IterationDecision::Continue; | ||||
|     }); | ||||
|     return elements; | ||||
| } | ||||
|  |  | |||
|  | @ -80,6 +80,9 @@ public: | |||
| 
 | ||||
|     void schedule_style_update(); | ||||
| 
 | ||||
|     const Element* get_element_by_id(const String&) const; | ||||
|     Vector<const Element*> get_elements_by_name(const String&) const; | ||||
| 
 | ||||
| private: | ||||
|     virtual RefPtr<LayoutNode> create_layout_node(const StyleProperties* parent_style) const override; | ||||
| 
 | ||||
|  |  | |||
|  | @ -77,6 +77,7 @@ void Node::invalidate_style() | |||
|     for_each_in_subtree([&](auto& node) { | ||||
|         if (is<Element>(node)) | ||||
|             node.set_needs_style_update(true); | ||||
|         return IterationDecision::Continue; | ||||
|     }); | ||||
|     document().schedule_style_update(); | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling