diff --git a/servo/Cargo.lock b/servo/Cargo.lock index d28d1a0a49d1..45ce84d2f707 100644 --- a/servo/Cargo.lock +++ b/servo/Cargo.lock @@ -3146,7 +3146,7 @@ dependencies = [ [[package]] name = "webrender" version = "0.30.0" -source = "git+https://github.com/servo/webrender#7e74c1018d47cf5586f05c409c17a25c76f28e56" +source = "git+https://github.com/servo/webrender#ba14e0b619477628d3dbb7384b2cb19b3b88a6c5" dependencies = [ "app_units 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "bincode 1.0.0-alpha6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3174,7 +3174,7 @@ dependencies = [ [[package]] name = "webrender_traits" version = "0.31.0" -source = "git+https://github.com/servo/webrender#7e74c1018d47cf5586f05c409c17a25c76f28e56" +source = "git+https://github.com/servo/webrender#ba14e0b619477628d3dbb7384b2cb19b3b88a6c5" dependencies = [ "app_units 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/servo/components/gfx/display_list/mod.rs b/servo/components/gfx/display_list/mod.rs index ee3494e1b959..e43767ddadd8 100644 --- a/servo/components/gfx/display_list/mod.rs +++ b/servo/components/gfx/display_list/mod.rs @@ -510,8 +510,8 @@ pub struct ScrollRoot { /// The position of this scroll root's frame in the parent stacking context. pub clip: Rect, - /// The size of the contents that can be scrolled inside of the scroll root. - pub size: Size2D, + /// The rect of the contents that can be scrolled inside of the scroll root. + pub content_rect: Rect, } impl ScrollRoot { diff --git a/servo/components/layout/display_list_builder.rs b/servo/components/layout/display_list_builder.rs index 94e388dff72e..8c390487f5ce 100644 --- a/servo/components/layout/display_list_builder.rs +++ b/servo/components/layout/display_list_builder.rs @@ -1963,24 +1963,29 @@ impl BlockFlowDisplayListBuilding for BlockFlow { &self.base.early_absolute_position_info.relative_containing_block_size, self.base.early_absolute_position_info.relative_containing_block_mode, coordinate_system); - let clip = self.fragment.stacking_relative_content_box(&border_box); + let content_box = self.fragment.stacking_relative_content_box(&border_box); - let has_scrolling_overflow = self.base.overflow.scroll.origin != Point2D::zero() || - self.base.overflow.scroll.size.width > clip.size.width || - self.base.overflow.scroll.size.height > clip.size.height; - self.mark_scrolling_overflow(has_scrolling_overflow); - if !has_scrolling_overflow { + // If we don't overflow our box at all, we can avoid creating a scroll root. + if self.base.overflow.scroll.origin == Point2D::zero() && + self.base.overflow.scroll.size.width <= content_box.size.width && + self.base.overflow.scroll.size.height <= content_box.size.height { + self.mark_scrolling_overflow(false); return containing_scroll_root_id; } + self.mark_scrolling_overflow(true); + let new_scroll_root_id = ScrollRootId::new_of_type(self.fragment.node.id() as usize, self.fragment.fragment_type()); + + let content_size = self.base.overflow.scroll.origin + self.base.overflow.scroll.size; state.add_scroll_root( ScrollRoot { id: new_scroll_root_id, parent_id: containing_scroll_root_id, - clip: clip, - size: self.base.overflow.scroll.size, + clip: Rect::new(Point2D::zero(), content_box.size), + content_rect: Rect::new(content_box.origin, + Size2D::new(content_size.x, content_size.y)), }, self.base.stacking_context_id ); diff --git a/servo/components/layout/webrender_helpers.rs b/servo/components/layout/webrender_helpers.rs index 8f1f76f413f1..dbbf3f68b793 100644 --- a/servo/components/layout/webrender_helpers.rs +++ b/servo/components/layout/webrender_helpers.rs @@ -414,6 +414,7 @@ impl WebRenderDisplayItemConverter for DisplayItem { stacking_context.bounds.to_rectf(), stacking_context.z_index, transform, + webrender_traits::TransformStyle::Flat, perspective, stacking_context.blend_mode.to_blend_mode(), stacking_context.filters.to_filter_ops()); @@ -425,8 +426,8 @@ impl WebRenderDisplayItemConverter for DisplayItem { None); let provided_id = ScrollLayerId::new(item.scroll_root.id.0 as u64, builder.pipeline_id); - let id = builder.define_clip(clip, - item.scroll_root.size.to_sizef(), + let id = builder.define_clip(item.scroll_root.content_rect.to_rectf(), + clip, Some(provided_id)); debug_assert!(provided_id == id); }