aboutsummaryrefslogtreecommitdiffstats
path: root/components/shared/script_layout
diff options
context:
space:
mode:
Diffstat (limited to 'components/shared/script_layout')
-rw-r--r--components/shared/script_layout/lib.rs29
-rw-r--r--components/shared/script_layout/wrapper_traits.rs49
2 files changed, 31 insertions, 47 deletions
diff --git a/components/shared/script_layout/lib.rs b/components/shared/script_layout/lib.rs
index aca819980d7..a09e0fcf1aa 100644
--- a/components/shared/script_layout/lib.rs
+++ b/components/shared/script_layout/lib.rs
@@ -47,6 +47,8 @@ use style::stylesheets::Stylesheet;
use style_traits::CSSPixel;
use webrender_api::{ExternalScrollId, ImageKey};
+pub type GenericLayoutData = dyn Any + Send + Sync;
+
#[derive(MallocSizeOf)]
pub struct StyleData {
/// Data that the style system associates with a node. When the
@@ -69,33 +71,6 @@ impl Default for StyleData {
}
}
-pub type StyleAndOpaqueLayoutData = StyleAndGenericData<dyn Any + Send + Sync>;
-
-#[derive(MallocSizeOf)]
-pub struct StyleAndGenericData<T>
-where
- T: ?Sized,
-{
- /// The style data.
- pub style_data: StyleData,
- /// The opaque layout data.
- #[ignore_malloc_size_of = "Trait objects are hard"]
- pub generic_data: T,
-}
-
-impl StyleAndOpaqueLayoutData {
- #[inline]
- pub fn new<T>(style_data: StyleData, layout_data: T) -> Box<Self>
- where
- T: Any + Send + Sync,
- {
- Box::new(StyleAndGenericData {
- style_data,
- generic_data: layout_data,
- })
- }
-}
-
/// Information that we need stored in each DOM node.
#[derive(Default, MallocSizeOf)]
pub struct DomParallelInfo {
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,