aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/layout/wrapper.rs78
1 files changed, 41 insertions, 37 deletions
diff --git a/components/layout/wrapper.rs b/components/layout/wrapper.rs
index 74bb77f3b99..020d6af3bbe 100644
--- a/components/layout/wrapper.rs
+++ b/components/layout/wrapper.rs
@@ -43,7 +43,7 @@ use script::dom::bindings::codegen::InheritTypes::{CharacterDataCast, ElementCas
use script::dom::bindings::codegen::InheritTypes::{HTMLIFrameElementCast, HTMLCanvasElementCast};
use script::dom::bindings::codegen::InheritTypes::{HTMLImageElementCast, HTMLInputElementCast};
use script::dom::bindings::codegen::InheritTypes::{HTMLTextAreaElementCast, NodeCast, TextCast};
-use script::dom::bindings::js::{JS, LayoutJS};
+use script::dom::bindings::js::LayoutJS;
use script::dom::characterdata::{CharacterDataTypeId, LayoutCharacterDataHelpers};
use script::dom::element::{Element, ElementTypeId};
use script::dom::element::{LayoutElementHelpers, RawLayoutElementHelpers};
@@ -251,13 +251,12 @@ impl<'ln> ::selectors::Node<LayoutElement<'ln>> for LayoutNode<'ln> {
/// If this is an element, accesses the element data.
#[inline]
fn as_element(&self) -> Option<LayoutElement<'ln>> {
- unsafe {
- ElementCast::to_layout_js(&self.node).map(|element| {
- LayoutElement {
- element: &*element.unsafe_get(),
- }
- })
- }
+ ElementCast::to_layout_js(&self.node).map(|element| {
+ LayoutElement {
+ element: element,
+ chain: self.chain,
+ }
+ })
}
fn is_document(&self) -> bool {
@@ -372,14 +371,15 @@ impl<'a> Iterator for LayoutTreeIterator<'a> {
/// A wrapper around elements that ensures layout can only ever access safe properties.
#[derive(Copy, Clone)]
pub struct LayoutElement<'le> {
- element: &'le Element,
+ element: LayoutJS<Element>,
+ chain: PhantomData<&'le ()>,
}
impl<'le> LayoutElement<'le> {
pub fn style_attribute(&self) -> &'le Option<PropertyDeclarationBlock> {
use script::dom::element::ElementHelpers;
let style: &Option<PropertyDeclarationBlock> = unsafe {
- &*self.element.style_attribute().borrow_for_layout()
+ &*(*self.element.unsafe_get()).style_attribute().borrow_for_layout()
};
style
}
@@ -391,34 +391,36 @@ impl<'le> ::selectors::Element for LayoutElement<'le> {
#[inline]
fn as_node(&self) -> LayoutNode<'le> {
LayoutNode {
- node: NodeCast::from_layout_js(unsafe {
- &JS::from_ref(self.element).to_layout()
- }),
+ node: NodeCast::from_layout_js(&self.element),
chain: PhantomData,
}
}
#[inline]
fn get_local_name<'a>(&'a self) -> &'a Atom {
- self.element.local_name()
+ unsafe {
+ (*self.element.unsafe_get()).local_name()
+ }
}
#[inline]
fn get_namespace<'a>(&'a self) -> &'a Namespace {
use script::dom::element::ElementHelpers;
- self.element.namespace()
+ unsafe {
+ (*self.element.unsafe_get()).namespace()
+ }
}
fn is_link(&self) -> bool {
// FIXME: This is HTML only.
- let node: &Node = NodeCast::from_ref(self.element);
- match node.type_id_for_layout() {
+ let node = NodeCast::from_layout_js(&self.element);
+ match unsafe { (*node.unsafe_get()).type_id_for_layout() } {
// https://html.spec.whatwg.org/multipage/#selector-link
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAnchorElement)) |
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAreaElement)) |
NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLLinkElement)) => {
unsafe {
- self.element.get_attr_val_for_layout(&ns!(""), &atom!("href")).is_some()
+ (*self.element.unsafe_get()).get_attr_val_for_layout(&ns!(""), &atom!("href")).is_some()
}
}
_ => false,
@@ -437,68 +439,68 @@ impl<'le> ::selectors::Element for LayoutElement<'le> {
#[inline]
fn get_hover_state(&self) -> bool {
+ let node = NodeCast::from_layout_js(&self.element);
unsafe {
- let node: &Node = NodeCast::from_ref(self.element);
- node.get_hover_state_for_layout()
+ (*node.unsafe_get()).get_hover_state_for_layout()
}
}
#[inline]
fn get_focus_state(&self) -> bool {
+ let node = NodeCast::from_layout_js(&self.element);
unsafe {
- let node: &Node = NodeCast::from_ref(self.element);
- node.get_focus_state_for_layout()
+ (*node.unsafe_get()).get_focus_state_for_layout()
}
}
#[inline]
fn get_id(&self) -> Option<Atom> {
unsafe {
- self.element.get_attr_atom_for_layout(&ns!(""), &atom!("id"))
+ (*self.element.unsafe_get()).get_attr_atom_for_layout(&ns!(""), &atom!("id"))
}
}
#[inline]
fn get_disabled_state(&self) -> bool {
+ let node = NodeCast::from_layout_js(&self.element);
unsafe {
- let node: &Node = NodeCast::from_ref(self.element);
- node.get_disabled_state_for_layout()
+ (*node.unsafe_get()).get_disabled_state_for_layout()
}
}
#[inline]
fn get_enabled_state(&self) -> bool {
+ let node = NodeCast::from_layout_js(&self.element);
unsafe {
- let node: &Node = NodeCast::from_ref(self.element);
- node.get_enabled_state_for_layout()
+ (*node.unsafe_get()).get_enabled_state_for_layout()
}
}
#[inline]
fn get_checked_state(&self) -> bool {
unsafe {
- self.element.get_checked_state_for_layout()
+ (*self.element.unsafe_get()).get_checked_state_for_layout()
}
}
#[inline]
fn get_indeterminate_state(&self) -> bool {
unsafe {
- self.element.get_indeterminate_state_for_layout()
+ (*self.element.unsafe_get()).get_indeterminate_state_for_layout()
}
}
#[inline]
fn has_class(&self, name: &Atom) -> bool {
unsafe {
- self.element.has_class_for_layout(name)
+ (*self.element.unsafe_get()).has_class_for_layout(name)
}
}
#[inline(always)]
fn each_class<F>(&self, mut callback: F) where F: FnMut(&Atom) {
unsafe {
- match self.element.get_classes_for_layout() {
+ match (*self.element.unsafe_get()).get_classes_for_layout() {
None => {}
Some(ref classes) => {
for class in classes.iter() {
@@ -512,7 +514,7 @@ impl<'le> ::selectors::Element for LayoutElement<'le> {
#[inline]
fn has_servo_nonzero_border(&self) -> bool {
unsafe {
- match self.element.get_attr_for_layout(&ns!(""), &atom!("border")) {
+ match (*self.element.unsafe_get()).get_attr_for_layout(&ns!(""), &atom!("border")) {
None | Some(&AttrValue::UInt(_, 0)) => false,
_ => true,
}
@@ -537,7 +539,7 @@ impl<'le> ::selectors::Element for LayoutElement<'le> {
fn is_html_element_in_html_document(&self) -> bool {
unsafe {
- JS::from_ref(self.element).to_layout().html_element_in_html_document_for_layout()
+ self.element.html_element_in_html_document_for_layout()
}
}
}
@@ -547,25 +549,27 @@ impl<'le> TElementAttributes for LayoutElement<'le> {
where V: VecLike<DeclarationBlock<Vec<PropertyDeclaration>>>
{
unsafe {
- self.element.synthesize_presentational_hints_for_legacy_attributes(hints);
+ (*self.element.unsafe_get()).synthesize_presentational_hints_for_legacy_attributes(hints);
}
}
fn get_unsigned_integer_attribute(&self, attribute: UnsignedIntegerAttribute) -> Option<u32> {
unsafe {
- self.element.get_unsigned_integer_attribute_for_layout(attribute)
+ (*self.element.unsafe_get()).get_unsigned_integer_attribute_for_layout(attribute)
}
}
#[inline]
fn get_attr<'a>(&'a self, namespace: &Namespace, name: &Atom) -> Option<&'a str> {
- unsafe { self.element.get_attr_val_for_layout(namespace, name) }
+ unsafe {
+ (*self.element.unsafe_get()).get_attr_val_for_layout(namespace, name)
+ }
}
#[inline]
fn get_attrs<'a>(&'a self, name: &Atom) -> Vec<&'a str> {
unsafe {
- self.element.get_attr_vals_for_layout(name)
+ (*self.element.unsafe_get()).get_attr_vals_for_layout(name)
}
}
}