Changeset 244027 in webkit
- Timestamp:
- Apr 8, 2019, 10:29:51 AM (7 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
-
ChangeLog (modified) (1 diff)
-
Modules/indexeddb/server/IDBServer.h (modified) (2 diffs)
-
Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp (modified) (1 diff)
-
Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp (modified) (1 diff)
-
Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r244025 r244027 1 2019-04-08 Youenn Fablet <youenn@apple.com> 2 3 Make sure UniqueIDBDatabaseConnection unregisters itself even if its database is gone 4 https://bugs.webkit.org/show_bug.cgi?id=196651 5 6 Reviewed by Brady Eidson. 7 8 In UniqueIDBDatabase methods, many operations are refing the transaction 9 so that it stays alive until a quota check decision is made. 10 This extends the lifetime of the transaction which may be lasting 11 longer than its database that may be cleared without waiting for the quota check decisions. 12 13 We therefore need to make sure that the transaction is cleaning itself correctly at destruction time. 14 15 Make sure that the transaction is unregistering itself from its IDBServer. 16 To do so, the transaction keeps a weak ref to the IDBServer. 17 18 This is timing sensitive hence difficult to test. 19 20 * Modules/indexeddb/server/IDBServer.h: 21 * Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp: 22 (WebCore::IDBServer::UniqueIDBDatabaseConnection::didAbortTransaction): 23 Like done below for UniqueIDBDatabaseConnection::didCommitTransaction, 24 add a check to ensure that either the database is we are in an error case. 25 * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp: 26 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::UniqueIDBDatabaseTransaction): 27 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::~UniqueIDBDatabaseTransaction): 28 * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h: 29 1 30 2019-04-08 Christopher Reid <chris.reid@sony.com> 2 31 -
trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h
r243339 r244027 42 42 #include <wtf/RefCounted.h> 43 43 #include <wtf/RefPtr.h> 44 #include <wtf/WeakPtr.h> 44 45 45 46 namespace WebCore { … … 58 59 class IDBBackingStoreTemporaryFileHandler; 59 60 60 class IDBServer : public RefCounted<IDBServer>, public CrossThreadTaskHandler {61 class IDBServer : public RefCounted<IDBServer>, public CrossThreadTaskHandler, public CanMakeWeakPtr<IDBServer> { 61 62 public: 62 63 using QuotaManagerGetter = WTF::Function<StorageQuotaManager*(PAL::SessionID, const ClientOrigin&)>; -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp
r243401 r244027 170 170 auto takenTransaction = m_transactionMap.take(transactionIdentifier); 171 171 172 ASSERT(m_database); 173 ASSERT(takenTransaction || m_database->hardClosedForUserDelete()); 172 ASSERT(takenTransaction || (!m_database && !error.isNull()) || (m_database && m_database->hardClosedForUserDelete())); 174 173 if (takenTransaction) 175 174 m_connectionToClient->didAbortTransaction(transactionIdentifier, error); -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp
r243270 r244027 54 54 m_originalDatabaseInfo = std::make_unique<IDBDatabaseInfo>(database->info()); 55 55 56 database->server().registerTransaction(*this); 56 auto& server = database->server(); 57 m_server = makeWeakPtr(server); 58 server.registerTransaction(*this); 57 59 } 58 60 59 61 UniqueIDBDatabaseTransaction::~UniqueIDBDatabaseTransaction() 60 62 { 61 auto database = m_databaseConnection->database(); 62 if (!database) 63 return; 64 65 database->transactionDestroyed(*this); 66 database->server().unregisterTransaction(*this); 63 if (auto database = m_databaseConnection->database()) 64 database->transactionDestroyed(*this); 65 66 if (m_server) 67 m_server->unregisterTransaction(*this); 67 68 } 68 69 -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h
r208486 r244027 51 51 namespace IDBServer { 52 52 53 class IDBServer; 53 54 class UniqueIDBDatabaseConnection; 54 55 … … 94 95 Ref<UniqueIDBDatabaseConnection> m_databaseConnection; 95 96 IDBTransactionInfo m_transactionInfo; 97 WeakPtr<IDBServer> m_server; 96 98 97 99 std::unique_ptr<IDBDatabaseInfo> m_originalDatabaseInfo;
Note:
See TracChangeset
for help on using the changeset viewer.