diff --git a/components/script/dom/documentfragment.rs b/components/script/dom/documentfragment.rs index 2f0ccecda5cd..3eac9df6bac5 100644 --- a/components/script/dom/documentfragment.rs +++ b/components/script/dom/documentfragment.rs @@ -17,6 +17,7 @@ use dom::eventtarget::{EventTarget, EventTargetTypeId}; use dom::htmlcollection::HTMLCollection; use dom::node::{Node, NodeTypeId, window_from_node}; use dom::nodelist::NodeList; +use string_cache::Atom; use util::str::DOMString; // https://dom.spec.whatwg.org/#documentfragment @@ -58,6 +59,18 @@ impl DocumentFragmentMethods for DocumentFragment { HTMLCollection::children(window.r(), NodeCast::from_ref(self)) } + // https://dom.spec.whatwg.org/#dom-nonelementparentnode-getelementbyid + fn GetElementById(&self, id: DOMString) -> Option> { + let node = NodeCast::from_ref(self); + let id = Atom::from_slice(&id); + node.traverse_preorder().filter_map(ElementCast::to_root).find(|descendant| { + match descendant.get_attribute(&ns!(""), &atom!(id)) { + None => false, + Some(attr) => *attr.value().as_atom() == id, + } + }) + } + // https://dom.spec.whatwg.org/#dom-parentnode-firstelementchild fn GetFirstElementChild(&self) -> Option> { NodeCast::from_ref(self).child_elements().next() diff --git a/components/script/dom/webidls/Document.webidl b/components/script/dom/webidls/Document.webidl index 203e8d00d1c7..fa69f6f95f7d 100644 --- a/components/script/dom/webidls/Document.webidl +++ b/components/script/dom/webidls/Document.webidl @@ -26,7 +26,6 @@ interface Document : Node { HTMLCollection getElementsByTagName(DOMString localName); HTMLCollection getElementsByTagNameNS(DOMString? namespace, DOMString localName); HTMLCollection getElementsByClassName(DOMString classNames); - Element? getElementById(DOMString elementId); [NewObject, Throws] Element createElement(DOMString localName); @@ -65,6 +64,8 @@ interface Document : Node { TreeWalker createTreeWalker(Node root, optional unsigned long whatToShow = 0xFFFFFFFF, optional NodeFilter? filter = null); }; + +Document implements NonElementParentNode; Document implements ParentNode; enum DocumentReadyState { "loading", "interactive", "complete" }; diff --git a/components/script/dom/webidls/DocumentFragment.webidl b/components/script/dom/webidls/DocumentFragment.webidl index 7dfbcc573df2..eb2b7d6696d5 100644 --- a/components/script/dom/webidls/DocumentFragment.webidl +++ b/components/script/dom/webidls/DocumentFragment.webidl @@ -8,4 +8,5 @@ interface DocumentFragment : Node { }; +DocumentFragment implements NonElementParentNode; DocumentFragment implements ParentNode; diff --git a/components/script/dom/webidls/NonElementParentNode.webidl b/components/script/dom/webidls/NonElementParentNode.webidl new file mode 100644 index 000000000000..b1bd854ab939 --- /dev/null +++ b/components/script/dom/webidls/NonElementParentNode.webidl @@ -0,0 +1,11 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// https://dom.spec.whatwg.org/#nonelementparentnode +[NoInterfaceObject, + Exposed=Window] +interface NonElementParentNode { + Element? getElementById(DOMString elementId); +}; diff --git a/tests/wpt/metadata/dom/interfaces.html.ini b/tests/wpt/metadata/dom/interfaces.html.ini index 80f86855f935..cd3e7f910bb8 100644 --- a/tests/wpt/metadata/dom/interfaces.html.ini +++ b/tests/wpt/metadata/dom/interfaces.html.ini @@ -123,21 +123,12 @@ [DocumentFragment interface: existence and properties of interface object] expected: FAIL - [DocumentFragment interface: operation getElementById(DOMString)] - expected: FAIL - [DocumentFragment interface: operation query(DOMString)] expected: FAIL [DocumentFragment interface: operation queryAll(DOMString)] expected: FAIL - [DocumentFragment interface: document.createDocumentFragment() must inherit property "getElementById" with the proper type (0)] - expected: FAIL - - [DocumentFragment interface: calling getElementById(DOMString) on document.createDocumentFragment() with too few arguments must throw TypeError] - expected: FAIL - [DocumentFragment interface: document.createDocumentFragment() must inherit property "query" with the proper type (7)] expected: FAIL