servo: Merge #7592 - Introduce NonElementParentNode (from nox:nonelementparentnode); r=jdm

This is the interface where Document.getElementById() belong.

Source-Repo: https://github.com/servo/servo
Source-Revision: 4c64c870c63bc41728ccd371e19fc4246427aa2c
This commit is contained in:
Anthony Ramine 2015-09-10 07:29:47 -06:00
parent 54e55fc66f
commit 6d6557091f
4 changed files with 27 additions and 1 deletions

View File

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

View File

@ -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" };

View File

@ -8,4 +8,5 @@
interface DocumentFragment : Node {
};
DocumentFragment implements NonElementParentNode;
DocumentFragment implements ParentNode;

View File

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