mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
Make DOM own the style and layout data, in an UnsafeCell
The previous Cell was a lie.
This commit is contained in:
parent
516e8e0aa6
commit
185a402d9c
17 changed files with 74 additions and 180 deletions
|
@ -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()
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue