aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom')
-rw-r--r--components/script/dom/element.rs17
-rw-r--r--components/script/dom/node.rs7
-rw-r--r--components/script/dom/webidls/Element.webidl3
3 files changed, 27 insertions, 0 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs
index 129756c1575..14f48f5f3b6 100644
--- a/components/script/dom/element.rs
+++ b/components/script/dom/element.rs
@@ -1120,6 +1120,23 @@ impl<'a> ElementMethods for JSRef<'a, Element> {
}
}
}
+
+ // https://dom.spec.whatwg.org/#dom-element-closest
+ fn Closest(self, selectors: DOMString) -> Fallible<Option<Temporary<Element>>> {
+ let parser_context = ParserContext {
+ origin: StylesheetOrigin::Author,
+ };
+ match style::parse_selector_list_from_str(&parser_context, selectors.as_slice()) {
+ Err(()) => Err(Syntax),
+ Ok(ref selectors) => {
+ let root: JSRef<Node> = NodeCast::from_ref(self);
+ Ok(root.inclusive_ancestors()
+ .filter_map(ElementCast::to_ref)
+ .find(|element| matches(selectors, &NodeCast::from_ref(*element), &mut None))
+ .map(Temporary::from_rooted))
+ }
+ }
+ }
}
pub fn get_attribute_parts<'a>(name: &'a str) -> (Option<&'a str>, &'a str) {
diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs
index bc44aeda8ba..fb336efd85b 100644
--- a/components/script/dom/node.rs
+++ b/components/script/dom/node.rs
@@ -397,6 +397,7 @@ impl<'a> Iterator<JSRef<'a, Node>> for QuerySelectorIterator<'a> {
pub trait NodeHelpers<'a> {
fn ancestors(self) -> AncestorIterator<'a>;
+ fn inclusive_ancestors(self) -> AncestorIterator<'a>;
fn children(self) -> NodeChildrenIterator<'a>;
fn rev_children(self) -> ReverseChildrenIterator;
fn child_elements(self) -> ChildElementIterator<'a>;
@@ -798,6 +799,12 @@ impl<'a> NodeHelpers<'a> for JSRef<'a, Node> {
}
}
+ fn inclusive_ancestors(self) -> AncestorIterator<'a> {
+ AncestorIterator {
+ current: Some(self.clone())
+ }
+ }
+
fn owner_doc(self) -> Temporary<Document> {
self.owner_doc.get().unwrap()
}
diff --git a/components/script/dom/webidls/Element.webidl b/components/script/dom/webidls/Element.webidl
index fc737bdb9ec..820d8b5b4f2 100644
--- a/components/script/dom/webidls/Element.webidl
+++ b/components/script/dom/webidls/Element.webidl
@@ -45,6 +45,9 @@ interface Element : Node {
boolean hasAttributeNS(DOMString? namespace, DOMString localName);
[Throws]
+ Element? closest(DOMString selectors);
+
+ [Throws]
boolean matches(DOMString selectors);
HTMLCollection getElementsByTagName(DOMString localName);