Changeset 133776 in webkit


Ignore:
Timestamp:
Nov 7, 2012 10:26:18 AM (11 years ago)
Author:
jsbell@chromium.org
Message:

IndexedDB: Assertion failure with open() within upgradeneeded
https://bugs.webkit.org/show_bug.cgi?id=96947

Reviewed by Dimitri Glazkov.

Source/WebCore:

Postpone creation of the "pending second half open" until the version change
transaction has started.

Test: storage/indexeddb/unblocked-version-changes.html

  • Modules/indexeddb/IDBDatabaseBackendImpl.cpp:

(WebCore::IDBDatabaseBackendImpl::setIntVersionInternal):
(WebCore::IDBDatabaseBackendImpl::runIntVersionChangeTransaction):

  • Modules/indexeddb/IDBDatabaseBackendImpl.h:

(IDBDatabaseBackendImpl):

  • Modules/indexeddb/IDBDatabaseCallbacks.h:

LayoutTests:

Exercise the code path leading to the assert by having a second version change transaction
unblocked by the first's connection closing. Includes a known failure due to metadata
snapshot timing.

  • storage/indexeddb/resources/unblocked-version-changes.js: Added.

(test):
(openConnection):
(onUpgradeNeeded):
(onError):
(onUpgradeNeeded2):
(onSuccess):

  • storage/indexeddb/unblocked-version-changes-expected.txt: Added.
  • storage/indexeddb/unblocked-version-changes.html: Added.
Location:
trunk
Files:
3 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r133772 r133776  
     12012-11-07  Joshua Bell  <jsbell@chromium.org>
     2
     3        IndexedDB: Assertion failure with open() within upgradeneeded
     4        https://bugs.webkit.org/show_bug.cgi?id=96947
     5
     6        Reviewed by Dimitri Glazkov.
     7
     8        Exercise the code path leading to the assert by having a second version change transaction
     9        unblocked by the first's connection closing. Includes a known failure due to metadata
     10        snapshot timing.
     11
     12        * storage/indexeddb/resources/unblocked-version-changes.js: Added.
     13        (test):
     14        (openConnection):
     15        (onUpgradeNeeded):
     16        (onError):
     17        (onUpgradeNeeded2):
     18        (onSuccess):
     19        * storage/indexeddb/unblocked-version-changes-expected.txt: Added.
     20        * storage/indexeddb/unblocked-version-changes.html: Added.
     21
    1222012-11-06  Simon Fraser  <simon.fraser@apple.com>
    223
  • trunk/Source/WebCore/ChangeLog

    r133771 r133776  
     12012-11-07  Joshua Bell  <jsbell@chromium.org>
     2
     3        IndexedDB: Assertion failure with open() within upgradeneeded
     4        https://bugs.webkit.org/show_bug.cgi?id=96947
     5
     6        Reviewed by Dimitri Glazkov.
     7
     8        Postpone creation of the "pending second half open" until the version change
     9        transaction has started.
     10
     11        Test: storage/indexeddb/unblocked-version-changes.html
     12
     13        * Modules/indexeddb/IDBDatabaseBackendImpl.cpp:
     14        (WebCore::IDBDatabaseBackendImpl::setIntVersionInternal):
     15        (WebCore::IDBDatabaseBackendImpl::runIntVersionChangeTransaction):
     16        * Modules/indexeddb/IDBDatabaseBackendImpl.h:
     17        (IDBDatabaseBackendImpl):
     18        * Modules/indexeddb/IDBDatabaseCallbacks.h:
     19
    1202012-11-07  Alexandru Chiculita  <achicu@adobe.com>
    221
  • trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.cpp

    r133195 r133776  
    305305}
    306306
    307 void IDBDatabaseBackendImpl::setIntVersionInternal(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendImpl> database, int64_t version, PassRefPtr<IDBCallbacks> callbacks, PassRefPtr<IDBTransactionBackendImpl> transaction)
    308 {
     307void IDBDatabaseBackendImpl::setIntVersionInternal(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendImpl> database, int64_t version, PassRefPtr<IDBCallbacks> prpCallbacks, PassRefPtr<IDBDatabaseCallbacks> databaseCallbacks, PassRefPtr<IDBTransactionBackendImpl> transaction)
     308{
     309    RefPtr<IDBCallbacks> callbacks(prpCallbacks);
    309310    int64_t databaseId = database->id();
    310311    int64_t oldVersion = database->m_metadata.intVersion;
     
    317318        return;
    318319    }
     320    ASSERT(!database->m_pendingSecondHalfOpenWithVersion);
     321    database->m_pendingSecondHalfOpenWithVersion = PendingOpenWithVersionCall::create(callbacks, databaseCallbacks, version);
    319322    callbacks->onUpgradeNeeded(oldVersion, transaction, database);
    320323}
     
    499502
    500503    RefPtr<IDBDatabaseBackendImpl> database = this;
    501     OwnPtr<ScriptExecutionContext::Task> intVersionTask = createCallbackTask(&IDBDatabaseBackendImpl::setIntVersionInternal, database, requestedVersion, callbacks, transaction);
     504    OwnPtr<ScriptExecutionContext::Task> intVersionTask = createCallbackTask(&IDBDatabaseBackendImpl::setIntVersionInternal, database, requestedVersion, callbacks, databaseCallbacks, transaction);
    502505    OwnPtr<ScriptExecutionContext::Task> resetVersionOnAbortTask = createCallbackTask(&IDBDatabaseBackendImpl::resetVersion, database, m_metadata.version, m_metadata.intVersion);
    503506    if (!transaction->scheduleTask(intVersionTask.release(), resetVersionOnAbortTask.release())) {
     
    507510    }
    508511    ASSERT(!m_pendingSecondHalfOpenWithVersion);
    509     m_pendingSecondHalfOpenWithVersion = PendingOpenWithVersionCall::create(callbacks, databaseCallbacks, requestedVersion);
    510512    m_databaseCallbacksSet.add(databaseCallbacks);
    511513}
  • trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.h

    r133195 r133776  
    9090    static void deleteObjectStoreInternal(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendImpl>, PassRefPtr<IDBObjectStoreBackendImpl>, PassRefPtr<IDBTransactionBackendImpl>);
    9191    static void setVersionInternal(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendImpl>, const String& version, PassRefPtr<IDBCallbacks>, PassRefPtr<IDBTransactionBackendImpl>);
    92     static void setIntVersionInternal(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendImpl>, int64_t version, PassRefPtr<IDBCallbacks>, PassRefPtr<IDBTransactionBackendImpl>);
     92    static void setIntVersionInternal(ScriptExecutionContext*, PassRefPtr<IDBDatabaseBackendImpl>, int64_t version, PassRefPtr<IDBCallbacks>, PassRefPtr<IDBDatabaseCallbacks>, PassRefPtr<IDBTransactionBackendImpl>);
    9393
    9494    // These are used as setVersion transaction abort tasks.
  • trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseCallbacks.h

    r131371 r133776  
    3535namespace WebCore {
    3636
    37 class IDBDatabaseCallbacks : public RefCounted<IDBDatabaseCallbacks> {
     37// FIXME: Uses ThreadSafeRefCounted for storage in ScriptExecutionContext::Task but
     38// it is never actually used on multiple threads. http://webkit.org/b/101483
     39class IDBDatabaseCallbacks : public ThreadSafeRefCounted<IDBDatabaseCallbacks> {
    3840public:
    3941    virtual ~IDBDatabaseCallbacks() { }
Note: See TracChangeset for help on using the changeset viewer.