diff options
author | Tetsuharu OHZEKI <saneyuki.snyk@gmail.com> | 2014-07-05 21:33:09 +0900 |
---|---|---|
committer | Tetsuharu OHZEKI <saneyuki.snyk@gmail.com> | 2014-07-05 23:27:40 +0900 |
commit | b6edd5318f3fe5c751d1c011e87adbfe0cac4fcc (patch) | |
tree | c662ecee7dcd33d7d59fa661c0a6f97dea03fdb4 /src | |
parent | 0974d21bcde4c7d2d546e5ba4586a05a137afa5b (diff) | |
download | servo-b6edd5318f3fe5c751d1c011e87adbfe0cac4fcc.tar.gz servo-b6edd5318f3fe5c751d1c011e87adbfe0cac4fcc.zip |
Implement Element.matches().
Diffstat (limited to 'src')
-rw-r--r-- | src/components/script/dom/element.rs | 7 | ||||
-rw-r--r-- | src/components/script/dom/node.rs | 23 | ||||
-rw-r--r-- | src/components/script/dom/webidls/Element.webidl | 3 | ||||
-rw-r--r-- | src/test/content/test_element_matches.html | 18 |
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> |