<!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>[187945] releases/WebKitGTK/webkit-2.8/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/187945">187945</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2015-08-05 00:33:24 -0700 (Wed, 05 Aug 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/187471">r187471</a> - First in-window viewStateChange synchronously blocks despite not previously being in-window
https://bugs.webkit.org/show_bug.cgi?id=147344
&lt;rdar://problem/22021772&gt;

Reviewed by Simon Fraser.

* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::updateViewState):
(WebKit::WebPageProxy::dispatchViewStateChange):
The whole point of m_viewWasEverInWindow was so that we would not
synchronously wait when a view was added to a window for the first time,
only all subsequent times.

However, since m_viewWasEverInWindow was being set *before* being
checked in dispatchViewStateChange, we were always blocking. This is
a huge waste of main-thread time, because there's no reason to wait
for the first paint if you've never seen the view before (and shouldn't
expect it to have content).

Instead, set the flag after dispatching a view state change, so it becomes
&quot;have we ever sent a view state with IsInWindow set&quot; instead.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit28SourceWebKit2ChangeLog">releases/WebKitGTK/webkit-2.8/Source/WebKit2/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit28SourceWebKit2UIProcessWebPageProxycpp">releases/WebKitGTK/webkit-2.8/Source/WebKit2/UIProcess/WebPageProxy.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit28SourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.8/Source/WebKit2/ChangeLog (187944 => 187945)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.8/Source/WebKit2/ChangeLog        2015-08-05 07:28:24 UTC (rev 187944)
+++ releases/WebKitGTK/webkit-2.8/Source/WebKit2/ChangeLog        2015-08-05 07:33:24 UTC (rev 187945)
</span><span class="lines">@@ -1,3 +1,27 @@
</span><ins>+2015-07-27  Tim Horton  &lt;timothy_horton@apple.com&gt;
+
+        First in-window viewStateChange synchronously blocks despite not previously being in-window
+        https://bugs.webkit.org/show_bug.cgi?id=147344
+        &lt;rdar://problem/22021772&gt;
+
+        Reviewed by Simon Fraser.
+
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::updateViewState):
+        (WebKit::WebPageProxy::dispatchViewStateChange):
+        The whole point of m_viewWasEverInWindow was so that we would not
+        synchronously wait when a view was added to a window for the first time,
+        only all subsequent times.
+
+        However, since m_viewWasEverInWindow was being set *before* being
+        checked in dispatchViewStateChange, we were always blocking. This is
+        a huge waste of main-thread time, because there's no reason to wait
+        for the first paint if you've never seen the view before (and shouldn't
+        expect it to have content).
+
+        Instead, set the flag after dispatching a view state change, so it becomes
+        &quot;have we ever sent a view state with IsInWindow set&quot; instead.
+
</ins><span class="cx"> 2015-07-27  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] Pass a GstInstallPluginsContext to gst_install_plugins_async
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit28SourceWebKit2UIProcessWebPageProxycpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.8/Source/WebKit2/UIProcess/WebPageProxy.cpp (187944 => 187945)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.8/Source/WebKit2/UIProcess/WebPageProxy.cpp        2015-08-05 07:28:24 UTC (rev 187944)
+++ releases/WebKitGTK/webkit-2.8/Source/WebKit2/UIProcess/WebPageProxy.cpp        2015-08-05 07:33:24 UTC (rev 187945)
</span><span class="lines">@@ -1242,10 +1242,8 @@
</span><span class="cx">         m_viewState |= ViewState::IsVisible;
</span><span class="cx">     if (flagsToUpdate &amp; ViewState::IsVisibleOrOccluded &amp;&amp; m_pageClient.isViewVisibleOrOccluded())
</span><span class="cx">         m_viewState |= ViewState::IsVisibleOrOccluded;
</span><del>-    if (flagsToUpdate &amp; ViewState::IsInWindow &amp;&amp; m_pageClient.isViewInWindow()) {
</del><ins>+    if (flagsToUpdate &amp; ViewState::IsInWindow &amp;&amp; m_pageClient.isViewInWindow())
</ins><span class="cx">         m_viewState |= ViewState::IsInWindow;
</span><del>-        m_viewWasEverInWindow = true;
-    }
</del><span class="cx">     if (flagsToUpdate &amp; ViewState::IsVisuallyIdle &amp;&amp; m_pageClient.isVisuallyIdle())
</span><span class="cx">         m_viewState |= ViewState::IsVisuallyIdle;
</span><span class="cx"> }
</span><span class="lines">@@ -1310,8 +1308,9 @@
</span><span class="cx">     updateViewState(m_potentiallyChangedViewStateFlags);
</span><span class="cx">     ViewState::Flags changed = m_viewState ^ previousViewState;
</span><span class="cx"> 
</span><ins>+    bool isNowInWindow = (changed &amp; ViewState::IsInWindow) &amp;&amp; isInWindow();
</ins><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; isNowInWindow)
</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 class="lines">@@ -1346,6 +1345,7 @@
</span><span class="cx"> 
</span><span class="cx">     m_potentiallyChangedViewStateFlags = ViewState::NoFlags;
</span><span class="cx">     m_viewStateChangeWantsSynchronousReply = false;
</span><ins>+    m_viewWasEverInWindow |= isNowInWindow;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPageProxy::updateActivityToken()
</span></span></pre>
</div>
</div>

</body>
</html>