Changeset 234791 in webkit
- Timestamp:
- Aug 12, 2018 11:33:08 PM (6 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r234789 r234791 1 2018-08-12 Sihui Liu <sihui_liu@apple.com> 2 3 CrashTracer: com.apple.WebKit.Storage at WebCore::IDBServer::UniqueIDBDatabase::connectionClosedFromClient(WebCore::IDBServer::UniqueIDBDatabaseConnection&) 4 https://bugs.webkit.org/show_bug.cgi?id=188474 5 6 Reviewed by Chris Dumez. 7 8 UniqueIDBDatabaseConnection is refcounted by UniqueIDBDatabaseTransaction and it refcounts 9 UniqueIDBDatabaseTransaction. This cycle could make UniqueIDBDatabaseConnection outlives 10 UniqueIDBDatabase, so its reference to UniqueIDBDatabase may be stale. Calling a function 11 on a stale object is probably the reason of recent various storage process crashes in 12 indexedDB. 13 14 This patch makes m_database a WeakPtr and adds assertions that could help us debug the 15 crashes. 16 17 * Modules/indexeddb/server/IDBServer.cpp: 18 (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesModifiedSince): 19 (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesForOrigins): 20 * Modules/indexeddb/server/UniqueIDBDatabase.cpp: 21 (WebCore::IDBServer::UniqueIDBDatabase::commitTransaction): 22 (WebCore::IDBServer::UniqueIDBDatabase::abortTransaction): 23 * Modules/indexeddb/server/UniqueIDBDatabase.h: 24 * Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp: 25 (WebCore::IDBServer::UniqueIDBDatabaseConnection::UniqueIDBDatabaseConnection): 26 (WebCore::IDBServer::UniqueIDBDatabaseConnection::~UniqueIDBDatabaseConnection): 27 (WebCore::IDBServer::UniqueIDBDatabaseConnection::abortTransactionWithoutCallback): 28 (WebCore::IDBServer::UniqueIDBDatabaseConnection::connectionClosedFromClient): 29 (WebCore::IDBServer::UniqueIDBDatabaseConnection::confirmDidCloseFromServer): 30 (WebCore::IDBServer::UniqueIDBDatabaseConnection::didFireVersionChangeEvent): 31 (WebCore::IDBServer::UniqueIDBDatabaseConnection::didFinishHandlingVersionChange): 32 (WebCore::IDBServer::UniqueIDBDatabaseConnection::createVersionChangeTransaction): 33 (WebCore::IDBServer::UniqueIDBDatabaseConnection::establishTransaction): 34 (WebCore::IDBServer::UniqueIDBDatabaseConnection::didAbortTransaction): 35 * Modules/indexeddb/server/UniqueIDBDatabaseConnection.h: 36 (WebCore::IDBServer::UniqueIDBDatabaseConnection::database): 37 * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp: 38 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::UniqueIDBDatabaseTransaction): 39 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::~UniqueIDBDatabaseTransaction): 40 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::abort): 41 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::commit): 42 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::createObjectStore): 43 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::deleteObjectStore): 44 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::renameObjectStore): 45 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::clearObjectStore): 46 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::createIndex): 47 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::deleteIndex): 48 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::renameIndex): 49 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::putOrAdd): 50 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getRecord): 51 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getAllRecords): 52 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::getCount): 53 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::deleteRecord): 54 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::openCursor): 55 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::iterateCursor): 56 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::objectStoreIdentifiers): 57 * Modules/indexeddb/shared/IDBResultData.cpp: 58 (WebCore::IDBResultData::openDatabaseSuccess): 59 (WebCore::IDBResultData::openDatabaseUpgradeNeeded): 60 1 61 2018-08-12 Yusuke Suzuki <yusukesuzuki@slowstart.org> 2 62 -
trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp
r233853 r234791 511 511 HashSet<UniqueIDBDatabase*> openDatabases; 512 512 for (auto* connection : m_databaseConnections.values()) 513 openDatabases.add( &connection->database());513 openDatabases.add(connection->database()); 514 514 515 515 for (auto& database : openDatabases) … … 527 527 HashSet<UniqueIDBDatabase*> openDatabases; 528 528 for (auto* connection : m_databaseConnections.values()) { 529 const auto& identifier = connection->database().identifier(); 529 auto database = connection->database(); 530 ASSERT(database); 531 532 const auto& identifier = database->identifier(); 530 533 for (auto& origin : origins) { 531 534 if (identifier.isRelatedToOrigin(origin)) { 532 openDatabases.add( &connection->database());535 openDatabases.add(database); 533 536 break; 534 537 } -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp
r234766 r234791 1303 1303 LOG(IndexedDB, "(main) UniqueIDBDatabase::commitTransaction - %s", transaction.info().identifier().loggingString().utf8().data()); 1304 1304 1305 ASSERT( &transaction.databaseConnection().database() == this);1305 ASSERT(transaction.databaseConnection().database() == this); 1306 1306 1307 1307 uint64_t callbackID = storeCallbackOrFireError(WTFMove(callback)); … … 1347 1347 LOG(IndexedDB, "(main) UniqueIDBDatabase::abortTransaction - %s", transaction.info().identifier().loggingString().utf8().data()); 1348 1348 1349 ASSERT( &transaction.databaseConnection().database() == this);1349 ASSERT(transaction.databaseConnection().database() == this); 1350 1350 1351 1351 uint64_t callbackID = storeCallbackOrFireError(WTFMove(callback)); -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h
r219591 r234791 73 73 typedef Function<void(const IDBError&, uint64_t)> CountCallback; 74 74 75 class UniqueIDBDatabase {75 class UniqueIDBDatabase : public CanMakeWeakPtr<UniqueIDBDatabase> { 76 76 public: 77 77 UniqueIDBDatabase(IDBServer&, const IDBDatabaseIdentifier&); -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp
r221399 r234791 45 45 46 46 UniqueIDBDatabaseConnection::UniqueIDBDatabaseConnection(UniqueIDBDatabase& database, ServerOpenDBRequest& request) 47 : m_database( database)47 : m_database(makeWeakPtr(database)) 48 48 , m_connectionToClient(request.connection()) 49 49 , m_openRequestIdentifier(request.requestData().requestIdentifier()) 50 50 { 51 m_database .server().registerDatabaseConnection(*this);51 m_database->server().registerDatabaseConnection(*this); 52 52 m_connectionToClient.registerDatabaseConnection(*this); 53 53 } … … 55 55 UniqueIDBDatabaseConnection::~UniqueIDBDatabaseConnection() 56 56 { 57 m_database.server().unregisterDatabaseConnection(*this); 57 if (m_database) 58 m_database->server().unregisterDatabaseConnection(*this); 58 59 m_connectionToClient.unregisterDatabaseConnection(*this); 59 60 } … … 71 72 RefPtr<UniqueIDBDatabaseConnection> protectedThis(this); 72 73 73 m_database.abortTransaction(transaction, [this, protectedThis, transactionIdentifier](const IDBError&) { 74 ASSERT(m_database); 75 if (!m_database) 76 return; 77 78 m_database->abortTransaction(transaction, [this, protectedThis, transactionIdentifier](const IDBError&) { 74 79 ASSERT(m_transactionMap.contains(transactionIdentifier)); 75 80 m_transactionMap.remove(transactionIdentifier); … … 88 93 LOG(IndexedDB, "UniqueIDBDatabaseConnection::connectionClosedFromClient - %s - %" PRIu64, m_openRequestIdentifier.loggingString().utf8().data(), identifier()); 89 94 90 m_database.connectionClosedFromClient(*this); 95 ASSERT(m_database); 96 if (m_database) 97 m_database->connectionClosedFromClient(*this); 91 98 } 92 99 … … 95 102 LOG(IndexedDB, "UniqueIDBDatabaseConnection::confirmDidCloseFromServer - %s - %" PRIu64, m_openRequestIdentifier.loggingString().utf8().data(), identifier()); 96 103 97 m_database.confirmDidCloseFromServer(*this); 104 ASSERT(m_database); 105 if (m_database) 106 m_database->confirmDidCloseFromServer(*this); 98 107 } 99 108 … … 102 111 LOG(IndexedDB, "UniqueIDBDatabaseConnection::didFireVersionChangeEvent - %s - %" PRIu64, m_openRequestIdentifier.loggingString().utf8().data(), identifier()); 103 112 104 m_database.didFireVersionChangeEvent(*this, requestIdentifier); 113 ASSERT(m_database); 114 if (m_database) 115 m_database->didFireVersionChangeEvent(*this, requestIdentifier); 105 116 } 106 117 … … 109 120 LOG(IndexedDB, "UniqueIDBDatabaseConnection::didFinishHandlingVersionChange - %s - %" PRIu64, transactionIdentifier.loggingString().utf8().data(), identifier()); 110 121 111 m_database.didFinishHandlingVersionChange(*this, transactionIdentifier); 122 ASSERT(m_database); 123 if (m_database) 124 m_database->didFinishHandlingVersionChange(*this, transactionIdentifier); 112 125 } 113 126 … … 123 136 ASSERT(!m_closePending); 124 137 125 IDBTransactionInfo info = IDBTransactionInfo::versionChange(m_connectionToClient, m_database .info(), newVersion);138 IDBTransactionInfo info = IDBTransactionInfo::versionChange(m_connectionToClient, m_database->info(), newVersion); 126 139 127 140 Ref<UniqueIDBDatabaseTransaction> transaction = UniqueIDBDatabaseTransaction::create(*this, info); … … 143 156 Ref<UniqueIDBDatabaseTransaction> transaction = UniqueIDBDatabaseTransaction::create(*this, info); 144 157 m_transactionMap.set(transaction->info().identifier(), &transaction.get()); 145 m_database.enqueueTransaction(WTFMove(transaction)); 158 159 ASSERT(m_database); 160 m_database->enqueueTransaction(WTFMove(transaction)); 146 161 } 147 162 … … 153 168 auto takenTransaction = m_transactionMap.take(transactionIdentifier); 154 169 155 ASSERT(takenTransaction || m_database.hardClosedForUserDelete()); 170 ASSERT(m_database); 171 ASSERT(takenTransaction || m_database->hardClosedForUserDelete()); 156 172 if (takenTransaction) 157 173 m_connectionToClient.didAbortTransaction(transactionIdentifier, error); -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h
r221399 r234791 33 33 #include <wtf/Ref.h> 34 34 #include <wtf/RefCounted.h> 35 #include <wtf/WeakPtr.h> 35 36 36 37 namespace WebCore { … … 53 54 54 55 const IDBResourceIdentifier& openRequestIdentifier() { return m_openRequestIdentifier; } 55 UniqueIDBDatabase & database() { return m_database; }56 UniqueIDBDatabase* database() { return m_database.get(); } 56 57 IDBConnectionToClient& connectionToClient() { return m_connectionToClient; } 57 58 … … 87 88 UniqueIDBDatabaseConnection(UniqueIDBDatabase&, ServerOpenDBRequest&); 88 89 89 UniqueIDBDatabase&m_database;90 WeakPtr<UniqueIDBDatabase> m_database; 90 91 IDBConnectionToClient& m_connectionToClient; 91 92 IDBResourceIdentifier m_openRequestIdentifier; -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp
r208486 r234791 48 48 , m_transactionInfo(info) 49 49 { 50 auto database = m_databaseConnection->database(); 51 ASSERT(database); 52 50 53 if (m_transactionInfo.mode() == IDBTransactionMode::Versionchange) 51 m_originalDatabaseInfo = std::make_unique<IDBDatabaseInfo>( m_databaseConnection->database().info());52 53 m_databaseConnection->database().server().registerTransaction(*this);54 m_originalDatabaseInfo = std::make_unique<IDBDatabaseInfo>(database->info()); 55 56 database->server().registerTransaction(*this); 54 57 } 55 58 56 59 UniqueIDBDatabaseTransaction::~UniqueIDBDatabaseTransaction() 57 60 { 58 m_databaseConnection->database().transactionDestroyed(*this); 59 m_databaseConnection->database().server().unregisterTransaction(*this); 61 auto database = m_databaseConnection->database(); 62 if (!database) 63 return; 64 65 database->transactionDestroyed(*this); 66 database->server().unregisterTransaction(*this); 60 67 } 61 68 … … 71 78 72 79 RefPtr<UniqueIDBDatabaseTransaction> protectedThis(this); 73 m_databaseConnection->database().abortTransaction(*this, [this, protectedThis](const IDBError& error) { 80 81 auto database = m_databaseConnection->database(); 82 ASSERT(database); 83 84 database->abortTransaction(*this, [this, protectedThis](const IDBError& error) { 74 85 LOG(IndexedDB, "UniqueIDBDatabaseTransaction::abort (callback)"); 75 86 m_databaseConnection->didAbortTransaction(*this, error); … … 99 110 100 111 RefPtr<UniqueIDBDatabaseTransaction> protectedThis(this); 101 m_databaseConnection->database().commitTransaction(*this, [this, protectedThis](const IDBError& error) { 112 113 auto database = m_databaseConnection->database(); 114 ASSERT(database); 115 116 database->commitTransaction(*this, [this, protectedThis](const IDBError& error) { 102 117 LOG(IndexedDB, "UniqueIDBDatabaseTransaction::commit (callback)"); 103 118 m_databaseConnection->didCommitTransaction(*this, error); … … 113 128 114 129 RefPtr<UniqueIDBDatabaseTransaction> protectedThis(this); 115 m_databaseConnection->database().createObjectStore(*this, info, [this, protectedThis, requestData](const IDBError& error) { 130 131 auto database = m_databaseConnection->database(); 132 ASSERT(database); 133 134 database->createObjectStore(*this, info, [this, protectedThis, requestData](const IDBError& error) { 116 135 LOG(IndexedDB, "UniqueIDBDatabaseTransaction::createObjectStore (callback)"); 117 136 if (error.isNull()) … … 130 149 131 150 RefPtr<UniqueIDBDatabaseTransaction> protectedThis(this); 132 m_databaseConnection->database().deleteObjectStore(*this, objectStoreName, [this, protectedThis, requestData](const IDBError& error) { 151 152 auto database = m_databaseConnection->database(); 153 ASSERT(database); 154 155 database->deleteObjectStore(*this, objectStoreName, [this, protectedThis, requestData](const IDBError& error) { 133 156 LOG(IndexedDB, "UniqueIDBDatabaseTransaction::deleteObjectStore (callback)"); 134 157 if (error.isNull()) … … 147 170 148 171 RefPtr<UniqueIDBDatabaseTransaction> protectedThis(this); 149 m_databaseConnection->database().renameObjectStore(*this, objectStoreIdentifier, newName, [this, protectedThis, requestData](const IDBError& error) { 172 173 auto database = m_databaseConnection->database(); 174 ASSERT(database); 175 176 database->renameObjectStore(*this, objectStoreIdentifier, newName, [this, protectedThis, requestData](const IDBError& error) { 150 177 LOG(IndexedDB, "UniqueIDBDatabaseTransaction::renameObjectStore (callback)"); 151 178 if (error.isNull()) … … 163 190 164 191 RefPtr<UniqueIDBDatabaseTransaction> protectedThis(this); 165 m_databaseConnection->database().clearObjectStore(*this, objectStoreIdentifier, [this, protectedThis, requestData](const IDBError& error) { 192 193 auto database = m_databaseConnection->database(); 194 ASSERT(database); 195 196 database->clearObjectStore(*this, objectStoreIdentifier, [this, protectedThis, requestData](const IDBError& error) { 166 197 LOG(IndexedDB, "UniqueIDBDatabaseTransaction::clearObjectStore (callback)"); 167 198 if (error.isNull()) … … 180 211 181 212 RefPtr<UniqueIDBDatabaseTransaction> protectedThis(this); 182 m_databaseConnection->database().createIndex(*this, info, [this, protectedThis, requestData](const IDBError& error) { 213 214 auto database = m_databaseConnection->database(); 215 ASSERT(database); 216 217 database->createIndex(*this, info, [this, protectedThis, requestData](const IDBError& error) { 183 218 LOG(IndexedDB, "UniqueIDBDatabaseTransaction::createIndex (callback)"); 184 219 if (error.isNull()) … … 197 232 198 233 RefPtr<UniqueIDBDatabaseTransaction> protectedThis(this); 199 m_databaseConnection->database().deleteIndex(*this, objectStoreIdentifier, indexName, [this, protectedThis, requestData](const IDBError& error) { 234 235 auto database = m_databaseConnection->database(); 236 ASSERT(database); 237 238 database->deleteIndex(*this, objectStoreIdentifier, indexName, [this, protectedThis, requestData](const IDBError& error) { 200 239 LOG(IndexedDB, "UniqueIDBDatabaseTransaction::createIndex (callback)"); 201 240 if (error.isNull()) … … 214 253 215 254 RefPtr<UniqueIDBDatabaseTransaction> protectedThis(this); 216 m_databaseConnection->database().renameIndex(*this, objectStoreIdentifier, indexIdentifier, newName, [this, protectedThis, requestData](const IDBError& error) { 255 256 auto database = m_databaseConnection->database(); 257 ASSERT(database); 258 259 database->renameIndex(*this, objectStoreIdentifier, indexIdentifier, newName, [this, protectedThis, requestData](const IDBError& error) { 217 260 LOG(IndexedDB, "UniqueIDBDatabaseTransaction::renameIndex (callback)"); 218 261 if (error.isNull()) … … 232 275 233 276 RefPtr<UniqueIDBDatabaseTransaction> protectedThis(this); 234 m_databaseConnection->database().putOrAdd(requestData, keyData, value, overwriteMode, [this, protectedThis, requestData](const IDBError& error, const IDBKeyData& key) { 277 278 auto database = m_databaseConnection->database(); 279 ASSERT(database); 280 281 database->putOrAdd(requestData, keyData, value, overwriteMode, [this, protectedThis, requestData](const IDBError& error, const IDBKeyData& key) { 235 282 LOG(IndexedDB, "UniqueIDBDatabaseTransaction::putOrAdd (callback)"); 236 283 … … 249 296 250 297 RefPtr<UniqueIDBDatabaseTransaction> protectedThis(this); 251 m_databaseConnection->database().getRecord(requestData, getRecordData, [this, protectedThis, requestData](const IDBError& error, const IDBGetResult& result) { 298 299 auto database = m_databaseConnection->database(); 300 ASSERT(database); 301 302 database->getRecord(requestData, getRecordData, [this, protectedThis, requestData](const IDBError& error, const IDBGetResult& result) { 252 303 LOG(IndexedDB, "UniqueIDBDatabaseTransaction::getRecord (callback)"); 253 304 … … 266 317 267 318 RefPtr<UniqueIDBDatabaseTransaction> protectedThis(this); 268 m_databaseConnection->database().getAllRecords(requestData, getAllRecordsData, [this, protectedThis, requestData](const IDBError& error, const IDBGetAllResult& result) { 319 320 auto database = m_databaseConnection->database(); 321 ASSERT(database); 322 323 database->getAllRecords(requestData, getAllRecordsData, [this, protectedThis, requestData](const IDBError& error, const IDBGetAllResult& result) { 269 324 LOG(IndexedDB, "UniqueIDBDatabaseTransaction::getAllRecords (callback)"); 270 325 … … 283 338 284 339 RefPtr<UniqueIDBDatabaseTransaction> protectedThis(this); 285 m_databaseConnection->database().getCount(requestData, keyRangeData, [this, protectedThis, requestData](const IDBError& error, uint64_t count) { 340 341 auto database = m_databaseConnection->database(); 342 ASSERT(database); 343 344 database->getCount(requestData, keyRangeData, [this, protectedThis, requestData](const IDBError& error, uint64_t count) { 286 345 LOG(IndexedDB, "UniqueIDBDatabaseTransaction::getCount (callback)"); 287 346 … … 300 359 301 360 RefPtr<UniqueIDBDatabaseTransaction> protectedThis(this); 302 m_databaseConnection->database().deleteRecord(requestData, keyRangeData, [this, protectedThis, requestData](const IDBError& error) { 361 362 auto database = m_databaseConnection->database(); 363 ASSERT(database); 364 365 database->deleteRecord(requestData, keyRangeData, [this, protectedThis, requestData](const IDBError& error) { 303 366 LOG(IndexedDB, "UniqueIDBDatabaseTransaction::deleteRecord (callback)"); 304 367 … … 317 380 318 381 RefPtr<UniqueIDBDatabaseTransaction> protectedThis(this); 319 m_databaseConnection->database().openCursor(requestData, info, [this, protectedThis, requestData](const IDBError& error, const IDBGetResult& result) { 382 383 auto database = m_databaseConnection->database(); 384 ASSERT(database); 385 386 database->openCursor(requestData, info, [this, protectedThis, requestData](const IDBError& error, const IDBGetResult& result) { 320 387 LOG(IndexedDB, "UniqueIDBDatabaseTransaction::openCursor (callback)"); 321 388 … … 334 401 335 402 RefPtr<UniqueIDBDatabaseTransaction> protectedThis(this); 336 m_databaseConnection->database().iterateCursor(requestData, data, [this, protectedThis, requestData](const IDBError& error, const IDBGetResult& result) { 403 404 auto database = m_databaseConnection->database(); 405 ASSERT(database); 406 407 database->iterateCursor(requestData, data, [this, protectedThis, requestData](const IDBError& error, const IDBGetResult& result) { 337 408 LOG(IndexedDB, "UniqueIDBDatabaseTransaction::iterateCursor (callback)"); 338 409 … … 349 420 return m_objectStoreIdentifiers; 350 421 351 auto& info = m_databaseConnection->database() .info();422 auto& info = m_databaseConnection->database()->info(); 352 423 for (auto objectStoreName : info.objectStoreNames()) { 353 424 auto objectStoreInfo = info.infoForExistingObjectStore(objectStoreName); -
trunk/Source/WebCore/Modules/indexeddb/shared/IDBResultData.cpp
r218041 r234791 112 112 result.m_type = IDBResultType::OpenDatabaseSuccess; 113 113 result.m_databaseConnectionIdentifier = connection.identifier(); 114 result.m_databaseInfo = std::make_unique<IDBDatabaseInfo>(connection.database() .info());114 result.m_databaseInfo = std::make_unique<IDBDatabaseInfo>(connection.database()->info()); 115 115 return result; 116 116 } … … 122 122 result.m_type = IDBResultType::OpenDatabaseUpgradeNeeded; 123 123 result.m_databaseConnectionIdentifier = transaction.databaseConnection().identifier(); 124 result.m_databaseInfo = std::make_unique<IDBDatabaseInfo>(transaction.databaseConnection().database() .info());124 result.m_databaseInfo = std::make_unique<IDBDatabaseInfo>(transaction.databaseConnection().database()->info()); 125 125 result.m_transactionInfo = std::make_unique<IDBTransactionInfo>(transaction.info()); 126 126 return result;
Note: See TracChangeset
for help on using the changeset viewer.