diff --git a/components/script/dom/namednodemap.rs b/components/script/dom/namednodemap.rs index bfa8f1652f1..239fff86fbb 100644 --- a/components/script/dom/namednodemap.rs +++ b/components/script/dom/namednodemap.rs @@ -8,8 +8,12 @@ use dom::bindings::codegen::Bindings::NamedNodeMapBinding::NamedNodeMapMethods; use dom::bindings::global::GlobalRef; use dom::bindings::js::{JS, JSRef, Temporary}; use dom::bindings::utils::{Reflector, reflect_dom_object}; -use dom::element::{Element, ElementHelpers}; +use dom::element::{AttributeHandlers, Element, ElementHelpers}; use dom::window::Window; +use util::namespace; +use util::str::DOMString; + +use string_cache::Atom; #[dom_struct] pub struct NamedNodeMap { @@ -32,6 +36,7 @@ impl NamedNodeMap { } impl<'a> NamedNodeMapMethods for JSRef<'a, NamedNodeMap> { + // https://dom.spec.whatwg.org/#dom-namednodemap-length fn Length(self) -> u32 { let owner = self.owner.root(); // FIXME(https://github.com/rust-lang/rust/issues/23338) @@ -40,6 +45,7 @@ impl<'a> NamedNodeMapMethods for JSRef<'a, NamedNodeMap> { attrs.len() as u32 } + // https://dom.spec.whatwg.org/#dom-namednodemap-item fn Item(self, index: u32) -> Option> { let owner = self.owner.root(); // FIXME(https://github.com/rust-lang/rust/issues/23338) @@ -48,10 +54,34 @@ impl<'a> NamedNodeMapMethods for JSRef<'a, NamedNodeMap> { attrs.as_slice().get(index as usize).map(|x| Temporary::new(x.clone())) } + // https://dom.spec.whatwg.org/#dom-namednodemap-getnameditem + fn GetNamedItem(self, name: DOMString) -> Option> { + let owner = self.owner.root(); + // FIXME(https://github.com/rust-lang/rust/issues/23338) + let owner = owner.r(); + let name = owner.parsed_name(name); + owner.get_attribute_by_name(&Atom::from_slice(&name)) + } + + // https://dom.spec.whatwg.org/#dom-namednodemap-getnameditemns + fn GetNamedItemNS(self, namespace: Option, name: DOMString) -> Option> { + let owner = self.owner.root(); + // FIXME(https://github.com/rust-lang/rust/issues/23338) + let owner = owner.r(); + let ns = namespace::from_domstring(namespace); + owner.get_attribute(&ns, &Atom::from_slice(&name)) + } + fn IndexedGetter(self, index: u32, found: &mut bool) -> Option> { let item = self.Item(index); *found = item.is_some(); item } + + fn NamedGetter(self, name: DOMString, found: &mut bool) -> Option> { + let item = self.GetNamedItem(name); + *found = item.is_some(); + item + } } diff --git a/components/script/dom/webidls/NamedNodeMap.webidl b/components/script/dom/webidls/NamedNodeMap.webidl index 9279af57de5..f15151b8ce9 100644 --- a/components/script/dom/webidls/NamedNodeMap.webidl +++ b/components/script/dom/webidls/NamedNodeMap.webidl @@ -5,8 +5,8 @@ interface NamedNodeMap { readonly attribute unsigned long length; getter Attr? item(unsigned long index); - //getter Attr? getNamedItem(DOMString name); - //Attr? getNamedItemNS(DOMString? namespace, DOMString localName); + getter Attr? getNamedItem(DOMString name); + Attr? getNamedItemNS(DOMString? namespace, DOMString localName); //[Throws] //Attr? setNamedItem(Attr attr); //[Throws] diff --git a/tests/wpt/metadata/dom/interfaces.html.ini b/tests/wpt/metadata/dom/interfaces.html.ini index 5c7e946e5d1..c3913ed9046 100644 --- a/tests/wpt/metadata/dom/interfaces.html.ini +++ b/tests/wpt/metadata/dom/interfaces.html.ini @@ -384,12 +384,6 @@ [Element interface: calling after([object Object\],[object Object\]) on element with too few arguments must throw TypeError] expected: FAIL - [NamedNodeMap interface: operation getNamedItem(DOMString)] - expected: FAIL - - [NamedNodeMap interface: operation getNamedItemNS(DOMString,DOMString)] - expected: FAIL - [NamedNodeMap interface: operation setNamedItem(Attr)] expected: FAIL