Changeset 135226 in webkit


Ignore:
Timestamp:
Nov 19, 2012, 6:10:19 PM (12 years ago)
Author:
dgrogan@chromium.org
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):

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r135223 r135226  
     12012-11-19  David Grogan  <dgrogan@chromium.org>
     2
     3        IndexedDB: Complex series of opens/deleteDatabase fails an ASSERT
     4        https://bugs.webkit.org/show_bug.cgi?id=101810
     5
     6        Reviewed by Tony Chang.
     7
     8        Removed use of setVersion. Surprisingly straightforward conversion
     9        given how gnarly this test is.
     10
     11        * storage/indexeddb/deletedatabase-delayed-by-versionchange-expected.txt:
     12        * storage/indexeddb/resources/deletedatabase-delayed-by-versionchange.js:
     13        (h1OpenSuccess.h1.onversionchange):
     14        (h1OpenSuccess.request.onsuccess.h2OpenSuccess.h2.onversionchange):
     15        (h1OpenSuccess.request.onsuccess.h2OpenSuccess.request.onsuccess):
     16        (h1OpenSuccess.request.onsuccess.h2OpenSuccess.request.onblocked.h3Blocked.request.onsuccess):
     17        (h1OpenSuccess.request.onsuccess.h2OpenSuccess.request.onblocked):
     18        (h1OpenSuccess.request.onsuccess.h2OpenSuccess.request.onupgradeneeded.h3OnUpgradeneeded.transaction.oncomplete):
     19        (h1OpenSuccess.request.onsuccess.h2OpenSuccess.request.onupgradeneeded):
     20        (h1OpenSuccess.request.onsuccess):
     21        (h1OpenSuccess):
     22
    1232012-11-19  David Grogan  <dgrogan@chromium.org>
    224
  • trunk/LayoutTests/storage/indexeddb/deletedatabase-delayed-by-versionchange-expected.txt

    r131466 r135226  
    1 CONSOLE MESSAGE: The setVersion() method is non-standard and will be removed. Use the "upgradeneeded" event instead.
    21Test the order when there are pending setVersion, delete and open calls.
    32
     
    87
    98dbname = "deletedatabase-delayed-by-versionchange.html"
    10 ver = 1
     9indexedDB.deleteDatabase(dbname)
     10indexedDB.open(dbname)
     11
     12h1OpenSuccess():
    1113setVersionBlockedEventFired = false
    1214versionChangeComplete = false
    1315deleteDatabaseBlockedEventFired = false
    1416deleteDatabaseComplete = false
     17h1 = event.target.result
     18Open h2:
    1519indexedDB.open(dbname)
    1620
    17 openOnSuccess():
    18 h = event.target.result
    19 indexedDB.open(dbname)
     21h2OpenSuccess():
     22Try to open h3:
     23indexedDB.open(dbname, 2)
     24indexedDB.deleteDatabase(dbname)
    2025
    21 h2OpenOnSuccess():
    22 h.setVersion(String(ver++))
    23 indexedDB.deleteDatabase(dbname)
     26h1OnVersionChange():
     27old = 1
     28new = 2
    2429
    2530h2OnVersionChange():
    2631old = 1
    27 new = "1"
     32new = 2
    2833
    29 setVersionOnBlocked():
     34h3Blocked():
    3035setVersionBlockedEventFired = true
     36Try to open h4:
    3137indexedDB.open(dbname)
    3238h2.close()
    3339
    34 setVersionOnSuccess():
     40h1OnVersionChange():
     41FIXME: These shouldn't be undefined. http://crbug.com/153122
     42old = undefined
     43new = undefined
     44
     45deleteDatabaseOnBlocked():
     46deleteDatabaseBlockedEventFired = true
     47h1.close()
     48
     49deleteDatabaseOnBlocked():
     50deleteDatabaseBlockedEventFired = true
     51h1.close()
     52
     53deleteDatabaseOnSuccess():
     54deleteDatabaseComplete = true
     55
     56h3OnUpgradeneeded():
    3557
    3658transactionOnComplete():
    3759versionChangeComplete = true
    3860
    39 onVersionChange():
    40 old = "1"
    41 new = ""
     61h3OpenSuccess():
    4262
    43 deleteDatabaseOnBlocked():
    44 deleteDatabaseBlockedEventFired = true
    45 h.close()
    46 
    47 deleteDatabaseOnSuccess():
    48 deleteDatabaseComplete = true
    49 
    50 h3OpenOnSuccess():
     63h4OpenSuccess():
    5164PASS setVersionBlockedEventFired is true
    5265PASS versionChangeComplete is true
  • trunk/LayoutTests/storage/indexeddb/resources/deletedatabase-delayed-by-versionchange.js

    r131466 r135226  
    66description("Test the order when there are pending setVersion, delete and open calls.");
    77
    8 function test() {
    9     removeVendorPrefixes();
    10     setDBNameFromPath();
    11 
    12     evalAndLog("ver = 1");
     8indexedDBTest(null, h1OpenSuccess);
     9function h1OpenSuccess(evt)
     10{
     11    preamble(evt);
    1312    evalAndLog("setVersionBlockedEventFired = false");
    1413    evalAndLog("versionChangeComplete = false");
     
    1615    evalAndLog("deleteDatabaseComplete = false");
    1716
     17    evalAndLog("h1 = event.target.result");
     18
     19    h1.onversionchange = function h1OnVersionChange(evt) {
     20        preamble(evt);
     21        if (event.oldVersion === undefined)
     22            debug("FIXME: These shouldn't be undefined. http://crbug.com/153122");
     23        debug("old = " + event.oldVersion);
     24        debug("new = " + event.newVersion);
     25    };
     26
     27    debug("Open h2:");
    1828    request = evalAndLog("indexedDB.open(dbname)");
    1929    request.onblocked = unexpectedBlockedCallback;
    2030    request.onerror = unexpectedErrorCallback;
    21     request.onsuccess = function openOnSuccess(evt) {
     31    request.onsuccess = function h2OpenSuccess(evt) {
    2232        preamble(evt);
    23         evalAndLog("h = event.target.result");
     33        h2 = event.target.result;
    2434
    25         h.onversionchange = function onVersionChange(evt) {
     35        h2.onversionchange = function h2OnVersionChange(evt) {
    2636            preamble(evt);
    27             debug("old = " + JSON.stringify(event.target.version));
    28             debug("new = " + JSON.stringify(event.version));
     37            debug("old = " + event.oldVersion);
     38            debug("new = " + event.newVersion);
    2939        };
    3040
    31         request = evalAndLog("indexedDB.open(dbname)");
    32         request.onblocked = unexpectedBlockedCallback;
     41        debug("Try to open h3:");
     42        request = evalAndLog("indexedDB.open(dbname, 2)");
    3343        request.onerror = unexpectedErrorCallback;
    34         request.onsuccess = function h2OpenOnSuccess(evt) {
     44        request.onsuccess = function h3OpenSuccess(evt) {
    3545            preamble(evt);
    36             h2 = event.target.result;
     46        }
     47        request.onblocked = function h3Blocked(evt) {
     48            preamble(evt);
     49            evalAndLog("setVersionBlockedEventFired = true");
    3750
    38             h2.onversionchange = function h2OnVersionChange(evt) {
     51            debug("Try to open h4:");
     52            request = evalAndLog("indexedDB.open(dbname)");
     53            request.onblocked = unexpectedBlockedCallback;
     54            request.onerror = unexpectedErrorCallback;
     55            request.onsuccess = function h4OpenSuccess(evt) {
    3956                preamble(evt);
    40                 debug("old = " + JSON.stringify(event.target.version));
    41                 debug("new = " + JSON.stringify(event.version));
     57                h4 = event.target.result;
     58                h4.onversionchange = unexpectedVersionChangeCallback;
     59
     60                shouldBeTrue("setVersionBlockedEventFired");
     61                shouldBeTrue("versionChangeComplete");
     62                shouldBeTrue("deleteDatabaseBlockedEventFired");
     63                shouldBeTrue("deleteDatabaseComplete");
     64
     65                finishJSTest();
    4266            };
    4367
    44             request = evalAndLog("h.setVersion(String(ver++))");
    45             request.onerror = unexpectedErrorCallback;
    46             request.onblocked = function setVersionOnBlocked(evt) {
     68            evalAndLog("h2.close()");
     69        };
     70        request.onupgradeneeded = function h3OnUpgradeneeded(evt) {
     71            preamble(evt);
     72
     73            transaction = event.target.transaction;
     74            transaction.onabort = unexpectedAbortCallback;
     75            transaction.oncomplete = function transactionOnComplete(evt) {
    4776                preamble(evt);
    48                 evalAndLog("setVersionBlockedEventFired = true");
     77                evalAndLog("versionChangeComplete = true");
     78            };
     79        };
    4980
    50                 request = evalAndLog("indexedDB.open(dbname)");
    51                 request.onblocked = unexpectedBlockedCallback;
    52                 request.onerror = unexpectedErrorCallback;
    53                 request.onsuccess = function h3OpenOnSuccess(evt) {
    54                     preamble(evt);
    55                     h3 = event.target.result;
    56                     h3.onversionchange = unexpectedVersionChangeCallback;
     81        request = evalAndLog("indexedDB.deleteDatabase(dbname)");
     82        request.onerror = unexpectedErrorCallback;
     83        request.onblocked = function deleteDatabaseOnBlocked(evt) {
     84            preamble(evt);
     85            evalAndLog("deleteDatabaseBlockedEventFired = true");
    5786
    58                     shouldBeTrue("setVersionBlockedEventFired");
    59                     shouldBeTrue("versionChangeComplete");
    60                     shouldBeTrue("deleteDatabaseBlockedEventFired");
    61                     shouldBeTrue("deleteDatabaseComplete");
    62 
    63                     finishJSTest();
    64                 };
    65 
    66                 evalAndLog("h2.close()");
    67             };
    68             request.onsuccess = function setVersionOnSuccess(evt) {
    69                 preamble(evt);
    70 
    71                 transaction = event.target.result;
    72                 transaction.onabort = unexpectedAbortCallback;
    73                 transaction.oncomplete = function transactionOnComplete(evt) {
    74                     preamble(evt);
    75                     evalAndLog("versionChangeComplete = true");
    76                 };
    77             };
    78 
    79             request = evalAndLog("indexedDB.deleteDatabase(dbname)");
    80             request.onerror = unexpectedErrorCallback;
    81             request.onblocked = function deleteDatabaseOnBlocked(evt) {
    82                 preamble(evt);
    83                 evalAndLog("deleteDatabaseBlockedEventFired = true");
    84 
    85                 evalAndLog("h.close()");
    86             };
    87             request.onsuccess = function deleteDatabaseOnSuccess(evt) {
    88                 preamble(evt);
    89                 evalAndLog("deleteDatabaseComplete = true");
    90             };
     87            evalAndLog("h1.close()");
     88        };
     89        request.onsuccess = function deleteDatabaseOnSuccess(evt) {
     90            preamble(evt);
     91            evalAndLog("deleteDatabaseComplete = true");
    9192        };
    9293    };
    9394}
    94 
    95 test();
  • trunk/Source/WebCore/ChangeLog

    r135224 r135226  
     12012-11-19  David Grogan  <dgrogan@chromium.org>
     2
     3        IndexedDB: Complex series of opens/deleteDatabase fails an ASSERT
     4        https://bugs.webkit.org/show_bug.cgi?id=101810
     5
     6        Reviewed by Tony Chang.
     7
     8        Tests - storage/indexeddb/deletedatabase-delayed-by-versionchange.html
     9
     10        * Modules/indexeddb/IDBDatabaseBackendImpl.cpp:
     11        (WebCore::IDBDatabaseBackendImpl::processPendingCalls):
     12        The condition tested by this assert is a valid state.
     13
    1142012-11-19  Peter Wang  <peter.wang@torchmobile.com.cn>
    215
  • trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.cpp

    r134095 r135226  
    413413    }
    414414
    415     // Given the check above, it appears that calls cannot be requeued by
    416     // openConnection, but use a different queue for iteration to be safe.
     415    // Open calls can be requeued if an openWithVersion call started a version
     416    // change transaction.
    417417    Deque<OwnPtr<PendingOpenCall> > pendingOpenCalls;
    418418    m_pendingOpenCalls.swap(pendingOpenCalls);
     
    421421        openConnection(pendingOpenCall->callbacks(), pendingOpenCall->databaseCallbacks());
    422422    }
    423     ASSERT(m_pendingOpenCalls.isEmpty());
    424423}
    425424
Note: See TracChangeset for help on using the changeset viewer.