<!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>[191198] 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/191198">191198</a></dd>
<dt>Author</dt> <dd>beidson@apple.com</dd>
<dt>Date</dt> <dd>2015-10-16 13:04:13 -0700 (Fri, 16 Oct 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Source/WebCore:
Modern IDB: Handle versionchange events.
https://bugs.webkit.org/show_bug.cgi?id=150149

Reviewed by Alex Christensen.

Test: storage/indexeddb/modern/versionchange-event.html

- IDBVersionChangeEvents are now dispatched to open connections when a
  version upgrade request comes in.
- Once all of those open connections have closed, the version upgrade
  request is handled.

* Modules/indexeddb/client/IDBConnectionToServer.cpp:
(WebCore::IDBClient::IDBConnectionToServer::fireVersionChangeEvent):
(WebCore::IDBClient::IDBConnectionToServer::registerDatabaseConnection):
(WebCore::IDBClient::IDBConnectionToServer::unregisterDatabaseConnection):
* Modules/indexeddb/client/IDBConnectionToServer.h:

* Modules/indexeddb/client/IDBDatabaseImpl.cpp:
(WebCore::IDBClient::IDBDatabase::fireVersionChangeEvent):
* Modules/indexeddb/client/IDBDatabaseImpl.h:

* Modules/indexeddb/server/UniqueIDBDatabase.cpp:
(WebCore::IDBServer::UniqueIDBDatabase::UniqueIDBDatabase):
(WebCore::IDBServer::UniqueIDBDatabase::connectionClosedFromClient):
(WebCore::IDBServer::UniqueIDBDatabase::invokeTransactionScheduler):
(WebCore::IDBServer::UniqueIDBDatabase::transactionSchedulingTimerFired):
* Modules/indexeddb/server/UniqueIDBDatabase.h:

LayoutTests:
Modern IDB: Add versionchange events.
https://bugs.webkit.org/show_bug.cgi?id=150149

Reviewed by Alex Christensen.

* storage/indexeddb/modern/versionchange-event-expected.txt: Added.
* storage/indexeddb/modern/versionchange-event.html: Added.</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="#trunkSourceWebCoreModulesindexeddbclientIDBConnectionToServercpp">trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbclientIDBConnectionToServerh">trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbclientIDBDatabaseImplcpp">trunk/Source/WebCore/Modules/indexeddb/client/IDBDatabaseImpl.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbclientIDBDatabaseImplh">trunk/Source/WebCore/Modules/indexeddb/client/IDBDatabaseImpl.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverUniqueIDBDatabasecpp">trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverUniqueIDBDatabaseh">trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsstorageindexeddbmodernversionchangeeventexpectedtxt">trunk/LayoutTests/storage/indexeddb/modern/versionchange-event-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbmodernversionchangeeventhtml">trunk/LayoutTests/storage/indexeddb/modern/versionchange-event.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (191197 => 191198)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-10-16 20:02:21 UTC (rev 191197)
+++ trunk/LayoutTests/ChangeLog        2015-10-16 20:04:13 UTC (rev 191198)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2015-10-16  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        Modern IDB: Add versionchange events.
+        https://bugs.webkit.org/show_bug.cgi?id=150149
+
+        Reviewed by Alex Christensen.
+
+        * storage/indexeddb/modern/versionchange-event-expected.txt: Added.
+        * storage/indexeddb/modern/versionchange-event.html: Added.
+
</ins><span class="cx"> 2015-10-16  Zalan Bujtas  &lt;zalan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         First line box in paragraph using initial-letter overflows.
</span></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbmodernversionchangeeventexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/modern/versionchange-event-expected.txt (0 => 191198)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/modern/versionchange-event-expected.txt                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/modern/versionchange-event-expected.txt        2015-10-16 20:04:13 UTC (rev 191198)
</span><span class="lines">@@ -0,0 +1,17 @@
</span><ins>+ALERT: upgradeneeded (firstPhase): old version - 0 new version - 1
+ALERT: Version change complete (firstPhase). Database version is now - 1
+ALERT: Open success (secondPhase)
+ALERT: thirdPhase - Requested database connection with version 2
+ALERT: secondPhase connection versionchange event - old version: 1, new version: 2
+ALERT: firstPhase connection versionchange event - old version: 1, new version: 2
+ALERT: Expected upgrade needed (thirdPhase)
+ALERT: Done
+This test:
+-Opens a connection to a database at version 1, creating the database
+-Commits the version change transaction for that database
+-Opens a second connection to that database, requesting version 1
+-Opens a third connection to that database, requesting version 2
+-Makes sure the first and second connections get the versionchange event
+-Closes the first and second connections
+-Makes sure the versionchange transaction for the second connection starts successfully
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbmodernversionchangeeventhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/modern/versionchange-event.html (0 => 191198)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/modern/versionchange-event.html                                (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/modern/versionchange-event.html        2015-10-16 20:04:13 UTC (rev 191198)
</span><span class="lines">@@ -0,0 +1,110 @@
</span><ins>+This test:&lt;br&gt;
+-Opens a connection to a database at version 1, creating the database&lt;br&gt;
+-Commits the version change transaction for that database&lt;br&gt;
+-Opens a second connection to that database, requesting version 1&lt;br&gt;
+-Opens a third connection to that database, requesting version 2&lt;br&gt;
+-Makes sure the first and second connections get the versionchange event&lt;br&gt;
+-Closes the first and second connections&lt;br&gt;
+-Makes sure the versionchange transaction for the second connection starts successfully&lt;br&gt;
+&lt;script&gt;
+
+if (window.testRunner) {
+    testRunner.waitUntilDone();
+    testRunner.dumpAsText();
+}
+
+function done()
+{
+    alert(&quot;Done&quot;);
+    if (window.testRunner)
+        testRunner.notifyDone();
+}
+
+var request = window.indexedDB.open(&quot;VersionChangeTestDatabase&quot;);
+var connection1;
+var connection2;
+
+request.onsuccess = function()
+{
+    alert(&quot;Unexpected success (firstPhase)&quot;);
+        done();
+}
+request.onerror = function(e)
+{
+    alert(&quot;Unexpected error (firstPhase)&quot;);
+        done();
+}
+
+request.onupgradeneeded = function(e)
+{
+    alert(&quot;upgradeneeded (firstPhase): old version - &quot; + e.oldVersion + &quot; new version - &quot; + e.newVersion);
+    request.transaction.oncomplete = function()
+    {
+        alert(&quot;Version change complete (firstPhase). Database version is now - &quot; + request.transaction.db.version);
+        connection1 = request.transaction.db;
+        connection1.onversionchange = function(e)
+        {
+            alert(&quot;firstPhase connection versionchange event - old version: &quot; + e.oldVersion + &quot;, new version: &quot; + e.newVersion);
+            connection1.close();
+        }
+        secondPhase();
+    }
+    request.transaction.onabort = function()
+    {
+        alert(&quot;Version change transaction unexpected abort (firstPhase)&quot;);
+        done();
+    }
+    request.transaction.onerror = function()
+    {
+        alert(&quot;Version change transaction unexpected error (firstPhase)&quot;);
+        done();
+    }
+}
+
+function secondPhase()
+{
+    var request = window.indexedDB.open(&quot;VersionChangeTestDatabase&quot;, 1);
+    request.onsuccess = function()
+    {
+        alert(&quot;Open success (secondPhase)&quot;);
+        connection2 = request.result;
+        connection2.onversionchange = function(e)
+        {
+            alert(&quot;secondPhase connection versionchange event - old version: &quot; + e.oldVersion + &quot;, new version: &quot; + e.newVersion);
+            connection2.close();
+        }
+        thirdPhase();
+    }
+    request.onerror = function(e)
+    {
+        alert(&quot;Unexpected open error (secondPhase)&quot; + e);
+        done();
+    }
+    request.onupgradeneeded = function(e)
+    {
+            alert(&quot;Unexpected upgrade needed (secondPhase)&quot;);
+            done();
+    }
+}
+
+function thirdPhase()
+{
+    var request = window.indexedDB.open(&quot;VersionChangeTestDatabase&quot;, 2);
+    alert(&quot;thirdPhase - Requested database connection with version 2&quot;);
+    request.onsuccess = function()
+    {
+        alert(&quot;Unexpected open success (thirdPhase)&quot;);
+        done();
+    }
+    request.onerror = function(e)
+    {
+        alert(&quot;Unexpected open error (thirdPhase)&quot; + e);
+        done();
+    }
+    request.onupgradeneeded = function(e)
+    {
+            alert(&quot;Expected upgrade needed (thirdPhase)&quot;);
+            done();
+    }
+}
+&lt;/script&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (191197 => 191198)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-10-16 20:02:21 UTC (rev 191197)
+++ trunk/Source/WebCore/ChangeLog        2015-10-16 20:04:13 UTC (rev 191198)
</span><span class="lines">@@ -1,3 +1,34 @@
</span><ins>+2015-10-16  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        Modern IDB: Handle versionchange events.
+        https://bugs.webkit.org/show_bug.cgi?id=150149
+
+        Reviewed by Alex Christensen.
+
+        Test: storage/indexeddb/modern/versionchange-event.html
+        
+        - IDBVersionChangeEvents are now dispatched to open connections when a
+          version upgrade request comes in.
+        - Once all of those open connections have closed, the version upgrade 
+          request is handled.
+
+        * Modules/indexeddb/client/IDBConnectionToServer.cpp:
+        (WebCore::IDBClient::IDBConnectionToServer::fireVersionChangeEvent):
+        (WebCore::IDBClient::IDBConnectionToServer::registerDatabaseConnection):
+        (WebCore::IDBClient::IDBConnectionToServer::unregisterDatabaseConnection):
+        * Modules/indexeddb/client/IDBConnectionToServer.h:
+
+        * Modules/indexeddb/client/IDBDatabaseImpl.cpp:
+        (WebCore::IDBClient::IDBDatabase::fireVersionChangeEvent):
+        * Modules/indexeddb/client/IDBDatabaseImpl.h:
+
+        * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
+        (WebCore::IDBServer::UniqueIDBDatabase::UniqueIDBDatabase):
+        (WebCore::IDBServer::UniqueIDBDatabase::connectionClosedFromClient):
+        (WebCore::IDBServer::UniqueIDBDatabase::invokeTransactionScheduler):
+        (WebCore::IDBServer::UniqueIDBDatabase::transactionSchedulingTimerFired):
+        * Modules/indexeddb/server/UniqueIDBDatabase.h:
+
</ins><span class="cx"> 2015-10-16  Zalan Bujtas  &lt;zalan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         First line box in paragraph using initial-letter overflows.
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbclientIDBConnectionToServercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp (191197 => 191198)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp        2015-10-16 20:02:21 UTC (rev 191197)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp        2015-10-16 20:04:13 UTC (rev 191198)
</span><span class="lines">@@ -113,11 +113,15 @@
</span><span class="cx">     transaction-&gt;didCommit(error);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void IDBConnectionToServer::fireVersionChangeEvent(uint64_t /*databaseConnectionIdentifier*/ , uint64_t /*requestedVersion*/)
</del><ins>+void IDBConnectionToServer::fireVersionChangeEvent(uint64_t databaseConnectionIdentifier, uint64_t requestedVersion)
</ins><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::fireVersionChangeEvent&quot;);
</span><span class="cx"> 
</span><del>-    // FIXME: Implement versionchange events firing on already-open transactions.
</del><ins>+    auto connection = m_databaseConnectionMap.get(databaseConnectionIdentifier);
+    if (!connection)
+        return;
+
+    connection-&gt;fireVersionChangeEvent(requestedVersion);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBConnectionToServer::databaseConnectionClosed(IDBDatabase&amp; database)
</span><span class="lines">@@ -129,14 +133,15 @@
</span><span class="cx"> 
</span><span class="cx"> void IDBConnectionToServer::registerDatabaseConnection(IDBDatabase&amp; database)
</span><span class="cx"> {
</span><del>-    ASSERT(!m_databaseConnections.contains(&amp;database));
-    m_databaseConnections.add(&amp;database);
</del><ins>+    ASSERT(!m_databaseConnectionMap.contains(database.databaseConnectionIdentifier()));
+    m_databaseConnectionMap.set(database.databaseConnectionIdentifier(), &amp;database);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBConnectionToServer::unregisterDatabaseConnection(IDBDatabase&amp; database)
</span><span class="cx"> {
</span><del>-    ASSERT(m_databaseConnections.contains(&amp;database));
-    m_databaseConnections.remove(&amp;database);
</del><ins>+    ASSERT(m_databaseConnectionMap.contains(database.databaseConnectionIdentifier()));
+    ASSERT(m_databaseConnectionMap.get(database.databaseConnectionIdentifier()) == &amp;database);
+    m_databaseConnectionMap.remove(database.databaseConnectionIdentifier());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace IDBClient
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbclientIDBConnectionToServerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h (191197 => 191198)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h        2015-10-16 20:02:21 UTC (rev 191197)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h        2015-10-16 20:04:13 UTC (rev 191198)
</span><span class="lines">@@ -73,7 +73,7 @@
</span><span class="cx">     Ref&lt;IDBConnectionToServerDelegate&gt; m_delegate;
</span><span class="cx"> 
</span><span class="cx">     HashMap&lt;IDBResourceIdentifier, RefPtr&lt;IDBClient::IDBOpenDBRequest&gt;&gt; m_openDBRequestMap;
</span><del>-    HashSet&lt;RefPtr&lt;IDBDatabase&gt;&gt; m_databaseConnections;
</del><ins>+    HashMap&lt;uint64_t, IDBDatabase*&gt; m_databaseConnectionMap;
</ins><span class="cx">     HashMap&lt;IDBResourceIdentifier, RefPtr&lt;IDBTransaction&gt;&gt; m_committingTransactions;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbclientIDBDatabaseImplcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBDatabaseImpl.cpp (191197 => 191198)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/client/IDBDatabaseImpl.cpp        2015-10-16 20:02:21 UTC (rev 191197)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBDatabaseImpl.cpp        2015-10-16 20:04:13 UTC (rev 191198)
</span><span class="lines">@@ -28,11 +28,14 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE)
</span><span class="cx"> 
</span><ins>+#include &quot;EventQueue.h&quot;
</ins><span class="cx"> #include &quot;IDBConnectionToServer.h&quot;
</span><span class="cx"> #include &quot;IDBOpenDBRequestImpl.h&quot;
</span><span class="cx"> #include &quot;IDBResultData.h&quot;
</span><span class="cx"> #include &quot;IDBTransactionImpl.h&quot;
</span><ins>+#include &quot;IDBVersionChangeEventImpl.h&quot;
</ins><span class="cx"> #include &quot;Logging.h&quot;
</span><ins>+#include &quot;ScriptExecutionContext.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> namespace IDBClient {
</span><span class="lines">@@ -191,6 +194,19 @@
</span><span class="cx">     m_committingTransactions.remove(transaction.info().identifier());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void IDBDatabase::fireVersionChangeEvent(uint64_t requestedVersion)
+{
+    uint64_t currentVersion = m_info.version();
+    LOG(IndexedDB, &quot;IDBDatabase::fireVersionChangeEvent - current version %llu, requested version %llu&quot;, currentVersion, requestedVersion);
+
+    if (!scriptExecutionContext())
+        return;
+    
+    Ref&lt;Event&gt; event = IDBVersionChangeEvent::create(currentVersion, requestedVersion, eventNames().versionchangeEvent);
+    event-&gt;setTarget(this);
+    scriptExecutionContext()-&gt;eventQueue().enqueueEvent(adoptRef(&amp;event.leakRef()));
+}
+
</ins><span class="cx"> } // namespace IDBClient
</span><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbclientIDBDatabaseImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBDatabaseImpl.h (191197 => 191198)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/client/IDBDatabaseImpl.h        2015-10-16 20:02:21 UTC (rev 191197)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBDatabaseImpl.h        2015-10-16 20:04:13 UTC (rev 191198)
</span><span class="lines">@@ -77,6 +77,8 @@
</span><span class="cx">     void didCommitTransaction(IDBTransaction&amp;);
</span><span class="cx">     void didAbortTransaction(IDBTransaction&amp;);
</span><span class="cx"> 
</span><ins>+    void fireVersionChangeEvent(uint64_t requestedVersion);
+
</ins><span class="cx"> private:
</span><span class="cx">     IDBDatabase(ScriptExecutionContext&amp;, IDBConnectionToServer&amp;, const IDBResultData&amp;);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverUniqueIDBDatabasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp (191197 => 191198)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp        2015-10-16 20:02:21 UTC (rev 191197)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp        2015-10-16 20:04:13 UTC (rev 191198)
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx"> UniqueIDBDatabase::UniqueIDBDatabase(IDBServer&amp; server, const IDBDatabaseIdentifier&amp; identifier)
</span><span class="cx">     : m_server(server)
</span><span class="cx">     , m_identifier(identifier)
</span><ins>+    , m_transactionSchedulingTimer(*this, &amp;UniqueIDBDatabase::transactionSchedulingTimerFired)
</ins><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -266,10 +267,28 @@
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // FIXME: Now that a database connection has closed, previously blocked transactions might be runnable.
-    // Try to run them now.
</del><ins>+    // Now that a database connection has closed, previously blocked transactions might be runnable.
+    invokeTransactionScheduler();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void UniqueIDBDatabase::invokeTransactionScheduler()
+{
+    if (!m_transactionSchedulingTimer.isActive())
+        m_transactionSchedulingTimer.startOneShot(0);
+}
+
+void UniqueIDBDatabase::transactionSchedulingTimerFired()
+{
+    LOG(IndexedDB, &quot;(main) UniqueIDBDatabase::transactionSchedulingTimerFired&quot;);
+
+    if (!hasAnyOpenConnections() &amp;&amp; m_versionChangeOperation) {
+        startVersionChangeTransaction();
+        return;
+    }
+
+    // FIXME: Handle starting other pending transactions here.
+}
+
</ins><span class="cx"> void UniqueIDBDatabase::performErrorCallback(uint64_t callbackIdentifier, const IDBError&amp; error)
</span><span class="cx"> {
</span><span class="cx">     auto callback = m_errorCallbacks.take(callbackIdentifier);
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverUniqueIDBDatabaseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h (191197 => 191198)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h        2015-10-16 20:02:21 UTC (rev 191197)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h        2015-10-16 20:04:13 UTC (rev 191198)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> #include &quot;IDBDatabaseIdentifier.h&quot;
</span><span class="cx"> #include &quot;IDBDatabaseInfo.h&quot;
</span><span class="cx"> #include &quot;IDBServerOperation.h&quot;
</span><ins>+#include &quot;Timer.h&quot;
</ins><span class="cx"> #include &quot;UniqueIDBDatabaseConnection.h&quot;
</span><span class="cx"> #include &quot;UniqueIDBDatabaseTransaction.h&quot;
</span><span class="cx"> #include &lt;wtf/Deque.h&gt;
</span><span class="lines">@@ -89,6 +90,9 @@
</span><span class="cx"> 
</span><span class="cx">     void performErrorCallback(uint64_t callbackIdentifier, const IDBError&amp;);
</span><span class="cx"> 
</span><ins>+    void invokeTransactionScheduler();
+    void transactionSchedulingTimerFired();
+
</ins><span class="cx">     IDBServer&amp; m_server;
</span><span class="cx">     IDBDatabaseIdentifier m_identifier;
</span><span class="cx">     
</span><span class="lines">@@ -105,6 +109,8 @@
</span><span class="cx">     std::unique_ptr&lt;IDBDatabaseInfo&gt; m_databaseInfo;
</span><span class="cx"> 
</span><span class="cx">     HashMap&lt;uint64_t, ErrorCallback&gt; m_errorCallbacks;
</span><ins>+
+    Timer m_transactionSchedulingTimer;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace IDBServer
</span></span></pre>
</div>
</div>

</body>
</html>