From 030a1cf8fb040155ca4c5a414f6e2ca01f7574ad Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Mon, 6 Apr 2020 14:42:05 +0200 Subject: [PATCH] Replace OpaqueStyleAndLayoutData by StyleAndOpaqueLayoutData --- components/layout/data.rs | 17 +----- components/layout/query.rs | 21 ++----- components/layout/wrapper.rs | 17 +++--- components/layout_2020/data.rs | 16 +---- components/layout_2020/lib.rs | 2 +- components/layout_2020/wrapper.rs | 15 +++-- components/layout_thread/dom_wrapper.rs | 61 +++++++++---------- components/layout_thread_2020/dom_wrapper.rs | 61 +++++++++---------- components/script/dom/bindings/trace.rs | 4 +- components/script/dom/node.rs | 20 +++--- components/script_layout_interface/lib.rs | 39 ++++++------ .../script_layout_interface/wrapper_traits.rs | 18 +++--- 12 files changed, 129 insertions(+), 162 deletions(-) diff --git a/components/layout/data.rs b/components/layout/data.rs index b965bc44ebd..65d96bae244 100644 --- a/components/layout/data.rs +++ b/components/layout/data.rs @@ -6,25 +6,14 @@ use crate::construct::ConstructionResult; use atomic_refcell::AtomicRefCell; use script_layout_interface::StyleData; -#[repr(C)] -pub struct StyleAndLayoutData { +pub struct StyleAndLayoutData<'dom> { /// The style data associated with a node. - pub style_data: StyleData, + pub style_data: &'dom StyleData, /// The layout data associated with a node. - pub layout_data: AtomicRefCell, -} - -impl StyleAndLayoutData { - pub fn new() -> Self { - Self { - style_data: StyleData::new(), - layout_data: AtomicRefCell::new(LayoutData::new()), - } - } + pub layout_data: &'dom AtomicRefCell, } /// Data that layout associates with a node. -#[repr(C)] pub struct LayoutData { /// The current results of flow construction for this node. This is either a /// flow or a `ConstructionItem`. See comments in `construct.rs` for more diff --git a/components/layout/query.rs b/components/layout/query.rs index 44c5e4c21fd..9cff8fa61c4 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -6,7 +6,6 @@ use crate::construct::ConstructionResult; use crate::context::LayoutContext; -use crate::data::StyleAndLayoutData; use crate::display_list::items::{DisplayList, OpaqueNode, ScrollOffsetMap}; use crate::display_list::IndexableText; use crate::flow::{Flow, GetBaseFlow}; @@ -1036,24 +1035,12 @@ fn inner_text_collection_steps<'dom>( _ => child, }; - let element_data = { - &node - .get_opaque_style_and_layout_data() - .as_ref() - .map(|opaque| { - &opaque - .downcast_ref::() - .unwrap() - .style_data - .element_data - }) + let element_data = match node.get_style_and_opaque_layout_data() { + Some(data) => &data.style_data.element_data, + None => continue, }; - if element_data.is_none() { - continue; - } - - let style = match element_data.unwrap().borrow().styles.get_primary() { + let style = match element_data.borrow().styles.get_primary() { None => continue, Some(style) => style.clone(), }; diff --git a/components/layout/wrapper.rs b/components/layout/wrapper.rs index bd6203bb84c..126c74a886f 100644 --- a/components/layout/wrapper.rs +++ b/components/layout/wrapper.rs @@ -32,7 +32,7 @@ use crate::data::{LayoutData, LayoutDataFlags, StyleAndLayoutData}; use atomic_refcell::{AtomicRef, AtomicRefMut}; -use script_layout_interface::wrapper_traits::GetOpaqueStyleAndLayoutData; +use script_layout_interface::wrapper_traits::GetStyleAndOpaqueLayoutData; use script_layout_interface::wrapper_traits::{ThreadSafeLayoutElement, ThreadSafeLayoutNode}; use style::dom::{NodeInfo, TNode}; use style::selector_parser::RestyleDamage; @@ -47,7 +47,7 @@ pub trait LayoutNodeLayoutData<'dom> { impl<'dom, T> LayoutNodeLayoutData<'dom> for T where - T: GetOpaqueStyleAndLayoutData<'dom>, + T: GetStyleAndOpaqueLayoutData<'dom>, { fn borrow_layout_data(self) -> Option> { self.get_style_and_layout_data() @@ -66,16 +66,19 @@ where } pub trait GetStyleAndLayoutData<'dom> { - fn get_style_and_layout_data(self) -> Option<&'dom StyleAndLayoutData>; + fn get_style_and_layout_data(self) -> Option>; } impl<'dom, T> GetStyleAndLayoutData<'dom> for T where - T: GetOpaqueStyleAndLayoutData<'dom>, + T: GetStyleAndOpaqueLayoutData<'dom>, { - fn get_style_and_layout_data(self) -> Option<&'dom StyleAndLayoutData> { - self.get_opaque_style_and_layout_data() - .map(|opaque| opaque.downcast_ref().unwrap()) + fn get_style_and_layout_data(self) -> Option> { + self.get_style_and_opaque_layout_data() + .map(|data| StyleAndLayoutData { + style_data: &data.style_data, + layout_data: data.generic_data.downcast_ref().unwrap(), + }) } } diff --git a/components/layout_2020/data.rs b/components/layout_2020/data.rs index d8aa8cf77ac..6df89c80533 100644 --- a/components/layout_2020/data.rs +++ b/components/layout_2020/data.rs @@ -6,17 +6,7 @@ use crate::element_data::LayoutDataForElement; use atomic_refcell::AtomicRefCell; use script_layout_interface::StyleData; -#[repr(C)] -pub struct StyleAndLayoutData { - pub style_data: StyleData, - pub(super) layout_data: AtomicRefCell, -} - -impl StyleAndLayoutData { - pub fn new() -> Self { - Self { - style_data: StyleData::new(), - layout_data: Default::default(), - } - } +pub struct StyleAndLayoutData<'dom> { + pub style_data: &'dom StyleData, + pub(super) layout_data: &'dom AtomicRefCell, } diff --git a/components/layout_2020/lib.rs b/components/layout_2020/lib.rs index e34c6ba76ee..6b7a08ec29b 100644 --- a/components/layout_2020/lib.rs +++ b/components/layout_2020/lib.rs @@ -14,7 +14,7 @@ pub mod context; pub mod data; pub mod display_list; mod dom_traversal; -mod element_data; +pub mod element_data; mod flow; mod formatting_contexts; mod fragments; diff --git a/components/layout_2020/wrapper.rs b/components/layout_2020/wrapper.rs index 45d121f2354..635889dc92e 100644 --- a/components/layout_2020/wrapper.rs +++ b/components/layout_2020/wrapper.rs @@ -5,18 +5,21 @@ #![allow(unsafe_code)] use crate::data::StyleAndLayoutData; -use script_layout_interface::wrapper_traits::GetOpaqueStyleAndLayoutData; +use script_layout_interface::wrapper_traits::GetStyleAndOpaqueLayoutData; pub trait GetStyleAndLayoutData<'dom> { - fn get_style_and_layout_data(self) -> Option<&'dom StyleAndLayoutData>; + fn get_style_and_layout_data(self) -> Option>; } impl<'dom, T> GetStyleAndLayoutData<'dom> for T where - T: GetOpaqueStyleAndLayoutData<'dom>, + T: GetStyleAndOpaqueLayoutData<'dom>, { - fn get_style_and_layout_data(self) -> Option<&'dom StyleAndLayoutData> { - self.get_opaque_style_and_layout_data() - .map(|opaque| opaque.downcast_ref().unwrap()) + fn get_style_and_layout_data(self) -> Option> { + self.get_style_and_opaque_layout_data() + .map(|data| StyleAndLayoutData { + style_data: &data.style_data, + layout_data: data.generic_data.downcast_ref().unwrap(), + }) } } diff --git a/components/layout_thread/dom_wrapper.rs b/components/layout_thread/dom_wrapper.rs index 85f0802da6e..064ceb5148e 100644 --- a/components/layout_thread/dom_wrapper.rs +++ b/components/layout_thread/dom_wrapper.rs @@ -30,10 +30,10 @@ #![allow(unsafe_code)] -use atomic_refcell::{AtomicRef, AtomicRefMut}; +use atomic_refcell::{AtomicRef, AtomicRefCell, AtomicRefMut}; use gfx_traits::ByteIndex; use html5ever::{LocalName, Namespace}; -use layout::data::StyleAndLayoutData; +use layout::data::LayoutData; use layout::wrapper::GetStyleAndLayoutData; use msg::constellation_msg::{BrowsingContextId, PipelineId}; use net_traits::image::base::{Image, ImageMetadata}; @@ -50,13 +50,13 @@ use script::layout_exports::{ LayoutDom, LayoutElementHelpers, LayoutNodeHelpers, LayoutShadowRootHelpers, }; use script_layout_interface::wrapper_traits::{ - DangerousThreadSafeLayoutNode, GetOpaqueStyleAndLayoutData, LayoutNode, + DangerousThreadSafeLayoutNode, GetStyleAndOpaqueLayoutData, LayoutNode, }; use script_layout_interface::wrapper_traits::{ PseudoElementType, ThreadSafeLayoutElement, ThreadSafeLayoutNode, }; use script_layout_interface::{ - HTMLCanvasData, HTMLMediaData, LayoutNodeType, OpaqueStyleAndLayoutData, + HTMLCanvasData, HTMLMediaData, LayoutNodeType, StyleAndOpaqueLayoutData, }; use script_layout_interface::{SVGSVGData, StyleData, TrustedNodeAddress}; use selectors::attr::{AttrSelectorOperation, CaseSensitivity, NamespaceConstraint}; @@ -269,17 +269,20 @@ impl<'ln> LayoutNode<'ln> for ServoLayoutNode<'ln> { unsafe fn initialize_data(&self) { if self.get_style_and_layout_data().is_none() { - let opaque = OpaqueStyleAndLayoutData::new(StyleAndLayoutData::new()); - self.init_opaque_style_and_layout_data(opaque); + let opaque = StyleAndOpaqueLayoutData::new( + StyleData::new(), + AtomicRefCell::new(LayoutData::new()), + ); + self.init_style_and_opaque_layout_data(opaque); }; } - unsafe fn init_opaque_style_and_layout_data(&self, data: OpaqueStyleAndLayoutData) { - self.get_jsmanaged().init_opaque_style_and_layout_data(data); + unsafe fn init_style_and_opaque_layout_data(&self, data: Box) { + self.get_jsmanaged().init_style_and_opaque_layout_data(data); } - unsafe fn take_opaque_style_and_layout_data(&self) -> OpaqueStyleAndLayoutData { - self.get_jsmanaged().take_opaque_style_and_layout_data() + unsafe fn take_style_and_opaque_layout_data(&self) -> Box { + self.get_jsmanaged().take_style_and_opaque_layout_data() } fn is_connected(&self) -> bool { @@ -287,27 +290,27 @@ impl<'ln> LayoutNode<'ln> for ServoLayoutNode<'ln> { } } -impl<'dom> GetOpaqueStyleAndLayoutData<'dom> for ServoLayoutNode<'dom> { - fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> { - self.get_jsmanaged().get_opaque_style_and_layout_data() +impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoLayoutNode<'dom> { + fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> { + self.get_jsmanaged().get_style_and_opaque_layout_data() } } -impl<'dom> GetOpaqueStyleAndLayoutData<'dom> for ServoLayoutElement<'dom> { - fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> { - self.as_node().get_opaque_style_and_layout_data() +impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoLayoutElement<'dom> { + fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> { + self.as_node().get_style_and_opaque_layout_data() } } -impl<'dom> GetOpaqueStyleAndLayoutData<'dom> for ServoThreadSafeLayoutNode<'dom> { - fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> { - self.node.get_opaque_style_and_layout_data() +impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoThreadSafeLayoutNode<'dom> { + fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> { + self.node.get_style_and_opaque_layout_data() } } -impl<'dom> GetOpaqueStyleAndLayoutData<'dom> for ServoThreadSafeLayoutElement<'dom> { - fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> { - self.element.as_node().get_opaque_style_and_layout_data() +impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoThreadSafeLayoutElement<'dom> { + fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> { + self.element.as_node().get_style_and_opaque_layout_data() } } @@ -537,7 +540,7 @@ impl<'le> TElement for ServoLayoutElement<'le> { unsafe fn clear_data(&self) { if self.get_style_and_layout_data().is_some() { - drop(self.as_node().take_opaque_style_and_layout_data()); + drop(self.as_node().take_style_and_opaque_layout_data()); } } @@ -695,12 +698,8 @@ impl<'le> ServoLayoutElement<'le> { } fn get_style_data(&self) -> Option<&StyleData> { - self.get_opaque_style_and_layout_data().map(|opaque| { - &opaque - .downcast_ref::() - .unwrap() - .style_data - }) + self.get_style_and_opaque_layout_data() + .map(|data| &data.style_data) } pub unsafe fn unset_snapshot_flags(&self) { @@ -1045,8 +1044,8 @@ impl<'ln> ThreadSafeLayoutNode<'ln> for ServoThreadSafeLayoutNode<'ln> { }) } - fn get_opaque_style_and_layout_data(self) -> Option<&'ln OpaqueStyleAndLayoutData> { - self.node.get_opaque_style_and_layout_data() + fn get_style_and_opaque_layout_data(self) -> Option<&'ln StyleAndOpaqueLayoutData> { + self.node.get_style_and_opaque_layout_data() } fn is_ignorable_whitespace(&self, context: &SharedStyleContext) -> bool { diff --git a/components/layout_thread_2020/dom_wrapper.rs b/components/layout_thread_2020/dom_wrapper.rs index 3937b23ef47..92a9f3f005b 100644 --- a/components/layout_thread_2020/dom_wrapper.rs +++ b/components/layout_thread_2020/dom_wrapper.rs @@ -30,10 +30,10 @@ #![allow(unsafe_code)] -use atomic_refcell::{AtomicRef, AtomicRefMut}; +use atomic_refcell::{AtomicRef, AtomicRefCell, AtomicRefMut}; use gfx_traits::ByteIndex; use html5ever::{LocalName, Namespace}; -use layout::data::StyleAndLayoutData; +use layout::element_data::LayoutDataForElement; use layout::wrapper::GetStyleAndLayoutData; use msg::constellation_msg::{BrowsingContextId, PipelineId}; use net_traits::image::base::{Image, ImageMetadata}; @@ -50,13 +50,13 @@ use script::layout_exports::{ LayoutDom, LayoutElementHelpers, LayoutNodeHelpers, LayoutShadowRootHelpers, }; use script_layout_interface::wrapper_traits::{ - DangerousThreadSafeLayoutNode, GetOpaqueStyleAndLayoutData, LayoutNode, + DangerousThreadSafeLayoutNode, GetStyleAndOpaqueLayoutData, LayoutNode, }; use script_layout_interface::wrapper_traits::{ PseudoElementType, ThreadSafeLayoutElement, ThreadSafeLayoutNode, }; use script_layout_interface::{ - HTMLCanvasData, HTMLMediaData, LayoutNodeType, OpaqueStyleAndLayoutData, + HTMLCanvasData, HTMLMediaData, LayoutNodeType, StyleAndOpaqueLayoutData, }; use script_layout_interface::{SVGSVGData, StyleData, TrustedNodeAddress}; use selectors::attr::{AttrSelectorOperation, CaseSensitivity, NamespaceConstraint}; @@ -276,17 +276,20 @@ impl<'ln> LayoutNode<'ln> for ServoLayoutNode<'ln> { unsafe fn initialize_data(&self) { if self.get_style_and_layout_data().is_none() { - let opaque = OpaqueStyleAndLayoutData::new(StyleAndLayoutData::new()); - self.init_opaque_style_and_layout_data(opaque); + let opaque = StyleAndOpaqueLayoutData::new( + StyleData::new(), + AtomicRefCell::new(LayoutDataForElement::default()), + ); + self.init_style_and_opaque_layout_data(opaque); }; } - unsafe fn init_opaque_style_and_layout_data(&self, data: OpaqueStyleAndLayoutData) { - self.get_jsmanaged().init_opaque_style_and_layout_data(data); + unsafe fn init_style_and_opaque_layout_data(&self, data: Box) { + self.get_jsmanaged().init_style_and_opaque_layout_data(data); } - unsafe fn take_opaque_style_and_layout_data(&self) -> OpaqueStyleAndLayoutData { - self.get_jsmanaged().take_opaque_style_and_layout_data() + unsafe fn take_style_and_opaque_layout_data(&self) -> Box { + self.get_jsmanaged().take_style_and_opaque_layout_data() } fn is_connected(&self) -> bool { @@ -294,27 +297,27 @@ impl<'ln> LayoutNode<'ln> for ServoLayoutNode<'ln> { } } -impl<'dom> GetOpaqueStyleAndLayoutData<'dom> for ServoLayoutNode<'dom> { - fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> { - unsafe { self.get_jsmanaged().get_opaque_style_and_layout_data() } +impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoLayoutNode<'dom> { + fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> { + unsafe { self.get_jsmanaged().get_style_and_opaque_layout_data() } } } -impl<'dom> GetOpaqueStyleAndLayoutData<'dom> for ServoLayoutElement<'dom> { - fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> { - self.as_node().get_opaque_style_and_layout_data() +impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoLayoutElement<'dom> { + fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> { + self.as_node().get_style_and_opaque_layout_data() } } -impl<'dom> GetOpaqueStyleAndLayoutData<'dom> for ServoThreadSafeLayoutNode<'dom> { - fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> { - self.node.get_opaque_style_and_layout_data() +impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoThreadSafeLayoutNode<'dom> { + fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> { + self.node.get_style_and_opaque_layout_data() } } -impl<'dom> GetOpaqueStyleAndLayoutData<'dom> for ServoThreadSafeLayoutElement<'dom> { - fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> { - self.element.as_node().get_opaque_style_and_layout_data() +impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoThreadSafeLayoutElement<'dom> { + fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> { + self.element.as_node().get_style_and_opaque_layout_data() } } @@ -545,7 +548,7 @@ impl<'le> TElement for ServoLayoutElement<'le> { unsafe fn clear_data(&self) { if self.get_style_and_layout_data().is_some() { - drop(self.as_node().take_opaque_style_and_layout_data()); + drop(self.as_node().take_style_and_opaque_layout_data()); } } @@ -703,12 +706,8 @@ impl<'le> ServoLayoutElement<'le> { } fn get_style_data(&self) -> Option<&StyleData> { - self.get_opaque_style_and_layout_data().map(|opaque| { - &opaque - .downcast_ref::() - .unwrap() - .style_data - }) + self.get_style_and_opaque_layout_data() + .map(|data| &data.style_data) } pub unsafe fn unset_snapshot_flags(&self) { @@ -1053,8 +1052,8 @@ impl<'ln> ThreadSafeLayoutNode<'ln> for ServoThreadSafeLayoutNode<'ln> { }) } - fn get_opaque_style_and_layout_data(self) -> Option<&'ln OpaqueStyleAndLayoutData> { - self.node.get_opaque_style_and_layout_data() + fn get_style_and_opaque_layout_data(self) -> Option<&'ln StyleAndOpaqueLayoutData> { + self.node.get_style_and_opaque_layout_data() } fn is_ignorable_whitespace(&self, context: &SharedStyleContext) -> bool { diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index c30fced7c4d..305c6327b82 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -97,7 +97,7 @@ use profile_traits::mem::ProfilerChan as MemProfilerChan; use profile_traits::time::ProfilerChan as TimeProfilerChan; use script_layout_interface::message::PendingRestyle; use script_layout_interface::rpc::LayoutRPC; -use script_layout_interface::OpaqueStyleAndLayoutData; +use script_layout_interface::StyleAndOpaqueLayoutData; use script_traits::serializable::BlobImpl; use script_traits::transferable::MessagePortImpl; use script_traits::{DocumentActivity, DrawAPaintImageResult}; @@ -508,7 +508,7 @@ unsafe_no_jsmanaged_fields!(StatusCode); unsafe_no_jsmanaged_fields!(SystemTime); unsafe_no_jsmanaged_fields!(Instant); unsafe_no_jsmanaged_fields!(RelativePos); -unsafe_no_jsmanaged_fields!(OpaqueStyleAndLayoutData); +unsafe_no_jsmanaged_fields!(StyleAndOpaqueLayoutData); unsafe_no_jsmanaged_fields!(PathBuf); unsafe_no_jsmanaged_fields!(DrawAPaintImageResult); unsafe_no_jsmanaged_fields!(DocumentId); diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index 99079062e17..be40fc6d556 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -76,7 +76,7 @@ use msg::constellation_msg::{BrowsingContextId, PipelineId}; use net_traits::image::base::{Image, ImageMetadata}; use ref_slice::ref_slice; use script_layout_interface::{HTMLCanvasData, HTMLMediaData, LayoutElementType, LayoutNodeType}; -use script_layout_interface::{OpaqueStyleAndLayoutData, SVGSVGData, TrustedNodeAddress}; +use script_layout_interface::{SVGSVGData, StyleAndOpaqueLayoutData, TrustedNodeAddress}; use script_traits::DocumentActivity; use script_traits::UntrustedNodeAddress; use selectors::matching::{matches_selector_list, MatchingContext, MatchingMode}; @@ -152,8 +152,8 @@ pub struct Node { /// /// Must be sent back to the layout thread to be destroyed when this /// node is finalized. - #[ignore_malloc_size_of = "shrug"] - style_and_layout_data: UnsafeCell>, + #[ignore_malloc_size_of = "Unsafe cell"] + style_and_layout_data: UnsafeCell>>, } bitflags! { @@ -1282,9 +1282,9 @@ pub trait LayoutNodeHelpers<'dom> { fn children_count(self) -> u32; - fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData>; - unsafe fn init_opaque_style_and_layout_data(self, data: OpaqueStyleAndLayoutData); - unsafe fn take_opaque_style_and_layout_data(self) -> OpaqueStyleAndLayoutData; + fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData>; + unsafe fn init_style_and_opaque_layout_data(self, data: Box); + unsafe fn take_style_and_opaque_layout_data(self) -> Box; fn text_content(self) -> Cow<'dom, str>; fn selection(self) -> Option>; @@ -1410,13 +1410,13 @@ impl<'dom> LayoutNodeHelpers<'dom> for LayoutDom<'dom, Node> { #[inline] #[allow(unsafe_code)] - fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> { - unsafe { (*self.unsafe_get().style_and_layout_data.get()).as_ref() } + fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> { + unsafe { (*self.unsafe_get().style_and_layout_data.get()).as_deref() } } #[inline] #[allow(unsafe_code)] - unsafe fn init_opaque_style_and_layout_data(self, val: OpaqueStyleAndLayoutData) { + unsafe fn init_style_and_opaque_layout_data(self, val: Box) { let data = &mut *self.unsafe_get().style_and_layout_data.get(); debug_assert!(data.is_none()); *data = Some(val); @@ -1424,7 +1424,7 @@ impl<'dom> LayoutNodeHelpers<'dom> for LayoutDom<'dom, Node> { #[inline] #[allow(unsafe_code)] - unsafe fn take_opaque_style_and_layout_data(self) -> OpaqueStyleAndLayoutData { + unsafe fn take_style_and_opaque_layout_data(self) -> Box { (*self.unsafe_get().style_and_layout_data.get()) .take() .unwrap() diff --git a/components/script_layout_interface/lib.rs b/components/script_layout_interface/lib.rs index 6fb859aa112..651c0815f9f 100644 --- a/components/script_layout_interface/lib.rs +++ b/components/script_layout_interface/lib.rs @@ -29,12 +29,13 @@ use std::any::Any; use std::sync::atomic::AtomicIsize; use style::data::ElementData; -#[repr(C)] +#[derive(MallocSizeOf)] pub struct StyleData { /// Data that the style system associates with a node. When the /// style system is being used standalone, this is all that hangs /// off the node. This must be first to permit the various /// transmutations between ElementData and PersistentLayoutData. + #[ignore_malloc_size_of = "This probably should not be ignored"] pub element_data: AtomicRefCell, /// Information needed during parallel traversals. @@ -50,37 +51,33 @@ impl StyleData { } } +pub type StyleAndOpaqueLayoutData = StyleAndGenericData; + #[derive(MallocSizeOf)] -pub struct OpaqueStyleAndLayoutData { - // NB: We really store a `StyleAndLayoutData` here, so be careful! +pub struct StyleAndGenericData +where + T: ?Sized, +{ + /// The style data. + pub style_data: StyleData, + /// The opaque layout data. #[ignore_malloc_size_of = "Trait objects are hard"] - ptr: Box, + pub generic_data: T, } -impl OpaqueStyleAndLayoutData { +impl StyleAndOpaqueLayoutData { #[inline] - pub fn new(value: T) -> Self + pub fn new(style_data: StyleData, layout_data: T) -> Box where T: Any + Send + Sync, { - Self { - ptr: Box::new(value) as Box, - } - } - - /// Extremely cursed. - #[inline] - pub fn downcast_ref(&self) -> Option<&T> - where - T: Any + Send + Sync, - { - self.ptr.downcast_ref() + Box::new(StyleAndGenericData { + style_data, + generic_data: layout_data, + }) } } -#[allow(unsafe_code)] -unsafe impl Send for OpaqueStyleAndLayoutData {} - /// Information that we need stored in each DOM node. #[derive(MallocSizeOf)] pub struct DomParallelInfo { diff --git a/components/script_layout_interface/wrapper_traits.rs b/components/script_layout_interface/wrapper_traits.rs index 5d7768cbe12..2056129244b 100644 --- a/components/script_layout_interface/wrapper_traits.rs +++ b/components/script_layout_interface/wrapper_traits.rs @@ -7,8 +7,8 @@ use crate::HTMLCanvasData; use crate::HTMLMediaData; use crate::LayoutNodeType; -use crate::OpaqueStyleAndLayoutData; use crate::SVGSVGData; +use crate::StyleAndOpaqueLayoutData; use atomic_refcell::AtomicRef; use gfx_traits::{combine_id_with_fragment_type, ByteIndex, FragmentType}; use html5ever::{LocalName, Namespace}; @@ -79,13 +79,13 @@ impl PseudoElementType { } /// Trait to abstract access to layout data across various data structures. -pub trait GetOpaqueStyleAndLayoutData<'dom> { - fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData>; +pub trait GetStyleAndOpaqueLayoutData<'dom> { + fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData>; } /// A wrapper so that layout can access only the methods that it should have access to. Layout must /// only ever see these and must never see instances of `LayoutDom`. -pub trait LayoutNode<'dom>: Debug + GetOpaqueStyleAndLayoutData<'dom> + TNode { +pub trait LayoutNode<'dom>: Debug + GetStyleAndOpaqueLayoutData<'dom> + TNode { type ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode<'dom>; fn to_threadsafe(&self) -> Self::ConcreteThreadSafeLayoutNode; @@ -93,8 +93,8 @@ pub trait LayoutNode<'dom>: Debug + GetOpaqueStyleAndLayoutData<'dom> + TNode { fn type_id(&self) -> LayoutNodeType; unsafe fn initialize_data(&self); - unsafe fn init_opaque_style_and_layout_data(&self, data: OpaqueStyleAndLayoutData); - unsafe fn take_opaque_style_and_layout_data(&self) -> OpaqueStyleAndLayoutData; + unsafe fn init_style_and_opaque_layout_data(&self, data: Box); + unsafe fn take_style_and_opaque_layout_data(&self) -> Box; fn rev_children(self) -> LayoutIterator> { LayoutIterator(ReverseChildrenIterator { @@ -160,7 +160,7 @@ where /// A thread-safe version of `LayoutNode`, used during flow construction. This type of layout /// node does not allow any parents or siblings of nodes to be accessed, to avoid races. pub trait ThreadSafeLayoutNode<'dom>: - Clone + Copy + Debug + GetOpaqueStyleAndLayoutData<'dom> + NodeInfo + PartialEq + Sized + Clone + Copy + Debug + GetStyleAndOpaqueLayoutData<'dom> + NodeInfo + PartialEq + Sized { type ConcreteNode: LayoutNode<'dom, ConcreteThreadSafeLayoutNode = Self>; type ConcreteElement: TElement; @@ -224,7 +224,7 @@ pub trait ThreadSafeLayoutNode<'dom>: .map_or(PseudoElementType::Normal, |el| el.get_pseudo_element_type()) } - fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData>; + fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData>; fn style(&self, context: &SharedStyleContext) -> Arc { if let Some(el) = self.as_element() { @@ -319,7 +319,7 @@ pub trait ThreadSafeLayoutElement<'dom>: + Sized + Debug + ::selectors::Element - + GetOpaqueStyleAndLayoutData<'dom> + + GetStyleAndOpaqueLayoutData<'dom> { type ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode< 'dom,