| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/layout/compositing/CompositedLayerMapping.h" | 5 #include "core/layout/compositing/CompositedLayerMapping.h" |
| 6 | 6 |
| 7 #include "core/frame/FrameView.h" | 7 #include "core/frame/FrameView.h" |
| 8 #include "core/layout/LayoutBoxModelObject.h" | 8 #include "core/layout/LayoutBoxModelObject.h" |
| 9 #include "core/layout/LayoutTestHelper.h" | 9 #include "core/layout/LayoutTestHelper.h" |
| 10 #include "core/layout/api/LayoutViewItem.h" | 10 #include "core/layout/api/LayoutViewItem.h" |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 TEST_F(CompositedLayerMappingTest, TallLayerInterestRect) { | 84 TEST_F(CompositedLayerMappingTest, TallLayerInterestRect) { |
| 85 setBodyInnerHTML( | 85 setBodyInnerHTML( |
| 86 "<div id='target' style='width: 200px; height: 10000px; will-change: " | 86 "<div id='target' style='width: 200px; height: 10000px; will-change: " |
| 87 "transform'></div>"); | 87 "transform'></div>"); |
| 88 | 88 |
| 89 document().view()->updateAllLifecyclePhases(); | 89 document().view()->updateAllLifecyclePhases(); |
| 90 Element* element = document().getElementById("target"); | 90 Element* element = document().getElementById("target"); |
| 91 PaintLayer* paintLayer = | 91 PaintLayer* paintLayer = |
| 92 toLayoutBoxModelObject(element->layoutObject())->layer(); | 92 toLayoutBoxModelObject(element->layoutObject())->layer(); |
| 93 ASSERT_TRUE(paintLayer->graphicsLayerBacking()); | 93 ASSERT_TRUE(paintLayer->graphicsLayerBacking()); |
| 94 // Screen-space visible content rect is [8, 8, 200, 600]. Mapping back to loca
l, adding 4000px in all directions, then | 94 // Screen-space visible content rect is [8, 8, 200, 600]. Mapping back to |
| 95 // clipping, yields this rect. | 95 // local, adding 4000px in all directions, then clipping, yields this rect. |
| 96 EXPECT_RECT_EQ(IntRect(0, 0, 200, 4592), | 96 EXPECT_RECT_EQ(IntRect(0, 0, 200, 4592), |
| 97 recomputeInterestRect(paintLayer->graphicsLayerBacking())); | 97 recomputeInterestRect(paintLayer->graphicsLayerBacking())); |
| 98 } | 98 } |
| 99 | 99 |
| 100 TEST_F(CompositedLayerMappingTest, TallLayerWholeDocumentInterestRect) { | 100 TEST_F(CompositedLayerMappingTest, TallLayerWholeDocumentInterestRect) { |
| 101 setBodyInnerHTML( | 101 setBodyInnerHTML( |
| 102 "<div id='target' style='width: 200px; height: 10000px; will-change: " | 102 "<div id='target' style='width: 200px; height: 10000px; will-change: " |
| 103 "transform'></div>"); | 103 "transform'></div>"); |
| 104 | 104 |
| 105 document().settings()->setMainFrameClipsContent(false); | 105 document().settings()->setMainFrameClipsContent(false); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 126 "200px;'></div>"); | 126 "200px;'></div>"); |
| 127 | 127 |
| 128 document().view()->updateAllLifecyclePhases(); | 128 document().view()->updateAllLifecyclePhases(); |
| 129 document().view()->setScrollPosition(DoublePoint(-5000, 0), | 129 document().view()->setScrollPosition(DoublePoint(-5000, 0), |
| 130 ProgrammaticScroll); | 130 ProgrammaticScroll); |
| 131 document().view()->updateAllLifecyclePhases(); | 131 document().view()->updateAllLifecyclePhases(); |
| 132 | 132 |
| 133 PaintLayer* paintLayer = document().layoutViewItem().layer(); | 133 PaintLayer* paintLayer = document().layoutViewItem().layer(); |
| 134 ASSERT_TRUE(paintLayer->graphicsLayerBacking()); | 134 ASSERT_TRUE(paintLayer->graphicsLayerBacking()); |
| 135 ASSERT_TRUE(paintLayer->compositedLayerMapping()); | 135 ASSERT_TRUE(paintLayer->compositedLayerMapping()); |
| 136 // A scroll by -5000px is equivalent to a scroll by (10000 - 5000 - 800)px = 4
200px in non-RTL mode. Expanding | 136 // A scroll by -5000px is equivalent to a scroll by (10000 - 5000 - 800)px = |
| 137 // the resulting rect by 4000px in each direction yields this result. | 137 // 4200px in non-RTL mode. Expanding the resulting rect by 4000px in each |
| 138 // direction yields this result. |
| 138 EXPECT_RECT_EQ(IntRect(200, 0, 8800, 600), | 139 EXPECT_RECT_EQ(IntRect(200, 0, 8800, 600), |
| 139 recomputeInterestRect(paintLayer->graphicsLayerBacking())); | 140 recomputeInterestRect(paintLayer->graphicsLayerBacking())); |
| 140 } | 141 } |
| 141 | 142 |
| 142 TEST_F(CompositedLayerMappingTest, RotatedInterestRect) { | 143 TEST_F(CompositedLayerMappingTest, RotatedInterestRect) { |
| 143 setBodyInnerHTML( | 144 setBodyInnerHTML( |
| 144 "<div id='target' style='width: 200px; height: 200px; will-change: " | 145 "<div id='target' style='width: 200px; height: 200px; will-change: " |
| 145 "transform; transform: rotateZ(45deg)'></div>"); | 146 "transform; transform: rotateZ(45deg)'></div>"); |
| 146 | 147 |
| 147 document().view()->updateAllLifecyclePhases(); | 148 document().view()->updateAllLifecyclePhases(); |
| 148 Element* element = document().getElementById("target"); | 149 Element* element = document().getElementById("target"); |
| 149 PaintLayer* paintLayer = | 150 PaintLayer* paintLayer = |
| 150 toLayoutBoxModelObject(element->layoutObject())->layer(); | 151 toLayoutBoxModelObject(element->layoutObject())->layer(); |
| 151 ASSERT_TRUE(!!paintLayer->graphicsLayerBacking()); | 152 ASSERT_TRUE(!!paintLayer->graphicsLayerBacking()); |
| 152 EXPECT_RECT_EQ(IntRect(0, 0, 200, 200), | 153 EXPECT_RECT_EQ(IntRect(0, 0, 200, 200), |
| 153 recomputeInterestRect(paintLayer->graphicsLayerBacking())); | 154 recomputeInterestRect(paintLayer->graphicsLayerBacking())); |
| 154 } | 155 } |
| 155 | 156 |
| 156 TEST_F(CompositedLayerMappingTest, RotatedInterestRectNear90Degrees) { | 157 TEST_F(CompositedLayerMappingTest, RotatedInterestRectNear90Degrees) { |
| 157 setBodyInnerHTML( | 158 setBodyInnerHTML( |
| 158 "<div id='target' style='width: 10000px; height: 200px; will-change: " | 159 "<div id='target' style='width: 10000px; height: 200px; will-change: " |
| 159 "transform; transform: rotateY(89.9999deg)'></div>"); | 160 "transform; transform: rotateY(89.9999deg)'></div>"); |
| 160 | 161 |
| 161 document().view()->updateAllLifecyclePhases(); | 162 document().view()->updateAllLifecyclePhases(); |
| 162 Element* element = document().getElementById("target"); | 163 Element* element = document().getElementById("target"); |
| 163 PaintLayer* paintLayer = | 164 PaintLayer* paintLayer = |
| 164 toLayoutBoxModelObject(element->layoutObject())->layer(); | 165 toLayoutBoxModelObject(element->layoutObject())->layer(); |
| 165 ASSERT_TRUE(!!paintLayer->graphicsLayerBacking()); | 166 ASSERT_TRUE(!!paintLayer->graphicsLayerBacking()); |
| 166 // Because the layer is rotated to almost 90 degrees, floating-point error lea
ds to a reverse-projected rect that is much much larger | 167 // Because the layer is rotated to almost 90 degrees, floating-point error |
| 167 // than the original layer size in certain dimensions. In such cases, we often
fall back to the 4000px interest rect padding amount. | 168 // leads to a reverse-projected rect that is much much larger than the |
| 169 // original layer size in certain dimensions. In such cases, we often fall |
| 170 // back to the 4000px interest rect padding amount. |
| 168 EXPECT_RECT_EQ(IntRect(0, 0, 4000, 200), | 171 EXPECT_RECT_EQ(IntRect(0, 0, 4000, 200), |
| 169 recomputeInterestRect(paintLayer->graphicsLayerBacking())); | 172 recomputeInterestRect(paintLayer->graphicsLayerBacking())); |
| 170 } | 173 } |
| 171 | 174 |
| 172 TEST_F(CompositedLayerMappingTest, 3D90DegRotatedTallInterestRect) { | 175 TEST_F(CompositedLayerMappingTest, 3D90DegRotatedTallInterestRect) { |
| 173 // It's rotated 90 degrees about the X axis, which means its visual content re
ct is empty, and so the interest rect is the | 176 // It's rotated 90 degrees about the X axis, which means its visual content |
| 174 // default (0, 0, 4000, 4000) intersected with the layer bounds. | 177 // rect is empty, and so the interest rect is the default (0, 0, 4000, 4000) |
| 178 // intersected with the layer bounds. |
| 175 setBodyInnerHTML( | 179 setBodyInnerHTML( |
| 176 "<div id='target' style='width: 200px; height: 10000px; will-change: " | 180 "<div id='target' style='width: 200px; height: 10000px; will-change: " |
| 177 "transform; transform: rotateY(90deg)'></div>"); | 181 "transform; transform: rotateY(90deg)'></div>"); |
| 178 | 182 |
| 179 document().view()->updateAllLifecyclePhases(); | 183 document().view()->updateAllLifecyclePhases(); |
| 180 Element* element = document().getElementById("target"); | 184 Element* element = document().getElementById("target"); |
| 181 PaintLayer* paintLayer = | 185 PaintLayer* paintLayer = |
| 182 toLayoutBoxModelObject(element->layoutObject())->layer(); | 186 toLayoutBoxModelObject(element->layoutObject())->layer(); |
| 183 ASSERT_TRUE(!!paintLayer->graphicsLayerBacking()); | 187 ASSERT_TRUE(!!paintLayer->graphicsLayerBacking()); |
| 184 EXPECT_RECT_EQ(IntRect(0, 0, 200, 4000), | 188 EXPECT_RECT_EQ(IntRect(0, 0, 200, 4000), |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 TEST_F(CompositedLayerMappingTest, WideLayerInterestRect) { | 220 TEST_F(CompositedLayerMappingTest, WideLayerInterestRect) { |
| 217 setBodyInnerHTML( | 221 setBodyInnerHTML( |
| 218 "<div id='target' style='width: 10000px; height: 200px; will-change: " | 222 "<div id='target' style='width: 10000px; height: 200px; will-change: " |
| 219 "transform'></div>"); | 223 "transform'></div>"); |
| 220 | 224 |
| 221 document().view()->updateAllLifecyclePhases(); | 225 document().view()->updateAllLifecyclePhases(); |
| 222 Element* element = document().getElementById("target"); | 226 Element* element = document().getElementById("target"); |
| 223 PaintLayer* paintLayer = | 227 PaintLayer* paintLayer = |
| 224 toLayoutBoxModelObject(element->layoutObject())->layer(); | 228 toLayoutBoxModelObject(element->layoutObject())->layer(); |
| 225 ASSERT_TRUE(!!paintLayer->graphicsLayerBacking()); | 229 ASSERT_TRUE(!!paintLayer->graphicsLayerBacking()); |
| 226 // Screen-space visible content rect is [8, 8, 800, 200] (the screen is 800x60
0). | 230 // Screen-space visible content rect is [8, 8, 800, 200] (the screen is |
| 227 // Mapping back to local, adding 4000px in all directions, then clipping, yiel
ds this rect. | 231 // 800x600). Mapping back to local, adding 4000px in all directions, then |
| 232 // clipping, yields this rect. |
| 228 EXPECT_RECT_EQ(IntRect(0, 0, 4792, 200), | 233 EXPECT_RECT_EQ(IntRect(0, 0, 4792, 200), |
| 229 recomputeInterestRect(paintLayer->graphicsLayerBacking())); | 234 recomputeInterestRect(paintLayer->graphicsLayerBacking())); |
| 230 } | 235 } |
| 231 | 236 |
| 232 TEST_F(CompositedLayerMappingTest, FixedPositionInterestRect) { | 237 TEST_F(CompositedLayerMappingTest, FixedPositionInterestRect) { |
| 233 setBodyInnerHTML( | 238 setBodyInnerHTML( |
| 234 "<div id='target' style='width: 300px; height: 400px; will-change: " | 239 "<div id='target' style='width: 300px; height: 400px; will-change: " |
| 235 "transform; position: fixed; top: 100px; left: 200px;'></div>"); | 240 "transform; position: fixed; top: 100px; left: 200px;'></div>"); |
| 236 | 241 |
| 237 document().view()->updateAllLifecyclePhases(); | 242 document().view()->updateAllLifecyclePhases(); |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 shouldFlattenTransform(*compositedLayerMapping->scrollingLayer())); | 360 shouldFlattenTransform(*compositedLayerMapping->scrollingLayer())); |
| 356 EXPECT_TRUE(shouldFlattenTransform( | 361 EXPECT_TRUE(shouldFlattenTransform( |
| 357 *compositedLayerMapping->scrollingContentsLayer())); | 362 *compositedLayerMapping->scrollingContentsLayer())); |
| 358 } | 363 } |
| 359 | 364 |
| 360 TEST_F(CompositedLayerMappingTest, InterestRectChangedEnoughToRepaintEmpty) { | 365 TEST_F(CompositedLayerMappingTest, InterestRectChangedEnoughToRepaintEmpty) { |
| 361 IntSize layerSize(1000, 1000); | 366 IntSize layerSize(1000, 1000); |
| 362 // Both empty means there is nothing to do. | 367 // Both empty means there is nothing to do. |
| 363 EXPECT_FALSE( | 368 EXPECT_FALSE( |
| 364 interestRectChangedEnoughToRepaint(IntRect(), IntRect(), layerSize)); | 369 interestRectChangedEnoughToRepaint(IntRect(), IntRect(), layerSize)); |
| 365 // Going from empty to non-empty means we must re-record because it could be t
he first frame after construction or Clear. | 370 // Going from empty to non-empty means we must re-record because it could be |
| 371 // the first frame after construction or Clear. |
| 366 EXPECT_TRUE(interestRectChangedEnoughToRepaint(IntRect(), IntRect(0, 0, 1, 1), | 372 EXPECT_TRUE(interestRectChangedEnoughToRepaint(IntRect(), IntRect(0, 0, 1, 1), |
| 367 layerSize)); | 373 layerSize)); |
| 368 // Going from non-empty to empty is not special-cased. | 374 // Going from non-empty to empty is not special-cased. |
| 369 EXPECT_FALSE(interestRectChangedEnoughToRepaint(IntRect(0, 0, 1, 1), | 375 EXPECT_FALSE(interestRectChangedEnoughToRepaint(IntRect(0, 0, 1, 1), |
| 370 IntRect(), layerSize)); | 376 IntRect(), layerSize)); |
| 371 } | 377 } |
| 372 | 378 |
| 373 TEST_F(CompositedLayerMappingTest, | 379 TEST_F(CompositedLayerMappingTest, |
| 374 InterestRectChangedEnoughToRepaintNotBigEnough) { | 380 InterestRectChangedEnoughToRepaintNotBigEnough) { |
| 375 IntSize layerSize(1000, 1000); | 381 IntSize layerSize(1000, 1000); |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 451 "<div id='div' style='width: 100px; height: 10000px'>Text</div>"); | 457 "<div id='div' style='width: 100px; height: 10000px'>Text</div>"); |
| 452 | 458 |
| 453 document().view()->updateAllLifecyclePhases(); | 459 document().view()->updateAllLifecyclePhases(); |
| 454 GraphicsLayer* rootScrollingLayer = | 460 GraphicsLayer* rootScrollingLayer = |
| 455 document().layoutViewItem().layer()->graphicsLayerBackingForScrolling(); | 461 document().layoutViewItem().layer()->graphicsLayerBackingForScrolling(); |
| 456 EXPECT_RECT_EQ(IntRect(0, 0, 800, 4600), | 462 EXPECT_RECT_EQ(IntRect(0, 0, 800, 4600), |
| 457 previousInterestRect(rootScrollingLayer)); | 463 previousInterestRect(rootScrollingLayer)); |
| 458 | 464 |
| 459 document().view()->setScrollPosition(IntPoint(0, 300), ProgrammaticScroll); | 465 document().view()->setScrollPosition(IntPoint(0, 300), ProgrammaticScroll); |
| 460 document().view()->updateAllLifecyclePhases(); | 466 document().view()->updateAllLifecyclePhases(); |
| 461 // Still use the previous interest rect because the recomputed rect hasn't cha
nged enough. | 467 // Still use the previous interest rect because the recomputed rect hasn't |
| 468 // changed enough. |
| 462 EXPECT_RECT_EQ(IntRect(0, 0, 800, 4900), | 469 EXPECT_RECT_EQ(IntRect(0, 0, 800, 4900), |
| 463 recomputeInterestRect(rootScrollingLayer)); | 470 recomputeInterestRect(rootScrollingLayer)); |
| 464 EXPECT_RECT_EQ(IntRect(0, 0, 800, 4600), | 471 EXPECT_RECT_EQ(IntRect(0, 0, 800, 4600), |
| 465 previousInterestRect(rootScrollingLayer)); | 472 previousInterestRect(rootScrollingLayer)); |
| 466 | 473 |
| 467 document().view()->setScrollPosition(IntPoint(0, 600), ProgrammaticScroll); | 474 document().view()->setScrollPosition(IntPoint(0, 600), ProgrammaticScroll); |
| 468 document().view()->updateAllLifecyclePhases(); | 475 document().view()->updateAllLifecyclePhases(); |
| 469 // Use recomputed interest rect because it changed enough. | 476 // Use recomputed interest rect because it changed enough. |
| 470 EXPECT_RECT_EQ(IntRect(0, 0, 800, 5200), | 477 EXPECT_RECT_EQ(IntRect(0, 0, 800, 5200), |
| 471 recomputeInterestRect(rootScrollingLayer)); | 478 recomputeInterestRect(rootScrollingLayer)); |
| 472 EXPECT_RECT_EQ(IntRect(0, 0, 800, 5200), | 479 EXPECT_RECT_EQ(IntRect(0, 0, 800, 5200), |
| 473 previousInterestRect(rootScrollingLayer)); | 480 previousInterestRect(rootScrollingLayer)); |
| 474 | 481 |
| 475 document().view()->setScrollPosition(IntPoint(0, 5400), ProgrammaticScroll); | 482 document().view()->setScrollPosition(IntPoint(0, 5400), ProgrammaticScroll); |
| 476 document().view()->updateAllLifecyclePhases(); | 483 document().view()->updateAllLifecyclePhases(); |
| 477 EXPECT_RECT_EQ(IntRect(0, 1400, 800, 8600), | 484 EXPECT_RECT_EQ(IntRect(0, 1400, 800, 8600), |
| 478 recomputeInterestRect(rootScrollingLayer)); | 485 recomputeInterestRect(rootScrollingLayer)); |
| 479 EXPECT_RECT_EQ(IntRect(0, 1400, 800, 8600), | 486 EXPECT_RECT_EQ(IntRect(0, 1400, 800, 8600), |
| 480 previousInterestRect(rootScrollingLayer)); | 487 previousInterestRect(rootScrollingLayer)); |
| 481 | 488 |
| 482 document().view()->setScrollPosition(IntPoint(0, 9000), ProgrammaticScroll); | 489 document().view()->setScrollPosition(IntPoint(0, 9000), ProgrammaticScroll); |
| 483 document().view()->updateAllLifecyclePhases(); | 490 document().view()->updateAllLifecyclePhases(); |
| 484 // Still use the previous interest rect because it contains the recomputed int
erest rect. | 491 // Still use the previous interest rect because it contains the recomputed |
| 492 // interest rect. |
| 485 EXPECT_RECT_EQ(IntRect(0, 5000, 800, 5000), | 493 EXPECT_RECT_EQ(IntRect(0, 5000, 800, 5000), |
| 486 recomputeInterestRect(rootScrollingLayer)); | 494 recomputeInterestRect(rootScrollingLayer)); |
| 487 EXPECT_RECT_EQ(IntRect(0, 1400, 800, 8600), | 495 EXPECT_RECT_EQ(IntRect(0, 1400, 800, 8600), |
| 488 previousInterestRect(rootScrollingLayer)); | 496 previousInterestRect(rootScrollingLayer)); |
| 489 | 497 |
| 490 document().view()->setScrollPosition(IntPoint(0, 2000), ProgrammaticScroll); | 498 document().view()->setScrollPosition(IntPoint(0, 2000), ProgrammaticScroll); |
| 491 // Use recomputed interest rect because it changed enough. | 499 // Use recomputed interest rect because it changed enough. |
| 492 document().view()->updateAllLifecyclePhases(); | 500 document().view()->updateAllLifecyclePhases(); |
| 493 EXPECT_RECT_EQ(IntRect(0, 0, 800, 6600), | 501 EXPECT_RECT_EQ(IntRect(0, 0, 800, 6600), |
| 494 recomputeInterestRect(rootScrollingLayer)); | 502 recomputeInterestRect(rootScrollingLayer)); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 534 | 542 |
| 535 document().view()->updateAllLifecyclePhases(); | 543 document().view()->updateAllLifecyclePhases(); |
| 536 Element* scroller = document().getElementById("scroller"); | 544 Element* scroller = document().getElementById("scroller"); |
| 537 GraphicsLayer* scrollingLayer = | 545 GraphicsLayer* scrollingLayer = |
| 538 scroller->layoutBox()->layer()->graphicsLayerBackingForScrolling(); | 546 scroller->layoutBox()->layer()->graphicsLayerBackingForScrolling(); |
| 539 EXPECT_RECT_EQ(IntRect(0, 0, 400, 4600), | 547 EXPECT_RECT_EQ(IntRect(0, 0, 400, 4600), |
| 540 previousInterestRect(scrollingLayer)); | 548 previousInterestRect(scrollingLayer)); |
| 541 | 549 |
| 542 scroller->setScrollTop(300); | 550 scroller->setScrollTop(300); |
| 543 document().view()->updateAllLifecyclePhases(); | 551 document().view()->updateAllLifecyclePhases(); |
| 544 // Still use the previous interest rect because the recomputed rect hasn't cha
nged enough. | 552 // Still use the previous interest rect because the recomputed rect hasn't |
| 553 // changed enough. |
| 545 EXPECT_RECT_EQ(IntRect(0, 0, 400, 4900), | 554 EXPECT_RECT_EQ(IntRect(0, 0, 400, 4900), |
| 546 recomputeInterestRect(scrollingLayer)); | 555 recomputeInterestRect(scrollingLayer)); |
| 547 EXPECT_RECT_EQ(IntRect(0, 0, 400, 4600), | 556 EXPECT_RECT_EQ(IntRect(0, 0, 400, 4600), |
| 548 previousInterestRect(scrollingLayer)); | 557 previousInterestRect(scrollingLayer)); |
| 549 | 558 |
| 550 scroller->setScrollTop(600); | 559 scroller->setScrollTop(600); |
| 551 document().view()->updateAllLifecyclePhases(); | 560 document().view()->updateAllLifecyclePhases(); |
| 552 // Use recomputed interest rect because it changed enough. | 561 // Use recomputed interest rect because it changed enough. |
| 553 EXPECT_RECT_EQ(IntRect(0, 0, 400, 5200), | 562 EXPECT_RECT_EQ(IntRect(0, 0, 400, 5200), |
| 554 recomputeInterestRect(scrollingLayer)); | 563 recomputeInterestRect(scrollingLayer)); |
| 555 EXPECT_RECT_EQ(IntRect(0, 0, 400, 5200), | 564 EXPECT_RECT_EQ(IntRect(0, 0, 400, 5200), |
| 556 previousInterestRect(scrollingLayer)); | 565 previousInterestRect(scrollingLayer)); |
| 557 | 566 |
| 558 scroller->setScrollTop(5400); | 567 scroller->setScrollTop(5400); |
| 559 document().view()->updateAllLifecyclePhases(); | 568 document().view()->updateAllLifecyclePhases(); |
| 560 EXPECT_RECT_EQ(IntRect(0, 1400, 400, 8600), | 569 EXPECT_RECT_EQ(IntRect(0, 1400, 400, 8600), |
| 561 recomputeInterestRect(scrollingLayer)); | 570 recomputeInterestRect(scrollingLayer)); |
| 562 EXPECT_RECT_EQ(IntRect(0, 1400, 400, 8600), | 571 EXPECT_RECT_EQ(IntRect(0, 1400, 400, 8600), |
| 563 previousInterestRect(scrollingLayer)); | 572 previousInterestRect(scrollingLayer)); |
| 564 | 573 |
| 565 scroller->setScrollTop(9000); | 574 scroller->setScrollTop(9000); |
| 566 document().view()->updateAllLifecyclePhases(); | 575 document().view()->updateAllLifecyclePhases(); |
| 567 // Still use the previous interest rect because it contains the recomputed int
erest rect. | 576 // Still use the previous interest rect because it contains the recomputed |
| 577 // interest rect. |
| 568 EXPECT_RECT_EQ(IntRect(0, 5000, 400, 5000), | 578 EXPECT_RECT_EQ(IntRect(0, 5000, 400, 5000), |
| 569 recomputeInterestRect(scrollingLayer)); | 579 recomputeInterestRect(scrollingLayer)); |
| 570 EXPECT_RECT_EQ(IntRect(0, 1400, 400, 8600), | 580 EXPECT_RECT_EQ(IntRect(0, 1400, 400, 8600), |
| 571 previousInterestRect(scrollingLayer)); | 581 previousInterestRect(scrollingLayer)); |
| 572 | 582 |
| 573 scroller->setScrollTop(2000); | 583 scroller->setScrollTop(2000); |
| 574 // Use recomputed interest rect because it changed enough. | 584 // Use recomputed interest rect because it changed enough. |
| 575 document().view()->updateAllLifecyclePhases(); | 585 document().view()->updateAllLifecyclePhases(); |
| 576 EXPECT_RECT_EQ(IntRect(0, 0, 400, 6600), | 586 EXPECT_RECT_EQ(IntRect(0, 0, 400, 6600), |
| 577 recomputeInterestRect(scrollingLayer)); | 587 recomputeInterestRect(scrollingLayer)); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 594 "</div"); | 604 "</div"); |
| 595 | 605 |
| 596 document().view()->updateAllLifecyclePhases(); | 606 document().view()->updateAllLifecyclePhases(); |
| 597 Element* scroller = document().getElementById("scroller"); | 607 Element* scroller = document().getElementById("scroller"); |
| 598 GraphicsLayer* scrollingLayer = | 608 GraphicsLayer* scrollingLayer = |
| 599 scroller->layoutBox()->layer()->graphicsLayerBackingForScrolling(); | 609 scroller->layoutBox()->layer()->graphicsLayerBackingForScrolling(); |
| 600 | 610 |
| 601 scroller->setScrollTop(5400); | 611 scroller->setScrollTop(5400); |
| 602 document().view()->updateAllLifecyclePhases(); | 612 document().view()->updateAllLifecyclePhases(); |
| 603 scroller->setScrollTop(9400); | 613 scroller->setScrollTop(9400); |
| 604 // The above code creates an interest rect bigger than the interest rect if re
computed now. | 614 // The above code creates an interest rect bigger than the interest rect if |
| 615 // recomputed now. |
| 605 document().view()->updateAllLifecyclePhases(); | 616 document().view()->updateAllLifecyclePhases(); |
| 606 EXPECT_RECT_EQ(IntRect(0, 5400, 400, 4600), | 617 EXPECT_RECT_EQ(IntRect(0, 5400, 400, 4600), |
| 607 recomputeInterestRect(scrollingLayer)); | 618 recomputeInterestRect(scrollingLayer)); |
| 608 EXPECT_RECT_EQ(IntRect(0, 1400, 400, 8600), | 619 EXPECT_RECT_EQ(IntRect(0, 1400, 400, 8600), |
| 609 previousInterestRect(scrollingLayer)); | 620 previousInterestRect(scrollingLayer)); |
| 610 | 621 |
| 611 // Paint invalidation and repaint should change previous paint interest rect. | 622 // Paint invalidation and repaint should change previous paint interest rect. |
| 612 document().getElementById("content")->setTextContent("Change"); | 623 document().getElementById("content")->setTextContent("Change"); |
| 613 document().view()->updateAllLifecyclePhases(); | 624 document().view()->updateAllLifecyclePhases(); |
| 614 EXPECT_RECT_EQ(IntRect(0, 5400, 400, 4600), | 625 EXPECT_RECT_EQ(IntRect(0, 5400, 400, 4600), |
| (...skipping 19 matching lines...) Expand all Loading... |
| 634 ->visualOverflowRect() | 645 ->visualOverflowRect() |
| 635 .size() | 646 .size() |
| 636 .height(), | 647 .height(), |
| 637 100); | 648 100); |
| 638 | 649 |
| 639 CompositedLayerMapping* groupedMapping = document() | 650 CompositedLayerMapping* groupedMapping = document() |
| 640 .getElementById("squashed") | 651 .getElementById("squashed") |
| 641 ->layoutBox() | 652 ->layoutBox() |
| 642 ->layer() | 653 ->layer() |
| 643 ->groupedMapping(); | 654 ->groupedMapping(); |
| 644 // The squashing layer is at (-10000, 190, 10100, 100) in viewport coordinates
. | 655 // The squashing layer is at (-10000, 190, 10100, 100) in viewport |
| 656 // coordinates. |
| 645 // The following rect is at (-4000, 190, 4100, 100) in viewport coordinates. | 657 // The following rect is at (-4000, 190, 4100, 100) in viewport coordinates. |
| 646 EXPECT_RECT_EQ(IntRect(6000, 0, 4100, 100), | 658 EXPECT_RECT_EQ(IntRect(6000, 0, 4100, 100), |
| 647 groupedMapping->computeInterestRect( | 659 groupedMapping->computeInterestRect( |
| 648 groupedMapping->squashingLayer(), IntRect())); | 660 groupedMapping->squashingLayer(), IntRect())); |
| 649 } | 661 } |
| 650 | 662 |
| 651 TEST_F(CompositedLayerMappingTest, | 663 TEST_F(CompositedLayerMappingTest, |
| 652 InterestRectOfSquashingLayerWithAncestorClip) { | 664 InterestRectOfSquashingLayerWithAncestorClip) { |
| 653 setBodyInnerHTML( | 665 setBodyInnerHTML( |
| 654 "<style>body { margin: 0; }</style>" | 666 "<style>body { margin: 0; }</style>" |
| 655 "<div style='overflow: hidden; width: 400px; height: 400px'>" | 667 "<div style='overflow: hidden; width: 400px; height: 400px'>" |
| 656 " <div style='position: relative; backface-visibility: hidden'>" | 668 " <div style='position: relative; backface-visibility: hidden'>" |
| 657 " <div style='position: absolute; top: -500px; width: 200px; height: " | 669 " <div style='position: absolute; top: -500px; width: 200px; height: " |
| 658 "700px; backface-visibility: hidden'></div>" | 670 "700px; backface-visibility: hidden'></div>" |
| 659 // Above overflow:hidden div and two composited layers make the squashing
layer a child of an ancestor clipping layer. | 671 // Above overflow:hidden div and two composited layers make the squashing |
| 672 // layer a child of an ancestor clipping layer. |
| 660 " <div id='squashed' style='height: 1000px; width: 10000px; right: 0; " | 673 " <div id='squashed' style='height: 1000px; width: 10000px; right: 0; " |
| 661 "position: absolute'></div>" | 674 "position: absolute'></div>" |
| 662 " </div>" | 675 " </div>" |
| 663 "</div>"); | 676 "</div>"); |
| 664 | 677 |
| 665 CompositedLayerMapping* groupedMapping = document() | 678 CompositedLayerMapping* groupedMapping = document() |
| 666 .getElementById("squashed") | 679 .getElementById("squashed") |
| 667 ->layoutBox() | 680 ->layoutBox() |
| 668 ->layer() | 681 ->layer() |
| 669 ->groupedMapping(); | 682 ->groupedMapping(); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 728 EXPECT_RECT_EQ(IntRect(0, 3500, 500, 4500), | 741 EXPECT_RECT_EQ(IntRect(0, 3500, 500, 4500), |
| 729 recomputeInterestRect(frameDocument.view() | 742 recomputeInterestRect(frameDocument.view() |
| 730 ->layoutViewItem() | 743 ->layoutViewItem() |
| 731 .enclosingLayer() | 744 .enclosingLayer() |
| 732 ->graphicsLayerBacking())); | 745 ->graphicsLayerBacking())); |
| 733 } | 746 } |
| 734 | 747 |
| 735 TEST_F(CompositedLayerMappingTest, InterestRectOfIframeWithContentBoxOffset) { | 748 TEST_F(CompositedLayerMappingTest, InterestRectOfIframeWithContentBoxOffset) { |
| 736 document().setBaseURLOverride(KURL(ParsedURLString, "http://test.com")); | 749 document().setBaseURLOverride(KURL(ParsedURLString, "http://test.com")); |
| 737 document().frame()->settings()->setPreferCompositingToLCDTextEnabled(true); | 750 document().frame()->settings()->setPreferCompositingToLCDTextEnabled(true); |
| 738 // Set a 10px border in order to have a contentBoxOffset for the iframe elemen
t. | 751 // Set a 10px border in order to have a contentBoxOffset for the iframe |
| 752 // element. |
| 739 setBodyInnerHTML( | 753 setBodyInnerHTML( |
| 740 "<style>body { margin: 0; } #frame { border: 10px solid black; } " | 754 "<style>body { margin: 0; } #frame { border: 10px solid black; } " |
| 741 "::-webkit-scrollbar { display: none; }</style>" | 755 "::-webkit-scrollbar { display: none; }</style>" |
| 742 "<iframe id=frame src='http://test.com' width='500' height='500' " | 756 "<iframe id=frame src='http://test.com' width='500' height='500' " |
| 743 "frameBorder='0'>" | 757 "frameBorder='0'>" |
| 744 "</iframe>"); | 758 "</iframe>"); |
| 745 | 759 |
| 746 Document& frameDocument = | 760 Document& frameDocument = |
| 747 setupChildIframe("frame", | 761 setupChildIframe("frame", |
| 748 "<style>body { margin: 0; } #target { width: 200px; " | 762 "<style>body { margin: 0; } #target { width: 200px; " |
| 749 "height: 8000px;}</style> <div id=target></div>"); | 763 "height: 8000px;}</style> <div id=target></div>"); |
| 750 | 764 |
| 751 document().view()->updateAllLifecyclePhases(); | 765 document().view()->updateAllLifecyclePhases(); |
| 752 | 766 |
| 753 // Scroll 3000 pixels down to bring the scrollable area to somewhere in the mi
ddle. | 767 // Scroll 3000 pixels down to bring the scrollable area to somewhere in the |
| 768 // middle. |
| 754 frameDocument.view()->setScrollPosition(DoublePoint(0.0, 3000.0), | 769 frameDocument.view()->setScrollPosition(DoublePoint(0.0, 3000.0), |
| 755 ProgrammaticScroll); | 770 ProgrammaticScroll); |
| 756 document().view()->updateAllLifecyclePhases(); | 771 document().view()->updateAllLifecyclePhases(); |
| 757 | 772 |
| 758 ASSERT_TRUE(frameDocument.view()->layoutViewItem().hasLayer()); | 773 ASSERT_TRUE(frameDocument.view()->layoutViewItem().hasLayer()); |
| 759 // The width is 485 pixels due to the size of the scrollbar. | 774 // The width is 485 pixels due to the size of the scrollbar. |
| 760 EXPECT_RECT_EQ(IntRect(0, 0, 500, 7500), | 775 EXPECT_RECT_EQ(IntRect(0, 0, 500, 7500), |
| 761 recomputeInterestRect(frameDocument.view() | 776 recomputeInterestRect(frameDocument.view() |
| 762 ->layoutViewItem() | 777 ->layoutViewItem() |
| 763 .enclosingLayer() | 778 .enclosingLayer() |
| (...skipping 17 matching lines...) Expand all Loading... |
| 781 "<div id='spacer' style='height: 2000px'></div>"); | 796 "<div id='spacer' style='height: 2000px'></div>"); |
| 782 | 797 |
| 783 document().view()->updateAllLifecyclePhases(); | 798 document().view()->updateAllLifecyclePhases(); |
| 784 | 799 |
| 785 // The translucent fixed box should not be promoted. | 800 // The translucent fixed box should not be promoted. |
| 786 Element* element = document().getElementById("translucent"); | 801 Element* element = document().getElementById("translucent"); |
| 787 PaintLayer* paintLayer = | 802 PaintLayer* paintLayer = |
| 788 toLayoutBoxModelObject(element->layoutObject())->layer(); | 803 toLayoutBoxModelObject(element->layoutObject())->layer(); |
| 789 EXPECT_EQ(NotComposited, paintLayer->compositingState()); | 804 EXPECT_EQ(NotComposited, paintLayer->compositingState()); |
| 790 | 805 |
| 791 // The opaque fixed box should be promoted and be opaque so that text will be
drawn | 806 // The opaque fixed box should be promoted and be opaque so that text will be |
| 792 // with subpixel anti-aliasing. | 807 // drawn with subpixel anti-aliasing. |
| 793 element = document().getElementById("opaque"); | 808 element = document().getElementById("opaque"); |
| 794 paintLayer = toLayoutBoxModelObject(element->layoutObject())->layer(); | 809 paintLayer = toLayoutBoxModelObject(element->layoutObject())->layer(); |
| 795 EXPECT_EQ(PaintsIntoOwnBacking, paintLayer->compositingState()); | 810 EXPECT_EQ(PaintsIntoOwnBacking, paintLayer->compositingState()); |
| 796 EXPECT_TRUE(paintLayer->graphicsLayerBacking()->contentsOpaque()); | 811 EXPECT_TRUE(paintLayer->graphicsLayerBacking()->contentsOpaque()); |
| 797 | 812 |
| 798 // The opaque fixed box with shadow should not be promoted because the layer w
ill | 813 // The opaque fixed box with shadow should not be promoted because the layer |
| 799 // include the shadow which is not opaque. | 814 // will include the shadow which is not opaque. |
| 800 element = document().getElementById("opaque-with-shadow"); | 815 element = document().getElementById("opaque-with-shadow"); |
| 801 paintLayer = toLayoutBoxModelObject(element->layoutObject())->layer(); | 816 paintLayer = toLayoutBoxModelObject(element->layoutObject())->layer(); |
| 802 EXPECT_EQ(NotComposited, paintLayer->compositingState()); | 817 EXPECT_EQ(NotComposited, paintLayer->compositingState()); |
| 803 | 818 |
| 804 document().frame()->settings()->setPreferCompositingToLCDTextEnabled( | 819 document().frame()->settings()->setPreferCompositingToLCDTextEnabled( |
| 805 preferCompositing); | 820 preferCompositing); |
| 806 } | 821 } |
| 807 | 822 |
| 808 TEST_F(CompositedLayerMappingTest, | 823 TEST_F(CompositedLayerMappingTest, |
| 809 ScrollingContentsAndForegroundLayerPaintingPhase) { | 824 ScrollingContentsAndForegroundLayerPaintingPhase) { |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 857 "<div id='container' style='overflow: scroll; width: 300px; height: " | 872 "<div id='container' style='overflow: scroll; width: 300px; height: " |
| 858 "300px; border-radius: 5px; background: white; will-change: transform;'>" | 873 "300px; border-radius: 5px; background: white; will-change: transform;'>" |
| 859 " <div style='background-color: blue; width: 2000px; height: " | 874 " <div style='background-color: blue; width: 2000px; height: " |
| 860 "2000px;'></div>" | 875 "2000px;'></div>" |
| 861 "</div>"); | 876 "</div>"); |
| 862 | 877 |
| 863 PaintLayer* layer = | 878 PaintLayer* layer = |
| 864 toLayoutBlock(getLayoutObjectByElementId("container"))->layer(); | 879 toLayoutBlock(getLayoutObjectByElementId("container"))->layer(); |
| 865 EXPECT_TRUE(layer->canPaintBackgroundOntoScrollingContentsLayer()); | 880 EXPECT_TRUE(layer->canPaintBackgroundOntoScrollingContentsLayer()); |
| 866 | 881 |
| 867 // We currently don't use composited scrolling when the container has a border
-radius | 882 // We currently don't use composited scrolling when the container has a |
| 868 // so even though we can paint the background onto the scrolling contents laye
r we | 883 // border-radius so even though we can paint the background onto the scrolling |
| 869 // don't have a scrolling contents layer to paint into in this case. | 884 // contents layer we don't have a scrolling contents layer to paint into in |
| 885 // this case. |
| 870 CompositedLayerMapping* mapping = layer->compositedLayerMapping(); | 886 CompositedLayerMapping* mapping = layer->compositedLayerMapping(); |
| 871 EXPECT_FALSE(mapping->hasScrollingLayer()); | 887 EXPECT_FALSE(mapping->hasScrollingLayer()); |
| 872 EXPECT_FALSE(mapping->backgroundPaintsOntoScrollingContentsLayer()); | 888 EXPECT_FALSE(mapping->backgroundPaintsOntoScrollingContentsLayer()); |
| 873 } | 889 } |
| 874 | 890 |
| 875 // Make sure that clipping layers are removed or their masking bit turned off | 891 // Make sure that clipping layers are removed or their masking bit turned off |
| 876 // when they're an ancestor of the root scroller element. | 892 // when they're an ancestor of the root scroller element. |
| 877 TEST_F(CompositedLayerMappingTest, RootScrollerAncestorsNotClipped) { | 893 TEST_F(CompositedLayerMappingTest, RootScrollerAncestorsNotClipped) { |
| 878 NonThrowableExceptionState nonThrow; | 894 NonThrowableExceptionState nonThrow; |
| 879 | 895 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 947 | 963 |
| 948 // Since there's no need to composite the clip and we prefer LCD text, the | 964 // Since there's no need to composite the clip and we prefer LCD text, the |
| 949 // mapping should create an ancestorClippingLayer. | 965 // mapping should create an ancestorClippingLayer. |
| 950 ASSERT_TRUE(mapping->scrollingLayer()); | 966 ASSERT_TRUE(mapping->scrollingLayer()); |
| 951 ASSERT_TRUE(mapping->ancestorClippingLayer()); | 967 ASSERT_TRUE(mapping->ancestorClippingLayer()); |
| 952 | 968 |
| 953 // Since the clip has a transform it should be composited so there's no | 969 // Since the clip has a transform it should be composited so there's no |
| 954 // need for an ancestor clipping layer. | 970 // need for an ancestor clipping layer. |
| 955 ASSERT_TRUE(mapping2->scrollingLayer()); | 971 ASSERT_TRUE(mapping2->scrollingLayer()); |
| 956 | 972 |
| 957 // The third <div> should have a clipping layer since it's composited and clip
s | 973 // The third <div> should have a clipping layer since it's composited and |
| 958 // composited children. | 974 // clips composited children. |
| 959 ASSERT_TRUE(mapping3->clippingLayer()); | 975 ASSERT_TRUE(mapping3->clippingLayer()); |
| 960 | 976 |
| 961 // All scrolling and clipping layers should have masksToBounds set on them. | 977 // All scrolling and clipping layers should have masksToBounds set on them. |
| 962 { | 978 { |
| 963 EXPECT_TRUE(mapping->scrollingLayer()->platformLayer()->masksToBounds()); | 979 EXPECT_TRUE(mapping->scrollingLayer()->platformLayer()->masksToBounds()); |
| 964 EXPECT_TRUE( | 980 EXPECT_TRUE( |
| 965 mapping->ancestorClippingLayer()->platformLayer()->masksToBounds()); | 981 mapping->ancestorClippingLayer()->platformLayer()->masksToBounds()); |
| 966 EXPECT_TRUE(mapping2->scrollingLayer()->platformLayer()->masksToBounds()); | 982 EXPECT_TRUE(mapping2->scrollingLayer()->platformLayer()->masksToBounds()); |
| 967 EXPECT_TRUE(mapping3->clippingLayer()->platformLayer()->masksToBounds()); | 983 EXPECT_TRUE(mapping3->clippingLayer()->platformLayer()->masksToBounds()); |
| 968 } | 984 } |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1014 document().view()->updateAllLifecyclePhases(); | 1030 document().view()->updateAllLifecyclePhases(); |
| 1015 ASSERT_EQ(document().documentElement(), | 1031 ASSERT_EQ(document().documentElement(), |
| 1016 rootScrollerController.globalRootScroller()); | 1032 rootScrollerController.globalRootScroller()); |
| 1017 | 1033 |
| 1018 EXPECT_TRUE(mapping3->clippingLayer()); | 1034 EXPECT_TRUE(mapping3->clippingLayer()); |
| 1019 EXPECT_TRUE(mapping3->clippingLayer()->platformLayer()->masksToBounds()); | 1035 EXPECT_TRUE(mapping3->clippingLayer()->platformLayer()->masksToBounds()); |
| 1020 } | 1036 } |
| 1021 } | 1037 } |
| 1022 | 1038 |
| 1023 } // namespace blink | 1039 } // namespace blink |
| OLD | NEW |