| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "core/HTMLNames.h" | 5 #include "core/HTMLNames.h" |
| 6 #include "core/frame/FrameView.h" | 6 #include "core/frame/FrameView.h" |
| 7 #include "core/layout/LayoutTestHelper.h" | 7 #include "core/layout/LayoutTestHelper.h" |
| 8 #include "core/layout/LayoutView.h" | 8 #include "core/layout/LayoutView.h" |
| 9 #include "core/paint/PaintLayer.h" | 9 #include "core/paint/PaintLayer.h" |
| 10 #include "platform/graphics/GraphicsLayer.h" | 10 #include "platform/graphics/GraphicsLayer.h" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 enableCompositing(); | 29 enableCompositing(); |
| 30 setBodyInnerHTML( | 30 setBodyInnerHTML( |
| 31 "<style>" | 31 "<style>" |
| 32 " body { margin: 0 }" | 32 " body { margin: 0 }" |
| 33 " #target {" | 33 " #target {" |
| 34 " width: 50px;" | 34 " width: 50px;" |
| 35 " height: 100px;" | 35 " height: 100px;" |
| 36 " border-width: 20px 10px;" | 36 " border-width: 20px 10px;" |
| 37 " border-style: solid;" | 37 " border-style: solid;" |
| 38 " border-color: red;" | 38 " border-color: red;" |
| 39 " transform-origin: 0 0" |
| 39 " }" | 40 " }" |
| 40 "</style>" | 41 "</style>" |
| 41 "<div id='target'></div>"); | 42 "<div id='target'></div>"); |
| 42 } | 43 } |
| 43 }; | 44 }; |
| 44 | 45 |
| 45 TEST_F(BoxPaintInvalidatorTest, IncrementalInvalidationExpand) { | 46 TEST_F(BoxPaintInvalidatorTest, IncrementalInvalidationExpand) { |
| 46 document().view()->setTracksPaintInvalidations(true); | 47 document().view()->setTracksPaintInvalidations(true); |
| 47 Element* target = document().getElementById("target"); | 48 Element* target = document().getElementById("target"); |
| 48 target->setAttribute(HTMLNames::styleAttr, "width: 100px; height: 200px"); | 49 target->setAttribute(HTMLNames::styleAttr, "width: 100px; height: 200px"); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 EXPECT_EQ(PaintInvalidationIncremental, rasterInvalidations[0].reason); | 85 EXPECT_EQ(PaintInvalidationIncremental, rasterInvalidations[0].reason); |
| 85 EXPECT_EQ(IntRect(0, 100, 70, 40), rasterInvalidations[1].rect); | 86 EXPECT_EQ(IntRect(0, 100, 70, 40), rasterInvalidations[1].rect); |
| 86 EXPECT_EQ(PaintInvalidationIncremental, rasterInvalidations[1].reason); | 87 EXPECT_EQ(PaintInvalidationIncremental, rasterInvalidations[1].reason); |
| 87 document().view()->setTracksPaintInvalidations(false); | 88 document().view()->setTracksPaintInvalidations(false); |
| 88 } | 89 } |
| 89 | 90 |
| 90 TEST_F(BoxPaintInvalidatorTest, SubpixelVisualRectChagne) { | 91 TEST_F(BoxPaintInvalidatorTest, SubpixelVisualRectChagne) { |
| 91 ScopedSlimmingPaintInvalidationForTest scopedSlimmingPaintInvalidation(true); | 92 ScopedSlimmingPaintInvalidationForTest scopedSlimmingPaintInvalidation(true); |
| 92 | 93 |
| 93 Element* target = document().getElementById("target"); | 94 Element* target = document().getElementById("target"); |
| 94 LayoutObject* targetObject = target->layoutObject(); | |
| 95 EXPECT_FALSE(targetObject->previousPaintInvalidationRectCoversExtraPixels()); | |
| 96 | 95 |
| 97 // Should do full invalidation if new geometry has subpixels. | 96 // Should do full invalidation if new geometry has subpixels. |
| 98 document().view()->setTracksPaintInvalidations(true); | 97 document().view()->setTracksPaintInvalidations(true); |
| 99 target->setAttribute(HTMLNames::styleAttr, "width: 100.6px; height: 70.3px"); | 98 target->setAttribute(HTMLNames::styleAttr, "width: 100.6px; height: 70.3px"); |
| 100 document().view()->updateAllLifecyclePhases(); | 99 document().view()->updateAllLifecyclePhases(); |
| 101 EXPECT_TRUE(targetObject->previousPaintInvalidationRectCoversExtraPixels()); | |
| 102 const auto* rasterInvalidations = | 100 const auto* rasterInvalidations = |
| 103 &getRasterInvalidationTracking()->trackedRasterInvalidations; | 101 &getRasterInvalidationTracking()->trackedRasterInvalidations; |
| 104 EXPECT_EQ(2u, rasterInvalidations->size()); | 102 EXPECT_EQ(2u, rasterInvalidations->size()); |
| 105 EXPECT_EQ(IntRect(0, 0, 70, 140), (*rasterInvalidations)[0].rect); | 103 EXPECT_EQ(IntRect(0, 0, 70, 140), (*rasterInvalidations)[0].rect); |
| 106 EXPECT_EQ(PaintInvalidationBoundsChange, (*rasterInvalidations)[0].reason); | 104 EXPECT_EQ(PaintInvalidationBorderBoxChange, (*rasterInvalidations)[0].reason); |
| 107 EXPECT_EQ(IntRect(0, 0, 121, 111), (*rasterInvalidations)[1].rect); | 105 EXPECT_EQ(IntRect(0, 0, 121, 111), (*rasterInvalidations)[1].rect); |
| 108 EXPECT_EQ(PaintInvalidationBoundsChange, (*rasterInvalidations)[1].reason); | 106 EXPECT_EQ(PaintInvalidationBorderBoxChange, (*rasterInvalidations)[1].reason); |
| 109 document().view()->setTracksPaintInvalidations(false); | 107 document().view()->setTracksPaintInvalidations(false); |
| 110 | 108 |
| 111 // Should do full invalidation if old geometry has subpixels. | 109 // Should do full invalidation if old geometry has subpixels. |
| 112 document().view()->setTracksPaintInvalidations(true); | 110 document().view()->setTracksPaintInvalidations(true); |
| 113 target->setAttribute(HTMLNames::styleAttr, "width: 50px; height: 100px"); | 111 target->setAttribute(HTMLNames::styleAttr, "width: 50px; height: 100px"); |
| 114 document().view()->updateAllLifecyclePhases(); | 112 document().view()->updateAllLifecyclePhases(); |
| 115 EXPECT_FALSE(targetObject->previousPaintInvalidationRectCoversExtraPixels()); | |
| 116 rasterInvalidations = | 113 rasterInvalidations = |
| 117 &getRasterInvalidationTracking()->trackedRasterInvalidations; | 114 &getRasterInvalidationTracking()->trackedRasterInvalidations; |
| 118 EXPECT_EQ(2u, rasterInvalidations->size()); | 115 EXPECT_EQ(2u, rasterInvalidations->size()); |
| 119 EXPECT_EQ(IntRect(0, 0, 121, 111), (*rasterInvalidations)[0].rect); | 116 EXPECT_EQ(IntRect(0, 0, 121, 111), (*rasterInvalidations)[0].rect); |
| 120 EXPECT_EQ(PaintInvalidationBoundsChange, (*rasterInvalidations)[0].reason); | 117 EXPECT_EQ(PaintInvalidationBorderBoxChange, (*rasterInvalidations)[0].reason); |
| 121 EXPECT_EQ(IntRect(0, 0, 70, 140), (*rasterInvalidations)[1].rect); | 118 EXPECT_EQ(IntRect(0, 0, 70, 140), (*rasterInvalidations)[1].rect); |
| 122 EXPECT_EQ(PaintInvalidationBoundsChange, (*rasterInvalidations)[1].reason); | 119 EXPECT_EQ(PaintInvalidationBorderBoxChange, (*rasterInvalidations)[1].reason); |
| 123 document().view()->setTracksPaintInvalidations(false); | 120 document().view()->setTracksPaintInvalidations(false); |
| 124 } | 121 } |
| 125 | 122 |
| 126 TEST_F(BoxPaintInvalidatorTest, SubpixelChangeWithoutVisualRectChange) { | 123 TEST_F(BoxPaintInvalidatorTest, SubpixelChangeWithoutVisualRectChange) { |
| 127 ScopedSlimmingPaintInvalidationForTest scopedSlimmingPaintInvalidation(true); | 124 ScopedSlimmingPaintInvalidationForTest scopedSlimmingPaintInvalidation(true); |
| 128 | 125 |
| 129 Element* target = document().getElementById("target"); | 126 Element* target = document().getElementById("target"); |
| 130 LayoutObject* targetObject = target->layoutObject(); | 127 LayoutObject* targetObject = target->layoutObject(); |
| 131 EXPECT_EQ(LayoutRect(0, 0, 70, 140), | 128 EXPECT_EQ(LayoutRect(0, 0, 70, 140), |
| 132 targetObject->previousPaintInvalidationRect()); | 129 targetObject->previousPaintInvalidationRect()); |
| 133 EXPECT_FALSE(targetObject->previousPaintInvalidationRectCoversExtraPixels()); | |
| 134 | 130 |
| 135 // Should do full invalidation if new geometry has subpixels even if the paint | 131 // Should do full invalidation if new geometry has subpixels even if the paint |
| 136 // invalidation rect doesn't change. | 132 // invalidation rect doesn't change. |
| 137 document().view()->setTracksPaintInvalidations(true); | 133 document().view()->setTracksPaintInvalidations(true); |
| 138 target->setAttribute(HTMLNames::styleAttr, | 134 target->setAttribute(HTMLNames::styleAttr, |
| 139 "margin-top: 0.6px; width: 50px; height: 99.3px"); | 135 "margin-top: 0.6px; width: 50px; height: 99.3px"); |
| 140 document().view()->updateAllLifecyclePhases(); | 136 document().view()->updateAllLifecyclePhases(); |
| 141 EXPECT_EQ(LayoutRect(0, 0, 70, 140), | 137 EXPECT_EQ(LayoutRect(0, 0, 70, 140), |
| 142 targetObject->previousPaintInvalidationRect()); | 138 targetObject->previousPaintInvalidationRect()); |
| 143 EXPECT_TRUE(targetObject->previousPaintInvalidationRectCoversExtraPixels()); | |
| 144 const auto* rasterInvalidations = | 139 const auto* rasterInvalidations = |
| 145 &getRasterInvalidationTracking()->trackedRasterInvalidations; | 140 &getRasterInvalidationTracking()->trackedRasterInvalidations; |
| 146 EXPECT_EQ(1u, rasterInvalidations->size()); | 141 EXPECT_EQ(1u, rasterInvalidations->size()); |
| 147 EXPECT_EQ(IntRect(0, 0, 70, 140), (*rasterInvalidations)[0].rect); | 142 EXPECT_EQ(IntRect(0, 0, 70, 140), (*rasterInvalidations)[0].rect); |
| 148 EXPECT_EQ(PaintInvalidationLocationChange, (*rasterInvalidations)[0].reason); | 143 EXPECT_EQ(PaintInvalidationLocationChange, (*rasterInvalidations)[0].reason); |
| 149 document().view()->setTracksPaintInvalidations(false); | 144 document().view()->setTracksPaintInvalidations(false); |
| 150 | 145 |
| 151 // When changing size in subpixels keeping the paint invalidation rect | |
| 152 // unchanged, incremental incremental should cover all the changed pixels. | |
| 153 document().view()->setTracksPaintInvalidations(true); | 146 document().view()->setTracksPaintInvalidations(true); |
| 154 target->setAttribute(HTMLNames::styleAttr, | 147 target->setAttribute(HTMLNames::styleAttr, |
| 155 "margin-top: 0.6px; width: 49.3px; height: 98.5px"); | 148 "margin-top: 0.6px; width: 49.3px; height: 98.5px"); |
| 156 document().view()->updateAllLifecyclePhases(); | 149 document().view()->updateAllLifecyclePhases(); |
| 157 EXPECT_EQ(LayoutRect(0, 0, 70, 140), | 150 EXPECT_EQ(LayoutRect(0, 0, 70, 140), |
| 158 targetObject->previousPaintInvalidationRect()); | 151 targetObject->previousPaintInvalidationRect()); |
| 159 EXPECT_TRUE(targetObject->previousPaintInvalidationRectCoversExtraPixels()); | |
| 160 rasterInvalidations = | 152 rasterInvalidations = |
| 161 &getRasterInvalidationTracking()->trackedRasterInvalidations; | 153 &getRasterInvalidationTracking()->trackedRasterInvalidations; |
| 162 EXPECT_EQ(2u, rasterInvalidations->size()); | 154 EXPECT_EQ(1u, rasterInvalidations->size()); |
| 163 EXPECT_EQ(IntRect(59, 0, 11, 140), (*rasterInvalidations)[0].rect); | 155 EXPECT_EQ(IntRect(0, 0, 70, 140), (*rasterInvalidations)[0].rect); |
| 164 EXPECT_EQ(PaintInvalidationIncremental, (*rasterInvalidations)[0].reason); | 156 EXPECT_EQ(PaintInvalidationBorderBoxChange, (*rasterInvalidations)[0].reason); |
| 165 EXPECT_EQ(IntRect(0, 119, 70, 21), (*rasterInvalidations)[1].rect); | |
| 166 EXPECT_EQ(PaintInvalidationIncremental, (*rasterInvalidations)[1].reason); | |
| 167 document().view()->setTracksPaintInvalidations(false); | 157 document().view()->setTracksPaintInvalidations(false); |
| 168 } | 158 } |
| 169 | 159 |
| 160 TEST_F(BoxPaintInvalidatorTest, ResizeRotated) { |
| 161 ScopedSlimmingPaintInvalidationForTest scopedSlimmingPaintInvalidation(true); |
| 162 |
| 163 Element* target = document().getElementById("target"); |
| 164 target->setAttribute(HTMLNames::styleAttr, "transform: rotate(45deg)"); |
| 165 document().view()->updateAllLifecyclePhases(); |
| 166 |
| 167 // Should do full invalidation a rotated object is resized. |
| 168 document().view()->setTracksPaintInvalidations(true); |
| 169 target->setAttribute(HTMLNames::styleAttr, |
| 170 "transform: rotate(45deg); width: 200px"); |
| 171 document().view()->updateAllLifecyclePhases(); |
| 172 const auto* rasterInvalidations = |
| 173 &getRasterInvalidationTracking()->trackedRasterInvalidations; |
| 174 EXPECT_EQ(1u, rasterInvalidations->size()); |
| 175 EXPECT_EQ(IntRect(-99, 0, 255, 255), (*rasterInvalidations)[0].rect); |
| 176 EXPECT_EQ(PaintInvalidationBorderBoxChange, (*rasterInvalidations)[0].reason); |
| 177 document().view()->setTracksPaintInvalidations(false); |
| 178 } |
| 179 |
| 180 TEST_F(BoxPaintInvalidatorTest, ResizeRotatedChild) { |
| 181 ScopedSlimmingPaintInvalidationForTest scopedSlimmingPaintInvalidation(true); |
| 182 |
| 183 Element* target = document().getElementById("target"); |
| 184 target->setAttribute(HTMLNames::styleAttr, |
| 185 "transform: rotate(45deg); width: 200px"); |
| 186 target->setInnerHTML( |
| 187 "<div id=child style='width: 50px; height: 50px; background: red'></div>", |
| 188 ASSERT_NO_EXCEPTION); |
| 189 document().view()->updateAllLifecyclePhases(); |
| 190 Element* child = document().getElementById("child"); |
| 191 |
| 192 // Should do full invalidation a rotated object is resized. |
| 193 document().view()->setTracksPaintInvalidations(true); |
| 194 child->setAttribute(HTMLNames::styleAttr, |
| 195 "width: 100px; height: 50px; background: red"); |
| 196 document().view()->updateAllLifecyclePhases(); |
| 197 const auto* rasterInvalidations = |
| 198 &getRasterInvalidationTracking()->trackedRasterInvalidations; |
| 199 EXPECT_EQ(1u, rasterInvalidations->size()); |
| 200 EXPECT_EQ(IntRect(-43, 21, 107, 107), (*rasterInvalidations)[0].rect); |
| 201 EXPECT_EQ(PaintInvalidationBorderBoxChange, (*rasterInvalidations)[0].reason); |
| 202 document().view()->setTracksPaintInvalidations(false); |
| 203 } |
| 204 |
| 170 } // namespace blink | 205 } // namespace blink |
| OLD | NEW |