Diff
Modified: trunk/Source/WebCore/ChangeLog (200488 => 200489)
--- trunk/Source/WebCore/ChangeLog 2016-05-05 23:05:37 UTC (rev 200488)
+++ trunk/Source/WebCore/ChangeLog 2016-05-05 23:11:13 UTC (rev 200489)
@@ -1,3 +1,86 @@
+2016-05-05 Brady Eidson <[email protected]>
+
+ Modern IDB (Workers): Move TransactionOperation management from IDBConnectionToServer to IDBConnectionProxy.
+ https://bugs.webkit.org/show_bug.cgi?id=157392
+
+ Reviewed by Alex Christensen.
+
+ No new tests (No current change in behavior, will be tested as bug 149953 makes progress).
+
+ Set up TransactionOperations on the IDBConnectionProxy instead of the IDBConnectionToServer:
+ * Modules/indexeddb/IDBTransaction.cpp:
+ (WebCore::IDBTransaction::createObjectStoreOnServer):
+ (WebCore::IDBTransaction::createIndexOnServer):
+ (WebCore::IDBTransaction::openCursorOnServer):
+ (WebCore::IDBTransaction::iterateCursorOnServer):
+ (WebCore::IDBTransaction::getRecordOnServer):
+ (WebCore::IDBTransaction::getCountOnServer):
+ (WebCore::IDBTransaction::deleteRecordOnServer):
+ (WebCore::IDBTransaction::clearObjectStoreOnServer):
+ (WebCore::IDBTransaction::putOrAddOnServer):
+ (WebCore::IDBTransaction::deleteObjectStoreOnServer):
+ (WebCore::IDBTransaction::deleteIndexOnServer):
+
+ IDBConnectionProxy is now the owner of dispatched TransactionOperations:
+ * Modules/indexeddb/client/IDBConnectionProxy.cpp:
+ (WebCore::IDBClient::IDBConnectionProxy::createObjectStore):
+ (WebCore::IDBClient::IDBConnectionProxy::deleteObjectStore):
+ (WebCore::IDBClient::IDBConnectionProxy::clearObjectStore):
+ (WebCore::IDBClient::IDBConnectionProxy::createIndex):
+ (WebCore::IDBClient::IDBConnectionProxy::deleteIndex):
+ (WebCore::IDBClient::IDBConnectionProxy::putOrAdd):
+ (WebCore::IDBClient::IDBConnectionProxy::getRecord):
+ (WebCore::IDBClient::IDBConnectionProxy::getCount):
+ (WebCore::IDBClient::IDBConnectionProxy::deleteRecord):
+ (WebCore::IDBClient::IDBConnectionProxy::openCursor):
+ (WebCore::IDBClient::IDBConnectionProxy::iterateCursor):
+ (WebCore::IDBClient::IDBConnectionProxy::saveOperation):
+ (WebCore::IDBClient::IDBConnectionProxy::completeOperation):
+ * Modules/indexeddb/client/IDBConnectionProxy.h:
+
+ Proxy this in-and-out calls to the ConnectionProxy:
+ * Modules/indexeddb/client/IDBConnectionToServer.cpp:
+ (WebCore::IDBClient::IDBConnectionToServer::createObjectStore):
+ (WebCore::IDBClient::IDBConnectionToServer::didCreateObjectStore):
+ (WebCore::IDBClient::IDBConnectionToServer::deleteObjectStore):
+ (WebCore::IDBClient::IDBConnectionToServer::didDeleteObjectStore):
+ (WebCore::IDBClient::IDBConnectionToServer::clearObjectStore):
+ (WebCore::IDBClient::IDBConnectionToServer::didClearObjectStore):
+ (WebCore::IDBClient::IDBConnectionToServer::createIndex):
+ (WebCore::IDBClient::IDBConnectionToServer::didCreateIndex):
+ (WebCore::IDBClient::IDBConnectionToServer::deleteIndex):
+ (WebCore::IDBClient::IDBConnectionToServer::didDeleteIndex):
+ (WebCore::IDBClient::IDBConnectionToServer::putOrAdd):
+ (WebCore::IDBClient::IDBConnectionToServer::didPutOrAdd):
+ (WebCore::IDBClient::IDBConnectionToServer::getRecord):
+ (WebCore::IDBClient::IDBConnectionToServer::didGetRecord):
+ (WebCore::IDBClient::IDBConnectionToServer::getCount):
+ (WebCore::IDBClient::IDBConnectionToServer::didGetCount):
+ (WebCore::IDBClient::IDBConnectionToServer::deleteRecord):
+ (WebCore::IDBClient::IDBConnectionToServer::didDeleteRecord):
+ (WebCore::IDBClient::IDBConnectionToServer::openCursor):
+ (WebCore::IDBClient::IDBConnectionToServer::didOpenCursor):
+ (WebCore::IDBClient::IDBConnectionToServer::iterateCursor):
+ (WebCore::IDBClient::IDBConnectionToServer::didIterateCursor):
+ (WebCore::IDBClient::IDBConnectionToServer::saveOperation): Deleted.
+ (WebCore::IDBClient::IDBConnectionToServer::completeOperation): Deleted.
+ * Modules/indexeddb/client/IDBConnectionToServer.h:
+
+ - Give TransactionOperation a ThreadIdentifier member
+ - Privatize most public methods from TransactionOperation
+ - Make IDBRequestData a friend so it can get at the private methods
+ * Modules/indexeddb/client/TransactionOperation.h:
+ (WebCore::IDBClient::TransactionOperation::~TransactionOperation):
+ (WebCore::IDBClient::TransactionOperation::perform):
+ (WebCore::IDBClient::TransactionOperation::completed):
+ (WebCore::IDBClient::TransactionOperation::originThreadID):
+ (WebCore::IDBClient::TransactionOperation::transactionIdentifier):
+ (WebCore::IDBClient::TransactionOperation::objectStoreIdentifier):
+ (WebCore::IDBClient::TransactionOperation::indexIdentifier):
+ (WebCore::IDBClient::TransactionOperation::cursorIdentifier):
+ (WebCore::IDBClient::TransactionOperation::transaction):
+ (WebCore::IDBClient::TransactionOperation::indexRecordType):
+
2016-05-05 Zalan Bujtas <[email protected]>
Do not attempt to compute min/max width.
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp (200488 => 200489)
--- trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp 2016-05-05 23:05:37 UTC (rev 200488)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp 2016-05-05 23:11:13 UTC (rev 200489)
@@ -588,7 +588,7 @@
ASSERT(currentThread() == m_database->originThreadID());
ASSERT(isVersionChange());
- m_database->serverConnection().createObjectStore(operation, info);
+ m_database->connectionProxy().createObjectStore(operation, info);
}
void IDBTransaction::didCreateObjectStoreOnServer(const IDBResultData& resultData)
@@ -619,7 +619,7 @@
ASSERT(currentThread() == m_database->originThreadID());
ASSERT(isVersionChange());
- m_database->serverConnection().createIndex(operation, info);
+ m_database->connectionProxy().createIndex(operation, info);
}
void IDBTransaction::didCreateIndexOnServer(const IDBResultData& resultData)
@@ -678,7 +678,7 @@
LOG(IndexedDB, "IDBTransaction::openCursorOnServer");
ASSERT(currentThread() == m_database->originThreadID());
- m_database->serverConnection().openCursor(operation, info);
+ m_database->connectionProxy().openCursor(operation, info);
}
void IDBTransaction::didOpenCursorOnServer(IDBRequest& request, const IDBResultData& resultData)
@@ -707,7 +707,7 @@
LOG(IndexedDB, "IDBTransaction::iterateCursorOnServer");
ASSERT(currentThread() == m_database->originThreadID());
- serverConnection().iterateCursor(operation, key, count);
+ m_database->connectionProxy().iterateCursor(operation, key, count);
}
void IDBTransaction::didIterateCursorOnServer(IDBRequest& request, const IDBResultData& resultData)
@@ -771,7 +771,7 @@
LOG(IndexedDB, "IDBTransaction::getRecordOnServer");
ASSERT(currentThread() == m_database->originThreadID());
- serverConnection().getRecord(operation, keyRange);
+ m_database->connectionProxy().getRecord(operation, keyRange);
}
void IDBTransaction::didGetRecordOnServer(IDBRequest& request, const IDBResultData& resultData)
@@ -838,7 +838,7 @@
LOG(IndexedDB, "IDBTransaction::getCountOnServer");
ASSERT(currentThread() == m_database->originThreadID());
- serverConnection().getCount(operation, keyRange);
+ m_database->connectionProxy().getCount(operation, keyRange);
}
void IDBTransaction::didGetCountOnServer(IDBRequest& request, const IDBResultData& resultData)
@@ -869,7 +869,7 @@
LOG(IndexedDB, "IDBTransaction::deleteRecordOnServer");
ASSERT(currentThread() == m_database->originThreadID());
- serverConnection().deleteRecord(operation, keyRange);
+ m_database->connectionProxy().deleteRecord(operation, keyRange);
}
void IDBTransaction::didDeleteRecordOnServer(IDBRequest& request, const IDBResultData& resultData)
@@ -902,7 +902,7 @@
LOG(IndexedDB, "IDBTransaction::clearObjectStoreOnServer");
ASSERT(currentThread() == m_database->originThreadID());
- serverConnection().clearObjectStore(operation, objectStoreIdentifier);
+ m_database->connectionProxy().clearObjectStore(operation, objectStoreIdentifier);
}
void IDBTransaction::didClearObjectStoreOnServer(IDBRequest& request, const IDBResultData& resultData)
@@ -939,7 +939,7 @@
ASSERT(value);
if (!value->hasBlobURLs()) {
- serverConnection().putOrAdd(operation, key.get(), *value, overwriteMode);
+ m_database->connectionProxy().putOrAdd(operation, key.get(), *value, overwriteMode);
return;
}
@@ -947,7 +947,7 @@
RefPtr<IDBClient::TransactionOperation> operationRef(&operation);
value->writeBlobsToDiskForIndexedDB([protector, this, operationRef, key, value, overwriteMode](const IDBValue& idbValue) {
if (idbValue.data().data()) {
- serverConnection().putOrAdd(*operationRef, key.get(), idbValue, overwriteMode);
+ m_database->connectionProxy().putOrAdd(*operationRef, key.get(), idbValue, overwriteMode);
return;
}
@@ -991,7 +991,7 @@
ASSERT(isVersionChange());
ASSERT(currentThread() == m_database->originThreadID());
- serverConnection().deleteObjectStore(operation, objectStoreName);
+ m_database->connectionProxy().deleteObjectStore(operation, objectStoreName);
}
void IDBTransaction::didDeleteObjectStoreOnServer(const IDBResultData& resultData)
@@ -1017,7 +1017,7 @@
ASSERT(isVersionChange());
ASSERT(currentThread() == m_database->originThreadID());
- serverConnection().deleteIndex(operation, objectStoreIdentifier, indexName);
+ m_database->connectionProxy().deleteIndex(operation, objectStoreIdentifier, indexName);
}
void IDBTransaction::didDeleteIndexOnServer(const IDBResultData& resultData)
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.cpp (200488 => 200489)
--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.cpp 2016-05-05 23:05:37 UTC (rev 200488)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.cpp 2016-05-05 23:11:13 UTC (rev 200489)
@@ -32,6 +32,7 @@
#include "IDBOpenDBRequest.h"
#include "IDBRequestData.h"
#include "IDBResultData.h"
+#include "SecurityOrigin.h"
#include <wtf/MainThread.h>
namespace WebCore {
@@ -133,6 +134,139 @@
request->requestCompleted(resultData);
}
+void IDBConnectionProxy::createObjectStore(TransactionOperation& operation, const IDBObjectStoreInfo& info)
+{
+ IDBRequestData requestData(operation);
+ saveOperation(operation);
+
+ // FIXME: Handle worker thread marshalling.
+
+ m_connectionToServer.createObjectStore(requestData, info);
+}
+
+void IDBConnectionProxy::deleteObjectStore(TransactionOperation& operation, const String& objectStoreName)
+{
+ IDBRequestData requestData(operation);
+ saveOperation(operation);
+
+ // FIXME: Handle worker thread marshalling.
+
+ m_connectionToServer.deleteObjectStore(requestData, objectStoreName);
+}
+
+void IDBConnectionProxy::clearObjectStore(TransactionOperation& operation, uint64_t objectStoreIdentifier)
+{
+ IDBRequestData requestData(operation);
+ saveOperation(operation);
+
+ // FIXME: Handle worker thread marshalling.
+
+ m_connectionToServer.clearObjectStore(requestData, objectStoreIdentifier);
+}
+
+void IDBConnectionProxy::createIndex(TransactionOperation& operation, const IDBIndexInfo& info)
+{
+ IDBRequestData requestData(operation);
+ saveOperation(operation);
+
+ // FIXME: Handle worker thread marshalling.
+
+ m_connectionToServer.createIndex(requestData, info);
+}
+
+void IDBConnectionProxy::deleteIndex(TransactionOperation& operation, uint64_t objectStoreIdentifier, const String& indexName)
+{
+ IDBRequestData requestData(operation);
+ saveOperation(operation);
+
+ // FIXME: Handle worker thread marshalling.
+
+ m_connectionToServer.deleteIndex(requestData, objectStoreIdentifier, indexName);
+}
+
+void IDBConnectionProxy::putOrAdd(TransactionOperation& operation, IDBKey* key, const IDBValue& value, const IndexedDB::ObjectStoreOverwriteMode mode)
+{
+ IDBRequestData requestData(operation);
+ saveOperation(operation);
+
+ // FIXME: Handle worker thread marshalling.
+
+ m_connectionToServer.putOrAdd(requestData, key, value, mode);
+}
+
+void IDBConnectionProxy::getRecord(TransactionOperation& operation, const IDBKeyRangeData& keyRange)
+{
+ IDBRequestData requestData(operation);
+ saveOperation(operation);
+
+ // FIXME: Handle worker thread marshalling.
+
+ m_connectionToServer.getRecord(requestData, keyRange);
+}
+
+void IDBConnectionProxy::getCount(TransactionOperation& operation, const IDBKeyRangeData& keyRange)
+{
+ IDBRequestData requestData(operation);
+ saveOperation(operation);
+
+ // FIXME: Handle worker thread marshalling.
+
+ m_connectionToServer.getCount(requestData, keyRange);
+}
+
+void IDBConnectionProxy::deleteRecord(TransactionOperation& operation, const IDBKeyRangeData& keyRange)
+{
+ IDBRequestData requestData(operation);
+ saveOperation(operation);
+
+ // FIXME: Handle worker thread marshalling.
+
+ m_connectionToServer.deleteRecord(requestData, keyRange);
+}
+
+void IDBConnectionProxy::openCursor(TransactionOperation& operation, const IDBCursorInfo& info)
+{
+ IDBRequestData requestData(operation);
+ saveOperation(operation);
+
+ // FIXME: Handle worker thread marshalling.
+
+ m_connectionToServer.openCursor(requestData, info);
+}
+
+void IDBConnectionProxy::iterateCursor(TransactionOperation& operation, const IDBKeyData& key, unsigned long count)
+{
+ IDBRequestData requestData(operation);
+ saveOperation(operation);
+
+ // FIXME: Handle worker thread marshalling.
+
+ m_connectionToServer.iterateCursor(requestData, key, count);
+}
+
+void IDBConnectionProxy::saveOperation(TransactionOperation& operation)
+{
+ Locker<Lock> locker(m_transactionOperationLock);
+
+ ASSERT(!m_activeOperations.contains(operation.identifier()));
+ m_activeOperations.set(operation.identifier(), &operation);
+}
+
+void IDBConnectionProxy::completeOperation(const IDBResultData& resultData)
+{
+ RefPtr<TransactionOperation> operation;
+ {
+ Locker<Lock> locker(m_transactionOperationLock);
+ operation = m_activeOperations.take(resultData.requestIdentifier());
+ }
+
+ ASSERT(operation);
+
+ // FIXME: Handle getting operation->completed() onto the correct thread via the IDBTransaction.
+
+ operation->completed(resultData);
+}
+
void IDBConnectionProxy::fireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier, uint64_t requestedVersion)
{
ASSERT(isMainThread());
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.h (200488 => 200489)
--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.h 2016-05-05 23:05:37 UTC (rev 200488)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.h 2016-05-05 23:11:13 UTC (rev 200489)
@@ -29,6 +29,7 @@
#include "IDBConnectionToServer.h"
#include "IDBResourceIdentifier.h"
+#include "TransactionOperation.h"
#include <functional>
#include <wtf/HashMap.h>
#include <wtf/RefPtr.h>
@@ -60,6 +61,18 @@
RefPtr<IDBOpenDBRequest> deleteDatabase(ScriptExecutionContext&, const IDBDatabaseIdentifier&);
void didDeleteDatabase(const IDBResultData&);
+ void createObjectStore(TransactionOperation&, const IDBObjectStoreInfo&);
+ void deleteObjectStore(TransactionOperation&, const String& objectStoreName);
+ void clearObjectStore(TransactionOperation&, uint64_t objectStoreIdentifier);
+ void createIndex(TransactionOperation&, const IDBIndexInfo&);
+ void deleteIndex(TransactionOperation&, uint64_t objectStoreIdentifier, const String& indexName);
+ void putOrAdd(TransactionOperation&, IDBKey*, const IDBValue&, const IndexedDB::ObjectStoreOverwriteMode);
+ void getRecord(TransactionOperation&, const IDBKeyRangeData&);
+ void getCount(TransactionOperation&, const IDBKeyRangeData&);
+ void deleteRecord(TransactionOperation&, const IDBKeyRangeData&);
+ void openCursor(TransactionOperation&, const IDBCursorInfo&);
+ void iterateCursor(TransactionOperation&, const IDBKeyData&, unsigned long count);
+
void fireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier, uint64_t requestedVersion);
void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier);
@@ -76,6 +89,8 @@
void didFinishHandlingVersionChangeTransaction(IDBTransaction&);
void databaseConnectionClosed(IDBDatabase&);
+ void completeOperation(const IDBResultData&);
+
uint64_t serverConnectionIdentifier() const { return m_serverConnectionIdentifier; }
// FIXME: Temporarily required during bringup of IDB-in-Workers.
@@ -95,6 +110,8 @@
void completeOpenDBRequest(const IDBResultData&);
bool hasRecordOfTransaction(const IDBTransaction&) const;
+ void saveOperation(TransactionOperation&);
+
IDBConnectionToServer& m_connectionToServer;
uint64_t m_serverConnectionIdentifier;
@@ -108,6 +125,9 @@
HashMap<IDBResourceIdentifier, RefPtr<IDBTransaction>> m_committingTransactions;
HashMap<IDBResourceIdentifier, RefPtr<IDBTransaction>> m_abortingTransactions;
Lock m_transactionMapLock;
+
+ HashMap<IDBResourceIdentifier, RefPtr<TransactionOperation>> m_activeOperations;
+ Lock m_transactionOperationLock;
};
} // namespace IDBClient
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp (200488 => 200489)
--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp 2016-05-05 23:05:37 UTC (rev 200488)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp 2016-05-05 23:11:13 UTC (rev 200489)
@@ -87,169 +87,161 @@
m_proxy->didOpenDatabase(resultData);
}
-void IDBConnectionToServer::createObjectStore(TransactionOperation& operation, const IDBObjectStoreInfo& info)
+void IDBConnectionToServer::createObjectStore(const IDBRequestData& requestData, const IDBObjectStoreInfo& info)
{
LOG(IndexedDB, "IDBConnectionToServer::createObjectStore");
+ ASSERT(isMainThread());
- saveOperation(operation);
-
- m_delegate->createObjectStore(IDBRequestData(operation), info);
+ m_delegate->createObjectStore(requestData, info);
}
void IDBConnectionToServer::didCreateObjectStore(const IDBResultData& resultData)
{
LOG(IndexedDB, "IDBConnectionToServer::didCreateObjectStore");
- completeOperation(resultData);
+ m_proxy->completeOperation(resultData);
}
-void IDBConnectionToServer::deleteObjectStore(TransactionOperation& operation, const String& objectStoreName)
+void IDBConnectionToServer::deleteObjectStore(const IDBRequestData& requestData, const String& objectStoreName)
{
LOG(IndexedDB, "IDBConnectionToServer::deleteObjectStore");
+ ASSERT(isMainThread());
- saveOperation(operation);
-
- m_delegate->deleteObjectStore(IDBRequestData(operation), objectStoreName);
+ m_delegate->deleteObjectStore(requestData, objectStoreName);
}
void IDBConnectionToServer::didDeleteObjectStore(const IDBResultData& resultData)
{
LOG(IndexedDB, "IDBConnectionToServer::didDeleteObjectStore");
- completeOperation(resultData);
+ m_proxy->completeOperation(resultData);
}
-void IDBConnectionToServer::clearObjectStore(TransactionOperation& operation, uint64_t objectStoreIdentifier)
+void IDBConnectionToServer::clearObjectStore(const IDBRequestData& requestData, uint64_t objectStoreIdentifier)
{
LOG(IndexedDB, "IDBConnectionToServer::clearObjectStore");
+ ASSERT(isMainThread());
- saveOperation(operation);
-
- m_delegate->clearObjectStore(IDBRequestData(operation), objectStoreIdentifier);
+ m_delegate->clearObjectStore(requestData, objectStoreIdentifier);
}
void IDBConnectionToServer::didClearObjectStore(const IDBResultData& resultData)
{
LOG(IndexedDB, "IDBConnectionToServer::didClearObjectStore");
- completeOperation(resultData);
+ m_proxy->completeOperation(resultData);
}
-void IDBConnectionToServer::createIndex(TransactionOperation& operation, const IDBIndexInfo& info)
+void IDBConnectionToServer::createIndex(const IDBRequestData& requestData, const IDBIndexInfo& info)
{
LOG(IndexedDB, "IDBConnectionToServer::createIndex");
+ ASSERT(isMainThread());
- saveOperation(operation);
-
- m_delegate->createIndex(IDBRequestData(operation), info);
+ m_delegate->createIndex(requestData, info);
}
void IDBConnectionToServer::didCreateIndex(const IDBResultData& resultData)
{
LOG(IndexedDB, "IDBConnectionToServer::didCreateIndex");
- completeOperation(resultData);
+ m_proxy->completeOperation(resultData);
}
-void IDBConnectionToServer::deleteIndex(TransactionOperation& operation, uint64_t objectStoreIdentifier, const String& indexName)
+void IDBConnectionToServer::deleteIndex(const IDBRequestData& requestData, uint64_t objectStoreIdentifier, const String& indexName)
{
LOG(IndexedDB, "IDBConnectionToServer::deleteIndex");
+ ASSERT(isMainThread());
- saveOperation(operation);
-
- m_delegate->deleteIndex(IDBRequestData(operation), objectStoreIdentifier, indexName);
+ m_delegate->deleteIndex(requestData, objectStoreIdentifier, indexName);
}
void IDBConnectionToServer::didDeleteIndex(const IDBResultData& resultData)
{
LOG(IndexedDB, "IDBConnectionToServer::didDeleteIndex");
- completeOperation(resultData);
+ m_proxy->completeOperation(resultData);
}
-void IDBConnectionToServer::putOrAdd(TransactionOperation& operation, IDBKey* key, const IDBValue& value, const IndexedDB::ObjectStoreOverwriteMode overwriteMode)
+void IDBConnectionToServer::putOrAdd(const IDBRequestData& requestData, IDBKey* key, const IDBValue& value, const IndexedDB::ObjectStoreOverwriteMode overwriteMode)
{
LOG(IndexedDB, "IDBConnectionToServer::putOrAdd");
+ ASSERT(isMainThread());
- saveOperation(operation);
- m_delegate->putOrAdd(IDBRequestData(operation), key, value, overwriteMode);
+ m_delegate->putOrAdd(requestData, key, value, overwriteMode);
}
void IDBConnectionToServer::didPutOrAdd(const IDBResultData& resultData)
{
LOG(IndexedDB, "IDBConnectionToServer::didPutOrAdd");
- completeOperation(resultData);
+ m_proxy->completeOperation(resultData);
}
-void IDBConnectionToServer::getRecord(TransactionOperation& operation, const IDBKeyRangeData& keyRangeData)
+void IDBConnectionToServer::getRecord(const IDBRequestData& requestData, const IDBKeyRangeData& keyRangeData)
{
LOG(IndexedDB, "IDBConnectionToServer::getRecord");
-
+ ASSERT(isMainThread());
ASSERT(!keyRangeData.isNull);
- saveOperation(operation);
- m_delegate->getRecord(IDBRequestData(operation), keyRangeData);
+ m_delegate->getRecord(requestData, keyRangeData);
}
void IDBConnectionToServer::didGetRecord(const IDBResultData& resultData)
{
LOG(IndexedDB, "IDBConnectionToServer::didGetRecord");
- completeOperation(resultData);
+ m_proxy->completeOperation(resultData);
}
-void IDBConnectionToServer::getCount(TransactionOperation& operation, const IDBKeyRangeData& keyRangeData)
+void IDBConnectionToServer::getCount(const IDBRequestData& requestData, const IDBKeyRangeData& keyRangeData)
{
LOG(IndexedDB, "IDBConnectionToServer::getCount");
-
+ ASSERT(isMainThread());
ASSERT(!keyRangeData.isNull);
- saveOperation(operation);
- m_delegate->getCount(IDBRequestData(operation), keyRangeData);
+ m_delegate->getCount(requestData, keyRangeData);
}
void IDBConnectionToServer::didGetCount(const IDBResultData& resultData)
{
LOG(IndexedDB, "IDBConnectionToServer::didGetCount");
- completeOperation(resultData);
+ m_proxy->completeOperation(resultData);
}
-void IDBConnectionToServer::deleteRecord(TransactionOperation& operation, const IDBKeyRangeData& keyRangeData)
+void IDBConnectionToServer::deleteRecord(const IDBRequestData& requestData, const IDBKeyRangeData& keyRangeData)
{
LOG(IndexedDB, "IDBConnectionToServer::deleteRecord");
-
+ ASSERT(isMainThread());
ASSERT(!keyRangeData.isNull);
- saveOperation(operation);
- m_delegate->deleteRecord(IDBRequestData(operation), keyRangeData);
+ m_delegate->deleteRecord(requestData, keyRangeData);
}
void IDBConnectionToServer::didDeleteRecord(const IDBResultData& resultData)
{
LOG(IndexedDB, "IDBConnectionToServer::didDeleteRecord");
- completeOperation(resultData);
+ m_proxy->completeOperation(resultData);
}
-void IDBConnectionToServer::openCursor(TransactionOperation& operation, const IDBCursorInfo& info)
+void IDBConnectionToServer::openCursor(const IDBRequestData& requestData, const IDBCursorInfo& info)
{
LOG(IndexedDB, "IDBConnectionToServer::openCursor");
+ ASSERT(isMainThread());
- saveOperation(operation);
- m_delegate->openCursor(IDBRequestData(operation), info);
+ m_delegate->openCursor(requestData, info);
}
void IDBConnectionToServer::didOpenCursor(const IDBResultData& resultData)
{
LOG(IndexedDB, "IDBConnectionToServer::didOpenCursor");
- completeOperation(resultData);
+ m_proxy->completeOperation(resultData);
}
-void IDBConnectionToServer::iterateCursor(TransactionOperation& operation, const IDBKeyData& key, unsigned long count)
+void IDBConnectionToServer::iterateCursor(const IDBRequestData& requestData, const IDBKeyData& key, unsigned long count)
{
LOG(IndexedDB, "IDBConnectionToServer::iterateCursor");
+ ASSERT(isMainThread());
- saveOperation(operation);
- m_delegate->iterateCursor(IDBRequestData(operation), key, count);
+ m_delegate->iterateCursor(requestData, key, count);
}
void IDBConnectionToServer::didIterateCursor(const IDBResultData& resultData)
{
LOG(IndexedDB, "IDBConnectionToServer::didIterateCursor");
- completeOperation(resultData);
+ m_proxy->completeOperation(resultData);
}
void IDBConnectionToServer::establishTransaction(uint64_t databaseConnectionIdentifier, const IDBTransactionInfo& info)
@@ -347,20 +339,6 @@
m_delegate->abortOpenAndUpgradeNeeded(databaseConnectionIdentifier, transactionIdentifier);
}
-void IDBConnectionToServer::saveOperation(TransactionOperation& operation)
-{
- ASSERT(!m_activeOperations.contains(operation.identifier()));
- m_activeOperations.set(operation.identifier(), &operation);
-}
-
-void IDBConnectionToServer::completeOperation(const IDBResultData& resultData)
-{
- auto operation = m_activeOperations.take(resultData.requestIdentifier());
- ASSERT(operation);
-
- operation->completed(resultData);
-}
-
void IDBConnectionToServer::getAllDatabaseNames(const SecurityOrigin& mainFrameOrigin, const SecurityOrigin& openingOrigin, std::function<void (const Vector<String>&)> callback)
{
static uint64_t callbackID = 0;
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h (200488 => 200489)
--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h 2016-05-05 23:05:37 UTC (rev 200488)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h 2016-05-05 23:11:13 UTC (rev 200489)
@@ -30,7 +30,6 @@
#include "IDBConnectionProxy.h"
#include "IDBConnectionToServerDelegate.h"
#include "IDBResourceIdentifier.h"
-#include "TransactionOperation.h"
#include <wtf/HashMap.h>
#include <wtf/HashSet.h>
#include <wtf/Ref.h>
@@ -44,11 +43,10 @@
class IDBObjectStoreInfo;
class IDBResultData;
class IDBValue;
+class SecurityOrigin;
namespace IDBClient {
-class TransactionOperation;
-
class IDBConnectionToServer : public ThreadSafeRefCounted<IDBConnectionToServer> {
public:
WEBCORE_EXPORT static Ref<IDBConnectionToServer> create(IDBConnectionToServerDelegate&);
@@ -63,37 +61,37 @@
void openDatabase(const IDBRequestData&);
WEBCORE_EXPORT void didOpenDatabase(const IDBResultData&);
- void createObjectStore(TransactionOperation&, const IDBObjectStoreInfo&);
+ void createObjectStore(const IDBRequestData&, const IDBObjectStoreInfo&);
WEBCORE_EXPORT void didCreateObjectStore(const IDBResultData&);
- void deleteObjectStore(TransactionOperation&, const String& objectStoreName);
+ void deleteObjectStore(const IDBRequestData&, const String& objectStoreName);
WEBCORE_EXPORT void didDeleteObjectStore(const IDBResultData&);
- void clearObjectStore(TransactionOperation&, uint64_t objectStoreIdentifier);
+ void clearObjectStore(const IDBRequestData&, uint64_t objectStoreIdentifier);
WEBCORE_EXPORT void didClearObjectStore(const IDBResultData&);
- void createIndex(TransactionOperation&, const IDBIndexInfo&);
+ void createIndex(const IDBRequestData&, const IDBIndexInfo&);
WEBCORE_EXPORT void didCreateIndex(const IDBResultData&);
- void deleteIndex(TransactionOperation&, uint64_t objectStoreIdentifier, const String& indexName);
+ void deleteIndex(const IDBRequestData&, uint64_t objectStoreIdentifier, const String& indexName);
WEBCORE_EXPORT void didDeleteIndex(const IDBResultData&);
- void putOrAdd(TransactionOperation&, IDBKey*, const IDBValue&, const IndexedDB::ObjectStoreOverwriteMode);
+ void putOrAdd(const IDBRequestData&, IDBKey*, const IDBValue&, const IndexedDB::ObjectStoreOverwriteMode);
WEBCORE_EXPORT void didPutOrAdd(const IDBResultData&);
- void getRecord(TransactionOperation&, const IDBKeyRangeData&);
+ void getRecord(const IDBRequestData&, const IDBKeyRangeData&);
WEBCORE_EXPORT void didGetRecord(const IDBResultData&);
- void getCount(TransactionOperation&, const IDBKeyRangeData&);
+ void getCount(const IDBRequestData&, const IDBKeyRangeData&);
WEBCORE_EXPORT void didGetCount(const IDBResultData&);
- void deleteRecord(TransactionOperation&, const IDBKeyRangeData&);
+ void deleteRecord(const IDBRequestData&, const IDBKeyRangeData&);
WEBCORE_EXPORT void didDeleteRecord(const IDBResultData&);
- void openCursor(TransactionOperation&, const IDBCursorInfo&);
+ void openCursor(const IDBRequestData&, const IDBCursorInfo&);
WEBCORE_EXPORT void didOpenCursor(const IDBResultData&);
- void iterateCursor(TransactionOperation&, const IDBKeyData&, unsigned long count);
+ void iterateCursor(const IDBRequestData&, const IDBKeyData&, unsigned long count);
WEBCORE_EXPORT void didIterateCursor(const IDBResultData&);
void commitTransaction(const IDBResourceIdentifier& transactionIdentifier);
@@ -124,13 +122,8 @@
private:
IDBConnectionToServer(IDBConnectionToServerDelegate&);
- void saveOperation(TransactionOperation&);
- void completeOperation(const IDBResultData&);
-
Ref<IDBConnectionToServerDelegate> m_delegate;
- HashMap<IDBResourceIdentifier, RefPtr<TransactionOperation>> m_activeOperations;
-
HashMap<uint64_t, std::function<void (const Vector<String>&)>> m_getAllDatabaseNamesCallbacks;
std::unique_ptr<IDBConnectionProxy> m_proxy;
Modified: trunk/Source/WebCore/Modules/indexeddb/client/TransactionOperation.h (200488 => 200489)
--- trunk/Source/WebCore/Modules/indexeddb/client/TransactionOperation.h 2016-05-05 23:05:37 UTC (rev 200488)
+++ trunk/Source/WebCore/Modules/indexeddb/client/TransactionOperation.h 2016-05-05 23:11:13 UTC (rev 200489)
@@ -29,8 +29,10 @@
#if ENABLE(INDEXED_DATABASE)
#include "IDBRequest.h"
+#include "IDBRequestData.h"
#include "IDBResourceIdentifier.h"
#include "IDBTransaction.h"
+#include <wtf/Threading.h>
namespace WebCore {
@@ -43,9 +45,16 @@
namespace IDBClient {
class TransactionOperation : public ThreadSafeRefCounted<TransactionOperation> {
+ friend IDBRequestData::IDBRequestData(TransactionOperation&);
public:
+ virtual ~TransactionOperation()
+ {
+ ASSERT(m_originThreadID == currentThread());
+ }
+
void perform()
{
+ ASSERT(m_originThreadID == currentThread());
ASSERT(m_performFunction);
m_performFunction();
m_performFunction = { };
@@ -53,6 +62,7 @@
void completed(const IDBResultData& data)
{
+ ASSERT(m_originThreadID == currentThread());
ASSERT(m_completeFunction);
m_completeFunction(data);
m_transaction->operationDidComplete(*this);
@@ -60,13 +70,9 @@
}
const IDBResourceIdentifier& identifier() const { return m_identifier; }
- IDBResourceIdentifier transactionIdentifier() const { return m_transaction->info().identifier(); }
- uint64_t objectStoreIdentifier() const { return m_objectStoreIdentifier; }
- uint64_t indexIdentifier() const { return m_indexIdentifier; }
- IDBResourceIdentifier* cursorIdentifier() const { return m_cursorIdentifier.get(); }
- IDBTransaction& transaction() { return m_transaction.get(); }
- IndexedDB::IndexRecordType indexRecordType() const { return m_indexRecordType; }
+ ThreadIdentifier originThreadID() const { return m_originThreadID; }
+
protected:
TransactionOperation(IDBTransaction& transaction)
: m_transaction(transaction)
@@ -84,6 +90,16 @@
IndexedDB::IndexRecordType m_indexRecordType;
std::function<void ()> m_performFunction;
std::function<void (const IDBResultData&)> m_completeFunction;
+
+private:
+ IDBResourceIdentifier transactionIdentifier() const { return m_transaction->info().identifier(); }
+ uint64_t objectStoreIdentifier() const { return m_objectStoreIdentifier; }
+ uint64_t indexIdentifier() const { return m_indexIdentifier; }
+ IDBResourceIdentifier* cursorIdentifier() const { return m_cursorIdentifier.get(); }
+ IDBTransaction& transaction() { return m_transaction.get(); }
+ IndexedDB::IndexRecordType indexRecordType() const { return m_indexRecordType; }
+
+ ThreadIdentifier m_originThreadID { currentThread() };
};
template <typename... Arguments>