Title: [200489] trunk/Source/WebCore
Revision
200489
Author
[email protected]
Date
2016-05-05 16:11:13 -0700 (Thu, 05 May 2016)

Log Message

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):

Modified Paths

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>
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to