<!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>[185799] 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/185799">185799</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2015-06-20 13:50:35 -0700 (Sat, 20 Jun 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[WK2][iOS] Avoid synchronous IPC on view state change when the content is not visible
https://bugs.webkit.org/show_bug.cgi?id=146179
&lt;rdar://problem/20923432&gt;

Reviewed by Tim Horton.

After <a href="http://trac.webkit.org/projects/webkit/changeset/170787">r170787</a>, viewStateChange() would cause a synchronous IPC between
the UIProcess and the WebProcess when the view becomes visible. This
was to avoid painting empty / black tiles when unsuspending the
WebProcess on tab switch, in the event volatile IOSurfaces were purged.

However, this sync IPC can have performance implications and is not
needed when the content is not actually visible yet (e.g.
hideContentUntilNextUpdate() was called, or the tab was killed).

This patch avoids the synchronous IPC when the content is hidden and
exposes a private API on WKWebView so that clients can ask for the
content to be hidden until the next update. This would allow for
clients to avoid the synchronous IPC if they don't need the content
to be displayed synchronously (e.g. the view is obscured).

* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _hideContentUntilNextUpdate]):
* UIProcess/API/Cocoa/WKWebViewPrivate.h:
* UIProcess/DrawingAreaProxy.h:
(WebKit::DrawingAreaProxy::hasVisibleContent):
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::dispatchViewStateChange):
* UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h:
* UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm:
(WebKit::RemoteLayerTreeDrawingAreaProxy::isContentHidden):</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="#trunkSourceWebKit2UIProcessAPICocoaWKWebViewPrivateh">trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessDrawingAreaProxyh">trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxycpp">trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp</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 (185798 => 185799)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-06-20 16:48:11 UTC (rev 185798)
+++ trunk/Source/WebKit2/ChangeLog        2015-06-20 20:50:35 UTC (rev 185799)
</span><span class="lines">@@ -1,3 +1,37 @@
</span><ins>+2015-06-20  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        [WK2][iOS] Avoid synchronous IPC on view state change when the content is not visible
+        https://bugs.webkit.org/show_bug.cgi?id=146179
+        &lt;rdar://problem/20923432&gt;
+
+        Reviewed by Tim Horton.
+
+        After r170787, viewStateChange() would cause a synchronous IPC between
+        the UIProcess and the WebProcess when the view becomes visible. This
+        was to avoid painting empty / black tiles when unsuspending the
+        WebProcess on tab switch, in the event volatile IOSurfaces were purged.
+
+        However, this sync IPC can have performance implications and is not
+        needed when the content is not actually visible yet (e.g.
+        hideContentUntilNextUpdate() was called, or the tab was killed).
+
+        This patch avoids the synchronous IPC when the content is hidden and
+        exposes a private API on WKWebView so that clients can ask for the
+        content to be hidden until the next update. This would allow for
+        clients to avoid the synchronous IPC if they don't need the content
+        to be displayed synchronously (e.g. the view is obscured).
+
+        * UIProcess/API/Cocoa/WKWebView.mm:
+        (-[WKWebView _hideContentUntilNextUpdate]):
+        * UIProcess/API/Cocoa/WKWebViewPrivate.h:
+        * UIProcess/DrawingAreaProxy.h:
+        (WebKit::DrawingAreaProxy::hasVisibleContent):
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::dispatchViewStateChange):
+        * UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h:
+        * UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm:
+        (WebKit::RemoteLayerTreeDrawingAreaProxy::isContentHidden):
+
</ins><span class="cx"> 2015-06-20  Michael Catanzaro  &lt;mcatanzaro@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Check for SHA1 certificates ignores subresources
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKWebViewmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm (185798 => 185799)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2015-06-20 16:48:11 UTC (rev 185798)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm        2015-06-20 20:50:35 UTC (rev 185799)
</span><span class="lines">@@ -2591,6 +2591,12 @@
</span><span class="cx">     [self _updateVisibleContentRects];
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)_hideContentUntilNextUpdate
+{
+    if (auto* area = _page-&gt;drawingArea())
+        area-&gt;hideContentUntilNextUpdate();
+}
+
</ins><span class="cx"> - (void)_beginAnimatedResizeWithUpdates:(void (^)(void))updateBlock
</span><span class="cx"> {
</span><span class="cx">     CGRect oldBounds = self.bounds;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessAPICocoaWKWebViewPrivateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h (185798 => 185799)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h        2015-06-20 16:48:11 UTC (rev 185798)
+++ trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebViewPrivate.h        2015-06-20 20:50:35 UTC (rev 185799)
</span><span class="lines">@@ -134,6 +134,7 @@
</span><span class="cx"> 
</span><span class="cx"> - (void)_beginInteractiveObscuredInsetsChange;
</span><span class="cx"> - (void)_endInteractiveObscuredInsetsChange;
</span><ins>+- (void)_hideContentUntilNextUpdate;
</ins><span class="cx"> 
</span><span class="cx"> - (void)_beginAnimatedResizeWithUpdates:(void (^)(void))updateBlock;
</span><span class="cx"> - (void)_endAnimatedResize;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessDrawingAreaProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.h (185798 => 185799)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.h        2015-06-20 16:48:11 UTC (rev 185798)
+++ trunk/Source/WebKit2/UIProcess/DrawingAreaProxy.h        2015-06-20 20:50:35 UTC (rev 185799)
</span><span class="lines">@@ -90,6 +90,7 @@
</span><span class="cx">     virtual void dispatchAfterEnsuringDrawing(std::function&lt;void (CallbackBase::Error)&gt;) { ASSERT_NOT_REACHED(); }
</span><span class="cx"> 
</span><span class="cx">     virtual void hideContentUntilNextUpdate() { ASSERT_NOT_REACHED(); }
</span><ins>+    virtual bool hasVisibleContent() const { return true; }
</ins><span class="cx"> 
</span><span class="cx">     virtual void willSendUpdateGeometry() { }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (185798 => 185799)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2015-06-20 16:48:11 UTC (rev 185798)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2015-06-20 20:50:35 UTC (rev 185799)
</span><span class="lines">@@ -1372,7 +1372,7 @@
</span><span class="cx">     ViewState::Flags changed = m_viewState ^ previousViewState;
</span><span class="cx"> 
</span><span class="cx">     // We always want to wait for the Web process to reply if we've been in-window before and are coming back in-window.
</span><del>-    if (m_viewWasEverInWindow &amp;&amp; (changed &amp; ViewState::IsInWindow) &amp;&amp; isInWindow())
</del><ins>+    if (m_viewWasEverInWindow &amp;&amp; (changed &amp; ViewState::IsInWindow) &amp;&amp; isInWindow() &amp;&amp; m_drawingArea-&gt;hasVisibleContent())
</ins><span class="cx">         m_viewStateChangeWantsSynchronousReply = true;
</span><span class="cx"> 
</span><span class="cx">     // Don't wait synchronously if the view state is not visible. (This matters in particular on iOS, where a hidden page may be suspended.)
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessmacRemoteLayerTreeDrawingAreaProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h (185798 => 185799)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h        2015-06-20 16:48:11 UTC (rev 185798)
+++ trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.h        2015-06-20 20:50:35 UTC (rev 185799)
</span><span class="lines">@@ -39,7 +39,7 @@
</span><span class="cx"> class RemoteLayerTreeTransaction;
</span><span class="cx"> class RemoteScrollingCoordinatorTransaction;
</span><span class="cx"> 
</span><del>-class RemoteLayerTreeDrawingAreaProxy : public DrawingAreaProxy {
</del><ins>+class RemoteLayerTreeDrawingAreaProxy final : public DrawingAreaProxy {
</ins><span class="cx"> public:
</span><span class="cx">     explicit RemoteLayerTreeDrawingAreaProxy(WebPageProxy&amp;);
</span><span class="cx">     virtual ~RemoteLayerTreeDrawingAreaProxy();
</span><span class="lines">@@ -77,6 +77,7 @@
</span><span class="cx"> 
</span><span class="cx">     virtual void waitForDidUpdateViewState() override;
</span><span class="cx">     virtual void hideContentUntilNextUpdate() override;
</span><ins>+    virtual bool hasVisibleContent() const override;
</ins><span class="cx">     
</span><span class="cx">     WebCore::FloatPoint indicatorLocation() const;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessmacRemoteLayerTreeDrawingAreaProxymm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm (185798 => 185799)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm        2015-06-20 16:48:11 UTC (rev 185798)
+++ trunk/Source/WebKit2/UIProcess/mac/RemoteLayerTreeDrawingAreaProxy.mm        2015-06-20 20:50:35 UTC (rev 185799)
</span><span class="lines">@@ -421,4 +421,9 @@
</span><span class="cx">     m_remoteLayerTreeHost.detachRootLayer();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool RemoteLayerTreeDrawingAreaProxy::hasVisibleContent() const
+{
+    return m_remoteLayerTreeHost.rootLayer();
+}
+
</ins><span class="cx"> } // namespace WebKit
</span></span></pre>
</div>
</div>

</body>
</html>