Repaint issues in background tabs after r138858
authorsimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 28 Jan 2013 19:24:57 +0000 (19:24 +0000)
committersimon.fraser@apple.com <simon.fraser@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 28 Jan 2013 19:24:57 +0000 (19:24 +0000)
https://bugs.webkit.org/show_bug.cgi?id=108092
<rdar://problem/13076430>

Reviewed by Tim Horton.

In r138858, we unparented all tiles in the tile caches of background tabs.
That broke repaints in background tabs; when bringing that tab back to the
foreground, we would call -setNeedsDisplayInRect:, and then reparent the tiles
on a zero-delay timer. Those repaints would then be flipped (possibly because
CA can't look up the layer tree to check for flipped geometry).

Fix by revalidating tiles (which reparents the tiles) at the time we're told
we're moving into the window, which happens before repaints are flushed.

* platform/graphics/ca/mac/TileCache.mm:
(WebCore::TileCache::setIsInWindow):

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

Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/ca/mac/TileCache.mm

index 79fb408..22c526e 100644 (file)
@@ -1,3 +1,23 @@
+2013-01-28  Simon Fraser  <simon.fraser@apple.com>
+
+        Repaint issues in background tabs after r138858
+        https://bugs.webkit.org/show_bug.cgi?id=108092
+        <rdar://problem/13076430>
+
+        Reviewed by Tim Horton.
+
+        In r138858, we unparented all tiles in the tile caches of background tabs.
+        That broke repaints in background tabs; when bringing that tab back to the
+        foreground, we would call -setNeedsDisplayInRect:, and then reparent the tiles
+        on a zero-delay timer. Those repaints would then be flipped (possibly because
+        CA can't look up the layer tree to check for flipped geometry).
+        
+        Fix by revalidating tiles (which reparents the tiles) at the time we're told
+        we're moving into the window, which happens before repaints are flushed.
+
+        * platform/graphics/ca/mac/TileCache.mm:
+        (WebCore::TileCache::setIsInWindow):
+
 2013-01-28  Adam Barth  <abarth@webkit.org>
 
         Remove webkitNotifications.createHTMLNotification
index 3f31337..90cd65f 100644 (file)
@@ -339,8 +339,12 @@ void TileCache::setIsInWindow(bool isInWindow)
 
     m_isInWindow = isInWindow;
 
-    const double tileRevalidationTimeout = 4;
-    scheduleTileRevalidation(m_isInWindow ? 0 : tileRevalidationTimeout);
+    if (m_isInWindow)
+        revalidateTiles();
+    else {
+        const double tileRevalidationTimeout = 4;
+        scheduleTileRevalidation(tileRevalidationTimeout);
+    }
 }
 
 void TileCache::setTileCoverage(TileCoverage coverage)