aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout/wrapper.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/layout/wrapper.rs')
-rw-r--r--components/layout/wrapper.rs41
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()) };
+ }
}
}