aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2019-10-04 20:37:28 -0400
committerGitHub <noreply@github.com>2019-10-04 20:37:28 -0400
commit36f70f5ab183cacde6d68079d927dbaf63444f2a (patch)
tree2e1c129605991c333923d00aafb65e5cfc119aab
parentdb1750673c81de852a3bfd6ad79941f4622eab94 (diff)
parent1bb85ed05b36a63e2cf879aa307ba297d52d00cf (diff)
downloadservo-36f70f5ab183cacde6d68079d927dbaf63444f2a.tar.gz
servo-36f70f5ab183cacde6d68079d927dbaf63444f2a.zip
Auto merge of #24360 - servo:build-box-tree, r=SimonSapin
Call BoxTreeRoot::construct from layout_thread_2020 <!-- Reviewable:start --> This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/24360) <!-- Reviewable:end -->
-rw-r--r--components/layout_2020/dom_traversal.rs12
-rw-r--r--components/layout_2020/element_data.rs2
-rw-r--r--components/layout_2020/flow/mod.rs2
-rw-r--r--components/layout_2020/flow/root.rs12
-rw-r--r--components/layout_2020/lib.rs20
-rw-r--r--components/layout_thread_2020/dom_wrapper.rs7
-rw-r--r--components/layout_thread_2020/lib.rs10
7 files changed, 38 insertions, 27 deletions
diff --git a/components/layout_2020/dom_traversal.rs b/components/layout_2020/dom_traversal.rs
index c1ac55c2bfb..3475b4e0eef 100644
--- a/components/layout_2020/dom_traversal.rs
+++ b/components/layout_2020/dom_traversal.rs
@@ -17,7 +17,7 @@ use style::properties::ComputedValues;
use style::selector_parser::PseudoElement;
#[derive(Clone, Copy)]
-pub(super) enum WhichPseudoElement {
+pub enum WhichPseudoElement {
Before,
After,
}
@@ -252,24 +252,24 @@ where
unimplemented!()
}
-pub(super) struct BoxSlot<'dom> {
+pub struct BoxSlot<'dom> {
slot: Option<Arc<AtomicRefCell<Option<LayoutBox>>>>,
marker: marker<&'dom ()>,
}
impl BoxSlot<'_> {
- pub fn new(slot: Arc<AtomicRefCell<Option<LayoutBox>>>) -> Self {
+ pub(crate) fn new(slot: Arc<AtomicRefCell<Option<LayoutBox>>>) -> Self {
*slot.borrow_mut() = None;
let slot = Some(slot);
Self { slot, marker }
}
- pub fn dummy() -> Self {
+ pub(crate) fn dummy() -> Self {
let slot = None;
Self { slot, marker }
}
- pub fn set(mut self, box_: LayoutBox) {
+ pub(crate) fn set(mut self, box_: LayoutBox) {
if let Some(slot) = &mut self.slot {
*slot.borrow_mut() = Some(box_);
}
@@ -284,7 +284,7 @@ impl Drop for BoxSlot<'_> {
}
}
-pub(crate) trait NodeExt<'dom>: 'dom + Copy + LayoutNode + Send + Sync {
+pub trait NodeExt<'dom>: 'dom + Copy + LayoutNode + Send + Sync {
fn is_element(self) -> bool;
fn as_text(self) -> Option<String>;
fn first_child(self) -> Option<Self>;
diff --git a/components/layout_2020/element_data.rs b/components/layout_2020/element_data.rs
index fdf611a76c7..ccd48ac04e3 100644
--- a/components/layout_2020/element_data.rs
+++ b/components/layout_2020/element_data.rs
@@ -8,7 +8,7 @@ use atomic_refcell::AtomicRefCell;
use servo_arc::Arc;
#[derive(Default)]
-pub(crate) struct LayoutDataForElement {
+pub struct LayoutDataForElement {
pub(super) self_box: Arc<AtomicRefCell<Option<LayoutBox>>>,
pub(super) pseudo_elements: Option<Box<PseudoElementBoxes>>,
}
diff --git a/components/layout_2020/flow/mod.rs b/components/layout_2020/flow/mod.rs
index ae92f70822c..189a5aeb436 100644
--- a/components/layout_2020/flow/mod.rs
+++ b/components/layout_2020/flow/mod.rs
@@ -27,6 +27,8 @@ mod float;
pub mod inline;
mod root;
+pub use root::BoxTreeRoot;
+
#[derive(Debug)]
pub(crate) struct BlockFormattingContext {
pub contents: BlockContainer,
diff --git a/components/layout_2020/flow/root.rs b/components/layout_2020/flow/root.rs
index b1a43ae28be..994ce29bb16 100644
--- a/components/layout_2020/flow/root.rs
+++ b/components/layout_2020/flow/root.rs
@@ -22,17 +22,7 @@ use style::properties::ComputedValues;
use style::values::computed::{Length, LengthOrAuto};
use style_traits::CSSPixel;
-// FIXME
-// impl crate::dom::Document {
-// pub(crate) fn layout(
-// &self,
-// viewport: crate::geom::Size<crate::geom::CssPx>,
-// ) -> Vec<Fragment> {
-// BoxTreeRoot::construct(self).layout(viewport)
-// }
-// }
-
-struct BoxTreeRoot(BlockFormattingContext);
+pub struct BoxTreeRoot(BlockFormattingContext);
impl BoxTreeRoot {
pub fn construct<'dom>(
diff --git a/components/layout_2020/lib.rs b/components/layout_2020/lib.rs
index 05a5caa9771..f491411eb3c 100644
--- a/components/layout_2020/lib.rs
+++ b/components/layout_2020/lib.rs
@@ -17,19 +17,21 @@ use style::Zero;
pub mod context;
pub mod data;
-pub mod dom_traversal;
-pub mod element_data;
-pub mod flow;
-pub mod fragments;
-pub mod geom;
-pub mod opaque_node;
-pub mod positioned;
+mod dom_traversal;
+mod element_data;
+mod flow;
+mod fragments;
+mod geom;
+mod opaque_node;
+mod positioned;
pub mod query;
-pub mod replaced;
-pub mod style_ext;
+mod replaced;
+mod style_ext;
pub mod traversal;
pub mod wrapper;
+pub use flow::BoxTreeRoot;
+
use crate::dom_traversal::{Contents, NodeExt};
use crate::flow::{BlockFormattingContext, FlowChildren};
use crate::geom::flow_relative::Vec2;
diff --git a/components/layout_thread_2020/dom_wrapper.rs b/components/layout_thread_2020/dom_wrapper.rs
index 5d815517532..a9f09e11073 100644
--- a/components/layout_thread_2020/dom_wrapper.rs
+++ b/components/layout_thread_2020/dom_wrapper.rs
@@ -109,6 +109,13 @@ pub struct ServoLayoutNode<'a> {
chain: PhantomData<&'a ()>,
}
+// Those are supposed to be sound, but they aren't because the entire system
+// between script and layout so far has been designed to work around their
+// absence. Switching the entire thing to the inert crate infra will help.
+
+unsafe impl Send for ServoLayoutNode<'_> {}
+unsafe impl Sync for ServoLayoutNode<'_> {}
+
impl<'ln> Debug for ServoLayoutNode<'ln> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if let Some(el) = self.as_element() {
diff --git a/components/layout_thread_2020/lib.rs b/components/layout_thread_2020/lib.rs
index 5855dea84cf..13f6fc79dce 100644
--- a/components/layout_thread_2020/lib.rs
+++ b/components/layout_thread_2020/lib.rs
@@ -45,6 +45,7 @@ use layout::query::{
process_text_index_request,
};
use layout::traversal::RecalcStyle;
+use layout::BoxTreeRoot;
use layout_traits::LayoutThreadFactory;
use libc::c_void;
use malloc_size_of::{MallocSizeOf, MallocSizeOfOps};
@@ -166,6 +167,9 @@ pub struct LayoutThread {
/// The number of Web fonts that have been requested but not yet loaded.
outstanding_web_fonts: Arc<AtomicUsize>,
+ /// The root box tree.
+ box_tree_root: RefCell<Option<BoxTreeRoot>>,
+
/// The document-specific shared lock used for author-origin stylesheets
document_shared_lock: Option<SharedRwLock>,
@@ -492,6 +496,7 @@ impl LayoutThread {
new_animations_sender: new_animations_sender,
_new_animations_receiver: new_animations_receiver,
outstanding_web_fonts: Arc::new(AtomicUsize::new(0)),
+ box_tree_root: Default::default(),
document_shared_lock: None,
epoch: Cell::new(Epoch(0)),
viewport_size: Size2D::new(Au(0), Au(0)),
@@ -1075,6 +1080,11 @@ impl LayoutThread {
if token.should_traverse() {
driver::traverse_dom(&traversal, token, None);
+
+ let shared = DomTraversal::<ServoLayoutElement>::shared_context(&traversal);
+ let box_tree =
+ BoxTreeRoot::construct(shared, document.root_element().unwrap().as_node());
+ *self.box_tree_root.borrow_mut() = Some(box_tree);
}
for element in elements_with_snapshot {