<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[185967] trunk/Source/WebKit2</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/185967">185967</a></dd>
<dt>Author</dt> <dd>timothy_horton@apple.com</dd>
<dt>Date</dt> <dd>2015-06-25 16:09:16 -0700 (Thu, 25 Jun 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[iOS] When using the back swipe gesture in Safari, the previous webpage will flash for a second
https://bugs.webkit.org/show_bug.cgi?id=146326
&lt;rdar://problem/17811304&gt;

Reviewed by Dean Jackson.

* UIProcess/DrawingAreaProxy.h:
(WebKit::DrawingAreaProxy::hideContentUntilPendingUpdate):
(WebKit::DrawingAreaProxy::hideContentUntilAnyUpdate):
(WebKit::DrawingAreaProxy::hideContentUntilNextUpdate): Deleted.
* UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h:
* UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm:
(WebKit::RemoteLayerTreeDrawingAreaProxy::commitLayerTree):
(WebKit::RemoteLayerTreeDrawingAreaProxy::hideContentUntilPendingUpdate):
(WebKit::RemoteLayerTreeDrawingAreaProxy::hideContentUntilAnyUpdate):
(WebKit::RemoteLayerTreeDrawingAreaProxy::RemoteLayerTreeDrawingAreaProxy): Deleted.
(WebKit::RemoteLayerTreeDrawingAreaProxy::hideContentUntilNextUpdate): Deleted.
Make it possible to distinguish between hiding the content until *any* commit
comes in (for example, when we're coming back from being suspended and don't want
to show anything until we are sure all the layers are valid) and hiding the content
until the currently pending commit corresponding to the current state in the UI process
has arrived (which is what we want when e.g. hiding content after a gesture navigation
and not showing it until the commit including the navigation lands).

* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _hideContentUntilNextUpdate]):
* UIProcess/ios/WKContentView.mm:
(-[WKContentView _applicationWillEnterForeground]):
Make use of &quot;hideContentUntilAnyUpdate&quot;.

* UIProcess/ios/ViewGestureControllerIOS.mm:
(WebKit::ViewGestureController::endSwipeGesture):
Make use of &quot;hideContentUntilPendingUpdate&quot;.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessAPICocoaWKWebViewmm">trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessDrawingAreaProxyh">trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosViewGestureControllerIOSmm">trunk/Source/WebKit2/UIProcess/ios/ViewGestureControllerIOS.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessiosWKContentViewmm">trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm</a></li>
<li><a href="#trunkSourceWebKit2UIProcessmacRemoteLayerTreeDrawingAreaProxyh">trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessmacRemoteLayerTreeDrawingAreaProxymm">trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (185966 => 185967)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-06-25 22:40:11 UTC (rev 185966)
+++ trunk/Source/WebKit2/ChangeLog        2015-06-25 23:09:16 UTC (rev 185967)
</span><span class="lines">@@ -1,5 +1,41 @@
</span><span class="cx"> 2015-06-25  Tim Horton  &lt;timothy_horton@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        [iOS] When using the back swipe gesture in Safari, the previous webpage will flash for a second
+        https://bugs.webkit.org/show_bug.cgi?id=146326
+        &lt;rdar://problem/17811304&gt;
+
+        Reviewed by Dean Jackson.
+
+        * UIProcess/DrawingAreaProxy.h:
+        (WebKit::DrawingAreaProxy::hideContentUntilPendingUpdate):
+        (WebKit::DrawingAreaProxy::hideContentUntilAnyUpdate):
+        (WebKit::DrawingAreaProxy::hideContentUntilNextUpdate): Deleted.
+        * UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h:
+        * UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm:
+        (WebKit::RemoteLayerTreeDrawingAreaProxy::commitLayerTree):
+        (WebKit::RemoteLayerTreeDrawingAreaProxy::hideContentUntilPendingUpdate):
+        (WebKit::RemoteLayerTreeDrawingAreaProxy::hideContentUntilAnyUpdate):
+        (WebKit::RemoteLayerTreeDrawingAreaProxy::RemoteLayerTreeDrawingAreaProxy): Deleted.
+        (WebKit::RemoteLayerTreeDrawingAreaProxy::hideContentUntilNextUpdate): Deleted.
+        Make it possible to distinguish between hiding the content until *any* commit
+        comes in (for example, when we're coming back from being suspended and don't want
+        to show anything until we are sure all the layers are valid) and hiding the content
+        until the currently pending commit corresponding to the current state in the UI process
+        has arrived (which is what we want when e.g. hiding content after a gesture navigation
+        and not showing it until the commit including the navigation lands).
+
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView _hideContentUntilNextUpdate]):
+        * UIProcess/ios/WKContentView.mm:
+        (-[WKContentView _applicationWillEnterForeground]):
+        Make use of &quot;hideContentUntilAnyUpdate&quot;.
+
+        * UIProcess/ios/ViewGestureControllerIOS.mm:
+        (WebKit::ViewGestureController::endSwipeGesture):
+        Make use of &quot;hideContentUntilPendingUpdate&quot;.
+
+2015-06-25  Tim Horton  &lt;timothy_horton@apple.com&gt;
+
</ins><span class="cx">         Viewport units are wrong when scaled in 2-up mode, cause content to hop around on apple.com/music
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=146322
</span><span class="cx">         &lt;rdar://problem/21413884&gt;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKWebViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (185966 => 185967)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2015-06-25 22:40:11 UTC (rev 185966)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2015-06-25 23:09:16 UTC (rev 185967)
</span><span class="lines">@@ -2620,7 +2620,7 @@
</span><span class="cx"> - (void)_hideContentUntilNextUpdate
</span><span class="cx"> {
</span><span class="cx">     if (auto* area = _page-&gt;drawingArea())
</span><del>-        area-&gt;hideContentUntilNextUpdate();
</del><ins>+        area-&gt;hideContentUntilAnyUpdate();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> - (void)_beginAnimatedResizeWithUpdates:(void (^)(void))updateBlock
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessDrawingAreaProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.h (185966 => 185967)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.h        2015-06-25 22:40:11 UTC (rev 185966)
+++ trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.h        2015-06-25 23:09:16 UTC (rev 185967)
</span><span class="lines">@@ -89,7 +89,12 @@
</span><span class="cx">     
</span><span class="cx">     virtual void dispatchAfterEnsuringDrawing(std::function&lt;void (CallbackBase::Error)&gt;) { ASSERT_NOT_REACHED(); }
</span><span class="cx"> 
</span><del>-    virtual void hideContentUntilNextUpdate() { ASSERT_NOT_REACHED(); }
</del><ins>+    // Hide the content until the currently pending update arrives.
+    virtual void hideContentUntilPendingUpdate() { ASSERT_NOT_REACHED(); }
+
+    // Hide the content until any update arrives.
+    virtual void hideContentUntilAnyUpdate() { ASSERT_NOT_REACHED(); }
+
</ins><span class="cx">     virtual bool hasVisibleContent() const { return true; }
</span><span class="cx"> 
</span><span class="cx">     virtual void willSendUpdateGeometry() { }
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosViewGestureControllerIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/ViewGestureControllerIOS.mm (185966 => 185967)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/ViewGestureControllerIOS.mm        2015-06-25 22:40:11 UTC (rev 185966)
+++ trunk/Source/WebKit2/UIProcess/ios/ViewGestureControllerIOS.mm        2015-06-25 23:09:16 UTC (rev 185967)
</span><span class="lines">@@ -303,7 +303,7 @@
</span><span class="cx">             if (gestureControllerIter != viewGestureControllersForAllPages().end() &amp;&amp; gestureControllerIter-&gt;value-&gt;m_gesturePendingSnapshotRemoval == gesturePendingSnapshotRemoval)
</span><span class="cx">                 gestureControllerIter-&gt;value-&gt;willCommitPostSwipeTransitionLayerTree(error == CallbackBase::Error::None);
</span><span class="cx">         });
</span><del>-        drawingArea-&gt;hideContentUntilNextUpdate();
</del><ins>+        drawingArea-&gt;hideContentUntilPendingUpdate();
</ins><span class="cx">     } else {
</span><span class="cx">         removeSwipeSnapshot();
</span><span class="cx">         return;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosWKContentViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm (185966 => 185967)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm        2015-06-25 22:40:11 UTC (rev 185966)
+++ trunk/Source/WebKit2/UIProcess/ios/WKContentView.mm        2015-06-25 23:09:16 UTC (rev 185967)
</span><span class="lines">@@ -550,7 +550,7 @@
</span><span class="cx"> {
</span><span class="cx">     _page-&gt;applicationWillEnterForeground();
</span><span class="cx">     if (auto drawingArea = _page-&gt;drawingArea())
</span><del>-        drawingArea-&gt;hideContentUntilNextUpdate();
</del><ins>+        drawingArea-&gt;hideContentUntilAnyUpdate();
</ins><span class="cx">     _page-&gt;viewStateDidChange(ViewState::AllFlags &amp; ~ViewState::IsInWindow, true, WebPageProxy::ViewStateChangeDispatchMode::Immediate);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessmacRemoteLayerTreeDrawingAreaProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h (185966 => 185967)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h        2015-06-25 22:40:11 UTC (rev 185966)
+++ trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h        2015-06-25 23:09:16 UTC (rev 185967)
</span><span class="lines">@@ -76,7 +76,8 @@
</span><span class="cx">     void initializeDebugIndicator();
</span><span class="cx"> 
</span><span class="cx">     virtual void waitForDidUpdateViewState() override;
</span><del>-    virtual void hideContentUntilNextUpdate() override;
</del><ins>+    virtual void hideContentUntilPendingUpdate() override;
+    virtual void hideContentUntilAnyUpdate() override;
</ins><span class="cx">     virtual bool hasVisibleContent() const override;
</span><span class="cx">     
</span><span class="cx">     WebCore::FloatPoint indicatorLocation() const;
</span><span class="lines">@@ -91,7 +92,7 @@
</span><span class="cx">     void sendUpdateGeometry();
</span><span class="cx"> 
</span><span class="cx">     RemoteLayerTreeHost m_remoteLayerTreeHost;
</span><del>-    bool m_isWaitingForDidUpdateGeometry;
</del><ins>+    bool m_isWaitingForDidUpdateGeometry { false };
</ins><span class="cx"> 
</span><span class="cx">     WebCore::IntSize m_lastSentSize;
</span><span class="cx"> 
</span><span class="lines">@@ -99,9 +100,10 @@
</span><span class="cx">     RetainPtr&lt;CALayer&gt; m_tileMapHostLayer;
</span><span class="cx">     RetainPtr&lt;CALayer&gt; m_exposedRectIndicatorLayer;
</span><span class="cx"> 
</span><del>-    uint64_t m_pendingLayerTreeTransactionID;
-    uint64_t m_lastVisibleTransactionID;
-    uint64_t m_transactionIDForPendingCACommit;
</del><ins>+    uint64_t m_pendingLayerTreeTransactionID { 0 };
+    uint64_t m_lastVisibleTransactionID { 0 };
+    uint64_t m_transactionIDForPendingCACommit { 0 };
+    uint64_t m_transactionIDForUnhidingContent { 0 };
</ins><span class="cx"> 
</span><span class="cx">     CallbackMap m_callbacks;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessmacRemoteLayerTreeDrawingAreaProxymm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm (185966 => 185967)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm        2015-06-25 22:40:11 UTC (rev 185966)
+++ trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm        2015-06-25 23:09:16 UTC (rev 185967)
</span><span class="lines">@@ -101,10 +101,6 @@
</span><span class="cx"> RemoteLayerTreeDrawingAreaProxy::RemoteLayerTreeDrawingAreaProxy(WebPageProxy&amp; webPageProxy)
</span><span class="cx">     : DrawingAreaProxy(DrawingAreaTypeRemoteLayerTree, webPageProxy)
</span><span class="cx">     , m_remoteLayerTreeHost(*this)
</span><del>-    , m_isWaitingForDidUpdateGeometry(false)
-    , m_pendingLayerTreeTransactionID(0)
-    , m_lastVisibleTransactionID(0)
-    , m_transactionIDForPendingCACommit(0)
</del><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     , m_displayLinkHandler(adoptNS([[OneShotDisplayLinkHandler alloc] initWithDrawingAreaProxy:this]))
</span><span class="cx"> #endif
</span><span class="lines">@@ -196,8 +192,12 @@
</span><span class="cx">             callback-&gt;performCallback();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (m_remoteLayerTreeHost.updateLayerTree(layerTreeTransaction))
-        m_webPageProxy.setAcceleratedCompositingRootLayer(m_remoteLayerTreeHost.rootLayer());
</del><ins>+    if (m_remoteLayerTreeHost.updateLayerTree(layerTreeTransaction)) {
+        if (layerTreeTransaction.transactionID() &gt;= m_transactionIDForUnhidingContent)
+            m_webPageProxy.setAcceleratedCompositingRootLayer(m_remoteLayerTreeHost.rootLayer());
+        else
+            m_remoteLayerTreeHost.detachRootLayer();
+    }
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(ASYNC_SCROLLING)
</span><span class="cx">     RemoteScrollingCoordinatorProxy::RequestedScrollInfo requestedScrollInfo;
</span><span class="lines">@@ -416,11 +416,17 @@
</span><span class="cx">     m_webPageProxy.process().send(Messages::DrawingArea::AddTransactionCallbackID(m_callbacks.put(WTF::move(callbackFunction), nullptr)), m_webPageProxy.pageID());
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void RemoteLayerTreeDrawingAreaProxy::hideContentUntilNextUpdate()
</del><ins>+void RemoteLayerTreeDrawingAreaProxy::hideContentUntilPendingUpdate()
</ins><span class="cx"> {
</span><ins>+    m_transactionIDForUnhidingContent = nextLayerTreeTransactionID();
</ins><span class="cx">     m_remoteLayerTreeHost.detachRootLayer();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void RemoteLayerTreeDrawingAreaProxy::hideContentUntilAnyUpdate()
+{
+    m_remoteLayerTreeHost.detachRootLayer();
+}
+
</ins><span class="cx"> bool RemoteLayerTreeDrawingAreaProxy::hasVisibleContent() const
</span><span class="cx"> {
</span><span class="cx">     return m_remoteLayerTreeHost.rootLayer();
</span></span></pre>
</div>
</div>

</body>
</html>