diff options
Diffstat (limited to 'components/layout/wrapper.rs')
-rw-r--r-- | components/layout/wrapper.rs | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/components/layout/wrapper.rs b/components/layout/wrapper.rs index 57bd44a5798..9c1645c5f5e 100644 --- a/components/layout/wrapper.rs +++ b/components/layout/wrapper.rs @@ -33,13 +33,21 @@ use core::nonzero::NonZero; use data::{LayoutDataFlags, PersistentLayoutData}; use script_layout_interface::{OpaqueStyleAndLayoutData, PartialPersistentLayoutData}; -use script_layout_interface::wrapper_traits::{ThreadSafeLayoutElement, ThreadSafeLayoutNode}; +use script_layout_interface::wrapper_traits::{LayoutNode, ThreadSafeLayoutElement, ThreadSafeLayoutNode}; use script_layout_interface::wrapper_traits::GetLayoutData; use style::atomic_refcell::{AtomicRef, AtomicRefCell, AtomicRefMut}; use style::computed_values::content::{self, ContentItem}; +use style::dom::TElement; +use style::traversal::prepare_for_styling; pub type NonOpaqueStyleAndLayoutData = AtomicRefCell<PersistentLayoutData>; +pub unsafe fn drop_style_and_layout_data(data: OpaqueStyleAndLayoutData) { + let ptr: *mut AtomicRefCell<PartialPersistentLayoutData> = *data.ptr; + let non_opaque: *mut NonOpaqueStyleAndLayoutData = ptr as *mut _; + let _ = Box::from_raw(non_opaque); +} + pub trait LayoutNodeLayoutData { /// Similar to borrow_data*, but returns the full PersistentLayoutData rather /// than only the style::data::ElementData. @@ -62,12 +70,25 @@ impl<T: GetLayoutData> LayoutNodeLayoutData for T { } } +pub trait GetRawData { + fn get_raw_data(&self) -> Option<&NonOpaqueStyleAndLayoutData>; +} + +impl<T: GetLayoutData> GetRawData for T { + fn get_raw_data(&self) -> Option<&NonOpaqueStyleAndLayoutData> { + self.get_style_and_layout_data().map(|opaque| { + let container = *opaque.ptr as *mut NonOpaqueStyleAndLayoutData; + unsafe { &*container } + }) + } +} + pub trait LayoutNodeHelpers { fn initialize_data(&self); - fn get_raw_data(&self) -> Option<&NonOpaqueStyleAndLayoutData>; + fn clear_data(&self); } -impl<T: GetLayoutData> LayoutNodeHelpers for T { +impl<T: LayoutNode> LayoutNodeHelpers for T { fn initialize_data(&self) { if self.get_raw_data().is_none() { let ptr: *mut NonOpaqueStyleAndLayoutData = @@ -75,15 +96,17 @@ impl<T: GetLayoutData> LayoutNodeHelpers for T { let opaque = OpaqueStyleAndLayoutData { ptr: unsafe { NonZero::new(ptr as *mut AtomicRefCell<PartialPersistentLayoutData>) } }; - self.init_style_and_layout_data(opaque); + unsafe { self.init_style_and_layout_data(opaque) }; + if let Some(el) = self.as_element() { + let _ = prepare_for_styling(el, el.get_data().unwrap()); + } }; } - fn get_raw_data(&self) -> Option<&NonOpaqueStyleAndLayoutData> { - self.get_style_and_layout_data().map(|opaque| { - let container = *opaque.ptr as *mut NonOpaqueStyleAndLayoutData; - unsafe { &*container } - }) + fn clear_data(&self) { + if self.get_raw_data().is_some() { + unsafe { drop_style_and_layout_data(self.take_style_and_layout_data()) }; + } } } |