From c96018152f71384ff4e061eaf1e22db7f7c0fd71 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Thu, 2 Oct 2014 19:53:28 +0200 Subject: [PATCH 1/2] Cleanup Document.find_fragment_node. --- components/script/dom/document.rs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 9a547c98efd..f80486ba6e0 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,19 +280,22 @@ 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> { match self.GetElementById(fragid.clone()) { Some(node) => Some(node), None => { - let doc_node: JSRef = NodeCast::from_ref(self); - let mut anchors = doc_node.traverse_preorder() - .filter(|node| node.is_anchor_element()); - anchors.find(|node| { - let elem: JSRef = ElementCast::to_ref(*node).unwrap(); + let check_anchor = |&node: &JSRef| { + let elem: JSRef = ElementCast::from_ref(node); 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())) + }; + let doc_node: JSRef = 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))) } } } From 75ee535e3cc066d2128947cce6889eb16e1abb05 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Fri, 3 Oct 2014 09:20:54 +0200 Subject: [PATCH 2/2] Use or_else in Document.find_fragment_node. --- components/script/dom/document.rs | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index f80486ba6e0..9ccea6cf84c 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -282,22 +282,19 @@ 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> { - match self.GetElementById(fragid.clone()) { - Some(node) => Some(node), - None => { - let check_anchor = |&node: &JSRef| { - let elem: JSRef = 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 = 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))) - } - } + self.GetElementById(fragid.clone()).or_else(|| { + let check_anchor = |&node: &JSRef| { + let elem: JSRef = 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 = 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))) + }) } }