Title: [194781] trunk
Revision
194781
Author
beid...@apple.com
Date
2016-01-08 13:12:08 -0800 (Fri, 08 Jan 2016)

Log 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:

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (194780 => 194781)


--- trunk/LayoutTests/ChangeLog	2016-01-08 21:01:26 UTC (rev 194780)
+++ trunk/LayoutTests/ChangeLog	2016-01-08 21:12:08 UTC (rev 194781)
@@ -1,3 +1,24 @@
+2016-01-08  Brady Eidson  <beid...@apple.com>
+
+        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.
+
+        * 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:
+
 2016-01-08  Michael Catanzaro  <mcatanz...@igalia.com>
 
         [GTK] Several animation tests fail with accelerated compositing enabled

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (194780 => 194781)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2016-01-08 21:01:26 UTC (rev 194780)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2016-01-08 21:12:08 UTC (rev 194781)
@@ -1,5 +1,16 @@
 2016-01-08  Brady Eidson  <beid...@apple.com>
 
+        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.
+
+        * indexeddb/idbfactory_open12-expected.txt:
+        * indexeddb/idbversionchangeevent-expected.txt:
+        * indexeddb/transaction-lifetime-expected.txt:
+
+2016-01-08  Brady Eidson  <beid...@apple.com>
+
         Modern IDB: imported/w3c/indexeddb/idbobjectstore_createIndex6-event_order.htm fails.
         https://bugs.webkit.org/show_bug.cgi?id=152891
 

Modified: trunk/LayoutTests/imported/w3c/indexeddb/idbfactory_open12-expected.txt (194780 => 194781)


--- trunk/LayoutTests/imported/w3c/indexeddb/idbfactory_open12-expected.txt	2016-01-08 21:01:26 UTC (rev 194780)
+++ trunk/LayoutTests/imported/w3c/indexeddb/idbfactory_open12-expected.txt	2016-01-08 21:12:08 UTC (rev 194781)
@@ -1,4 +1,4 @@
 
 PASS IDBFactory.open() - upgradeneeded gets VersionChangeEvent 
-FAIL IDBFactory.open() - upgradeneeded gets VersionChangeEvent - second upgrade assert_unreached: unexpected open.blocked event Reached unreachable code
+PASS IDBFactory.open() - upgradeneeded gets VersionChangeEvent - second upgrade 
 

Modified: trunk/LayoutTests/imported/w3c/indexeddb/idbversionchangeevent-expected.txt (194780 => 194781)


--- trunk/LayoutTests/imported/w3c/indexeddb/idbversionchangeevent-expected.txt	2016-01-08 21:01:26 UTC (rev 194780)
+++ trunk/LayoutTests/imported/w3c/indexeddb/idbversionchangeevent-expected.txt	2016-01-08 21:12:08 UTC (rev 194781)
@@ -1,3 +1,3 @@
 
-FAIL IDBVersionChangeEvent fired in upgradeneeded, versionchange and deleteDatabase assert_equals: new version (versionchange) expected (object) null but got (number) 0
+PASS IDBVersionChangeEvent fired in upgradeneeded, versionchange and deleteDatabase 
 

Modified: trunk/LayoutTests/imported/w3c/indexeddb/transaction-lifetime-expected.txt (194780 => 194781)


--- trunk/LayoutTests/imported/w3c/indexeddb/transaction-lifetime-expected.txt	2016-01-08 21:01:26 UTC (rev 194780)
+++ trunk/LayoutTests/imported/w3c/indexeddb/transaction-lifetime-expected.txt	2016-01-08 21:12:08 UTC (rev 194781)
@@ -1,3 +1,3 @@
 
-FAIL Test events opening a second database when one connection is open already assert_unreached: open2.blocked Reached unreachable code
+PASS Test events opening a second database when one connection is open already 
 

Modified: trunk/LayoutTests/platform/mac-wk1/TestExpectations (194780 => 194781)


--- trunk/LayoutTests/platform/mac-wk1/TestExpectations	2016-01-08 21:01:26 UTC (rev 194780)
+++ trunk/LayoutTests/platform/mac-wk1/TestExpectations	2016-01-08 21:12:08 UTC (rev 194781)
@@ -74,7 +74,6 @@
 imported/w3c/indexeddb/keyorder.htm [ Skip ]
 
 # W3C IDB tests - Legacy IDB fails, Modern IDB fails differently
-imported/w3c/indexeddb/idbversionchangeevent.htm [ Failure ]
 imported/w3c/indexeddb/keypath.htm [ Failure ]
 
 # W3C IDB tests where the test is wrong (the spec, other browsers, and WebKit all agree)

Copied: trunk/LayoutTests/platform/wk2/imported/w3c/indexeddb/idbfactory_open12-expected.txt (from rev 194780, trunk/LayoutTests/imported/w3c/indexeddb/idbfactory_open12-expected.txt) (0 => 194781)


--- trunk/LayoutTests/platform/wk2/imported/w3c/indexeddb/idbfactory_open12-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/platform/wk2/imported/w3c/indexeddb/idbfactory_open12-expected.txt	2016-01-08 21:12:08 UTC (rev 194781)
@@ -0,0 +1,4 @@
+
+PASS IDBFactory.open() - upgradeneeded gets VersionChangeEvent 
+FAIL IDBFactory.open() - upgradeneeded gets VersionChangeEvent - second upgrade assert_unreached: unexpected open.blocked event Reached unreachable code
+

Copied: trunk/LayoutTests/platform/wk2/imported/w3c/indexeddb/idbversionchangeevent-expected.txt (from rev 194780, trunk/LayoutTests/imported/w3c/indexeddb/idbversionchangeevent-expected.txt) (0 => 194781)


--- trunk/LayoutTests/platform/wk2/imported/w3c/indexeddb/idbversionchangeevent-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/platform/wk2/imported/w3c/indexeddb/idbversionchangeevent-expected.txt	2016-01-08 21:12:08 UTC (rev 194781)
@@ -0,0 +1,3 @@
+
+FAIL IDBVersionChangeEvent fired in upgradeneeded, versionchange and deleteDatabase assert_equals: new version (versionchange) expected (object) null but got (number) 0
+

Modified: trunk/LayoutTests/storage/indexeddb/database-wrapper-expected.txt (194780 => 194781)


--- trunk/LayoutTests/storage/indexeddb/database-wrapper-expected.txt	2016-01-08 21:01:26 UTC (rev 194780)
+++ trunk/LayoutTests/storage/indexeddb/database-wrapper-expected.txt	2016-01-08 21:12:08 UTC (rev 194781)
@@ -27,9 +27,6 @@
 event.target.close()
 sawVersionChangeEvent = true
 
-onBlocked():
-FIXME: Blocked event shouldn't fire. http://crbug.com/100123
-
 openAgainSuccess():
 PASS sawVersionChangeEvent is true
 PASS successfullyParsed is true

Modified: trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-expected.txt (194780 => 194781)


--- trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-expected.txt	2016-01-08 21:01:26 UTC (rev 194780)
+++ trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-expected.txt	2016-01-08 21:12:08 UTC (rev 194781)
@@ -27,14 +27,9 @@
 Closing the connection before the IDBOpenDBRequest's success fires will cause the open to fail.
 db.close()
 
-deleteBlockedCallback():
-PASS sawVersionChange is true
-sawDeleteBlocked = true
-
 deleteSuccessCallback():
 PASS sawVersionChange is true
-FIXME: Blocked events shouldn't fire if connections close in versionchange handler. http://crbug.com/100123
-FAIL sawDeleteBlocked should be false. Was true.
+PASS sawDeleteBlocked is false
 PASS sawUpgradeNeeded is true
 PASS successfullyParsed is true
 

Modified: trunk/LayoutTests/storage/indexeddb/deletedatabase-not-blocked-expected.txt (194780 => 194781)


--- trunk/LayoutTests/storage/indexeddb/deletedatabase-not-blocked-expected.txt	2016-01-08 21:01:26 UTC (rev 194780)
+++ trunk/LayoutTests/storage/indexeddb/deletedatabase-not-blocked-expected.txt	2016-01-08 21:12:08 UTC (rev 194781)
@@ -19,12 +19,8 @@
 PASS event.newVersion is null
 h.close()
 
-deleteDatabaseOnBlocked():
-blockedEventFired = true
-
 deleteDatabaseOnSuccess():
-FIXME: blocked event should not fire since connection closed. http://webkit.org/b/71130
-FAIL blockedEventFired should be false. Was true.
+PASS blockedEventFired is false
 PASS successfullyParsed is true
 
 TEST COMPLETE

Modified: trunk/LayoutTests/storage/indexeddb/intversion-upgrades-expected.txt (194780 => 194781)


--- trunk/LayoutTests/storage/indexeddb/intversion-upgrades-expected.txt	2016-01-08 21:01:26 UTC (rev 194780)
+++ trunk/LayoutTests/storage/indexeddb/intversion-upgrades-expected.txt	2016-01-08 21:12:08 UTC (rev 194781)
@@ -23,9 +23,6 @@
 connection1VersionChangeCallback():
 connection1.close()
 
-connection2BlockedCallback():
-This should not be called: http://crbug.com/100123
-
 connection2UpgradeNeeded():
 connection2 = event.target.result
 PASS String(connection2) is "[object IDBDatabase]"

Modified: trunk/LayoutTests/storage/indexeddb/resources/delete-in-upgradeneeded-close-in-versionchange.js (194780 => 194781)


--- trunk/LayoutTests/storage/indexeddb/resources/delete-in-upgradeneeded-close-in-versionchange.js	2016-01-08 21:01:26 UTC (rev 194780)
+++ trunk/LayoutTests/storage/indexeddb/resources/delete-in-upgradeneeded-close-in-versionchange.js	2016-01-08 21:12:08 UTC (rev 194781)
@@ -63,7 +63,6 @@
 {
     preamble(evt);
     shouldBeTrue("sawVersionChange");
-    debug("FIXME: Blocked events shouldn't fire if connections close in versionchange handler. http://crbug.com/100123");
     shouldBeFalse("sawDeleteBlocked");
     shouldBeTrue("sawUpgradeNeeded");
     finishJSTest();

Modified: trunk/LayoutTests/storage/indexeddb/resources/deletedatabase-not-blocked.js (194780 => 194781)


--- trunk/LayoutTests/storage/indexeddb/resources/deletedatabase-not-blocked.js	2016-01-08 21:01:26 UTC (rev 194780)
+++ trunk/LayoutTests/storage/indexeddb/resources/deletedatabase-not-blocked.js	2016-01-08 21:12:08 UTC (rev 194781)
@@ -34,7 +34,6 @@
         };
         request._onsuccess_ = function deleteDatabaseOnSuccess(evt) {
             preamble(evt);
-            debug("FIXME: blocked event should not fire since connection closed. http://webkit.org/b/71130");
             shouldBeFalse("blockedEventFired");
             finishJSTest();
         };

Modified: trunk/LayoutTests/storage/indexeddb/resources/setversion-not-blocked.js (194780 => 194781)


--- trunk/LayoutTests/storage/indexeddb/resources/setversion-not-blocked.js	2016-01-08 21:01:26 UTC (rev 194780)
+++ trunk/LayoutTests/storage/indexeddb/resources/setversion-not-blocked.js	2016-01-08 21:12:08 UTC (rev 194781)
@@ -42,7 +42,6 @@
     request._onsuccess_ = function h2OpenSuccess(evt) {
         preamble(evt);
         shouldBeTrue("versionchangeEventFired");
-        debug("FIXME: blocked should not have fired since connection closed; http://webkit.org/b/71130");
         shouldBeFalse("blockedEventFired");
         finishJSTest();
     };

Modified: trunk/LayoutTests/storage/indexeddb/setversion-not-blocked-expected.txt (194780 => 194781)


--- trunk/LayoutTests/storage/indexeddb/setversion-not-blocked-expected.txt	2016-01-08 21:01:26 UTC (rev 194780)
+++ trunk/LayoutTests/storage/indexeddb/setversion-not-blocked-expected.txt	2016-01-08 21:12:08 UTC (rev 194781)
@@ -22,19 +22,13 @@
 PASS event.newVersion is 2
 h1.close()
 
-h2OpenBlocked():
-PASS event.oldVersion is 1
-PASS event.newVersion is 2
-blockedEventFired = true
-
 h2UpgradeNeeded():
 PASS event.oldVersion is 1
 PASS event.newVersion is 2
 
 h2OpenSuccess():
 PASS versionchangeEventFired is true
-FIXME: blocked should not have fired since connection closed; http://webkit.org/b/71130
-FAIL blockedEventFired should be false. Was true.
+PASS blockedEventFired is false
 PASS successfullyParsed is true
 
 TEST COMPLETE

Modified: trunk/Source/WebCore/ChangeLog (194780 => 194781)


--- trunk/Source/WebCore/ChangeLog	2016-01-08 21:01:26 UTC (rev 194780)
+++ trunk/Source/WebCore/ChangeLog	2016-01-08 21:12:08 UTC (rev 194781)
@@ -1,3 +1,22 @@
+2016-01-08  Brady Eidson  <beid...@apple.com>
+
+        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.
+
+        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:
+
 2016-01-08  Zalan Bujtas  <za...@apple.com>
 
         Hovering link on http://help.apple.com/appletv/#/ does not show text underline.

Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBFactoryImpl.cpp (194780 => 194781)


--- trunk/Source/WebCore/Modules/indexeddb/client/IDBFactoryImpl.cpp	2016-01-08 21:01:26 UTC (rev 194780)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBFactoryImpl.cpp	2016-01-08 21:12:08 UTC (rev 194781)
@@ -124,7 +124,7 @@
 
 RefPtr<WebCore::IDBOpenDBRequest> IDBFactory::deleteDatabase(ScriptExecutionContext* context, const String& name, ExceptionCode& ec)
 {
-    LOG(IndexedDB, "IDBFactory::deleteDatabase");
+    LOG(IndexedDB, "IDBFactory::deleteDatabase - %s", name.utf8().data());
 
     if (name.isNull()) {
         ec = TypeError;

Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp (194780 => 194781)


--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp	2016-01-08 21:01:26 UTC (rev 194780)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp	2016-01-08 21:12:08 UTC (rev 194781)
@@ -164,9 +164,8 @@
 void UniqueIDBDatabase::performCurrentDeleteOperation()
 {
     ASSERT(isMainThread());
-    LOG(IndexedDB, "(main) UniqueIDBDatabase::performCurrentDeleteOperation");
+    LOG(IndexedDB, "(main) UniqueIDBDatabase::performCurrentDeleteOperation - %s", m_identifier.debugString().utf8().data());
 
-    ASSERT(m_databaseInfo);
     ASSERT(m_currentOpenDBRequest);
     ASSERT(m_currentOpenDBRequest->isDeleteRequest());
 
@@ -189,8 +188,17 @@
     ASSERT(m_pendingTransactions.isEmpty());
     ASSERT(m_openDatabaseConnections.isEmpty());
 
-    m_deleteBackingStoreInProgress = true;
-    m_server.postDatabaseTask(createCrossThreadTask(*this, &UniqueIDBDatabase::deleteBackingStore));
+    // It's possible to have multiple delete requests queued up in a row.
+    // In that scenario only the first request will actually have to delete the database.
+    // Subsequent requests can immediately notify their completion.
+
+    if (m_databaseInfo) {
+        m_deleteBackingStoreInProgress = true;
+        m_server.postDatabaseTask(createCrossThreadTask(*this, &UniqueIDBDatabase::deleteBackingStore));
+    } else {
+        ASSERT(m_mostRecentDeletedDatabaseInfo);
+        didDeleteBackingStore();
+    }
 }
 
 void UniqueIDBDatabase::deleteBackingStore()
@@ -211,7 +219,6 @@
     ASSERT(isMainThread());
     LOG(IndexedDB, "(main) UniqueIDBDatabase::didDeleteBackingStore");
 
-    ASSERT(m_databaseInfo);
     ASSERT(m_currentOpenDBRequest);
     ASSERT(m_currentOpenDBRequest->isDeleteRequest());
     ASSERT(!hasAnyPendingCallbacks());
@@ -219,9 +226,13 @@
     ASSERT(m_pendingTransactions.isEmpty());
     ASSERT(m_openDatabaseConnections.isEmpty());
 
-    m_currentOpenDBRequest->notifyDidDeleteDatabase(*m_databaseInfo);
+    if (m_databaseInfo)
+        m_mostRecentDeletedDatabaseInfo = WTFMove(m_databaseInfo);
+
+    ASSERT(m_mostRecentDeletedDatabaseInfo);
+    m_currentOpenDBRequest->notifyDidDeleteDatabase(*m_mostRecentDeletedDatabaseInfo);
     m_currentOpenDBRequest = nullptr;
-    m_databaseInfo = nullptr;
+
     m_deletePending = false;
     m_deleteBackingStoreInProgress = false;
 
@@ -1007,9 +1018,6 @@
 
     ASSERT(m_openDatabaseConnections.contains(&connection));
 
-    if (m_currentOpenDBRequest)
-        notifyCurrentRequestConnectionClosedOrFiredVersionChangeEvent(connection.identifier());
-
     Deque<RefPtr<UniqueIDBDatabaseTransaction>> pendingTransactions;
     while (!m_pendingTransactions.isEmpty()) {
         auto transaction = m_pendingTransactions.takeFirst();
@@ -1022,6 +1030,10 @@
 
     RefPtr<UniqueIDBDatabaseConnection> refConnection(&connection);
     m_openDatabaseConnections.remove(&connection);
+
+    if (m_currentOpenDBRequest)
+        notifyCurrentRequestConnectionClosedOrFiredVersionChangeEvent(connection.identifier());
+
     if (connection.hasNonFinishedTransactions()) {
         m_closePendingDatabaseConnections.add(WTFMove(refConnection));
         return;

Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h (194780 => 194781)


--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h	2016-01-08 21:01:26 UTC (rev 194780)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h	2016-01-08 21:12:08 UTC (rev 194781)
@@ -193,6 +193,7 @@
     bool m_isOpeningBackingStore { false };
     std::unique_ptr<IDBBackingStore> m_backingStore;
     std::unique_ptr<IDBDatabaseInfo> m_databaseInfo;
+    std::unique_ptr<IDBDatabaseInfo> m_mostRecentDeletedDatabaseInfo;
 
     HashMap<uint64_t, ErrorCallback> m_errorCallbacks;
     HashMap<uint64_t, KeyDataCallback> m_keyDataCallbacks;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to