Tiled layers are sometimes left with some tiles when outside the viewport
authorsimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 10 Feb 2017 22:40:18 +0000 (22:40 +0000)
committersimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 10 Feb 2017 22:40:18 +0000 (22:40 +0000)
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.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@212152 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/tiled-drawing/tile-coverage-iframe-to-zero-coverage-expected.txt [new file with mode: 0644]
LayoutTests/tiled-drawing/tile-coverage-iframe-to-zero-coverage.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/ca/TileGrid.cpp

index 37bd077..bf631d0 100644 (file)
@@ -1,3 +1,13 @@
+2017-02-09  Simon Fraser  <simon.fraser@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  <pecoraro@apple.com>
 
         [Resource Timing] Enable Resource Timing by default in Tests
diff --git a/LayoutTests/tiled-drawing/tile-coverage-iframe-to-zero-coverage-expected.txt b/LayoutTests/tiled-drawing/tile-coverage-iframe-to-zero-coverage-expected.txt
new file mode 100644 (file)
index 0000000..696a922
--- /dev/null
@@ -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)
+                                )
+                              )
+                            )
+                          )
+                        )
+                      )
+                    )
+                  )
+                )
+              )
+            )
+          )
+        )
+      )
+    )
+  )
+)
+
diff --git a/LayoutTests/tiled-drawing/tile-coverage-iframe-to-zero-coverage.html b/LayoutTests/tiled-drawing/tile-coverage-iframe-to-zero-coverage.html
new file mode 100644 (file)
index 0000000..0bbcf89
--- /dev/null
@@ -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>
index 5255e79..56a72a1 100644 (file)
@@ -1,3 +1,22 @@
+2017-02-09  Simon Fraser  <simon.fraser@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  <zalan@apple.com>
 
         Mail hangs when removing multiple rows from large table.
index b16b32e..957865a 100644 (file)
@@ -352,10 +352,7 @@ void TileGrid::revalidateTiles(TileValidationPolicy validationPolicy)
     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));
-
-    if (coverageRect.isEmpty() || bounds.isEmpty())
-        return;
+    LOG_WITH_STREAM(Tiling, stream << "TileGrid " << this << " (controller " << &m_controller << ") revalidateTiles: bounds " << bounds << " coverageRect" << coverageRect << " validation: " << validationPolicyAsString(validationPolicy));
 
     FloatRect scaledRect(coverageRect);
     scaledRect.scale(m_scale);