Changeset 234791 in webkit


Ignore:
Timestamp:
Aug 12, 2018 11:33:08 PM (6 years ago)
Author:
sihui_liu@apple.com
Message:

CrashTracer: com.apple.WebKit.Storage at WebCore::IDBServer::UniqueIDBDatabase::connectionClosedFromClient(WebCore::IDBServer::UniqueIDBDatabaseConnection&)
https://bugs.webkit.org/show_bug.cgi?id=188474

Reviewed by Chris Dumez.

UniqueIDBDatabaseConnection is refcounted by UniqueIDBDatabaseTransaction and it refcounts
UniqueIDBDatabaseTransaction. This cycle could make UniqueIDBDatabaseConnection outlives
UniqueIDBDatabase, so its reference to UniqueIDBDatabase may be stale. Calling a function
on a stale object is probably the reason of recent various storage process crashes in
indexedDB.

This patch makes m_database a WeakPtr and adds assertions that could help us debug the
crashes.

  • Modules/indexeddb/server/IDBServer.cpp:

(WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesModifiedSince):
(WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesForOrigins):

  • Modules/indexeddb/server/UniqueIDBDatabase.cpp:

(WebCore::IDBServer::UniqueIDBDatabase::commitTransaction):
(WebCore::IDBServer::UniqueIDBDatabase::abortTransaction):

  • Modules/indexeddb/server/UniqueIDBDatabase.h:
  • Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp:

(WebCore::IDBServer::UniqueIDBDatabaseConnection::UniqueIDBDatabaseConnection):
(WebCore::IDBServer::UniqueIDBDatabaseConnection::~UniqueIDBDatabaseConnection):
(WebCore::IDBServer::UniqueIDBDatabaseConnection::abortTransactionWithoutCallback):
(WebCore::IDBServer::UniqueIDBDatabaseConnection::connectionClosedFromClient):
(WebCore::IDBServer::UniqueIDBDatabaseConnection::confirmDidCloseFromServer):
(WebCore::IDBServer::UniqueIDBDatabaseConnection::didFireVersionChangeEvent):
(WebCore::IDBServer::UniqueIDBDatabaseConnection::didFinishHandlingVersionChange):
(WebCore::IDBServer::UniqueIDBDatabaseConnection::createVersionChangeTransaction):
(WebCore::IDBServer::UniqueIDBDatabaseConnection::establishTransaction):
(WebCore::IDBServer::UniqueIDBDatabaseConnection::didAbortTransaction):

  • Modules/indexeddb/server/UniqueIDBDatabaseConnection.h:

(WebCore::IDBServer::UniqueIDBDatabaseConnection::database):

  • Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp:

(WebCore::IDBServer::UniqueIDBDatabaseTransaction::UniqueIDBDatabaseTransaction):
(WebCore::IDBServer::UniqueIDBDatabaseTransaction::~UniqueIDBDatabaseTransaction):
(WebCore::IDBServer::UniqueIDBDatabaseTransaction::abort):
(WebCore::IDBServer::UniqueIDBDatabaseTransaction::commit):
(WebCore::IDBServer::UniqueIDBDatabaseTransaction::createObjectStore):
(WebCore::IDBServer::UniqueIDBDatabaseTransaction::deleteObjectStore):
(WebCore::IDBServer::UniqueIDBDatabaseTransaction::renameObjectStore):
(WebCore::IDBServer::UniqueIDBDatabaseTransaction::clearObjectStore):
(WebCore::IDBServer::UniqueIDBDatabaseTransaction::createIndex):
(WebCore::IDBServer::UniqueIDBDatabaseTransaction::deleteIndex):
(WebCore::IDBServer::UniqueIDBDatabaseTransaction::renameIndex):
(WebCore::IDBServer::UniqueIDBDatabaseTransaction::putOrAdd):
(WebCore::IDBServer::UniqueIDBDatabaseTransaction::getRecord):
(WebCore::IDBServer::UniqueIDBDatabaseTransaction::getAllRecords):
(WebCore::IDBServer::UniqueIDBDatabaseTransaction::getCount):
(WebCore::IDBServer::UniqueIDBDatabaseTransaction::deleteRecord):
(WebCore::IDBServer::UniqueIDBDatabaseTransaction::openCursor):
(WebCore::IDBServer::UniqueIDBDatabaseTransaction::iterateCursor):
(WebCore::IDBServer::UniqueIDBDatabaseTransaction::objectStoreIdentifiers):

  • Modules/indexeddb/shared/IDBResultData.cpp:

(WebCore::IDBResultData::openDatabaseSuccess):
(WebCore::IDBResultData::openDatabaseUpgradeNeeded):

Location:
trunk/Source/WebCore
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r234789 r234791  
     12018-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
    1612018-08-12  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
    262
  • trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp

    r233853 r234791  
    511511    HashSet<UniqueIDBDatabase*> openDatabases;
    512512    for (auto* connection : m_databaseConnections.values())
    513         openDatabases.add(&connection->database());
     513        openDatabases.add(connection->database());
    514514
    515515    for (auto& database : openDatabases)
     
    527527    HashSet<UniqueIDBDatabase*> openDatabases;
    528528    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();
    530533        for (auto& origin : origins) {
    531534            if (identifier.isRelatedToOrigin(origin)) {
    532                 openDatabases.add(&connection->database());
     535                openDatabases.add(database);
    533536                break;
    534537            }
  • trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp

    r234766 r234791  
    13031303    LOG(IndexedDB, "(main) UniqueIDBDatabase::commitTransaction - %s", transaction.info().identifier().loggingString().utf8().data());
    13041304
    1305     ASSERT(&transaction.databaseConnection().database() == this);
     1305    ASSERT(transaction.databaseConnection().database() == this);
    13061306
    13071307    uint64_t callbackID = storeCallbackOrFireError(WTFMove(callback));
     
    13471347    LOG(IndexedDB, "(main) UniqueIDBDatabase::abortTransaction - %s", transaction.info().identifier().loggingString().utf8().data());
    13481348
    1349     ASSERT(&transaction.databaseConnection().database() == this);
     1349    ASSERT(transaction.databaseConnection().database() == this);
    13501350
    13511351    uint64_t callbackID = storeCallbackOrFireError(WTFMove(callback));
  • trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h

    r219591 r234791  
    7373typedef Function<void(const IDBError&, uint64_t)> CountCallback;
    7474
    75 class UniqueIDBDatabase {
     75class UniqueIDBDatabase : public CanMakeWeakPtr<UniqueIDBDatabase> {
    7676public:
    7777    UniqueIDBDatabase(IDBServer&, const IDBDatabaseIdentifier&);
  • trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp

    r221399 r234791  
    4545
    4646UniqueIDBDatabaseConnection::UniqueIDBDatabaseConnection(UniqueIDBDatabase& database, ServerOpenDBRequest& request)
    47     : m_database(database)
     47    : m_database(makeWeakPtr(database))
    4848    , m_connectionToClient(request.connection())
    4949    , m_openRequestIdentifier(request.requestData().requestIdentifier())
    5050{
    51     m_database.server().registerDatabaseConnection(*this);
     51    m_database->server().registerDatabaseConnection(*this);
    5252    m_connectionToClient.registerDatabaseConnection(*this);
    5353}
     
    5555UniqueIDBDatabaseConnection::~UniqueIDBDatabaseConnection()
    5656{
    57     m_database.server().unregisterDatabaseConnection(*this);
     57    if (m_database)
     58        m_database->server().unregisterDatabaseConnection(*this);
    5859    m_connectionToClient.unregisterDatabaseConnection(*this);
    5960}
     
    7172    RefPtr<UniqueIDBDatabaseConnection> protectedThis(this);
    7273
    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&) {
    7479        ASSERT(m_transactionMap.contains(transactionIdentifier));
    7580        m_transactionMap.remove(transactionIdentifier);
     
    8893    LOG(IndexedDB, "UniqueIDBDatabaseConnection::connectionClosedFromClient - %s - %" PRIu64, m_openRequestIdentifier.loggingString().utf8().data(), identifier());
    8994
    90     m_database.connectionClosedFromClient(*this);
     95    ASSERT(m_database);
     96    if (m_database)
     97        m_database->connectionClosedFromClient(*this);
    9198}
    9299
     
    95102    LOG(IndexedDB, "UniqueIDBDatabaseConnection::confirmDidCloseFromServer - %s - %" PRIu64, m_openRequestIdentifier.loggingString().utf8().data(), identifier());
    96103
    97     m_database.confirmDidCloseFromServer(*this);
     104    ASSERT(m_database);
     105    if (m_database)
     106        m_database->confirmDidCloseFromServer(*this);
    98107}
    99108
     
    102111    LOG(IndexedDB, "UniqueIDBDatabaseConnection::didFireVersionChangeEvent - %s - %" PRIu64, m_openRequestIdentifier.loggingString().utf8().data(), identifier());
    103112
    104     m_database.didFireVersionChangeEvent(*this, requestIdentifier);
     113    ASSERT(m_database);
     114    if (m_database)
     115        m_database->didFireVersionChangeEvent(*this, requestIdentifier);
    105116}
    106117
     
    109120    LOG(IndexedDB, "UniqueIDBDatabaseConnection::didFinishHandlingVersionChange - %s - %" PRIu64, transactionIdentifier.loggingString().utf8().data(), identifier());
    110121
    111     m_database.didFinishHandlingVersionChange(*this, transactionIdentifier);
     122    ASSERT(m_database);
     123    if (m_database)
     124        m_database->didFinishHandlingVersionChange(*this, transactionIdentifier);
    112125}
    113126
     
    123136    ASSERT(!m_closePending);
    124137
    125     IDBTransactionInfo info = IDBTransactionInfo::versionChange(m_connectionToClient, m_database.info(), newVersion);
     138    IDBTransactionInfo info = IDBTransactionInfo::versionChange(m_connectionToClient, m_database->info(), newVersion);
    126139
    127140    Ref<UniqueIDBDatabaseTransaction> transaction = UniqueIDBDatabaseTransaction::create(*this, info);
     
    143156    Ref<UniqueIDBDatabaseTransaction> transaction = UniqueIDBDatabaseTransaction::create(*this, info);
    144157    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));
    146161}
    147162
     
    153168    auto takenTransaction = m_transactionMap.take(transactionIdentifier);
    154169
    155     ASSERT(takenTransaction || m_database.hardClosedForUserDelete());
     170    ASSERT(m_database);
     171    ASSERT(takenTransaction || m_database->hardClosedForUserDelete());
    156172    if (takenTransaction)
    157173        m_connectionToClient.didAbortTransaction(transactionIdentifier, error);
  • trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h

    r221399 r234791  
    3333#include <wtf/Ref.h>
    3434#include <wtf/RefCounted.h>
     35#include <wtf/WeakPtr.h>
    3536
    3637namespace WebCore {
     
    5354
    5455    const IDBResourceIdentifier& openRequestIdentifier() { return m_openRequestIdentifier; }
    55     UniqueIDBDatabase& database() { return m_database; }
     56    UniqueIDBDatabase* database() { return m_database.get(); }
    5657    IDBConnectionToClient& connectionToClient() { return m_connectionToClient; }
    5758
     
    8788    UniqueIDBDatabaseConnection(UniqueIDBDatabase&, ServerOpenDBRequest&);
    8889
    89     UniqueIDBDatabase& m_database;
     90    WeakPtr<UniqueIDBDatabase> m_database;
    9091    IDBConnectionToClient& m_connectionToClient;
    9192    IDBResourceIdentifier m_openRequestIdentifier;
  • trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp

    r208486 r234791  
    4848    , m_transactionInfo(info)
    4949{
     50    auto database = m_databaseConnection->database();
     51    ASSERT(database);
     52
    5053    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);
    5457}
    5558
    5659UniqueIDBDatabaseTransaction::~UniqueIDBDatabaseTransaction()
    5760{
    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);
    6067}
    6168
     
    7178
    7279    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) {
    7485        LOG(IndexedDB, "UniqueIDBDatabaseTransaction::abort (callback)");
    7586        m_databaseConnection->didAbortTransaction(*this, error);
     
    99110
    100111    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) {
    102117        LOG(IndexedDB, "UniqueIDBDatabaseTransaction::commit (callback)");
    103118        m_databaseConnection->didCommitTransaction(*this, error);
     
    113128
    114129    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) {
    116135        LOG(IndexedDB, "UniqueIDBDatabaseTransaction::createObjectStore (callback)");
    117136        if (error.isNull())
     
    130149
    131150    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) {
    133156        LOG(IndexedDB, "UniqueIDBDatabaseTransaction::deleteObjectStore (callback)");
    134157        if (error.isNull())
     
    147170
    148171    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) {
    150177        LOG(IndexedDB, "UniqueIDBDatabaseTransaction::renameObjectStore (callback)");
    151178        if (error.isNull())
     
    163190
    164191    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) {
    166197        LOG(IndexedDB, "UniqueIDBDatabaseTransaction::clearObjectStore (callback)");
    167198        if (error.isNull())
     
    180211
    181212    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) {
    183218        LOG(IndexedDB, "UniqueIDBDatabaseTransaction::createIndex (callback)");
    184219        if (error.isNull())
     
    197232
    198233    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) {
    200239        LOG(IndexedDB, "UniqueIDBDatabaseTransaction::createIndex (callback)");
    201240        if (error.isNull())
     
    214253
    215254    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) {
    217260        LOG(IndexedDB, "UniqueIDBDatabaseTransaction::renameIndex (callback)");
    218261        if (error.isNull())
     
    232275
    233276    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) {
    235282        LOG(IndexedDB, "UniqueIDBDatabaseTransaction::putOrAdd (callback)");
    236283
     
    249296
    250297    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) {
    252303        LOG(IndexedDB, "UniqueIDBDatabaseTransaction::getRecord (callback)");
    253304
     
    266317
    267318    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) {
    269324        LOG(IndexedDB, "UniqueIDBDatabaseTransaction::getAllRecords (callback)");
    270325
     
    283338
    284339    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) {
    286345        LOG(IndexedDB, "UniqueIDBDatabaseTransaction::getCount (callback)");
    287346
     
    300359
    301360    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) {
    303366        LOG(IndexedDB, "UniqueIDBDatabaseTransaction::deleteRecord (callback)");
    304367
     
    317380
    318381    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) {
    320387        LOG(IndexedDB, "UniqueIDBDatabaseTransaction::openCursor (callback)");
    321388
     
    334401
    335402    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) {
    337408        LOG(IndexedDB, "UniqueIDBDatabaseTransaction::iterateCursor (callback)");
    338409
     
    349420        return m_objectStoreIdentifiers;
    350421
    351     auto& info = m_databaseConnection->database().info();
     422    auto& info = m_databaseConnection->database()->info();
    352423    for (auto objectStoreName : info.objectStoreNames()) {
    353424        auto objectStoreInfo = info.infoForExistingObjectStore(objectStoreName);
  • trunk/Source/WebCore/Modules/indexeddb/shared/IDBResultData.cpp

    r218041 r234791  
    112112    result.m_type = IDBResultType::OpenDatabaseSuccess;
    113113    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());
    115115    return result;
    116116}
     
    122122    result.m_type = IDBResultType::OpenDatabaseUpgradeNeeded;
    123123    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());
    125125    result.m_transactionInfo = std::make_unique<IDBTransactionInfo>(transaction.info());
    126126    return result;
Note: See TracChangeset for help on using the changeset viewer.