<!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>[191114] 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/191114">191114</a></dd>
<dt>Author</dt> <dd>beidson@apple.com</dd>
<dt>Date</dt> <dd>2015-10-15 09:41:30 -0700 (Thu, 15 Oct 2015)</dd>
</dl>
<h3>Log Message</h3>
<pre>Modern IDB: Add basic transaction committing.
https://bugs.webkit.org/show_bug.cgi?id=150147
Reviewed by Alex Christensen.
Source/WebCore:
Test: storage/indexeddb/modern/opendatabase-versions.html
* Modules/indexeddb/IDBTransaction.h:
* Modules/indexeddb/IndexedDB.h:
* Modules/indexeddb/client/IDBConnectionToServer.cpp:
(WebCore::IDBClient::IDBConnectionToServer::commitTransaction):
(WebCore::IDBClient::IDBConnectionToServer::didCommitTransaction):
* Modules/indexeddb/client/IDBConnectionToServer.h:
* Modules/indexeddb/client/IDBConnectionToServerDelegate.h:
* Modules/indexeddb/client/IDBDatabaseImpl.cpp:
(WebCore::IDBClient::IDBDatabase::startVersionChangeTransaction):
(WebCore::IDBClient::IDBDatabase::commitTransaction):
(WebCore::IDBClient::IDBDatabase::didCommitTransaction):
(WebCore::IDBClient::IDBDatabase::didAbortTransaction):
(WebCore::IDBClient::IDBDatabase::didCommitOrAbortTransaction):
* Modules/indexeddb/client/IDBDatabaseImpl.h:
* Modules/indexeddb/client/IDBFactoryImpl.cpp:
(WebCore::IDBClient::IDBFactory::open):
* Modules/indexeddb/client/IDBOpenDBRequestImpl.cpp:
(WebCore::IDBClient::IDBOpenDBRequest::onSuccess):
* Modules/indexeddb/client/IDBOpenDBRequestImpl.h:
* Modules/indexeddb/client/IDBTransactionImpl.cpp:
(WebCore::IDBClient::IDBTransaction::IDBTransaction):
(WebCore::IDBClient::IDBTransaction::db):
(WebCore::IDBClient::IDBTransaction::hasPendingActivity):
(WebCore::IDBClient::IDBTransaction::isActive):
(WebCore::IDBClient::IDBTransaction::scheduleOperationTimer):
(WebCore::IDBClient::IDBTransaction::operationTimerFired):
(WebCore::IDBClient::IDBTransaction::commit):
(WebCore::IDBClient::IDBTransaction::didCommit):
(WebCore::IDBClient::IDBTransaction::fireOnComplete):
(WebCore::IDBClient::IDBTransaction::fireOnAbort):
(WebCore::IDBClient::IDBTransaction::enqueueEvent):
(WebCore::IDBClient::IDBTransaction::dispatchEvent):
* Modules/indexeddb/client/IDBTransactionImpl.h:
(WebCore::IDBClient::IDBTransaction::database):
* Modules/indexeddb/legacy/LegacyTransaction.cpp:
(WebCore::LegacyTransaction::db):
* Modules/indexeddb/legacy/LegacyTransaction.h:
* Modules/indexeddb/server/IDBConnectionToClient.cpp:
(WebCore::IDBServer::IDBConnectionToClient::didCommitTransaction):
* Modules/indexeddb/server/IDBConnectionToClient.h:
* Modules/indexeddb/server/IDBConnectionToClientDelegate.h:
* Modules/indexeddb/server/IDBServer.cpp:
(WebCore::IDBServer::IDBServer::registerTransaction):
(WebCore::IDBServer::IDBServer::unregisterTransaction):
(WebCore::IDBServer::IDBServer::commitTransaction):
* Modules/indexeddb/server/IDBServer.h:
* Modules/indexeddb/server/UniqueIDBDatabase.cpp:
(WebCore::IDBServer::generateUniqueCallbackIdentifier):
(WebCore::IDBServer::UniqueIDBDatabase::storeCallback):
(WebCore::IDBServer::UniqueIDBDatabase::commitTransaction):
(WebCore::IDBServer::UniqueIDBDatabase::performCommitTransaction):
(WebCore::IDBServer::UniqueIDBDatabase::didPerformCommitTransaction):
(WebCore::IDBServer::UniqueIDBDatabase::performErrorCallback):
(WebCore::IDBServer::UniqueIDBDatabase::startVersionChangeTransaction): Deleted.
* Modules/indexeddb/server/UniqueIDBDatabase.h:
(WebCore::IDBServer::UniqueIDBDatabase::server):
* Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp:
(WebCore::IDBServer::UniqueIDBDatabaseConnection::createVersionChangeTransaction):
(WebCore::IDBServer::UniqueIDBDatabaseConnection::didCommitTransaction):
* Modules/indexeddb/server/UniqueIDBDatabaseConnection.h:
* Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp:
(WebCore::IDBServer::UniqueIDBDatabaseTransaction::UniqueIDBDatabaseTransaction):
(WebCore::IDBServer::UniqueIDBDatabaseTransaction::~UniqueIDBDatabaseTransaction):
(WebCore::IDBServer::UniqueIDBDatabaseTransaction::commit):
* Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h:
* Modules/indexeddb/shared/IDBDatabaseInfo.h:
(WebCore::IDBDatabaseInfo::setVersion):
* Modules/indexeddb/shared/IDBError.cpp:
(WebCore::IDBError::isolatedCopy):
* Modules/indexeddb/shared/IDBError.h:
* Modules/indexeddb/shared/IDBRequestData.h:
* Modules/indexeddb/shared/IDBResourceIdentifier.cpp:
(WebCore::IDBResourceIdentifier::isolatedCopy):
* Modules/indexeddb/shared/IDBResourceIdentifier.h:
* Modules/indexeddb/shared/InProcessIDBServer.cpp:
(WebCore::InProcessIDBServer::didCommitTransaction):
(WebCore::InProcessIDBServer::commitTransaction):
* Modules/indexeddb/shared/InProcessIDBServer.h:
* WebCore.xcodeproj/project.pbxproj:
* platform/CrossThreadCopier.cpp:
(WebCore::IDBResourceIdentifier>::copy):
(WebCore::IDBError>::copy):
* platform/CrossThreadCopier.h:
LayoutTests:
* storage/indexeddb/modern/opendatabase-versions-expected.txt: Added.
* storage/indexeddb/modern/opendatabase-versions.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="#trunkSourceWebCoreModulesindexeddbIDBTransactionh">trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbIndexedDBh">trunk/Source/WebCore/Modules/indexeddb/IndexedDB.h</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="#trunkSourceWebCoreModulesindexeddbclientIDBConnectionToServerDelegateh">trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServerDelegate.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="#trunkSourceWebCoreModulesindexeddbclientIDBFactoryImplcpp">trunk/Source/WebCore/Modules/indexeddb/client/IDBFactoryImpl.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbclientIDBOpenDBRequestImplcpp">trunk/Source/WebCore/Modules/indexeddb/client/IDBOpenDBRequestImpl.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbclientIDBOpenDBRequestImplh">trunk/Source/WebCore/Modules/indexeddb/client/IDBOpenDBRequestImpl.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbclientIDBTransactionImplcpp">trunk/Source/WebCore/Modules/indexeddb/client/IDBTransactionImpl.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbclientIDBTransactionImplh">trunk/Source/WebCore/Modules/indexeddb/client/IDBTransactionImpl.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddblegacyLegacyTransactioncpp">trunk/Source/WebCore/Modules/indexeddb/legacy/LegacyTransaction.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddblegacyLegacyTransactionh">trunk/Source/WebCore/Modules/indexeddb/legacy/LegacyTransaction.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverIDBConnectionToClientcpp">trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverIDBConnectionToClienth">trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverIDBConnectionToClientDelegateh">trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClientDelegate.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverIDBServercpp">trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverIDBServerh">trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.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>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverUniqueIDBDatabaseConnectioncpp">trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverUniqueIDBDatabaseConnectionh">trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverUniqueIDBDatabaseTransactioncpp">trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbserverUniqueIDBDatabaseTransactionh">trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbsharedIDBDatabaseInfoh">trunk/Source/WebCore/Modules/indexeddb/shared/IDBDatabaseInfo.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbsharedIDBErrorcpp">trunk/Source/WebCore/Modules/indexeddb/shared/IDBError.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbsharedIDBErrorh">trunk/Source/WebCore/Modules/indexeddb/shared/IDBError.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbsharedIDBRequestDatah">trunk/Source/WebCore/Modules/indexeddb/shared/IDBRequestData.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbsharedIDBResourceIdentifiercpp">trunk/Source/WebCore/Modules/indexeddb/shared/IDBResourceIdentifier.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbsharedIDBResourceIdentifierh">trunk/Source/WebCore/Modules/indexeddb/shared/IDBResourceIdentifier.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbsharedInProcessIDBServercpp">trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbsharedInProcessIDBServerh">trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.h</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCoreplatformCrossThreadCopiercpp">trunk/Source/WebCore/platform/CrossThreadCopier.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformCrossThreadCopierh">trunk/Source/WebCore/platform/CrossThreadCopier.h</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsstorageindexeddbmodernopendatabaseversionsexpectedtxt">trunk/LayoutTests/storage/indexeddb/modern/opendatabase-versions-expected.txt</a></li>
<li><a href="#trunkLayoutTestsstorageindexeddbmodernopendatabaseversionshtml">trunk/LayoutTests/storage/indexeddb/modern/opendatabase-versions.html</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/LayoutTests/ChangeLog        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2015-10-14 Brady Eidson <beidson@apple.com>
+
+ Modern IDB: Add basic transaction committing.
+ https://bugs.webkit.org/show_bug.cgi?id=150147
+
+ Reviewed by Alex Christensen.
+
+ * storage/indexeddb/modern/opendatabase-versions-expected.txt: Added.
+ * storage/indexeddb/modern/opendatabase-versions.html: Added.
+
</ins><span class="cx"> 2015-10-15 Daniel Bates <dabates@apple.com>
</span><span class="cx">
</span><span class="cx"> [iOS] DOM click event may not be dispatched when page has :active style and <input type="search">
</span></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbmodernopendatabaseversionsexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/modern/opendatabase-versions-expected.txt (0 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/modern/opendatabase-versions-expected.txt         (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/modern/opendatabase-versions-expected.txt        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+ALERT: [object IDBOpenDBRequest] (firstPhase)
+ALERT: upgradeneeded (firstPhase): old version - 0 new version - 1
+ALERT: [object IDBTransaction]
+ALERT: Version change complete (firstPhase). Database version is now - 1
+ALERT: [object IDBOpenDBRequest] (secondPhase)
+ALERT: Successfully opened database at version 1 (secondPhase)
+ALERT: Done
+This test creates a new database with the default version, commits that versionchange transaction, and then reopens it at different versions to make sure the IDBOpenDBRequests behave appropriately.
+
</ins></span></pre></div>
<a id="trunkLayoutTestsstorageindexeddbmodernopendatabaseversionshtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/storage/indexeddb/modern/opendatabase-versions.html (0 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/storage/indexeddb/modern/opendatabase-versions.html         (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/modern/opendatabase-versions.html        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -0,0 +1,122 @@
</span><ins>+This test creates a new database with the default version, commits that versionchange transaction, and then reopens it at different versions to make sure the IDBOpenDBRequests behave appropriately.<br>
+<script>
+
+if (window.testRunner) {
+ testRunner.waitUntilDone();
+ testRunner.dumpAsText();
+}
+
+function done()
+{
+ alert("Done");
+ if (window.testRunner)
+ testRunner.notifyDone();
+}
+
+var request = window.indexedDB.open("VersionTestDatabase");
+alert(request + " (firstPhase)");
+
+request.onsuccess = function()
+{
+ alert("Unexpected success (firstPhase)");
+        done();
+}
+request.onerror = function(e)
+{
+ alert("Unexpected error (firstPhase)");
+        done();
+}
+
+request.onupgradeneeded = function(e)
+{
+ alert("upgradeneeded (firstPhase): old version - " + e.oldVersion + " new version - " + e.newVersion);
+ alert(request.transaction);
+ request.transaction.oncomplete = function()
+ {
+ alert("Version change complete (firstPhase). Database version is now - " + request.transaction.db.version);
+ secondPhase();
+ }
+ request.transaction.onabort = function()
+ {
+ alert("Version change transaction unexpected abort! (firstPhase)");
+ done();
+ }
+ request.transaction.onerror = function()
+ {
+ alert("Version change transaction unexpected error! (firstPhase)");
+ done();
+ }
+}
+
+function secondPhase()
+{
+ var request = window.indexedDB.open("VersionTestDatabase", 1);
+ alert(request + " (secondPhase)");
+ request.onsuccess = function()
+ {
+ alert("Successfully opened database at version 1 (secondPhase)");
+
+ // FIXME: The following call will be used once bugs 150147-150150 are resolved.
+ // thirdPhase();
+ done();
+ }
+ request.onerror = function(e)
+ {
+ alert("Unexpected error (secondPhase)" + e);
+ done();
+ }
+ request.onupgradeneeded = function(e)
+ {
+         alert("Unexpected upgrade needed (secondPhase)" + e);
+         done();
+ }
+}
+
+function thirdPhase()
+{
+ var request = window.indexedDB.open("VersionTestDatabase", 2);
+ alert(request + " (thirdPhase)");
+ request.onsuccess = function()
+ {
+ alert("Unexpected success (thirdPhase)");
+ done();
+ }
+ request.onerror = function(e)
+ {
+ alert("Unexpected error (thirdPhase)");
+ done();
+ }
+ request.onupgradeneeded = function(e)
+ {
+ alert("upgradeneeded (thirdPhase): old version - " + e.oldVersion + " new version - " + e.newVersion);
+ alert(request.transaction);
+ request.transaction.oncomplete = function()
+ {
+ alert("Version change complete (thirdPhase). Database version is now - " + request.transaction.db.version);
+ fourthPhase();
+ }
+ request.transaction.onabort = function()
+ {
+ alert("Version change transaction unexpected abort! (thirdPhase)");
+ done();
+ }
+ request.transaction.onerror = function()
+ {
+ alert("Version change transaction unexpected error! (thirdPhase)");
+ done();
+ }
+ }
+}
+
+function fourthPhase()
+{
+ try {
+ // We've upgraded to version 2, so version 1 should not be openable.
+ window.indexedDB.open("VersionTestDatabase", 1);
+ } catch (e) {
+ alert("Caught exception " + e);
+ }
+ done();
+}
+
+</script>
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/ChangeLog        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -1,3 +1,115 @@
</span><ins>+2015-10-14 Brady Eidson <beidson@apple.com>
+
+ Modern IDB: Add basic transaction committing.
+ https://bugs.webkit.org/show_bug.cgi?id=150147
+
+ Reviewed by Alex Christensen.
+
+ Test: storage/indexeddb/modern/opendatabase-versions.html
+
+ * Modules/indexeddb/IDBTransaction.h:
+
+ * Modules/indexeddb/IndexedDB.h:
+
+ * Modules/indexeddb/client/IDBConnectionToServer.cpp:
+ (WebCore::IDBClient::IDBConnectionToServer::commitTransaction):
+ (WebCore::IDBClient::IDBConnectionToServer::didCommitTransaction):
+ * Modules/indexeddb/client/IDBConnectionToServer.h:
+ * Modules/indexeddb/client/IDBConnectionToServerDelegate.h:
+
+ * Modules/indexeddb/client/IDBDatabaseImpl.cpp:
+ (WebCore::IDBClient::IDBDatabase::startVersionChangeTransaction):
+ (WebCore::IDBClient::IDBDatabase::commitTransaction):
+ (WebCore::IDBClient::IDBDatabase::didCommitTransaction):
+ (WebCore::IDBClient::IDBDatabase::didAbortTransaction):
+ (WebCore::IDBClient::IDBDatabase::didCommitOrAbortTransaction):
+ * Modules/indexeddb/client/IDBDatabaseImpl.h:
+
+ * Modules/indexeddb/client/IDBFactoryImpl.cpp:
+ (WebCore::IDBClient::IDBFactory::open):
+
+ * Modules/indexeddb/client/IDBOpenDBRequestImpl.cpp:
+ (WebCore::IDBClient::IDBOpenDBRequest::onSuccess):
+ * Modules/indexeddb/client/IDBOpenDBRequestImpl.h:
+
+ * Modules/indexeddb/client/IDBTransactionImpl.cpp:
+ (WebCore::IDBClient::IDBTransaction::IDBTransaction):
+ (WebCore::IDBClient::IDBTransaction::db):
+ (WebCore::IDBClient::IDBTransaction::hasPendingActivity):
+ (WebCore::IDBClient::IDBTransaction::isActive):
+ (WebCore::IDBClient::IDBTransaction::scheduleOperationTimer):
+ (WebCore::IDBClient::IDBTransaction::operationTimerFired):
+ (WebCore::IDBClient::IDBTransaction::commit):
+ (WebCore::IDBClient::IDBTransaction::didCommit):
+ (WebCore::IDBClient::IDBTransaction::fireOnComplete):
+ (WebCore::IDBClient::IDBTransaction::fireOnAbort):
+ (WebCore::IDBClient::IDBTransaction::enqueueEvent):
+ (WebCore::IDBClient::IDBTransaction::dispatchEvent):
+ * Modules/indexeddb/client/IDBTransactionImpl.h:
+ (WebCore::IDBClient::IDBTransaction::database):
+
+ * Modules/indexeddb/legacy/LegacyTransaction.cpp:
+ (WebCore::LegacyTransaction::db):
+ * Modules/indexeddb/legacy/LegacyTransaction.h:
+
+ * Modules/indexeddb/server/IDBConnectionToClient.cpp:
+ (WebCore::IDBServer::IDBConnectionToClient::didCommitTransaction):
+ * Modules/indexeddb/server/IDBConnectionToClient.h:
+ * Modules/indexeddb/server/IDBConnectionToClientDelegate.h:
+
+ * Modules/indexeddb/server/IDBServer.cpp:
+ (WebCore::IDBServer::IDBServer::registerTransaction):
+ (WebCore::IDBServer::IDBServer::unregisterTransaction):
+ (WebCore::IDBServer::IDBServer::commitTransaction):
+ * Modules/indexeddb/server/IDBServer.h:
+
+ * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
+ (WebCore::IDBServer::generateUniqueCallbackIdentifier):
+ (WebCore::IDBServer::UniqueIDBDatabase::storeCallback):
+ (WebCore::IDBServer::UniqueIDBDatabase::commitTransaction):
+ (WebCore::IDBServer::UniqueIDBDatabase::performCommitTransaction):
+ (WebCore::IDBServer::UniqueIDBDatabase::didPerformCommitTransaction):
+ (WebCore::IDBServer::UniqueIDBDatabase::performErrorCallback):
+ (WebCore::IDBServer::UniqueIDBDatabase::startVersionChangeTransaction): Deleted.
+ * Modules/indexeddb/server/UniqueIDBDatabase.h:
+ (WebCore::IDBServer::UniqueIDBDatabase::server):
+
+ * Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp:
+ (WebCore::IDBServer::UniqueIDBDatabaseConnection::createVersionChangeTransaction):
+ (WebCore::IDBServer::UniqueIDBDatabaseConnection::didCommitTransaction):
+ * Modules/indexeddb/server/UniqueIDBDatabaseConnection.h:
+
+ * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp:
+ (WebCore::IDBServer::UniqueIDBDatabaseTransaction::UniqueIDBDatabaseTransaction):
+ (WebCore::IDBServer::UniqueIDBDatabaseTransaction::~UniqueIDBDatabaseTransaction):
+ (WebCore::IDBServer::UniqueIDBDatabaseTransaction::commit):
+ * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h:
+
+ * Modules/indexeddb/shared/IDBDatabaseInfo.h:
+ (WebCore::IDBDatabaseInfo::setVersion):
+
+ * Modules/indexeddb/shared/IDBError.cpp:
+ (WebCore::IDBError::isolatedCopy):
+ * Modules/indexeddb/shared/IDBError.h:
+
+ * Modules/indexeddb/shared/IDBRequestData.h:
+
+ * Modules/indexeddb/shared/IDBResourceIdentifier.cpp:
+ (WebCore::IDBResourceIdentifier::isolatedCopy):
+ * Modules/indexeddb/shared/IDBResourceIdentifier.h:
+
+ * Modules/indexeddb/shared/InProcessIDBServer.cpp:
+ (WebCore::InProcessIDBServer::didCommitTransaction):
+ (WebCore::InProcessIDBServer::commitTransaction):
+ * Modules/indexeddb/shared/InProcessIDBServer.h:
+
+ * WebCore.xcodeproj/project.pbxproj:
+
+ * platform/CrossThreadCopier.cpp:
+ (WebCore::IDBResourceIdentifier>::copy):
+ (WebCore::IDBError>::copy):
+ * platform/CrossThreadCopier.h:
+
</ins><span class="cx"> 2015-10-15 Daniel Bates <dabates@apple.com>
</span><span class="cx">
</span><span class="cx"> [iOS] DOM click event may not be dispatched when page has :active style and <input type="search">
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbIDBTransactionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.h (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.h        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.h        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -61,7 +61,7 @@
</span><span class="cx">
</span><span class="cx"> // Implement the IDBTransaction IDL
</span><span class="cx"> virtual const String& mode() const = 0;
</span><del>- virtual IDBDatabase* db() const = 0;
</del><ins>+ virtual IDBDatabase* db() = 0;
</ins><span class="cx"> virtual RefPtr<DOMError> error() const = 0;
</span><span class="cx"> virtual RefPtr<IDBObjectStore> objectStore(const String& name, ExceptionCode&) = 0;
</span><span class="cx"> virtual void abort(ExceptionCode&) = 0;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbIndexedDBh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/IndexedDB.h (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/IndexedDB.h        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/IndexedDB.h        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -39,6 +39,13 @@
</span><span class="cx"> };
</span><span class="cx"> const unsigned TransactionModeMaximum = 2;
</span><span class="cx">
</span><ins>+enum class TransactionState {
+ Unstarted,
+ Running,
+ Committing,
+ Finished,
+};
+
</ins><span class="cx"> enum class CursorDirection {
</span><span class="cx"> Next = 0,
</span><span class="cx"> NextNoDuplicate = 1,
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbclientIDBConnectionToServercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -93,6 +93,26 @@
</span><span class="cx"> request->requestCompleted(resultData);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void IDBConnectionToServer::commitTransaction(IDBTransaction& transaction)
+{
+ LOG(IndexedDB, "IDBConnectionToServer::commitTransaction");
+ ASSERT(!m_committingTransactions.contains(transaction.info().identifier()));
+ m_committingTransactions.set(transaction.info().identifier(), &transaction);
+
+ auto identifier = transaction.info().identifier();
+ m_delegate->commitTransaction(identifier);
+}
+
+void IDBConnectionToServer::didCommitTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError& error)
+{
+ LOG(IndexedDB, "IDBConnectionToServer::didCommitTransaction");
+
+ auto transaction = m_committingTransactions.take(transactionIdentifier);
+ ASSERT(transaction);
+
+ transaction->didCommit(error);
+}
+
</ins><span class="cx"> void IDBConnectionToServer::fireVersionChangeEvent(uint64_t /*databaseConnectionIdentifier*/ , uint64_t /*requestedVersion*/)
</span><span class="cx"> {
</span><span class="cx"> LOG(IndexedDB, "IDBConnectionToServer::fireVersionChangeEvent");
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbclientIDBConnectionToServerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -37,12 +37,14 @@
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><ins>+class IDBError;
</ins><span class="cx"> class IDBResultData;
</span><span class="cx">
</span><span class="cx"> namespace IDBClient {
</span><span class="cx">
</span><span class="cx"> class IDBDatabase;
</span><span class="cx"> class IDBOpenDBRequest;
</span><ins>+class IDBTransaction;
</ins><span class="cx">
</span><span class="cx"> class IDBConnectionToServer : public RefCounted<IDBConnectionToServer> {
</span><span class="cx"> public:
</span><span class="lines">@@ -56,6 +58,9 @@
</span><span class="cx"> void openDatabase(IDBOpenDBRequest&);
</span><span class="cx"> void didOpenDatabase(const IDBResultData&);
</span><span class="cx">
</span><ins>+ void commitTransaction(IDBTransaction&);
+ void didCommitTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&);
+
</ins><span class="cx"> void fireVersionChangeEvent(uint64_t databaseConnectionIdentifier, uint64_t requestedVersion);
</span><span class="cx">
</span><span class="cx"> void registerDatabaseConnection(IDBDatabase&);
</span><span class="lines">@@ -68,6 +73,7 @@
</span><span class="cx">
</span><span class="cx"> HashMap<IDBResourceIdentifier, RefPtr<IDBClient::IDBOpenDBRequest>> m_openDBRequestMap;
</span><span class="cx"> HashSet<RefPtr<IDBDatabase>> m_databaseConnections;
</span><ins>+ HashMap<IDBResourceIdentifier, RefPtr<IDBTransaction>> m_committingTransactions;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace IDBClient
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbclientIDBConnectionToServerDelegateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServerDelegate.h (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServerDelegate.h        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServerDelegate.h        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><span class="cx"> class IDBRequestData;
</span><ins>+class IDBResourceIdentifier;
</ins><span class="cx">
</span><span class="cx"> namespace IDBClient {
</span><span class="cx">
</span><span class="lines">@@ -41,6 +42,7 @@
</span><span class="cx"> virtual uint64_t identifier() const = 0;
</span><span class="cx"> virtual void deleteDatabase(IDBRequestData&) = 0;
</span><span class="cx"> virtual void openDatabase(IDBRequestData&) = 0;
</span><ins>+ virtual void commitTransaction(IDBResourceIdentifier&) = 0;
</ins><span class="cx">
</span><span class="cx"> virtual void ref() = 0;
</span><span class="cx"> virtual void deref() = 0;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbclientIDBDatabaseImplcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBDatabaseImpl.cpp (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/client/IDBDatabaseImpl.cpp        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBDatabaseImpl.cpp        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -128,11 +128,52 @@
</span><span class="cx">
</span><span class="cx"> Ref<IDBTransaction> transaction = IDBTransaction::create(*this, info);
</span><span class="cx"> m_versionChangeTransaction = &transaction.get();
</span><ins>+
</ins><span class="cx"> m_activeTransactions.set(transaction->info().identifier(), &transaction.get());
</span><span class="cx">
</span><span class="cx"> return WTF::move(transaction);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void IDBDatabase::commitTransaction(IDBTransaction& transaction)
+{
+ LOG(IndexedDB, "IDBDatabase::commitTransaction");
+
+ auto refTransaction = m_activeTransactions.take(transaction.info().identifier());
+ ASSERT(refTransaction);
+ m_committingTransactions.set(transaction.info().identifier(), WTF::move(refTransaction));
+
+ m_connection->commitTransaction(transaction);
+}
+
+void IDBDatabase::didCommitTransaction(IDBTransaction& transaction)
+{
+ LOG(IndexedDB, "IDBDatabase::didCommitTransaction");
+
+ if (m_versionChangeTransaction == &transaction)
+ m_info.setVersion(transaction.info().newVersion());
+
+ didCommitOrAbortTransaction(transaction);
+}
+
+void IDBDatabase::didAbortTransaction(IDBTransaction& transaction)
+{
+ LOG(IndexedDB, "IDBDatabase::didAbortTransaction");
+ didCommitOrAbortTransaction(transaction);
+}
+
+void IDBDatabase::didCommitOrAbortTransaction(IDBTransaction& transaction)
+{
+ LOG(IndexedDB, "IDBDatabase::didCommitOrAbortTransaction");
+
+ if (m_versionChangeTransaction == &transaction)
+ m_versionChangeTransaction = nullptr;
+
+ ASSERT(m_activeTransactions.contains(transaction.info().identifier()) || m_committingTransactions.contains(transaction.info().identifier()));
+
+ m_activeTransactions.remove(transaction.info().identifier());
+ m_committingTransactions.remove(transaction.info().identifier());
+}
+
</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 (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/client/IDBDatabaseImpl.h        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBDatabaseImpl.h        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -72,15 +72,21 @@
</span><span class="cx"> const IDBDatabaseInfo& info() const { return m_info; }
</span><span class="cx">
</span><span class="cx"> Ref<IDBTransaction> startVersionChangeTransaction(const IDBTransactionInfo&);
</span><ins>+ void commitTransaction(IDBTransaction&);
+ void didCommitTransaction(IDBTransaction&);
+ void didAbortTransaction(IDBTransaction&);
</ins><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> IDBDatabase(ScriptExecutionContext&, IDBConnectionToServer&, const IDBResultData&);
</span><span class="cx">
</span><ins>+ void didCommitOrAbortTransaction(IDBTransaction&);
+
</ins><span class="cx"> Ref<IDBConnectionToServer> m_connection;
</span><span class="cx"> IDBDatabaseInfo m_info;
</span><span class="cx">
</span><span class="cx"> RefPtr<IDBTransaction> m_versionChangeTransaction;
</span><span class="cx"> HashMap<IDBResourceIdentifier, RefPtr<IDBTransaction>> m_activeTransactions;
</span><ins>+ HashMap<IDBResourceIdentifier, RefPtr<IDBTransaction>> m_committingTransactions;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace IDBClient
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbclientIDBFactoryImplcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBFactoryImpl.cpp (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/client/IDBFactoryImpl.cpp        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBFactoryImpl.cpp        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -91,7 +91,7 @@
</span><span class="cx"> return nullptr;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- return openInternal(context, name, 0, ec).release();
</del><ins>+ return openInternal(context, name, version, ec).release();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> RefPtr<IDBOpenDBRequest> IDBFactory::openInternal(ScriptExecutionContext* context, const String& name, unsigned long long version, ExceptionCode& ec)
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbclientIDBOpenDBRequestImplcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBOpenDBRequestImpl.cpp (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/client/IDBOpenDBRequestImpl.cpp        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBOpenDBRequestImpl.cpp        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -62,16 +62,24 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><del>-
</del><span class="cx"> void IDBOpenDBRequest::onError(const IDBResultData& data)
</span><span class="cx"> {
</span><span class="cx"> m_domError = DOMError::create(data.error().name());
</span><span class="cx"> enqueueEvent(Event::create(eventNames().errorEvent, true, true));
</span><span class="cx"> }
</span><span class="cx">
</span><del>-void IDBOpenDBRequest::onSuccess(const IDBResultData&)
</del><ins>+void IDBOpenDBRequest::onSuccess(const IDBResultData& resultData)
</ins><span class="cx"> {
</span><del>- // FIXME: Implement
</del><ins>+ LOG(IndexedDB, "IDBOpenDBRequest::onSuccess()");
+
+ if (!scriptExecutionContext())
+ return;
+
+ Ref<IDBDatabase> database = IDBDatabase::create(*scriptExecutionContext(), connection(), resultData);
+ m_result = IDBAny::create(WTF::move(database));
+ m_readyState = IDBRequestReadyState::Done;
+
+ enqueueEvent(Event::create(eventNames().successEvent, false, false));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void IDBOpenDBRequest::onUpgradeNeeded(const IDBResultData& resultData)
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbclientIDBOpenDBRequestImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBOpenDBRequestImpl.h (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/client/IDBOpenDBRequestImpl.h        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBOpenDBRequestImpl.h        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -60,7 +60,7 @@
</span><span class="cx"> void onUpgradeNeeded(const IDBResultData&);
</span><span class="cx">
</span><span class="cx"> IDBDatabaseIdentifier m_databaseIdentifier;
</span><del>- uint64_t m_version;
</del><ins>+ uint64_t m_version { 0 };
</ins><span class="cx"> RefPtr<DOMError> m_domError;
</span><span class="cx"> };
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbclientIDBTransactionImplcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBTransactionImpl.cpp (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/client/IDBTransactionImpl.cpp        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBTransactionImpl.cpp        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -29,8 +29,12 @@
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE)
</span><span class="cx">
</span><span class="cx"> #include "DOMError.h"
</span><ins>+#include "EventQueue.h"
</ins><span class="cx"> #include "IDBDatabaseImpl.h"
</span><ins>+#include "IDBEventDispatcher.h"
</ins><span class="cx"> #include "IDBObjectStore.h"
</span><ins>+#include "Logging.h"
+#include "ScriptExecutionContext.h"
</ins><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> namespace IDBClient {
</span><span class="lines">@@ -42,9 +46,14 @@
</span><span class="cx">
</span><span class="cx"> IDBTransaction::IDBTransaction(IDBDatabase& database, const IDBTransactionInfo& info)
</span><span class="cx"> : WebCore::IDBTransaction(database.scriptExecutionContext())
</span><ins>+ , m_database(database)
</ins><span class="cx"> , m_info(info)
</span><ins>+ , m_operationTimer(*this, &IDBTransaction::operationTimerFired)
+
</ins><span class="cx"> {
</span><span class="cx"> suspendIfNeeded();
</span><ins>+ scheduleOperationTimer();
+ m_state = IndexedDB::TransactionState::Running;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> IDBTransaction::~IDBTransaction()
</span><span class="lines">@@ -65,10 +74,9 @@
</span><span class="cx"> RELEASE_ASSERT_NOT_REACHED();
</span><span class="cx"> }
</span><span class="cx">
</span><del>-WebCore::IDBDatabase* IDBTransaction::db() const
</del><ins>+WebCore::IDBDatabase* IDBTransaction::db()
</ins><span class="cx"> {
</span><del>- ASSERT_NOT_REACHED();
- return nullptr;
</del><ins>+ return &m_database.get();
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> RefPtr<DOMError> IDBTransaction::error() const
</span><span class="lines">@@ -98,6 +106,107 @@
</span><span class="cx"> return false;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+bool IDBTransaction::hasPendingActivity() const
+{
+ return m_state != IndexedDB::TransactionState::Finished;
+}
+
+bool IDBTransaction::isActive() const
+{
+ return m_state == IndexedDB::TransactionState::Running;
+}
+
+void IDBTransaction::scheduleOperationTimer()
+{
+ if (!m_operationTimer.isActive())
+ m_operationTimer.startOneShot(0);
+}
+
+void IDBTransaction::operationTimerFired()
+{
+ LOG(IndexedDB, "IDBTransaction::operationTimerFired");
+
+ if (m_state == IndexedDB::TransactionState::Unstarted)
+ return;
+
+ // FIXME: Once transactions can do things, like configure the database or insert data into it,
+ // those operations will be handled here, and will prevent the transaction from committing
+ // as long as outstanding operations exist.
+
+ if (isActive())
+ commit();
+}
+
+void IDBTransaction::commit()
+{
+ LOG(IndexedDB, "IDBTransaction::commit");
+
+ if (m_state != IndexedDB::TransactionState::Running) {
+ m_state = IndexedDB::TransactionState::Finished;
+ return;
+ }
+
+ m_state = IndexedDB::TransactionState::Committing;
+
+ m_database->commitTransaction(*this);
+}
+
+void IDBTransaction::didCommit(const IDBError& error)
+{
+ LOG(IndexedDB, "IDBTransaction::didCommit");
+
+ ASSERT(m_state == IndexedDB::TransactionState::Committing);
+
+ if (error.isNull()) {
+ m_database->didCommitTransaction(*this);
+ fireOnComplete();
+ } else {
+ m_database->didAbortTransaction(*this);
+ m_idbError = error;
+ fireOnAbort();
+ }
+
+ m_state = IndexedDB::TransactionState::Finished;
+}
+
+void IDBTransaction::fireOnComplete()
+{
+ LOG(IndexedDB, "IDBTransaction::fireOnComplete");
+ enqueueEvent(Event::create(eventNames().completeEvent, false, false));
+}
+
+void IDBTransaction::fireOnAbort()
+{
+ LOG(IndexedDB, "IDBTransaction::fireOnAbort");
+ enqueueEvent(Event::create(eventNames().abortEvent, true, false));
+}
+
+void IDBTransaction::enqueueEvent(Ref<Event> event)
+{
+ ASSERT(m_state != IndexedDB::TransactionState::Finished);
+
+ if (!scriptExecutionContext())
+ return;
+
+ event->setTarget(this);
+ scriptExecutionContext()->eventQueue().enqueueEvent(&event.get());
+}
+
+bool IDBTransaction::dispatchEvent(PassRefPtr<Event> event)
+{
+ LOG(IndexedDB, "IDBTransaction::dispatchEvent");
+
+ ASSERT(scriptExecutionContext());
+ ASSERT(event->target() == this);
+ ASSERT(event->type() == eventNames().completeEvent || event->type() == eventNames().abortEvent);
+
+ Vector<RefPtr<EventTarget>> targets;
+ targets.append(this);
+ targets.append(db());
+
+ return IDBEventDispatcher::dispatch(event.get(), targets);
+}
+
</ins><span class="cx"> } // namespace IDBClient
</span><span class="cx"> } // namespace WebCore
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbclientIDBTransactionImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBTransactionImpl.h (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/client/IDBTransactionImpl.h        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBTransactionImpl.h        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -28,8 +28,12 @@
</span><span class="cx">
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE)
</span><span class="cx">
</span><ins>+#include "IDBError.h"
</ins><span class="cx"> #include "IDBTransaction.h"
</span><span class="cx"> #include "IDBTransactionInfo.h"
</span><ins>+#include "IndexedDB.h"
+#include "Timer.h"
+#include <heap/StrongInlines.h>
</ins><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> namespace IDBClient {
</span><span class="lines">@@ -44,7 +48,7 @@
</span><span class="cx">
</span><span class="cx"> // IDBTransaction IDL
</span><span class="cx"> virtual const String& mode() const override final;
</span><del>- virtual WebCore::IDBDatabase* db() const override final;
</del><ins>+ virtual WebCore::IDBDatabase* db() override final;
</ins><span class="cx"> virtual RefPtr<DOMError> error() const override final;
</span><span class="cx"> virtual RefPtr<IDBObjectStore> objectStore(const String& name, ExceptionCode&) override final;
</span><span class="cx"> virtual void abort(ExceptionCode&) override final;
</span><span class="lines">@@ -53,16 +57,39 @@
</span><span class="cx"> virtual ScriptExecutionContext* scriptExecutionContext() const override final { return ActiveDOMObject::scriptExecutionContext(); }
</span><span class="cx"> virtual void refEventTarget() override final { ref(); }
</span><span class="cx"> virtual void derefEventTarget() override final { deref(); }
</span><ins>+ using EventTarget::dispatchEvent;
+ virtual bool dispatchEvent(PassRefPtr<Event>) override final;
</ins><span class="cx">
</span><span class="cx"> virtual const char* activeDOMObjectName() const override final;
</span><span class="cx"> virtual bool canSuspendForPageCache() const override final;
</span><ins>+ virtual bool hasPendingActivity() const override final;
</ins><span class="cx">
</span><span class="cx"> const IDBTransactionInfo info() const { return m_info; }
</span><ins>+ IDBDatabase& database() { return m_database.get(); }
+ const IDBDatabase& database() const { return m_database.get(); }
</ins><span class="cx">
</span><ins>+ void didCommit(const IDBError&);
+
</ins><span class="cx"> private:
</span><span class="cx"> IDBTransaction(IDBDatabase&, const IDBTransactionInfo&);
</span><span class="cx">
</span><ins>+ bool isActive() const;
+ void commit();
+
+ void scheduleOperationTimer();
+ void operationTimerFired();
+
+ void fireOnComplete();
+ void fireOnAbort();
+ void enqueueEvent(Ref<Event>);
+
+ Ref<IDBDatabase> m_database;
</ins><span class="cx"> IDBTransactionInfo m_info;
</span><ins>+
+ IndexedDB::TransactionState m_state { IndexedDB::TransactionState::Unstarted };
+ IDBError m_idbError;
+
+ Timer m_operationTimer;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace IDBClient
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddblegacyLegacyTransactioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/legacy/LegacyTransaction.cpp (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/legacy/LegacyTransaction.cpp        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/legacy/LegacyTransaction.cpp        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -94,7 +94,7 @@
</span><span class="cx"> return modeToString(m_mode);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-IDBDatabase* LegacyTransaction::db() const
</del><ins>+IDBDatabase* LegacyTransaction::db()
</ins><span class="cx"> {
</span><span class="cx"> return m_database.get();
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddblegacyLegacyTransactionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/legacy/LegacyTransaction.h (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/legacy/LegacyTransaction.h        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/legacy/LegacyTransaction.h        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -66,7 +66,7 @@
</span><span class="cx"> bool isVersionChange() const { return m_mode == IndexedDB::TransactionMode::VersionChange; }
</span><span class="cx">
</span><span class="cx"> virtual const String& mode() const override final;
</span><del>- virtual IDBDatabase* db() const override final;
</del><ins>+ virtual IDBDatabase* db() override final;
</ins><span class="cx"> virtual RefPtr<DOMError> error() const override final { return m_error; }
</span><span class="cx"> virtual RefPtr<IDBObjectStore> objectStore(const String& name, ExceptionCode&) override final;
</span><span class="cx"> virtual void abort(ExceptionCode&) override final;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverIDBConnectionToClientcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.cpp (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.cpp        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.cpp        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -58,6 +58,11 @@
</span><span class="cx"> m_delegate->didOpenDatabase(result);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void IDBConnectionToClient::didCommitTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError& error)
+{
+ m_delegate->didCommitTransaction(transactionIdentifier, error);
+}
+
</ins><span class="cx"> void IDBConnectionToClient::fireVersionChangeEvent(UniqueIDBDatabaseConnection& connection, uint64_t requestedVersion)
</span><span class="cx"> {
</span><span class="cx"> m_delegate->fireVersionChangeEvent(connection, requestedVersion);
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverIDBConnectionToClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.h (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.h        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.h        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -34,6 +34,8 @@
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><ins>+class IDBError;
+class IDBResourceIdentifier;
</ins><span class="cx"> class IDBResultData;
</span><span class="cx">
</span><span class="cx"> namespace IDBServer {
</span><span class="lines">@@ -48,6 +50,7 @@
</span><span class="cx">
</span><span class="cx"> void didDeleteDatabase(const IDBResultData&);
</span><span class="cx"> void didOpenDatabase(const IDBResultData&);
</span><ins>+ void didCommitTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&);
</ins><span class="cx">
</span><span class="cx"> void fireVersionChangeEvent(UniqueIDBDatabaseConnection&, uint64_t requestedVersion);
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverIDBConnectionToClientDelegateh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClientDelegate.h (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClientDelegate.h        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClientDelegate.h        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -30,6 +30,8 @@
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><ins>+class IDBError;
+class IDBResourceIdentifier;
</ins><span class="cx"> class IDBResultData;
</span><span class="cx">
</span><span class="cx"> namespace IDBServer {
</span><span class="lines">@@ -44,6 +46,7 @@
</span><span class="cx">
</span><span class="cx"> virtual void didDeleteDatabase(const IDBResultData&) = 0;
</span><span class="cx"> virtual void didOpenDatabase(const IDBResultData&) = 0;
</span><ins>+ virtual void didCommitTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&) = 0;
</ins><span class="cx">
</span><span class="cx"> virtual void fireVersionChangeEvent(UniqueIDBDatabaseConnection&, uint64_t requestedVersion) = 0;
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverIDBServercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -63,6 +63,20 @@
</span><span class="cx"> m_connectionMap.remove(connection.identifier());
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void IDBServer::registerTransaction(UniqueIDBDatabaseTransaction& transaction)
+{
+ ASSERT(!m_transactions.contains(transaction.info().identifier()));
+ m_transactions.set(transaction.info().identifier(), &transaction);
+}
+
+void IDBServer::unregisterTransaction(UniqueIDBDatabaseTransaction& transaction)
+{
+ ASSERT(m_transactions.contains(transaction.info().identifier()));
+ ASSERT(m_transactions.get(transaction.info().identifier()) == &transaction);
+
+ m_transactions.remove(transaction.info().identifier());
+}
+
</ins><span class="cx"> void IDBServer::registerDatabaseConnection(UniqueIDBDatabaseConnection& connection)
</span><span class="cx"> {
</span><span class="cx"> ASSERT(!m_databaseConnections.contains(connection.identifier()));
</span><span class="lines">@@ -128,6 +142,20 @@
</span><span class="cx"> connection->didDeleteDatabase(result);
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void IDBServer::commitTransaction(const IDBResourceIdentifier& transactionIdentifier)
+{
+ LOG(IndexedDB, "IDBServer::commitTransaction");
+
+ auto transaction = m_transactions.get(transactionIdentifier);
+ if (!transaction) {
+ // If there is no transaction there is nothing to commit.
+ // We also have no access to a connection over which to message failure-to-commit.
+ return;
+ }
+
+ transaction->commit();
+}
+
</ins><span class="cx"> void IDBServer::postDatabaseTask(std::unique_ptr<CrossThreadTask>&& task)
</span><span class="cx"> {
</span><span class="cx"> ASSERT(isMainThread());
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverIDBServerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -57,12 +57,15 @@
</span><span class="cx"> // Operations requested by the client.
</span><span class="cx"> void openDatabase(const IDBRequestData&);
</span><span class="cx"> void deleteDatabase(const IDBRequestData&);
</span><ins>+ void commitTransaction(const IDBResourceIdentifier&);
</ins><span class="cx">
</span><span class="cx"> void postDatabaseTask(std::unique_ptr<CrossThreadTask>&&);
</span><span class="cx"> void postDatabaseTaskReply(std::unique_ptr<CrossThreadTask>&&);
</span><span class="cx">
</span><span class="cx"> void registerDatabaseConnection(UniqueIDBDatabaseConnection&);
</span><span class="cx"> void unregisterDatabaseConnection(UniqueIDBDatabaseConnection&);
</span><ins>+ void registerTransaction(UniqueIDBDatabaseTransaction&);
+ void unregisterTransaction(UniqueIDBDatabaseTransaction&);
</ins><span class="cx">
</span><span class="cx"> std::unique_ptr<IDBBackingStore> createBackingStore(const IDBDatabaseIdentifier&);
</span><span class="cx">
</span><span class="lines">@@ -87,6 +90,7 @@
</span><span class="cx"> MessageQueue<CrossThreadTask> m_databaseReplyQueue;
</span><span class="cx">
</span><span class="cx"> HashMap<uint64_t, UniqueIDBDatabaseConnection*> m_databaseConnections;
</span><ins>+ HashMap<IDBResourceIdentifier, UniqueIDBDatabaseTransaction*> m_transactions;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace IDBServer
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverUniqueIDBDatabasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -124,6 +124,20 @@
</span><span class="cx"> return !m_openDatabaseConnections.isEmpty();
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+static uint64_t generateUniqueCallbackIdentifier()
+{
+ ASSERT(isMainThread());
+ static uint64_t currentID = 0;
+ return ++currentID;
+}
+
+uint64_t UniqueIDBDatabase::storeCallback(ErrorCallback callback)
+{
+ uint64_t identifier = generateUniqueCallbackIdentifier();
+ m_errorCallbacks.set(identifier, callback);
+ return identifier;
+}
+
</ins><span class="cx"> void UniqueIDBDatabase::startVersionChangeTransaction()
</span><span class="cx"> {
</span><span class="cx"> LOG(IndexedDB, "(main) UniqueIDBDatabase::startVersionChangeTransaction");
</span><span class="lines">@@ -141,8 +155,7 @@
</span><span class="cx">
</span><span class="cx"> addOpenDatabaseConnection(*m_versionChangeDatabaseConnection);
</span><span class="cx">
</span><del>- m_versionChangeTransaction = m_versionChangeDatabaseConnection->createVersionChangeTransaction(requestedVersion);
- m_inProgressTransactions.set(m_versionChangeTransaction->info().identifier(), m_versionChangeTransaction);
</del><ins>+ m_versionChangeTransaction = &m_versionChangeDatabaseConnection->createVersionChangeTransaction(requestedVersion);
</ins><span class="cx">
</span><span class="cx"> auto result = IDBResultData::openDatabaseUpgradeNeeded(operation->requestData().requestIdentifier(), *m_versionChangeTransaction);
</span><span class="cx"> operation->connection().didOpenDatabase(result);
</span><span class="lines">@@ -196,6 +209,55 @@
</span><span class="cx"> handleOpenDatabaseOperations();
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void UniqueIDBDatabase::commitTransaction(UniqueIDBDatabaseTransaction& transaction, ErrorCallback callback)
+{
+ ASSERT(isMainThread());
+ LOG(IndexedDB, "(main) UniqueIDBDatabase::commitTransaction");
+
+ if (m_versionChangeTransaction == &transaction) {
+ ASSERT(&m_versionChangeTransaction->databaseConnection() == m_versionChangeDatabaseConnection);
+ m_databaseInfo->setVersion(transaction.info().newVersion());
+ m_versionChangeTransaction = nullptr;
+ m_versionChangeDatabaseConnection = nullptr;
+ }
+
+ uint64_t callbackID = storeCallback(callback);
+ m_server.postDatabaseTask(createCrossThreadTask(*this, &UniqueIDBDatabase::performCommitTransaction, callbackID, transaction.info().identifier()));
+}
+
+void UniqueIDBDatabase::performCommitTransaction(uint64_t callbackIdentifier, const IDBResourceIdentifier&)
+{
+ ASSERT(!isMainThread());
+ LOG(IndexedDB, "(db) UniqueIDBDatabase::performCommitTransaction");
+
+ // FIXME: Commit transaction in backing store, once that exists.
+
+ IDBError error;
+ m_server.postDatabaseTaskReply(createCrossThreadTask(*this, &UniqueIDBDatabase::didPerformCommitTransaction, callbackIdentifier, error));
+
+}
+
+void UniqueIDBDatabase::didPerformCommitTransaction(uint64_t callbackIdentifier, const IDBError& error)
+{
+ ASSERT(isMainThread());
+ LOG(IndexedDB, "(main) UniqueIDBDatabase::didPerformCommitTransaction");
+
+ performErrorCallback(callbackIdentifier, error);
+}
+
+void UniqueIDBDatabase::transactionDestroyed(UniqueIDBDatabaseTransaction& transaction)
+{
+ if (m_versionChangeTransaction == &transaction)
+ m_versionChangeTransaction = nullptr;
+}
+
+void UniqueIDBDatabase::performErrorCallback(uint64_t callbackIdentifier, const IDBError& error)
+{
+ auto callback = m_errorCallbacks.take(callbackIdentifier);
+ ASSERT(callback);
+ callback(error);
+}
+
</ins><span class="cx"> } // namespace IDBServer
</span><span class="cx"> } // namespace WebCore
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverUniqueIDBDatabaseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="cx">
</span><ins>+class IDBError;
</ins><span class="cx"> class IDBRequestData;
</span><span class="cx">
</span><span class="cx"> namespace IDBServer {
</span><span class="lines">@@ -48,6 +49,8 @@
</span><span class="cx"> class IDBConnectionToClient;
</span><span class="cx"> class IDBServer;
</span><span class="cx">
</span><ins>+typedef std::function<void(const IDBError&)> ErrorCallback;
+
</ins><span class="cx"> class UniqueIDBDatabase : public ThreadSafeRefCounted<UniqueIDBDatabase> {
</span><span class="cx"> public:
</span><span class="cx"> static Ref<UniqueIDBDatabase> create(IDBServer& server, const IDBDatabaseIdentifier& identifier)
</span><span class="lines">@@ -58,7 +61,11 @@
</span><span class="cx"> void openDatabaseConnection(IDBConnectionToClient&, const IDBRequestData&);
</span><span class="cx">
</span><span class="cx"> const IDBDatabaseInfo& info() const;
</span><ins>+ IDBServer& server() { return m_server; }
</ins><span class="cx">
</span><ins>+ void commitTransaction(UniqueIDBDatabaseTransaction&, ErrorCallback);
+ void transactionDestroyed(UniqueIDBDatabaseTransaction&);
+
</ins><span class="cx"> private:
</span><span class="cx"> UniqueIDBDatabase(IDBServer&, const IDBDatabaseIdentifier&);
</span><span class="cx">
</span><span class="lines">@@ -68,13 +75,19 @@
</span><span class="cx">
</span><span class="cx"> void startVersionChangeTransaction();
</span><span class="cx"> void notifyConnectionsOfVersionChange();
</span><ins>+
+ uint64_t storeCallback(ErrorCallback);
</ins><span class="cx">
</span><span class="cx"> // Database thread operations
</span><span class="cx"> void openBackingStore(const IDBDatabaseIdentifier&);
</span><ins>+ void performCommitTransaction(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier);
</ins><span class="cx">
</span><span class="cx"> // Main thread callbacks
</span><span class="cx"> void didOpenBackingStore(const IDBDatabaseInfo&);
</span><ins>+ void didPerformCommitTransaction(uint64_t callbackIdentifier, const IDBError&);
</ins><span class="cx">
</span><ins>+ void performErrorCallback(uint64_t callbackIdentifier, const IDBError&);
+
</ins><span class="cx"> IDBServer& m_server;
</span><span class="cx"> IDBDatabaseIdentifier m_identifier;
</span><span class="cx">
</span><span class="lines">@@ -84,12 +97,12 @@
</span><span class="cx">
</span><span class="cx"> RefPtr<IDBServerOperation> m_versionChangeOperation;
</span><span class="cx"> RefPtr<UniqueIDBDatabaseConnection> m_versionChangeDatabaseConnection;
</span><ins>+ UniqueIDBDatabaseTransaction* m_versionChangeTransaction { nullptr };
</ins><span class="cx">
</span><del>- RefPtr<UniqueIDBDatabaseTransaction> m_versionChangeTransaction;
- HashMap<IDBResourceIdentifier, RefPtr<UniqueIDBDatabaseTransaction>> m_inProgressTransactions;
-
</del><span class="cx"> std::unique_ptr<IDBBackingStore> m_backingStore;
</span><span class="cx"> std::unique_ptr<IDBDatabaseInfo> m_databaseInfo;
</span><ins>+
+ HashMap<uint64_t, ErrorCallback> m_errorCallbacks;
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace IDBServer
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverUniqueIDBDatabaseConnectioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -59,7 +59,7 @@
</span><span class="cx"> m_connectionToClient.fireVersionChangeEvent(*this, requestedVersion);
</span><span class="cx"> }
</span><span class="cx">
</span><del>-Ref<UniqueIDBDatabaseTransaction> UniqueIDBDatabaseConnection::createVersionChangeTransaction(uint64_t newVersion)
</del><ins>+UniqueIDBDatabaseTransaction& UniqueIDBDatabaseConnection::createVersionChangeTransaction(uint64_t newVersion)
</ins><span class="cx"> {
</span><span class="cx"> LOG(IndexedDB, "UniqueIDBDatabaseConnection::createVersionChangeTransaction");
</span><span class="cx"> ASSERT(!m_closePending);
</span><span class="lines">@@ -69,9 +69,21 @@
</span><span class="cx"> Ref<UniqueIDBDatabaseTransaction> transaction = UniqueIDBDatabaseTransaction::create(*this, info);
</span><span class="cx"> m_transactionMap.set(transaction->info().identifier(), &transaction.get());
</span><span class="cx">
</span><del>- return WTF::move(transaction);
</del><ins>+ return transaction.get();
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+void UniqueIDBDatabaseConnection::didCommitTransaction(UniqueIDBDatabaseTransaction& transaction, const IDBError& error)
+{
+ LOG(IndexedDB, "UniqueIDBDatabaseConnection::didCommitTransaction");
+
+ auto transactionIdentifier = transaction.info().identifier();
+
+ ASSERT(m_transactionMap.contains(transactionIdentifier));
+ m_transactionMap.remove(transactionIdentifier);
+
+ m_connectionToClient.didCommitTransaction(transactionIdentifier, error);
+}
+
</ins><span class="cx"> } // namespace IDBServer
</span><span class="cx"> } // namespace WebCore
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverUniqueIDBDatabaseConnectionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -34,6 +34,9 @@
</span><span class="cx"> #include <wtf/RefCounted.h>
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><ins>+
+class IDBError;
+
</ins><span class="cx"> namespace IDBServer {
</span><span class="cx">
</span><span class="cx"> class IDBConnectionToClient;
</span><span class="lines">@@ -51,8 +54,10 @@
</span><span class="cx"> bool closePending() const { return m_closePending; }
</span><span class="cx">
</span><span class="cx"> void fireVersionChangeEvent(uint64_t requestedVersion);
</span><del>- Ref<UniqueIDBDatabaseTransaction> createVersionChangeTransaction(uint64_t newVersion);
</del><ins>+ UniqueIDBDatabaseTransaction& createVersionChangeTransaction(uint64_t newVersion);
</ins><span class="cx">
</span><ins>+ void didCommitTransaction(UniqueIDBDatabaseTransaction&, const IDBError&);
+
</ins><span class="cx"> private:
</span><span class="cx"> UniqueIDBDatabaseConnection(UniqueIDBDatabase&, IDBConnectionToClient&);
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverUniqueIDBDatabaseTransactioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -28,6 +28,10 @@
</span><span class="cx">
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE)
</span><span class="cx">
</span><ins>+#include "IDBServer.h"
+#include "Logging.h"
+#include "UniqueIDBDatabase.h"
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx"> namespace IDBServer {
</span><span class="cx">
</span><span class="lines">@@ -40,8 +44,26 @@
</span><span class="cx"> : m_databaseConnection(connection)
</span><span class="cx"> , m_transactionInfo(info)
</span><span class="cx"> {
</span><ins>+ m_databaseConnection->database().server().registerTransaction(*this);
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+UniqueIDBDatabaseTransaction::~UniqueIDBDatabaseTransaction()
+{
+ m_databaseConnection->database().transactionDestroyed(*this);
+ m_databaseConnection->database().server().unregisterTransaction(*this);
+}
+
+void UniqueIDBDatabaseTransaction::commit()
+{
+ LOG(IndexedDB, "UniqueIDBDatabaseTransaction::commit");
+
+ RefPtr<UniqueIDBDatabaseTransaction> self(this);
+ m_databaseConnection->database().commitTransaction(*this, [this, self](const IDBError& error) {
+ LOG(IndexedDB, "UniqueIDBDatabaseTransaction::commit (callback)");
+ m_databaseConnection->didCommitTransaction(*this, error);
+ });
+}
+
</ins><span class="cx"> } // namespace IDBServer
</span><span class="cx"> } // namespace WebCore
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbserverUniqueIDBDatabaseTransactionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -42,9 +42,13 @@
</span><span class="cx"> public:
</span><span class="cx"> static Ref<UniqueIDBDatabaseTransaction> create(UniqueIDBDatabaseConnection&, IDBTransactionInfo&);
</span><span class="cx">
</span><ins>+ ~UniqueIDBDatabaseTransaction();
+
</ins><span class="cx"> UniqueIDBDatabaseConnection& databaseConnection() { return m_databaseConnection.get(); }
</span><span class="cx"> const IDBTransactionInfo& info() const { return m_transactionInfo; }
</span><span class="cx">
</span><ins>+ void commit();
+
</ins><span class="cx"> private:
</span><span class="cx"> UniqueIDBDatabaseTransaction(UniqueIDBDatabaseConnection&, IDBTransactionInfo&);
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbsharedIDBDatabaseInfoh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/shared/IDBDatabaseInfo.h (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/shared/IDBDatabaseInfo.h        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/shared/IDBDatabaseInfo.h        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -39,6 +39,8 @@
</span><span class="cx"> IDBDatabaseInfo isolatedCopy() const;
</span><span class="cx">
</span><span class="cx"> const String& name() const { return m_name; }
</span><ins>+
+ void setVersion(uint64_t version) { m_version = version; }
</ins><span class="cx"> uint64_t version() const { return m_version; }
</span><span class="cx">
</span><span class="cx"> private:
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbsharedIDBErrorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/shared/IDBError.cpp (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/shared/IDBError.cpp        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/shared/IDBError.cpp        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -55,6 +55,11 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+IDBError IDBError::isolatedCopy() const
+{
+ return { m_code, m_message.isolatedCopy() };
+}
+
</ins><span class="cx"> IDBError& IDBError::operator=(const IDBError& other)
</span><span class="cx"> {
</span><span class="cx"> m_code = other.m_code;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbsharedIDBErrorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/shared/IDBError.h (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/shared/IDBError.h        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/shared/IDBError.h        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -51,6 +51,8 @@
</span><span class="cx">
</span><span class="cx"> bool isNull() const { return m_code == IDBExceptionCode::None; }
</span><span class="cx">
</span><ins>+ IDBError isolatedCopy() const;
+
</ins><span class="cx"> private:
</span><span class="cx"> IDBExceptionCode m_code { IDBExceptionCode::None };
</span><span class="cx"> String m_message;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbsharedIDBRequestDatah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/shared/IDBRequestData.h (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/shared/IDBRequestData.h        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/shared/IDBRequestData.h        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> namespace IDBClient {
</span><span class="cx"> class IDBConnectionToServer;
</span><span class="cx"> class IDBOpenDBRequest;
</span><ins>+class IDBTransaction;
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> class IDBRequestData {
</span><span class="lines">@@ -51,7 +52,7 @@
</span><span class="cx"> IDBResourceIdentifier m_requestIdentifier;
</span><span class="cx"> IDBDatabaseIdentifier m_databaseIdentifier;
</span><span class="cx">
</span><del>- uint64_t m_requestedVersion;
</del><ins>+ uint64_t m_requestedVersion { 0 };
</ins><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbsharedIDBResourceIdentifiercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/shared/IDBResourceIdentifier.cpp (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/shared/IDBResourceIdentifier.cpp        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/shared/IDBResourceIdentifier.cpp        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -73,6 +73,11 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+IDBResourceIdentifier IDBResourceIdentifier::isolatedCopy() const
+{
+ return IDBResourceIdentifier(m_idbConnectionIdentifier, m_resourceNumber);
+}
+
</ins><span class="cx"> IDBResourceIdentifier IDBResourceIdentifier::emptyValue()
</span><span class="cx"> {
</span><span class="cx"> return IDBResourceIdentifier(0, 0);
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbsharedIDBResourceIdentifierh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/shared/IDBResourceIdentifier.h (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/shared/IDBResourceIdentifier.h        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/shared/IDBResourceIdentifier.h        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -69,7 +69,9 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> uint64_t connectionIdentifier() const { return m_idbConnectionIdentifier; }
</span><del>-
</del><ins>+
+ IDBResourceIdentifier isolatedCopy() const;
+
</ins><span class="cx"> private:
</span><span class="cx"> IDBResourceIdentifier() = delete;
</span><span class="cx"> IDBResourceIdentifier(uint64_t connectionIdentifier, uint64_t resourceIdentifier);
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbsharedInProcessIDBServercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.cpp (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.cpp        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.cpp        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -102,6 +102,22 @@
</span><span class="cx"> });
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+void InProcessIDBServer::didCommitTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError& error)
+{
+ RefPtr<InProcessIDBServer> self(this);
+ RunLoop::current().dispatch([this, self, transactionIdentifier, error] {
+ m_connectionToServer->didCommitTransaction(transactionIdentifier, error);
+ });
+}
+
+void InProcessIDBServer::commitTransaction(IDBResourceIdentifier& resourceIdentifier)
+{
+ RefPtr<InProcessIDBServer> self(this);
+ RunLoop::current().dispatch([this, self, resourceIdentifier] {
+ m_server->commitTransaction(resourceIdentifier);
+ });
+}
+
</ins><span class="cx"> void InProcessIDBServer::fireVersionChangeEvent(IDBServer::UniqueIDBDatabaseConnection& connection, uint64_t requestedVersion)
</span><span class="cx"> {
</span><span class="cx"> RefPtr<InProcessIDBServer> self(this);
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbsharedInProcessIDBServerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.h (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.h        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.h        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -56,11 +56,13 @@
</span><span class="cx"> // IDBConnectionToServer
</span><span class="cx"> virtual void deleteDatabase(IDBRequestData&) override final;
</span><span class="cx"> virtual void openDatabase(IDBRequestData&) override final;
</span><ins>+ virtual void commitTransaction(IDBResourceIdentifier&) override final;
</ins><span class="cx">
</span><span class="cx"> // IDBConnectionToClient
</span><span class="cx"> virtual uint64_t identifier() const override;
</span><span class="cx"> virtual void didDeleteDatabase(const IDBResultData&) override final;
</span><span class="cx"> virtual void didOpenDatabase(const IDBResultData&) override final;
</span><ins>+ virtual void didCommitTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&) override final;
</ins><span class="cx"> virtual void fireVersionChangeEvent(IDBServer::UniqueIDBDatabaseConnection&, uint64_t requestedVersion) override final;
</span><span class="cx">
</span><span class="cx"> virtual void ref() override { RefCounted<InProcessIDBServer>::ref(); }
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -1967,7 +1967,7 @@
</span><span class="cx">                 5145B1091BC48E2E00E86219 /* IDBResourceIdentifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5145B1071BC4890B00E86219 /* IDBResourceIdentifier.cpp */; };
</span><span class="cx">                 5145B10A1BC48E2E00E86219 /* IDBResourceIdentifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 5145B1081BC4890B00E86219 /* IDBResourceIdentifier.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 5148453E1BB9D07E006A72ED /* IDBError.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5148453C1BB9D076006A72ED /* IDBError.cpp */; };
</span><del>-                5148453F1BB9D07E006A72ED /* IDBError.h in Headers */ = {isa = PBXBuildFile; fileRef = 5148453D1BB9D076006A72ED /* IDBError.h */; };
</del><ins>+                5148453F1BB9D07E006A72ED /* IDBError.h in Headers */ = {isa = PBXBuildFile; fileRef = 5148453D1BB9D076006A72ED /* IDBError.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 514B3F730C722047000530DF /* FileSystem.h in Headers */ = {isa = PBXBuildFile; fileRef = 514B3F720C722047000530DF /* FileSystem.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 514B3F760C722055000530DF /* FileSystemMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 514B3F750C722055000530DF /* FileSystemMac.mm */; };
</span><span class="cx">                 514C76370CE9225E007EF3CD /* JSSQLError.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 514C76350CE9225E007EF3CD /* JSSQLError.cpp */; };
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformCrossThreadCopiercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/CrossThreadCopier.cpp (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/CrossThreadCopier.cpp        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/platform/CrossThreadCopier.cpp        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -45,9 +45,11 @@
</span><span class="cx"> #include "IDBDatabaseIdentifier.h"
</span><span class="cx"> #include "IDBDatabaseInfo.h"
</span><span class="cx"> #include "IDBDatabaseMetadata.h"
</span><ins>+#include "IDBError.h"
</ins><span class="cx"> #include "IDBGetResult.h"
</span><span class="cx"> #include "IDBKeyData.h"
</span><span class="cx"> #include "IDBKeyRangeData.h"
</span><ins>+#include "IDBResourceIdentifier.h"
</ins><span class="cx"> #include "IDBTransactionInfo.h"
</span><span class="cx"> #endif
</span><span class="cx">
</span><span class="lines">@@ -145,6 +147,16 @@
</span><span class="cx"> return info.isolatedCopy();
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+CrossThreadCopierBase<false, false, IDBResourceIdentifier>::Type CrossThreadCopierBase<false, false, IDBResourceIdentifier>::copy(const IDBResourceIdentifier& identifier)
+{
+ return identifier.isolatedCopy();
+}
+
+CrossThreadCopierBase<false, false, IDBError>::Type CrossThreadCopierBase<false, false, IDBError>::copy(const IDBError& error)
+{
+ return error.isolatedCopy();
+}
+
</ins><span class="cx"> #endif // ENABLE(INDEXED_DATABASE)
</span><span class="cx">
</span><span class="cx"> // Test CrossThreadCopier using COMPILE_ASSERT.
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformCrossThreadCopierh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/CrossThreadCopier.h (191113 => 191114)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/CrossThreadCopier.h        2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/Source/WebCore/platform/CrossThreadCopier.h        2015-10-15 16:41:30 UTC (rev 191114)
</span><span class="lines">@@ -203,6 +203,18 @@
</span><span class="cx"> static Type copy(const IDBDatabaseIdentifier&);
</span><span class="cx"> };
</span><span class="cx">
</span><ins>+ class IDBError;
+ template<> struct WEBCORE_EXPORT CrossThreadCopierBase<false, false, IDBError> {
+ typedef IDBError Type;
+ static Type copy(const IDBError&);
+ };
+
+ class IDBResourceIdentifier;
+ template<> struct WEBCORE_EXPORT CrossThreadCopierBase<false, false, IDBResourceIdentifier> {
+ typedef IDBResourceIdentifier Type;
+ static Type copy(const IDBResourceIdentifier&);
+ };
+
</ins><span class="cx"> class IDBTransactionInfo;
</span><span class="cx"> template<> struct WEBCORE_EXPORT CrossThreadCopierBase<false, false, IDBTransactionInfo> {
</span><span class="cx"> typedef IDBTransactionInfo Type;
</span></span></pre>
</div>
</div>
</body>
</html>