aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout/traversal.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/layout/traversal.rs')
-rw-r--r--components/layout/traversal.rs26
1 files changed, 15 insertions, 11 deletions
diff --git a/components/layout/traversal.rs b/components/layout/traversal.rs
index 696c43b210b..7e0a9e3a499 100644
--- a/components/layout/traversal.rs
+++ b/components/layout/traversal.rs
@@ -215,23 +215,27 @@ impl<'a> PreorderFlowTraversal for ComputeAbsolutePositions<'a> {
}
}
-#[derive(Copy, Clone)]
pub struct BuildDisplayList<'a> {
- pub layout_context: &'a LayoutContext<'a>,
+ pub state: DisplayListBuildState<'a>,
}
-impl<'a> PostorderFlowTraversal for BuildDisplayList<'a> {
+impl<'a> BuildDisplayList<'a> {
#[inline]
- fn process(&self, flow: &mut Flow) {
- let mut state = DisplayListBuildState::new(
- self.layout_context, flow::base(flow).stacking_context_id);
- flow.build_display_list(&mut state);
- flow::mut_base(flow).display_list_building_result = Some(state.items);
- flow::mut_base(flow).restyle_damage.remove(REPAINT);
+ pub fn traverse(&mut self, flow: &mut Flow) {
+ if self.should_process() {
+ self.state.push_stacking_context_id(flow::base(flow).stacking_context_id);
+ flow.build_display_list(&mut self.state);
+ flow::mut_base(flow).restyle_damage.remove(REPAINT);
+ self.state.pop_stacking_context_id();
+ }
+
+ for kid in flow::child_iter(flow) {
+ self.traverse(kid);
+ }
}
#[inline]
- fn should_process(&self, _: &mut Flow) -> bool {
- self.layout_context.shared_context().goal == ReflowGoal::ForDisplay
+ fn should_process(&self) -> bool {
+ self.state.layout_context.shared_context().goal == ReflowGoal::ForDisplay
}
}