diff options
Diffstat (limited to 'components/layout')
-rw-r--r-- | components/layout/display_list_builder.rs | 3 | ||||
-rw-r--r-- | components/layout/webrender_helpers.rs | 84 |
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(_) => {} } } } |