Remove the 'static lifetime parameters from TElement methods

This improves the static correctness of layout's use of DOM nodes.

Fixes #2595.
This commit is contained in:
Cameron Zwarich 2014-09-27 01:12:44 -07:00
parent bf025e9b9b
commit b2a3519011
4 changed files with 18 additions and 18 deletions

View file

@ -1077,9 +1077,9 @@ impl<'ln> NodeUtils for ThreadSafeLayoutNode<'ln> {
} }
/// Methods for interacting with HTMLObjectElement nodes /// Methods for interacting with HTMLObjectElement nodes
trait ObjectElement { trait ObjectElement<'a> {
/// Returns None if this node is not matching attributes. /// Returns None if this node is not matching attributes.
fn get_type_and_data(&self) -> (Option<&'static str>, Option<&'static str>); fn get_type_and_data(&self) -> (Option<&'a str>, Option<&'a str>);
/// Returns true if this node has object data that is correct uri. /// Returns true if this node has object data that is correct uri.
fn has_object_data(&self) -> bool; fn has_object_data(&self) -> bool;
@ -1088,8 +1088,8 @@ trait ObjectElement {
fn get_object_data(&self) -> Option<Url>; fn get_object_data(&self) -> Option<Url>;
} }
impl<'ln> ObjectElement for ThreadSafeLayoutNode<'ln> { impl<'ln> ObjectElement<'ln> for ThreadSafeLayoutNode<'ln> {
fn get_type_and_data(&self) -> (Option<&'static str>, Option<&'static str>) { fn get_type_and_data(&self) -> (Option<&'ln str>, Option<&'ln str>) {
let elem = self.as_element(); let elem = self.as_element();
(elem.get_attr(&namespace::Null, "type"), elem.get_attr(&namespace::Null, "data")) (elem.get_attr(&namespace::Null, "type"), elem.get_attr(&namespace::Null, "data"))
} }

View file

@ -401,11 +401,11 @@ impl<'le> TElement<'le> for LayoutElement<'le> {
} }
#[inline] #[inline]
fn get_attr(&self, namespace: &Namespace, name: &str) -> Option<&'static str> { fn get_attr(&self, namespace: &Namespace, name: &str) -> Option<&'le str> {
unsafe { self.element.get_attr_val_for_layout(namespace, name) } unsafe { self.element.get_attr_val_for_layout(namespace, name) }
} }
fn get_link(&self) -> Option<&'static str> { fn get_link(&self) -> Option<&'le str> {
// FIXME: This is HTML only. // FIXME: This is HTML only.
match self.element.node.type_id_for_layout() { match self.element.node.type_id_for_layout() {
// http://www.whatwg.org/specs/web-apps/current-work/multipage/selectors.html# // http://www.whatwg.org/specs/web-apps/current-work/multipage/selectors.html#
@ -791,7 +791,7 @@ pub struct ThreadSafeLayoutElement<'le> {
impl<'le> ThreadSafeLayoutElement<'le> { impl<'le> ThreadSafeLayoutElement<'le> {
#[inline] #[inline]
pub fn get_attr(&self, namespace: &Namespace, name: &str) -> Option<&'static str> { pub fn get_attr(&self, namespace: &Namespace, name: &str) -> Option<&'le str> {
unsafe { self.element.get_attr_val_for_layout(namespace, name) } unsafe { self.element.get_attr_val_for_layout(namespace, name) }
} }
} }

View file

@ -170,7 +170,7 @@ impl Element {
} }
pub trait RawLayoutElementHelpers { pub trait RawLayoutElementHelpers {
unsafe fn get_attr_val_for_layout(&self, namespace: &Namespace, name: &str) -> Option<&'static str>; unsafe fn get_attr_val_for_layout<'a>(&'a self, namespace: &Namespace, name: &str) -> Option<&'a str>;
unsafe fn get_attr_atom_for_layout(&self, namespace: &Namespace, name: &str) -> Option<Atom>; unsafe fn get_attr_atom_for_layout(&self, namespace: &Namespace, name: &str) -> Option<Atom>;
unsafe fn has_class_for_layout(&self, name: &str) -> bool; unsafe fn has_class_for_layout(&self, name: &str) -> bool;
} }
@ -178,8 +178,8 @@ pub trait RawLayoutElementHelpers {
impl RawLayoutElementHelpers for Element { impl RawLayoutElementHelpers for Element {
#[inline] #[inline]
#[allow(unrooted_must_root)] #[allow(unrooted_must_root)]
unsafe fn get_attr_val_for_layout(&self, namespace: &Namespace, name: &str) unsafe fn get_attr_val_for_layout<'a>(&'a self, namespace: &Namespace, name: &str)
-> Option<&'static str> { -> Option<&'a str> {
// cast to point to T in RefCell<T> directly // cast to point to T in RefCell<T> directly
let attrs: *const Vec<JS<Attr>> = mem::transmute(&self.attrs); let attrs: *const Vec<JS<Attr>> = mem::transmute(&self.attrs);
(*attrs).iter().find(|attr: & &JS<Attr>| { (*attrs).iter().find(|attr: & &JS<Attr>| {
@ -949,12 +949,12 @@ impl<'a> VirtualMethods for JSRef<'a, Element> {
} }
impl<'a> style::TElement<'a> for JSRef<'a, Element> { impl<'a> style::TElement<'a> for JSRef<'a, Element> {
fn get_attr(&self, namespace: &Namespace, attr: &str) -> Option<&'static str> { fn get_attr(&self, namespace: &Namespace, attr: &str) -> Option<&'a str> {
self.get_attribute(namespace.clone(), attr).root().map(|attr| { self.get_attribute(namespace.clone(), attr).root().map(|attr| {
unsafe { mem::transmute(attr.deref().value().as_slice()) } unsafe { mem::transmute(attr.deref().value().as_slice()) }
}) })
} }
fn get_link(&self) -> Option<&'static str> { fn get_link(&self) -> Option<&'a str> {
// FIXME: This is HTML only. // FIXME: This is HTML only.
let node: JSRef<Node> = NodeCast::from_ref(*self); let node: JSRef<Node> = NodeCast::from_ref(*self);
match node.type_id() { match node.type_id() {
@ -966,10 +966,10 @@ impl<'a> style::TElement<'a> for JSRef<'a, Element> {
_ => None, _ => None,
} }
} }
fn get_local_name<'a>(&'a self) -> &'a Atom { fn get_local_name<'b>(&'b self) -> &'b Atom {
(self as &ElementHelpers).get_local_name() (self as &ElementHelpers).get_local_name()
} }
fn get_namespace<'a>(&'a self) -> &'a Namespace { fn get_namespace<'b>(&'b self) -> &'b Namespace {
(self as &ElementHelpers).get_namespace() (self as &ElementHelpers).get_namespace()
} }
fn get_hover_state(&self) -> bool { fn get_hover_state(&self) -> bool {

View file

@ -24,10 +24,10 @@ pub trait TNode<'a, E: TElement<'a>> : Clone {
} }
pub trait TElement<'a> { pub trait TElement<'a> {
fn get_attr(&self, namespace: &Namespace, attr: &str) -> Option<&'static str>; fn get_attr(&self, namespace: &Namespace, attr: &str) -> Option<&'a str>;
fn get_link(&self) -> Option<&'static str>; fn get_link(&self) -> Option<&'a str>;
fn get_local_name<'a>(&'a self) -> &'a Atom; fn get_local_name<'b>(&'b self) -> &'b Atom;
fn get_namespace<'a>(&'a self) -> &'a Namespace; fn get_namespace<'b>(&'b self) -> &'b Namespace;
fn get_hover_state(&self) -> bool; fn get_hover_state(&self) -> bool;
fn get_id(&self) -> Option<Atom>; fn get_id(&self) -> Option<Atom>;
fn get_disabled_state(&self) -> bool; fn get_disabled_state(&self) -> bool;