aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/script/dom/documentfragment.rs13
-rw-r--r--components/script/dom/webidls/Document.webidl3
-rw-r--r--components/script/dom/webidls/DocumentFragment.webidl1
-rw-r--r--components/script/dom/webidls/NonElementParentNode.webidl11
-rw-r--r--tests/wpt/metadata/dom/interfaces.html.ini9
5 files changed, 27 insertions, 10 deletions
diff --git a/components/script/dom/documentfragment.rs b/components/script/dom/documentfragment.rs
index 2f0ccecda5c..3eac9df6bac 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<Root<Element>> {
+ 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<Root<Element>> {
NodeCast::from_ref(self).child_elements().next()
diff --git a/components/script/dom/webidls/Document.webidl b/components/script/dom/webidls/Document.webidl
index 203e8d00d1c..fa69f6f95f7 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 7dfbcc573df..eb2b7d6696d 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 00000000000..b1bd854ab93
--- /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 80f86855f93..cd3e7f910bb 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