Changeset 194781 in webkit


Ignore:
Timestamp:
Jan 8, 2016 1:12:08 PM (8 years ago)
Author:
beidson@apple.com
Message:

Modern IDB: Blocked event can fire on a delete request even after the last open connection has closed.
https://bugs.webkit.org/show_bug.cgi?id=152896

Reviewed by Alex Christensen.

LayoutTests/imported/w3c:

  • indexeddb/idbfactory_open12-expected.txt:
  • indexeddb/idbversionchangeevent-expected.txt:
  • indexeddb/transaction-lifetime-expected.txt:

Source/WebCore:

No new tests (Progression in many tests).

  • Modules/indexeddb/client/IDBFactoryImpl.cpp:

(WebCore::IDBClient::IDBFactory::deleteDatabase):

  • Modules/indexeddb/server/UniqueIDBDatabase.cpp:

(WebCore::IDBServer::UniqueIDBDatabase::performCurrentDeleteOperation): Allow for handling 2+ delete operations in a row.
(WebCore::IDBServer::UniqueIDBDatabase::didDeleteBackingStore): Ditto.
(WebCore::IDBServer::UniqueIDBDatabase::connectionClosedFromClient): Call "notifyCurrentRequestConnectionClosedOrFiredVersionChangeEvent"

after the connection is actually removed from the set of open connections.

  • Modules/indexeddb/server/UniqueIDBDatabase.h:

LayoutTests:

  • platform/mac-wk1/TestExpectations:
  • platform/wk2/imported/w3c/indexeddb/idbfactory_open12-expected.txt: Copied from LayoutTests/imported/w3c/indexeddb/idbfactory_open12-expected.txt.
  • platform/wk2/imported/w3c/indexeddb/idbversionchangeevent-expected.txt: Copied from LayoutTests/imported/w3c/indexeddb/idbversionchangeevent-expected.txt.
  • storage/indexeddb/database-wrapper-expected.txt:
  • storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-expected.txt:
  • storage/indexeddb/deletedatabase-not-blocked-expected.txt:
  • storage/indexeddb/intversion-upgrades-expected.txt:
  • storage/indexeddb/resources/delete-in-upgradeneeded-close-in-versionchange.js:
  • storage/indexeddb/resources/deletedatabase-not-blocked.js:
  • storage/indexeddb/resources/setversion-not-blocked.js:
  • storage/indexeddb/setversion-not-blocked-expected.txt:
Location:
trunk
Files:
18 edited
2 copied

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r194779 r194781  
     12016-01-08  Brady Eidson  <beidson@apple.com>
     2
     3        Modern IDB: Blocked event can fire on a delete request even after the last open connection has closed.
     4        https://bugs.webkit.org/show_bug.cgi?id=152896
     5
     6        Reviewed by Alex Christensen.
     7
     8        * platform/mac-wk1/TestExpectations:
     9       
     10        * platform/wk2/imported/w3c/indexeddb/idbfactory_open12-expected.txt: Copied from LayoutTests/imported/w3c/indexeddb/idbfactory_open12-expected.txt.
     11        * platform/wk2/imported/w3c/indexeddb/idbversionchangeevent-expected.txt: Copied from LayoutTests/imported/w3c/indexeddb/idbversionchangeevent-expected.txt.
     12       
     13        * storage/indexeddb/database-wrapper-expected.txt:
     14        * storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-expected.txt:
     15        * storage/indexeddb/deletedatabase-not-blocked-expected.txt:
     16        * storage/indexeddb/intversion-upgrades-expected.txt:
     17        * storage/indexeddb/resources/delete-in-upgradeneeded-close-in-versionchange.js:
     18        * storage/indexeddb/resources/deletedatabase-not-blocked.js:
     19        * storage/indexeddb/resources/setversion-not-blocked.js:
     20        * storage/indexeddb/setversion-not-blocked-expected.txt:
     21
    1222016-01-08  Michael Catanzaro  <mcatanzaro@igalia.com>
    223
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r194771 r194781  
     12016-01-08  Brady Eidson  <beidson@apple.com>
     2
     3        Modern IDB: Blocked event can fire on a delete request even after the last open connection has closed.
     4        https://bugs.webkit.org/show_bug.cgi?id=152896
     5
     6        Reviewed by Alex Christensen.
     7
     8        * indexeddb/idbfactory_open12-expected.txt:
     9        * indexeddb/idbversionchangeevent-expected.txt:
     10        * indexeddb/transaction-lifetime-expected.txt:
     11
    1122016-01-08  Brady Eidson  <beidson@apple.com>
    213
  • trunk/LayoutTests/imported/w3c/indexeddb/idbfactory_open12-expected.txt

    r189264 r194781  
    11
    22PASS IDBFactory.open() - upgradeneeded gets VersionChangeEvent
    3 FAIL IDBFactory.open() - upgradeneeded gets VersionChangeEvent - second upgrade assert_unreached: unexpected open.blocked event Reached unreachable code
     3PASS IDBFactory.open() - upgradeneeded gets VersionChangeEvent - second upgrade
    44
  • trunk/LayoutTests/imported/w3c/indexeddb/idbversionchangeevent-expected.txt

    r189264 r194781  
    11
    2 FAIL IDBVersionChangeEvent fired in upgradeneeded, versionchange and deleteDatabase assert_equals: new version (versionchange) expected (object) null but got (number) 0
     2PASS IDBVersionChangeEvent fired in upgradeneeded, versionchange and deleteDatabase
    33
  • trunk/LayoutTests/imported/w3c/indexeddb/transaction-lifetime-expected.txt

    r189264 r194781  
    11
    2 FAIL Test events opening a second database when one connection is open already assert_unreached: open2.blocked Reached unreachable code
     2PASS Test events opening a second database when one connection is open already
    33
  • trunk/LayoutTests/platform/mac-wk1/TestExpectations

    r194771 r194781  
    7575
    7676# W3C IDB tests - Legacy IDB fails, Modern IDB fails differently
    77 imported/w3c/indexeddb/idbversionchangeevent.htm [ Failure ]
    7877imported/w3c/indexeddb/keypath.htm [ Failure ]
    7978
  • trunk/LayoutTests/storage/indexeddb/database-wrapper-expected.txt

    r163963 r194781  
    2828sawVersionChangeEvent = true
    2929
    30 onBlocked():
    31 FIXME: Blocked event shouldn't fire. http://crbug.com/100123
    32 
    3330openAgainSuccess():
    3431PASS sawVersionChangeEvent is true
  • trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-expected.txt

    r163963 r194781  
    2828db.close()
    2929
    30 deleteBlockedCallback():
    31 PASS sawVersionChange is true
    32 sawDeleteBlocked = true
    33 
    3430deleteSuccessCallback():
    3531PASS sawVersionChange is true
    36 FIXME: Blocked events shouldn't fire if connections close in versionchange handler. http://crbug.com/100123
    37 FAIL sawDeleteBlocked should be false. Was true.
     32PASS sawDeleteBlocked is false
    3833PASS sawUpgradeNeeded is true
    3934PASS successfullyParsed is true
  • trunk/LayoutTests/storage/indexeddb/deletedatabase-not-blocked-expected.txt

    r141013 r194781  
    2020h.close()
    2121
    22 deleteDatabaseOnBlocked():
    23 blockedEventFired = true
    24 
    2522deleteDatabaseOnSuccess():
    26 FIXME: blocked event should not fire since connection closed. http://webkit.org/b/71130
    27 FAIL blockedEventFired should be false. Was true.
     23PASS blockedEventFired is false
    2824PASS successfullyParsed is true
    2925
  • trunk/LayoutTests/storage/indexeddb/intversion-upgrades-expected.txt

    r193980 r194781  
    2323connection1VersionChangeCallback():
    2424connection1.close()
    25 
    26 connection2BlockedCallback():
    27 This should not be called: http://crbug.com/100123
    2825
    2926connection2UpgradeNeeded():
  • trunk/LayoutTests/storage/indexeddb/resources/delete-in-upgradeneeded-close-in-versionchange.js

    r163963 r194781  
    6464    preamble(evt);
    6565    shouldBeTrue("sawVersionChange");
    66     debug("FIXME: Blocked events shouldn't fire if connections close in versionchange handler. http://crbug.com/100123");
    6766    shouldBeFalse("sawDeleteBlocked");
    6867    shouldBeTrue("sawUpgradeNeeded");
  • trunk/LayoutTests/storage/indexeddb/resources/deletedatabase-not-blocked.js

    r163963 r194781  
    3535        request.onsuccess = function deleteDatabaseOnSuccess(evt) {
    3636            preamble(evt);
    37             debug("FIXME: blocked event should not fire since connection closed. http://webkit.org/b/71130");
    3837            shouldBeFalse("blockedEventFired");
    3938            finishJSTest();
  • trunk/LayoutTests/storage/indexeddb/resources/setversion-not-blocked.js

    r163963 r194781  
    4343        preamble(evt);
    4444        shouldBeTrue("versionchangeEventFired");
    45         debug("FIXME: blocked should not have fired since connection closed; http://webkit.org/b/71130");
    4645        shouldBeFalse("blockedEventFired");
    4746        finishJSTest();
  • trunk/LayoutTests/storage/indexeddb/setversion-not-blocked-expected.txt

    r135223 r194781  
    2323h1.close()
    2424
    25 h2OpenBlocked():
    26 PASS event.oldVersion is 1
    27 PASS event.newVersion is 2
    28 blockedEventFired = true
    29 
    3025h2UpgradeNeeded():
    3126PASS event.oldVersion is 1
     
    3429h2OpenSuccess():
    3530PASS versionchangeEventFired is true
    36 FIXME: blocked should not have fired since connection closed; http://webkit.org/b/71130
    37 FAIL blockedEventFired should be false. Was true.
     31PASS blockedEventFired is false
    3832PASS successfullyParsed is true
    3933
  • trunk/Source/WebCore/ChangeLog

    r194775 r194781  
     12016-01-08  Brady Eidson  <beidson@apple.com>
     2
     3        Modern IDB: Blocked event can fire on a delete request even after the last open connection has closed.
     4        https://bugs.webkit.org/show_bug.cgi?id=152896
     5
     6        Reviewed by Alex Christensen.
     7
     8        No new tests (Progression in many tests).
     9
     10        * Modules/indexeddb/client/IDBFactoryImpl.cpp:
     11        (WebCore::IDBClient::IDBFactory::deleteDatabase):
     12       
     13        * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
     14        (WebCore::IDBServer::UniqueIDBDatabase::performCurrentDeleteOperation): Allow for handling 2+ delete operations in a row.
     15        (WebCore::IDBServer::UniqueIDBDatabase::didDeleteBackingStore): Ditto.
     16        (WebCore::IDBServer::UniqueIDBDatabase::connectionClosedFromClient): Call "notifyCurrentRequestConnectionClosedOrFiredVersionChangeEvent"
     17          after the connection is actually removed from the set of open connections.
     18        * Modules/indexeddb/server/UniqueIDBDatabase.h:
     19
    1202016-01-08  Zalan Bujtas  <zalan@apple.com>
    221
  • trunk/Source/WebCore/Modules/indexeddb/client/IDBFactoryImpl.cpp

    r193428 r194781  
    125125RefPtr<WebCore::IDBOpenDBRequest> IDBFactory::deleteDatabase(ScriptExecutionContext* context, const String& name, ExceptionCode& ec)
    126126{
    127     LOG(IndexedDB, "IDBFactory::deleteDatabase");
     127    LOG(IndexedDB, "IDBFactory::deleteDatabase - %s", name.utf8().data());
    128128
    129129    if (name.isNull()) {
  • trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp

    r194671 r194781  
    165165{
    166166    ASSERT(isMainThread());
    167     LOG(IndexedDB, "(main) UniqueIDBDatabase::performCurrentDeleteOperation");
    168 
    169     ASSERT(m_databaseInfo);
     167    LOG(IndexedDB, "(main) UniqueIDBDatabase::performCurrentDeleteOperation - %s", m_identifier.debugString().utf8().data());
     168
    170169    ASSERT(m_currentOpenDBRequest);
    171170    ASSERT(m_currentOpenDBRequest->isDeleteRequest());
     
    190189    ASSERT(m_openDatabaseConnections.isEmpty());
    191190
    192     m_deleteBackingStoreInProgress = true;
    193     m_server.postDatabaseTask(createCrossThreadTask(*this, &UniqueIDBDatabase::deleteBackingStore));
     191    // It's possible to have multiple delete requests queued up in a row.
     192    // In that scenario only the first request will actually have to delete the database.
     193    // Subsequent requests can immediately notify their completion.
     194
     195    if (m_databaseInfo) {
     196        m_deleteBackingStoreInProgress = true;
     197        m_server.postDatabaseTask(createCrossThreadTask(*this, &UniqueIDBDatabase::deleteBackingStore));
     198    } else {
     199        ASSERT(m_mostRecentDeletedDatabaseInfo);
     200        didDeleteBackingStore();
     201    }
    194202}
    195203
     
    212220    LOG(IndexedDB, "(main) UniqueIDBDatabase::didDeleteBackingStore");
    213221
    214     ASSERT(m_databaseInfo);
    215222    ASSERT(m_currentOpenDBRequest);
    216223    ASSERT(m_currentOpenDBRequest->isDeleteRequest());
     
    220227    ASSERT(m_openDatabaseConnections.isEmpty());
    221228
    222     m_currentOpenDBRequest->notifyDidDeleteDatabase(*m_databaseInfo);
     229    if (m_databaseInfo)
     230        m_mostRecentDeletedDatabaseInfo = WTFMove(m_databaseInfo);
     231
     232    ASSERT(m_mostRecentDeletedDatabaseInfo);
     233    m_currentOpenDBRequest->notifyDidDeleteDatabase(*m_mostRecentDeletedDatabaseInfo);
    223234    m_currentOpenDBRequest = nullptr;
    224     m_databaseInfo = nullptr;
     235
    225236    m_deletePending = false;
    226237    m_deleteBackingStoreInProgress = false;
     
    10081019    ASSERT(m_openDatabaseConnections.contains(&connection));
    10091020
    1010     if (m_currentOpenDBRequest)
    1011         notifyCurrentRequestConnectionClosedOrFiredVersionChangeEvent(connection.identifier());
    1012 
    10131021    Deque<RefPtr<UniqueIDBDatabaseTransaction>> pendingTransactions;
    10141022    while (!m_pendingTransactions.isEmpty()) {
     
    10231031    RefPtr<UniqueIDBDatabaseConnection> refConnection(&connection);
    10241032    m_openDatabaseConnections.remove(&connection);
     1033
     1034    if (m_currentOpenDBRequest)
     1035        notifyCurrentRequestConnectionClosedOrFiredVersionChangeEvent(connection.identifier());
     1036
    10251037    if (connection.hasNonFinishedTransactions()) {
    10261038        m_closePendingDatabaseConnections.add(WTFMove(refConnection));
  • trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h

    r194670 r194781  
    194194    std::unique_ptr<IDBBackingStore> m_backingStore;
    195195    std::unique_ptr<IDBDatabaseInfo> m_databaseInfo;
     196    std::unique_ptr<IDBDatabaseInfo> m_mostRecentDeletedDatabaseInfo;
    196197
    197198    HashMap<uint64_t, ErrorCallback> m_errorCallbacks;
Note: See TracChangeset for help on using the changeset viewer.