Index: third_party/WebKit/Source/core/paint/PaintLayerClipper.cpp |
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerClipper.cpp b/third_party/WebKit/Source/core/paint/PaintLayerClipper.cpp |
index da24d7aaabd5bd373b245de256182977fb82bc7a..902295373b5c159d49ff7b391906e4bbabcceffa 100644 |
--- a/third_party/WebKit/Source/core/paint/PaintLayerClipper.cpp |
+++ b/third_party/WebKit/Source/core/paint/PaintLayerClipper.cpp |
@@ -205,7 +205,8 @@ LayoutRect PaintLayerClipper::LocalClipRect( |
ClipRectsContext context(&clipping_root_layer, kPaintingClipRects); |
if (use_geometry_mapper_) { |
ClipRect clip_rect; |
- CalculateBackgroundClipRectWithGeometryMapper(context, clip_rect); |
+ CalculateBackgroundClipRectWithGeometryMapper(context, clip_rect, |
+ ShouldClipOverflow(context)); |
LayoutRect premapped_rect = clip_rect.Rect(); |
// The rect now needs to be transformed to the local space of this |
@@ -279,7 +280,8 @@ void PaintLayerClipper::CalculateRectsWithGeometryMapper( |
background_rect = ClipRect(LayoutRect(LayoutRect::InfiniteIntRect())); |
foreground_rect = ClipRect(LayoutRect(LayoutRect::InfiniteIntRect())); |
} else { |
- CalculateBackgroundClipRectWithGeometryMapper(context, background_rect); |
+ CalculateBackgroundClipRectWithGeometryMapper(context, background_rect, |
+ ShouldClipOverflow(context)); |
background_rect.Move(context.sub_pixel_accumulation); |
background_rect.Intersect(paint_dirty_rect); |
@@ -426,7 +428,8 @@ static ClipRect BackgroundClipRectForPosition(const ClipRects& parent_rects, |
void PaintLayerClipper::CalculateBackgroundClipRectWithGeometryMapper( |
const ClipRectsContext& context, |
- ClipRect& output) const { |
+ ClipRect& output, |
+ bool should_clip_to_visual_overflow) const { |
DCHECK(use_geometry_mapper_); |
PropertyTreeState source_property_tree_state(nullptr, nullptr, nullptr); |
PropertyTreeState destination_property_tree_state(nullptr, nullptr, nullptr); |
@@ -457,7 +460,7 @@ void PaintLayerClipper::CalculateBackgroundClipRectWithGeometryMapper( |
// of transforms. Tight results are required for most use cases of these |
// rects, so we should add methods to GeometryMapper that guarantee there |
// are tight results, or else signal an error. |
- if (ShouldClipOverflow(context)) { |
+ if (should_clip_to_visual_overflow) { |
FloatClipRect clip_rect((FloatRect(LocalVisualRect()))); |
clip_rect.MoveBy(FloatPoint(layer_.GetLayoutObject().PaintOffset())); |
GeometryMapper::SourceToDestinationVisualRect( |
@@ -468,6 +471,8 @@ void PaintLayerClipper::CalculateBackgroundClipRectWithGeometryMapper( |
GeometryMapper::SourceToDestinationClipRect( |
source_property_tree_state, destination_property_tree_state); |
output.SetRect(clipped_rect_in_root_layer_space); |
+ if (clipped_rect_in_root_layer_space.IsInfinite()) |
+ return; |
} |
output.MoveBy(-context.root_layer->GetLayoutObject().PaintOffset()); |
@@ -529,7 +534,7 @@ void PaintLayerClipper::CalculateBackgroundClipRect( |
return; |
} |
- CalculateBackgroundClipRectWithGeometryMapper(context, output); |
+ CalculateBackgroundClipRectWithGeometryMapper(context, output, false); |
#ifdef CHECK_CLIP_RECTS |
ClipRect testBackgroundClipRect = |
PaintLayerClipper(m_layer, nullptr).backgroundClipRect(context); |