<!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>[181577] trunk</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/181577">181577</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2015-03-16 13:20:27 -0700 (Mon, 16 Mar 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Make DatabaseContext suspendable if there is no pending database activity
https://bugs.webkit.org/show_bug.cgi?id=142716
&lt;rdar://problem/19923085&gt;

Reviewed by Andreas Kling.

Source/WebCore:

Make DatabaseContext suspendable if there is no pending database
activity, i.e:
- No pending Database creation JS callback
- No pending transaction(s)

Suspending is safe in this case because we are not going to interrupt
any database activity, nor fire any JS event.

This greatly increases the likelihood of pages using websql to enter
the PageCache.

Tests: fast/history/page-cache-webdatabase-no-transaction-db.html
       fast/history/page-cache-webdatabase-pending-transaction.html

* Modules/webdatabase/Database.cpp:
(WebCore::Database::hasPendingTransaction):
* Modules/webdatabase/Database.h:
* Modules/webdatabase/DatabaseContext.cpp:
(WebCore::DatabaseContext::canSuspend):
* Modules/webdatabase/DatabaseManager.cpp:
(WebCore::DatabaseManager::openDatabase):
* Modules/webdatabase/DatabaseThread.cpp:
(WebCore::DatabaseThread::hasPendingDatabaseActivity):
* Modules/webdatabase/DatabaseThread.h:

LayoutTests:

Add layout tests to check page-cacheability when WebSQL is used,
depending if there is pending database activity or not.

* fast/history/page-cache-webdatabase-no-transaction-db-expected.txt: Added.
* fast/history/page-cache-webdatabase-no-transaction-db.html: Copied from LayoutTests/fast/history/page-cache-webdatabase-opened-db.html.
* fast/history/page-cache-webdatabase-pending-transaction-expected.txt: Renamed from LayoutTests/fast/history/page-cache-webdatabase-opened-db-expected.txt.
* fast/history/page-cache-webdatabase-pending-transaction.html: Renamed from LayoutTests/fast/history/page-cache-webdatabase-opened-db.html.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabasecpp">trunk/Source/WebCore/Modules/webdatabase/Database.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseh">trunk/Source/WebCore/Modules/webdatabase/Database.h</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseContextcpp">trunk/Source/WebCore/Modules/webdatabase/DatabaseContext.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseManagercpp">trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseThreadcpp">trunk/Source/WebCore/Modules/webdatabase/DatabaseThread.cpp</a></li>
<li><a href="#trunkSourceWebCoreModuleswebdatabaseDatabaseThreadh">trunk/Source/WebCore/Modules/webdatabase/DatabaseThread.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfasthistorypagecachewebdatabasenotransactiondbexpectedtxt">trunk/LayoutTests/fast/history/page-cache-webdatabase-no-transaction-db-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfasthistorypagecachewebdatabasenotransactiondbhtml">trunk/LayoutTests/fast/history/page-cache-webdatabase-no-transaction-db.html</a></li>
<li><a href="#trunkLayoutTestsfasthistorypagecachewebdatabasependingtransactionexpectedtxt">trunk/LayoutTests/fast/history/page-cache-webdatabase-pending-transaction-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfasthistorypagecachewebdatabasependingtransactionhtml">trunk/LayoutTests/fast/history/page-cache-webdatabase-pending-transaction.html</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsfasthistorypagecachewebdatabaseopeneddbexpectedtxt">trunk/LayoutTests/fast/history/page-cache-webdatabase-opened-db-expected.txt</a></li>
<li><a href="#trunkLayoutTestsfasthistorypagecachewebdatabaseopeneddbhtml">trunk/LayoutTests/fast/history/page-cache-webdatabase-opened-db.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (181576 => 181577)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-03-16 20:06:42 UTC (rev 181576)
+++ trunk/LayoutTests/ChangeLog        2015-03-16 20:20:27 UTC (rev 181577)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2015-03-16  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        Make DatabaseContext suspendable if there is no pending database activity
+        https://bugs.webkit.org/show_bug.cgi?id=142716
+        &lt;rdar://problem/19923085&gt;
+
+        Reviewed by Andreas Kling.
+
+        Add layout tests to check page-cacheability when WebSQL is used,
+        depending if there is pending database activity or not.
+
+        * fast/history/page-cache-webdatabase-no-transaction-db-expected.txt: Added.
+        * fast/history/page-cache-webdatabase-no-transaction-db.html: Copied from LayoutTests/fast/history/page-cache-webdatabase-opened-db.html.
+        * fast/history/page-cache-webdatabase-pending-transaction-expected.txt: Renamed from LayoutTests/fast/history/page-cache-webdatabase-opened-db-expected.txt.
+        * fast/history/page-cache-webdatabase-pending-transaction.html: Renamed from LayoutTests/fast/history/page-cache-webdatabase-opened-db.html.
+
</ins><span class="cx"> 2015-03-16  Dean Jackson  &lt;dino@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Parsing and Style Resolution of Container-based Animation Triggers
</span></span></pre></div>
<a id="trunkLayoutTestsfasthistorypagecachewebdatabasenotransactiondbexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/fast/history/page-cache-webdatabase-no-transaction-db-expected.txt (0 => 181577)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/history/page-cache-webdatabase-no-transaction-db-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/history/page-cache-webdatabase-no-transaction-db-expected.txt        2015-03-16 20:20:27 UTC (rev 181577)
</span><span class="lines">@@ -0,0 +1,13 @@
</span><ins>+Tests that a page with an open WebDatabase with no pending transaction goes into the page cache.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+pageshow - not from cache
+pagehide - entering cache
+pageshow - from cache
+PASS Page did enter and was restored from the page cache
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfasthistorypagecachewebdatabasenotransactiondbhtmlfromrev181576trunkLayoutTestsfasthistorypagecachewebdatabaseopeneddbhtml"></a>
<div class="copfile"><h4>Copied: trunk/LayoutTests/fast/history/page-cache-webdatabase-no-transaction-db.html (from rev 181576, trunk/LayoutTests/fast/history/page-cache-webdatabase-opened-db.html) (0 => 181577)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/history/page-cache-webdatabase-no-transaction-db.html                                (rev 0)
+++ trunk/LayoutTests/fast/history/page-cache-webdatabase-no-transaction-db.html        2015-03-16 20:20:27 UTC (rev 181577)
</span><span class="lines">@@ -0,0 +1,42 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;body&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;script&gt;
+description('Tests that a page with an open WebDatabase with no pending transaction goes into the page cache.');
+window.jsTestIsAsync = true;
+
+if (window.testRunner) {
+    testRunner.overridePreference(&quot;WebKitUsesPageCachePreferenceKey&quot;, 1);
+    testRunner.clearAllDatabases();
+}
+
+window.addEventListener(&quot;pageshow&quot;, function(event) {
+    debug(&quot;pageshow - &quot; + (event.persisted ? &quot;&quot; : &quot;not &quot;) + &quot;from cache&quot;);
+    if (event.persisted) {
+        testPassed(&quot;Page did enter and was restored from the page cache&quot;);
+        finishJSTest();
+    }
+}, false);
+
+window.addEventListener(&quot;pagehide&quot;, function(event) {
+    debug(&quot;pagehide - &quot; + (event.persisted ? &quot;&quot; : &quot;not &quot;) + &quot;entering cache&quot;);
+    if (!event.persisted) {
+        testFailed(&quot;Page did not enter the page cache.&quot;);
+        finishJSTest();
+    }
+}, false);
+
+window.addEventListener('load', function() {
+    // Open the database.
+    var db = openDatabase(&quot;PageCacheTest&quot;, &quot;&quot;, &quot;Page Cache Test&quot;, 10, function (createdDb) {
+        setTimeout(function() {
+            window.location.href = &quot;resources/page-cache-helper.html&quot;;
+        }, 0);
+    });
+}, false);
+
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsfasthistorypagecachewebdatabaseopeneddbexpectedtxt"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/fast/history/page-cache-webdatabase-opened-db-expected.txt (181576 => 181577)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/history/page-cache-webdatabase-opened-db-expected.txt        2015-03-16 20:06:42 UTC (rev 181576)
+++ trunk/LayoutTests/fast/history/page-cache-webdatabase-opened-db-expected.txt        2015-03-16 20:20:27 UTC (rev 181577)
</span><span class="lines">@@ -1,11 +0,0 @@
</span><del>-Tests that a page with an open WebDatabase does not go into the page cache.
-
-On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
-
-
-pageshow - not from cache
-PASS Page was not restored from page cache
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
</del></span></pre></div>
<a id="trunkLayoutTestsfasthistorypagecachewebdatabaseopeneddbhtml"></a>
<div class="delfile"><h4>Deleted: trunk/LayoutTests/fast/history/page-cache-webdatabase-opened-db.html (181576 => 181577)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/history/page-cache-webdatabase-opened-db.html        2015-03-16 20:06:42 UTC (rev 181576)
+++ trunk/LayoutTests/fast/history/page-cache-webdatabase-opened-db.html        2015-03-16 20:20:27 UTC (rev 181577)
</span><span class="lines">@@ -1,48 +0,0 @@
</span><del>-&lt;!DOCTYPE html&gt;
-&lt;html&gt;
-&lt;body&gt;
-&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
-&lt;script&gt;
-description('Tests that a page with an open WebDatabase does not go into the page cache.');
-window.jsTestIsAsync = true;
-
-if (window.testRunner) {
-    testRunner.overridePreference(&quot;WebKitUsesPageCachePreferenceKey&quot;, 1);
-    testRunner.clearAllDatabases();
-}
-
-window.addEventListener(&quot;pageshow&quot;, function(event) {
-    debug(&quot;pageshow - &quot; + (event.persisted ? &quot;&quot; : &quot;not &quot;) + &quot;from cache&quot;);
-    if (!window.sessionStorage.page_cache_open_webdatabase_test_started)
-        return;
-
-    delete window.sessionStorage.page_cache_open_webdatabase_test_started;
-
-    if (event.persisted)
-        testFailed(&quot;Page did enter and was restored from the page cache&quot;);
-    else
-        testPassed(&quot;Page was not restored from page cache&quot;);
-    finishJSTest();
-}, false);
-
-window.addEventListener(&quot;pagehide&quot;, function(event) {
-    debug(&quot;pagehide - &quot; + (event.persisted ? &quot;&quot; : &quot;not &quot;) + &quot;entering cache&quot;);
-    if (event.persisted) {
-        testFailed(&quot;Page entered the page cache.&quot;);
-        finishJSTest();
-    }
-}, false);
-
-window.addEventListener('load', function() {
-    // Open the database.
-    db = openDatabase(&quot;PageCacheTest&quot;, &quot;&quot;, &quot;Page Cache Test&quot;, 10, function (createdDb) {
-        // Force a back navigation back to this page.
-        window.sessionStorage.page_cache_open_webdatabase_test_started = true;
-        window.location.href = &quot;resources/page-cache-helper.html&quot;;
-    });
-}, false);
-
-&lt;/script&gt;
-&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
-&lt;/body&gt;
-&lt;/html&gt;
</del></span></pre></div>
<a id="trunkLayoutTestsfasthistorypagecachewebdatabasependingtransactionexpectedtxtfromrev181576trunkLayoutTestsfasthistorypagecachewebdatabaseopeneddbexpectedtxt"></a>
<div class="copfile"><h4>Copied: trunk/LayoutTests/fast/history/page-cache-webdatabase-pending-transaction-expected.txt (from rev 181576, trunk/LayoutTests/fast/history/page-cache-webdatabase-opened-db-expected.txt) (0 => 181577)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/history/page-cache-webdatabase-pending-transaction-expected.txt                                (rev 0)
+++ trunk/LayoutTests/fast/history/page-cache-webdatabase-pending-transaction-expected.txt        2015-03-16 20:20:27 UTC (rev 181577)
</span><span class="lines">@@ -0,0 +1,11 @@
</span><ins>+Tests that a page with an open WebDatabase that has pending transactions does not go into the page cache.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+pageshow - not from cache
+PASS Page was not restored from page cache
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestsfasthistorypagecachewebdatabasependingtransactionhtmlfromrev181576trunkLayoutTestsfasthistorypagecachewebdatabaseopeneddbhtml"></a>
<div class="copfile"><h4>Copied: trunk/LayoutTests/fast/history/page-cache-webdatabase-pending-transaction.html (from rev 181576, trunk/LayoutTests/fast/history/page-cache-webdatabase-opened-db.html) (0 => 181577)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/fast/history/page-cache-webdatabase-pending-transaction.html                                (rev 0)
+++ trunk/LayoutTests/fast/history/page-cache-webdatabase-pending-transaction.html        2015-03-16 20:20:27 UTC (rev 181577)
</span><span class="lines">@@ -0,0 +1,60 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;body&gt;
+&lt;script src=&quot;../../resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;script&gt;
+description('Tests that a page with an open WebDatabase that has pending transactions does not go into the page cache.');
+window.jsTestIsAsync = true;
+
+if (window.testRunner) {
+    testRunner.overridePreference(&quot;WebKitUsesPageCachePreferenceKey&quot;, 1);
+    testRunner.clearAllDatabases();
+}
+
+window.addEventListener(&quot;pageshow&quot;, function(event) {
+    debug(&quot;pageshow - &quot; + (event.persisted ? &quot;&quot; : &quot;not &quot;) + &quot;from cache&quot;);
+    if (!window.sessionStorage.page_cache_open_webdatabase_test_started)
+        return;
+
+    delete window.sessionStorage.page_cache_open_webdatabase_test_started;
+
+    if (event.persisted)
+        testFailed(&quot;Page did enter and was restored from the page cache&quot;);
+    else
+        testPassed(&quot;Page was not restored from page cache&quot;);
+    finishJSTest();
+}, false);
+
+window.addEventListener(&quot;pagehide&quot;, function(event) {
+    debug(&quot;pagehide - &quot; + (event.persisted ? &quot;&quot; : &quot;not &quot;) + &quot;entering cache&quot;);
+    if (event.persisted) {
+        testFailed(&quot;Page entered the page cache.&quot;);
+        finishJSTest();
+    }
+}, false);
+
+window.addEventListener('load', function() {
+    // Open the database.
+    db = openDatabase(&quot;PageCacheTest&quot;, &quot;&quot;, &quot;Page Cache Test&quot;, 32768);
+
+    db.transaction(function(tx) {
+        // Force a back navigation back to this page.
+        window.sessionStorage.page_cache_open_webdatabase_test_started = true;
+        window.location.href = &quot;resources/page-cache-helper.html&quot;;
+
+        tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)');
+    });
+
+    db.transaction(function(tx) {
+        tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS2 (id unique, log)');
+    });
+
+    db.transaction(function(tx) {
+        tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS3 (id unique, log)');
+    });
+}, false);
+
+&lt;/script&gt;
+&lt;script src=&quot;../../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (181576 => 181577)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-03-16 20:06:42 UTC (rev 181576)
+++ trunk/Source/WebCore/ChangeLog        2015-03-16 20:20:27 UTC (rev 181577)
</span><span class="lines">@@ -1,3 +1,36 @@
</span><ins>+2015-03-16  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        Make DatabaseContext suspendable if there is no pending database activity
+        https://bugs.webkit.org/show_bug.cgi?id=142716
+        &lt;rdar://problem/19923085&gt;
+
+        Reviewed by Andreas Kling.
+
+        Make DatabaseContext suspendable if there is no pending database
+        activity, i.e:
+        - No pending Database creation JS callback
+        - No pending transaction(s)
+
+        Suspending is safe in this case because we are not going to interrupt
+        any database activity, nor fire any JS event.
+
+        This greatly increases the likelihood of pages using websql to enter
+        the PageCache.
+
+        Tests: fast/history/page-cache-webdatabase-no-transaction-db.html
+               fast/history/page-cache-webdatabase-pending-transaction.html
+
+        * Modules/webdatabase/Database.cpp:
+        (WebCore::Database::hasPendingTransaction):
+        * Modules/webdatabase/Database.h:
+        * Modules/webdatabase/DatabaseContext.cpp:
+        (WebCore::DatabaseContext::canSuspend):
+        * Modules/webdatabase/DatabaseManager.cpp:
+        (WebCore::DatabaseManager::openDatabase):
+        * Modules/webdatabase/DatabaseThread.cpp:
+        (WebCore::DatabaseThread::hasPendingDatabaseActivity):
+        * Modules/webdatabase/DatabaseThread.h:
+
</ins><span class="cx"> 2015-03-16  Brady Eidson  &lt;beidson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Addressing additional review feedback after http://trac.webkit.org/changeset/181565
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/Database.cpp (181576 => 181577)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/Database.cpp        2015-03-16 20:06:42 UTC (rev 181576)
+++ trunk/Source/WebCore/Modules/webdatabase/Database.cpp        2015-03-16 20:20:27 UTC (rev 181577)
</span><span class="lines">@@ -207,6 +207,12 @@
</span><span class="cx">     scheduleTransaction();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool Database::hasPendingTransaction()
+{
+    MutexLocker locker(m_transactionInProgressMutex);
+    return m_transactionInProgress || !m_transactionQueue.isEmpty();
+}
+
</ins><span class="cx"> SQLTransactionClient* Database::transactionClient() const
</span><span class="cx"> {
</span><span class="cx">     return databaseContext()-&gt;databaseThread()-&gt;transactionClient();
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/Database.h (181576 => 181577)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/Database.h        2015-03-16 20:06:42 UTC (rev 181576)
+++ trunk/Source/WebCore/Modules/webdatabase/Database.h        2015-03-16 20:20:27 UTC (rev 181577)
</span><span class="lines">@@ -58,6 +58,11 @@
</span><span class="cx">     void scheduleTransactionStep(SQLTransactionBackend*);
</span><span class="cx">     void inProgressTransactionCompleted();
</span><span class="cx"> 
</span><ins>+    bool hasPendingTransaction();
+
+    bool hasPendingCreationEvent() const { return m_hasPendingCreationEvent; }
+    void setHasPendingCreationEvent(bool value) { m_hasPendingCreationEvent = value; }
+
</ins><span class="cx">     SQLTransactionClient* transactionClient() const;
</span><span class="cx">     SQLTransactionCoordinator* transactionCoordinator() const;
</span><span class="cx"> 
</span><span class="lines">@@ -105,6 +110,7 @@
</span><span class="cx">     RefPtr&lt;DatabaseContext&gt; m_databaseContext;
</span><span class="cx"> 
</span><span class="cx">     bool m_deleted;
</span><ins>+    bool m_hasPendingCreationEvent { false };
</ins><span class="cx"> 
</span><span class="cx">     friend class DatabaseManager;
</span><span class="cx">     friend class DatabaseServer; // FIXME: remove this when the backend has been split out.
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseContextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseContext.cpp (181576 => 181577)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseContext.cpp        2015-03-16 20:06:42 UTC (rev 181576)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseContext.cpp        2015-03-16 20:20:27 UTC (rev 181577)
</span><span class="lines">@@ -147,7 +147,10 @@
</span><span class="cx"> 
</span><span class="cx"> bool DatabaseContext::canSuspend() const
</span><span class="cx"> {
</span><del>-    return !hasOpenDatabases();
</del><ins>+    if (!hasOpenDatabases() || !m_databaseThread)
+        return true;
+
+    return !m_databaseThread-&gt;hasPendingDatabaseActivity();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> DatabaseThread* DatabaseContext::databaseThread()
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseManagercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.cpp (181576 => 181577)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.cpp        2015-03-16 20:06:42 UTC (rev 181576)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseManager.cpp        2015-03-16 20:20:27 UTC (rev 181577)
</span><span class="lines">@@ -294,8 +294,10 @@
</span><span class="cx"> 
</span><span class="cx">     if (backend-&gt;isNew() &amp;&amp; creationCallback.get()) {
</span><span class="cx">         LOG(StorageAPI, &quot;Scheduling DatabaseCreationCallbackTask for database %p\n&quot;, database.get());
</span><ins>+        database-&gt;setHasPendingCreationEvent(true);
</ins><span class="cx">         database-&gt;m_scriptExecutionContext-&gt;postTask([creationCallback, database] (ScriptExecutionContext&amp;) {
</span><span class="cx">             creationCallback-&gt;handleEvent(database.get());
</span><ins>+            database-&gt;setHasPendingCreationEvent(false);
</ins><span class="cx">         });
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseThreadcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseThread.cpp (181576 => 181577)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseThread.cpp        2015-03-16 20:06:42 UTC (rev 181576)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseThread.cpp        2015-03-16 20:20:27 UTC (rev 181577)
</span><span class="lines">@@ -263,4 +263,14 @@
</span><span class="cx">     SameDatabasePredicate predicate(database);
</span><span class="cx">     m_queue.removeIf(predicate);
</span><span class="cx"> }
</span><ins>+
+bool DatabaseThread::hasPendingDatabaseActivity() const
+{
+    for (auto&amp; database : m_openDatabaseSet) {
+        if (database-&gt;hasPendingCreationEvent() || database-&gt;hasPendingTransaction())
+            return true;
+    }
+    return false;
+}
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreModuleswebdatabaseDatabaseThreadh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/webdatabase/DatabaseThread.h (181576 => 181577)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/webdatabase/DatabaseThread.h        2015-03-16 20:06:42 UTC (rev 181576)
+++ trunk/Source/WebCore/Modules/webdatabase/DatabaseThread.h        2015-03-16 20:20:27 UTC (rev 181577)
</span><span class="lines">@@ -57,6 +57,7 @@
</span><span class="cx">     void scheduleTask(std::unique_ptr&lt;DatabaseTask&gt;);
</span><span class="cx">     void scheduleImmediateTask(std::unique_ptr&lt;DatabaseTask&gt;); // This just adds the task to the front of the queue - the caller needs to be extremely careful not to create deadlocks when waiting for completion.
</span><span class="cx">     void unscheduleDatabaseTasks(Database*);
</span><ins>+    bool hasPendingDatabaseActivity() const;
</ins><span class="cx"> 
</span><span class="cx">     void recordDatabaseOpen(Database*);
</span><span class="cx">     void recordDatabaseClosed(Database*);
</span></span></pre>
</div>
</div>

</body>
</html>