Implement TElement for JSRef<Element>

This commit is contained in:
Bruno de Oliveira Abinader 2014-06-02 14:45:26 -07:00
parent d293b46944
commit 8187916ee4

View file

@ -196,6 +196,8 @@ impl LayoutElementHelpers for JS<Element> {
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<Node> = 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<Node> = 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<Node> = NodeCast::from_ref(self);
node.get_hover_state()
}
}