Title: [138268] trunk
Revision
138268
Author
jsb...@chromium.org
Date
2012-12-20 10:21:35 -0800 (Thu, 20 Dec 2012)

Log Message

IndexedDB: Layout test showing delete database getting two blocked events
https://bugs.webkit.org/show_bug.cgi?id=92674

Reviewed by Tony Chang.

Source/WebCore:

Match the steps specified behavior for deleteDatabase() in the spec: versionchange/blocked
events fire if necessary, then waits until a condition is satisfied before continuing with
the steps to delete the database. The bug was caused by retrying the full call again. Events
are also now sent out immediately when a "versionchange" transaction is running, rather
than entering a limbo state - again, the new behavior matches the spec more accurately.

Tests: storage/indexeddb/delete-in-upgradeneeded-close-in-open-success.html
       storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange.html
       storage/indexeddb/deletedatabase-delayed-by-open-and-versionchange.html
       storage/indexeddb/intversion-gated-on-delete.html

* Modules/indexeddb/IDBDatabaseBackendImpl.cpp:
(WebCore::IDBDatabaseBackendImpl::processPendingCalls):
(WebCore::IDBDatabaseBackendImpl::deleteDatabase): First half of the steps.
(WebCore):
(WebCore::IDBDatabaseBackendImpl::isDeleteDatabaseBlocked): Pull out condition test.
(WebCore::IDBDatabaseBackendImpl::deleteDatabaseFinal): Second half of the of steps.
* Modules/indexeddb/IDBDatabaseBackendImpl.h:
(IDBDatabaseBackendImpl):

LayoutTests:

Update/add tests to match the expected behavior where blocked/versionchange events fire
even when a "versionchange" transaction is running.

* storage/indexeddb/delete-in-upgradeneeded-close-in-open-success-expected.txt: Copied from LayoutTests/storage/indexeddb/intversion-delete-in-upgradeneeded-expected.txt.
* storage/indexeddb/delete-in-upgradeneeded-close-in-open-success.html: Copied from LayoutTests/storage/indexeddb/intversion-delete-in-upgradeneeded.html.
* storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-expected.txt: Renamed from LayoutTests/storage/indexeddb/intversion-delete-in-upgradeneeded-expected.txt.
* storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange.html: Renamed from LayoutTests/storage/indexeddb/intversion-delete-in-upgradeneeded.html.
* storage/indexeddb/deletedatabase-delayed-by-open-and-versionchange-expected.txt:
* storage/indexeddb/deletedatabase-delayed-by-versionchange-expected.txt:
* storage/indexeddb/intversion-gated-on-delete-expected.txt:
* storage/indexeddb/resources/delete-in-upgradeneeded-close-in-open-success.js: Copied from LayoutTests/storage/indexeddb/resources/intversion-delete-in-upgradeneeded.js.
* storage/indexeddb/resources/delete-in-upgradeneeded-close-in-versionchange.js: Renamed from LayoutTests/storage/indexeddb/resources/intversion-delete-in-upgradeneeded.js.
* storage/indexeddb/resources/deletedatabase-delayed-by-open-and-versionchange.js:
* storage/indexeddb/resources/factory-deletedatabase.js:
* storage/indexeddb/resources/intversion-gated-on-delete.js:

Modified Paths

Added Paths

Removed Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (138267 => 138268)


--- trunk/LayoutTests/ChangeLog	2012-12-20 18:21:28 UTC (rev 138267)
+++ trunk/LayoutTests/ChangeLog	2012-12-20 18:21:35 UTC (rev 138268)
@@ -1,3 +1,26 @@
+2012-12-20  Joshua Bell  <jsb...@chromium.org>
+
+        IndexedDB: Layout test showing delete database getting two blocked events
+        https://bugs.webkit.org/show_bug.cgi?id=92674
+
+        Reviewed by Tony Chang.
+
+        Update/add tests to match the expected behavior where blocked/versionchange events fire
+        even when a "versionchange" transaction is running.
+
+        * storage/indexeddb/delete-in-upgradeneeded-close-in-open-success-expected.txt: Copied from LayoutTests/storage/indexeddb/intversion-delete-in-upgradeneeded-expected.txt.
+        * storage/indexeddb/delete-in-upgradeneeded-close-in-open-success.html: Copied from LayoutTests/storage/indexeddb/intversion-delete-in-upgradeneeded.html.
+        * storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-expected.txt: Renamed from LayoutTests/storage/indexeddb/intversion-delete-in-upgradeneeded-expected.txt.
+        * storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange.html: Renamed from LayoutTests/storage/indexeddb/intversion-delete-in-upgradeneeded.html.
+        * storage/indexeddb/deletedatabase-delayed-by-open-and-versionchange-expected.txt:
+        * storage/indexeddb/deletedatabase-delayed-by-versionchange-expected.txt:
+        * storage/indexeddb/intversion-gated-on-delete-expected.txt:
+        * storage/indexeddb/resources/delete-in-upgradeneeded-close-in-open-success.js: Copied from LayoutTests/storage/indexeddb/resources/intversion-delete-in-upgradeneeded.js.
+        * storage/indexeddb/resources/delete-in-upgradeneeded-close-in-versionchange.js: Renamed from LayoutTests/storage/indexeddb/resources/intversion-delete-in-upgradeneeded.js.
+        * storage/indexeddb/resources/deletedatabase-delayed-by-open-and-versionchange.js:
+        * storage/indexeddb/resources/factory-deletedatabase.js:
+        * storage/indexeddb/resources/intversion-gated-on-delete.js:
+
 2012-12-20  Tony Chang  <t...@chromium.org>
 
         [chromium] Unreviewed gardening.

Copied: trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-open-success-expected.txt (from rev 138265, trunk/LayoutTests/storage/indexeddb/intversion-delete-in-upgradeneeded-expected.txt) (0 => 138268)


--- trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-open-success-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-open-success-expected.txt	2012-12-20 18:21:35 UTC (rev 138268)
@@ -0,0 +1,45 @@
+Test that a deleteDatabase called while handling an upgradeneeded event is queued and fires its events at the right time. The close() call to unblock the delete occurs in the open request's 'success' event handler.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+dbname = "delete-in-upgradeneeded-close-in-open-success.html"
+indexedDB.deleteDatabase(dbname)
+
+initiallyDeleted():
+request = indexedDB.open(dbname, 1)
+
+upgradeNeededCallback():
+PASS sawUpgradeNeeded is false
+sawUpgradeNeeded = true
+PASS event.oldVersion is 0
+PASS event.newVersion is 1
+db = event.target.result
+deleteRequest = indexedDB.deleteDatabase(dbname)
+request2._onsuccess_ = deleteSuccessCallback
+
+versionChangeCallback():
+FIXME: These shouldn't be undefined. http://crbug.com/153122
+FAIL event.oldVersion should be 1 (of type number). Was undefined (of type undefined).
+FAIL event.newVersion should be null (of type object). Was undefined (of type undefined).
+sawVersionChange = true
+
+deleteBlockedCallback():
+PASS sawVersionChange is true
+sawDeleteBlocked = true
+
+openSuccess():
+PASS sawUpgradeNeeded is true
+db = event.target.result
+PASS db.version is 1
+db.close()
+
+deleteSuccessCallback():
+PASS sawVersionChange is true
+PASS sawDeleteBlocked is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Copied: trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-open-success.html (from rev 138265, trunk/LayoutTests/storage/indexeddb/intversion-delete-in-upgradeneeded.html) (0 => 138268)


--- trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-open-success.html	                        (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-open-success.html	2012-12-20 18:21:35 UTC (rev 138268)
@@ -0,0 +1,10 @@
+<html>
+<head>
+<script src=""
+<script src=""
+</head>
+<body>
+<script src=""
+<script src=""
+</body>
+</html>

Copied: trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-expected.txt (from rev 138265, trunk/LayoutTests/storage/indexeddb/intversion-delete-in-upgradeneeded-expected.txt) (0 => 138268)


--- trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange-expected.txt	2012-12-20 18:21:35 UTC (rev 138268)
@@ -0,0 +1,43 @@
+Test that a deleteDatabase called while handling an upgradeneeded event is queued and fires its events at the right time. The close() call to unblock the delete occurs in the connection's 'versionchange' event handler.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
+
+dbname = "delete-in-upgradeneeded-close-in-versionchange.html"
+indexedDB.deleteDatabase(dbname)
+
+initiallyDeleted():
+request = indexedDB.open(dbname, 1)
+
+upgradeNeededCallback():
+PASS sawUpgradeNeeded is false
+sawUpgradeNeeded = true
+PASS event.oldVersion is 0
+PASS event.newVersion is 1
+db = event.target.result
+deleteRequest = indexedDB.deleteDatabase(dbname)
+request2._onsuccess_ = deleteSuccessCallback
+
+versionChangeCallback():
+FIXME: These shouldn't be undefined. http://crbug.com/153122
+FAIL event.oldVersion should be 1 (of type number). Was undefined (of type undefined).
+FAIL event.newVersion should be null (of type object). Was undefined (of type undefined).
+sawVersionChange = true
+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://wkbug.com/71130
+FAIL sawDeleteBlocked should be false. Was true.
+PASS sawUpgradeNeeded is true
+PASS successfullyParsed is true
+
+TEST COMPLETE
+

Copied: trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange.html (from rev 138265, trunk/LayoutTests/storage/indexeddb/intversion-delete-in-upgradeneeded.html) (0 => 138268)


--- trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange.html	                        (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange.html	2012-12-20 18:21:35 UTC (rev 138268)
@@ -0,0 +1,10 @@
+<html>
+<head>
+<script src=""
+<script src=""
+</head>
+<body>
+<script src=""
+<script src=""
+</body>
+</html>

Modified: trunk/LayoutTests/storage/indexeddb/deletedatabase-delayed-by-open-and-versionchange-expected.txt (138267 => 138268)


--- trunk/LayoutTests/storage/indexeddb/deletedatabase-delayed-by-open-and-versionchange-expected.txt	2012-12-20 18:21:28 UTC (rev 138267)
+++ trunk/LayoutTests/storage/indexeddb/deletedatabase-delayed-by-open-and-versionchange-expected.txt	2012-12-20 18:21:35 UTC (rev 138268)
@@ -12,14 +12,15 @@
 h = event.target.result
 indexedDB.deleteDatabase(dbname)
 
-transactionOnComplete():
-versionChangeComplete = true
-
 onVersionChange():
 old = 1
 new = ""
 
 deleteDatabaseOnBlocked():
+
+transactionOnComplete():
+versionChangeComplete = true
+h = event.target.result
 h.close()
 
 deleteDatabaseOnSuccess():

Modified: trunk/LayoutTests/storage/indexeddb/deletedatabase-delayed-by-versionchange-expected.txt (138267 => 138268)


--- trunk/LayoutTests/storage/indexeddb/deletedatabase-delayed-by-versionchange-expected.txt	2012-12-20 18:21:28 UTC (rev 138267)
+++ trunk/LayoutTests/storage/indexeddb/deletedatabase-delayed-by-versionchange-expected.txt	2012-12-20 18:21:35 UTC (rev 138268)
@@ -46,10 +46,6 @@
 deleteDatabaseBlockedEventFired = true
 h1.close()
 
-deleteDatabaseOnBlocked():
-deleteDatabaseBlockedEventFired = true
-h1.close()
-
 deleteDatabaseOnSuccess():
 deleteDatabaseComplete = true
 

Deleted: trunk/LayoutTests/storage/indexeddb/intversion-delete-in-upgradeneeded-expected.txt (138267 => 138268)


--- trunk/LayoutTests/storage/indexeddb/intversion-delete-in-upgradeneeded-expected.txt	2012-12-20 18:21:28 UTC (rev 138267)
+++ trunk/LayoutTests/storage/indexeddb/intversion-delete-in-upgradeneeded-expected.txt	2012-12-20 18:21:35 UTC (rev 138268)
@@ -1,42 +0,0 @@
-Test that a deleteDatabase called while handling an upgradeneeded event is queued and fires its events at the right time
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
-
-dbname = "intversion-delete-in-upgradeneeded.html"
-indexedDB.deleteDatabase(dbname)
-
-initiallyDeleted():
-request = indexedDB.open(dbname, 1)
-
-firstUpgradeNeeded():
-PASS sawFirstUpgradeNeeded is false
-sawFirstUpgradeNeeded = true
-PASS event.oldVersion is 0
-PASS event.newVersion is 1
-PASS alreadyDeleted is false
-deleteRequest = indexedDB.deleteDatabase(dbname)
-request2._onsuccess_ = deleteFromUpgradeNeededSuccess
-
-request.onsuccess():
-PASS sawFirstUpgradeNeeded is true
-db = event.target.result
-PASS db.version is 1
-
-versionChangeCallback():
-FAIL event.oldVersion should be 1 (of type number). Was undefined (of type undefined).
-FAIL event.newVersion should be null (of type object). Was undefined (of type undefined).
-sawVersionChange = true
-db.close()
-
-deleteBlockedCallback():
-This shouldn't happen but for the longstanding http://crbug.com/100123
-
-deleteFromUpgradeNeededSuccess():
-PASS sawVersionChange is true
-PASS successfullyParsed is true
-
-TEST COMPLETE
-

Deleted: trunk/LayoutTests/storage/indexeddb/intversion-delete-in-upgradeneeded.html (138267 => 138268)


--- trunk/LayoutTests/storage/indexeddb/intversion-delete-in-upgradeneeded.html	2012-12-20 18:21:28 UTC (rev 138267)
+++ trunk/LayoutTests/storage/indexeddb/intversion-delete-in-upgradeneeded.html	2012-12-20 18:21:35 UTC (rev 138268)
@@ -1,10 +0,0 @@
-<html>
-<head>
-<script src=""
-<script src=""
-</head>
-<body>
-<script src=""
-<script src=""
-</body>
-</html>

Modified: trunk/LayoutTests/storage/indexeddb/intversion-gated-on-delete-expected.txt (138267 => 138268)


--- trunk/LayoutTests/storage/indexeddb/intversion-gated-on-delete-expected.txt	2012-12-20 18:21:28 UTC (rev 138267)
+++ trunk/LayoutTests/storage/indexeddb/intversion-gated-on-delete-expected.txt	2012-12-20 18:21:35 UTC (rev 138268)
@@ -37,13 +37,8 @@
 event.target.close()
 
 deleteDatabaseBlockedCallback():
-FIXME: this function should only be called once, http://crbug.com/139695
 connection1.close()
 
-deleteDatabaseBlockedCallback():
-FIXME: this function should only be called once, http://crbug.com/139695
-connection1.close()
-
 deleteDatabaseSuccessCallback():
 
 upgradeNeededCallback():

Copied: trunk/LayoutTests/storage/indexeddb/resources/delete-in-upgradeneeded-close-in-open-success.js (from rev 138265, trunk/LayoutTests/storage/indexeddb/resources/intversion-delete-in-upgradeneeded.js) (0 => 138268)


--- trunk/LayoutTests/storage/indexeddb/resources/delete-in-upgradeneeded-close-in-open-success.js	                        (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/resources/delete-in-upgradeneeded-close-in-open-success.js	2012-12-20 18:21:35 UTC (rev 138268)
@@ -0,0 +1,79 @@
+if (this.importScripts) {
+    importScripts('../../../fast/js/resources/js-test-pre.js');
+    importScripts('shared.js');
+}
+
+description("Test that a deleteDatabase called while handling an upgradeneeded event is queued and fires its events at the right time. The close() call to unblock the delete occurs in the open request's 'success' event handler.");
+
+function test()
+{
+    removeVendorPrefixes();
+    setDBNameFromPath();
+
+    request = evalAndLog("indexedDB.deleteDatabase(dbname)");
+    request._onsuccess_ = initiallyDeleted;
+    request._onerror_ = unexpectedErrorCallback;
+}
+
+var sawUpgradeNeeded = false;
+var sawVersionChange = false;
+var sawDeleteBlocked = false;
+
+function initiallyDeleted(evt) {
+    preamble(evt);
+    evalAndLog("request = indexedDB.open(dbname, 1)");
+    request._onupgradeneeded_ = upgradeNeededCallback;
+    request._onsuccess_ = openSuccess;
+    request._onerror_ = unexpectedErrorCallback;
+}
+
+function upgradeNeededCallback(evt)
+{
+    preamble(evt);
+    shouldBeFalse("sawUpgradeNeeded");
+    evalAndLog("sawUpgradeNeeded = true");
+    shouldBe("event.oldVersion", "0");
+    shouldBe("event.newVersion", "1");
+
+    evalAndLog("db = event.target.result");
+    db._onversionchange_ = versionChangeCallback;
+    request2 = evalAndLog("deleteRequest = indexedDB.deleteDatabase(dbname)");
+    evalAndLog("request2._onsuccess_ = deleteSuccessCallback");
+    request2._onerror_ = unexpectedErrorCallback;
+    request2._onblocked_ = deleteBlockedCallback;
+}
+
+function openSuccess(evt)
+{
+    preamble(evt);
+    shouldBeTrue("sawUpgradeNeeded");
+    evalAndLog("db = event.target.result");
+    shouldBe('db.version', '1');
+    evalAndLog("db.close()");
+}
+
+function versionChangeCallback(evt)
+{
+    preamble(evt);
+    debug("FIXME: These shouldn't be undefined. http://crbug.com/153122");
+    shouldBe("event.oldVersion", "1");
+    shouldBeNull("event.newVersion");
+    evalAndLog("sawVersionChange = true");
+}
+
+function deleteBlockedCallback(evt)
+{
+    preamble(evt);
+    shouldBeTrue("sawVersionChange");
+    evalAndLog("sawDeleteBlocked = true");
+}
+
+function deleteSuccessCallback(evt)
+{
+    preamble(evt);
+    shouldBeTrue("sawVersionChange");
+    shouldBeTrue("sawDeleteBlocked");
+    finishJSTest();
+}
+
+test();

Copied: trunk/LayoutTests/storage/indexeddb/resources/delete-in-upgradeneeded-close-in-versionchange.js (from rev 138265, trunk/LayoutTests/storage/indexeddb/resources/intversion-delete-in-upgradeneeded.js) (0 => 138268)


--- trunk/LayoutTests/storage/indexeddb/resources/delete-in-upgradeneeded-close-in-versionchange.js	                        (rev 0)
+++ trunk/LayoutTests/storage/indexeddb/resources/delete-in-upgradeneeded-close-in-versionchange.js	2012-12-20 18:21:35 UTC (rev 138268)
@@ -0,0 +1,73 @@
+if (this.importScripts) {
+    importScripts('../../../fast/js/resources/js-test-pre.js');
+    importScripts('shared.js');
+}
+
+description("Test that a deleteDatabase called while handling an upgradeneeded event is queued and fires its events at the right time. The close() call to unblock the delete occurs in the connection's 'versionchange' event handler.");
+
+function test()
+{
+    removeVendorPrefixes();
+    setDBNameFromPath();
+
+    request = evalAndLog("indexedDB.deleteDatabase(dbname)");
+    request._onsuccess_ = initiallyDeleted;
+    request._onerror_ = unexpectedErrorCallback;
+}
+
+var sawUpgradeNeeded = false;
+var sawVersionChange = false;
+var sawDeleteBlocked = false;
+
+function initiallyDeleted(evt) {
+    preamble(evt);
+    evalAndLog("request = indexedDB.open(dbname, 1)");
+    request._onupgradeneeded_ = upgradeNeededCallback;
+    request._onsuccess_ = unexpectedSuccessCallback;
+}
+
+function upgradeNeededCallback(evt)
+{
+    preamble(evt);
+    shouldBeFalse("sawUpgradeNeeded");
+    evalAndLog("sawUpgradeNeeded = true");
+    shouldBe("event.oldVersion", "0");
+    shouldBe("event.newVersion", "1");
+
+    evalAndLog("db = event.target.result");
+    db._onversionchange_ = versionChangeCallback;
+    request2 = evalAndLog("deleteRequest = indexedDB.deleteDatabase(dbname)");
+    evalAndLog("request2._onsuccess_ = deleteSuccessCallback");
+    request2._onerror_ = unexpectedErrorCallback;
+    request2._onblocked_ = deleteBlockedCallback;
+}
+
+function versionChangeCallback(evt) {
+    preamble(evt);
+    debug("FIXME: These shouldn't be undefined. http://crbug.com/153122");
+    shouldBe("event.oldVersion", "1");
+    shouldBeNull("event.newVersion");
+    evalAndLog("sawVersionChange = true");
+
+    debug("Closing the connection before the IDBOpenDBRequest's success fires will cause the open to fail.");
+    evalAndLog("db.close()");
+}
+
+function deleteBlockedCallback(evt)
+{
+    preamble(evt);
+    shouldBeTrue("sawVersionChange");
+    evalAndLog("sawDeleteBlocked = true");
+}
+
+function deleteSuccessCallback(evt)
+{
+    preamble(evt);
+    shouldBeTrue("sawVersionChange");
+    debug("FIXME: Blocked events shouldn't fire if connections close in versionchange handler. http://wkbug.com/71130");
+    shouldBeFalse("sawDeleteBlocked");
+    shouldBeTrue("sawUpgradeNeeded");
+    finishJSTest();
+}
+
+test();

Modified: trunk/LayoutTests/storage/indexeddb/resources/deletedatabase-delayed-by-open-and-versionchange.js (138267 => 138268)


--- trunk/LayoutTests/storage/indexeddb/resources/deletedatabase-delayed-by-open-and-versionchange.js	2012-12-20 18:21:28 UTC (rev 138267)
+++ trunk/LayoutTests/storage/indexeddb/resources/deletedatabase-delayed-by-open-and-versionchange.js	2012-12-20 18:21:35 UTC (rev 138268)
@@ -5,12 +5,10 @@
 
 description("Test that deleteDatabase is delayed if a VERSION_CHANGE transaction is running");
 
-
-indexedDBTest(prepareDatabase);
+indexedDBTest(prepareDatabase, onOpenSuccess);
 function prepareDatabase()
 {
     evalAndLog("versionChangeComplete = false");
-    event.target.transaction._onabort_ = unexpectedAbortCallback;
     evalAndLog("h = event.target.result");
 
     h._onversionchange_ = function onVersionChange(evt) {
@@ -29,8 +27,6 @@
     request._onerror_ = unexpectedErrorCallback;
     request._onblocked_ = function deleteDatabaseOnBlocked(evt) {
         preamble(evt);
-
-        evalAndLog("h.close()");
     };
     request._onsuccess_ = function deleteDatabaseOnSuccess(evt) {
         preamble(evt);
@@ -38,3 +34,9 @@
         finishJSTest();
     };
 }
+
+function onOpenSuccess()
+{
+    evalAndLog("h = event.target.result");
+    evalAndLog("h.close()");
+}
\ No newline at end of file

Modified: trunk/LayoutTests/storage/indexeddb/resources/factory-deletedatabase.js (138267 => 138268)


--- trunk/LayoutTests/storage/indexeddb/resources/factory-deletedatabase.js	2012-12-20 18:21:28 UTC (rev 138267)
+++ trunk/LayoutTests/storage/indexeddb/resources/factory-deletedatabase.js	2012-12-20 18:21:35 UTC (rev 138268)
@@ -36,7 +36,7 @@
     evalAndLog("db.close()");
 
     request = evalAndLog("indexedDB.open(dbname, 2)");
-    request._onupgradeneeded_ = deleteDatabase;
+    request._onsuccess_ = deleteDatabase;
     request._onerror_ = unexpectedErrorCallback;
 }
 

Deleted: trunk/LayoutTests/storage/indexeddb/resources/intversion-delete-in-upgradeneeded.js (138267 => 138268)


--- trunk/LayoutTests/storage/indexeddb/resources/intversion-delete-in-upgradeneeded.js	2012-12-20 18:21:28 UTC (rev 138267)
+++ trunk/LayoutTests/storage/indexeddb/resources/intversion-delete-in-upgradeneeded.js	2012-12-20 18:21:35 UTC (rev 138268)
@@ -1,83 +0,0 @@
-if (this.importScripts) {
-    importScripts('../../../fast/js/resources/js-test-pre.js');
-    importScripts('shared.js');
-}
-
-description("Test that a deleteDatabase called while handling an upgradeneeded event is queued and fires its events at the right time");
-
-function test()
-{
-    removeVendorPrefixes();
-    setDBNameFromPath();
-
-    request = evalAndLog("indexedDB.deleteDatabase(dbname)");
-    request._onsuccess_ = initiallyDeleted;
-    request._onerror_ = unexpectedErrorCallback;
-}
-
-var sawFirstUpgradeNeeded = false;
-var alreadyDeleted = false;
-function initiallyDeleted(evt) {
-    debug("");
-    debug("initiallyDeleted():");
-    evalAndLog("request = indexedDB.open(dbname, 1)");
-    request._onsuccess_ = openSuccess;
-    request._onerror_ = unexpectedErrorCallback;
-    request._onupgradeneeded_ = firstUpgradeNeeded;
-}
-
-function firstUpgradeNeeded(evt)
-{
-    event = evt;
-    debug("");
-    debug("firstUpgradeNeeded():");
-    shouldBeFalse("sawFirstUpgradeNeeded");
-    evalAndLog("sawFirstUpgradeNeeded = true");
-    shouldBe("event.oldVersion", "0");
-    shouldBe("event.newVersion", "1");
-    shouldBeFalse("alreadyDeleted");
-    if (alreadyDeleted)
-        return;
-    alreadyDeleted = true;
-
-    request2 = evalAndLog("deleteRequest = indexedDB.deleteDatabase(dbname)");
-    evalAndLog("request2._onsuccess_ = deleteFromUpgradeNeededSuccess");
-    request2._onerror_ = unexpectedErrorCallback;
-    request2._onblocked_ = deleteBlockedCallback;
-}
-
-sawVersionChange = false;
-function openSuccess(evt)
-{
-    event = evt;
-    debug("");
-    debug("request.onsuccess():");
-    shouldBeTrue("sawFirstUpgradeNeeded");
-    evalAndLog("db = event.target.result");
-    db._onversionchange_ = versionChangeCallback;
-    shouldBe('db.version', '1');
-}
-
-function versionChangeCallback(evt) {
-    preamble();
-    shouldBe("event.oldVersion", "1");
-    shouldBeNull("event.newVersion");
-    evalAndLog("sawVersionChange = true");
-    evalAndLog("db.close()");
-}
-
-function deleteBlockedCallback(evt)
-{
-    preamble();
-    debug("This shouldn't happen but for the longstanding http://crbug.com/100123");
-}
-
-function deleteFromUpgradeNeededSuccess(evt)
-{
-    debug("");
-    debug("deleteFromUpgradeNeededSuccess():");
-    shouldBeTrue("sawVersionChange");
-    finishJSTest();
-}
-
-test();

Modified: trunk/LayoutTests/storage/indexeddb/resources/intversion-gated-on-delete.js (138267 => 138268)


--- trunk/LayoutTests/storage/indexeddb/resources/intversion-gated-on-delete.js	2012-12-20 18:21:28 UTC (rev 138267)
+++ trunk/LayoutTests/storage/indexeddb/resources/intversion-gated-on-delete.js	2012-12-20 18:21:35 UTC (rev 138268)
@@ -69,7 +69,6 @@
 function deleteDatabaseBlockedCallback(evt)
 {
     preamble(evt);
-    debug("FIXME: this function should only be called once, http://crbug.com/139695");
     evalAndLog("connection1.close()");
 }
 

Modified: trunk/Source/WebCore/ChangeLog (138267 => 138268)


--- trunk/Source/WebCore/ChangeLog	2012-12-20 18:21:28 UTC (rev 138267)
+++ trunk/Source/WebCore/ChangeLog	2012-12-20 18:21:35 UTC (rev 138268)
@@ -1,3 +1,30 @@
+2012-12-20  Joshua Bell  <jsb...@chromium.org>
+
+        IndexedDB: Layout test showing delete database getting two blocked events
+        https://bugs.webkit.org/show_bug.cgi?id=92674
+
+        Reviewed by Tony Chang.
+
+        Match the steps specified behavior for deleteDatabase() in the spec: versionchange/blocked
+        events fire if necessary, then waits until a condition is satisfied before continuing with
+        the steps to delete the database. The bug was caused by retrying the full call again. Events
+        are also now sent out immediately when a "versionchange" transaction is running, rather
+        than entering a limbo state - again, the new behavior matches the spec more accurately.
+
+        Tests: storage/indexeddb/delete-in-upgradeneeded-close-in-open-success.html
+               storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange.html
+               storage/indexeddb/deletedatabase-delayed-by-open-and-versionchange.html
+               storage/indexeddb/intversion-gated-on-delete.html
+
+        * Modules/indexeddb/IDBDatabaseBackendImpl.cpp:
+        (WebCore::IDBDatabaseBackendImpl::processPendingCalls):
+        (WebCore::IDBDatabaseBackendImpl::deleteDatabase): First half of the steps.
+        (WebCore):
+        (WebCore::IDBDatabaseBackendImpl::isDeleteDatabaseBlocked): Pull out condition test.
+        (WebCore::IDBDatabaseBackendImpl::deleteDatabaseFinal): Second half of the of steps.
+        * Modules/indexeddb/IDBDatabaseBackendImpl.h:
+        (IDBDatabaseBackendImpl):
+
 2012-12-20  Viatcheslav Ostapenko  <sl.ostape...@samsung.com>
 
         [EFL] [WebGL] [Wk2] Contents are not rendered properly.

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.cpp (138267 => 138268)


--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.cpp	2012-12-20 18:21:28 UTC (rev 138267)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.cpp	2012-12-20 18:21:35 UTC (rev 138268)
@@ -472,16 +472,17 @@
     if (m_runningVersionChangeTransaction)
         return;
 
-    // Pending calls may be requeued.
-    Deque<OwnPtr<PendingDeleteCall> > pendingDeleteCalls;
-    m_pendingDeleteCalls.swap(pendingDeleteCalls);
-    while (!pendingDeleteCalls.isEmpty()) {
-        OwnPtr<PendingDeleteCall> pendingDeleteCall = pendingDeleteCalls.takeFirst();
-        deleteDatabase(pendingDeleteCall->callbacks());
+    if (!m_pendingDeleteCalls.isEmpty() && isDeleteDatabaseBlocked())
+        return;
+    while (!m_pendingDeleteCalls.isEmpty()) {
+        OwnPtr<PendingDeleteCall> pendingDeleteCall = m_pendingDeleteCalls.takeFirst();
+        deleteDatabaseFinal(pendingDeleteCall->callbacks());
     }
+    // deleteDatabaseFinal should never re-queue calls.
+    ASSERT(m_pendingDeleteCalls.isEmpty());
 
     // This check is also not really needed, openConnection would just requeue its calls.
-    if (m_runningVersionChangeTransaction || !m_pendingDeleteCalls.isEmpty())
+    if (m_runningVersionChangeTransaction)
         return;
 
     Deque<OwnPtr<PendingOpenWithVersionCall> > pendingOpenWithVersionCalls;
@@ -604,23 +605,30 @@
 
 void IDBDatabaseBackendImpl::deleteDatabase(PassRefPtr<IDBCallbacks> prpCallbacks)
 {
-    if (m_runningVersionChangeTransaction) {
-        m_pendingDeleteCalls.append(PendingDeleteCall::create(prpCallbacks));
-        return;
-    }
     RefPtr<IDBCallbacks> callbacks = prpCallbacks;
-    for (DatabaseCallbacksSet::const_iterator it = m_databaseCallbacksSet.begin(); it != m_databaseCallbacksSet.end(); ++it) {
-        // Front end ensures the event is not fired at connections that have closePending set.
-        (*it)->onVersionChange(NoStringVersion);
-    }
-    // FIXME: Only fire onBlocked if there are open connections after the
-    // VersionChangeEvents are received, not just set up to fire.
-    // https://bugs.webkit.org/show_bug.cgi?id=71130
-    if (connectionCount()) {
-        m_pendingDeleteCalls.append(PendingDeleteCall::create(callbacks));
+    if (isDeleteDatabaseBlocked()) {
+        for (DatabaseCallbacksSet::const_iterator it = m_databaseCallbacksSet.begin(); it != m_databaseCallbacksSet.end(); ++it) {
+            // Front end ensures the event is not fired at connections that have closePending set.
+            (*it)->onVersionChange(NoStringVersion);
+        }
+        // FIXME: Only fire onBlocked if there are open connections after the
+        // VersionChangeEvents are received, not just set up to fire.
+        // https://bugs.webkit.org/show_bug.cgi?id=71130
         callbacks->onBlocked();
+        m_pendingDeleteCalls.append(PendingDeleteCall::create(callbacks.release()));
         return;
     }
+    deleteDatabaseFinal(callbacks.release());
+}
+
+bool IDBDatabaseBackendImpl::isDeleteDatabaseBlocked()
+{
+    return connectionCount();
+}
+
+void IDBDatabaseBackendImpl::deleteDatabaseFinal(PassRefPtr<IDBCallbacks> callbacks)
+{
+    ASSERT(!isDeleteDatabaseBlocked());
     ASSERT(m_backingStore);
     if (!m_backingStore->deleteDatabase(m_metadata.name)) {
         callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error deleting database."));

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.h (138267 => 138268)


--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.h	2012-12-20 18:21:28 UTC (rev 138267)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.h	2012-12-20 18:21:35 UTC (rev 138268)
@@ -96,6 +96,9 @@
     size_t connectionCount();
     void processPendingCalls();
 
+    bool isDeleteDatabaseBlocked();
+    void deleteDatabaseFinal(PassRefPtr<IDBCallbacks>);
+
     class CreateObjectStoreOperation;
     class DeleteObjectStoreOperation;
     class VersionChangeOperation;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to