aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorXidorn Quan <me@upsuper.org>2017-10-09 21:47:02 +1100
committerXidorn Quan <me@upsuper.org>2017-10-09 22:13:00 +1100
commit0564a1e47b7639ed759d98f31337a3f63db8ffea (patch)
treeef46550b3cc294dd99aaf97f867d0dbb9e9e73f6 /components/script/dom
parentba44d18ddbe03fb7e230027d189d3d441d8ae028 (diff)
downloadservo-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.rs9
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 {