From 8187916ee4228fd00a92fdac1f6ee96fea9395f1 Mon Sep 17 00:00:00 2001 From: Bruno de Oliveira Abinader Date: Mon, 2 Jun 2014 14:45:26 -0700 Subject: [PATCH] Implement TElement for JSRef --- src/components/script/dom/element.rs | 40 ++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index 66027956a65..2e300985eed 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -196,6 +196,8 @@ impl LayoutElementHelpers for JS { pub trait ElementHelpers { fn html_element_in_html_document(&self) -> bool; + fn get_local_name<'a>(&'a self) -> &'a str; + fn get_namespace<'a>(&'a self) -> &'a Namespace; } impl<'a> ElementHelpers for JSRef<'a, Element> { @@ -204,6 +206,14 @@ impl<'a> ElementHelpers for JSRef<'a, Element> { let node: &JSRef = NodeCast::from_ref(self); is_html && node.owner_doc().root().is_html_document } + + fn get_local_name<'a>(&'a self) -> &'a str { + self.deref().local_name.as_slice() + } + + fn get_namespace<'a>(&'a self) -> &'a Namespace { + &self.deref().namespace + } } pub trait AttributeHandlers { @@ -798,3 +808,33 @@ impl<'a> VirtualMethods for JSRef<'a, Element> { } } } + +impl<'a> style::TElement for JSRef<'a, Element> { + fn get_attr(&self, namespace: &Namespace, attr: &str) -> Option<&'static str> { + self.get_attribute(namespace.clone(), attr).root().map(|attr| { + unsafe { mem::transmute(attr.deref().value_ref()) } + }) + } + fn get_link(&self) -> Option<&'static str> { + // FIXME: This is HTML only. + let node: &JSRef = NodeCast::from_ref(self); + match node.type_id() { + // http://www.whatwg.org/specs/web-apps/current-work/multipage/selectors.html# + // selector-link + ElementNodeTypeId(HTMLAnchorElementTypeId) | + ElementNodeTypeId(HTMLAreaElementTypeId) | + ElementNodeTypeId(HTMLLinkElementTypeId) => self.get_attr(&namespace::Null, "href"), + _ => None, + } + } + fn get_local_name<'a>(&'a self) -> &'a str { + (self as &ElementHelpers).get_local_name() + } + fn get_namespace<'a>(&'a self) -> &'a Namespace { + (self as &ElementHelpers).get_namespace() + } + fn get_hover_state(&self) -> bool { + let node: &JSRef = NodeCast::from_ref(self); + node.get_hover_state() + } +}