Diff
Modified: trunk/LayoutTests/ChangeLog (191113 => 191114)
--- trunk/LayoutTests/ChangeLog 2015-10-15 16:08:24 UTC (rev 191113)
+++ trunk/LayoutTests/ChangeLog 2015-10-15 16:41:30 UTC (rev 191114)
@@ -1,3 +1,13 @@
+2015-10-14 Brady Eidson <beid...@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.
+
2015-10-15 Daniel Bates <daba...@apple.com>
[iOS] DOM click event may not be dispatched when page has :active style and <input type="search">
Added: trunk/LayoutTests/storage/indexeddb/modern/opendatabase-versions-expected.txt (0 => 191114)
--- 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)
@@ -0,0 +1,9 @@
+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.
+
Added: trunk/LayoutTests/storage/indexeddb/modern/opendatabase-versions.html (0 => 191114)
--- 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)
@@ -0,0 +1,122 @@
+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>
Modified: trunk/Source/WebCore/ChangeLog (191113 => 191114)
--- 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)
@@ -1,3 +1,115 @@
+2015-10-14 Brady Eidson <beid...@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:
+
2015-10-15 Daniel Bates <daba...@apple.com>
[iOS] DOM click event may not be dispatched when page has :active style and <input type="search">
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.h (191113 => 191114)
--- 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)
@@ -61,7 +61,7 @@
// Implement the IDBTransaction IDL
virtual const String& mode() const = 0;
- virtual IDBDatabase* db() const = 0;
+ virtual IDBDatabase* db() = 0;
virtual RefPtr<DOMError> error() const = 0;
virtual RefPtr<IDBObjectStore> objectStore(const String& name, ExceptionCode&) = 0;
virtual void abort(ExceptionCode&) = 0;
Modified: trunk/Source/WebCore/Modules/indexeddb/IndexedDB.h (191113 => 191114)
--- 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)
@@ -39,6 +39,13 @@
};
const unsigned TransactionModeMaximum = 2;
+enum class TransactionState {
+ Unstarted,
+ Running,
+ Committing,
+ Finished,
+};
+
enum class CursorDirection {
Next = 0,
NextNoDuplicate = 1,
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp (191113 => 191114)
--- 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)
@@ -93,6 +93,26 @@
request->requestCompleted(resultData);
}
+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);
+}
+
void IDBConnectionToServer::fireVersionChangeEvent(uint64_t /*databaseConnectionIdentifier*/ , uint64_t /*requestedVersion*/)
{
LOG(IndexedDB, "IDBConnectionToServer::fireVersionChangeEvent");
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h (191113 => 191114)
--- 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)
@@ -37,12 +37,14 @@
namespace WebCore {
+class IDBError;
class IDBResultData;
namespace IDBClient {
class IDBDatabase;
class IDBOpenDBRequest;
+class IDBTransaction;
class IDBConnectionToServer : public RefCounted<IDBConnectionToServer> {
public:
@@ -56,6 +58,9 @@
void openDatabase(IDBOpenDBRequest&);
void didOpenDatabase(const IDBResultData&);
+ void commitTransaction(IDBTransaction&);
+ void didCommitTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&);
+
void fireVersionChangeEvent(uint64_t databaseConnectionIdentifier, uint64_t requestedVersion);
void registerDatabaseConnection(IDBDatabase&);
@@ -68,6 +73,7 @@
HashMap<IDBResourceIdentifier, RefPtr<IDBClient::IDBOpenDBRequest>> m_openDBRequestMap;
HashSet<RefPtr<IDBDatabase>> m_databaseConnections;
+ HashMap<IDBResourceIdentifier, RefPtr<IDBTransaction>> m_committingTransactions;
};
} // namespace IDBClient
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServerDelegate.h (191113 => 191114)
--- 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)
@@ -31,6 +31,7 @@
namespace WebCore {
class IDBRequestData;
+class IDBResourceIdentifier;
namespace IDBClient {
@@ -41,6 +42,7 @@
virtual uint64_t identifier() const = 0;
virtual void deleteDatabase(IDBRequestData&) = 0;
virtual void openDatabase(IDBRequestData&) = 0;
+ virtual void commitTransaction(IDBResourceIdentifier&) = 0;
virtual void ref() = 0;
virtual void deref() = 0;
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBDatabaseImpl.cpp (191113 => 191114)
--- 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)
@@ -128,11 +128,52 @@
Ref<IDBTransaction> transaction = IDBTransaction::create(*this, info);
m_versionChangeTransaction = &transaction.get();
+
m_activeTransactions.set(transaction->info().identifier(), &transaction.get());
return WTF::move(transaction);
}
+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());
+}
+
} // namespace IDBClient
} // namespace WebCore
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBDatabaseImpl.h (191113 => 191114)
--- 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)
@@ -72,15 +72,21 @@
const IDBDatabaseInfo& info() const { return m_info; }
Ref<IDBTransaction> startVersionChangeTransaction(const IDBTransactionInfo&);
+ void commitTransaction(IDBTransaction&);
+ void didCommitTransaction(IDBTransaction&);
+ void didAbortTransaction(IDBTransaction&);
private:
IDBDatabase(ScriptExecutionContext&, IDBConnectionToServer&, const IDBResultData&);
+ void didCommitOrAbortTransaction(IDBTransaction&);
+
Ref<IDBConnectionToServer> m_connection;
IDBDatabaseInfo m_info;
RefPtr<IDBTransaction> m_versionChangeTransaction;
HashMap<IDBResourceIdentifier, RefPtr<IDBTransaction>> m_activeTransactions;
+ HashMap<IDBResourceIdentifier, RefPtr<IDBTransaction>> m_committingTransactions;
};
} // namespace IDBClient
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBFactoryImpl.cpp (191113 => 191114)
--- 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)
@@ -91,7 +91,7 @@
return nullptr;
}
- return openInternal(context, name, 0, ec).release();
+ return openInternal(context, name, version, ec).release();
}
RefPtr<IDBOpenDBRequest> IDBFactory::openInternal(ScriptExecutionContext* context, const String& name, unsigned long long version, ExceptionCode& ec)
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBOpenDBRequestImpl.cpp (191113 => 191114)
--- 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)
@@ -62,16 +62,24 @@
{
}
-
void IDBOpenDBRequest::onError(const IDBResultData& data)
{
m_domError = DOMError::create(data.error().name());
enqueueEvent(Event::create(eventNames().errorEvent, true, true));
}
-void IDBOpenDBRequest::onSuccess(const IDBResultData&)
+void IDBOpenDBRequest::onSuccess(const IDBResultData& resultData)
{
- // FIXME: Implement
+ 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));
}
void IDBOpenDBRequest::onUpgradeNeeded(const IDBResultData& resultData)
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBOpenDBRequestImpl.h (191113 => 191114)
--- 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)
@@ -60,7 +60,7 @@
void onUpgradeNeeded(const IDBResultData&);
IDBDatabaseIdentifier m_databaseIdentifier;
- uint64_t m_version;
+ uint64_t m_version { 0 };
RefPtr<DOMError> m_domError;
};
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBTransactionImpl.cpp (191113 => 191114)
--- 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)
@@ -29,8 +29,12 @@
#if ENABLE(INDEXED_DATABASE)
#include "DOMError.h"
+#include "EventQueue.h"
#include "IDBDatabaseImpl.h"
+#include "IDBEventDispatcher.h"
#include "IDBObjectStore.h"
+#include "Logging.h"
+#include "ScriptExecutionContext.h"
namespace WebCore {
namespace IDBClient {
@@ -42,9 +46,14 @@
IDBTransaction::IDBTransaction(IDBDatabase& database, const IDBTransactionInfo& info)
: WebCore::IDBTransaction(database.scriptExecutionContext())
+ , m_database(database)
, m_info(info)
+ , m_operationTimer(*this, &IDBTransaction::operationTimerFired)
+
{
suspendIfNeeded();
+ scheduleOperationTimer();
+ m_state = IndexedDB::TransactionState::Running;
}
IDBTransaction::~IDBTransaction()
@@ -65,10 +74,9 @@
RELEASE_ASSERT_NOT_REACHED();
}
-WebCore::IDBDatabase* IDBTransaction::db() const
+WebCore::IDBDatabase* IDBTransaction::db()
{
- ASSERT_NOT_REACHED();
- return nullptr;
+ return &m_database.get();
}
RefPtr<DOMError> IDBTransaction::error() const
@@ -98,6 +106,107 @@
return false;
}
+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);
+}
+
} // namespace IDBClient
} // namespace WebCore
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBTransactionImpl.h (191113 => 191114)
--- 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)
@@ -28,8 +28,12 @@
#if ENABLE(INDEXED_DATABASE)
+#include "IDBError.h"
#include "IDBTransaction.h"
#include "IDBTransactionInfo.h"
+#include "IndexedDB.h"
+#include "Timer.h"
+#include <heap/StrongInlines.h>
namespace WebCore {
namespace IDBClient {
@@ -44,7 +48,7 @@
// IDBTransaction IDL
virtual const String& mode() const override final;
- virtual WebCore::IDBDatabase* db() const override final;
+ virtual WebCore::IDBDatabase* db() override final;
virtual RefPtr<DOMError> error() const override final;
virtual RefPtr<IDBObjectStore> objectStore(const String& name, ExceptionCode&) override final;
virtual void abort(ExceptionCode&) override final;
@@ -53,16 +57,39 @@
virtual ScriptExecutionContext* scriptExecutionContext() const override final { return ActiveDOMObject::scriptExecutionContext(); }
virtual void refEventTarget() override final { ref(); }
virtual void derefEventTarget() override final { deref(); }
+ using EventTarget::dispatchEvent;
+ virtual bool dispatchEvent(PassRefPtr<Event>) override final;
virtual const char* activeDOMObjectName() const override final;
virtual bool canSuspendForPageCache() const override final;
+ virtual bool hasPendingActivity() const override final;
const IDBTransactionInfo info() const { return m_info; }
+ IDBDatabase& database() { return m_database.get(); }
+ const IDBDatabase& database() const { return m_database.get(); }
+ void didCommit(const IDBError&);
+
private:
IDBTransaction(IDBDatabase&, const IDBTransactionInfo&);
+ bool isActive() const;
+ void commit();
+
+ void scheduleOperationTimer();
+ void operationTimerFired();
+
+ void fireOnComplete();
+ void fireOnAbort();
+ void enqueueEvent(Ref<Event>);
+
+ Ref<IDBDatabase> m_database;
IDBTransactionInfo m_info;
+
+ IndexedDB::TransactionState m_state { IndexedDB::TransactionState::Unstarted };
+ IDBError m_idbError;
+
+ Timer m_operationTimer;
};
} // namespace IDBClient
Modified: trunk/Source/WebCore/Modules/indexeddb/legacy/LegacyTransaction.cpp (191113 => 191114)
--- 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)
@@ -94,7 +94,7 @@
return modeToString(m_mode);
}
-IDBDatabase* LegacyTransaction::db() const
+IDBDatabase* LegacyTransaction::db()
{
return m_database.get();
}
Modified: trunk/Source/WebCore/Modules/indexeddb/legacy/LegacyTransaction.h (191113 => 191114)
--- 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)
@@ -66,7 +66,7 @@
bool isVersionChange() const { return m_mode == IndexedDB::TransactionMode::VersionChange; }
virtual const String& mode() const override final;
- virtual IDBDatabase* db() const override final;
+ virtual IDBDatabase* db() override final;
virtual RefPtr<DOMError> error() const override final { return m_error; }
virtual RefPtr<IDBObjectStore> objectStore(const String& name, ExceptionCode&) override final;
virtual void abort(ExceptionCode&) override final;
Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.cpp (191113 => 191114)
--- 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)
@@ -58,6 +58,11 @@
m_delegate->didOpenDatabase(result);
}
+void IDBConnectionToClient::didCommitTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError& error)
+{
+ m_delegate->didCommitTransaction(transactionIdentifier, error);
+}
+
void IDBConnectionToClient::fireVersionChangeEvent(UniqueIDBDatabaseConnection& connection, uint64_t requestedVersion)
{
m_delegate->fireVersionChangeEvent(connection, requestedVersion);
Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.h (191113 => 191114)
--- 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)
@@ -34,6 +34,8 @@
namespace WebCore {
+class IDBError;
+class IDBResourceIdentifier;
class IDBResultData;
namespace IDBServer {
@@ -48,6 +50,7 @@
void didDeleteDatabase(const IDBResultData&);
void didOpenDatabase(const IDBResultData&);
+ void didCommitTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&);
void fireVersionChangeEvent(UniqueIDBDatabaseConnection&, uint64_t requestedVersion);
Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClientDelegate.h (191113 => 191114)
--- 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)
@@ -30,6 +30,8 @@
namespace WebCore {
+class IDBError;
+class IDBResourceIdentifier;
class IDBResultData;
namespace IDBServer {
@@ -44,6 +46,7 @@
virtual void didDeleteDatabase(const IDBResultData&) = 0;
virtual void didOpenDatabase(const IDBResultData&) = 0;
+ virtual void didCommitTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&) = 0;
virtual void fireVersionChangeEvent(UniqueIDBDatabaseConnection&, uint64_t requestedVersion) = 0;
Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp (191113 => 191114)
--- 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)
@@ -63,6 +63,20 @@
m_connectionMap.remove(connection.identifier());
}
+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());
+}
+
void IDBServer::registerDatabaseConnection(UniqueIDBDatabaseConnection& connection)
{
ASSERT(!m_databaseConnections.contains(connection.identifier()));
@@ -128,6 +142,20 @@
connection->didDeleteDatabase(result);
}
+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();
+}
+
void IDBServer::postDatabaseTask(std::unique_ptr<CrossThreadTask>&& task)
{
ASSERT(isMainThread());
Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h (191113 => 191114)
--- 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)
@@ -57,12 +57,15 @@
// Operations requested by the client.
void openDatabase(const IDBRequestData&);
void deleteDatabase(const IDBRequestData&);
+ void commitTransaction(const IDBResourceIdentifier&);
void postDatabaseTask(std::unique_ptr<CrossThreadTask>&&);
void postDatabaseTaskReply(std::unique_ptr<CrossThreadTask>&&);
void registerDatabaseConnection(UniqueIDBDatabaseConnection&);
void unregisterDatabaseConnection(UniqueIDBDatabaseConnection&);
+ void registerTransaction(UniqueIDBDatabaseTransaction&);
+ void unregisterTransaction(UniqueIDBDatabaseTransaction&);
std::unique_ptr<IDBBackingStore> createBackingStore(const IDBDatabaseIdentifier&);
@@ -87,6 +90,7 @@
MessageQueue<CrossThreadTask> m_databaseReplyQueue;
HashMap<uint64_t, UniqueIDBDatabaseConnection*> m_databaseConnections;
+ HashMap<IDBResourceIdentifier, UniqueIDBDatabaseTransaction*> m_transactions;
};
} // namespace IDBServer
Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp (191113 => 191114)
--- 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)
@@ -124,6 +124,20 @@
return !m_openDatabaseConnections.isEmpty();
}
+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;
+}
+
void UniqueIDBDatabase::startVersionChangeTransaction()
{
LOG(IndexedDB, "(main) UniqueIDBDatabase::startVersionChangeTransaction");
@@ -141,8 +155,7 @@
addOpenDatabaseConnection(*m_versionChangeDatabaseConnection);
- m_versionChangeTransaction = m_versionChangeDatabaseConnection->createVersionChangeTransaction(requestedVersion);
- m_inProgressTransactions.set(m_versionChangeTransaction->info().identifier(), m_versionChangeTransaction);
+ m_versionChangeTransaction = &m_versionChangeDatabaseConnection->createVersionChangeTransaction(requestedVersion);
auto result = IDBResultData::openDatabaseUpgradeNeeded(operation->requestData().requestIdentifier(), *m_versionChangeTransaction);
operation->connection().didOpenDatabase(result);
@@ -196,6 +209,55 @@
handleOpenDatabaseOperations();
}
+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);
+}
+
} // namespace IDBServer
} // namespace WebCore
Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h (191113 => 191114)
--- 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)
@@ -41,6 +41,7 @@
namespace WebCore {
+class IDBError;
class IDBRequestData;
namespace IDBServer {
@@ -48,6 +49,8 @@
class IDBConnectionToClient;
class IDBServer;
+typedef std::function<void(const IDBError&)> ErrorCallback;
+
class UniqueIDBDatabase : public ThreadSafeRefCounted<UniqueIDBDatabase> {
public:
static Ref<UniqueIDBDatabase> create(IDBServer& server, const IDBDatabaseIdentifier& identifier)
@@ -58,7 +61,11 @@
void openDatabaseConnection(IDBConnectionToClient&, const IDBRequestData&);
const IDBDatabaseInfo& info() const;
+ IDBServer& server() { return m_server; }
+ void commitTransaction(UniqueIDBDatabaseTransaction&, ErrorCallback);
+ void transactionDestroyed(UniqueIDBDatabaseTransaction&);
+
private:
UniqueIDBDatabase(IDBServer&, const IDBDatabaseIdentifier&);
@@ -68,13 +75,19 @@
void startVersionChangeTransaction();
void notifyConnectionsOfVersionChange();
+
+ uint64_t storeCallback(ErrorCallback);
// Database thread operations
void openBackingStore(const IDBDatabaseIdentifier&);
+ void performCommitTransaction(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier);
// Main thread callbacks
void didOpenBackingStore(const IDBDatabaseInfo&);
+ void didPerformCommitTransaction(uint64_t callbackIdentifier, const IDBError&);
+ void performErrorCallback(uint64_t callbackIdentifier, const IDBError&);
+
IDBServer& m_server;
IDBDatabaseIdentifier m_identifier;
@@ -84,12 +97,12 @@
RefPtr<IDBServerOperation> m_versionChangeOperation;
RefPtr<UniqueIDBDatabaseConnection> m_versionChangeDatabaseConnection;
+ UniqueIDBDatabaseTransaction* m_versionChangeTransaction { nullptr };
- RefPtr<UniqueIDBDatabaseTransaction> m_versionChangeTransaction;
- HashMap<IDBResourceIdentifier, RefPtr<UniqueIDBDatabaseTransaction>> m_inProgressTransactions;
-
std::unique_ptr<IDBBackingStore> m_backingStore;
std::unique_ptr<IDBDatabaseInfo> m_databaseInfo;
+
+ HashMap<uint64_t, ErrorCallback> m_errorCallbacks;
};
} // namespace IDBServer
Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp (191113 => 191114)
--- 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)
@@ -59,7 +59,7 @@
m_connectionToClient.fireVersionChangeEvent(*this, requestedVersion);
}
-Ref<UniqueIDBDatabaseTransaction> UniqueIDBDatabaseConnection::createVersionChangeTransaction(uint64_t newVersion)
+UniqueIDBDatabaseTransaction& UniqueIDBDatabaseConnection::createVersionChangeTransaction(uint64_t newVersion)
{
LOG(IndexedDB, "UniqueIDBDatabaseConnection::createVersionChangeTransaction");
ASSERT(!m_closePending);
@@ -69,9 +69,21 @@
Ref<UniqueIDBDatabaseTransaction> transaction = UniqueIDBDatabaseTransaction::create(*this, info);
m_transactionMap.set(transaction->info().identifier(), &transaction.get());
- return WTF::move(transaction);
+ return transaction.get();
}
+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);
+}
+
} // namespace IDBServer
} // namespace WebCore
Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h (191113 => 191114)
--- 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)
@@ -34,6 +34,9 @@
#include <wtf/RefCounted.h>
namespace WebCore {
+
+class IDBError;
+
namespace IDBServer {
class IDBConnectionToClient;
@@ -51,8 +54,10 @@
bool closePending() const { return m_closePending; }
void fireVersionChangeEvent(uint64_t requestedVersion);
- Ref<UniqueIDBDatabaseTransaction> createVersionChangeTransaction(uint64_t newVersion);
+ UniqueIDBDatabaseTransaction& createVersionChangeTransaction(uint64_t newVersion);
+ void didCommitTransaction(UniqueIDBDatabaseTransaction&, const IDBError&);
+
private:
UniqueIDBDatabaseConnection(UniqueIDBDatabase&, IDBConnectionToClient&);
Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp (191113 => 191114)
--- 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)
@@ -28,6 +28,10 @@
#if ENABLE(INDEXED_DATABASE)
+#include "IDBServer.h"
+#include "Logging.h"
+#include "UniqueIDBDatabase.h"
+
namespace WebCore {
namespace IDBServer {
@@ -40,8 +44,26 @@
: m_databaseConnection(connection)
, m_transactionInfo(info)
{
+ m_databaseConnection->database().server().registerTransaction(*this);
}
+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);
+ });
+}
+
} // namespace IDBServer
} // namespace WebCore
Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h (191113 => 191114)
--- 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)
@@ -42,9 +42,13 @@
public:
static Ref<UniqueIDBDatabaseTransaction> create(UniqueIDBDatabaseConnection&, IDBTransactionInfo&);
+ ~UniqueIDBDatabaseTransaction();
+
UniqueIDBDatabaseConnection& databaseConnection() { return m_databaseConnection.get(); }
const IDBTransactionInfo& info() const { return m_transactionInfo; }
+ void commit();
+
private:
UniqueIDBDatabaseTransaction(UniqueIDBDatabaseConnection&, IDBTransactionInfo&);
Modified: trunk/Source/WebCore/Modules/indexeddb/shared/IDBDatabaseInfo.h (191113 => 191114)
--- 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)
@@ -39,6 +39,8 @@
IDBDatabaseInfo isolatedCopy() const;
const String& name() const { return m_name; }
+
+ void setVersion(uint64_t version) { m_version = version; }
uint64_t version() const { return m_version; }
private:
Modified: trunk/Source/WebCore/Modules/indexeddb/shared/IDBError.cpp (191113 => 191114)
--- 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)
@@ -55,6 +55,11 @@
{
}
+IDBError IDBError::isolatedCopy() const
+{
+ return { m_code, m_message.isolatedCopy() };
+}
+
IDBError& IDBError::operator=(const IDBError& other)
{
m_code = other.m_code;
Modified: trunk/Source/WebCore/Modules/indexeddb/shared/IDBError.h (191113 => 191114)
--- 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)
@@ -51,6 +51,8 @@
bool isNull() const { return m_code == IDBExceptionCode::None; }
+ IDBError isolatedCopy() const;
+
private:
IDBExceptionCode m_code { IDBExceptionCode::None };
String m_message;
Modified: trunk/Source/WebCore/Modules/indexeddb/shared/IDBRequestData.h (191113 => 191114)
--- 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)
@@ -36,6 +36,7 @@
namespace IDBClient {
class IDBConnectionToServer;
class IDBOpenDBRequest;
+class IDBTransaction;
}
class IDBRequestData {
@@ -51,7 +52,7 @@
IDBResourceIdentifier m_requestIdentifier;
IDBDatabaseIdentifier m_databaseIdentifier;
- uint64_t m_requestedVersion;
+ uint64_t m_requestedVersion { 0 };
};
} // namespace WebCore
Modified: trunk/Source/WebCore/Modules/indexeddb/shared/IDBResourceIdentifier.cpp (191113 => 191114)
--- 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)
@@ -73,6 +73,11 @@
{
}
+IDBResourceIdentifier IDBResourceIdentifier::isolatedCopy() const
+{
+ return IDBResourceIdentifier(m_idbConnectionIdentifier, m_resourceNumber);
+}
+
IDBResourceIdentifier IDBResourceIdentifier::emptyValue()
{
return IDBResourceIdentifier(0, 0);
Modified: trunk/Source/WebCore/Modules/indexeddb/shared/IDBResourceIdentifier.h (191113 => 191114)
--- 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)
@@ -69,7 +69,9 @@
}
uint64_t connectionIdentifier() const { return m_idbConnectionIdentifier; }
-
+
+ IDBResourceIdentifier isolatedCopy() const;
+
private:
IDBResourceIdentifier() = delete;
IDBResourceIdentifier(uint64_t connectionIdentifier, uint64_t resourceIdentifier);
Modified: trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.cpp (191113 => 191114)
--- 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)
@@ -102,6 +102,22 @@
});
}
+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);
+ });
+}
+
void InProcessIDBServer::fireVersionChangeEvent(IDBServer::UniqueIDBDatabaseConnection& connection, uint64_t requestedVersion)
{
RefPtr<InProcessIDBServer> self(this);
Modified: trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.h (191113 => 191114)
--- 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)
@@ -56,11 +56,13 @@
// IDBConnectionToServer
virtual void deleteDatabase(IDBRequestData&) override final;
virtual void openDatabase(IDBRequestData&) override final;
+ virtual void commitTransaction(IDBResourceIdentifier&) override final;
// IDBConnectionToClient
virtual uint64_t identifier() const override;
virtual void didDeleteDatabase(const IDBResultData&) override final;
virtual void didOpenDatabase(const IDBResultData&) override final;
+ virtual void didCommitTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&) override final;
virtual void fireVersionChangeEvent(IDBServer::UniqueIDBDatabaseConnection&, uint64_t requestedVersion) override final;
virtual void ref() override { RefCounted<InProcessIDBServer>::ref(); }
Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (191113 => 191114)
--- 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)
@@ -1967,7 +1967,7 @@
5145B1091BC48E2E00E86219 /* IDBResourceIdentifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5145B1071BC4890B00E86219 /* IDBResourceIdentifier.cpp */; };
5145B10A1BC48E2E00E86219 /* IDBResourceIdentifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 5145B1081BC4890B00E86219 /* IDBResourceIdentifier.h */; settings = {ATTRIBUTES = (Private, ); }; };
5148453E1BB9D07E006A72ED /* IDBError.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5148453C1BB9D076006A72ED /* IDBError.cpp */; };
- 5148453F1BB9D07E006A72ED /* IDBError.h in Headers */ = {isa = PBXBuildFile; fileRef = 5148453D1BB9D076006A72ED /* IDBError.h */; };
+ 5148453F1BB9D07E006A72ED /* IDBError.h in Headers */ = {isa = PBXBuildFile; fileRef = 5148453D1BB9D076006A72ED /* IDBError.h */; settings = {ATTRIBUTES = (Private, ); }; };
514B3F730C722047000530DF /* FileSystem.h in Headers */ = {isa = PBXBuildFile; fileRef = 514B3F720C722047000530DF /* FileSystem.h */; settings = {ATTRIBUTES = (Private, ); }; };
514B3F760C722055000530DF /* FileSystemMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 514B3F750C722055000530DF /* FileSystemMac.mm */; };
514C76370CE9225E007EF3CD /* JSSQLError.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 514C76350CE9225E007EF3CD /* JSSQLError.cpp */; };
Modified: trunk/Source/WebCore/platform/CrossThreadCopier.cpp (191113 => 191114)
--- 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)
@@ -45,9 +45,11 @@
#include "IDBDatabaseIdentifier.h"
#include "IDBDatabaseInfo.h"
#include "IDBDatabaseMetadata.h"
+#include "IDBError.h"
#include "IDBGetResult.h"
#include "IDBKeyData.h"
#include "IDBKeyRangeData.h"
+#include "IDBResourceIdentifier.h"
#include "IDBTransactionInfo.h"
#endif
@@ -145,6 +147,16 @@
return info.isolatedCopy();
}
+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();
+}
+
#endif // ENABLE(INDEXED_DATABASE)
// Test CrossThreadCopier using COMPILE_ASSERT.
Modified: trunk/Source/WebCore/platform/CrossThreadCopier.h (191113 => 191114)
--- 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)
@@ -203,6 +203,18 @@
static Type copy(const IDBDatabaseIdentifier&);
};
+ 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&);
+ };
+
class IDBTransactionInfo;
template<> struct WEBCORE_EXPORT CrossThreadCopierBase<false, false, IDBTransactionInfo> {
typedef IDBTransactionInfo Type;