Skip to content

Commit 75bbe3a

Browse files
committed
servo: Merge #6650 - Various layout cleanup (from Ms2ger:layout-cleanup); r=jdm
Source-Repo: https://github.com/servo/servo Source-Revision: e6538c0f2d887bfb244313009490ca67bc1c2298 UltraBlame original commit: 4627a599f7be6c9e34ed28d69a08be194fcb0281
1 parent 72581ab commit 75bbe3a

File tree

7 files changed

+99
-128
lines changed

7 files changed

+99
-128
lines changed

servo/components/layout/construct.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ use table_row::TableRowFlow;
4040
use table_rowgroup::TableRowGroupFlow;
4141
use table_wrapper::TableWrapperFlow;
4242
use text::TextRunScanner;
43-
use wrapper::{PostorderNodeMutTraversal, PseudoElementType, ThreadSafeLayoutNode};
43+
use traversal::PostorderNodeMutTraversal;
44+
use wrapper::{PseudoElementType, ThreadSafeLayoutNode};
4445

4546
use gfx::display_list::OpaqueNode;
4647
use script::dom::characterdata::CharacterDataTypeId;
@@ -666,7 +667,7 @@ impl<'a> FlowConstructor<'a> {
666667

667668
self.create_fragments_for_node_text_content(&mut initial_fragments,
668669
node,
669-
node.style());
670+
&*node.style());
670671
}
671672

672673
self.build_flow_for_block_starting_with_fragments(flow, node, initial_fragments)

servo/components/layout/css/node_style.rs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,17 @@
77
use data::LayoutDataWrapper;
88
use wrapper::{PseudoElementType, ThreadSafeLayoutNode};
99

10-
use std::mem;
1110
use style::properties::ComputedValues;
11+
12+
use std::cell::Ref;
1213
use std::sync::Arc;
1314

1415

1516
pub trait StyledNode {
16-
fn get_style<'a>(&'a self, layout_data_ref: &'a LayoutDataWrapper) -> &'a Arc<ComputedValues>;
17+
fn get_style<'a>(&self, layout_data_ref: &'a LayoutDataWrapper) -> &'a Arc<ComputedValues>;
1718

1819

19-
fn style<'a>(&'a self) -> &'a Arc<ComputedValues>;
20+
fn style<'a>(&'a self) -> Ref<'a, Arc<ComputedValues>>;
2021

2122
fn has_style(&self) -> bool;
2223

@@ -34,14 +35,11 @@ impl<'ln> StyledNode for ThreadSafeLayoutNode<'ln> {
3435
}
3536

3637
#[inline]
37-
#[allow(unsafe_code)]
38-
fn style<'a>(&'a self) -> &'a Arc<ComputedValues> {
39-
unsafe {
40-
let layout_data_ref = self.borrow_layout_data();
38+
fn style<'a>(&'a self) -> Ref<'a, Arc<ComputedValues>> {
39+
Ref::map(self.borrow_layout_data(), |layout_data_ref| {
4140
let layout_data = layout_data_ref.as_ref().expect("no layout data");
42-
mem::transmute::<&Arc<ComputedValues>,
43-
&'a Arc<ComputedValues>>(self.get_style(&layout_data))
44-
}
41+
self.get_style(layout_data)
42+
})
4543
}
4644

4745
fn has_style(&self) -> bool {

servo/components/layout/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#![feature(append)]
66
#![feature(arc_unique)]
77
#![feature(box_syntax)]
8+
#![feature(cell_extras)]
89
#![feature(custom_derive)]
910
#![feature(filling_drop)]
1011
#![feature(hashmap_hasher)]

servo/components/layout/parallel.rs

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@ use context::{LayoutContext, SharedLayoutContext};
1212
use flow::{Flow, MutableFlowUtils, PreorderFlowTraversal, PostorderFlowTraversal};
1313
use flow;
1414
use flow_ref::FlowRef;
15+
use traversal::{PreorderDomTraversal, PostorderDomTraversal};
16+
use traversal::PostorderNodeMutTraversal;
1517
use traversal::{BubbleISizes, AssignISizes, AssignBSizesAndStoreOverflow};
1618
use traversal::{ComputeAbsolutePositions, BuildDisplayList};
1719
use traversal::{RecalcStyleForNode, ConstructFlows};
1820
use wrapper::{layout_node_to_unsafe_layout_node, layout_node_from_unsafe_layout_node, LayoutNode};
19-
use wrapper::{PostorderNodeMutTraversal, UnsafeLayoutNode};
20-
use wrapper::{PreorderDomTraversal, PostorderDomTraversal};
21+
use wrapper::UnsafeLayoutNode;
2122

2223
use profile_traits::time::{self, ProfilerMetadata, profile};
2324
use std::mem;
@@ -241,41 +242,43 @@ trait ParallelPostorderFlowTraversal : PostorderFlowTraversal {
241242
mut unsafe_flow: UnsafeFlow,
242243
_: &mut WorkerProxy<SharedLayoutContext,UnsafeFlowList>) {
243244
loop {
244-
unsafe {
245-
246-
let flow: &mut FlowRef = mem::transmute(&mut unsafe_flow);
245+
246+
let flow: &mut FlowRef = unsafe {
247+
mem::transmute(&mut unsafe_flow)
248+
};
247249

248-
249-
if self.should_process(&mut **flow) {
250-
self.process(&mut **flow);
251-
}
250+
251+
if self.should_process(&mut **flow) {
252+
self.process(&mut **flow);
253+
}
252254

253255

254-
let base = flow::mut_base(&mut **flow);
256+
let base = flow::mut_base(&mut **flow);
255257

256-
257-
base.parallel.children_count.store(base.children.len() as isize,
258-
Ordering::Relaxed);
258+
259+
base.parallel.children_count.store(base.children.len() as isize,
260+
Ordering::Relaxed);
259261

262+
263+
let mut unsafe_parent = base.parallel.parent;
264+
if unsafe_parent == null_unsafe_flow() {
260265

261-
let mut unsafe_parent = base.parallel.parent;
262-
if unsafe_parent == null_unsafe_flow() {
263-
264-
break
265-
}
266+
break
267+
}
266268

269+
270+
271+
272+
let parent: &mut FlowRef = unsafe {
273+
mem::transmute(&mut unsafe_parent)
274+
};
275+
let parent_base = flow::mut_base(&mut **parent);
276+
if parent_base.parallel.children_count.fetch_sub(1, Ordering::Relaxed) == 1 {
267277

278+
unsafe_flow = unsafe_parent
279+
} else {
268280

269-
270-
let parent: &mut FlowRef = mem::transmute(&mut unsafe_parent);
271-
let parent_base = flow::mut_base(&mut **parent);
272-
if parent_base.parallel.children_count.fetch_sub(1, Ordering::Relaxed) == 1 {
273-
274-
unsafe_flow = unsafe_parent
275-
} else {
276-
277-
break
278-
}
281+
break
279282
}
280283
}
281284
}

servo/components/layout/sequential.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1-
/* This Source Code Form is subject to the terms of the Mozilla Public
2-
* License, v. 2.0. If a copy of the MPL was not distributed with this
3-
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
41

5-
//! Implements sequential traversals over the DOM and flow trees.
2+
3+
4+
5+
66

77
use context::{LayoutContext, SharedLayoutContext};
88
use flow::{self, Flow, ImmutableFlowUtils, InorderFlowTraversal, MutableFlowUtils};
99
use flow::{PostorderFlowTraversal, PreorderFlowTraversal};
1010
use flow_ref::FlowRef;
1111
use fragment::FragmentBorderBoxIterator;
1212
use generated_content::ResolveGeneratedContent;
13+
use traversal::{PreorderDomTraversal, PostorderDomTraversal};
14+
use traversal::PostorderNodeMutTraversal;
1315
use traversal::{BubbleISizes, RecalcStyleForNode, ConstructFlows};
1416
use traversal::{AssignBSizesAndStoreOverflow, AssignISizes};
1517
use traversal::{ComputeAbsolutePositions, BuildDisplayList};
1618
use wrapper::LayoutNode;
17-
use wrapper::{PostorderNodeMutTraversal};
18-
use wrapper::{PreorderDomTraversal, PostorderDomTraversal};
1919

2020
use euclid::point::Point2D;
2121
use util::geometry::{Au, ZERO_POINT};
@@ -134,7 +134,7 @@ pub fn iterate_through_flow_tree_fragment_border_boxes(root: &mut FlowRef,
134134
*stacking_context_position
135135
};
136136

137-
// FIXME(#2795): Get the real container size.
137+
138138
doit(kid, iterator, &stacking_context_position);
139139
}
140140
}

servo/components/layout/traversal.rs

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44

55

66

7-
#![allow(unsafe_code)]
8-
97
use css::node_style::StyledNode;
108
use css::matching::{ApplicableDeclarations, MatchMethods, StyleSharingResult};
119
use construct::FlowConstructor;
@@ -15,8 +13,7 @@ use flow::{PreorderFlowTraversal, PostorderFlowTraversal};
1513
use incremental::{self, BUBBLE_ISIZES, REFLOW, REFLOW_OUT_OF_FLOW, RestyleDamage};
1614
use script::layout_interface::ReflowGoal;
1715
use wrapper::{layout_node_to_unsafe_layout_node, LayoutNode};
18-
use wrapper::{PostorderNodeMutTraversal, ThreadSafeLayoutNode, UnsafeLayoutNode};
19-
use wrapper::{PreorderDomTraversal, PostorderDomTraversal};
16+
use wrapper::{ThreadSafeLayoutNode, UnsafeLayoutNode};
2017

2118
use selectors::bloom::BloomFilter;
2219
use selectors::Node;
@@ -120,13 +117,40 @@ fn insert_ancestors_into_bloom_filter(bf: &mut Box<BloomFilter>,
120117

121118

122119

120+
pub trait PreorderDomTraversal {
121+
122+
fn process(&self, node: LayoutNode);
123+
}
124+
125+
126+
pub trait PostorderDomTraversal {
127+
128+
fn process(&self, node: LayoutNode);
129+
}
130+
131+
132+
pub trait PostorderNodeMutTraversal {
133+
134+
fn process<'a>(&'a mut self, node: &ThreadSafeLayoutNode<'a>) -> bool;
135+
136+
137+
138+
139+
fn should_prune<'a>(&'a self, _node: &ThreadSafeLayoutNode<'a>) -> bool {
140+
false
141+
}
142+
}
143+
144+
145+
123146
#[derive(Copy, Clone)]
124147
pub struct RecalcStyleForNode<'a> {
125148
pub layout_context: &'a LayoutContext<'a>,
126149
}
127150

128151
impl<'a> PreorderDomTraversal for RecalcStyleForNode<'a> {
129152
#[inline]
153+
#[allow(unsafe_code)]
130154
fn process(&self, node: LayoutNode) {
131155

132156

@@ -219,6 +243,7 @@ pub struct ConstructFlows<'a> {
219243

220244
impl<'a> PostorderDomTraversal for ConstructFlows<'a> {
221245
#[inline]
246+
#[allow(unsafe_code)]
222247
fn process(&self, node: LayoutNode) {
223248

224249
{

servo/components/layout/wrapper.rs

Lines changed: 20 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -683,7 +683,7 @@ impl<'ln> ThreadSafeLayoutNode<'ln> {
683683
pub fn children(&self) -> ThreadSafeLayoutNodeChildrenIterator<'ln> {
684684
ThreadSafeLayoutNodeChildrenIterator {
685685
current_node: self.first_child(),
686-
parent_node: Some(self.clone()),
686+
parent_node: self.clone(),
687687
}
688688
}
689689

@@ -770,28 +770,6 @@ impl<'ln> ThreadSafeLayoutNode<'ln> {
770770
self.node.mutate_layout_data()
771771
}
772772

773-
/// Traverses the tree in postorder.
774-
///
775-
/// TODO(pcwalton): Offer a parallel version with a compatible API.
776-
pub fn traverse_postorder_mut<T:PostorderNodeMutTraversal>(&mut self, traversal: &mut T)
777-
-> bool {
778-
if traversal.should_prune(self) {
779-
return true
780-
}
781-
782-
let mut opt_kid = self.first_child();
783-
while let Some(mut kid) = opt_kid {
784-
if !kid.traverse_postorder_mut(traversal) {
785-
return false
786-
}
787-
unsafe {
788-
opt_kid = kid.next_sibling()
789-
}
790-
}
791-
792-
traversal.process(self)
793-
}
794-
795773
pub fn is_ignorable_whitespace(&self) -> bool {
796774
unsafe {
797775
let text: LayoutJS<Text> = match TextCast::to_layout_js(self.get_jsmanaged()) {
@@ -989,7 +967,7 @@ impl<'ln> ThreadSafeLayoutNode<'ln> {
989967

990968
pub struct ThreadSafeLayoutNodeChildrenIterator<'a> {
991969
current_node: Option<ThreadSafeLayoutNode<'a>>,
992-
parent_node: Option<ThreadSafeLayoutNode<'a>>,
970+
parent_node: ThreadSafeLayoutNode<'a>,
993971
}
994972

995973
impl<'a> Iterator for ThreadSafeLayoutNodeChildrenIterator<'a> {
@@ -1003,36 +981,26 @@ impl<'a> Iterator for ThreadSafeLayoutNodeChildrenIterator<'a> {
1003981
return None
1004982
}
1005983

1006-
match self.parent_node {
1007-
Some(ref parent_node) => {
1008-
self.current_node = if parent_node.pseudo == PseudoElementType::Normal {
1009-
self.current_node.clone().and_then(|node| {
1010-
unsafe {
1011-
node.next_sibling()
1012-
}
1013-
})
1014-
} else {
1015-
None
1016-
};
1017-
}
1018-
None => {}
1019-
}
984+
self.current_node = if self.parent_node.pseudo == PseudoElementType::Normal {
985+
self.current_node.clone().and_then(|node| {
986+
unsafe {
987+
node.next_sibling()
988+
}
989+
})
990+
} else {
991+
None
992+
};
1020993
}
1021994
None => {
1022-
match self.parent_node {
1023-
Some(ref parent_node) => {
1024-
if parent_node.has_after_pseudo() {
1025-
let pseudo_after_node = if parent_node.pseudo == PseudoElementType::Normal {
1026-
let pseudo = PseudoElementType::After(parent_node.get_after_display());
1027-
Some(parent_node.with_pseudo(pseudo))
1028-
} else {
1029-
None
1030-
};
1031-
self.current_node = pseudo_after_node;
1032-
return self.current_node.clone()
1033-
}
1034-
}
1035-
None => {}
995+
if self.parent_node.has_after_pseudo() {
996+
let pseudo_after_node = if self.parent_node.pseudo == PseudoElementType::Normal {
997+
let pseudo = PseudoElementType::After(self.parent_node.get_after_display());
998+
Some(self.parent_node.with_pseudo(pseudo))
999+
} else {
1000+
None
1001+
};
1002+
self.current_node = pseudo_after_node;
1003+
return self.current_node.clone()
10361004
}
10371005
}
10381006
}
@@ -1057,19 +1025,6 @@ impl<'le> ThreadSafeLayoutElement<'le> {
10571025
}
10581026

10591027

1060-
pub trait PostorderNodeMutTraversal {
1061-
1062-
fn process<'a>(&'a mut self, node: &ThreadSafeLayoutNode<'a>) -> bool;
1063-
1064-
1065-
1066-
1067-
fn should_prune<'a>(&'a self, _node: &ThreadSafeLayoutNode<'a>) -> bool {
1068-
false
1069-
}
1070-
}
1071-
1072-
10731028

10741029
pub type UnsafeLayoutNode = (usize, usize);
10751030

@@ -1086,15 +1041,3 @@ pub unsafe fn layout_node_from_unsafe_layout_node(node: &UnsafeLayoutNode) -> La
10861041
let (node, _) = *node;
10871042
mem::transmute(node)
10881043
}
1089-
1090-
1091-
pub trait PreorderDomTraversal {
1092-
1093-
fn process(&self, node: LayoutNode);
1094-
}
1095-
1096-
1097-
pub trait PostorderDomTraversal {
1098-
1099-
fn process(&self, node: LayoutNode);
1100-
}

0 commit comments

Comments
 (0)