From 0564a1e47b7639ed759d98f31337a3f63db8ffea Mon Sep 17 00:00:00 2001 From: Xidorn Quan Date: Mon, 9 Oct 2017 21:47:02 +1100 Subject: [PATCH] Support :scope pseudo-class in Element::{matches,closest} in Servo --- components/script/dom/element.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 3e8dd5f95b3..4fe4f20531c 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -87,6 +87,7 @@ use net_traits::request::CorsSettings; use ref_filter_map::ref_filter_map; use script_layout_interface::message::ReflowGoal; use script_thread::ScriptThread; +use selectors::Element as SelectorsElement; use selectors::attr::{AttrSelectorOperation, NamespaceConstraint, CaseSensitivity}; use selectors::matching::{ElementSelectorFlags, LocalMatchingContext, MatchingContext, MatchingMode}; use selectors::matching::{HAS_EDGE_CHILD_SELECTOR, HAS_SLOW_SELECTOR, HAS_SLOW_SELECTOR_LATER_SIBLINGS}; @@ -2188,10 +2189,12 @@ impl ElementMethods for Element { Err(_) => Err(Error::Syntax), Ok(selectors) => { let quirks_mode = document_from_node(self).quirks_mode(); + let root = DomRoot::from_ref(self); // FIXME(bholley): Consider an nth-index cache here. let mut ctx = MatchingContext::new(MatchingMode::Normal, None, None, quirks_mode); - Ok(matches_selector_list(&selectors, &DomRoot::from_ref(self), &mut ctx)) + ctx.scope_element = Some(root.opaque()); + Ok(matches_selector_list(&selectors, &root, &mut ctx)) } } } @@ -2206,6 +2209,7 @@ impl ElementMethods for Element { match SelectorParser::parse_author_origin_no_namespace(&selectors) { Err(_) => Err(Error::Syntax), Ok(selectors) => { + let self_root = DomRoot::from_ref(self); let root = self.upcast::(); for element in root.inclusive_ancestors() { if let Some(element) = DomRoot::downcast::(element) { @@ -2213,6 +2217,7 @@ impl ElementMethods for Element { // FIXME(bholley): Consider an nth-index cache here. let mut ctx = MatchingContext::new(MatchingMode::Normal, None, None, quirks_mode); + ctx.scope_element = Some(self_root.opaque()); if matches_selector_list(&selectors, &element, &mut ctx) { return Ok(Some(element)); } @@ -2497,7 +2502,7 @@ impl VirtualMethods for Element { } } -impl<'a> ::selectors::Element for DomRoot { +impl<'a> SelectorsElement for DomRoot { type Impl = SelectorImpl; fn opaque(&self) -> ::selectors::OpaqueElement {