diff options
author | Xidorn Quan <me@upsuper.org> | 2017-10-09 21:47:02 +1100 |
---|---|---|
committer | Xidorn Quan <me@upsuper.org> | 2017-10-09 22:13:00 +1100 |
commit | 0564a1e47b7639ed759d98f31337a3f63db8ffea (patch) | |
tree | ef46550b3cc294dd99aaf97f867d0dbb9e9e73f6 /components/script/dom | |
parent | ba44d18ddbe03fb7e230027d189d3d441d8ae028 (diff) | |
download | servo-0564a1e47b7639ed759d98f31337a3f63db8ffea.tar.gz servo-0564a1e47b7639ed759d98f31337a3f63db8ffea.zip |
Support :scope pseudo-class in Element::{matches,closest} in Servo
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/element.rs | 9 |
1 files 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::<Node>(); for element in root.inclusive_ancestors() { if let Some(element) = DomRoot::downcast::<Element>(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<Element> { +impl<'a> SelectorsElement for DomRoot<Element> { type Impl = SelectorImpl; fn opaque(&self) -> ::selectors::OpaqueElement { |