<!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>[184105] trunk/Source</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/184105">184105</a></dd>
<dt>Author</dt> <dd>dbates@webkit.org</dd>
<dt>Date</dt> <dd>2015-05-11 10:27:13 -0700 (Mon, 11 May 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[iOS] Close all open databases in expiration handler of process assertion
https://bugs.webkit.org/show_bug.cgi?id=144661
&lt;rdar://problem/20845052&gt;

Reviewed by Darin Adler.

Source/WebCore:

Expose functionality in WebCore to close all open databases. Closing a SQLite database
will interrupt any in-progress database transactions.

* Modules/webdatabase/AbstractDatabaseServer.h:
* Modules/webdatabase/DatabaseManager.cpp:
(WebCore::DatabaseManager::closeAllDatabases): Added; turns around and calls DatabaseServer::closeAllDatabases().
* Modules/webdatabase/DatabaseManager.h: Export DatabaseManager::closeAllDatabases() so that
we can call in from WebKit2.
* Modules/webdatabase/DatabaseServer.cpp:
(WebCore::DatabaseServer::closeAllDatabases): Added; turns around and calls DatabaseTracker::closeAllDatabases().
* Modules/webdatabase/DatabaseServer.h:
* Modules/webdatabase/DatabaseTracker.cpp:
(WebCore::DatabaseTracker::closeAllDatabases): Added; closes all open databases.
* Modules/webdatabase/DatabaseTracker.h: Export DatabaseTracker::closeAllDatabases() so that
we can call in from Legacy WebKit.

Source/WebKit/mac:

For Legacy WebKit, close all open databases when the process assertion expiration
handler is called.

* Storage/WebDatabaseManager.mm:
(+[WebDatabaseManager startBackgroundTask]): Call DatabaseTracker::tracker().closeAllDatabases()
in the expiration handler to close all open databases. As a side effect of closing
a database all in-progress database transactions are interrupted.

Source/WebKit2:

For WebKit2, close all open databases when the process assertion expiration
handler is called.

When the process assertion expiration handler is called we dispatch a synchronous
message called ProcessWillSuspendImminently to the {Web, Network} processes to inform
them that they will be suspended imminently. The {Web, Network} process will always
service this message regardless if they were waiting for another message. In the
WebProcess, we will close all open databases among other tasks upon receiving this
message. In the NetworkProcess, we will purge some data from memory.

* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::didReceiveSyncMessage): Modified to call NetworkProcess::didReceiveSyncNetworkProcessMessage()
to process the synchronous ProcessWillSuspendImminently message.
(WebKit::NetworkProcess::processWillSuspendImminently): Added; free some memory.
* NetworkProcess/NetworkProcess.h:
* NetworkProcess/NetworkProcess.messages.in: Added synchronous message ProcessWillSuspendImminently.
* Shared/ChildProcessProxy.h:
(WebKit::ChildProcessProxy::sendSync): Added parameter sendSyncFlags so that we can send
a sync message with flag IPC::InterruptWaitingIfSyncMessageArrives to cause the {Web, Network}Process
to process the message regardless of whether it is waiting for another message.
* UIProcess/Network/NetworkProcessProxy.cpp:
(WebKit::NetworkProcessProxy::sendProcessWillSuspendImminently): Added. Sends the message
ProcessWillSuspendImminently to the NetworkProcess.
* UIProcess/Network/NetworkProcessProxy.h:
* UIProcess/ProcessAssertion.cpp:
(WebKit::ProcessAndUIAssertion::setClient): Added.
* UIProcess/ProcessAssertion.h: Added abstract class ProcessAssertionClient.
(WebKit::ProcessAssertionClient::~ProcessAssertionClient): Added.
(WebKit::ProcessAssertion::setClient): Added.
(WebKit::ProcessAssertion::client): Added.
* UIProcess/ProcessThrottler.cpp:
(WebKit::ProcessThrottler::didConnectToProcess):
(WebKit::ProcessThrottler::assertionWillExpireImminently): Added; implements the ProcessAssertionClient
interface. Notify the process throttler clients that the assertion is near expiration.
* UIProcess/ProcessThrottler.h:
* UIProcess/ProcessThrottlerClient.h: Added
* UIProcess/WebProcessProxy.cpp:
(WebKit::WebProcessProxy::sendProcessWillSuspendImminently): Added. Sends the message
ProcessWillSuspendImminently to the WebProcess.
* UIProcess/WebProcessProxy.h:
* UIProcess/ios/ProcessAssertionIOS.mm:
(-[WKProcessAssertionBackgroundTaskManager addClient:]): Added.
(-[WKProcessAssertionBackgroundTaskManager removeClient:]): Added.
(-[WKProcessAssertionBackgroundTaskManager _updateBackgroundTask]): Modified expiration handler
to notify ProcessAssertionClient clients that the assertion is near expiration.
(WebKit::ProcessAssertion::~ProcessAssertion): Remove the client on destruction.
(WebKit::ProcessAndUIAssertion::setClient): Added.
* WebProcess/WebCoreSupport/WebDatabaseManager.cpp:
(WebKit::WebDatabaseManager::closeAllDatabases): Added; turns around and calls DatabaseManager::closeAllDatabases().
* WebProcess/WebCoreSupport/WebDatabaseManager.h:
* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::didReceiveSyncMessage): Call WebProcess::didReceiveSyncWebProcessMessage() to process
the synchronous ProcessWillSuspendImminently message. Removed logging for an unhandled synchronous message
since WebProcess::didReceiveSyncWebProcessMessage() will ASSERT_NOT_REACHED() for such a message.
(WebKit::WebProcess::prepareToSuspend): Extracted code from WebProcess::processWillSuspend() so that it can
be used from both WebProcess::processWillSuspend() and WebProcess::processWillSuspendImminently(). And modified
it to conditionally dispatch a ProcessReadyToSuspend message to the WebProcessProxy. We only want to dispatch
such a message as part of a coordinated suspension by the ProcessThrottler. That is, we do not want to dispatch
the ProcessReadyToSuspend message when the background assertion is near expiration (i.e. WebProcess::processWillSuspendImminently()
is called).
(WebKit::WebProcess::processWillSuspendImminently): Added. Suspend all open databases among other tasks.
(WebKit::WebProcess::processWillSuspend): Implemented in terms of WebProcess::prepareToSuspend().
(WebKit::WebProcess::processSuspensionCleanupTimerFired): Modified to conditionally dispatch a ProcessReadyToSuspend
message to the WebProcessProxy.
(WebKit::WebProcess::processDidResume): Stop the suspension cleanup timer, which may be active if the WebProcess
did not mark all its graphics layers as volatile before process suspension.
* WebProcess/WebProcess.h:
* WebProcess/WebProcess.messages.in: Added synchronous message ProcessWillSuspendImminently.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseAbstractDatabaseServerh">trunk/Source/WebCore/Modules/webdatabase/AbstractDatabaseServer.h</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseManagercpp">trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseManagerh">trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.h</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseServercpp">trunk/Source/WebCore/Modules/webdatabase/DatabaseServer.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseServerh">trunk/Source/WebCore/Modules/webdatabase/DatabaseServer.h</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseTrackercpp">trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseTrackerh">trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.h</a></li>
<li><a href="#trunkSourceWebKitmacChangeLog">trunk/Source/WebKit/mac/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitmacStorageWebDatabaseManagermm">trunk/Source/WebKit/mac/Storage/WebDatabaseManager.mm</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkProcesscpp">trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkProcessh">trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessNetworkProcessmessagesin">trunk/Source/WebKit2/NetworkProcess/NetworkProcess.messages.in</a></li>
<li><a href="#trunkSourceWebKit2SharedChildProcessProxyh">trunk/Source/WebKit2/Shared/ChildProcessProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessNetworkNetworkProcessProxycpp">trunk/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessNetworkNetworkProcessProxyh">trunk/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessProcessAssertioncpp">trunk/Source/WebKit2/UIProcess/ProcessAssertion.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessProcessAssertionh">trunk/Source/WebKit2/UIProcess/ProcessAssertion.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessProcessThrottlercpp">trunk/Source/WebKit2/UIProcess/ProcessThrottler.cpp</a></li>
<li><a href="#trunkSourceWebKit2UIProcessProcessThrottlerh">trunk/Source/WebKit2/UIProcess/ProcessThrottler.h</a></li>
<li><a href="#trunkSourceWebKit2UIProcessProcessThrottlerClienth">trunk/Source/WebKit2/UIProcess/ProcessThrottlerClient.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="#trunkSourceWebKit2UIProcessiosProcessAssertionIOSmm">trunk/Source/WebKit2/UIProcess/ios/ProcessAssertionIOS.mm</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebCoreSupportWebDatabaseManagercpp">trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebDatabaseManager.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebCoreSupportWebDatabaseManagerh">trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebDatabaseManager.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebProcesscpp">trunk/Source/WebKit2/WebProcess/WebProcess.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebProcessh">trunk/Source/WebKit2/WebProcess/WebProcess.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessWebProcessmessagesin">trunk/Source/WebKit2/WebProcess/WebProcess.messages.in</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebCore/ChangeLog        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -1,3 +1,27 @@
</span><ins>+2015-05-11  Daniel Bates  &lt;dabates@apple.com&gt;
+
+        [iOS] Close all open databases in expiration handler of process assertion
+        https://bugs.webkit.org/show_bug.cgi?id=144661
+        &lt;rdar://problem/20845052&gt;
+
+        Reviewed by Darin Adler.
+
+        Expose functionality in WebCore to close all open databases. Closing a SQLite database
+        will interrupt any in-progress database transactions.
+
+        * Modules/webdatabase/AbstractDatabaseServer.h:
+        * Modules/webdatabase/DatabaseManager.cpp:
+        (WebCore::DatabaseManager::closeAllDatabases): Added; turns around and calls DatabaseServer::closeAllDatabases().
+        * Modules/webdatabase/DatabaseManager.h: Export DatabaseManager::closeAllDatabases() so that
+        we can call in from WebKit2.
+        * Modules/webdatabase/DatabaseServer.cpp:
+        (WebCore::DatabaseServer::closeAllDatabases): Added; turns around and calls DatabaseTracker::closeAllDatabases().
+        * Modules/webdatabase/DatabaseServer.h:
+        * Modules/webdatabase/DatabaseTracker.cpp:
+        (WebCore::DatabaseTracker::closeAllDatabases): Added; closes all open databases.
+        * Modules/webdatabase/DatabaseTracker.h: Export DatabaseTracker::closeAllDatabases() so that
+        we can call in from Legacy WebKit.
+
</ins><span class="cx"> 2015-05-11  Antti Koivisto  &lt;antti@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         WebContent crash under com.apple.WebCore: WebCore::WebKitCSSResourceValue::isCSSValueNone const + 6
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseAbstractDatabaseServerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/AbstractDatabaseServer.h (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/AbstractDatabaseServer.h        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebCore/Modules/webdatabase/AbstractDatabaseServer.h        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -57,6 +57,8 @@
</span><span class="cx"> 
</span><span class="cx">     virtual PassRefPtr&lt;DatabaseBackendBase&gt; openDatabase(RefPtr&lt;DatabaseContext&gt;&amp;, const String&amp; name, const String&amp; expectedVersion, const String&amp; displayName, unsigned long estimatedSize, bool setVersionInNewDatabase, DatabaseError&amp;, String&amp; errorMessage, OpenAttempt = FirstTryToOpenDatabase) = 0;
</span><span class="cx"> 
</span><ins>+    virtual void closeAllDatabases() = 0;
+
</ins><span class="cx">     virtual bool hasEntryForOrigin(SecurityOrigin*) = 0;
</span><span class="cx">     virtual void origins(Vector&lt;RefPtr&lt;SecurityOrigin&gt;&gt;&amp; result) = 0;
</span><span class="cx">     virtual bool databaseNamesForOrigin(SecurityOrigin*, Vector&lt;String&gt;&amp; result) = 0;
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.cpp (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.cpp        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.cpp        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -402,6 +402,11 @@
</span><span class="cx">     m_server-&gt;setPauseAllDatabases(pauseAllDatabases);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void DatabaseManager::closeAllDatabases()
+{
+    m_server-&gt;closeAllDatabases();
+}
+
</ins><span class="cx"> void DatabaseManager::interruptAllDatabasesForContext(ScriptExecutionContext* context)
</span><span class="cx"> {
</span><span class="cx">     RefPtr&lt;DatabaseContext&gt; databaseContext = existingDatabaseContextFor(context);
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseManagerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.h (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.h        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.h        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -85,6 +85,9 @@
</span><span class="cx">     PassRefPtr&lt;Database&gt; openDatabase(ScriptExecutionContext*, const String&amp; name, const String&amp; expectedVersion, const String&amp; displayName, unsigned long estimatedSize, PassRefPtr&lt;DatabaseCallback&gt;, DatabaseError&amp;);
</span><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT bool hasOpenDatabases(ScriptExecutionContext*);
</span><ins>+
+    WEBCORE_EXPORT void closeAllDatabases();
+
</ins><span class="cx">     void stopDatabases(ScriptExecutionContext*, DatabaseTaskSynchronizer*);
</span><span class="cx"> 
</span><span class="cx">     String fullPathForDatabase(SecurityOrigin*, const String&amp; name, bool createIfDoesNotExist = true);
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseServercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseServer.cpp (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseServer.cpp        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseServer.cpp        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -117,6 +117,11 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void DatabaseServer::closeAllDatabases()
+{
+    DatabaseTracker::tracker().closeAllDatabases();
+}
+
</ins><span class="cx"> void DatabaseServer::interruptAllDatabasesForContext(const DatabaseContext* context)
</span><span class="cx"> {
</span><span class="cx">     DatabaseTracker::tracker().interruptAllDatabasesForContext(context);
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseServerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseServer.h (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseServer.h        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseServer.h        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -46,6 +46,8 @@
</span><span class="cx"> 
</span><span class="cx">     virtual PassRefPtr&lt;DatabaseBackendBase&gt; openDatabase(RefPtr&lt;DatabaseContext&gt;&amp;, const String&amp; name, const String&amp; expectedVersion, const String&amp; displayName, unsigned long estimatedSize, bool setVersionInNewDatabase, DatabaseError&amp;, String&amp; errorMessage, OpenAttempt);
</span><span class="cx"> 
</span><ins>+    void closeAllDatabases() override;
+
</ins><span class="cx">     virtual bool hasEntryForOrigin(SecurityOrigin*);
</span><span class="cx">     virtual void origins(Vector&lt;RefPtr&lt;SecurityOrigin&gt;&gt;&amp; result);
</span><span class="cx">     virtual bool databaseNamesForOrigin(SecurityOrigin*, Vector&lt;String&gt;&amp; result);
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseTrackercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.cpp (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.cpp        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.cpp        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -306,6 +306,24 @@
</span><span class="cx">     return maxSize;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void DatabaseTracker::closeAllDatabases()
+{
+    Vector&lt;Ref&lt;Database&gt;&gt; openDatabases;
+    {
+        MutexLocker openDatabaseMapLock(m_openDatabaseMapGuard);
+        if (!m_openDatabaseMap)
+            return;
+        for (auto&amp; nameMap : m_openDatabaseMap-&gt;values()) {
+            for (auto&amp; set : nameMap-&gt;values()) {
+                for (auto&amp; database : *set)
+                    openDatabases.append(*database);
+            }
+        }
+    }
+    for (auto&amp; database : openDatabases)
+        database-&gt;close();
+}
+
</ins><span class="cx"> void DatabaseTracker::interruptAllDatabasesForContext(const DatabaseContext* context)
</span><span class="cx"> {
</span><span class="cx">     Vector&lt;RefPtr&lt;DatabaseBackendBase&gt;&gt; openDatabases;
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseTrackerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.h (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.h        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseTracker.h        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -74,6 +74,8 @@
</span><span class="cx"> 
</span><span class="cx">     unsigned long long getMaxSizeForDatabase(const Database*);
</span><span class="cx"> 
</span><ins>+    WEBCORE_EXPORT void closeAllDatabases();
+
</ins><span class="cx">     void interruptAllDatabasesForContext(const DatabaseContext*);
</span><span class="cx"> 
</span><span class="cx"> private:
</span></span></pre></div>
<a id="trunkSourceWebKitmacChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/ChangeLog (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/ChangeLog        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebKit/mac/ChangeLog        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2015-05-11  Daniel Bates  &lt;dabates@apple.com&gt;
+
+        [iOS] Close all open databases in expiration handler of process assertion
+        https://bugs.webkit.org/show_bug.cgi?id=144661
+        &lt;rdar://problem/20845052&gt;
+
+        Reviewed by Darin Adler.
+
+        For Legacy WebKit, close all open databases when the process assertion expiration
+        handler is called.
+
+        * Storage/WebDatabaseManager.mm:
+        (+[WebDatabaseManager startBackgroundTask]): Call DatabaseTracker::tracker().closeAllDatabases()
+        in the expiration handler to close all open databases. As a side effect of closing
+        a database all in-progress database transactions are interrupted.
+
</ins><span class="cx"> 2015-05-10  Sungmann Cho  &lt;sungmann.cho@navercorp.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Get rid of the public item accessors in BackForwardClient
</span></span></pre></div>
<a id="trunkSourceWebKitmacStorageWebDatabaseManagermm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/mac/Storage/WebDatabaseManager.mm (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/mac/Storage/WebDatabaseManager.mm        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebKit/mac/Storage/WebDatabaseManager.mm        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -267,7 +267,10 @@
</span><span class="cx">     if (getTransactionBackgroundTaskIdentifier() != invalidWebBackgroundTaskIdentifier())
</span><span class="cx">         return;
</span><span class="cx">     
</span><del>-    setTransactionBackgroundTaskIdentifier(startBackgroundTask(^ { [WebDatabaseManager endBackgroundTask]; }));
</del><ins>+    setTransactionBackgroundTaskIdentifier(startBackgroundTask(^ {
+        DatabaseTracker::tracker().closeAllDatabases();
+        [WebDatabaseManager endBackgroundTask];
+    }));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> + (void)endBackgroundTask
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebKit2/ChangeLog        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -1,3 +1,80 @@
</span><ins>+2015-05-11  Daniel Bates  &lt;dabates@apple.com&gt;
+
+        [iOS] Close all open databases in expiration handler of process assertion
+        https://bugs.webkit.org/show_bug.cgi?id=144661
+        &lt;rdar://problem/20845052&gt;
+
+        Reviewed by Darin Adler.
+
+        For WebKit2, close all open databases when the process assertion expiration
+        handler is called.
+
+        When the process assertion expiration handler is called we dispatch a synchronous
+        message called ProcessWillSuspendImminently to the {Web, Network} processes to inform
+        them that they will be suspended imminently. The {Web, Network} process will always
+        service this message regardless if they were waiting for another message. In the
+        WebProcess, we will close all open databases among other tasks upon receiving this
+        message. In the NetworkProcess, we will purge some data from memory.
+
+        * NetworkProcess/NetworkProcess.cpp:
+        (WebKit::NetworkProcess::didReceiveSyncMessage): Modified to call NetworkProcess::didReceiveSyncNetworkProcessMessage()
+        to process the synchronous ProcessWillSuspendImminently message.
+        (WebKit::NetworkProcess::processWillSuspendImminently): Added; free some memory.
+        * NetworkProcess/NetworkProcess.h:
+        * NetworkProcess/NetworkProcess.messages.in: Added synchronous message ProcessWillSuspendImminently.
+        * Shared/ChildProcessProxy.h:
+        (WebKit::ChildProcessProxy::sendSync): Added parameter sendSyncFlags so that we can send
+        a sync message with flag IPC::InterruptWaitingIfSyncMessageArrives to cause the {Web, Network}Process
+        to process the message regardless of whether it is waiting for another message.
+        * UIProcess/Network/NetworkProcessProxy.cpp:
+        (WebKit::NetworkProcessProxy::sendProcessWillSuspendImminently): Added. Sends the message
+        ProcessWillSuspendImminently to the NetworkProcess.
+        * UIProcess/Network/NetworkProcessProxy.h:
+        * UIProcess/ProcessAssertion.cpp:
+        (WebKit::ProcessAndUIAssertion::setClient): Added.
+        * UIProcess/ProcessAssertion.h: Added abstract class ProcessAssertionClient.
+        (WebKit::ProcessAssertionClient::~ProcessAssertionClient): Added.
+        (WebKit::ProcessAssertion::setClient): Added.
+        (WebKit::ProcessAssertion::client): Added.
+        * UIProcess/ProcessThrottler.cpp:
+        (WebKit::ProcessThrottler::didConnectToProcess):
+        (WebKit::ProcessThrottler::assertionWillExpireImminently): Added; implements the ProcessAssertionClient
+        interface. Notify the process throttler clients that the assertion is near expiration.
+        * UIProcess/ProcessThrottler.h:
+        * UIProcess/ProcessThrottlerClient.h: Added 
+        * UIProcess/WebProcessProxy.cpp:
+        (WebKit::WebProcessProxy::sendProcessWillSuspendImminently): Added. Sends the message
+        ProcessWillSuspendImminently to the WebProcess.
+        * UIProcess/WebProcessProxy.h:
+        * UIProcess/ios/ProcessAssertionIOS.mm:
+        (-[WKProcessAssertionBackgroundTaskManager addClient:]): Added.
+        (-[WKProcessAssertionBackgroundTaskManager removeClient:]): Added.
+        (-[WKProcessAssertionBackgroundTaskManager _updateBackgroundTask]): Modified expiration handler
+        to notify ProcessAssertionClient clients that the assertion is near expiration.
+        (WebKit::ProcessAssertion::~ProcessAssertion): Remove the client on destruction.
+        (WebKit::ProcessAndUIAssertion::setClient): Added.
+        * WebProcess/WebCoreSupport/WebDatabaseManager.cpp:
+        (WebKit::WebDatabaseManager::closeAllDatabases): Added; turns around and calls DatabaseManager::closeAllDatabases().
+        * WebProcess/WebCoreSupport/WebDatabaseManager.h:
+        * WebProcess/WebProcess.cpp:
+        (WebKit::WebProcess::didReceiveSyncMessage): Call WebProcess::didReceiveSyncWebProcessMessage() to process
+        the synchronous ProcessWillSuspendImminently message. Removed logging for an unhandled synchronous message
+        since WebProcess::didReceiveSyncWebProcessMessage() will ASSERT_NOT_REACHED() for such a message.
+        (WebKit::WebProcess::prepareToSuspend): Extracted code from WebProcess::processWillSuspend() so that it can
+        be used from both WebProcess::processWillSuspend() and WebProcess::processWillSuspendImminently(). And modified
+        it to conditionally dispatch a ProcessReadyToSuspend message to the WebProcessProxy. We only want to dispatch
+        such a message as part of a coordinated suspension by the ProcessThrottler. That is, we do not want to dispatch
+        the ProcessReadyToSuspend message when the background assertion is near expiration (i.e. WebProcess::processWillSuspendImminently()
+        is called).
+        (WebKit::WebProcess::processWillSuspendImminently): Added. Suspend all open databases among other tasks.
+        (WebKit::WebProcess::processWillSuspend): Implemented in terms of WebProcess::prepareToSuspend().
+        (WebKit::WebProcess::processSuspensionCleanupTimerFired): Modified to conditionally dispatch a ProcessReadyToSuspend
+        message to the WebProcessProxy.
+        (WebKit::WebProcess::processDidResume): Stop the suspension cleanup timer, which may be active if the WebProcess
+        did not mark all its graphics layers as volatile before process suspension.
+        * WebProcess/WebProcess.h:
+        * WebProcess/WebProcess.messages.in: Added synchronous message ProcessWillSuspendImminently.
+
</ins><span class="cx"> 2015-05-10  Gyuyoung Kim  &lt;gyuyoung.kim@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Use Ref instead of PassRefPtr in WebCore/page
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkProcesscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkProcess.cpp        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -132,7 +132,10 @@
</span><span class="cx"> 
</span><span class="cx"> void NetworkProcess::didReceiveSyncMessage(IPC::Connection&amp; connection, IPC::MessageDecoder&amp; decoder, std::unique_ptr&lt;IPC::MessageEncoder&gt;&amp; replyEncoder)
</span><span class="cx"> {
</span><del>-    messageReceiverMap().dispatchSyncMessage(connection, decoder, replyEncoder);
</del><ins>+    if (messageReceiverMap().dispatchSyncMessage(connection, decoder, replyEncoder))
+        return;
+
+    didReceiveSyncNetworkProcessMessage(connection, decoder, replyEncoder);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void NetworkProcess::didClose(IPC::Connection&amp;)
</span><span class="lines">@@ -505,6 +508,12 @@
</span><span class="cx">     ChildProcess::terminate();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void NetworkProcess::processWillSuspendImminently(bool&amp; handled)
+{
+    lowMemoryHandler(true);
+    handled = true;
+}
+
</ins><span class="cx"> void NetworkProcess::processWillSuspend()
</span><span class="cx"> {
</span><span class="cx">     lowMemoryHandler(true);
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkProcessh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkProcess.h        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -78,6 +78,7 @@
</span><span class="cx">     DownloadManager&amp; downloadManager();
</span><span class="cx">     bool canHandleHTTPSServerTrustEvaluation() const { return m_canHandleHTTPSServerTrustEvaluation; }
</span><span class="cx"> 
</span><ins>+    void processWillSuspendImminently(bool&amp; handled);
</ins><span class="cx">     void processWillSuspend();
</span><span class="cx">     void cancelProcessWillSuspend();
</span><span class="cx">     void processDidResume();
</span><span class="lines">@@ -122,6 +123,7 @@
</span><span class="cx"> 
</span><span class="cx">     // Message Handlers
</span><span class="cx">     void didReceiveNetworkProcessMessage(IPC::Connection&amp;, IPC::MessageDecoder&amp;);
</span><ins>+    void didReceiveSyncNetworkProcessMessage(IPC::Connection&amp;, IPC::MessageDecoder&amp;, std::unique_ptr&lt;IPC::MessageEncoder&gt;&amp;);
</ins><span class="cx">     void initializeNetworkProcess(const NetworkProcessCreationParameters&amp;);
</span><span class="cx">     void createNetworkConnectionToWebProcess();
</span><span class="cx">     void ensurePrivateBrowsingSession(WebCore::SessionID);
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessNetworkProcessmessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/NetworkProcess.messages.in (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/NetworkProcess.messages.in        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebKit2/NetworkProcess/NetworkProcess.messages.in        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -58,6 +58,7 @@
</span><span class="cx">     ClearCacheForAllOrigins(uint32_t cachesToClear)
</span><span class="cx">     SetCacheModel(uint32_t cacheModel);
</span><span class="cx"> 
</span><ins>+    ProcessWillSuspendImminently() -&gt; (bool handled)
</ins><span class="cx">     ProcessWillSuspend()
</span><span class="cx">     CancelProcessWillSuspend()
</span><span class="cx">     ProcessDidResume()
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedChildProcessProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/ChildProcessProxy.h (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/ChildProcessProxy.h        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebKit2/Shared/ChildProcessProxy.h        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -48,7 +48,7 @@
</span><span class="cx">     void terminate();
</span><span class="cx"> 
</span><span class="cx">     template&lt;typename T&gt; bool send(T&amp;&amp; message, uint64_t destinationID, unsigned messageSendFlags = 0);
</span><del>-    template&lt;typename T&gt; bool sendSync(T&amp;&amp; message, typename T::Reply&amp;&amp;, uint64_t destinationID, std::chrono::milliseconds timeout = std::chrono::seconds(1));
</del><ins>+    template&lt;typename T&gt; bool sendSync(T&amp;&amp; message, typename T::Reply&amp;&amp;, uint64_t destinationID, std::chrono::milliseconds timeout = std::chrono::seconds(1), unsigned sendSyncFlags = 0);
</ins><span class="cx">     
</span><span class="cx">     IPC::Connection* connection() const
</span><span class="cx">     {
</span><span class="lines">@@ -105,14 +105,14 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename U&gt; 
</span><del>-bool ChildProcessProxy::sendSync(U&amp;&amp; message, typename U::Reply&amp;&amp; reply, uint64_t destinationID, std::chrono::milliseconds timeout)
</del><ins>+bool ChildProcessProxy::sendSync(U&amp;&amp; message, typename U::Reply&amp;&amp; reply, uint64_t destinationID, std::chrono::milliseconds timeout, unsigned sendSyncFlags)
</ins><span class="cx"> {
</span><span class="cx">     COMPILE_ASSERT(U::isSync, SyncMessageExpected);
</span><span class="cx"> 
</span><span class="cx">     if (!m_connection)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    return connection()-&gt;sendSync(std::forward&lt;U&gt;(message), WTF::move(reply), destinationID, timeout);
</del><ins>+    return connection()-&gt;sendSync(std::forward&lt;U&gt;(message), WTF::move(reply), destinationID, timeout, sendSyncFlags);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessNetworkNetworkProcessProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.cpp (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.cpp        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.cpp        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -313,6 +313,16 @@
</span><span class="cx">     page-&gt;logDiagnosticMessageWithValue(message, description, value, shouldSample);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void NetworkProcessProxy::sendProcessWillSuspendImminently()
+{
+    if (!canSendMessage())
+        return;
+
+    bool handled = false;
+    sendSync(Messages::NetworkProcess::ProcessWillSuspendImminently(), Messages::NetworkProcess::ProcessWillSuspendImminently::Reply(handled),
+        0, std::chrono::seconds(1), IPC::InterruptWaitingIfSyncMessageArrives);
+}
+    
</ins><span class="cx"> void NetworkProcessProxy::sendProcessWillSuspend()
</span><span class="cx"> {
</span><span class="cx">     if (canSendMessage())
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessNetworkNetworkProcessProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.h (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.h        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebKit2/UIProcess/Network/NetworkProcessProxy.h        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -69,6 +69,7 @@
</span><span class="cx">     void setProcessSuppressionEnabled(bool);
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    void sendProcessWillSuspendImminently() override;
</ins><span class="cx">     void sendProcessWillSuspend() override;
</span><span class="cx">     void sendCancelProcessWillSuspend() override;
</span><span class="cx">     void didCancelProcessSuspension();
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessProcessAssertioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ProcessAssertion.cpp (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ProcessAssertion.cpp        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebKit2/UIProcess/ProcessAssertion.cpp        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -46,7 +46,7 @@
</span><span class="cx"> 
</span><span class="cx">     m_assertionState = assertionState;
</span><span class="cx"> }
</span><del>-    
</del><ins>+
</ins><span class="cx"> ProcessAndUIAssertion::ProcessAndUIAssertion(pid_t pid, AssertionState assertionState)
</span><span class="cx">     : ProcessAssertion(pid, assertionState)
</span><span class="cx"> {
</span><span class="lines">@@ -60,7 +60,12 @@
</span><span class="cx"> {
</span><span class="cx">     ProcessAssertion::setState(assertionState);
</span><span class="cx"> }
</span><del>-    
</del><ins>+
+void ProcessAndUIAssertion::setClient(ProcessAssertionClient&amp; client)
+{
+    ProcessAssertion::setClient(client);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+}
+
</ins><span class="cx"> #endif // !PLATFORM(IOS)
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessProcessAssertionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ProcessAssertion.h (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ProcessAssertion.h        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebKit2/UIProcess/ProcessAssertion.h        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -39,27 +39,38 @@
</span><span class="cx">     Foreground
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+class ProcessAssertionClient {
+public:
+    virtual ~ProcessAssertionClient() { };
+    virtual void assertionWillExpireImminently() = 0;
+};
+
</ins><span class="cx"> class ProcessAssertion {
</span><span class="cx"> public:
</span><span class="cx">     ProcessAssertion(pid_t, AssertionState);
</span><span class="cx">     ~ProcessAssertion();
</span><span class="cx"> 
</span><ins>+    void setClient(ProcessAssertionClient&amp; client) { m_client = &amp;client; }
+    ProcessAssertionClient* client() { return m_client; }
+
</ins><span class="cx">     AssertionState state() const { return m_assertionState; }
</span><del>-    
</del><span class="cx">     void setState(AssertionState);
</span><del>-    
</del><ins>+
</ins><span class="cx"> private:
</span><span class="cx"> #if PLATFORM(IOS) &amp;&amp; !PLATFORM(IOS_SIMULATOR)
</span><span class="cx">     RetainPtr&lt;BKSProcessAssertion&gt; m_assertion;
</span><span class="cx"> #endif
</span><span class="cx">     AssertionState m_assertionState;
</span><ins>+    ProcessAssertionClient* m_client { nullptr };
</ins><span class="cx"> };
</span><span class="cx">     
</span><span class="cx"> class ProcessAndUIAssertion : public ProcessAssertion {
</span><span class="cx"> public:
</span><span class="cx">     ProcessAndUIAssertion(pid_t, AssertionState);
</span><span class="cx">     ~ProcessAndUIAssertion();
</span><del>-    
</del><ins>+
+    void setClient(ProcessAssertionClient&amp;);
+
</ins><span class="cx">     void setState(AssertionState);
</span><span class="cx"> };
</span><span class="cx">     
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessProcessThrottlercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ProcessThrottler.cpp (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ProcessThrottler.cpp        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebKit2/UIProcess/ProcessThrottler.cpp        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -88,6 +88,7 @@
</span><span class="cx"> {
</span><span class="cx">     m_suspendTimer.stop();
</span><span class="cx">     m_assertion = std::make_unique&lt;ProcessAndUIAssertion&gt;(pid, assertionState());
</span><ins>+    m_assertion-&gt;setClient(*this);
</ins><span class="cx"> }
</span><span class="cx">     
</span><span class="cx"> void ProcessThrottler::suspendTimerFired()
</span><span class="lines">@@ -109,4 +110,9 @@
</span><span class="cx">     ASSERT(m_suspendMessageCount &gt;= 0);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void ProcessThrottler::assertionWillExpireImminently()
+{
+    m_process-&gt;sendProcessWillSuspendImminently();
</ins><span class="cx"> }
</span><ins>+
+}
</ins></span></pre></div>
<a id="trunkSourceWebKit2UIProcessProcessThrottlerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ProcessThrottler.h (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ProcessThrottler.h        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebKit2/UIProcess/ProcessThrottler.h        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -41,7 +41,7 @@
</span><span class="cx"> 
</span><span class="cx"> class ProcessThrottlerClient;
</span><span class="cx"> 
</span><del>-class ProcessThrottler {
</del><ins>+class ProcessThrottler : private ProcessAssertionClient {
</ins><span class="cx"> public:
</span><span class="cx">     enum ForegroundActivityTokenType { };
</span><span class="cx">     typedef RefCounter::Token&lt;ForegroundActivityTokenType&gt; ForegroundActivityToken;
</span><span class="lines">@@ -56,13 +56,16 @@
</span><span class="cx">     void didConnectToProcess(pid_t);
</span><span class="cx">     void processReadyToSuspend();
</span><span class="cx">     void didCancelProcessSuspension();
</span><del>-    
</del><ins>+
</ins><span class="cx"> private:
</span><span class="cx">     AssertionState assertionState();
</span><span class="cx">     void updateAssertion();
</span><span class="cx">     void updateAssertionNow();
</span><span class="cx">     void suspendTimerFired();
</span><del>-    
</del><ins>+
+    // ProcessAssertionClient
+    void assertionWillExpireImminently() override;
+
</ins><span class="cx">     ProcessThrottlerClient* m_process;
</span><span class="cx">     std::unique_ptr&lt;ProcessAndUIAssertion&gt; m_assertion;
</span><span class="cx">     RunLoop::Timer&lt;ProcessThrottler&gt; m_suspendTimer;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessProcessThrottlerClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ProcessThrottlerClient.h (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ProcessThrottlerClient.h        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebKit2/UIProcess/ProcessThrottlerClient.h        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> public:
</span><span class="cx">     virtual ~ProcessThrottlerClient() { }
</span><span class="cx"> 
</span><ins>+    virtual void sendProcessWillSuspendImminently() = 0;
</ins><span class="cx">     virtual void sendProcessWillSuspend() = 0;
</span><span class="cx">     virtual void sendCancelProcessWillSuspend() = 0;
</span><span class="cx">     virtual void sendProcessDidResume() = 0;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebProcessProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebProcessProxy.cpp (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebProcessProxy.cpp        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebKit2/UIProcess/WebProcessProxy.cpp        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -889,6 +889,16 @@
</span><span class="cx">     return UserData::transform(object, Transformer());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebProcessProxy::sendProcessWillSuspendImminently()
+{
+    if (!canSendMessage())
+        return;
+
+    bool handled = false;
+    sendSync(Messages::WebProcess::ProcessWillSuspendImminently(), Messages::WebProcess::ProcessWillSuspendImminently::Reply(handled),
+        0, std::chrono::seconds(1), IPC::InterruptWaitingIfSyncMessageArrives);
+}
+
</ins><span class="cx"> void WebProcessProxy::sendProcessWillSuspend()
</span><span class="cx"> {
</span><span class="cx">     if (canSendMessage())
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessWebProcessProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/WebProcessProxy.h (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/WebProcessProxy.h        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebKit2/UIProcess/WebProcessProxy.h        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -143,6 +143,7 @@
</span><span class="cx"> 
</span><span class="cx">     void windowServerConnectionStateChanged();
</span><span class="cx"> 
</span><ins>+    void sendProcessWillSuspendImminently() override;
</ins><span class="cx">     void sendProcessWillSuspend() override;
</span><span class="cx">     void processReadyToSuspend();
</span><span class="cx">     void sendCancelProcessWillSuspend() override;
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessiosProcessAssertionIOSmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/ios/ProcessAssertionIOS.mm (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/ios/ProcessAssertionIOS.mm        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebKit2/UIProcess/ios/ProcessAssertionIOS.mm        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -30,9 +30,13 @@
</span><span class="cx"> 
</span><span class="cx"> #import &quot;BKSProcessAssertionSPI.h&quot;
</span><span class="cx"> #import &lt;UIKit/UIApplication.h&gt;
</span><ins>+#import &lt;wtf/HashSet.h&gt;
+#import &lt;wtf/Vector.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> #if !PLATFORM(IOS_SIMULATOR)
</span><span class="cx"> 
</span><ins>+using WebKit::ProcessAssertionClient;
+
</ins><span class="cx"> @interface WKProcessAssertionBackgroundTaskManager : NSObject
</span><span class="cx"> 
</span><span class="cx"> + (WKProcessAssertionBackgroundTaskManager *)shared;
</span><span class="lines">@@ -40,6 +44,9 @@
</span><span class="cx"> - (void)incrementNeedsToRunInBackgroundCount;
</span><span class="cx"> - (void)decrementNeedsToRunInBackgroundCount;
</span><span class="cx"> 
</span><ins>+- (void)addClient:(ProcessAssertionClient&amp;)client;
+- (void)removeClient:(ProcessAssertionClient&amp;)client;
+
</ins><span class="cx"> @end
</span><span class="cx"> 
</span><span class="cx"> @implementation WKProcessAssertionBackgroundTaskManager
</span><span class="lines">@@ -47,6 +54,7 @@
</span><span class="cx">     unsigned _needsToRunInBackgroundCount;
</span><span class="cx">     BOOL _appIsBackground;
</span><span class="cx">     UIBackgroundTaskIdentifier _backgroundTask;
</span><ins>+    HashSet&lt;ProcessAssertionClient*&gt; _clients;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> + (WKProcessAssertionBackgroundTaskManager *)shared
</span><span class="lines">@@ -83,6 +91,16 @@
</span><span class="cx">     [super dealloc];
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+- (void)addClient:(ProcessAssertionClient&amp;)client
+{
+    _clients.add(&amp;client);
+}
+
+- (void)removeClient:(ProcessAssertionClient&amp;)client
+{
+    _clients.remove(&amp;client);
+}
+
</ins><span class="cx"> - (void)_updateBackgroundTask
</span><span class="cx"> {
</span><span class="cx">     bool shouldHoldTask = _needsToRunInBackgroundCount &amp;&amp; _appIsBackground;
</span><span class="lines">@@ -90,6 +108,10 @@
</span><span class="cx">     if (shouldHoldTask &amp;&amp; _backgroundTask == UIBackgroundTaskInvalid) {
</span><span class="cx">         _backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithName:@&quot;com.apple.WebKit.ProcessAssertion&quot; expirationHandler:^{
</span><span class="cx">             NSLog(@&quot;Background task expired while holding WebKit ProcessAssertion.&quot;);
</span><ins>+            Vector&lt;ProcessAssertionClient*&gt; clientsToNotify;
+            copyToVector(_clients, clientsToNotify);
+            for (auto* client : clientsToNotify)
+                client-&gt;assertionWillExpireImminently();
</ins><span class="cx">             [[UIApplication sharedApplication] endBackgroundTask:_backgroundTask];
</span><span class="cx">             _backgroundTask = UIBackgroundTaskInvalid;
</span><span class="cx">         }];
</span><span class="lines">@@ -160,6 +182,8 @@
</span><span class="cx"> 
</span><span class="cx"> ProcessAssertion::~ProcessAssertion()
</span><span class="cx"> {
</span><ins>+    if (ProcessAssertionClient* client = this-&gt;client())
+        [[WKProcessAssertionBackgroundTaskManager shared] removeClient:*client];
</ins><span class="cx">     [m_assertion invalidate];
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -195,6 +219,14 @@
</span><span class="cx">     ProcessAssertion::setState(assertionState);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void ProcessAndUIAssertion::setClient(ProcessAssertionClient&amp; newClient)
+{
+    [[WKProcessAssertionBackgroundTaskManager shared] addClient:newClient];
+    if (ProcessAssertionClient* oldClient = this-&gt;client())
+        [[WKProcessAssertionBackgroundTaskManager shared] removeClient:*oldClient];
+    ProcessAssertion::setClient(newClient);
+}
+
</ins><span class="cx"> } // namespace WebKit
</span><span class="cx"> 
</span><span class="cx"> #else // PLATFORM(IOS_SIMULATOR)
</span><span class="lines">@@ -229,6 +261,11 @@
</span><span class="cx">     ProcessAssertion::setState(assertionState);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void ProcessAndUIAssertion::setClient(ProcessAssertionClient&amp; newClient)
+{
+    ProcessAssertion::setClient(newClient);
+}
+
</ins><span class="cx"> } // namespace WebKit
</span><span class="cx"> 
</span><span class="cx"> #endif // PLATFORM(IOS_SIMULATOR)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebCoreSupportWebDatabaseManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebDatabaseManager.cpp (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebDatabaseManager.cpp        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebDatabaseManager.cpp        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -142,6 +142,11 @@
</span><span class="cx">     DatabaseManager::singleton().setPauseAllDatabases(pauseAllDatabases);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebDatabaseManager::closeAllDatabases() const
+{
+    DatabaseManager::singleton().closeAllDatabases();
+}
+
</ins><span class="cx"> void WebDatabaseManager::setQuotaForOrigin(const String&amp; originIdentifier, unsigned long long quota) const
</span><span class="cx"> {
</span><span class="cx">     // If the quota is set to a value lower than the current usage, that quota will
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebCoreSupportWebDatabaseManagerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebDatabaseManager.h (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebDatabaseManager.h        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebDatabaseManager.h        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -48,6 +48,8 @@
</span><span class="cx"> 
</span><span class="cx">     void setPauseAllDatabases(bool);
</span><span class="cx"> 
</span><ins>+    void closeAllDatabases() const;
+
</ins><span class="cx"> private:
</span><span class="cx">     // WebProcessSupplement
</span><span class="cx">     virtual void initialize(const WebProcessCreationParameters&amp;) override;
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebProcesscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebProcess.cpp (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebProcess.cpp        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.cpp        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -608,7 +608,7 @@
</span><span class="cx">     if (messageReceiverMap().dispatchSyncMessage(connection, decoder, replyEncoder))
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    LOG_ERROR(&quot;Unhandled synchronous web process message '%s:%s'&quot;, decoder.messageReceiverName().toString().data(), decoder.messageName().toString().data());
</del><ins>+    didReceiveSyncWebProcessMessage(connection, decoder, replyEncoder);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void WebProcess::didReceiveMessage(IPC::Connection&amp; connection, IPC::MessageDecoder&amp; decoder)
</span><span class="lines">@@ -1217,18 +1217,33 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><del>-    
-void WebProcess::processWillSuspend()
</del><ins>+
+void WebProcess::prepareToSuspend(ShouldAcknowledgeWhenReadyToSuspend shouldAcknowledgeWhenReadyToSuspend)
</ins><span class="cx"> {
</span><span class="cx">     MemoryPressureHandler::singleton().releaseMemory(true);
</span><span class="cx">     setAllLayerTreeStatesFrozen(true);
</span><span class="cx"> 
</span><del>-    if (!markAllLayersVolatileIfPossible())
-        m_processSuspensionCleanupTimer.startRepeating(std::chrono::milliseconds(20));
-    else
-        parentProcessConnection()-&gt;send(Messages::WebProcessProxy::ProcessReadyToSuspend(), 0);
</del><ins>+    if (markAllLayersVolatileIfPossible()) {
+        if (shouldAcknowledgeWhenReadyToSuspend == ShouldAcknowledgeWhenReadyToSuspend::Yes)
+            parentProcessConnection()-&gt;send(Messages::WebProcessProxy::ProcessReadyToSuspend(), 0);
+        return;
+    }
+    m_shouldAcknowledgeWhenReadyToSuspend = shouldAcknowledgeWhenReadyToSuspend;
+    m_processSuspensionCleanupTimer.startRepeating(std::chrono::milliseconds(20));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebProcess::processWillSuspendImminently(bool&amp; handled)
+{
+    supplement&lt;WebDatabaseManager&gt;()-&gt;closeAllDatabases();
+    prepareToSuspend(ShouldAcknowledgeWhenReadyToSuspend::No);
+    handled = true;
+}
+
+void WebProcess::processWillSuspend()
+{
+    prepareToSuspend(ShouldAcknowledgeWhenReadyToSuspend::Yes);
+}
+
</ins><span class="cx"> void WebProcess::cancelProcessWillSuspend()
</span><span class="cx"> {
</span><span class="cx">     setAllLayerTreeStatesFrozen(false);
</span><span class="lines">@@ -1263,14 +1278,16 @@
</span><span class="cx"> 
</span><span class="cx"> void WebProcess::processSuspensionCleanupTimerFired()
</span><span class="cx"> {
</span><del>-    if (markAllLayersVolatileIfPossible()) {
-        m_processSuspensionCleanupTimer.stop();
</del><ins>+    if (!markAllLayersVolatileIfPossible())
+        return;
+    m_processSuspensionCleanupTimer.stop();
+    if (m_shouldAcknowledgeWhenReadyToSuspend == ShouldAcknowledgeWhenReadyToSuspend::Yes)
</ins><span class="cx">         parentProcessConnection()-&gt;send(Messages::WebProcessProxy::ProcessReadyToSuspend(), 0);
</span><del>-    }
</del><span class="cx"> }
</span><span class="cx">     
</span><span class="cx"> void WebProcess::processDidResume()
</span><span class="cx"> {
</span><ins>+    m_processSuspensionCleanupTimer.stop();
</ins><span class="cx">     setAllLayerTreeStatesFrozen(false);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebProcessh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebProcess.h (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebProcess.h        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.h        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -184,6 +184,7 @@
</span><span class="cx">     void allowSpecificHTTPSCertificateForHost(const WebCore::CertificateInfo&amp;, const String&amp; host);
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    void processWillSuspendImminently(bool&amp; handled);
</ins><span class="cx">     void processWillSuspend();
</span><span class="cx">     void cancelProcessWillSuspend();
</span><span class="cx">     bool markAllLayersVolatileIfPossible();
</span><span class="lines">@@ -282,6 +283,9 @@
</span><span class="cx">     void handleInjectedBundleMessage(const String&amp; messageName, const UserData&amp; messageBody);
</span><span class="cx">     void setInjectedBundleParameter(const String&amp; key, const IPC::DataReference&amp;);
</span><span class="cx"> 
</span><ins>+    enum class ShouldAcknowledgeWhenReadyToSuspend { No, Yes };
+    void prepareToSuspend(ShouldAcknowledgeWhenReadyToSuspend);
+
</ins><span class="cx">     // ChildProcess
</span><span class="cx">     virtual void initializeProcess(const ChildProcessInitializationParameters&amp;) override;
</span><span class="cx">     virtual void initializeProcessName(const ChildProcessInitializationParameters&amp;) override;
</span><span class="lines">@@ -307,6 +311,7 @@
</span><span class="cx"> 
</span><span class="cx">     // Implemented in generated WebProcessMessageReceiver.cpp
</span><span class="cx">     void didReceiveWebProcessMessage(IPC::Connection&amp;, IPC::MessageDecoder&amp;);
</span><ins>+    void didReceiveSyncWebProcessMessage(IPC::Connection&amp;, IPC::MessageDecoder&amp;, std::unique_ptr&lt;IPC::MessageEncoder&gt;&amp;);
</ins><span class="cx"> 
</span><span class="cx">     // WebOriginDataManagerSupplement
</span><span class="cx">     virtual void getOrigins(WKOriginDataTypes, std::function&lt;void (const Vector&lt;SecurityOriginData&gt;&amp;)&gt; completion) override;
</span><span class="lines">@@ -381,6 +386,8 @@
</span><span class="cx"> #if PLATFORM(IOS)
</span><span class="cx">     WebSQLiteDatabaseTracker m_webSQLiteDatabaseTracker;
</span><span class="cx"> #endif
</span><ins>+
+    ShouldAcknowledgeWhenReadyToSuspend m_shouldAcknowledgeWhenReadyToSuspend;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessWebProcessmessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/WebProcess.messages.in (184104 => 184105)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/WebProcess.messages.in        2015-05-11 16:26:16 UTC (rev 184104)
+++ trunk/Source/WebKit2/WebProcess/WebProcess.messages.in        2015-05-11 17:27:13 UTC (rev 184105)
</span><span class="lines">@@ -100,6 +100,7 @@
</span><span class="cx">     SetEnabledServices(bool hasImageServices, bool hasSelectionServices, bool hasRichContentServices)
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+    ProcessWillSuspendImminently() -&gt; (bool handled)
</ins><span class="cx">     ProcessWillSuspend()
</span><span class="cx">     CancelProcessWillSuspend()
</span><span class="cx">     ProcessDidResume()
</span></span></pre>
</div>
</div>

</body>
</html>