<!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>[177255] 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/177255">177255</a></dd>
<dt>Author</dt> <dd>barraclough@apple.com</dd>
<dt>Date</dt> <dd>2014-12-12 17:44:27 -0800 (Fri, 12 Dec 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Split WebPageProxy::m_preventProcessSuppression to track pref/visibility separately
https://bugs.webkit.org/show_bug.cgi?id=139600

Reviewed by Geoff Garen.

Previously WebPageProxy::m_preventProcessSuppression would be set if either the page was visible
or its suppression was disabled by the pref. Instead track these separately. This will make the
user observability state applicable on iOS, too.

Add a new counter to WebContext, and split the counting in WebPageProxy.
::updateProccessSuppressionState continues to track the pref change (which matches its name),
tracking of user observability changes moved to updateActivityToken (which we should further
merge with; it already tracks observability to control process state for iOS).

* UIProcess/WebContext.cpp:
(WebKit::m_processSuppressionDisabledForPageCounter):
    - added new RefCounter.
* UIProcess/WebContext.h:
(WebKit::WebContext::processSuppressionDisabledForPageCount):
    - added new RefCounter.
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::reattachToWebProcess):
    - no longer needs to call updateProccessSuppressionState (pref has not changed; handled by the call to updateActivityToken).
(WebKit::WebPageProxy::dispatchViewStateChange):
    - no longer needs to call updateProccessSuppressionState (pref has not changed; handled by the call to updateActivityToken).
(WebKit::WebPageProxy::updateActivityToken):
    - this now also updated the user observability counter.
(WebKit::WebPageProxy::updateProccessSuppressionState):
    - now only tracks whether this is disabled via the preference.
(WebKit::WebPageProxy::resetStateAfterProcessExited):
    - clear the user observability counter; thsi will be reset on reattach.
* UIProcess/WebPageProxy.h:
    - added new RefCounter::Count.
* UIProcess/mac/WebContextMac.mm:
(WebKit::WebContext::processSuppressionEnabled):
    - processSuppressionEnabled is disabled if *neither*:
        - there are user observable pages
        - disabled by pref for any page.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebContextcpp">trunk/Source/WebKit2/UIProcess/WebContext.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebContexth">trunk/Source/WebKit2/UIProcess/WebContext.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxycpp">trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebPageProxyh">trunk/Source/WebKit2/UIProcess/WebPageProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessmacWebContextMacmm">trunk/Source/WebKit2/UIProcess/mac/WebContextMac.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (177254 => 177255)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-12-13 01:40:44 UTC (rev 177254)
+++ trunk/Source/WebKit2/ChangeLog        2014-12-13 01:44:27 UTC (rev 177255)
</span><span class="lines">@@ -1,3 +1,44 @@
</span><ins>+2014-12-12  Gavin Barraclough  &lt;barraclough@apple.com&gt;
+
+        Split WebPageProxy::m_preventProcessSuppression to track pref/visibility separately
+        https://bugs.webkit.org/show_bug.cgi?id=139600
+
+        Reviewed by Geoff Garen.
+
+        Previously WebPageProxy::m_preventProcessSuppression would be set if either the page was visible
+        or its suppression was disabled by the pref. Instead track these separately. This will make the
+        user observability state applicable on iOS, too.
+
+        Add a new counter to WebContext, and split the counting in WebPageProxy.
+        ::updateProccessSuppressionState continues to track the pref change (which matches its name),
+        tracking of user observability changes moved to updateActivityToken (which we should further
+        merge with; it already tracks observability to control process state for iOS).
+
+        * UIProcess/WebContext.cpp:
+        (WebKit::m_processSuppressionDisabledForPageCounter):
+            - added new RefCounter.
+        * UIProcess/WebContext.h:
+        (WebKit::WebContext::processSuppressionDisabledForPageCount):
+            - added new RefCounter.
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::reattachToWebProcess):
+            - no longer needs to call updateProccessSuppressionState (pref has not changed; handled by the call to updateActivityToken).
+        (WebKit::WebPageProxy::dispatchViewStateChange):
+            - no longer needs to call updateProccessSuppressionState (pref has not changed; handled by the call to updateActivityToken).
+        (WebKit::WebPageProxy::updateActivityToken):
+            - this now also updated the user observability counter.
+        (WebKit::WebPageProxy::updateProccessSuppressionState):
+            - now only tracks whether this is disabled via the preference.
+        (WebKit::WebPageProxy::resetStateAfterProcessExited):
+            - clear the user observability counter; thsi will be reset on reattach.
+        * UIProcess/WebPageProxy.h:
+            - added new RefCounter::Count.
+        * UIProcess/mac/WebContextMac.mm:
+        (WebKit::WebContext::processSuppressionEnabled):
+            - processSuppressionEnabled is disabled if *neither*:
+                - there are user observable pages
+                - disabled by pref for any page.
+
</ins><span class="cx"> 2014-12-12  Beth Dakin  &lt;bdakin@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Need a fake mouse move after hiding data detectors UI
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebContextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebContext.cpp (177254 => 177255)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebContext.cpp        2014-12-13 01:40:44 UTC (rev 177254)
+++ trunk/Source/WebKit2/UIProcess/WebContext.cpp        2014-12-13 01:44:27 UTC (rev 177255)
</span><span class="lines">@@ -195,6 +195,7 @@
</span><span class="cx"> #endif
</span><span class="cx">     , m_memoryCacheDisabled(false)
</span><span class="cx">     , m_userObservablePageCounter([this]() { updateProcessSuppressionState(); })
</span><ins>+    , m_processSuppressionDisabledForPageCounter([this]() { updateProcessSuppressionState(); })
</ins><span class="cx"> {
</span><span class="cx">     platformInitialize();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebContexth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebContext.h (177254 => 177255)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebContext.h        2014-12-13 01:40:44 UTC (rev 177254)
+++ trunk/Source/WebKit2/UIProcess/WebContext.h        2014-12-13 01:44:27 UTC (rev 177255)
</span><span class="lines">@@ -361,6 +361,11 @@
</span><span class="cx">         return m_userObservablePageCounter.count();
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    PassRefPtr&lt;RefCounter::Count&gt; processSuppressionDisabledForPageCount()
+    {
+        return m_processSuppressionDisabledForPageCounter.count();
+    }
+
</ins><span class="cx"> private:
</span><span class="cx">     void platformInitialize();
</span><span class="cx"> 
</span><span class="lines">@@ -566,6 +571,7 @@
</span><span class="cx">     bool m_memoryCacheDisabled;
</span><span class="cx"> 
</span><span class="cx">     RefCounter m_userObservablePageCounter;
</span><ins>+    RefCounter m_processSuppressionDisabledForPageCounter;
</ins><span class="cx"> 
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx">     RetainPtr&lt;NSMutableDictionary&gt; m_bundleParameters;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (177254 => 177255)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2014-12-13 01:40:44 UTC (rev 177254)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2014-12-13 01:44:27 UTC (rev 177255)
</span><span class="lines">@@ -577,7 +577,6 @@
</span><span class="cx"> 
</span><span class="cx">     updateViewState();
</span><span class="cx">     updateActivityToken();
</span><del>-    updateProccessSuppressionState();
</del><span class="cx"> 
</span><span class="cx"> #if ENABLE(INSPECTOR)
</span><span class="cx">     m_inspector = WebInspectorProxy::create(this);
</span><span class="lines">@@ -1242,7 +1241,6 @@
</span><span class="cx"> 
</span><span class="cx">     // This must happen after the SetViewState message is sent, to ensure the page visibility event can fire.
</span><span class="cx">     updateActivityToken();
</span><del>-    updateProccessSuppressionState();
</del><span class="cx"> 
</span><span class="cx">     // If we've started the responsiveness timer as part of telling the web process to update the backing store
</span><span class="cx">     // state, it might not send back a reply (since it won't paint anything if the web page is hidden) so we
</span><span class="lines">@@ -1268,6 +1266,11 @@
</span><span class="cx"> 
</span><span class="cx"> void WebPageProxy::updateActivityToken()
</span><span class="cx"> {
</span><ins>+    if (m_viewState &amp; ViewState::IsVisuallyIdle)
+        m_pageIsUserObservableCount = nullptr;
+    else if (!m_pageIsUserObservableCount)
+        m_pageIsUserObservableCount = m_process-&gt;context().userObservablePageCount();
+
</ins><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     if (!isViewVisible())
</span><span class="cx">         m_activityToken = nullptr;
</span><span class="lines">@@ -1278,12 +1281,10 @@
</span><span class="cx"> 
</span><span class="cx"> void WebPageProxy::updateProccessSuppressionState()
</span><span class="cx"> {
</span><del>-#if PLATFORM(COCOA)
-    if ((m_viewState &amp; ViewState::IsVisuallyIdle) &amp;&amp; m_preferences-&gt;pageVisibilityBasedProcessSuppressionEnabled())
-        m_preventProcessSuppression = nullptr;
-    else if (!m_preventProcessSuppression)
-        m_preventProcessSuppression = m_process-&gt;context().userObservablePageCount();
-#endif
</del><ins>+    if (m_preferences-&gt;pageVisibilityBasedProcessSuppressionEnabled())
+        m_preventProcessSuppressionCount = nullptr;
+    else if (!m_preventProcessSuppressionCount)
+        m_preventProcessSuppressionCount = m_process-&gt;context().processSuppressionDisabledForPageCount();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebPageProxy::layerHostingModeDidChange()
</span><span class="lines">@@ -4560,9 +4561,7 @@
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     m_activityToken = nullptr;
</span><span class="cx"> #endif
</span><del>-#if PLATFORM(COCOA)
-    m_preventProcessSuppression = nullptr;
-#endif
</del><ins>+    m_pageIsUserObservableCount = nullptr;
</ins><span class="cx"> 
</span><span class="cx">     m_isValid = false;
</span><span class="cx">     m_isPageSuspended = false;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (177254 => 177255)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2014-12-13 01:40:44 UTC (rev 177254)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2014-12-13 01:44:27 UTC (rev 177255)
</span><span class="lines">@@ -1581,8 +1581,9 @@
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx">     HashMap&lt;String, String&gt; m_temporaryPDFFiles;
</span><span class="cx">     std::unique_ptr&lt;WebCore::RunLoopObserver&gt; m_viewStateChangeDispatcher;
</span><del>-    RefPtr&lt;RefCounter::Count&gt; m_preventProcessSuppression;
</del><span class="cx"> #endif
</span><ins>+    RefPtr&lt;RefCounter::Count&gt; m_pageIsUserObservableCount;
+    RefPtr&lt;RefCounter::Count&gt; m_preventProcessSuppressionCount;
</ins><span class="cx">         
</span><span class="cx">     WebCore::ScrollPinningBehavior m_scrollPinningBehavior;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessmacWebContextMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/mac/WebContextMac.mm (177254 => 177255)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/mac/WebContextMac.mm        2014-12-13 01:40:44 UTC (rev 177254)
+++ trunk/Source/WebKit2/UIProcess/mac/WebContextMac.mm        2014-12-13 01:44:27 UTC (rev 177255)
</span><span class="lines">@@ -512,7 +512,7 @@
</span><span class="cx"> 
</span><span class="cx"> bool WebContext::processSuppressionEnabled() const
</span><span class="cx"> {
</span><del>-    return !m_userObservablePageCounter.value();
</del><ins>+    return !m_userObservablePageCounter.value() &amp;&amp; !m_processSuppressionDisabledForPageCounter.value();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool WebContext::processSuppressionIsEnabledForAllContexts()
</span></span></pre>
</div>
</div>

</body>
</html>