aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout
diff options
context:
space:
mode:
Diffstat (limited to 'components/layout')
-rw-r--r--components/layout/display_list_builder.rs3
-rw-r--r--components/layout/webrender_helpers.rs84
2 files changed, 42 insertions, 45 deletions
diff --git a/components/layout/display_list_builder.rs b/components/layout/display_list_builder.rs
index 4fc4d947076..5fba5159bbc 100644
--- a/components/layout/display_list_builder.rs
+++ b/components/layout/display_list_builder.rs
@@ -1780,7 +1780,7 @@ impl BlockFlowDisplayListBuilding for BlockFlow {
ScrollPolicy::Scrollable,
creation_mode);
self.base.collect_stacking_contexts_for_children(&mut new_context);
- let new_children: Vec<Box<StackingContext>> = new_context.children.drain(..).collect();
+ let new_children: Vec<StackingContext> = new_context.children.drain(..).collect();
let mut non_floating_children = Vec::new();
for child in new_children {
@@ -1808,6 +1808,7 @@ impl BlockFlowDisplayListBuilding for BlockFlow {
&self.base,
scroll_policy,
StackingContextCreationMode::InnerScrollWrapper);
+
self.base.collect_stacking_contexts_for_children(&mut inner_stacking_context);
let mut outer_stacking_context = self.fragment.create_stacking_context(
diff --git a/components/layout/webrender_helpers.rs b/components/layout/webrender_helpers.rs
index 9ec470e1b7f..ff79f9b6ba7 100644
--- a/components/layout/webrender_helpers.rs
+++ b/components/layout/webrender_helpers.rs
@@ -260,40 +260,32 @@ impl WebRenderStackingContextConverter for StackingContext {
builder: &mut webrender_traits::DisplayListBuilder,
frame_builder: &mut WebRenderFrameBuilder,
_force_positioned_stacking_level: bool) {
- for child in self.children() {
- while let Some(item) = traversal.advance(self) {
- item.convert_to_webrender(builder, frame_builder);
- }
+ while let Some(item) = traversal.next() {
+ match item {
+ &DisplayItem::PushStackingContextClass(ref stacking_context_item) => {
+ let stacking_context = &stacking_context_item.stacking_context;
+ debug_assert!(stacking_context.context_type == StackingContextType::Real);
+
+ let scroll_layer_id_for_children = if self.scrolls_overflow_area {
+ scroll_layer_id
+ } else {
+ None
+ };
- if child.context_type == StackingContextType::Real {
- let scroll_layer_id_for_children = if self.scrolls_overflow_area {
- scroll_layer_id
- } else {
- None
- };
- let stacking_context_id = child.convert_to_webrender(traversal,
- api,
- pipeline_id,
- epoch,
- scroll_layer_id_for_children,
- scroll_policy,
- frame_builder);
- builder.push_stacking_context(stacking_context_id);
- } else {
- child.convert_children_to_webrender(traversal,
- api,
- pipeline_id,
- epoch,
- scroll_layer_id,
- scroll_policy,
- builder,
- frame_builder,
- true);
- }
- }
+ let stacking_context_id =
+ stacking_context.convert_to_webrender(traversal,
+ api,
+ pipeline_id,
+ epoch,
+ scroll_layer_id_for_children,
+ scroll_policy,
+ frame_builder);
+ builder.push_stacking_context(stacking_context_id);
- while let Some(item) = traversal.advance(self) {
- item.convert_to_webrender(builder, frame_builder);
+ }
+ &DisplayItem::PopStackingContextClass(_) => return,
+ _ => item.convert_to_webrender(builder, frame_builder),
+ }
}
}
@@ -359,19 +351,22 @@ impl WebRenderDisplayListConverter for DisplayList {
scroll_layer_id: Option<webrender_traits::ScrollLayerId>,
frame_builder: &mut WebRenderFrameBuilder)
-> webrender_traits::StackingContextId {
- let mut traversal = DisplayListTraversal {
- display_list: self,
- current_item_index: 0,
- last_item_index: self.list.len() - 1,
- };
+ let mut traversal = DisplayListTraversal::new(self);
+ let item = traversal.next();
+ match item {
+ Some(&DisplayItem::PushStackingContextClass(ref stacking_context_item)) => {
+ let stacking_context = &stacking_context_item.stacking_context;
+ stacking_context.convert_to_webrender(&mut traversal,
+ api,
+ pipeline_id,
+ epoch,
+ scroll_layer_id,
+ ScrollPolicy::Scrollable,
+ frame_builder)
+ }
+ _ => unreachable!("DisplayList did not start with StackingContext."),
- self.root_stacking_context.convert_to_webrender(&mut traversal,
- api,
- pipeline_id,
- epoch,
- scroll_layer_id,
- ScrollPolicy::Scrollable,
- frame_builder)
+ }
}
}
@@ -513,6 +508,7 @@ impl WebRenderDisplayItemConverter for DisplayItem {
item.base.clip.to_clip_region(frame_builder),
pipeline_id);
}
+ DisplayItem::PushStackingContextClass(_) | DisplayItem::PopStackingContextClass(_) => {}
}
}
}