<!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>[177209] 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/177209">177209</a></dd>
<dt>Author</dt> <dd>barraclough@apple.com</dd>
<dt>Date</dt> <dd>2014-12-11 21:15:48 -0800 (Thu, 11 Dec 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Track pages preventing suppression in WebProcessProxy using RefCounter
https://bugs.webkit.org/show_bug.cgi?id=139108

Reviewed by Benjamin Poulain.

The networking process is allowed to app nap if all web pages are also currently in app nap.
In order to detect whether any page in any process currently requires the networking process
to be active we:
 - maintain hash sets in every WebProcessProxy of pages that are okay with suppression.
 - if anything changes, the WebContext iterates every WebProcessProxy to recompute state.

This is all crazy - all we actually need is a simple count of the number of pages that need
to prevent the networking process from entering app nap. This patch gets us half way there -
replace the HashSet with a RefCounter. Next step will be to hoist the RefCounters from the
process proxies up to the context to do away with the iteration.

* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::WebPageProxy):
(WebKit::WebPageProxy::reattachToWebProcess):
    - make sure we prevent process suppression, per current viewstate &amp; preferences.
(WebKit::WebPageProxy::dispatchViewStateChange):
    - make sure we prevent process suppression, per viewstate change.
(WebKit::WebPageProxy::updateProccessSuppressionState):
    - recompute whether we need to prevent process suppression.
(WebKit::WebPageProxy::preferencesDidChange):
    - when preferences change process supression may be disabled.
(WebKit::WebPageProxy::resetStateAfterProcessExited):
    - we need to drop the old ref, to allow a new one to be taken when we reattach.
(WebKit::WebPageProxy::isProcessSuppressible): Deleted.
    - moreged into updateProccessSuppressionState.
* UIProcess/WebPageProxy.h:
    - added m_preventProcessSuppression.
* UIProcess/WebProcessProxy.cpp:
(WebKit::WebProcessProxy::WebProcessProxy):
    - initialize m_pagesPreventingSuppression
(WebKit::WebProcessProxy::createWebPage):
    - moved to WebPageProxy::WebPageProxy
(WebKit::WebProcessProxy::addExistingWebPage):
    - moved to WebPageProxy::reattachToWebProcess
(WebKit::WebProcessProxy::removeWebPage):
    - now implicit; when the page is destroyed the RefPtr will release.
(WebKit::WebProcessProxy::pageSuppressibilityChanged): Deleted.
    - moved to WebPageProxy::dispatchViewStateChange.
(WebKit::WebProcessProxy::pagePreferencesChanged): Deleted.
    - moved to WebPageProxy::preferencesDidChange.
* UIProcess/WebProcessProxy.h:
(WebKit::WebProcessProxy::preventProcessSuppressionForPage):
    - reference count m_pagesPreventingSuppression
* UIProcess/mac/WebProcessProxyMac.mm:
(WebKit::WebProcessProxy::allPagesAreProcessSuppressible):
    - converted to use m_pagesPreventingSuppression.
    - removed guard that meant processes with no pages would keep the networking
      process from entering app nap, which made no sense.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</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="#trunkSourceWebKit2UIProcessWebProcessProxycpp">trunk/Source/WebKit2/UIProcess/WebProcessProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessWebProcessProxyh">trunk/Source/WebKit2/UIProcess/WebProcessProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessmacWebProcessProxyMacmm">trunk/Source/WebKit2/UIProcess/mac/WebProcessProxyMac.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (177208 => 177209)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-12-12 03:16:24 UTC (rev 177208)
+++ trunk/Source/WebKit2/ChangeLog        2014-12-12 05:15:48 UTC (rev 177209)
</span><span class="lines">@@ -1,3 +1,59 @@
</span><ins>+2014-12-11  Gavin Barraclough  &lt;barraclough@apple.com&gt;
+
+        Track pages preventing suppression in WebProcessProxy using RefCounter
+        https://bugs.webkit.org/show_bug.cgi?id=139108
+
+        Reviewed by Benjamin Poulain.
+
+        The networking process is allowed to app nap if all web pages are also currently in app nap.
+        In order to detect whether any page in any process currently requires the networking process
+        to be active we:
+         - maintain hash sets in every WebProcessProxy of pages that are okay with suppression.
+         - if anything changes, the WebContext iterates every WebProcessProxy to recompute state.
+
+        This is all crazy - all we actually need is a simple count of the number of pages that need
+        to prevent the networking process from entering app nap. This patch gets us half way there -
+        replace the HashSet with a RefCounter. Next step will be to hoist the RefCounters from the
+        process proxies up to the context to do away with the iteration.
+
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::WebPageProxy):
+        (WebKit::WebPageProxy::reattachToWebProcess):
+            - make sure we prevent process suppression, per current viewstate &amp; preferences.
+        (WebKit::WebPageProxy::dispatchViewStateChange):
+            - make sure we prevent process suppression, per viewstate change.
+        (WebKit::WebPageProxy::updateProccessSuppressionState):
+            - recompute whether we need to prevent process suppression.
+        (WebKit::WebPageProxy::preferencesDidChange):
+            - when preferences change process supression may be disabled.
+        (WebKit::WebPageProxy::resetStateAfterProcessExited):
+            - we need to drop the old ref, to allow a new one to be taken when we reattach.
+        (WebKit::WebPageProxy::isProcessSuppressible): Deleted.
+            - moreged into updateProccessSuppressionState.
+        * UIProcess/WebPageProxy.h:
+            - added m_preventProcessSuppression.
+        * UIProcess/WebProcessProxy.cpp:
+        (WebKit::WebProcessProxy::WebProcessProxy):
+            - initialize m_pagesPreventingSuppression
+        (WebKit::WebProcessProxy::createWebPage):
+            - moved to WebPageProxy::WebPageProxy
+        (WebKit::WebProcessProxy::addExistingWebPage):
+            - moved to WebPageProxy::reattachToWebProcess
+        (WebKit::WebProcessProxy::removeWebPage):
+            - now implicit; when the page is destroyed the RefPtr will release.
+        (WebKit::WebProcessProxy::pageSuppressibilityChanged): Deleted.
+            - moved to WebPageProxy::dispatchViewStateChange.
+        (WebKit::WebProcessProxy::pagePreferencesChanged): Deleted.
+            - moved to WebPageProxy::preferencesDidChange.
+        * UIProcess/WebProcessProxy.h:
+        (WebKit::WebProcessProxy::preventProcessSuppressionForPage):
+            - reference count m_pagesPreventingSuppression
+        * UIProcess/mac/WebProcessProxyMac.mm:
+        (WebKit::WebProcessProxy::allPagesAreProcessSuppressible):
+            - converted to use m_pagesPreventingSuppression.
+            - removed guard that meant processes with no pages would keep the networking
+              process from entering app nap, which made no sense.
+
</ins><span class="cx"> 2014-12-11  Anders Carlsson  &lt;andersca@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Temporarily use WebCore session storage for transient local storage
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebPageProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (177208 => 177209)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2014-12-12 03:16:24 UTC (rev 177208)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp        2014-12-12 05:15:48 UTC (rev 177209)
</span><span class="lines">@@ -388,6 +388,7 @@
</span><span class="cx"> 
</span><span class="cx">     updateViewState();
</span><span class="cx">     updateActivityToken();
</span><ins>+    updateProccessSuppressionState();
</ins><span class="cx">     
</span><span class="cx"> #if HAVE(OUT_OF_PROCESS_LAYER_HOSTING)
</span><span class="cx">     m_layerHostingMode = m_viewState &amp; ViewState::IsInWindow ? m_pageClient.viewLayerHostingMode() : LayerHostingMode::OutOfProcess;
</span><span class="lines">@@ -576,6 +577,7 @@
</span><span class="cx"> 
</span><span class="cx">     updateViewState();
</span><span class="cx">     updateActivityToken();
</span><ins>+    updateProccessSuppressionState();
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(INSPECTOR)
</span><span class="cx">     m_inspector = WebInspectorProxy::create(this);
</span><span class="lines">@@ -659,11 +661,6 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool WebPageProxy::isProcessSuppressible() const
-{
-    return (m_viewState &amp; ViewState::IsVisuallyIdle) &amp;&amp; m_preferences-&gt;pageVisibilityBasedProcessSuppressionEnabled();
-}
-
</del><span class="cx"> void WebPageProxy::close()
</span><span class="cx"> {
</span><span class="cx">     if (m_isClosed)
</span><span class="lines">@@ -1245,10 +1242,8 @@
</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><ins>+    updateProccessSuppressionState();
</ins><span class="cx"> 
</span><del>-    if (changed &amp; ViewState::IsVisuallyIdle)
-        m_process-&gt;pageSuppressibilityChanged(this);
-
</del><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="cx">     // stop the unresponsiveness timer here.
</span><span class="lines">@@ -1281,6 +1276,16 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebPageProxy::updateProccessSuppressionState()
+{
+#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;processSuppressionCounter();
+#endif
+}
+
</ins><span class="cx"> void WebPageProxy::layerHostingModeDidChange()
</span><span class="cx"> {
</span><span class="cx">     if (!isValid())
</span><span class="lines">@@ -2489,7 +2494,7 @@
</span><span class="cx">         inspector()-&gt;enableRemoteInspection();
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    m_process-&gt;pagePreferencesChanged(this);
</del><ins>+    updateProccessSuppressionState();
</ins><span class="cx"> 
</span><span class="cx">     m_pageClient.preferencesDidChange();
</span><span class="cx"> 
</span><span class="lines">@@ -4558,6 +4563,9 @@
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     m_activityToken = nullptr;
</span><span class="cx"> #endif
</span><ins>+#if PLATFORM(COCOA)
+    m_preventProcessSuppression = nullptr;
+#endif
</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 (177208 => 177209)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2014-12-12 03:16:24 UTC (rev 177208)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h        2014-12-12 05:15:48 UTC (rev 177209)
</span><span class="lines">@@ -383,7 +383,6 @@
</span><span class="cx">     WebCore::IntSize viewSize() const;
</span><span class="cx">     bool isViewVisible() const { return m_viewState &amp; WebCore::ViewState::IsVisible; }
</span><span class="cx">     bool isViewWindowActive() const;
</span><del>-    bool isProcessSuppressible() const;
</del><span class="cx"> 
</span><span class="cx">     void addMIMETypeWithCustomContentProvider(const String&amp; mimeType);
</span><span class="cx"> 
</span><span class="lines">@@ -959,6 +958,7 @@
</span><span class="cx"> 
</span><span class="cx">     void updateViewState(WebCore::ViewState::Flags flagsToUpdate = WebCore::ViewState::AllFlags);
</span><span class="cx">     void updateActivityToken();
</span><ins>+    void updateProccessSuppressionState();
</ins><span class="cx"> 
</span><span class="cx">     enum class ResetStateReason {
</span><span class="cx">         PageInvalidated,
</span><span class="lines">@@ -1581,6 +1581,7 @@
</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><ins>+    RefPtr&lt;RefCounter::Count&gt; m_preventProcessSuppression;
</ins><span class="cx"> #endif
</span><span class="cx">         
</span><span class="cx">     WebCore::ScrollPinningBehavior m_scrollPinningBehavior;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebProcessProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebProcessProxy.cpp (177208 => 177209)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebProcessProxy.cpp        2014-12-12 03:16:24 UTC (rev 177208)
+++ trunk/Source/WebKit2/UIProcess/WebProcessProxy.cpp        2014-12-12 05:15:48 UTC (rev 177209)
</span><span class="lines">@@ -94,6 +94,7 @@
</span><span class="cx">     , m_mayHaveUniversalFileReadSandboxExtension(false)
</span><span class="cx">     , m_customProtocolManagerProxy(this, context)
</span><span class="cx"> #if PLATFORM(COCOA)
</span><ins>+    , m_pagesPreventingSuppressionCounter([this]() { updateProcessSuppressionState(); })
</ins><span class="cx">     , m_processSuppressionEnabled(false)
</span><span class="cx"> #endif
</span><span class="cx">     , m_numberOfTimesSuddenTerminationWasDisabled(0)
</span><span class="lines">@@ -189,11 +190,6 @@
</span><span class="cx">     RefPtr&lt;WebPageProxy&gt; webPage = WebPageProxy::create(pageClient, *this, pageID, configuration);
</span><span class="cx">     m_pageMap.set(pageID, webPage.get());
</span><span class="cx">     globalPageMap().set(pageID, webPage.get());
</span><del>-#if PLATFORM(COCOA)
-    if (webPage-&gt;isProcessSuppressible())
-        m_processSuppressiblePages.add(pageID);
-    updateProcessSuppressionState();
-#endif
</del><span class="cx">     return webPage.release();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -204,11 +200,6 @@
</span><span class="cx"> 
</span><span class="cx">     m_pageMap.set(pageID, webPage);
</span><span class="cx">     globalPageMap().set(pageID, webPage);
</span><del>-#if PLATFORM(COCOA)
-    if (webPage-&gt;isProcessSuppressible())
-        m_processSuppressiblePages.add(pageID);
-    updateProcessSuppressionState();
-#endif
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebProcessProxy::removeWebPage(uint64_t pageID)
</span><span class="lines">@@ -224,11 +215,6 @@
</span><span class="cx">     for (auto itemID : itemIDsToRemove)
</span><span class="cx">         m_backForwardListItemMap.remove(itemID);
</span><span class="cx"> 
</span><del>-#if PLATFORM(COCOA)
-    m_processSuppressiblePages.remove(pageID);
-    updateProcessSuppressionState();
-#endif
-
</del><span class="cx">     // If this was the last WebPage open in that web process, and we have no other reason to keep it alive, let it go.
</span><span class="cx">     // We only allow this when using a network process, as otherwise the WebProcess needs to preserve its session state.
</span><span class="cx">     if (!m_context-&gt;usesNetworkProcess() || state() == State::Terminated || !canTerminateChildProcess())
</span><span class="lines">@@ -683,32 +669,6 @@
</span><span class="cx">     m_context-&gt;historyClient().didUpdateHistoryTitle(m_context.ptr(), page, title, url, frame);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebProcessProxy::pageSuppressibilityChanged(WebKit::WebPageProxy *page)
-{
-#if PLATFORM(COCOA)
-    if (page-&gt;isProcessSuppressible())
-        m_processSuppressiblePages.add(page-&gt;pageID());
-    else
-        m_processSuppressiblePages.remove(page-&gt;pageID());
-    updateProcessSuppressionState();
-#else
-    UNUSED_PARAM(page);
-#endif
-}
-
-void WebProcessProxy::pagePreferencesChanged(WebKit::WebPageProxy *page)
-{
-#if PLATFORM(COCOA)
-    if (page-&gt;isProcessSuppressible())
-        m_processSuppressiblePages.add(page-&gt;pageID());
-    else
-        m_processSuppressiblePages.remove(page-&gt;pageID());
-    updateProcessSuppressionState();
-#else
-    UNUSED_PARAM(page);
-#endif
-}
-
</del><span class="cx"> void WebProcessProxy::didSaveToPageCache()
</span><span class="cx"> {
</span><span class="cx">     m_context-&gt;processDidCachePage(this);
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebProcessProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebProcessProxy.h (177208 => 177209)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebProcessProxy.h        2014-12-12 03:16:24 UTC (rev 177208)
+++ trunk/Source/WebKit2/UIProcess/WebProcessProxy.h        2014-12-12 05:15:48 UTC (rev 177209)
</span><span class="lines">@@ -43,6 +43,7 @@
</span><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="cx"> #include &lt;wtf/PassRefPtr.h&gt;
</span><span class="cx"> #include &lt;wtf/RefCounted.h&gt;
</span><ins>+#include &lt;wtf/RefCounter.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx"> #include &quot;ProcessThrottler.h&quot;
</span><span class="lines">@@ -118,8 +119,12 @@
</span><span class="cx"> 
</span><span class="cx">     DownloadProxy* createDownloadProxy(const WebCore::ResourceRequest&amp;);
</span><span class="cx"> 
</span><del>-    void pageSuppressibilityChanged(WebPageProxy*);
-    void pagePreferencesChanged(WebPageProxy*);
</del><ins>+#if PLATFORM(COCOA)
+    PassRefPtr&lt;RefCounter::Count&gt; processSuppressionCounter()
+    {
+        return m_pagesPreventingSuppressionCounter.count();
+    }
+#endif
</ins><span class="cx"> 
</span><span class="cx">     void didSaveToPageCache();
</span><span class="cx">     void releasePageCache();
</span><span class="lines">@@ -226,7 +231,7 @@
</span><span class="cx">     CustomProtocolManagerProxy m_customProtocolManagerProxy;
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(COCOA)
</span><del>-    HashSet&lt;uint64_t&gt; m_processSuppressiblePages;
</del><ins>+    RefCounter m_pagesPreventingSuppressionCounter;
</ins><span class="cx">     bool m_processSuppressionEnabled;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessmacWebProcessProxyMacmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/mac/WebProcessProxyMac.mm (177208 => 177209)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/mac/WebProcessProxyMac.mm        2014-12-12 03:16:24 UTC (rev 177208)
+++ trunk/Source/WebKit2/UIProcess/mac/WebProcessProxyMac.mm        2014-12-12 05:15:48 UTC (rev 177209)
</span><span class="lines">@@ -62,7 +62,7 @@
</span><span class="cx"> 
</span><span class="cx"> bool WebProcessProxy::allPagesAreProcessSuppressible() const
</span><span class="cx"> {
</span><del>-    return (m_processSuppressiblePages.size() == m_pageMap.size()) &amp;&amp; !m_processSuppressiblePages.isEmpty();
</del><ins>+    return !m_pagesPreventingSuppressionCounter.value();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebProcessProxy::updateProcessSuppressionState()
</span></span></pre>
</div>
</div>

</body>
</html>