mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 21:52:45 +00:00 
			
		
		
		
	LibWeb: Pass scope in ParentNode::query_selector
This commit is contained in:
		
							parent
							
								
									f3ba44a9f2
								
							
						
					
					
						commit
						4e6fb65ea3
					
				
					 1 changed files with 11 additions and 1 deletions
				
			
		|  | @ -17,19 +17,29 @@ | |||
| 
 | ||||
| namespace Web::DOM { | ||||
| 
 | ||||
| // https://dom.spec.whatwg.org/#dom-parentnode-queryselector
 | ||||
| WebIDL::ExceptionOr<JS::GCPtr<Element>> ParentNode::query_selector(StringView selector_text) | ||||
| { | ||||
|     // The querySelector(selectors) method steps are to return the first result of running scope-match a selectors string selectors against this,
 | ||||
|     // if the result is not an empty list; otherwise null.
 | ||||
| 
 | ||||
|     // https://dom.spec.whatwg.org/#scope-match-a-selectors-string
 | ||||
|     // To scope-match a selectors string selectors against a node, run these steps:
 | ||||
|     // 1. Let s be the result of parse a selector selectors.
 | ||||
|     auto maybe_selectors = parse_selector(CSS::Parser::ParsingContext(*this), selector_text); | ||||
| 
 | ||||
|     // 2. If s is failure, then throw a "SyntaxError" DOMException.
 | ||||
|     if (!maybe_selectors.has_value()) | ||||
|         return WebIDL::SyntaxError::create(realm(), "Failed to parse selector"); | ||||
| 
 | ||||
|     auto selectors = maybe_selectors.value(); | ||||
| 
 | ||||
|     // 3. Return the result of match a selector against a tree with s and node’s root using scoping root node.
 | ||||
|     JS::GCPtr<Element> result; | ||||
|     // FIXME: This should be shadow-including. https://drafts.csswg.org/selectors-4/#match-a-selector-against-a-tree
 | ||||
|     for_each_in_subtree_of_type<Element>([&](auto& element) { | ||||
|         for (auto& selector : selectors) { | ||||
|             if (SelectorEngine::matches(selector, element)) { | ||||
|             if (SelectorEngine::matches(selector, element, {}, this)) { | ||||
|                 result = &element; | ||||
|                 return IterationDecision::Break; | ||||
|             } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Simon Wanner
						Simon Wanner