Async Image Decoding: Image flashes away briefly when tapping on tab in iPad tab...
authortimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 5 Jul 2017 21:52:19 +0000 (21:52 +0000)
committertimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 5 Jul 2017 21:52:19 +0000 (21:52 +0000)
https://bugs.webkit.org/show_bug.cgi?id=174173
<rdar://problem/32431952>

Reviewed by Geoffrey Garen.

* WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm:
(WebKit::RemoteLayerTreeDrawingArea::addTransactionCallbackID):
When a client uses e.g. doAfterNextPresentationUpdate (or internally,
dispatchAfterEnsuringDrawing), they're doing so in the hopes that the
callback is called after the page is well-painted -- for example, to
remove a snapshot (in the tab picker case, as well as for navigation
gestures), or to *take* a snapshot. In all of these cases, it is
preferable to do a synchronous decode, to ensure that the image does
not flash away temporarily.

Use the existing mechanism that was implemented for the synchronous
activity state change flush to also force synchronous image decoding
any time there is a post-commit transaction callback.

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

Source/WebKit2/ChangeLog
Source/WebKit2/WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm

index 83377a3..c396ea6 100644 (file)
@@ -1,3 +1,25 @@
+2017-07-05  Tim Horton  <timothy_horton@apple.com>
+
+        Async Image Decoding: Image flashes away briefly when tapping on tab in iPad tab picker
+        https://bugs.webkit.org/show_bug.cgi?id=174173
+        <rdar://problem/32431952>
+
+        Reviewed by Geoffrey Garen.
+
+        * WebProcess/WebPage/mac/RemoteLayerTreeDrawingArea.mm:
+        (WebKit::RemoteLayerTreeDrawingArea::addTransactionCallbackID):
+        When a client uses e.g. doAfterNextPresentationUpdate (or internally,
+        dispatchAfterEnsuringDrawing), they're doing so in the hopes that the
+        callback is called after the page is well-painted -- for example, to
+        remove a snapshot (in the tab picker case, as well as for navigation
+        gestures), or to *take* a snapshot. In all of these cases, it is
+        preferable to do a synchronous decode, to ensure that the image does
+        not flash away temporarily.
+
+        Use the existing mechanism that was implemented for the synchronous
+        activity state change flush to also force synchronous image decoding
+        any time there is a post-commit transaction callback.
+
 2017-07-05  Wenson Hsieh  <wenson_hsieh@apple.com>
 
         [iOS DnD] [WK2] 3D touch fails to recognize when UIDragInteraction is enabled on phone
index 2ff4623..358bb8a 100644 (file)
@@ -497,6 +497,10 @@ void RemoteLayerTreeDrawingArea::activityStateDidChange(ActivityState::Flags, bo
 
 void RemoteLayerTreeDrawingArea::addTransactionCallbackID(CallbackID callbackID)
 {
+    // Assume that if someone is listening for this transaction's completion, that they want it to
+    // be a "complete" paint (including images that would normally be asynchronously decoding).
+    m_nextFlushIsForImmediatePaint = true;
+
     m_pendingCallbackIDs.append(static_cast<RemoteLayerTreeTransaction::TransactionCallbackID>(callbackID));
     scheduleCompositingLayerFlush();
 }