diff options
Diffstat (limited to 'components/shared/script_layout/wrapper_traits.rs')
-rw-r--r-- | components/shared/script_layout/wrapper_traits.rs | 49 |
1 files changed, 29 insertions, 20 deletions
diff --git a/components/shared/script_layout/wrapper_traits.rs b/components/shared/script_layout/wrapper_traits.rs index ad37763c202..c1bd1fc4d95 100644 --- a/components/shared/script_layout/wrapper_traits.rs +++ b/components/shared/script_layout/wrapper_traits.rs @@ -25,7 +25,9 @@ use style::selector_parser::{PseudoElement, PseudoElementCascadeType, SelectorIm use style::stylist::RuleInclusion; use webrender_api::ExternalScrollId; -use crate::{HTMLCanvasData, HTMLMediaData, LayoutNodeType, SVGSVGData, StyleAndOpaqueLayoutData}; +use crate::{ + GenericLayoutData, HTMLCanvasData, HTMLMediaData, LayoutNodeType, SVGSVGData, StyleData, +}; pub trait LayoutDataTrait: Default + Send + Sync + 'static {} @@ -70,19 +72,12 @@ impl PseudoElementType { } } -/// Trait to abstract access to layout data across various data structures. -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`. /// FIXME(mrobinson): `Send + Sync` is required here for Layout 2020, but eventually it /// should stop sending LayoutNodes to other threads and rely on ThreadSafeLayoutNode /// or some other mechanism to ensure thread safety. -pub trait LayoutNode<'dom>: - Copy + Debug + GetStyleAndOpaqueLayoutData<'dom> + TNode + Send + Sync -{ +pub trait LayoutNode<'dom>: Copy + Debug + TNode + Send + Sync { type ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode<'dom>; fn to_threadsafe(&self) -> Self::ConcreteThreadSafeLayoutNode; @@ -96,7 +91,23 @@ pub trait LayoutNode<'dom>: /// This method is unsafe because it modifies the given node during /// layout. Callers should ensure that no other layout thread is /// attempting to read or modify the opaque layout data of this node. - unsafe fn initialize_data(&self); + unsafe fn initialize_style_and_layout_data<RequestedLayoutDataType: LayoutDataTrait>(&self); + + /// Initialize this node with empty opaque layout data. + /// + /// # Safety + /// + /// This method is unsafe because it modifies the given node during + /// layout. Callers should ensure that no other layout thread is + /// attempting to read or modify the opaque layout data of this node. + fn initialize_layout_data<RequestedLayoutDataType: LayoutDataTrait>(&self); + + /// Get the [`StyleData`] for this node. Returns None if the node is unstyled. + fn style_data(&self) -> Option<&'dom StyleData>; + + /// Get the layout data of this node, attempting to downcast it to the desired type. + /// Returns None if there is no layout data or it isn't of the desired type. + fn layout_data(&self) -> Option<&'dom GenericLayoutData>; fn rev_children(self) -> LayoutIterator<ReverseChildrenIterator<Self>> { LayoutIterator(ReverseChildrenIterator { @@ -162,9 +173,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 + GetStyleAndOpaqueLayoutData<'dom> + NodeInfo + PartialEq + Sized -{ +pub trait ThreadSafeLayoutNode<'dom>: Clone + Copy + Debug + NodeInfo + PartialEq + Sized { type ConcreteNode: LayoutNode<'dom, ConcreteThreadSafeLayoutNode = Self>; type ConcreteElement: TElement; @@ -227,7 +236,12 @@ pub trait ThreadSafeLayoutNode<'dom>: .map_or(PseudoElementType::Normal, |el| el.get_pseudo_element_type()) } - fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData>; + /// Get the [`StyleData`] for this node. Returns None if the node is unstyled. + fn style_data(&self) -> Option<&'dom StyleData>; + + /// Get the layout data of this node, attempting to downcast it to the desired type. + /// Returns None if there is no layout data or it isn't of the desired type. + fn layout_data(&self) -> Option<&'dom GenericLayoutData>; fn style(&self, context: &SharedStyleContext) -> Arc<ComputedValues> { if let Some(el) = self.as_element() { @@ -309,12 +323,7 @@ pub trait ThreadSafeLayoutNode<'dom>: } pub trait ThreadSafeLayoutElement<'dom>: - Clone - + Copy - + Sized - + Debug - + ::selectors::Element<Impl = SelectorImpl> - + GetStyleAndOpaqueLayoutData<'dom> + Clone + Copy + Sized + Debug + ::selectors::Element<Impl = SelectorImpl> { type ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode< 'dom, |