Title: [135226] trunk
Revision
135226
Author
dgro...@chromium.org
Date
2012-11-19 18:10:19 -0800 (Mon, 19 Nov 2012)

Log Message

IndexedDB: Complex series of opens/deleteDatabase fails an ASSERT
https://bugs.webkit.org/show_bug.cgi?id=101810

Reviewed by Tony Chang.

Source/WebCore:

Tests - storage/indexeddb/deletedatabase-delayed-by-versionchange.html

* Modules/indexeddb/IDBDatabaseBackendImpl.cpp:
(WebCore::IDBDatabaseBackendImpl::processPendingCalls):
The condition tested by this assert is a valid state.

LayoutTests:

Removed use of setVersion. Surprisingly straightforward conversion
given how gnarly this test is.

* storage/indexeddb/deletedatabase-delayed-by-versionchange-expected.txt:
* storage/indexeddb/resources/deletedatabase-delayed-by-versionchange.js:
(h1OpenSuccess.h1.onversionchange):
(h1OpenSuccess.request.onsuccess.h2OpenSuccess.h2.onversionchange):
(h1OpenSuccess.request.onsuccess.h2OpenSuccess.request.onsuccess):
(h1OpenSuccess.request.onsuccess.h2OpenSuccess.request.onblocked.h3Blocked.request.onsuccess):
(h1OpenSuccess.request.onsuccess.h2OpenSuccess.request.onblocked):
(h1OpenSuccess.request.onsuccess.h2OpenSuccess.request.onupgradeneeded.h3OnUpgradeneeded.transaction.oncomplete):
(h1OpenSuccess.request.onsuccess.h2OpenSuccess.request.onupgradeneeded):
(h1OpenSuccess.request.onsuccess):
(h1OpenSuccess):

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (135225 => 135226)


--- trunk/LayoutTests/ChangeLog	2012-11-20 02:06:35 UTC (rev 135225)
+++ trunk/LayoutTests/ChangeLog	2012-11-20 02:10:19 UTC (rev 135226)
@@ -1,5 +1,27 @@
 2012-11-19  David Grogan  <dgro...@chromium.org>
 
+        IndexedDB: Complex series of opens/deleteDatabase fails an ASSERT
+        https://bugs.webkit.org/show_bug.cgi?id=101810
+
+        Reviewed by Tony Chang.
+
+        Removed use of setVersion. Surprisingly straightforward conversion
+        given how gnarly this test is.
+
+        * storage/indexeddb/deletedatabase-delayed-by-versionchange-expected.txt:
+        * storage/indexeddb/resources/deletedatabase-delayed-by-versionchange.js:
+        (h1OpenSuccess.h1.onversionchange):
+        (h1OpenSuccess.request.onsuccess.h2OpenSuccess.h2.onversionchange):
+        (h1OpenSuccess.request.onsuccess.h2OpenSuccess.request.onsuccess):
+        (h1OpenSuccess.request.onsuccess.h2OpenSuccess.request.onblocked.h3Blocked.request.onsuccess):
+        (h1OpenSuccess.request.onsuccess.h2OpenSuccess.request.onblocked):
+        (h1OpenSuccess.request.onsuccess.h2OpenSuccess.request.onupgradeneeded.h3OnUpgradeneeded.transaction.oncomplete):
+        (h1OpenSuccess.request.onsuccess.h2OpenSuccess.request.onupgradeneeded):
+        (h1OpenSuccess.request.onsuccess):
+        (h1OpenSuccess):
+
+2012-11-19  David Grogan  <dgro...@chromium.org>
+
         IndexedDB: last setVersion excision batch
         https://bugs.webkit.org/show_bug.cgi?id=102713
 

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


--- trunk/LayoutTests/storage/indexeddb/deletedatabase-delayed-by-versionchange-expected.txt	2012-11-20 02:06:35 UTC (rev 135225)
+++ trunk/LayoutTests/storage/indexeddb/deletedatabase-delayed-by-versionchange-expected.txt	2012-11-20 02:10:19 UTC (rev 135226)
@@ -1,4 +1,3 @@
-CONSOLE MESSAGE: The setVersion() method is non-standard and will be removed. Use the "upgradeneeded" event instead.
 Test the order when there are pending setVersion, delete and open calls.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
@@ -7,47 +6,61 @@
 indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
 
 dbname = "deletedatabase-delayed-by-versionchange.html"
-ver = 1
+indexedDB.deleteDatabase(dbname)
+indexedDB.open(dbname)
+
+h1OpenSuccess():
 setVersionBlockedEventFired = false
 versionChangeComplete = false
 deleteDatabaseBlockedEventFired = false
 deleteDatabaseComplete = false
+h1 = event.target.result
+Open h2:
 indexedDB.open(dbname)
 
-openOnSuccess():
-h = event.target.result
-indexedDB.open(dbname)
-
-h2OpenOnSuccess():
-h.setVersion(String(ver++))
+h2OpenSuccess():
+Try to open h3:
+indexedDB.open(dbname, 2)
 indexedDB.deleteDatabase(dbname)
 
+h1OnVersionChange():
+old = 1
+new = 2
+
 h2OnVersionChange():
 old = 1
-new = "1"
+new = 2
 
-setVersionOnBlocked():
+h3Blocked():
 setVersionBlockedEventFired = true
+Try to open h4:
 indexedDB.open(dbname)
 h2.close()
 
-setVersionOnSuccess():
+h1OnVersionChange():
+FIXME: These shouldn't be undefined. http://crbug.com/153122
+old = undefined
+new = undefined
 
-transactionOnComplete():
-versionChangeComplete = true
+deleteDatabaseOnBlocked():
+deleteDatabaseBlockedEventFired = true
+h1.close()
 
-onVersionChange():
-old = "1"
-new = ""
-
 deleteDatabaseOnBlocked():
 deleteDatabaseBlockedEventFired = true
-h.close()
+h1.close()
 
 deleteDatabaseOnSuccess():
 deleteDatabaseComplete = true
 
-h3OpenOnSuccess():
+h3OnUpgradeneeded():
+
+transactionOnComplete():
+versionChangeComplete = true
+
+h3OpenSuccess():
+
+h4OpenSuccess():
 PASS setVersionBlockedEventFired is true
 PASS versionChangeComplete is true
 PASS deleteDatabaseBlockedEventFired is true

Modified: trunk/LayoutTests/storage/indexeddb/resources/deletedatabase-delayed-by-versionchange.js (135225 => 135226)


--- trunk/LayoutTests/storage/indexeddb/resources/deletedatabase-delayed-by-versionchange.js	2012-11-20 02:06:35 UTC (rev 135225)
+++ trunk/LayoutTests/storage/indexeddb/resources/deletedatabase-delayed-by-versionchange.js	2012-11-20 02:10:19 UTC (rev 135226)
@@ -5,91 +5,90 @@
 
 description("Test the order when there are pending setVersion, delete and open calls.");
 
-function test() {
-    removeVendorPrefixes();
-    setDBNameFromPath();
-
-    evalAndLog("ver = 1");
+indexedDBTest(null, h1OpenSuccess);
+function h1OpenSuccess(evt)
+{
+    preamble(evt);
     evalAndLog("setVersionBlockedEventFired = false");
     evalAndLog("versionChangeComplete = false");
     evalAndLog("deleteDatabaseBlockedEventFired = false");
     evalAndLog("deleteDatabaseComplete = false");
 
+    evalAndLog("h1 = event.target.result");
+
+    h1._onversionchange_ = function h1OnVersionChange(evt) {
+        preamble(evt);
+        if (event.oldVersion === undefined)
+            debug("FIXME: These shouldn't be undefined. http://crbug.com/153122");
+        debug("old = " + event.oldVersion);
+        debug("new = " + event.newVersion);
+    };
+
+    debug("Open h2:");
     request = evalAndLog("indexedDB.open(dbname)");
     request._onblocked_ = unexpectedBlockedCallback;
     request._onerror_ = unexpectedErrorCallback;
-    request._onsuccess_ = function openOnSuccess(evt) {
+    request._onsuccess_ = function h2OpenSuccess(evt) {
         preamble(evt);
-        evalAndLog("h = event.target.result");
+        h2 = event.target.result;
 
-        h._onversionchange_ = function onVersionChange(evt) {
+        h2._onversionchange_ = function h2OnVersionChange(evt) {
             preamble(evt);
-            debug("old = " + JSON.stringify(event.target.version));
-            debug("new = " + JSON.stringify(event.version));
+            debug("old = " + event.oldVersion);
+            debug("new = " + event.newVersion);
         };
 
-        request = evalAndLog("indexedDB.open(dbname)");
-        request._onblocked_ = unexpectedBlockedCallback;
+        debug("Try to open h3:");
+        request = evalAndLog("indexedDB.open(dbname, 2)");
         request._onerror_ = unexpectedErrorCallback;
-        request._onsuccess_ = function h2OpenOnSuccess(evt) {
+        request._onsuccess_ = function h3OpenSuccess(evt) {
             preamble(evt);
-            h2 = event.target.result;
+        }
+        request._onblocked_ = function h3Blocked(evt) {
+            preamble(evt);
+            evalAndLog("setVersionBlockedEventFired = true");
 
-            h2._onversionchange_ = function h2OnVersionChange(evt) {
-                preamble(evt);
-                debug("old = " + JSON.stringify(event.target.version));
-                debug("new = " + JSON.stringify(event.version));
-            };
-
-            request = evalAndLog("h.setVersion(String(ver++))");
+            debug("Try to open h4:");
+            request = evalAndLog("indexedDB.open(dbname)");
+            request._onblocked_ = unexpectedBlockedCallback;
             request._onerror_ = unexpectedErrorCallback;
-            request._onblocked_ = function setVersionOnBlocked(evt) {
+            request._onsuccess_ = function h4OpenSuccess(evt) {
                 preamble(evt);
-                evalAndLog("setVersionBlockedEventFired = true");
+                h4 = event.target.result;
+                h4._onversionchange_ = unexpectedVersionChangeCallback;
 
-                request = evalAndLog("indexedDB.open(dbname)");
-                request._onblocked_ = unexpectedBlockedCallback;
-                request._onerror_ = unexpectedErrorCallback;
-                request._onsuccess_ = function h3OpenOnSuccess(evt) {
-                    preamble(evt);
-                    h3 = event.target.result;
-                    h3._onversionchange_ = unexpectedVersionChangeCallback;
+                shouldBeTrue("setVersionBlockedEventFired");
+                shouldBeTrue("versionChangeComplete");
+                shouldBeTrue("deleteDatabaseBlockedEventFired");
+                shouldBeTrue("deleteDatabaseComplete");
 
-                    shouldBeTrue("setVersionBlockedEventFired");
-                    shouldBeTrue("versionChangeComplete");
-                    shouldBeTrue("deleteDatabaseBlockedEventFired");
-                    shouldBeTrue("deleteDatabaseComplete");
+                finishJSTest();
+            };
 
-                    finishJSTest();
-                };
+            evalAndLog("h2.close()");
+        };
+        request._onupgradeneeded_ = function h3OnUpgradeneeded(evt) {
+            preamble(evt);
 
-                evalAndLog("h2.close()");
-            };
-            request._onsuccess_ = function setVersionOnSuccess(evt) {
+            transaction = event.target.transaction;
+            transaction._onabort_ = unexpectedAbortCallback;
+            transaction._oncomplete_ = function transactionOnComplete(evt) {
                 preamble(evt);
-
-                transaction = event.target.result;
-                transaction._onabort_ = unexpectedAbortCallback;
-                transaction._oncomplete_ = function transactionOnComplete(evt) {
-                    preamble(evt);
-                    evalAndLog("versionChangeComplete = true");
-                };
+                evalAndLog("versionChangeComplete = true");
             };
+        };
 
-            request = evalAndLog("indexedDB.deleteDatabase(dbname)");
-            request._onerror_ = unexpectedErrorCallback;
-            request._onblocked_ = function deleteDatabaseOnBlocked(evt) {
-                preamble(evt);
-                evalAndLog("deleteDatabaseBlockedEventFired = true");
+        request = evalAndLog("indexedDB.deleteDatabase(dbname)");
+        request._onerror_ = unexpectedErrorCallback;
+        request._onblocked_ = function deleteDatabaseOnBlocked(evt) {
+            preamble(evt);
+            evalAndLog("deleteDatabaseBlockedEventFired = true");
 
-                evalAndLog("h.close()");
-            };
-            request._onsuccess_ = function deleteDatabaseOnSuccess(evt) {
-                preamble(evt);
-                evalAndLog("deleteDatabaseComplete = true");
-            };
+            evalAndLog("h1.close()");
         };
+        request._onsuccess_ = function deleteDatabaseOnSuccess(evt) {
+            preamble(evt);
+            evalAndLog("deleteDatabaseComplete = true");
+        };
     };
 }
-
-test();

Modified: trunk/Source/WebCore/ChangeLog (135225 => 135226)


--- trunk/Source/WebCore/ChangeLog	2012-11-20 02:06:35 UTC (rev 135225)
+++ trunk/Source/WebCore/ChangeLog	2012-11-20 02:10:19 UTC (rev 135226)
@@ -1,3 +1,16 @@
+2012-11-19  David Grogan  <dgro...@chromium.org>
+
+        IndexedDB: Complex series of opens/deleteDatabase fails an ASSERT
+        https://bugs.webkit.org/show_bug.cgi?id=101810
+
+        Reviewed by Tony Chang.
+
+        Tests - storage/indexeddb/deletedatabase-delayed-by-versionchange.html
+
+        * Modules/indexeddb/IDBDatabaseBackendImpl.cpp:
+        (WebCore::IDBDatabaseBackendImpl::processPendingCalls):
+        The condition tested by this assert is a valid state.
+
 2012-11-19  Peter Wang  <peter.w...@torchmobile.com.cn>
 
         Web Inspector: [JSC] worker debugger shouldn't stop for "willExecuteProgram" instruction

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.cpp (135225 => 135226)


--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.cpp	2012-11-20 02:06:35 UTC (rev 135225)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.cpp	2012-11-20 02:10:19 UTC (rev 135226)
@@ -412,15 +412,14 @@
         openConnectionWithVersion(pendingOpenWithVersionCall->callbacks(), pendingOpenWithVersionCall->databaseCallbacks(), pendingOpenWithVersionCall->version());
     }
 
-    // Given the check above, it appears that calls cannot be requeued by
-    // openConnection, but use a different queue for iteration to be safe.
+    // Open calls can be requeued if an openWithVersion call started a version
+    // change transaction.
     Deque<OwnPtr<PendingOpenCall> > pendingOpenCalls;
     m_pendingOpenCalls.swap(pendingOpenCalls);
     while (!pendingOpenCalls.isEmpty()) {
         OwnPtr<PendingOpenCall> pendingOpenCall = pendingOpenCalls.takeFirst();
         openConnection(pendingOpenCall->callbacks(), pendingOpenCall->databaseCallbacks());
     }
-    ASSERT(m_pendingOpenCalls.isEmpty());
 }
 
 PassRefPtr<IDBTransactionBackendInterface> IDBDatabaseBackendImpl::transaction(const Vector<int64_t>& objectStoreIds, unsigned short mode)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to