diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index a7eda2e3597..7a75ea51503 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -150,12 +150,9 @@ pub struct Node { /// are this node. ranges: WeakRangeVec, - /// Style+Layout information. Only the layout thread may touch this data. - /// - /// Must be sent back to the layout thread to be destroyed when this - /// node is finalized. - #[ignore_malloc_size_of = "Unsafe cell"] - style_and_layout_data: UnsafeCell>>, + /// Style+Layout information. + #[ignore_malloc_size_of = "trait object"] + style_and_layout_data: DomRefCell>>, } bitflags! { @@ -1246,21 +1243,18 @@ impl Node { } } - #[allow(unsafe_code)] pub fn style(&self) -> Option> { if !window_from_node(self).layout_reflow(QueryMsg::StyleQuery) { return None; } - unsafe { - (*self.style_and_layout_data.get()).as_ref().map(|data| { - data.style_data - .element_data - .borrow() - .styles - .primary() - .clone() - }) - } + self.style_and_layout_data.borrow().as_ref().map(|data| { + data.style_data + .element_data + .borrow() + .styles + .primary() + .clone() + }) } } @@ -1444,13 +1438,21 @@ impl<'dom> LayoutNodeHelpers<'dom> for LayoutDom<'dom, Node> { #[inline] #[allow(unsafe_code)] fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> { - unsafe { (*self.unsafe_get().style_and_layout_data.get()).as_deref() } + unsafe { + self.unsafe_get() + .style_and_layout_data + .borrow_for_layout() + .as_deref() + } } #[inline] #[allow(unsafe_code)] unsafe fn init_style_and_opaque_layout_data(self, val: Box) { - let data = &mut *self.unsafe_get().style_and_layout_data.get(); + let data = self + .unsafe_get() + .style_and_layout_data + .borrow_mut_for_layout(); debug_assert!(data.is_none()); *data = Some(val); } @@ -1458,7 +1460,9 @@ impl<'dom> LayoutNodeHelpers<'dom> for LayoutDom<'dom, Node> { #[inline] #[allow(unsafe_code)] unsafe fn take_style_and_opaque_layout_data(self) -> Box { - (*self.unsafe_get().style_and_layout_data.get()) + self.unsafe_get() + .style_and_layout_data + .borrow_mut_for_layout() .take() .unwrap() } @@ -1775,7 +1779,7 @@ impl Node { inclusive_descendants_version: Cell::new(0), ranges: WeakRangeVec::new(), - style_and_layout_data: UnsafeCell::new(None), + style_and_layout_data: Default::default(), } } diff --git a/tests/unit/script/size_of.rs b/tests/unit/script/size_of.rs index 4b18decc66a..e46848e5cf1 100644 --- a/tests/unit/script/size_of.rs +++ b/tests/unit/script/size_of.rs @@ -30,10 +30,10 @@ macro_rules! sizeof_checker ( // Update the sizes here sizeof_checker!(size_event_target, EventTarget, 56); -sizeof_checker!(size_node, Node, 184); -sizeof_checker!(size_element, Element, 360); -sizeof_checker!(size_htmlelement, HTMLElement, 376); -sizeof_checker!(size_div, HTMLDivElement, 376); -sizeof_checker!(size_span, HTMLSpanElement, 376); -sizeof_checker!(size_text, Text, 216); -sizeof_checker!(size_characterdata, CharacterData, 216); +sizeof_checker!(size_node, Node, 192); +sizeof_checker!(size_element, Element, 368); +sizeof_checker!(size_htmlelement, HTMLElement, 384); +sizeof_checker!(size_div, HTMLDivElement, 384); +sizeof_checker!(size_span, HTMLSpanElement, 384); +sizeof_checker!(size_text, Text, 224); +sizeof_checker!(size_characterdata, CharacterData, 224);