aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTetsuharu OHZEKI <saneyuki.snyk@gmail.com>2014-07-05 21:33:09 +0900
committerTetsuharu OHZEKI <saneyuki.snyk@gmail.com>2014-07-05 23:27:40 +0900
commitb6edd5318f3fe5c751d1c011e87adbfe0cac4fcc (patch)
treec662ecee7dcd33d7d59fa661c0a6f97dea03fdb4 /src
parent0974d21bcde4c7d2d546e5ba4586a05a137afa5b (diff)
downloadservo-b6edd5318f3fe5c751d1c011e87adbfe0cac4fcc.tar.gz
servo-b6edd5318f3fe5c751d1c011e87adbfe0cac4fcc.zip
Implement Element.matches().
Diffstat (limited to 'src')
-rw-r--r--src/components/script/dom/element.rs7
-rw-r--r--src/components/script/dom/node.rs23
-rw-r--r--src/components/script/dom/webidls/Element.webidl3
-rw-r--r--src/test/content/test_element_matches.html18
4 files changed, 51 insertions, 0 deletions
diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs
index e384ed02c1f..941bb637e9f 100644
--- a/src/components/script/dom/element.rs
+++ b/src/components/script/dom/element.rs
@@ -451,6 +451,7 @@ pub trait ElementMethods {
fn QuerySelector(&self, selectors: DOMString) -> Fallible<Option<Temporary<Element>>>;
fn QuerySelectorAll(&self, selectors: DOMString) -> Fallible<Temporary<NodeList>>;
fn Remove(&self);
+ fn Matches(&self, selectors: DOMString) -> Fallible<bool>;
}
impl<'a> ElementMethods for JSRef<'a, Element> {
@@ -757,6 +758,12 @@ impl<'a> ElementMethods for JSRef<'a, Element> {
let node: &JSRef<Node> = NodeCast::from_ref(self);
node.remove_self();
}
+
+ // http://dom.spec.whatwg.org/#dom-element-matches
+ fn Matches(&self, selectors: DOMString) -> Fallible<bool> {
+ let root: &JSRef<Node> = NodeCast::from_ref(self);
+ root.matches(selectors)
+ }
}
pub fn get_attribute_parts(name: DOMString) -> (Option<String>, String) {
diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs
index 9892f0b5f27..b7904dd9ca8 100644
--- a/src/components/script/dom/node.rs
+++ b/src/components/script/dom/node.rs
@@ -396,6 +396,7 @@ pub trait NodeHelpers {
fn query_selector_all(&self, selectors: DOMString) -> Fallible<Temporary<NodeList>>;
fn remove_self(&self);
+ fn matches(&self, selectors: DOMString) -> Fallible<bool>;
}
impl<'a> NodeHelpers for JSRef<'a, Node> {
@@ -648,6 +649,28 @@ impl<'a> NodeHelpers for JSRef<'a, Node> {
None => ()
}
}
+
+ // http://dom.spec.whatwg.org/#dom-element-matches
+ fn matches(&self, selectors: DOMString) -> Fallible<bool> {
+ assert!(self.is_element());
+ // Step 1.
+ let namespace = NamespaceMap::new();
+ match parse_selector_list(tokenize(selectors.as_slice()).map(|(token, _)| token).collect(), &namespace) {
+ // Step 2.
+ None => return Err(Syntax),
+ // Step 3.
+ Some(ref selectors) => {
+ for selector in selectors.iter() {
+ assert!(selector.pseudo_element.is_none());
+ let mut _shareable: bool = false;
+ if matches_compound_selector(selector.compound_selectors.deref(), self, &mut _shareable) {
+ return Ok(true);
+ }
+ }
+ }
+ }
+ Ok(false)
+ }
}
/// If the given untrusted node address represents a valid DOM node in the given runtime,
diff --git a/src/components/script/dom/webidls/Element.webidl b/src/components/script/dom/webidls/Element.webidl
index e088a2263dd..d7d3ad6da25 100644
--- a/src/components/script/dom/webidls/Element.webidl
+++ b/src/components/script/dom/webidls/Element.webidl
@@ -46,6 +46,9 @@ interface Element : Node {
boolean hasAttribute(DOMString name);
boolean hasAttributeNS(DOMString? namespace, DOMString localName);
+ [Throws]
+ boolean matches(DOMString selectors);
+
HTMLCollection getElementsByTagName(DOMString localName);
HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName);
HTMLCollection getElementsByClassName(DOMString classNames);
diff --git a/src/test/content/test_element_matches.html b/src/test/content/test_element_matches.html
new file mode 100644
index 00000000000..55f89d4a3fc
--- /dev/null
+++ b/src/test/content/test_element_matches.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="harness.js"></script>
+</head>
+<body>
+ <div id="foo"></div>
+
+ <script>
+ let test = document.getElementById("foo");
+
+ is(test.matches("#foo"), true, "test-1");
+ is(test.matches("#not-foo"), false, "test-2");
+
+ finish();
+ </script>
+</body>
+</html>