diff options
author | Anthony Ramine <nox@nox.paris> | 2020-04-03 18:54:11 +0200 |
---|---|---|
committer | Anthony Ramine <nox@nox.paris> | 2020-04-04 13:10:19 +0200 |
commit | 185a402d9cc41d3e680b99564f5fc8b519ecf129 (patch) | |
tree | 14869f8e2feae209fcf75026fb079021986c13f9 /components/layout_thread | |
parent | 516e8e0aa600cdef34e506e0ed7180d12dd9ac7d (diff) | |
download | servo-185a402d9cc41d3e680b99564f5fc8b519ecf129.tar.gz servo-185a402d9cc41d3e680b99564f5fc8b519ecf129.zip |
Make DOM own the style and layout data, in an UnsafeCell
The previous Cell was a lie.
Diffstat (limited to 'components/layout_thread')
-rw-r--r-- | components/layout_thread/dom_wrapper.rs | 37 | ||||
-rw-r--r-- | components/layout_thread/lib.rs | 8 |
2 files changed, 16 insertions, 29 deletions
diff --git a/components/layout_thread/dom_wrapper.rs b/components/layout_thread/dom_wrapper.rs index 381a0cfa77d..cbd0df1f9a4 100644 --- a/components/layout_thread/dom_wrapper.rs +++ b/components/layout_thread/dom_wrapper.rs @@ -91,10 +91,6 @@ use style::str::is_whitespace; use style::stylist::CascadeData; use style::CaseSensitivityExt; -pub unsafe fn drop_style_and_layout_data(data: OpaqueStyleAndLayoutData) { - drop(Box::from_raw(data.as_ptr())); -} - #[derive(Clone, Copy)] pub struct ServoLayoutNode<'dom> { /// The wrapped node. @@ -234,7 +230,7 @@ impl<'ln> TNode for ServoLayoutNode<'ln> { } fn opaque(&self) -> OpaqueNode { - unsafe { self.get_jsmanaged().opaque() } + self.get_jsmanaged().opaque() } fn debug_id(self) -> usize { @@ -291,34 +287,33 @@ impl<'ln> LayoutNode<'ln> for ServoLayoutNode<'ln> { } } -impl<'ln> GetLayoutData<'ln> for ServoLayoutNode<'ln> { - fn get_style_and_layout_data(&self) -> Option<OpaqueStyleAndLayoutData> { - unsafe { self.get_jsmanaged().get_style_and_layout_data() } +impl<'dom> GetLayoutData<'dom> for ServoLayoutNode<'dom> { + fn get_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> { + self.get_jsmanaged().get_style_and_layout_data() } } -impl<'le> GetLayoutData<'le> for ServoLayoutElement<'le> { - fn get_style_and_layout_data(&self) -> Option<OpaqueStyleAndLayoutData> { +impl<'dom> GetLayoutData<'dom> for ServoLayoutElement<'dom> { + fn get_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> { self.as_node().get_style_and_layout_data() } } -impl<'ln> GetLayoutData<'ln> for ServoThreadSafeLayoutNode<'ln> { - fn get_style_and_layout_data(&self) -> Option<OpaqueStyleAndLayoutData> { +impl<'dom> GetLayoutData<'dom> for ServoThreadSafeLayoutNode<'dom> { + fn get_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> { self.node.get_style_and_layout_data() } } -impl<'le> GetLayoutData<'le> for ServoThreadSafeLayoutElement<'le> { - fn get_style_and_layout_data(&self) -> Option<OpaqueStyleAndLayoutData> { +impl<'dom> GetLayoutData<'dom> for ServoThreadSafeLayoutElement<'dom> { + fn get_style_and_layout_data(self) -> Option<&'dom OpaqueStyleAndLayoutData> { self.element.as_node().get_style_and_layout_data() } } -impl<'ln> ServoLayoutNode<'ln> { - /// Returns the interior of this node as a `LayoutDom`. This is highly unsafe for layout to - /// call and as such is marked `unsafe`. - pub unsafe fn get_jsmanaged(&self) -> LayoutDom<'ln, Node> { +impl<'dom> ServoLayoutNode<'dom> { + /// Returns the interior of this node as a `LayoutDom`. + pub fn get_jsmanaged(self) -> LayoutDom<'dom, Node> { self.node } } @@ -542,7 +537,7 @@ impl<'le> TElement for ServoLayoutElement<'le> { unsafe fn clear_data(&self) { if self.get_raw_data().is_some() { - drop_style_and_layout_data(self.as_node().take_style_and_layout_data()); + drop(self.as_node().take_style_and_layout_data()); } } @@ -700,7 +695,7 @@ impl<'le> ServoLayoutElement<'le> { } fn get_style_data(&self) -> Option<&StyleData> { - self.get_style_and_layout_data().map(|opaque| unsafe { + self.get_style_and_layout_data().map(|opaque| { &opaque .downcast_ref::<StyleAndLayoutData>() .unwrap() @@ -1065,7 +1060,7 @@ impl<'ln> ThreadSafeLayoutNode<'ln> for ServoThreadSafeLayoutNode<'ln> { }) } - fn get_style_and_layout_data(&self) -> Option<OpaqueStyleAndLayoutData> { + fn get_style_and_layout_data(self) -> Option<&'ln OpaqueStyleAndLayoutData> { self.node.get_style_and_layout_data() } diff --git a/components/layout_thread/lib.rs b/components/layout_thread/lib.rs index 2e50a2f7764..4c458065986 100644 --- a/components/layout_thread/lib.rs +++ b/components/layout_thread/lib.rs @@ -23,7 +23,6 @@ extern crate profile_traits; mod dom_wrapper; -use crate::dom_wrapper::drop_style_and_layout_data; use crate::dom_wrapper::{ServoLayoutDocument, ServoLayoutElement, ServoLayoutNode}; use app_units::Au; use crossbeam_channel::{unbounded, Receiver, Sender}; @@ -692,7 +691,6 @@ impl LayoutThread { Msg::GetRPC(..) => LayoutHangAnnotation::GetRPC, Msg::TickAnimations(..) => LayoutHangAnnotation::TickAnimations, Msg::AdvanceClockMs(..) => LayoutHangAnnotation::AdvanceClockMs, - Msg::ReapStyleAndLayoutData(..) => LayoutHangAnnotation::ReapStyleAndLayoutData, Msg::CollectReports(..) => LayoutHangAnnotation::CollectReports, Msg::PrepareToExit(..) => LayoutHangAnnotation::PrepareToExit, Msg::ExitNow => LayoutHangAnnotation::ExitNow, @@ -833,9 +831,6 @@ impl LayoutThread { webrender_api::ScrollClamping::ToContentBounds, ); }, - Msg::ReapStyleAndLayoutData(dead_data) => unsafe { - drop_style_and_layout_data(dead_data) - }, Msg::CollectReports(reports_chan) => { self.collect_reports(reports_chan, possibly_locked_rw_data); }, @@ -967,9 +962,6 @@ impl LayoutThread { response_chan.send(()).unwrap(); loop { match self.port.recv().unwrap() { - Msg::ReapStyleAndLayoutData(dead_data) => unsafe { - drop_style_and_layout_data(dead_data) - }, Msg::ExitNow => { debug!("layout thread is exiting..."); self.exit_now(); |