Changeset 200485 in webkit
- Timestamp:
- May 5, 2016, 3:14:08 PM (9 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r200484 r200485 1 2016-05-04 Brady Eidson <beidson@apple.com> 2 3 Modern IDB: Move all IDB DOM object management from IDBConnectionToServer to IDBConnectionProxy. 4 https://bugs.webkit.org/show_bug.cgi?id=157348 5 6 Reviewed by Alex Christensen. 7 8 No new tests (Refactor, no change in behavior yet). 9 10 This is in-progress IDB-in-Workers code that is isolated enough to land right now. 11 12 The goal is to have IDBConnectionToServer be a main-thread-only object, leaving IDBConnectionProxy 13 as the threading bridge between the worker thread and the main thread. 14 15 As such, IDBConnectionToServer no longer maintains maps of IDB DOM objects, but instead the proxy 16 does and guards that access with locks. 17 18 No threading changes takes place in this patch but it does scatter some isMainThread() checks and FIXMEs 19 accurately representing where threading changes will take place once I can return to this. 20 21 * Modules/indexeddb/IDBDatabase.cpp: 22 (WebCore::IDBDatabase::IDBDatabase): 23 (WebCore::IDBDatabase::~IDBDatabase): 24 (WebCore::IDBDatabase::maybeCloseInServer): 25 26 * Modules/indexeddb/IDBOpenDBRequest.cpp: 27 (WebCore::IDBOpenDBRequest::dispatchEvent): 28 29 * Modules/indexeddb/IDBTransaction.cpp: 30 (WebCore::IDBTransaction::abortOnServerAndCancelRequests): 31 (WebCore::IDBTransaction::commitOnServer): 32 (WebCore::IDBTransaction::establishOnServer): 33 34 * Modules/indexeddb/client/IDBConnectionProxy.cpp: 35 (WebCore::IDBClient::IDBConnectionProxy::openDatabase): 36 (WebCore::IDBClient::IDBConnectionProxy::deleteDatabase): 37 (WebCore::IDBClient::IDBConnectionProxy::didOpenDatabase): 38 (WebCore::IDBClient::IDBConnectionProxy::didDeleteDatabase): 39 (WebCore::IDBClient::IDBConnectionProxy::completeOpenDBRequest): 40 (WebCore::IDBClient::IDBConnectionProxy::fireVersionChangeEvent): 41 (WebCore::IDBClient::IDBConnectionProxy::didFireVersionChangeEvent): 42 (WebCore::IDBClient::IDBConnectionProxy::notifyOpenDBRequestBlocked): 43 (WebCore::IDBClient::IDBConnectionProxy::establishTransaction): 44 (WebCore::IDBClient::IDBConnectionProxy::didStartTransaction): 45 (WebCore::IDBClient::IDBConnectionProxy::commitTransaction): 46 (WebCore::IDBClient::IDBConnectionProxy::didCommitTransaction): 47 (WebCore::IDBClient::IDBConnectionProxy::abortTransaction): 48 (WebCore::IDBClient::IDBConnectionProxy::didAbortTransaction): 49 (WebCore::IDBClient::IDBConnectionProxy::hasRecordOfTransaction): 50 (WebCore::IDBClient::IDBConnectionProxy::didFinishHandlingVersionChangeTransaction): 51 (WebCore::IDBClient::IDBConnectionProxy::databaseConnectionClosed): 52 (WebCore::IDBClient::IDBConnectionProxy::registerDatabaseConnection): 53 (WebCore::IDBClient::IDBConnectionProxy::unregisterDatabaseConnection): 54 * Modules/indexeddb/client/IDBConnectionProxy.h: 55 56 * Modules/indexeddb/client/IDBConnectionToServer.cpp: 57 (WebCore::IDBClient::IDBConnectionToServer::deleteDatabase): 58 (WebCore::IDBClient::IDBConnectionToServer::didDeleteDatabase): 59 (WebCore::IDBClient::IDBConnectionToServer::openDatabase): 60 (WebCore::IDBClient::IDBConnectionToServer::didOpenDatabase): 61 (WebCore::IDBClient::IDBConnectionToServer::establishTransaction): 62 (WebCore::IDBClient::IDBConnectionToServer::commitTransaction): 63 (WebCore::IDBClient::IDBConnectionToServer::didCommitTransaction): 64 (WebCore::IDBClient::IDBConnectionToServer::didFinishHandlingVersionChangeTransaction): 65 (WebCore::IDBClient::IDBConnectionToServer::abortTransaction): 66 (WebCore::IDBClient::IDBConnectionToServer::didAbortTransaction): 67 (WebCore::IDBClient::IDBConnectionToServer::fireVersionChangeEvent): 68 (WebCore::IDBClient::IDBConnectionToServer::didFireVersionChangeEvent): 69 (WebCore::IDBClient::IDBConnectionToServer::didStartTransaction): 70 (WebCore::IDBClient::IDBConnectionToServer::notifyOpenDBRequestBlocked): 71 (WebCore::IDBClient::IDBConnectionToServer::databaseConnectionClosed): 72 (WebCore::IDBClient::IDBConnectionToServer::registerDatabaseConnection): Deleted. 73 (WebCore::IDBClient::IDBConnectionToServer::unregisterDatabaseConnection): Deleted. 74 (WebCore::IDBClient::IDBConnectionToServer::hasRecordOfTransaction): Deleted. 75 * Modules/indexeddb/client/IDBConnectionToServer.h: 76 77 * Modules/indexeddb/shared/IDBRequestData.cpp: 78 (WebCore::IDBRequestData::IDBRequestData): 79 * Modules/indexeddb/shared/IDBRequestData.h: 80 81 * Modules/indexeddb/shared/IDBResourceIdentifier.cpp: 82 (WebCore::IDBResourceIdentifier::IDBResourceIdentifier): 83 * Modules/indexeddb/shared/IDBResourceIdentifier.h: 84 1 85 2016-05-04 Brady Eidson <beidson@apple.com> 2 86 -
trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.cpp
r200483 r200485 57 57 LOG(IndexedDB, "IDBDatabase::IDBDatabase - Creating database %s with version %" PRIu64 " connection %" PRIu64, m_info.name().utf8().data(), m_info.version(), m_databaseConnectionIdentifier); 58 58 suspendIfNeeded(); 59 relaxAdoptionRequirement(); 60 m_connectionProxy->connectionToServer().registerDatabaseConnection(*this); 59 m_connectionProxy->registerDatabaseConnection(*this); 61 60 } 62 61 … … 64 63 { 65 64 ASSERT(currentThread() == m_originThreadID); 66 m_connectionProxy-> connectionToServer().unregisterDatabaseConnection(*this);65 m_connectionProxy->unregisterDatabaseConnection(*this); 67 66 } 68 67 … … 263 262 264 263 m_closedInServer = true; 265 m_connectionProxy-> connectionToServer().databaseConnectionClosed(*this);264 m_connectionProxy->databaseConnectionClosed(*this); 266 265 } 267 266 -
trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.h
r200483 r200485 44 44 class IDBTransactionInfo; 45 45 46 class IDBDatabase : public RefCounted<IDBDatabase>, public EventTargetWithInlineData, public ActiveDOMObject {46 class IDBDatabase : public ThreadSafeRefCounted<IDBDatabase>, public EventTargetWithInlineData, public ActiveDOMObject { 47 47 public: 48 48 static Ref<IDBDatabase> create(ScriptExecutionContext&, IDBClient::IDBConnectionProxy&, const IDBResultData&); … … 65 65 EventTargetInterface eventTargetInterface() const final { return IDBDatabaseEventTargetInterfaceType; } 66 66 ScriptExecutionContext* scriptExecutionContext() const final { return ActiveDOMObject::scriptExecutionContext(); } 67 void refEventTarget() final { RefCounted<IDBDatabase>::ref(); }68 void derefEventTarget() final { RefCounted<IDBDatabase>::deref(); }67 void refEventTarget() final { ThreadSafeRefCounted<IDBDatabase>::ref(); } 68 void derefEventTarget() final { ThreadSafeRefCounted<IDBDatabase>::deref(); } 69 69 70 using RefCounted<IDBDatabase>::ref;71 using RefCounted<IDBDatabase>::deref;70 using ThreadSafeRefCounted<IDBDatabase>::ref; 71 using ThreadSafeRefCounted<IDBDatabase>::deref; 72 72 73 73 const char* activeDOMObjectName() const final; -
trunk/Source/WebCore/Modules/indexeddb/IDBOpenDBRequest.cpp
r200483 r200485 119 119 120 120 if (m_transaction && m_transaction->isVersionChange() && (event.type() == eventNames().errorEvent || event.type() == eventNames().successEvent)) 121 m_transaction->database(). serverConnection().didFinishHandlingVersionChangeTransaction(*m_transaction);121 m_transaction->database().connectionProxy().didFinishHandlingVersionChangeTransaction(*m_transaction); 122 122 123 123 return result; -
trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp
r200483 r200485 134 134 ASSERT(currentThread() == m_database->originThreadID()); 135 135 136 relaxAdoptionRequirement();137 138 136 if (m_info.mode() == IndexedDB::TransactionMode::VersionChange) { 139 137 ASSERT(m_openDBRequest); … … 296 294 ASSERT(m_transactionOperationQueue.isEmpty()); 297 295 298 serverConnection().abortTransaction(*this);296 m_database->connectionProxy().abortTransaction(*this); 299 297 300 298 ASSERT(m_transactionOperationMap.contains(operation.identifier())); … … 433 431 ASSERT(currentThread() == m_database->originThreadID()); 434 432 435 serverConnection().commitTransaction(*this);433 m_database->connectionProxy().commitTransaction(*this); 436 434 437 435 ASSERT(m_transactionOperationMap.contains(operation.identifier())); … … 1045 1043 ASSERT(currentThread() == m_database->originThreadID()); 1046 1044 1047 serverConnection().establishTransaction(*this);1045 m_database->connectionProxy().establishTransaction(*this); 1048 1046 } 1049 1047 -
trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.h
r199843 r200485 59 59 } 60 60 61 class IDBTransaction : public RefCounted<IDBTransaction>, public EventTargetWithInlineData, private ActiveDOMObject {61 class IDBTransaction : public ThreadSafeRefCounted<IDBTransaction>, public EventTargetWithInlineData, private ActiveDOMObject { 62 62 public: 63 63 static const AtomicString& modeReadOnly(); … … 84 84 EventTargetInterface eventTargetInterface() const final { return IDBTransactionEventTargetInterfaceType; } 85 85 ScriptExecutionContext* scriptExecutionContext() const final { return ActiveDOMObject::scriptExecutionContext(); } 86 void refEventTarget() final { RefCounted::ref(); }87 void derefEventTarget() final { RefCounted::deref(); }86 void refEventTarget() final { ThreadSafeRefCounted::ref(); } 87 void derefEventTarget() final { ThreadSafeRefCounted::deref(); } 88 88 using EventTarget::dispatchEvent; 89 89 bool dispatchEvent(Event&) final; 90 90 91 using RefCounted<IDBTransaction>::ref;92 using RefCounted<IDBTransaction>::deref;91 using ThreadSafeRefCounted<IDBTransaction>::ref; 92 using ThreadSafeRefCounted<IDBTransaction>::deref; 93 93 94 94 const char* activeDOMObjectName() const final; -
trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.cpp
r200163 r200485 29 29 #if ENABLE(INDEXED_DATABASE) 30 30 31 #include "IDBDatabase.h" 31 32 #include "IDBOpenDBRequest.h" 33 #include "IDBRequestData.h" 34 #include "IDBResultData.h" 32 35 #include <wtf/MainThread.h> 33 36 … … 67 70 return nullptr; 68 71 69 auto request = IDBOpenDBRequest::createOpenRequest(context, *this, databaseIdentifier, version); 70 m_connectionToServer.openDatabase(request.get()); 71 return WTFMove(request); 72 RefPtr<IDBOpenDBRequest> request; 73 { 74 Locker<Lock> locker(m_openDBRequestMapLock); 75 76 request = IDBOpenDBRequest::createOpenRequest(context, *this, databaseIdentifier, version); 77 ASSERT(!m_openDBRequestMap.contains(request->resourceIdentifier())); 78 m_openDBRequestMap.set(request->resourceIdentifier(), request.get()); 79 } 80 81 IDBRequestData requestData(*this, *request); 82 83 // FIXME: For workers, marshall this to the main thread if necessary. 84 m_connectionToServer.openDatabase(requestData); 85 86 return request; 72 87 } 73 88 … … 78 93 return nullptr; 79 94 80 auto request = IDBOpenDBRequest::createDeleteRequest(context, *this, databaseIdentifier); 81 m_connectionToServer.deleteDatabase(request.get()); 82 return WTFMove(request); 95 RefPtr<IDBOpenDBRequest> request; 96 { 97 Locker<Lock> locker(m_openDBRequestMapLock); 98 99 request = IDBOpenDBRequest::createDeleteRequest(context, *this, databaseIdentifier); 100 ASSERT(!m_openDBRequestMap.contains(request->resourceIdentifier())); 101 m_openDBRequestMap.set(request->resourceIdentifier(), request.get()); 102 } 103 104 IDBRequestData requestData(*this, *request); 105 106 // FIXME: For workers, marshall this to the main thread if necessary. 107 m_connectionToServer.deleteDatabase(requestData); 108 109 return request; 110 } 111 112 void IDBConnectionProxy::didOpenDatabase(const IDBResultData& resultData) 113 { 114 completeOpenDBRequest(resultData); 115 } 116 117 void IDBConnectionProxy::didDeleteDatabase(const IDBResultData& resultData) 118 { 119 completeOpenDBRequest(resultData); 120 } 121 122 void IDBConnectionProxy::completeOpenDBRequest(const IDBResultData& resultData) 123 { 124 ASSERT(isMainThread()); 125 126 RefPtr<IDBOpenDBRequest> request; 127 { 128 Locker<Lock> locker(m_openDBRequestMapLock); 129 request = m_openDBRequestMap.get(resultData.requestIdentifier()); 130 ASSERT(request); 131 } 132 133 request->requestCompleted(resultData); 134 } 135 136 void IDBConnectionProxy::fireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier, uint64_t requestedVersion) 137 { 138 ASSERT(isMainThread()); 139 140 RefPtr<IDBDatabase> database; 141 { 142 Locker<Lock> locker(m_databaseConnectionMapLock); 143 database = m_databaseConnectionMap.get(databaseConnectionIdentifier); 144 } 145 146 if (!database) 147 return; 148 149 database->fireVersionChangeEvent(requestIdentifier, requestedVersion); 150 } 151 152 void IDBConnectionProxy::didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier) 153 { 154 // FIXME: Handle Workers 155 if (!isMainThread()) 156 return; 157 158 m_connectionToServer.didFireVersionChangeEvent(databaseConnectionIdentifier, requestIdentifier); 159 } 160 161 void IDBConnectionProxy::notifyOpenDBRequestBlocked(const IDBResourceIdentifier& requestIdentifier, uint64_t oldVersion, uint64_t newVersion) 162 { 163 ASSERT(isMainThread()); 164 165 RefPtr<IDBOpenDBRequest> request; 166 { 167 Locker<Lock> locker(m_openDBRequestMapLock); 168 request = m_openDBRequestMap.get(requestIdentifier); 169 } 170 171 ASSERT(request); 172 173 request->requestBlocked(oldVersion, newVersion); 174 } 175 176 void IDBConnectionProxy::establishTransaction(IDBTransaction& transaction) 177 { 178 { 179 Locker<Lock> locker(m_transactionMapLock); 180 ASSERT(!hasRecordOfTransaction(transaction)); 181 m_pendingTransactions.set(transaction.info().identifier(), &transaction); 182 } 183 184 // FIXME: Handle Workers 185 if (!isMainThread()) 186 return; 187 188 m_connectionToServer.establishTransaction(transaction.database().databaseConnectionIdentifier(), transaction.info()); 189 } 190 191 void IDBConnectionProxy::didStartTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError& error) 192 { 193 RefPtr<IDBTransaction> transaction; 194 { 195 Locker<Lock> locker(m_transactionMapLock); 196 transaction = m_pendingTransactions.take(transactionIdentifier); 197 } 198 199 ASSERT(transaction); 200 201 // FIXME: Handle hopping to the Worker thread here if necessary. 202 203 transaction->didStart(error); 204 } 205 206 void IDBConnectionProxy::commitTransaction(IDBTransaction& transaction) 207 { 208 { 209 Locker<Lock> locker(m_transactionMapLock); 210 ASSERT(!m_committingTransactions.contains(transaction.info().identifier())); 211 m_committingTransactions.set(transaction.info().identifier(), &transaction); 212 } 213 214 // FIXME: Handle Workers 215 if (!isMainThread()) 216 return; 217 218 m_connectionToServer.commitTransaction(transaction.info().identifier()); 219 } 220 221 void IDBConnectionProxy::didCommitTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError& error) 222 { 223 RefPtr<IDBTransaction> transaction; 224 { 225 Locker<Lock> locker(m_transactionMapLock); 226 transaction = m_committingTransactions.take(transactionIdentifier); 227 } 228 229 ASSERT(transaction); 230 231 // FIXME: Handle hopping to the Worker thread here if necessary. 232 233 transaction->didCommit(error); 234 } 235 236 void IDBConnectionProxy::abortTransaction(IDBTransaction& transaction) 237 { 238 { 239 Locker<Lock> locker(m_transactionMapLock); 240 ASSERT(!m_abortingTransactions.contains(transaction.info().identifier())); 241 m_abortingTransactions.set(transaction.info().identifier(), &transaction); 242 } 243 244 // FIXME: Handle Workers 245 if (!isMainThread()) 246 return; 247 248 m_connectionToServer.abortTransaction(transaction.info().identifier()); 249 } 250 251 void IDBConnectionProxy::didAbortTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError& error) 252 { 253 RefPtr<IDBTransaction> transaction; 254 { 255 Locker<Lock> locker(m_transactionMapLock); 256 transaction = m_abortingTransactions.take(transactionIdentifier); 257 } 258 259 ASSERT(transaction); 260 261 // FIXME: Handle hopping to the Worker thread here if necessary. 262 263 transaction->didAbort(error); 264 } 265 266 bool IDBConnectionProxy::hasRecordOfTransaction(const IDBTransaction& transaction) const 267 { 268 ASSERT(m_transactionMapLock.isLocked()); 269 270 auto identifier = transaction.info().identifier(); 271 return m_pendingTransactions.contains(identifier) || m_committingTransactions.contains(identifier) || m_abortingTransactions.contains(identifier); 272 } 273 274 void IDBConnectionProxy::didFinishHandlingVersionChangeTransaction(IDBTransaction& transaction) 275 { 276 // FIXME: Handle Workers 277 if (!isMainThread()) 278 return; 279 280 m_connectionToServer.didFinishHandlingVersionChangeTransaction(transaction.info().identifier()); 281 } 282 283 void IDBConnectionProxy::databaseConnectionClosed(IDBDatabase& database) 284 { 285 // FIXME: Handle Workers 286 if (!isMainThread()) 287 return; 288 289 m_connectionToServer.databaseConnectionClosed(database.databaseConnectionIdentifier()); 83 290 } 84 291 … … 91 298 } 92 299 300 void IDBConnectionProxy::registerDatabaseConnection(IDBDatabase& database) 301 { 302 Locker<Lock> locker(m_databaseConnectionMapLock); 303 304 ASSERT(!m_databaseConnectionMap.contains(database.databaseConnectionIdentifier())); 305 m_databaseConnectionMap.set(database.databaseConnectionIdentifier(), &database); 306 } 307 308 void IDBConnectionProxy::unregisterDatabaseConnection(IDBDatabase& database) 309 { 310 Locker<Lock> locker(m_databaseConnectionMapLock); 311 312 ASSERT(m_databaseConnectionMap.contains(database.databaseConnectionIdentifier())); 313 ASSERT(m_databaseConnectionMap.get(database.databaseConnectionIdentifier()) == &database); 314 m_databaseConnectionMap.remove(database.databaseConnectionIdentifier()); 315 } 93 316 94 317 } // namesapce IDBClient -
trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.h
r200163 r200485 29 29 30 30 #include "IDBConnectionToServer.h" 31 #include "IDBResourceIdentifier.h" 31 32 #include <functional> 33 #include <wtf/HashMap.h> 32 34 #include <wtf/RefPtr.h> 33 35 #include <wtf/Vector.h> … … 36 38 namespace WebCore { 37 39 40 class IDBDatabase; 38 41 class IDBDatabaseIdentifier; 42 class IDBError; 39 43 class IDBOpenDBRequest; 44 class IDBResultData; 45 class IDBTransaction; 40 46 class ScriptExecutionContext; 41 47 class SecurityOrigin; … … 50 56 51 57 RefPtr<IDBOpenDBRequest> openDatabase(ScriptExecutionContext&, const IDBDatabaseIdentifier&, uint64_t version); 58 void didOpenDatabase(const IDBResultData&); 59 52 60 RefPtr<IDBOpenDBRequest> deleteDatabase(ScriptExecutionContext&, const IDBDatabaseIdentifier&); 61 void didDeleteDatabase(const IDBResultData&); 62 63 void fireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier, uint64_t requestedVersion); 64 void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier); 65 66 void notifyOpenDBRequestBlocked(const IDBResourceIdentifier& requestIdentifier, uint64_t oldVersion, uint64_t newVersion); 67 68 void establishTransaction(IDBTransaction&); 69 void commitTransaction(IDBTransaction&); 70 void abortTransaction(IDBTransaction&); 71 72 void didStartTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&); 73 void didCommitTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&); 74 void didAbortTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&); 75 76 void didFinishHandlingVersionChangeTransaction(IDBTransaction&); 77 void databaseConnectionClosed(IDBDatabase&); 53 78 54 79 uint64_t serverConnectionIdentifier() const { return m_serverConnectionIdentifier; } … … 64 89 void getAllDatabaseNames(const SecurityOrigin& mainFrameOrigin, const SecurityOrigin& openingOrigin, std::function<void (const Vector<String>&)>); 65 90 91 void registerDatabaseConnection(IDBDatabase&); 92 void unregisterDatabaseConnection(IDBDatabase&); 93 66 94 private: 95 void completeOpenDBRequest(const IDBResultData&); 96 bool hasRecordOfTransaction(const IDBTransaction&) const; 97 67 98 IDBConnectionToServer& m_connectionToServer; 68 99 uint64_t m_serverConnectionIdentifier; 100 101 HashMap<uint64_t, IDBDatabase*> m_databaseConnectionMap; 102 Lock m_databaseConnectionMapLock; 103 104 HashMap<IDBResourceIdentifier, RefPtr<IDBOpenDBRequest>> m_openDBRequestMap; 105 Lock m_openDBRequestMapLock; 106 107 HashMap<IDBResourceIdentifier, RefPtr<IDBTransaction>> m_pendingTransactions; 108 HashMap<IDBResourceIdentifier, RefPtr<IDBTransaction>> m_committingTransactions; 109 HashMap<IDBResourceIdentifier, RefPtr<IDBTransaction>> m_abortingTransactions; 110 Lock m_transactionMapLock; 69 111 }; 70 112 -
trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp
r200163 r200485 37 37 #include "Logging.h" 38 38 #include "TransactionOperation.h" 39 #include <wtf/MainThread.h> 39 40 40 41 namespace WebCore { … … 63 64 } 64 65 65 void IDBConnectionToServer::deleteDatabase( IDBOpenDBRequest& request)66 void IDBConnectionToServer::deleteDatabase(const IDBRequestData& request) 66 67 { 67 68 LOG(IndexedDB, "IDBConnectionToServer::deleteDatabase - %s", request.databaseIdentifier().debugString().utf8().data()); 68 69 ASSERT(!m_openDBRequestMap.contains(request.resourceIdentifier())); 70 m_openDBRequestMap.set(request.resourceIdentifier(), &request); 71 72 IDBRequestData requestData(*this, request); 73 m_delegate->deleteDatabase(requestData); 69 m_delegate->deleteDatabase(request); 74 70 } 75 71 … … 77 73 { 78 74 LOG(IndexedDB, "IDBConnectionToServer::didDeleteDatabase"); 79 80 auto request = m_openDBRequestMap.take(resultData.requestIdentifier()); 81 ASSERT(request); 82 83 request->requestCompleted(resultData); 84 } 85 86 void IDBConnectionToServer::openDatabase(IDBOpenDBRequest& request) 87 { 88 LOG(IndexedDB, "IDBConnectionToServer::openDatabase - %s (%" PRIu64 ")", request.databaseIdentifier().debugString().utf8().data(), request.version()); 89 90 ASSERT(!m_openDBRequestMap.contains(request.resourceIdentifier())); 91 m_openDBRequestMap.set(request.resourceIdentifier(), &request); 92 93 IDBRequestData requestData(*this, request); 94 m_delegate->openDatabase(requestData); 75 m_proxy->didDeleteDatabase(resultData); 76 } 77 78 void IDBConnectionToServer::openDatabase(const IDBRequestData& request) 79 { 80 LOG(IndexedDB, "IDBConnectionToServer::openDatabase - %s (%" PRIu64 ")", request.databaseIdentifier().debugString().utf8().data(), request.requestedVersion()); 81 m_delegate->openDatabase(request); 95 82 } 96 83 … … 98 85 { 99 86 LOG(IndexedDB, "IDBConnectionToServer::didOpenDatabase"); 100 101 auto request = m_openDBRequestMap.take(resultData.requestIdentifier()); 102 ASSERT(request); 103 104 request->requestCompleted(resultData); 87 m_proxy->didOpenDatabase(resultData); 105 88 } 106 89 … … 270 253 } 271 254 272 void IDBConnectionToServer::establishTransaction( IDBTransaction& transaction)255 void IDBConnectionToServer::establishTransaction(uint64_t databaseConnectionIdentifier, const IDBTransactionInfo& info) 273 256 { 274 257 LOG(IndexedDB, "IDBConnectionToServer::establishTransaction"); 275 276 ASSERT(!hasRecordOfTransaction(transaction)); 277 m_pendingTransactions.set(transaction.info().identifier(), &transaction); 278 279 m_delegate->establishTransaction(transaction.database().databaseConnectionIdentifier(), transaction.info()); 280 } 281 282 void IDBConnectionToServer::commitTransaction(IDBTransaction& transaction) 258 ASSERT(isMainThread()); 259 260 m_delegate->establishTransaction(databaseConnectionIdentifier, info); 261 } 262 263 void IDBConnectionToServer::commitTransaction(const IDBResourceIdentifier& transactionIdentifier) 283 264 { 284 265 LOG(IndexedDB, "IDBConnectionToServer::commitTransaction"); 285 ASSERT(!m_committingTransactions.contains(transaction.info().identifier())); 286 m_committingTransactions.set(transaction.info().identifier(), &transaction); 287 288 auto identifier = transaction.info().identifier(); 289 m_delegate->commitTransaction(identifier); 266 ASSERT(isMainThread()); 267 268 m_delegate->commitTransaction(transactionIdentifier); 290 269 } 291 270 … … 293 272 { 294 273 LOG(IndexedDB, "IDBConnectionToServer::didCommitTransaction"); 295 296 auto transaction = m_committingTransactions.take(transactionIdentifier); 297 ASSERT(transaction); 298 299 transaction->didCommit(error); 300 } 301 302 void IDBConnectionToServer::didFinishHandlingVersionChangeTransaction(IDBTransaction& transaction) 274 ASSERT(isMainThread()); 275 276 m_proxy->didCommitTransaction(transactionIdentifier, error); 277 } 278 279 void IDBConnectionToServer::didFinishHandlingVersionChangeTransaction(const IDBResourceIdentifier& transactionIdentifier) 303 280 { 304 281 LOG(IndexedDB, "IDBConnectionToServer::didFinishHandlingVersionChangeTransaction"); 305 auto identifier = transaction.info().identifier(); 306 m_delegate->didFinishHandlingVersionChangeTransaction(identifier); 307 } 308 309 void IDBConnectionToServer::abortTransaction(IDBTransaction& transaction) 282 ASSERT(isMainThread()); 283 284 m_delegate->didFinishHandlingVersionChangeTransaction(transactionIdentifier); 285 } 286 287 void IDBConnectionToServer::abortTransaction(const IDBResourceIdentifier& transactionIdentifier) 310 288 { 311 289 LOG(IndexedDB, "IDBConnectionToServer::abortTransaction"); 312 ASSERT(!m_abortingTransactions.contains(transaction.info().identifier())); 313 m_abortingTransactions.set(transaction.info().identifier(), &transaction); 314 315 auto identifier = transaction.info().identifier(); 316 m_delegate->abortTransaction(identifier); 290 ASSERT(isMainThread()); 291 292 m_delegate->abortTransaction(transactionIdentifier); 317 293 } 318 294 … … 320 296 { 321 297 LOG(IndexedDB, "IDBConnectionToServer::didAbortTransaction"); 322 323 auto transaction = m_abortingTransactions.take(transactionIdentifier); 324 ASSERT(transaction); 325 326 transaction->didAbort(error); 298 ASSERT(isMainThread()); 299 300 m_proxy->didAbortTransaction(transactionIdentifier, error); 327 301 } 328 302 … … 330 304 { 331 305 LOG(IndexedDB, "IDBConnectionToServer::fireVersionChangeEvent"); 332 333 auto connection = m_databaseConnectionMap.get(databaseConnectionIdentifier); 334 if (!connection) 335 return; 336 337 connection->fireVersionChangeEvent(requestIdentifier, requestedVersion); 306 ASSERT(isMainThread()); 307 308 m_proxy->fireVersionChangeEvent(databaseConnectionIdentifier, requestIdentifier, requestedVersion); 338 309 } 339 310 … … 341 312 { 342 313 LOG(IndexedDB, "IDBConnectionToServer::didFireVersionChangeEvent"); 314 ASSERT(isMainThread()); 343 315 344 316 m_delegate->didFireVersionChangeEvent(databaseConnectionIdentifier, requestIdentifier); … … 348 320 { 349 321 LOG(IndexedDB, "IDBConnectionToServer::didStartTransaction"); 350 351 auto transaction = m_pendingTransactions.take(transactionIdentifier); 352 ASSERT(transaction); 353 354 transaction->didStart(error); 322 ASSERT(isMainThread()); 323 324 m_proxy->didStartTransaction(transactionIdentifier, error); 355 325 } 356 326 … … 358 328 { 359 329 LOG(IndexedDB, "IDBConnectionToServer::didStartTransaction"); 360 361 auto openDBRequest = m_openDBRequestMap.get(requestIdentifier); 362 ASSERT(openDBRequest); 363 364 openDBRequest->requestBlocked(oldVersion, newVersion); 365 } 366 367 void IDBConnectionToServer::databaseConnectionClosed(IDBDatabase& database) 330 ASSERT(isMainThread()); 331 332 m_proxy->notifyOpenDBRequestBlocked(requestIdentifier, oldVersion, newVersion); 333 } 334 335 void IDBConnectionToServer::databaseConnectionClosed(uint64_t databaseConnectionIdentifier) 368 336 { 369 337 LOG(IndexedDB, "IDBConnectionToServer::databaseConnectionClosed"); 370 371 m_delegate->databaseConnectionClosed(database.databaseConnectionIdentifier()); 338 ASSERT(isMainThread()); 339 340 m_delegate->databaseConnectionClosed(databaseConnectionIdentifier); 372 341 } 373 342 … … 377 346 378 347 m_delegate->abortOpenAndUpgradeNeeded(databaseConnectionIdentifier, transactionIdentifier); 379 }380 381 void IDBConnectionToServer::registerDatabaseConnection(IDBDatabase& database)382 {383 ASSERT(!m_databaseConnectionMap.contains(database.databaseConnectionIdentifier()));384 m_databaseConnectionMap.set(database.databaseConnectionIdentifier(), &database);385 }386 387 void IDBConnectionToServer::unregisterDatabaseConnection(IDBDatabase& database)388 {389 ASSERT(m_databaseConnectionMap.contains(database.databaseConnectionIdentifier()));390 ASSERT(m_databaseConnectionMap.get(database.databaseConnectionIdentifier()) == &database);391 m_databaseConnectionMap.remove(database.databaseConnectionIdentifier());392 348 } 393 349 … … 406 362 } 407 363 408 bool IDBConnectionToServer::hasRecordOfTransaction(const IDBTransaction& transaction) const409 {410 auto identifier = transaction.info().identifier();411 return m_pendingTransactions.contains(identifier) || m_committingTransactions.contains(identifier) || m_abortingTransactions.contains(identifier);412 }413 414 364 void IDBConnectionToServer::getAllDatabaseNames(const SecurityOrigin& mainFrameOrigin, const SecurityOrigin& openingOrigin, std::function<void (const Vector<String>&)> callback) 415 365 { -
trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h
r200163 r200485 43 43 class IDBError; 44 44 class IDBObjectStoreInfo; 45 class IDBOpenDBRequest;46 45 class IDBResultData; 47 class IDBTransaction;48 46 class IDBValue; 49 47 … … 60 58 IDBConnectionProxy& proxy(); 61 59 62 void deleteDatabase( IDBOpenDBRequest&);60 void deleteDatabase(const IDBRequestData&); 63 61 WEBCORE_EXPORT void didDeleteDatabase(const IDBResultData&); 64 62 65 void openDatabase( IDBOpenDBRequest&);63 void openDatabase(const IDBRequestData&); 66 64 WEBCORE_EXPORT void didOpenDatabase(const IDBResultData&); 67 65 … … 99 97 WEBCORE_EXPORT void didIterateCursor(const IDBResultData&); 100 98 101 void commitTransaction( IDBTransaction&);99 void commitTransaction(const IDBResourceIdentifier& transactionIdentifier); 102 100 WEBCORE_EXPORT void didCommitTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&); 103 101 104 void didFinishHandlingVersionChangeTransaction( IDBTransaction&);102 void didFinishHandlingVersionChangeTransaction(const IDBResourceIdentifier&); 105 103 106 void abortTransaction( IDBTransaction&);104 void abortTransaction(const IDBResourceIdentifier& transactionIdentifier); 107 105 WEBCORE_EXPORT void didAbortTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&); 108 106 … … 113 111 WEBCORE_EXPORT void notifyOpenDBRequestBlocked(const IDBResourceIdentifier& requestIdentifier, uint64_t oldVersion, uint64_t newVersion); 114 112 115 void establishTransaction( IDBTransaction&);113 void establishTransaction(uint64_t databaseConnectionIdentifier, const IDBTransactionInfo&); 116 114 117 void databaseConnectionClosed( IDBDatabase&);115 void databaseConnectionClosed(uint64_t databaseConnectionIdentifier); 118 116 119 117 // To be used when an IDBOpenDBRequest gets a new database connection, optionally with a 120 118 // versionchange transaction, but the page is already torn down. 121 119 void abortOpenAndUpgradeNeeded(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& transactionIdentifier); 122 123 void registerDatabaseConnection(IDBDatabase&);124 void unregisterDatabaseConnection(IDBDatabase&);125 120 126 121 void getAllDatabaseNames(const SecurityOrigin& mainFrameOrigin, const SecurityOrigin& openingOrigin, std::function<void (const Vector<String>&)>); … … 133 128 void completeOperation(const IDBResultData&); 134 129 135 bool hasRecordOfTransaction(const IDBTransaction&) const;136 137 130 Ref<IDBConnectionToServerDelegate> m_delegate; 138 131 139 HashMap<IDBResourceIdentifier, RefPtr<IDBOpenDBRequest>> m_openDBRequestMap;140 HashMap<uint64_t, IDBDatabase*> m_databaseConnectionMap;141 HashMap<IDBResourceIdentifier, RefPtr<IDBTransaction>> m_pendingTransactions;142 HashMap<IDBResourceIdentifier, RefPtr<IDBTransaction>> m_committingTransactions;143 HashMap<IDBResourceIdentifier, RefPtr<IDBTransaction>> m_abortingTransactions;144 132 HashMap<IDBResourceIdentifier, RefPtr<TransactionOperation>> m_activeOperations; 145 133 -
trunk/Source/WebCore/Modules/indexeddb/shared/IDBRequestData.cpp
r200484 r200485 39 39 } 40 40 41 IDBRequestData::IDBRequestData(const IDBClient::IDBConnection ToServer& connection, const IDBOpenDBRequest& request)42 : m_serverConnectionIdentifier(connection .identifier())43 , m_requestIdentifier(std::make_unique<IDBResourceIdentifier>(connection , request))41 IDBRequestData::IDBRequestData(const IDBClient::IDBConnectionProxy& connectionProxy, const IDBOpenDBRequest& request) 42 : m_serverConnectionIdentifier(connectionProxy.serverConnectionIdentifier()) 43 , m_requestIdentifier(std::make_unique<IDBResourceIdentifier>(connectionProxy, request)) 44 44 , m_databaseIdentifier(request.databaseIdentifier()) 45 45 , m_requestedVersion(request.version()) -
trunk/Source/WebCore/Modules/indexeddb/shared/IDBRequestData.h
r200484 r200485 43 43 44 44 namespace IDBClient { 45 class IDBConnection ToServer;45 class IDBConnectionProxy; 46 46 class TransactionOperation; 47 47 } … … 49 49 class IDBRequestData { 50 50 public: 51 IDBRequestData(const IDBClient::IDBConnection ToServer&, const IDBOpenDBRequest&);51 IDBRequestData(const IDBClient::IDBConnectionProxy&, const IDBOpenDBRequest&); 52 52 explicit IDBRequestData(IDBClient::TransactionOperation&); 53 53 IDBRequestData(const IDBRequestData&); -
trunk/Source/WebCore/Modules/indexeddb/shared/IDBResourceIdentifier.cpp
r199804 r200485 73 73 } 74 74 75 IDBResourceIdentifier::IDBResourceIdentifier(const IDBClient::IDBConnection ToServer& connection, const IDBRequest& request)76 : m_idbConnectionIdentifier(connection .identifier())75 IDBResourceIdentifier::IDBResourceIdentifier(const IDBClient::IDBConnectionProxy& connectionProxy, const IDBRequest& request) 76 : m_idbConnectionIdentifier(connectionProxy.serverConnectionIdentifier()) 77 77 , m_resourceNumber(request.resourceIdentifier().m_resourceNumber) 78 78 { -
trunk/Source/WebCore/Modules/indexeddb/shared/IDBResourceIdentifier.h
r199804 r200485 35 35 36 36 namespace IDBClient { 37 class IDBConnectionProxy; 37 38 class IDBConnectionToServer; 38 39 } … … 45 46 public: 46 47 explicit IDBResourceIdentifier(const IDBClient::IDBConnectionToServer&); 47 IDBResourceIdentifier(const IDBClient::IDBConnection ToServer&, const IDBRequest&);48 IDBResourceIdentifier(const IDBClient::IDBConnectionProxy&, const IDBRequest&); 48 49 explicit IDBResourceIdentifier(const IDBServer::IDBConnectionToClient&); 49 50
Note:
See TracChangeset
for help on using the changeset viewer.