summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/paint/box_paint_invalidator_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/core/paint/box_paint_invalidator_test.cc')
-rw-r--r--chromium/third_party/blink/renderer/core/paint/box_paint_invalidator_test.cc695
1 files changed, 19 insertions, 676 deletions
diff --git a/chromium/third_party/blink/renderer/core/paint/box_paint_invalidator_test.cc b/chromium/third_party/blink/renderer/core/paint/box_paint_invalidator_test.cc
index 73dacdb63ce..92c92a0ce07 100644
--- a/chromium/third_party/blink/renderer/core/paint/box_paint_invalidator_test.cc
+++ b/chromium/third_party/blink/renderer/core/paint/box_paint_invalidator_test.cc
@@ -24,28 +24,16 @@ class BoxPaintInvalidatorTest : public PaintControllerPaintTest {
: PaintControllerPaintTest(SingleChildLocalFrameClient::Create()) {}
protected:
- const RasterInvalidationTracking* GetRasterInvalidationTracking() const {
- // TODO(wangxianzhu): Test SPv2.
- // TODO(wangxianzhu): For SPv175, XXXPaintInvalidator doesn't do raster
- // invalidation, so the test should be moved to somewhere else (or use
- // layout tests?).
- return GetLayoutView()
- .Layer()
- ->GraphicsLayerBacking()
- ->GetRasterInvalidationTracking();
- }
-
PaintInvalidationReason ComputePaintInvalidationReason(
const LayoutBox& box,
const LayoutRect& old_visual_rect,
- const LayoutPoint& old_location) {
+ const LayoutPoint& old_paint_offset) {
FragmentData fragment_data;
PaintInvalidatorContext context;
context.old_visual_rect = old_visual_rect;
- context.old_location = old_location;
+ context.old_paint_offset = old_paint_offset;
fragment_data_.SetVisualRect(box.FirstFragment().VisualRect());
- fragment_data_.SetLocationInBacking(
- box.FirstFragment().LocationInBacking());
+ fragment_data_.SetPaintOffset(box.FirstFragment().PaintOffset());
context.fragment_data = &fragment_data_;
return BoxPaintInvalidator(box, context).ComputePaintInvalidationReason();
}
@@ -60,11 +48,11 @@ class BoxPaintInvalidatorTest : public PaintControllerPaintTest {
auto& target = *GetDocument().getElementById("target");
const auto& box = *ToLayoutBox(target.GetLayoutObject());
LayoutRect visual_rect = box.FirstFragment().VisualRect();
- LayoutPoint location = box.FirstFragment().LocationInBacking();
+ LayoutPoint paint_offset = box.FirstFragment().PaintOffset();
// No geometry change.
EXPECT_EQ(PaintInvalidationReason::kNone,
- ComputePaintInvalidationReason(box, visual_rect, location));
+ ComputePaintInvalidationReason(box, visual_rect, paint_offset));
target.setAttribute(
HTMLNames::styleAttr,
@@ -75,13 +63,10 @@ class BoxPaintInvalidatorTest : public PaintControllerPaintTest {
LayoutRect(visual_rect.Location(), box.Size()));
EXPECT_EQ(PaintInvalidationReason::kGeometry,
- ComputePaintInvalidationReason(box, visual_rect, location));
+ ComputePaintInvalidationReason(box, visual_rect, paint_offset));
}
- private:
- void SetUp() override {
- RenderingTest::SetUp();
- EnableCompositing();
+ void SetUpHTML() {
SetBodyInnerHTML(R"HTML(
<style>
body {
@@ -99,62 +84,19 @@ class BoxPaintInvalidatorTest : public PaintControllerPaintTest {
border-style: solid;
border-color: red;
}
- .solid-composited-scroller {
- overflow: scroll;
- will-change: transform;
- background: #ccc;
- }
- .local-background {
- background-attachment: local;
- overflow: scroll;
- }
- .gradient {
- background-image: linear-gradient(blue, yellow)
- }
- .transform {
- transform: scale(2);
- }
</style>
<div id='target' class='border'></div>
)HTML");
}
+
+ private:
FragmentData fragment_data_;
};
INSTANTIATE_PAINT_TEST_CASE_P(BoxPaintInvalidatorTest);
-TEST_P(BoxPaintInvalidatorTest, SlowMapToVisualRectInAncestorSpaceLayoutView) {
- if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled())
- return;
-
- SetBodyInnerHTML(
- "<!doctype html>"
- "<style>"
- "#parent {"
- " display: inline-block;"
- " width: 300px;"
- " height: 300px;"
- " margin-top: 200px;"
- " filter: blur(3px);" // Forces the slow path in
- // SlowMapToVisualRectInAncestorSpace.
- " border: 1px solid rebeccapurple;"
- "}"
- "</style>"
- "<div id=parent>"
- " <iframe id='target' src='data:text/html,<body style='background: "
- "blue;'></body>'></iframe>"
- "</div>");
-
- auto& target = *GetDocument().getElementById("target");
- EXPECT_EQ(IntRect(2, 202, 318, 168),
- EnclosingIntRect(ToHTMLFrameOwnerElement(target)
- .contentDocument()
- ->GetLayoutView()
- ->FirstFragment()
- .VisualRect()));
-}
-
TEST_P(BoxPaintInvalidatorTest, ComputePaintInvalidationReasonPaintingNothing) {
+ SetUpHTML();
auto& target = *GetDocument().getElementById("target");
auto& box = *ToLayoutBox(target.GetLayoutObject());
// Remove border.
@@ -170,7 +112,7 @@ TEST_P(BoxPaintInvalidatorTest, ComputePaintInvalidationReasonPaintingNothing) {
PaintInvalidationReason::kNone,
ComputePaintInvalidationReason(box, visual_rect, visual_rect.Location()));
- // Location change.
+ // Paint offset change.
EXPECT_EQ(PaintInvalidationReason::kNone,
ComputePaintInvalidationReason(
box, visual_rect, visual_rect.Location() + LayoutSize(10, 20)));
@@ -189,6 +131,7 @@ TEST_P(BoxPaintInvalidatorTest, ComputePaintInvalidationReasonPaintingNothing) {
}
TEST_P(BoxPaintInvalidatorTest, ComputePaintInvalidationReasonBasic) {
+ SetUpHTML();
auto& target = *GetDocument().getElementById("target");
auto& box = *ToLayoutBox(target.GetLayoutObject());
// Remove border.
@@ -205,14 +148,6 @@ TEST_P(BoxPaintInvalidatorTest, ComputePaintInvalidationReasonBasic) {
PaintInvalidationReason::kNone,
ComputePaintInvalidationReason(box, visual_rect, visual_rect.Location()));
- if (!RuntimeEnabledFeatures::SlimmingPaintV175Enabled()) {
- // Location change.
- EXPECT_EQ(
- PaintInvalidationReason::kGeometry,
- ComputePaintInvalidationReason(
- box, visual_rect, visual_rect.Location() + LayoutSize(10, 20)));
- }
-
// Visual rect size change.
LayoutRect old_visual_rect = visual_rect;
target.setAttribute(HTMLNames::styleAttr, "background: blue; width: 200px");
@@ -225,14 +160,13 @@ TEST_P(BoxPaintInvalidatorTest, ComputePaintInvalidationReasonBasic) {
ComputePaintInvalidationReason(box, old_visual_rect,
old_visual_rect.Location()));
- // Visual rect size change, with location in backing different from location
- // of visual rect.
- LayoutPoint fake_location = visual_rect.Location() + LayoutSize(10, 20);
- box.GetMutableForPainting().FirstFragment().SetLocationInBacking(
- fake_location);
+ // Visual rect size change, with paint offset different from location of
+ // visual rect.
+ LayoutPoint fake_paint_offset = visual_rect.Location() + LayoutSize(10, 20);
+ box.GetMutableForPainting().FirstFragment().SetPaintOffset(fake_paint_offset);
EXPECT_EQ(
PaintInvalidationReason::kGeometry,
- ComputePaintInvalidationReason(box, old_visual_rect, fake_location));
+ ComputePaintInvalidationReason(box, old_visual_rect, fake_paint_offset));
// Should use the existing full paint invalidation reason regardless of
// geometry change.
@@ -246,11 +180,11 @@ TEST_P(BoxPaintInvalidatorTest, ComputePaintInvalidationReasonBasic) {
}
TEST_P(BoxPaintInvalidatorTest, ComputePaintInvalidationReasonOtherCases) {
+ SetUpHTML();
auto& target = *GetDocument().getElementById("target");
// The target initially has border.
- if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled())
- ExpectFullPaintInvalidationOnGeometryChange("With border");
+ ExpectFullPaintInvalidationOnGeometryChange("With border");
// Clear border.
target.setAttribute(HTMLNames::classAttr, "");
@@ -276,595 +210,4 @@ TEST_P(BoxPaintInvalidatorTest, ComputePaintInvalidationReasonOtherCases) {
ExpectFullPaintInvalidationOnGeometryChange("With clip-path");
}
-TEST_P(BoxPaintInvalidatorTest, IncrementalInvalidationExpand) {
- if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled())
- return;
-
- GetDocument().View()->SetTracksPaintInvalidations(true);
- Element* target = GetDocument().getElementById("target");
- target->setAttribute(HTMLNames::styleAttr, "width: 100px; height: 200px");
- GetDocument().View()->UpdateAllLifecyclePhases();
- const auto& raster_invalidations =
- GetRasterInvalidationTracking()->Invalidations();
- ASSERT_EQ(2u, raster_invalidations.size());
- EXPECT_EQ(IntRect(60, 0, 60, 240), raster_invalidations[0].rect);
- EXPECT_EQ(PaintInvalidationReason::kIncremental,
- raster_invalidations[0].reason);
- EXPECT_EQ(IntRect(0, 120, 120, 120), raster_invalidations[1].rect);
- EXPECT_EQ(PaintInvalidationReason::kIncremental,
- raster_invalidations[1].reason);
- GetDocument().View()->SetTracksPaintInvalidations(false);
-}
-
-TEST_P(BoxPaintInvalidatorTest, IncrementalInvalidationShrink) {
- if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled())
- return;
-
- GetDocument().View()->SetTracksPaintInvalidations(true);
- Element* target = GetDocument().getElementById("target");
- target->setAttribute(HTMLNames::styleAttr, "width: 20px; height: 80px");
- GetDocument().View()->UpdateAllLifecyclePhases();
- const auto& raster_invalidations =
- GetRasterInvalidationTracking()->Invalidations();
- ASSERT_EQ(2u, raster_invalidations.size());
- EXPECT_EQ(IntRect(30, 0, 40, 140), raster_invalidations[0].rect);
- EXPECT_EQ(PaintInvalidationReason::kIncremental,
- raster_invalidations[0].reason);
- EXPECT_EQ(IntRect(0, 100, 70, 40), raster_invalidations[1].rect);
- EXPECT_EQ(PaintInvalidationReason::kIncremental,
- raster_invalidations[1].reason);
- GetDocument().View()->SetTracksPaintInvalidations(false);
-}
-
-TEST_P(BoxPaintInvalidatorTest, IncrementalInvalidationMixed) {
- if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled())
- return;
-
- GetDocument().View()->SetTracksPaintInvalidations(true);
- Element* target = GetDocument().getElementById("target");
- target->setAttribute(HTMLNames::styleAttr, "width: 100px; height: 80px");
- GetDocument().View()->UpdateAllLifecyclePhases();
- const auto& raster_invalidations =
- GetRasterInvalidationTracking()->Invalidations();
- ASSERT_EQ(2u, raster_invalidations.size());
- EXPECT_EQ(IntRect(60, 0, 60, 120), raster_invalidations[0].rect);
- EXPECT_EQ(PaintInvalidationReason::kIncremental,
- raster_invalidations[0].reason);
- EXPECT_EQ(IntRect(0, 100, 70, 40), raster_invalidations[1].rect);
- EXPECT_EQ(PaintInvalidationReason::kIncremental,
- raster_invalidations[1].reason);
- GetDocument().View()->SetTracksPaintInvalidations(false);
-}
-
-TEST_P(BoxPaintInvalidatorTest, SubpixelVisualRectChagne) {
- if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled())
- return;
-
- Element* target = GetDocument().getElementById("target");
-
- GetDocument().View()->SetTracksPaintInvalidations(true);
- target->setAttribute(HTMLNames::styleAttr, "width: 100.6px; height: 70.3px");
- GetDocument().View()->UpdateAllLifecyclePhases();
- const auto* raster_invalidations =
- &GetRasterInvalidationTracking()->Invalidations();
- ASSERT_EQ(2u, raster_invalidations->size());
- EXPECT_EQ(IntRect(60, 0, 61, 111), (*raster_invalidations)[0].rect);
- EXPECT_EQ(PaintInvalidationReason::kIncremental,
- (*raster_invalidations)[0].reason);
- EXPECT_EQ(IntRect(0, 90, 70, 50), (*raster_invalidations)[1].rect);
- EXPECT_EQ(PaintInvalidationReason::kIncremental,
- (*raster_invalidations)[1].reason);
- GetDocument().View()->SetTracksPaintInvalidations(false);
-
- GetDocument().View()->SetTracksPaintInvalidations(true);
- target->setAttribute(HTMLNames::styleAttr, "width: 50px; height: 100px");
- GetDocument().View()->UpdateAllLifecyclePhases();
- raster_invalidations = &GetRasterInvalidationTracking()->Invalidations();
- ASSERT_EQ(2u, raster_invalidations->size());
- EXPECT_EQ(IntRect(60, 0, 61, 111), (*raster_invalidations)[0].rect);
- EXPECT_EQ(PaintInvalidationReason::kIncremental,
- (*raster_invalidations)[0].reason);
- EXPECT_EQ(IntRect(0, 90, 70, 50), (*raster_invalidations)[1].rect);
- EXPECT_EQ(PaintInvalidationReason::kIncremental,
- (*raster_invalidations)[1].reason);
- GetDocument().View()->SetTracksPaintInvalidations(false);
-}
-
-TEST_P(BoxPaintInvalidatorTest, SubpixelVisualRectChangeWithTransform) {
- if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled())
- return;
-
- Element* target = GetDocument().getElementById("target");
- target->setAttribute(HTMLNames::classAttr, "border transform");
- GetDocument().View()->UpdateAllLifecyclePhases();
-
- GetDocument().View()->SetTracksPaintInvalidations(true);
- target->setAttribute(HTMLNames::styleAttr, "width: 100.6px; height: 70.3px");
- GetDocument().View()->UpdateAllLifecyclePhases();
- const auto* raster_invalidations =
- &GetRasterInvalidationTracking()->Invalidations();
- ASSERT_EQ(2u, raster_invalidations->size());
- EXPECT_EQ(IntRect(0, 0, 140, 280), (*raster_invalidations)[0].rect);
- EXPECT_EQ(PaintInvalidationReason::kGeometry,
- (*raster_invalidations)[0].reason);
- EXPECT_EQ(IntRect(0, 0, 242, 222), (*raster_invalidations)[1].rect);
- EXPECT_EQ(PaintInvalidationReason::kGeometry,
- (*raster_invalidations)[1].reason);
- GetDocument().View()->SetTracksPaintInvalidations(false);
-
- GetDocument().View()->SetTracksPaintInvalidations(true);
- target->setAttribute(HTMLNames::styleAttr, "width: 50px; height: 100px");
- GetDocument().View()->UpdateAllLifecyclePhases();
- raster_invalidations = &GetRasterInvalidationTracking()->Invalidations();
- ASSERT_EQ(2u, raster_invalidations->size());
- EXPECT_EQ(IntRect(0, 0, 242, 222), (*raster_invalidations)[0].rect);
- EXPECT_EQ(PaintInvalidationReason::kGeometry,
- (*raster_invalidations)[0].reason);
- EXPECT_EQ(IntRect(0, 0, 140, 280), (*raster_invalidations)[1].rect);
- EXPECT_EQ(PaintInvalidationReason::kGeometry,
- (*raster_invalidations)[1].reason);
- GetDocument().View()->SetTracksPaintInvalidations(false);
-}
-
-TEST_P(BoxPaintInvalidatorTest, SubpixelWithinPixelsChange) {
- if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled())
- return;
-
- Element* target = GetDocument().getElementById("target");
- LayoutObject* target_object = target->GetLayoutObject();
- EXPECT_EQ(LayoutRect(0, 0, 70, 140),
- target_object->FirstFragment().VisualRect());
-
- GetDocument().View()->SetTracksPaintInvalidations(true);
- target->setAttribute(HTMLNames::styleAttr,
- "margin-top: 0.6px; width: 50px; height: 99.3px");
- GetDocument().View()->UpdateAllLifecyclePhases();
- EXPECT_EQ(LayoutRect(LayoutUnit(), LayoutUnit(0.6), LayoutUnit(70),
- LayoutUnit(139.3)),
- target_object->FirstFragment().VisualRect());
- const auto* raster_invalidations =
- &GetRasterInvalidationTracking()->Invalidations();
- ASSERT_EQ(1u, raster_invalidations->size());
- EXPECT_EQ(IntRect(0, 0, 70, 140), (*raster_invalidations)[0].rect);
- EXPECT_EQ(PaintInvalidationReason::kGeometry,
- (*raster_invalidations)[0].reason);
- GetDocument().View()->SetTracksPaintInvalidations(false);
-
- GetDocument().View()->SetTracksPaintInvalidations(true);
- target->setAttribute(HTMLNames::styleAttr,
- "margin-top: 0.6px; width: 49.3px; height: 98.5px");
- GetDocument().View()->UpdateAllLifecyclePhases();
- EXPECT_EQ(LayoutRect(LayoutUnit(), LayoutUnit(0.6), LayoutUnit(69.3),
- LayoutUnit(138.5)),
- target_object->FirstFragment().VisualRect());
- raster_invalidations = &GetRasterInvalidationTracking()->Invalidations();
- ASSERT_EQ(2u, raster_invalidations->size());
- EXPECT_EQ(IntRect(59, 0, 11, 140), (*raster_invalidations)[0].rect);
- EXPECT_EQ(PaintInvalidationReason::kIncremental,
- (*raster_invalidations)[0].reason);
- EXPECT_EQ(IntRect(0, 119, 70, 21), (*raster_invalidations)[1].rect);
- EXPECT_EQ(PaintInvalidationReason::kIncremental,
- (*raster_invalidations)[1].reason);
- GetDocument().View()->SetTracksPaintInvalidations(false);
-}
-
-TEST_P(BoxPaintInvalidatorTest, ResizeRotated) {
- if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled())
- return;
-
- Element* target = GetDocument().getElementById("target");
- target->setAttribute(HTMLNames::styleAttr, "transform: rotate(45deg)");
- GetDocument().View()->UpdateAllLifecyclePhases();
-
- // Should do full invalidation a rotated object is resized.
- GetDocument().View()->SetTracksPaintInvalidations(true);
- target->setAttribute(HTMLNames::styleAttr,
- "transform: rotate(45deg); width: 200px");
- GetDocument().View()->UpdateAllLifecyclePhases();
- const auto* raster_invalidations =
- &GetRasterInvalidationTracking()->Invalidations();
- ASSERT_EQ(1u, raster_invalidations->size());
- EXPECT_EQ(IntRect(-99, 0, 255, 255), (*raster_invalidations)[0].rect);
- EXPECT_EQ(PaintInvalidationReason::kGeometry,
- (*raster_invalidations)[0].reason);
- GetDocument().View()->SetTracksPaintInvalidations(false);
-}
-
-TEST_P(BoxPaintInvalidatorTest, ResizeRotatedChild) {
- if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled())
- return;
-
- Element* target = GetDocument().getElementById("target");
- target->setAttribute(HTMLNames::styleAttr,
- "transform: rotate(45deg); width: 200px");
- target->SetInnerHTMLFromString(
- "<div id=child style='width: 50px; height: 50px; background: "
- "red'></div>");
- GetDocument().View()->UpdateAllLifecyclePhases();
- Element* child = GetDocument().getElementById("child");
-
- // Should do full invalidation a rotated object is resized.
- GetDocument().View()->SetTracksPaintInvalidations(true);
- child->setAttribute(HTMLNames::styleAttr,
- "width: 100px; height: 50px; background: red");
- GetDocument().View()->UpdateAllLifecyclePhases();
- const auto* raster_invalidations =
- &GetRasterInvalidationTracking()->Invalidations();
- ASSERT_EQ(1u, raster_invalidations->size());
- EXPECT_EQ(IntRect(-43, 21, 107, 107), (*raster_invalidations)[0].rect);
- EXPECT_EQ(PaintInvalidationReason::kGeometry,
- (*raster_invalidations)[0].reason);
- GetDocument().View()->SetTracksPaintInvalidations(false);
-}
-
-TEST_P(BoxPaintInvalidatorTest, CompositedLayoutViewResize) {
- if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled())
- return;
-
- EnableCompositing();
- Element* target = GetDocument().getElementById("target");
- target->setAttribute(HTMLNames::classAttr, "");
- target->setAttribute(HTMLNames::styleAttr, "height: 2000px");
- GetDocument().View()->UpdateAllLifecyclePhases();
-
- // Resize the content.
- GetDocument().View()->SetTracksPaintInvalidations(true);
- target->setAttribute(HTMLNames::styleAttr, "height: 3000px");
- GetDocument().View()->UpdateAllLifecyclePhases();
- const auto& raster_invalidations =
- GetRasterInvalidationTracking()->Invalidations();
- ASSERT_EQ(1u, raster_invalidations.size());
- EXPECT_EQ(IntRect(0, 2000, 800, 1000), raster_invalidations[0].rect);
- EXPECT_EQ(static_cast<const DisplayItemClient*>(&GetLayoutView()),
- raster_invalidations[0].client);
- EXPECT_EQ(PaintInvalidationReason::kBackgroundOnScrollingContentsLayer,
- raster_invalidations[0].reason);
-
- GetDocument().View()->SetTracksPaintInvalidations(false);
-
- // Resize the viewport. No paint invalidation.
- GetDocument().View()->SetTracksPaintInvalidations(true);
- GetDocument().View()->Resize(800, 1000);
- GetDocument().View()->UpdateAllLifecyclePhases();
- EXPECT_FALSE(GetRasterInvalidationTracking()->HasInvalidations());
- GetDocument().View()->SetTracksPaintInvalidations(false);
-}
-
-TEST_P(BoxPaintInvalidatorTest, CompositedLayoutViewGradientResize) {
- if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled())
- return;
-
- EnableCompositing();
- GetDocument().body()->setAttribute(HTMLNames::classAttr, "gradient");
- Element* target = GetDocument().getElementById("target");
- target->setAttribute(HTMLNames::classAttr, "");
- target->setAttribute(HTMLNames::styleAttr, "height: 2000px");
- GetDocument().View()->UpdateAllLifecyclePhases();
-
- // Resize the content.
- GetDocument().View()->SetTracksPaintInvalidations(true);
- target->setAttribute(HTMLNames::styleAttr, "height: 3000px");
- GetDocument().View()->UpdateAllLifecyclePhases();
-
- const auto& raster_invalidations =
- GetRasterInvalidationTracking()->Invalidations();
- ASSERT_EQ(1u, raster_invalidations.size());
- EXPECT_EQ(IntRect(0, 0, 800, 3000), raster_invalidations[0].rect);
- EXPECT_EQ(static_cast<const DisplayItemClient*>(&GetLayoutView()),
- raster_invalidations[0].client);
- EXPECT_EQ(PaintInvalidationReason::kBackgroundOnScrollingContentsLayer,
- raster_invalidations[0].reason);
-
- GetDocument().View()->SetTracksPaintInvalidations(false);
-
- // Resize the viewport. No paint invalidation.
- GetDocument().View()->SetTracksPaintInvalidations(true);
- GetDocument().View()->Resize(800, 1000);
- GetDocument().View()->UpdateAllLifecyclePhases();
- EXPECT_FALSE(GetRasterInvalidationTracking()->HasInvalidations());
- GetDocument().View()->SetTracksPaintInvalidations(false);
-}
-
-TEST_P(BoxPaintInvalidatorTest, NonCompositedLayoutViewResize) {
- if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled())
- return;
-
- SetBodyInnerHTML(R"HTML(
- <style>
- body { margin: 0 }
- iframe { display: block; width: 100px; height: 100px; border: none; }
- </style>
- <iframe id='iframe'></iframe>
- )HTML");
- SetChildFrameHTML(R"HTML(
- <style>
- ::-webkit-scrollbar { display: none }
- body { margin: 0; background: green; height: 0 }
- </style>
- <div id='content' style='width: 200px; height: 200px'></div>
- )HTML");
- GetDocument().View()->UpdateAllLifecyclePhases();
- Element* iframe = GetDocument().getElementById("iframe");
- Element* content = ChildDocument().getElementById("content");
- EXPECT_EQ(GetLayoutView(),
- content->GetLayoutObject()->ContainerForPaintInvalidation());
-
- // Resize the content.
- GetDocument().View()->SetTracksPaintInvalidations(true);
- content->setAttribute(HTMLNames::styleAttr, "height: 500px");
- GetDocument().View()->UpdateAllLifecyclePhases();
- // No invalidation because the changed part of layout overflow is clipped.
- EXPECT_FALSE(GetRasterInvalidationTracking()->HasInvalidations());
- GetDocument().View()->SetTracksPaintInvalidations(false);
-
- // Resize the iframe.
- GetDocument().View()->SetTracksPaintInvalidations(true);
- iframe->setAttribute(HTMLNames::styleAttr, "height: 200px");
- GetDocument().View()->UpdateAllLifecyclePhases();
- const auto& raster_invalidations =
- GetRasterInvalidationTracking()->Invalidations();
- ASSERT_EQ(2u, raster_invalidations.size());
- EXPECT_EQ(IntRect(0, 100, 100, 100), raster_invalidations[0].rect);
- EXPECT_EQ(static_cast<const DisplayItemClient*>(iframe->GetLayoutObject()),
- raster_invalidations[0].client);
- EXPECT_EQ(PaintInvalidationReason::kIncremental,
- raster_invalidations[0].reason);
- EXPECT_EQ(
- static_cast<const DisplayItemClient*>(content->GetLayoutObject()->View()),
- raster_invalidations[1].client);
- EXPECT_EQ(IntRect(0, 100, 100, 100), raster_invalidations[1].rect);
- EXPECT_EQ(PaintInvalidationReason::kIncremental,
- raster_invalidations[1].reason);
- GetDocument().View()->SetTracksPaintInvalidations(false);
-}
-
-TEST_P(BoxPaintInvalidatorTest, NonCompositedLayoutViewGradientResize) {
- if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled())
- return;
-
- SetBodyInnerHTML(R"HTML(
- <style>
- body { margin: 0 }
- iframe { display: block; width: 100px; height: 100px; border: none; }
- </style>
- <iframe id='iframe'></iframe>
- )HTML");
- SetChildFrameHTML(R"HTML(
- <style>
- ::-webkit-scrollbar { display: none }
- body {
- margin: 0;
- height: 0;
- background-image: linear-gradient(blue, yellow);
- }
- </style>
- <div id='content' style='width: 200px; height: 200px'></div>
- )HTML");
- GetDocument().View()->UpdateAllLifecyclePhases();
- Element* iframe = GetDocument().getElementById("iframe");
- Element* content = ChildDocument().getElementById("content");
- LayoutView* frame_layout_view = content->GetLayoutObject()->View();
- EXPECT_EQ(GetLayoutView(),
- content->GetLayoutObject()->ContainerForPaintInvalidation());
-
- // Resize the content.
- GetDocument().View()->SetTracksPaintInvalidations(true);
- content->setAttribute(HTMLNames::styleAttr, "height: 500px");
- GetDocument().View()->UpdateAllLifecyclePhases();
- const auto* raster_invalidations =
- &GetRasterInvalidationTracking()->Invalidations();
- ASSERT_EQ(1u, raster_invalidations->size());
- EXPECT_EQ(IntRect(0, 0, 100, 100), (*raster_invalidations)[0].rect);
- EXPECT_EQ(static_cast<const DisplayItemClient*>(frame_layout_view),
- (*raster_invalidations)[0].client);
- EXPECT_EQ(PaintInvalidationReason::kBackground,
- (*raster_invalidations)[0].reason);
- GetDocument().View()->SetTracksPaintInvalidations(false);
-
- // Resize the iframe.
- GetDocument().View()->SetTracksPaintInvalidations(true);
- iframe->setAttribute(HTMLNames::styleAttr, "height: 200px");
- GetDocument().View()->UpdateAllLifecyclePhases();
- raster_invalidations = &GetRasterInvalidationTracking()->Invalidations();
- ASSERT_EQ(2u, raster_invalidations->size());
- EXPECT_EQ(IntRect(0, 100, 100, 100), (*raster_invalidations)[0].rect);
- EXPECT_EQ(static_cast<const DisplayItemClient*>(iframe->GetLayoutObject()),
- (*raster_invalidations)[0].client);
- EXPECT_EQ(PaintInvalidationReason::kIncremental,
- (*raster_invalidations)[0].reason);
- EXPECT_EQ(static_cast<const DisplayItemClient*>(frame_layout_view),
- (*raster_invalidations)[1].client);
- EXPECT_EQ(IntRect(0, 0, 100, 200), (*raster_invalidations)[1].rect);
- EXPECT_EQ(PaintInvalidationReason::kGeometry,
- (*raster_invalidations)[1].reason);
- GetDocument().View()->SetTracksPaintInvalidations(false);
-}
-
-TEST_P(BoxPaintInvalidatorTest, CompositedBackgroundAttachmentLocalResize) {
- if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled())
- return;
-
- EnableCompositing();
-
- Element* target = GetDocument().getElementById("target");
- target->setAttribute(HTMLNames::classAttr, "border local-background");
- target->setAttribute(HTMLNames::styleAttr, "will-change: transform");
- target->SetInnerHTMLFromString(
- "<div id=child style='width: 500px; height: 500px'></div>",
- ASSERT_NO_EXCEPTION);
- Element* child = GetDocument().getElementById("child");
- GetDocument().View()->UpdateAllLifecyclePhases();
-
- // Resize the content.
- GetDocument().View()->SetTracksPaintInvalidations(true);
- child->setAttribute(HTMLNames::styleAttr, "width: 500px; height: 1000px");
- GetDocument().View()->UpdateAllLifecyclePhases();
- LayoutBoxModelObject* target_obj =
- ToLayoutBoxModelObject(target->GetLayoutObject());
- GraphicsLayer* container_layer =
- target_obj->Layer()->GraphicsLayerBacking(target_obj);
- GraphicsLayer* contents_layer = target_obj->Layer()->GraphicsLayerBacking();
- // No invalidation on the container layer.
- EXPECT_FALSE(
- container_layer->GetRasterInvalidationTracking()->HasInvalidations());
- // Incremental invalidation of background on contents layer.
- const auto& contents_raster_invalidations =
- contents_layer->GetRasterInvalidationTracking()->Invalidations();
- ASSERT_EQ(1u, contents_raster_invalidations.size());
- EXPECT_EQ(IntRect(0, 500, 500, 500), contents_raster_invalidations[0].rect);
- EXPECT_EQ(static_cast<const DisplayItemClient*>(target->GetLayoutObject()),
- contents_raster_invalidations[0].client);
- EXPECT_EQ(PaintInvalidationReason::kBackgroundOnScrollingContentsLayer,
- contents_raster_invalidations[0].reason);
- GetDocument().View()->SetTracksPaintInvalidations(false);
-
- // Resize the container.
- GetDocument().View()->SetTracksPaintInvalidations(true);
- target->setAttribute(HTMLNames::styleAttr,
- "will-change: transform; height: 200px");
- GetDocument().View()->UpdateAllLifecyclePhases();
- // No invalidation on the contents layer.
- EXPECT_FALSE(
- contents_layer->GetRasterInvalidationTracking()->HasInvalidations());
- // Incremental invalidation on the container layer.
- const auto& container_raster_invalidations =
- container_layer->GetRasterInvalidationTracking()->Invalidations();
- ASSERT_EQ(1u, container_raster_invalidations.size());
- EXPECT_EQ(IntRect(0, 120, 70, 120), container_raster_invalidations[0].rect);
- EXPECT_EQ(static_cast<const DisplayItemClient*>(target->GetLayoutObject()),
- container_raster_invalidations[0].client);
- EXPECT_EQ(PaintInvalidationReason::kIncremental,
- container_raster_invalidations[0].reason);
- GetDocument().View()->SetTracksPaintInvalidations(false);
-}
-
-TEST_P(BoxPaintInvalidatorTest,
- CompositedBackgroundAttachmentLocalGradientResize) {
- if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled())
- return;
-
- EnableCompositing();
-
- Element* target = GetDocument().getElementById("target");
- target->setAttribute(HTMLNames::classAttr,
- "border local-background gradient");
- target->setAttribute(HTMLNames::styleAttr, "will-change: transform");
- target->SetInnerHTMLFromString(
- "<div id='child' style='width: 500px; height: 500px'></div>",
- ASSERT_NO_EXCEPTION);
- Element* child = GetDocument().getElementById("child");
- GetDocument().View()->UpdateAllLifecyclePhases();
-
- // Resize the content.
- GetDocument().View()->SetTracksPaintInvalidations(true);
- child->setAttribute(HTMLNames::styleAttr, "width: 500px; height: 1000px");
- GetDocument().View()->UpdateAllLifecyclePhases();
- LayoutBoxModelObject* target_obj =
- ToLayoutBoxModelObject(target->GetLayoutObject());
- GraphicsLayer* container_layer =
- target_obj->Layer()->GraphicsLayerBacking(target_obj);
- GraphicsLayer* contents_layer = target_obj->Layer()->GraphicsLayerBacking();
- // No invalidation on the container layer.
- EXPECT_FALSE(
- container_layer->GetRasterInvalidationTracking()->HasInvalidations());
- // Full invalidation of background on contents layer because the gradient
- // background is resized.
- const auto& contents_raster_invalidations =
- contents_layer->GetRasterInvalidationTracking()->Invalidations();
- ASSERT_EQ(1u, contents_raster_invalidations.size());
- EXPECT_EQ(IntRect(0, 0, 500, 1000), contents_raster_invalidations[0].rect);
- EXPECT_EQ(static_cast<const DisplayItemClient*>(target->GetLayoutObject()),
- contents_raster_invalidations[0].client);
- EXPECT_EQ(PaintInvalidationReason::kBackgroundOnScrollingContentsLayer,
- contents_raster_invalidations[0].reason);
- GetDocument().View()->SetTracksPaintInvalidations(false);
-
- // Resize the container.
- GetDocument().View()->SetTracksPaintInvalidations(true);
- target->setAttribute(HTMLNames::styleAttr,
- "will-change: transform; height: 200px");
- GetDocument().View()->UpdateAllLifecyclePhases();
- EXPECT_FALSE(
- contents_layer->GetRasterInvalidationTracking()->HasInvalidations());
- // Full invalidation on the container layer.
- const auto& container_raster_invalidations =
- container_layer->GetRasterInvalidationTracking()->Invalidations();
- ASSERT_EQ(1u, container_raster_invalidations.size());
- EXPECT_EQ(IntRect(0, 0, 70, 240), container_raster_invalidations[0].rect);
- EXPECT_EQ(static_cast<const DisplayItemClient*>(target->GetLayoutObject()),
- container_raster_invalidations[0].client);
- EXPECT_EQ(PaintInvalidationReason::kGeometry,
- container_raster_invalidations[0].reason);
- GetDocument().View()->SetTracksPaintInvalidations(false);
-}
-
-TEST_P(BoxPaintInvalidatorTest, NonCompositedBackgroundAttachmentLocalResize) {
- if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled())
- return;
-
- Element* target = GetDocument().getElementById("target");
- target->setAttribute(HTMLNames::classAttr, "border local-background");
- target->SetInnerHTMLFromString(
- "<div id=child style='width: 500px; height: 500px'></div>",
- ASSERT_NO_EXCEPTION);
- Element* child = GetDocument().getElementById("child");
- GetDocument().View()->UpdateAllLifecyclePhases();
- EXPECT_EQ(&GetLayoutView(),
- &target->GetLayoutObject()->ContainerForPaintInvalidation());
-
- // Resize the content.
- GetDocument().View()->SetTracksPaintInvalidations(true);
- child->setAttribute(HTMLNames::styleAttr, "width: 500px; height: 1000px");
- GetDocument().View()->UpdateAllLifecyclePhases();
- // No invalidation because the changed part is invisible.
- EXPECT_FALSE(GetRasterInvalidationTracking()->HasInvalidations());
-
- // Resize the container.
- GetDocument().View()->SetTracksPaintInvalidations(true);
- target->setAttribute(HTMLNames::styleAttr, "height: 200px");
- GetDocument().View()->UpdateAllLifecyclePhases();
- const auto& raster_invalidations =
- GetRasterInvalidationTracking()->Invalidations();
- ASSERT_EQ(1u, raster_invalidations.size());
- EXPECT_EQ(IntRect(0, 120, 70, 120), raster_invalidations[0].rect);
- EXPECT_EQ(static_cast<const DisplayItemClient*>(target->GetLayoutObject()),
- raster_invalidations[0].client);
- EXPECT_EQ(PaintInvalidationReason::kIncremental,
- raster_invalidations[0].reason);
- GetDocument().View()->SetTracksPaintInvalidations(false);
-}
-
-TEST_P(BoxPaintInvalidatorTest, CompositedSolidBackgroundResize) {
- if (RuntimeEnabledFeatures::SlimmingPaintV175Enabled())
- return;
-
- EnableCompositing();
- Element* target = GetDocument().getElementById("target");
- target->setAttribute(HTMLNames::classAttr, "solid-composited-scroller");
- target->SetInnerHTMLFromString("<div style='height: 500px'></div>",
- ASSERT_NO_EXCEPTION);
- GetDocument().View()->UpdateAllLifecyclePhases();
-
- // Resize the scroller.
- GetDocument().View()->SetTracksPaintInvalidations(true);
- target->setAttribute(HTMLNames::styleAttr, "width: 100px");
- GetDocument().View()->UpdateAllLifecyclePhases();
-
- LayoutBoxModelObject* target_object =
- ToLayoutBoxModelObject(target->GetLayoutObject());
- GraphicsLayer* scrolling_contents_layer =
- target_object->Layer()->GraphicsLayerBacking();
- const auto& invalidations =
- scrolling_contents_layer->GetRasterInvalidationTracking()
- ->Invalidations();
-
- ASSERT_EQ(1u, invalidations.size());
- EXPECT_EQ(IntRect(50, 0, 50, 500), invalidations[0].rect);
- EXPECT_EQ(static_cast<const DisplayItemClient*>(target_object),
- invalidations[0].client);
- EXPECT_EQ(PaintInvalidationReason::kBackgroundOnScrollingContentsLayer,
- invalidations[0].reason);
- GetDocument().View()->SetTracksPaintInvalidations(false);
-}
-
} // namespace blink