aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/document.rs
diff options
context:
space:
mode:
authorbors-servo <metajack+bors@gmail.com>2014-10-02 10:15:27 -0600
committerbors-servo <metajack+bors@gmail.com>2014-10-02 10:15:27 -0600
commit643a6d07a201d7db9325250522a80bc3357f11ce (patch)
tree3bdfe989302a383d50162117eec6e63db1b1d741 /components/script/dom/document.rs
parentadb428a725293fd639a0f188a32f3111ffca4d5b (diff)
parent4cc24e727b7ccbe2d15862b76476a3b0da8912c8 (diff)
downloadservo-643a6d07a201d7db9325250522a80bc3357f11ce.tar.gz
servo-643a6d07a201d7db9325250522a80bc3357f11ce.zip
auto merge of #3558 : Ms2ger/servo/fragment-node, r=jdm
Diffstat (limited to 'components/script/dom/document.rs')
-rw-r--r--components/script/dom/document.rs19
1 files changed, 19 insertions, 0 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs
index cccb2658d40..9a547c98efd 100644
--- a/components/script/dom/document.rs
+++ b/components/script/dom/document.rs
@@ -171,6 +171,7 @@ pub trait DocumentHelpers<'a> {
fn unregister_named_element(self, to_unregister: JSRef<Element>, id: Atom);
fn register_named_element(self, element: JSRef<Element>, id: Atom);
fn load_anchor_href(self, href: DOMString);
+ fn find_fragment_node(self, fragid: DOMString) -> Option<Temporary<Element>>;
}
impl<'a> DocumentHelpers<'a> for JSRef<'a, Document> {
@@ -276,6 +277,24 @@ impl<'a> DocumentHelpers<'a> for JSRef<'a, Document> {
let window = self.window.root();
window.load_url(href);
}
+
+ /// Attempt to find a named element in this page's 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()))
+ }
+ }
+ }
}
impl Document {