diff --git a/components/script/dom/attr.rs b/components/script/dom/attr.rs index 3e3979dbaef..8995f63ec2d 100644 --- a/components/script/dom/attr.rs +++ b/components/script/dom/attr.rs @@ -306,6 +306,7 @@ impl<'a> AttrHelpers<'a> for JSRef<'a, Attr> { #[allow(unsafe_code)] pub trait AttrHelpersForLayout { + unsafe fn value_forever(&self) -> &'static AttrValue; unsafe fn value_ref_forever(&self) -> &'static str; unsafe fn value_atom_forever(&self) -> Option; unsafe fn value_tokens_forever(&self) -> Option<&'static [Atom]>; @@ -314,6 +315,12 @@ pub trait AttrHelpersForLayout { #[allow(unsafe_code)] impl AttrHelpersForLayout for Attr { + #[inline] + unsafe fn value_forever(&self) -> &'static AttrValue { + // This transmute is used to cheat the lifetime restriction. + mem::transmute::<&AttrValue, &AttrValue>(self.value.borrow_for_layout()) + } + #[inline] unsafe fn value_ref_forever(&self) -> &'static str { // This transmute is used to cheat the lifetime restriction. diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 18481db2c2d..ef240679388 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -156,6 +156,8 @@ impl Element { #[allow(unsafe_code)] pub trait RawLayoutElementHelpers { + unsafe fn get_attr_for_layout<'a>(&'a self, namespace: &Namespace, name: &Atom) + -> Option<&'a AttrValue>; unsafe fn get_attr_val_for_layout<'a>(&'a self, namespace: &Namespace, name: &Atom) -> Option<&'a str>; unsafe fn get_attr_vals_for_layout<'a>(&'a self, name: &Atom) -> Vec<&'a str>; @@ -190,6 +192,13 @@ unsafe fn get_attr_for_layout(elem: &Element, namespace: &Namespace, name: &Atom #[allow(unsafe_code)] impl RawLayoutElementHelpers for Element { #[inline] + unsafe fn get_attr_for_layout<'a>(&'a self, namespace: &Namespace, name: &Atom) + -> Option<&'a AttrValue> { + get_attr_for_layout(self, namespace, name).map(|attr| { + (*attr.unsafe_get()).value_forever() + }) + } + unsafe fn get_attr_val_for_layout<'a>(&'a self, namespace: &Namespace, name: &Atom) -> Option<&'a str> { get_attr_for_layout(self, namespace, name).map(|attr| {