Implement Element.matches().

This commit is contained in:
Tetsuharu OHZEKI 2014-07-05 21:33:09 +09:00
parent 0974d21bcd
commit b6edd5318f
4 changed files with 51 additions and 0 deletions

View file

@ -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) {

View file

@ -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,

View file

@ -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);

View file

@ -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>