Replace OpaqueStyleAndLayoutData by StyleAndOpaqueLayoutData

This commit is contained in:
Anthony Ramine 2020-04-06 14:42:05 +02:00
parent 88d79fe46d
commit 030a1cf8fb
12 changed files with 129 additions and 162 deletions

View file

@ -6,25 +6,14 @@ use crate::construct::ConstructionResult;
use atomic_refcell::AtomicRefCell; use atomic_refcell::AtomicRefCell;
use script_layout_interface::StyleData; use script_layout_interface::StyleData;
#[repr(C)] pub struct StyleAndLayoutData<'dom> {
pub struct StyleAndLayoutData {
/// The style data associated with a node. /// The style data associated with a node.
pub style_data: StyleData, pub style_data: &'dom StyleData,
/// The layout data associated with a node. /// The layout data associated with a node.
pub layout_data: AtomicRefCell<LayoutData>, pub layout_data: &'dom AtomicRefCell<LayoutData>,
}
impl StyleAndLayoutData {
pub fn new() -> Self {
Self {
style_data: StyleData::new(),
layout_data: AtomicRefCell::new(LayoutData::new()),
}
}
} }
/// Data that layout associates with a node. /// Data that layout associates with a node.
#[repr(C)]
pub struct LayoutData { pub struct LayoutData {
/// The current results of flow construction for this node. This is either a /// The current results of flow construction for this node. This is either a
/// flow or a `ConstructionItem`. See comments in `construct.rs` for more /// flow or a `ConstructionItem`. See comments in `construct.rs` for more

View file

@ -6,7 +6,6 @@
use crate::construct::ConstructionResult; use crate::construct::ConstructionResult;
use crate::context::LayoutContext; use crate::context::LayoutContext;
use crate::data::StyleAndLayoutData;
use crate::display_list::items::{DisplayList, OpaqueNode, ScrollOffsetMap}; use crate::display_list::items::{DisplayList, OpaqueNode, ScrollOffsetMap};
use crate::display_list::IndexableText; use crate::display_list::IndexableText;
use crate::flow::{Flow, GetBaseFlow}; use crate::flow::{Flow, GetBaseFlow};
@ -1036,24 +1035,12 @@ fn inner_text_collection_steps<'dom>(
_ => child, _ => child,
}; };
let element_data = { let element_data = match node.get_style_and_opaque_layout_data() {
&node Some(data) => &data.style_data.element_data,
.get_opaque_style_and_layout_data() None => continue,
.as_ref()
.map(|opaque| {
&opaque
.downcast_ref::<StyleAndLayoutData>()
.unwrap()
.style_data
.element_data
})
}; };
if element_data.is_none() { let style = match element_data.borrow().styles.get_primary() {
continue;
}
let style = match element_data.unwrap().borrow().styles.get_primary() {
None => continue, None => continue,
Some(style) => style.clone(), Some(style) => style.clone(),
}; };

View file

@ -32,7 +32,7 @@
use crate::data::{LayoutData, LayoutDataFlags, StyleAndLayoutData}; use crate::data::{LayoutData, LayoutDataFlags, StyleAndLayoutData};
use atomic_refcell::{AtomicRef, AtomicRefMut}; 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 script_layout_interface::wrapper_traits::{ThreadSafeLayoutElement, ThreadSafeLayoutNode};
use style::dom::{NodeInfo, TNode}; use style::dom::{NodeInfo, TNode};
use style::selector_parser::RestyleDamage; use style::selector_parser::RestyleDamage;
@ -47,7 +47,7 @@ pub trait LayoutNodeLayoutData<'dom> {
impl<'dom, T> LayoutNodeLayoutData<'dom> for T impl<'dom, T> LayoutNodeLayoutData<'dom> for T
where where
T: GetOpaqueStyleAndLayoutData<'dom>, T: GetStyleAndOpaqueLayoutData<'dom>,
{ {
fn borrow_layout_data(self) -> Option<AtomicRef<'dom, LayoutData>> { fn borrow_layout_data(self) -> Option<AtomicRef<'dom, LayoutData>> {
self.get_style_and_layout_data() self.get_style_and_layout_data()
@ -66,16 +66,19 @@ where
} }
pub trait GetStyleAndLayoutData<'dom> { pub trait GetStyleAndLayoutData<'dom> {
fn get_style_and_layout_data(self) -> Option<&'dom StyleAndLayoutData>; fn get_style_and_layout_data(self) -> Option<StyleAndLayoutData<'dom>>;
} }
impl<'dom, T> GetStyleAndLayoutData<'dom> for T impl<'dom, T> GetStyleAndLayoutData<'dom> for T
where where
T: GetOpaqueStyleAndLayoutData<'dom>, T: GetStyleAndOpaqueLayoutData<'dom>,
{ {
fn get_style_and_layout_data(self) -> Option<&'dom StyleAndLayoutData> { fn get_style_and_layout_data(self) -> Option<StyleAndLayoutData<'dom>> {
self.get_opaque_style_and_layout_data() self.get_style_and_opaque_layout_data()
.map(|opaque| opaque.downcast_ref().unwrap()) .map(|data| StyleAndLayoutData {
style_data: &data.style_data,
layout_data: data.generic_data.downcast_ref().unwrap(),
})
} }
} }

View file

@ -6,17 +6,7 @@ use crate::element_data::LayoutDataForElement;
use atomic_refcell::AtomicRefCell; use atomic_refcell::AtomicRefCell;
use script_layout_interface::StyleData; use script_layout_interface::StyleData;
#[repr(C)] pub struct StyleAndLayoutData<'dom> {
pub struct StyleAndLayoutData { pub style_data: &'dom StyleData,
pub style_data: StyleData, pub(super) layout_data: &'dom AtomicRefCell<LayoutDataForElement>,
pub(super) layout_data: AtomicRefCell<LayoutDataForElement>,
}
impl StyleAndLayoutData {
pub fn new() -> Self {
Self {
style_data: StyleData::new(),
layout_data: Default::default(),
}
}
} }

View file

@ -14,7 +14,7 @@ pub mod context;
pub mod data; pub mod data;
pub mod display_list; pub mod display_list;
mod dom_traversal; mod dom_traversal;
mod element_data; pub mod element_data;
mod flow; mod flow;
mod formatting_contexts; mod formatting_contexts;
mod fragments; mod fragments;

View file

@ -5,18 +5,21 @@
#![allow(unsafe_code)] #![allow(unsafe_code)]
use crate::data::StyleAndLayoutData; use crate::data::StyleAndLayoutData;
use script_layout_interface::wrapper_traits::GetOpaqueStyleAndLayoutData; use script_layout_interface::wrapper_traits::GetStyleAndOpaqueLayoutData;
pub trait GetStyleAndLayoutData<'dom> { pub trait GetStyleAndLayoutData<'dom> {
fn get_style_and_layout_data(self) -> Option<&'dom StyleAndLayoutData>; fn get_style_and_layout_data(self) -> Option<StyleAndLayoutData<'dom>>;
} }
impl<'dom, T> GetStyleAndLayoutData<'dom> for T impl<'dom, T> GetStyleAndLayoutData<'dom> for T
where where
T: GetOpaqueStyleAndLayoutData<'dom>, T: GetStyleAndOpaqueLayoutData<'dom>,
{ {
fn get_style_and_layout_data(self) -> Option<&'dom StyleAndLayoutData> { fn get_style_and_layout_data(self) -> Option<StyleAndLayoutData<'dom>> {
self.get_opaque_style_and_layout_data() self.get_style_and_opaque_layout_data()
.map(|opaque| opaque.downcast_ref().unwrap()) .map(|data| StyleAndLayoutData {
style_data: &data.style_data,
layout_data: data.generic_data.downcast_ref().unwrap(),
})
} }
} }

View file

@ -30,10 +30,10 @@
#![allow(unsafe_code)] #![allow(unsafe_code)]
use atomic_refcell::{AtomicRef, AtomicRefMut}; use atomic_refcell::{AtomicRef, AtomicRefCell, AtomicRefMut};
use gfx_traits::ByteIndex; use gfx_traits::ByteIndex;
use html5ever::{LocalName, Namespace}; use html5ever::{LocalName, Namespace};
use layout::data::StyleAndLayoutData; use layout::data::LayoutData;
use layout::wrapper::GetStyleAndLayoutData; use layout::wrapper::GetStyleAndLayoutData;
use msg::constellation_msg::{BrowsingContextId, PipelineId}; use msg::constellation_msg::{BrowsingContextId, PipelineId};
use net_traits::image::base::{Image, ImageMetadata}; use net_traits::image::base::{Image, ImageMetadata};
@ -50,13 +50,13 @@ use script::layout_exports::{
LayoutDom, LayoutElementHelpers, LayoutNodeHelpers, LayoutShadowRootHelpers, LayoutDom, LayoutElementHelpers, LayoutNodeHelpers, LayoutShadowRootHelpers,
}; };
use script_layout_interface::wrapper_traits::{ use script_layout_interface::wrapper_traits::{
DangerousThreadSafeLayoutNode, GetOpaqueStyleAndLayoutData, LayoutNode, DangerousThreadSafeLayoutNode, GetStyleAndOpaqueLayoutData, LayoutNode,
}; };
use script_layout_interface::wrapper_traits::{ use script_layout_interface::wrapper_traits::{
PseudoElementType, ThreadSafeLayoutElement, ThreadSafeLayoutNode, PseudoElementType, ThreadSafeLayoutElement, ThreadSafeLayoutNode,
}; };
use script_layout_interface::{ use script_layout_interface::{
HTMLCanvasData, HTMLMediaData, LayoutNodeType, OpaqueStyleAndLayoutData, HTMLCanvasData, HTMLMediaData, LayoutNodeType, StyleAndOpaqueLayoutData,
}; };
use script_layout_interface::{SVGSVGData, StyleData, TrustedNodeAddress}; use script_layout_interface::{SVGSVGData, StyleData, TrustedNodeAddress};
use selectors::attr::{AttrSelectorOperation, CaseSensitivity, NamespaceConstraint}; use selectors::attr::{AttrSelectorOperation, CaseSensitivity, NamespaceConstraint};
@ -269,17 +269,20 @@ impl<'ln> LayoutNode<'ln> for ServoLayoutNode<'ln> {
unsafe fn initialize_data(&self) { unsafe fn initialize_data(&self) {
if self.get_style_and_layout_data().is_none() { if self.get_style_and_layout_data().is_none() {
let opaque = OpaqueStyleAndLayoutData::new(StyleAndLayoutData::new()); let opaque = StyleAndOpaqueLayoutData::new(
self.init_opaque_style_and_layout_data(opaque); 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) { unsafe fn init_style_and_opaque_layout_data(&self, data: Box<StyleAndOpaqueLayoutData>) {
self.get_jsmanaged().init_opaque_style_and_layout_data(data); self.get_jsmanaged().init_style_and_opaque_layout_data(data);
} }
unsafe fn take_opaque_style_and_layout_data(&self) -> OpaqueStyleAndLayoutData { unsafe fn take_style_and_opaque_layout_data(&self) -> Box<StyleAndOpaqueLayoutData> {
self.get_jsmanaged().take_opaque_style_and_layout_data() self.get_jsmanaged().take_style_and_opaque_layout_data()
} }
fn is_connected(&self) -> bool { fn is_connected(&self) -> bool {
@ -287,27 +290,27 @@ impl<'ln> LayoutNode<'ln> for ServoLayoutNode<'ln> {
} }
} }
impl<'dom> GetOpaqueStyleAndLayoutData<'dom> for ServoLayoutNode<'dom> { impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoLayoutNode<'dom> {
fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> { fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> {
self.get_jsmanaged().get_opaque_style_and_layout_data() self.get_jsmanaged().get_style_and_opaque_layout_data()
} }
} }
impl<'dom> GetOpaqueStyleAndLayoutData<'dom> for ServoLayoutElement<'dom> { impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoLayoutElement<'dom> {
fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> { fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> {
self.as_node().get_opaque_style_and_layout_data() self.as_node().get_style_and_opaque_layout_data()
} }
} }
impl<'dom> GetOpaqueStyleAndLayoutData<'dom> for ServoThreadSafeLayoutNode<'dom> { impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoThreadSafeLayoutNode<'dom> {
fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> { fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> {
self.node.get_opaque_style_and_layout_data() self.node.get_style_and_opaque_layout_data()
} }
} }
impl<'dom> GetOpaqueStyleAndLayoutData<'dom> for ServoThreadSafeLayoutElement<'dom> { impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoThreadSafeLayoutElement<'dom> {
fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> { fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> {
self.element.as_node().get_opaque_style_and_layout_data() 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) { unsafe fn clear_data(&self) {
if self.get_style_and_layout_data().is_some() { 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> { fn get_style_data(&self) -> Option<&StyleData> {
self.get_opaque_style_and_layout_data().map(|opaque| { self.get_style_and_opaque_layout_data()
&opaque .map(|data| &data.style_data)
.downcast_ref::<StyleAndLayoutData>()
.unwrap()
.style_data
})
} }
pub unsafe fn unset_snapshot_flags(&self) { 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> { fn get_style_and_opaque_layout_data(self) -> Option<&'ln StyleAndOpaqueLayoutData> {
self.node.get_opaque_style_and_layout_data() self.node.get_style_and_opaque_layout_data()
} }
fn is_ignorable_whitespace(&self, context: &SharedStyleContext) -> bool { fn is_ignorable_whitespace(&self, context: &SharedStyleContext) -> bool {

View file

@ -30,10 +30,10 @@
#![allow(unsafe_code)] #![allow(unsafe_code)]
use atomic_refcell::{AtomicRef, AtomicRefMut}; use atomic_refcell::{AtomicRef, AtomicRefCell, AtomicRefMut};
use gfx_traits::ByteIndex; use gfx_traits::ByteIndex;
use html5ever::{LocalName, Namespace}; use html5ever::{LocalName, Namespace};
use layout::data::StyleAndLayoutData; use layout::element_data::LayoutDataForElement;
use layout::wrapper::GetStyleAndLayoutData; use layout::wrapper::GetStyleAndLayoutData;
use msg::constellation_msg::{BrowsingContextId, PipelineId}; use msg::constellation_msg::{BrowsingContextId, PipelineId};
use net_traits::image::base::{Image, ImageMetadata}; use net_traits::image::base::{Image, ImageMetadata};
@ -50,13 +50,13 @@ use script::layout_exports::{
LayoutDom, LayoutElementHelpers, LayoutNodeHelpers, LayoutShadowRootHelpers, LayoutDom, LayoutElementHelpers, LayoutNodeHelpers, LayoutShadowRootHelpers,
}; };
use script_layout_interface::wrapper_traits::{ use script_layout_interface::wrapper_traits::{
DangerousThreadSafeLayoutNode, GetOpaqueStyleAndLayoutData, LayoutNode, DangerousThreadSafeLayoutNode, GetStyleAndOpaqueLayoutData, LayoutNode,
}; };
use script_layout_interface::wrapper_traits::{ use script_layout_interface::wrapper_traits::{
PseudoElementType, ThreadSafeLayoutElement, ThreadSafeLayoutNode, PseudoElementType, ThreadSafeLayoutElement, ThreadSafeLayoutNode,
}; };
use script_layout_interface::{ use script_layout_interface::{
HTMLCanvasData, HTMLMediaData, LayoutNodeType, OpaqueStyleAndLayoutData, HTMLCanvasData, HTMLMediaData, LayoutNodeType, StyleAndOpaqueLayoutData,
}; };
use script_layout_interface::{SVGSVGData, StyleData, TrustedNodeAddress}; use script_layout_interface::{SVGSVGData, StyleData, TrustedNodeAddress};
use selectors::attr::{AttrSelectorOperation, CaseSensitivity, NamespaceConstraint}; use selectors::attr::{AttrSelectorOperation, CaseSensitivity, NamespaceConstraint};
@ -276,17 +276,20 @@ impl<'ln> LayoutNode<'ln> for ServoLayoutNode<'ln> {
unsafe fn initialize_data(&self) { unsafe fn initialize_data(&self) {
if self.get_style_and_layout_data().is_none() { if self.get_style_and_layout_data().is_none() {
let opaque = OpaqueStyleAndLayoutData::new(StyleAndLayoutData::new()); let opaque = StyleAndOpaqueLayoutData::new(
self.init_opaque_style_and_layout_data(opaque); 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) { unsafe fn init_style_and_opaque_layout_data(&self, data: Box<StyleAndOpaqueLayoutData>) {
self.get_jsmanaged().init_opaque_style_and_layout_data(data); self.get_jsmanaged().init_style_and_opaque_layout_data(data);
} }
unsafe fn take_opaque_style_and_layout_data(&self) -> OpaqueStyleAndLayoutData { unsafe fn take_style_and_opaque_layout_data(&self) -> Box<StyleAndOpaqueLayoutData> {
self.get_jsmanaged().take_opaque_style_and_layout_data() self.get_jsmanaged().take_style_and_opaque_layout_data()
} }
fn is_connected(&self) -> bool { fn is_connected(&self) -> bool {
@ -294,27 +297,27 @@ impl<'ln> LayoutNode<'ln> for ServoLayoutNode<'ln> {
} }
} }
impl<'dom> GetOpaqueStyleAndLayoutData<'dom> for ServoLayoutNode<'dom> { impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoLayoutNode<'dom> {
fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> { fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> {
unsafe { self.get_jsmanaged().get_opaque_style_and_layout_data() } unsafe { self.get_jsmanaged().get_style_and_opaque_layout_data() }
} }
} }
impl<'dom> GetOpaqueStyleAndLayoutData<'dom> for ServoLayoutElement<'dom> { impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoLayoutElement<'dom> {
fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> { fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> {
self.as_node().get_opaque_style_and_layout_data() self.as_node().get_style_and_opaque_layout_data()
} }
} }
impl<'dom> GetOpaqueStyleAndLayoutData<'dom> for ServoThreadSafeLayoutNode<'dom> { impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoThreadSafeLayoutNode<'dom> {
fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> { fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> {
self.node.get_opaque_style_and_layout_data() self.node.get_style_and_opaque_layout_data()
} }
} }
impl<'dom> GetOpaqueStyleAndLayoutData<'dom> for ServoThreadSafeLayoutElement<'dom> { impl<'dom> GetStyleAndOpaqueLayoutData<'dom> for ServoThreadSafeLayoutElement<'dom> {
fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> { fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> {
self.element.as_node().get_opaque_style_and_layout_data() 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) { unsafe fn clear_data(&self) {
if self.get_style_and_layout_data().is_some() { 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> { fn get_style_data(&self) -> Option<&StyleData> {
self.get_opaque_style_and_layout_data().map(|opaque| { self.get_style_and_opaque_layout_data()
&opaque .map(|data| &data.style_data)
.downcast_ref::<StyleAndLayoutData>()
.unwrap()
.style_data
})
} }
pub unsafe fn unset_snapshot_flags(&self) { 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> { fn get_style_and_opaque_layout_data(self) -> Option<&'ln StyleAndOpaqueLayoutData> {
self.node.get_opaque_style_and_layout_data() self.node.get_style_and_opaque_layout_data()
} }
fn is_ignorable_whitespace(&self, context: &SharedStyleContext) -> bool { fn is_ignorable_whitespace(&self, context: &SharedStyleContext) -> bool {

View file

@ -97,7 +97,7 @@ use profile_traits::mem::ProfilerChan as MemProfilerChan;
use profile_traits::time::ProfilerChan as TimeProfilerChan; use profile_traits::time::ProfilerChan as TimeProfilerChan;
use script_layout_interface::message::PendingRestyle; use script_layout_interface::message::PendingRestyle;
use script_layout_interface::rpc::LayoutRPC; use script_layout_interface::rpc::LayoutRPC;
use script_layout_interface::OpaqueStyleAndLayoutData; use script_layout_interface::StyleAndOpaqueLayoutData;
use script_traits::serializable::BlobImpl; use script_traits::serializable::BlobImpl;
use script_traits::transferable::MessagePortImpl; use script_traits::transferable::MessagePortImpl;
use script_traits::{DocumentActivity, DrawAPaintImageResult}; use script_traits::{DocumentActivity, DrawAPaintImageResult};
@ -508,7 +508,7 @@ unsafe_no_jsmanaged_fields!(StatusCode);
unsafe_no_jsmanaged_fields!(SystemTime); unsafe_no_jsmanaged_fields!(SystemTime);
unsafe_no_jsmanaged_fields!(Instant); unsafe_no_jsmanaged_fields!(Instant);
unsafe_no_jsmanaged_fields!(RelativePos); unsafe_no_jsmanaged_fields!(RelativePos);
unsafe_no_jsmanaged_fields!(OpaqueStyleAndLayoutData); unsafe_no_jsmanaged_fields!(StyleAndOpaqueLayoutData);
unsafe_no_jsmanaged_fields!(PathBuf); unsafe_no_jsmanaged_fields!(PathBuf);
unsafe_no_jsmanaged_fields!(DrawAPaintImageResult); unsafe_no_jsmanaged_fields!(DrawAPaintImageResult);
unsafe_no_jsmanaged_fields!(DocumentId); unsafe_no_jsmanaged_fields!(DocumentId);

View file

@ -76,7 +76,7 @@ use msg::constellation_msg::{BrowsingContextId, PipelineId};
use net_traits::image::base::{Image, ImageMetadata}; use net_traits::image::base::{Image, ImageMetadata};
use ref_slice::ref_slice; use ref_slice::ref_slice;
use script_layout_interface::{HTMLCanvasData, HTMLMediaData, LayoutElementType, LayoutNodeType}; 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::DocumentActivity;
use script_traits::UntrustedNodeAddress; use script_traits::UntrustedNodeAddress;
use selectors::matching::{matches_selector_list, MatchingContext, MatchingMode}; 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 /// Must be sent back to the layout thread to be destroyed when this
/// node is finalized. /// node is finalized.
#[ignore_malloc_size_of = "shrug"] #[ignore_malloc_size_of = "Unsafe cell"]
style_and_layout_data: UnsafeCell<Option<OpaqueStyleAndLayoutData>>, style_and_layout_data: UnsafeCell<Option<Box<StyleAndOpaqueLayoutData>>>,
} }
bitflags! { bitflags! {
@ -1282,9 +1282,9 @@ pub trait LayoutNodeHelpers<'dom> {
fn children_count(self) -> u32; fn children_count(self) -> u32;
fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData>; fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData>;
unsafe fn init_opaque_style_and_layout_data(self, data: OpaqueStyleAndLayoutData); unsafe fn init_style_and_opaque_layout_data(self, data: Box<StyleAndOpaqueLayoutData>);
unsafe fn take_opaque_style_and_layout_data(self) -> OpaqueStyleAndLayoutData; unsafe fn take_style_and_opaque_layout_data(self) -> Box<StyleAndOpaqueLayoutData>;
fn text_content(self) -> Cow<'dom, str>; fn text_content(self) -> Cow<'dom, str>;
fn selection(self) -> Option<Range<usize>>; fn selection(self) -> Option<Range<usize>>;
@ -1410,13 +1410,13 @@ impl<'dom> LayoutNodeHelpers<'dom> for LayoutDom<'dom, Node> {
#[inline] #[inline]
#[allow(unsafe_code)] #[allow(unsafe_code)]
fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> { fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> {
unsafe { (*self.unsafe_get().style_and_layout_data.get()).as_ref() } unsafe { (*self.unsafe_get().style_and_layout_data.get()).as_deref() }
} }
#[inline] #[inline]
#[allow(unsafe_code)] #[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<StyleAndOpaqueLayoutData>) {
let data = &mut *self.unsafe_get().style_and_layout_data.get(); let data = &mut *self.unsafe_get().style_and_layout_data.get();
debug_assert!(data.is_none()); debug_assert!(data.is_none());
*data = Some(val); *data = Some(val);
@ -1424,7 +1424,7 @@ impl<'dom> LayoutNodeHelpers<'dom> for LayoutDom<'dom, Node> {
#[inline] #[inline]
#[allow(unsafe_code)] #[allow(unsafe_code)]
unsafe fn take_opaque_style_and_layout_data(self) -> OpaqueStyleAndLayoutData { unsafe fn take_style_and_opaque_layout_data(self) -> Box<StyleAndOpaqueLayoutData> {
(*self.unsafe_get().style_and_layout_data.get()) (*self.unsafe_get().style_and_layout_data.get())
.take() .take()
.unwrap() .unwrap()

View file

@ -29,12 +29,13 @@ use std::any::Any;
use std::sync::atomic::AtomicIsize; use std::sync::atomic::AtomicIsize;
use style::data::ElementData; use style::data::ElementData;
#[repr(C)] #[derive(MallocSizeOf)]
pub struct StyleData { pub struct StyleData {
/// Data that the style system associates with a node. When the /// Data that the style system associates with a node. When the
/// style system is being used standalone, this is all that hangs /// style system is being used standalone, this is all that hangs
/// off the node. This must be first to permit the various /// off the node. This must be first to permit the various
/// transmutations between ElementData and PersistentLayoutData. /// transmutations between ElementData and PersistentLayoutData.
#[ignore_malloc_size_of = "This probably should not be ignored"]
pub element_data: AtomicRefCell<ElementData>, pub element_data: AtomicRefCell<ElementData>,
/// Information needed during parallel traversals. /// Information needed during parallel traversals.
@ -50,37 +51,33 @@ impl StyleData {
} }
} }
pub type StyleAndOpaqueLayoutData = StyleAndGenericData<dyn Any + Send + Sync>;
#[derive(MallocSizeOf)] #[derive(MallocSizeOf)]
pub struct OpaqueStyleAndLayoutData { pub struct StyleAndGenericData<T>
// NB: We really store a `StyleAndLayoutData` here, so be careful! where
T: ?Sized,
{
/// The style data.
pub style_data: StyleData,
/// The opaque layout data.
#[ignore_malloc_size_of = "Trait objects are hard"] #[ignore_malloc_size_of = "Trait objects are hard"]
ptr: Box<dyn Any + Send + Sync>, pub generic_data: T,
} }
impl OpaqueStyleAndLayoutData { impl StyleAndOpaqueLayoutData {
#[inline] #[inline]
pub fn new<T>(value: T) -> Self pub fn new<T>(style_data: StyleData, layout_data: T) -> Box<Self>
where where
T: Any + Send + Sync, T: Any + Send + Sync,
{ {
Self { Box::new(StyleAndGenericData {
ptr: Box::new(value) as Box<dyn Any + Send + Sync>, style_data,
generic_data: layout_data,
})
} }
} }
/// Extremely cursed.
#[inline]
pub fn downcast_ref<T>(&self) -> Option<&T>
where
T: Any + Send + Sync,
{
self.ptr.downcast_ref()
}
}
#[allow(unsafe_code)]
unsafe impl Send for OpaqueStyleAndLayoutData {}
/// Information that we need stored in each DOM node. /// Information that we need stored in each DOM node.
#[derive(MallocSizeOf)] #[derive(MallocSizeOf)]
pub struct DomParallelInfo { pub struct DomParallelInfo {

View file

@ -7,8 +7,8 @@
use crate::HTMLCanvasData; use crate::HTMLCanvasData;
use crate::HTMLMediaData; use crate::HTMLMediaData;
use crate::LayoutNodeType; use crate::LayoutNodeType;
use crate::OpaqueStyleAndLayoutData;
use crate::SVGSVGData; use crate::SVGSVGData;
use crate::StyleAndOpaqueLayoutData;
use atomic_refcell::AtomicRef; use atomic_refcell::AtomicRef;
use gfx_traits::{combine_id_with_fragment_type, ByteIndex, FragmentType}; use gfx_traits::{combine_id_with_fragment_type, ByteIndex, FragmentType};
use html5ever::{LocalName, Namespace}; use html5ever::{LocalName, Namespace};
@ -79,13 +79,13 @@ impl PseudoElementType {
} }
/// Trait to abstract access to layout data across various data structures. /// Trait to abstract access to layout data across various data structures.
pub trait GetOpaqueStyleAndLayoutData<'dom> { pub trait GetStyleAndOpaqueLayoutData<'dom> {
fn get_opaque_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData>; 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 /// 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`. /// 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>; type ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode<'dom>;
fn to_threadsafe(&self) -> Self::ConcreteThreadSafeLayoutNode; fn to_threadsafe(&self) -> Self::ConcreteThreadSafeLayoutNode;
@ -93,8 +93,8 @@ pub trait LayoutNode<'dom>: Debug + GetOpaqueStyleAndLayoutData<'dom> + TNode {
fn type_id(&self) -> LayoutNodeType; fn type_id(&self) -> LayoutNodeType;
unsafe fn initialize_data(&self); unsafe fn initialize_data(&self);
unsafe fn init_opaque_style_and_layout_data(&self, data: OpaqueStyleAndLayoutData); unsafe fn init_style_and_opaque_layout_data(&self, data: Box<StyleAndOpaqueLayoutData>);
unsafe fn take_opaque_style_and_layout_data(&self) -> OpaqueStyleAndLayoutData; unsafe fn take_style_and_opaque_layout_data(&self) -> Box<StyleAndOpaqueLayoutData>;
fn rev_children(self) -> LayoutIterator<ReverseChildrenIterator<Self>> { fn rev_children(self) -> LayoutIterator<ReverseChildrenIterator<Self>> {
LayoutIterator(ReverseChildrenIterator { LayoutIterator(ReverseChildrenIterator {
@ -160,7 +160,7 @@ where
/// A thread-safe version of `LayoutNode`, used during flow construction. This type of layout /// 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. /// node does not allow any parents or siblings of nodes to be accessed, to avoid races.
pub trait ThreadSafeLayoutNode<'dom>: 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 ConcreteNode: LayoutNode<'dom, ConcreteThreadSafeLayoutNode = Self>;
type ConcreteElement: TElement; type ConcreteElement: TElement;
@ -224,7 +224,7 @@ pub trait ThreadSafeLayoutNode<'dom>:
.map_or(PseudoElementType::Normal, |el| el.get_pseudo_element_type()) .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<ComputedValues> { fn style(&self, context: &SharedStyleContext) -> Arc<ComputedValues> {
if let Some(el) = self.as_element() { if let Some(el) = self.as_element() {
@ -319,7 +319,7 @@ pub trait ThreadSafeLayoutElement<'dom>:
+ Sized + Sized
+ Debug + Debug
+ ::selectors::Element<Impl = SelectorImpl> + ::selectors::Element<Impl = SelectorImpl>
+ GetOpaqueStyleAndLayoutData<'dom> + GetStyleAndOpaqueLayoutData<'dom>
{ {
type ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode< type ConcreteThreadSafeLayoutNode: ThreadSafeLayoutNode<
'dom, 'dom,