- Revision
- 212152
- Author
- simon.fra...@apple.com
- Date
- 2017-02-10 14:40:18 -0800 (Fri, 10 Feb 2017)
Log Message
Tiled layers are sometimes left with some tiles when outside the viewport
https://bugs.webkit.org/show_bug.cgi?id=168104
Source/WebCore:
rdar://problem/30459055
Reviewed by Tim Horton.
When the coverage rect of a TiledBacking goes from a non-empty rect to an empty rect, we
shouldn't just early return from TileGrid::revalidateTiles(), otherwise we are left with some
tiles. Run through the function as normal, which will remove all the tiles for an empty coverage rect.
Minor logging changes.
Test: tiled-drawing/tile-coverage-iframe-to-zero-coverage.html
* platform/graphics/ca/TileGrid.cpp:
(WebCore::TileGrid::revalidateTiles):
LayoutTests:
Reviewed by Tim Horton.
* tiled-drawing/tile-coverage-iframe-to-zero-coverage-expected.txt: Added.
* tiled-drawing/tile-coverage-iframe-to-zero-coverage.html: Added.
Modified Paths
Added Paths
Diff
Modified: trunk/LayoutTests/ChangeLog (212151 => 212152)
--- trunk/LayoutTests/ChangeLog 2017-02-10 22:36:12 UTC (rev 212151)
+++ trunk/LayoutTests/ChangeLog 2017-02-10 22:40:18 UTC (rev 212152)
@@ -1,3 +1,13 @@
+2017-02-09 Simon Fraser <simon.fra...@apple.com>
+
+ Tiled layers are sometimes left with some tiles when outside the viewport
+ https://bugs.webkit.org/show_bug.cgi?id=168104
+
+ Reviewed by Tim Horton.
+
+ * tiled-drawing/tile-coverage-iframe-to-zero-coverage-expected.txt: Added.
+ * tiled-drawing/tile-coverage-iframe-to-zero-coverage.html: Added.
+
2017-02-10 Joseph Pecoraro <pecor...@apple.com>
[Resource Timing] Enable Resource Timing by default in Tests
Added: trunk/LayoutTests/tiled-drawing/tile-coverage-iframe-to-zero-coverage-expected.txt (0 => 212152)
--- trunk/LayoutTests/tiled-drawing/tile-coverage-iframe-to-zero-coverage-expected.txt (rev 0)
+++ trunk/LayoutTests/tiled-drawing/tile-coverage-iframe-to-zero-coverage-expected.txt 2017-02-10 22:40:18 UTC (rev 212152)
@@ -0,0 +1,104 @@
+
+(GraphicsLayer
+ (anchor 0.00 0.00)
+ (bounds 858.00 5016.00)
+ (visible rect 0.00, 3000.00 785.00 x 585.00)
+ (coverage rect 0.00, 3000.00 785.00 x 585.00)
+ (intersects coverage rect 1)
+ (contentsScale 1.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 858.00 5016.00)
+ (contentsOpaque 1)
+ (visible rect 0.00, 3000.00 785.00 x 585.00)
+ (coverage rect 0.00, 3000.00 785.00 x 585.00)
+ (intersects coverage rect 1)
+ (contentsScale 1.00)
+ (tile cache coverage 0, 2560 858 x 1536)
+ (tile size 512 x 512)
+ (top left tile 0, 5 tiles grid 2 x 3)
+ (in window 1)
+ (children 1
+ (GraphicsLayer
+ (position 1.00 1.00)
+ (bounds 857.00 464.00)
+ (drawsContent 1)
+ (visible rect 0.00, 0.00 0.00 x 0.00)
+ (coverage rect -1.00, 2999.00 785.00 x 585.00)
+ (intersects coverage rect 0)
+ (contentsScale 1.00)
+ (children 1
+ (GraphicsLayer
+ (position 32.00 32.00)
+ (visible rect 0.00, 0.00 0.00 x 0.00)
+ (coverage rect -33.00, 2967.00 785.00 x 585.00)
+ (intersects coverage rect 0)
+ (contentsScale 1.00)
+ (children 1
+ (GraphicsLayer
+ (anchor 0.00 0.00)
+ (bounds 800.00 400.00)
+ (visible rect 0.00, 0.00 0.00 x 0.00)
+ (coverage rect 0.00, 0.00 0.00 x 0.00)
+ (intersects coverage rect 0)
+ (contentsScale 1.00)
+ (children 1
+ (GraphicsLayer
+ (visible rect 0.00, 0.00 0.00 x 0.00)
+ (coverage rect 0.00, 0.00 0.00 x 0.00)
+ (intersects coverage rect 0)
+ (contentsScale 1.00)
+ (children 1
+ (GraphicsLayer
+ (anchor 0.00 0.00)
+ (bounds 2508.00 400.00)
+ (visible rect 0.00, 0.00 0.00 x 0.00)
+ (coverage rect 0.00, 0.00 0.00 x 0.00)
+ (intersects coverage rect 0)
+ (contentsScale 1.00)
+ (children 1
+ (GraphicsLayer
+ (bounds 2508.00 400.00)
+ (usingTiledLayer 1)
+ (drawsContent 1)
+ (visible rect 0.00, 0.00 0.00 x 0.00)
+ (coverage rect 0.00, 0.00 0.00 x 0.00)
+ (intersects coverage rect 0)
+ (contentsScale 1.00)
+ (tile cache coverage 0, 0 0 x 0)
+ (tile size 512 x 512)
+ (top left tile 0, 0 tiles grid 0 x 0)
+ (in window 1)
+ (children 1
+ (GraphicsLayer
+ (position 8.00 8.00)
+ (bounds 2500.00 200.00)
+ (usingTiledLayer 1)
+ (contentsOpaque 1)
+ (drawsContent 1)
+ (visible rect 0.00, 0.00 0.00 x 0.00)
+ (coverage rect -8.00, -8.00 0.00 x 0.00)
+ (intersects coverage rect 0)
+ (contentsScale 1.00)
+ (tile cache coverage 0, 0 0 x 0)
+ (tile size 512 x 512)
+ (top left tile 0, 0 tiles grid 0 x 0)
+ (in window 1)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+)
+
Added: trunk/LayoutTests/tiled-drawing/tile-coverage-iframe-to-zero-coverage.html (0 => 212152)
--- trunk/LayoutTests/tiled-drawing/tile-coverage-iframe-to-zero-coverage.html (rev 0)
+++ trunk/LayoutTests/tiled-drawing/tile-coverage-iframe-to-zero-coverage.html 2017-02-10 22:40:18 UTC (rev 212152)
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+
+<html>
+<head>
+ <style>
+ body {
+ height: 5000px;
+ }
+ iframe {
+ height: 400px;
+ width: 800px;
+ border: 5px solid black;
+ box-shadow: 0 0 5px black;
+ padding: 20px;
+ }
+ </style>
+ <script>
+ if (window.testRunner) {
+ testRunner.dumpAsText();
+ testRunner.waitUntilDone();
+ }
+
+ function doTest()
+ {
+ setTimeout(function() {
+ window.scrollTo(0, 3000);
+ if (window.internals) {
+ document.getElementById('layers').innerText = internals.layerTreeAsText(document,
+ internals.LAYER_TREE_INCLUDES_VISIBLE_RECTS | internals.LAYER_TREE_INCLUDES_TILE_CACHES);
+ }
+ if (window.testRunner)
+ testRunner.notifyDone();
+ }, 0);
+ }
+ window.addEventListener('load', doTest, false);
+ </script>
+</head>
+<body>
+
+<iframe scrolling="no" srcdoc="<div style='width: 2500px; height: 200px; background-color: silver; will-change: transform'>Stuff here</div>"></iframe>
+<pre id="layers">Layer tree goes here</p>
+</body>
+</html>
Modified: trunk/Source/WebCore/ChangeLog (212151 => 212152)
--- trunk/Source/WebCore/ChangeLog 2017-02-10 22:36:12 UTC (rev 212151)
+++ trunk/Source/WebCore/ChangeLog 2017-02-10 22:40:18 UTC (rev 212152)
@@ -1,3 +1,22 @@
+2017-02-09 Simon Fraser <simon.fra...@apple.com>
+
+ Tiled layers are sometimes left with some tiles when outside the viewport
+ https://bugs.webkit.org/show_bug.cgi?id=168104
+ rdar://problem/30459055
+
+ Reviewed by Tim Horton.
+
+ When the coverage rect of a TiledBacking goes from a non-empty rect to an empty rect, we
+ shouldn't just early return from TileGrid::revalidateTiles(), otherwise we are left with some
+ tiles. Run through the function as normal, which will remove all the tiles for an empty coverage rect.
+
+ Minor logging changes.
+
+ Test: tiled-drawing/tile-coverage-iframe-to-zero-coverage.html
+
+ * platform/graphics/ca/TileGrid.cpp:
+ (WebCore::TileGrid::revalidateTiles):
+
2017-02-10 Zalan Bujtas <za...@apple.com>
Mail hangs when removing multiple rows from large table.
Modified: trunk/Source/WebCore/platform/graphics/ca/TileGrid.cpp (212151 => 212152)
--- trunk/Source/WebCore/platform/graphics/ca/TileGrid.cpp 2017-02-10 22:36:12 UTC (rev 212151)
+++ trunk/Source/WebCore/platform/graphics/ca/TileGrid.cpp 2017-02-10 22:40:18 UTC (rev 212152)
@@ -352,11 +352,8 @@
FloatRect coverageRect = m_controller.coverageRect();
IntRect bounds = m_controller.bounds();
- LOG_WITH_STREAM(Tiling, stream << "TileGrid " << this << " revalidateTiles: bounds " << bounds << " coverageRect" << coverageRect << " validation: " << validationPolicyAsString(validationPolicy));
+ LOG_WITH_STREAM(Tiling, stream << "TileGrid " << this << " (controller " << &m_controller << ") revalidateTiles: bounds " << bounds << " coverageRect" << coverageRect << " validation: " << validationPolicyAsString(validationPolicy));
- if (coverageRect.isEmpty() || bounds.isEmpty())
- return;
-
FloatRect scaledRect(coverageRect);
scaledRect.scale(m_scale);
IntRect coverageRectInTileCoords(enclosingIntRect(scaledRect));