diff options
author | bors-servo <metajack+bors@gmail.com> | 2014-10-03 03:48:25 -0600 |
---|---|---|
committer | bors-servo <metajack+bors@gmail.com> | 2014-10-03 03:48:25 -0600 |
commit | a2531cd8aa0463e0941229b2f89f1433ad5b5e5e (patch) | |
tree | f422436d65bd7069ab2cda62b1d678253956425f | |
parent | 76d1d78cc0e08185f372a53e0cb2ce9e46213c31 (diff) | |
parent | 75ee535e3cc066d2128947cce6889eb16e1abb05 (diff) | |
download | servo-a2531cd8aa0463e0941229b2f89f1433ad5b5e5e.tar.gz servo-a2531cd8aa0463e0941229b2f89f1433ad5b5e5e.zip |
auto merge of #3562 : Ms2ger/servo/cleanup-fragment-node, r=jdm
-rw-r--r-- | components/script/dom/document.rs | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 9a547c98efd..9ccea6cf84c 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -12,7 +12,7 @@ use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use dom::bindings::codegen::InheritTypes::{DocumentDerived, EventCast, HTMLElementCast}; use dom::bindings::codegen::InheritTypes::{HTMLHeadElementCast, TextCast, ElementCast}; use dom::bindings::codegen::InheritTypes::{DocumentTypeCast, HTMLHtmlElementCast, NodeCast}; -use dom::bindings::codegen::InheritTypes::EventTargetCast; +use dom::bindings::codegen::InheritTypes::{EventTargetCast, HTMLAnchorElementCast}; use dom::bindings::codegen::InheritTypes::{HTMLAnchorElementDerived, HTMLAppletElementDerived}; use dom::bindings::codegen::InheritTypes::{HTMLAreaElementDerived, HTMLEmbedElementDerived}; use dom::bindings::codegen::InheritTypes::{HTMLFormElementDerived, HTMLImageElementDerived}; @@ -36,6 +36,7 @@ use dom::element::{HTMLHtmlElementTypeId, HTMLHeadElementTypeId, HTMLTitleElemen use dom::element::{HTMLBodyElementTypeId, HTMLFrameSetElementTypeId}; use dom::event::Event; use dom::eventtarget::{EventTarget, NodeTargetTypeId, EventTargetHelpers}; +use dom::htmlanchorelement::HTMLAnchorElement; use dom::htmlcollection::{HTMLCollection, CollectionFilter}; use dom::htmlelement::HTMLElement; use dom::htmlheadelement::HTMLHeadElement; @@ -279,21 +280,21 @@ impl<'a> DocumentHelpers<'a> for JSRef<'a, Document> { } /// Attempt to find a named element in this page's document. + /// https://html.spec.whatwg.org/multipage/#the-indicated-part-of-the-document fn find_fragment_node(self, fragid: DOMString) -> Option<Temporary<Element>> { - match self.GetElementById(fragid.clone()) { - Some(node) => Some(node), - None => { - let doc_node: JSRef<Node> = NodeCast::from_ref(self); - let mut anchors = doc_node.traverse_preorder() - .filter(|node| node.is_anchor_element()); - anchors.find(|node| { - let elem: JSRef<Element> = ElementCast::to_ref(*node).unwrap(); - elem.get_attribute(ns!(""), "name").root().map_or(false, |attr| { - attr.deref().value().as_slice() == fragid.as_slice() - }) - }).map(|node| Temporary::from_rooted(ElementCast::to_ref(node).unwrap())) - } - } + self.GetElementById(fragid.clone()).or_else(|| { + let check_anchor = |&node: &JSRef<HTMLAnchorElement>| { + let elem: JSRef<Element> = ElementCast::from_ref(node); + elem.get_attribute(ns!(""), "name").root().map_or(false, |attr| { + attr.deref().value().as_slice() == fragid.as_slice() + }) + }; + let doc_node: JSRef<Node> = NodeCast::from_ref(self); + doc_node.traverse_preorder() + .filter_map(|node| HTMLAnchorElementCast::to_ref(node)) + .find(check_anchor) + .map(|node| Temporary::from_rooted(ElementCast::from_ref(node))) + }) } } |