Changeset 129142 in webkit


Ignore:
Timestamp:
Sep 20, 2012 11:00:18 AM (12 years ago)
Author:
jsbell@chromium.org
Message:

IndexedDB: Rewrite confusing call sequence layout tests
https://bugs.webkit.org/show_bug.cgi?id=97051

Reviewed by Tony Chang.

Rewrite some convoluted and hard to understand/maintain tests in a more idiomatic fashion.
This patch maintains the bulk of the non-standard output to verify that the tests have not
changed in behavior; follow-ups will make the output more standard and split the tests
into separate files.

  • storage/indexeddb/factory-deletedatabase-interactions-expected.txt:
  • storage/indexeddb/open-close-version-expected.txt:
  • storage/indexeddb/resources/factory-deletedatabase-interactions.js:
  • storage/indexeddb/resources/open-close-version.js:
Location:
trunk/LayoutTests
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r129141 r129142  
     12012-09-20  Joshua Bell  <jsbell@chromium.org>
     2
     3        IndexedDB: Rewrite confusing call sequence layout tests
     4        https://bugs.webkit.org/show_bug.cgi?id=97051
     5
     6        Reviewed by Tony Chang.
     7
     8        Rewrite some convoluted and hard to understand/maintain tests in a more idiomatic fashion.
     9        This patch maintains the bulk of the non-standard output to verify that the tests have not
     10        changed in behavior; follow-ups will make the output more standard and split the tests
     11        into separate files.
     12
     13        * storage/indexeddb/factory-deletedatabase-interactions-expected.txt:
     14        * storage/indexeddb/open-close-version-expected.txt:
     15        * storage/indexeddb/resources/factory-deletedatabase-interactions.js:
     16        * storage/indexeddb/resources/open-close-version.js:
     17
    1182012-09-20  Joanmarie Diggs  <jdiggs@igalia.com>
    219
  • trunk/LayoutTests/storage/indexeddb/factory-deletedatabase-interactions-expected.txt

    r129090 r129142  
    88indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
    99
     10dbname = "factory-deletedatabase-interactions.html"
    1011
    1112TEST: deleteDatabase blocked on open handles
    12 self.dbname = 'test1'; self.ver = 1; self.steps = []
     13self.testname = 'test1'; self.ver = 1
    1314'h.open'
    1415'h.open.onsuccess'
     
    2021'h.close'
    2122'deleteDatabase().onsuccess'
    22 PASS self.steps.toString() is "h.open,h.open.onsuccess,deleteDatabase(),h.onversionchange,deleteDatabase().onblocked,h.close,deleteDatabase().onsuccess"
     23PASS blockedEventFired is true
    2324
    2425TEST: deleteDatabase not blocked when handles close immediately
    25 self.dbname = 'test2'; self.ver = 1; self.steps = []
     26self.testname = 'test2'; self.ver = 1
    2627'h.open'
    2728'h.open.onsuccess'
     
    3435'deleteDatabase().onsuccess'
    3536NOTE: Will FAIL with extra bogus deleteDatabase().onblocked step; https://bugs.webkit.org/show_bug.cgi?id=71130
    36 FAIL self.steps.toString() should be h.open,h.open.onsuccess,deleteDatabase(),h.onversionchange,h.close,deleteDatabase().onsuccess. Was h.open,h.open.onsuccess,deleteDatabase(),h.onversionchange,h.close,deleteDatabase().onblocked,deleteDatabase().onsuccess.
     37FAIL blockedEventFired should be false. Was true.
    3738
    3839TEST: deleteDatabase is delayed if a VERSION_CHANGE transaction is running
    39 self.dbname = 'test3'; self.ver = 1; self.steps = []
     40self.testname = 'test3'; self.ver = 1
    4041'h.open'
    4142'h.open.onsuccess'
     
    5051'h.close'
    5152'deleteDatabase().onsuccess'
    52 PASS self.steps.toString() is "h.open,h.open.onsuccess,h.setVersion,deleteDatabase(),h.setVersion.onsuccess,h.setVersion.transaction-complete,h.onversionchange,deleteDatabase().onblocked,h.close,deleteDatabase().onsuccess"
     53PASS versionChangeComplete is true
    5354
    5455TEST: Correct order when there are pending setVersion, delete and open calls.
    55 self.dbname = 'test4'; self.ver = 1; self.steps = []
     56self.testname = 'test4'; self.ver = 1
    5657'h.open'
    5758'h.open.onsuccess'
     
    7475'deleteDatabase().onsuccess'
    7576'h3.open.onsuccess'
    76 PASS self.steps.toString() is "h.open,h.open.onsuccess,h2.open,h2.open.onsuccess,h.setVersion,deleteDatabase(),h2.onversionchange,h.setVersion.onblocked,h3.open,h2.close,h.setVersion.onsuccess,h.setVersion.transaction-complete,h.onversionchange,deleteDatabase().onblocked,h.close,deleteDatabase().onsuccess,h3.open.onsuccess"
     77PASS versionChangeComplete is true
     78PASS blockedEventFired is true
     79PASS deleteDatabaseComplete is true
    7780PASS successfullyParsed is true
    7881
  • trunk/LayoutTests/storage/indexeddb/open-close-version-expected.txt

    r129090 r129142  
    1313indexedDB = self.indexedDB || self.webkitIndexedDB || self.mozIndexedDB || self.msIndexedDB || self.OIndexedDB;
    1414
     15dbname = "open-close-version.html"
    1516
    1617TEST: setVersion blocked on open handles
    17 self.dbname = 'test1'; self.ver = 1; self.steps = []
     18self.testname = 'test1'; self.ver = 1
    1819'h1.open'
    1920'h1.open.onsuccess'
     
    2728'h1.setVersion.onsuccess'
    2829'h1.setVersion.transaction-complete'
    29 PASS self.steps.toString() is "h1.open,h1.open.onsuccess,h2.open,h2.open.onsuccess,h1.setVersion,h2.onversionchange,h1.setVersion.onblocked,h2.close,h1.setVersion.onsuccess,h1.setVersion.transaction-complete"
     30PASS blockedEventFired is true
    3031
    3132TEST: setVersion not blocked if handle closed immediately
    32 self.dbname = 'test2'; self.ver = 1; self.steps = []
     33self.testname = 'test2'; self.ver = 1
    3334'h1.open'
    3435'h1.open.onsuccess'
     
    4344'h1.setVersion.transaction-complete'
    4445NOTE: Will FAIL with extra bogus h1.setVersion.onblocked step; https://bugs.webkit.org/show_bug.cgi?id=71130
    45 FAIL self.steps.toString() should be h1.open,h1.open.onsuccess,h2.open,h2.open.onsuccess,h1.setVersion,h2.onversionchange,h2.close,h1.setVersion.onsuccess,h1.setVersion.transaction-complete. Was h1.open,h1.open.onsuccess,h2.open,h2.open.onsuccess,h1.setVersion,h2.onversionchange,h2.close,h1.setVersion.onblocked,h1.setVersion.onsuccess,h1.setVersion.transaction-complete.
     46FAIL blockedEventFired should be false. Was true.
    4647
    4748TEST: open and setVersion blocked if a VERSION_CHANGE transaction is running - close when blocked
    48 self.dbname = 'test3'; self.ver = 1; self.steps = []
     49self.testname = 'test3'; self.ver = 1
    4950'h1.open'
    5051'h1.open.onsuccess'
     
    6465'h1.setVersion.transaction-complete'
    6566'h3.open.onsuccess'
    66 PASS self.steps.toString() is "h1.open,h1.open.onsuccess,h2.open,h2.open.onsuccess,h1.setVersion,h2.setVersion,h2.onversionchange,h1.setVersion.onblocked,h1.onversionchange,h2.setVersion.onblocked,h2.close,h3.open,h2.setVersion.onerror,h1.setVersion.onsuccess,h1.setVersion.transaction-complete,h3.open.onsuccess"
     67PASS blockedEventFired is true
     68PASS versionChangeComplete is true
    6769
    6870TEST: open and setVersion blocked if a VERSION_CHANGE transaction is running - just close
    69 self.dbname = 'test4'; self.ver = 1; self.steps = []
     71self.testname = 'test4'; self.ver = 1
    7072'h1.open'
    7173'h1.open.onsuccess'
     
    8082'h3.open.onsuccess'
    8183NOTE: Will FAIL with extra bogus h1.setVersion.onblocked step; https://bugs.webkit.org/show_bug.cgi?id=71130
    82 FAIL self.steps.toString() should be h1.open,h1.open.onsuccess,h2.open,h2.open.onsuccess,h1.setVersion,h3.open,h2.close,h1.setVersion.onsuccess,h1.setVersion.transaction-complete,h3.open.onsuccess. Was h1.open,h1.open.onsuccess,h2.open,h2.open.onsuccess,h1.setVersion,h3.open,h2.close,h1.setVersion.onblocked,h1.setVersion.onsuccess,h1.setVersion.transaction-complete,h3.open.onsuccess.
     84FAIL blockedEventFired should be false. Was true.
     85PASS versionChangeComplete is true
    8386
    8487TEST: open blocked if a VERSION_CHANGE transaction is running
    85 self.dbname = 'test5'; self.ver = 1; self.steps = []
     88self.testname = 'test5'; self.ver = 1
    8689'h1.open'
    8790'h1.open.onsuccess'
     
    9194'h1.setVersion.transaction-complete'
    9295'h2.open.onsuccess'
    93 PASS self.steps.toString() is "h1.open,h1.open.onsuccess,h1.setVersion,h2.open,h1.setVersion.onsuccess,h1.setVersion.transaction-complete,h2.open.onsuccess"
     96PASS versionChangeComplete is true
    9497
    9598TEST: two setVersions from the same connection
    96 self.dbname = 'test6'; self.ver = 1; self.steps = []
     99self.testname = 'test6'; self.ver = 1
    97100'h1.open'
    98101'h1.open.onsuccess'
     
    104107'h1.setVersion.onsuccess'
    105108'h1.setVersion.transaction-complete'
    106 PASS self.steps.toString() is "h1.open,h1.open.onsuccess,h1.setVersion,h1.setVersion,h1.setVersion.onsuccess,h1.setVersion.transaction-complete,h1.setVersion.onsuccess,h1.setVersion.transaction-complete"
     109PASS versionChangeComplete is true
    107110PASS successfullyParsed is true
    108111
  • trunk/LayoutTests/storage/indexeddb/resources/factory-deletedatabase-interactions.js

    r120976 r129142  
    66description("Test the deleteDatabase call and its interaction with open/setVersion");
    77
    8 var dbprefix = 'factory-deletedatabase-interactions-';
    9 function Connection(id) {
    10     id = String(id);
    11     var that = this;
    12     this.open = function(opts) {
    13         self.steps.push(evalAndLog("'" + id + ".open'"));
    14         var req = indexedDB.open(dbprefix + self.dbname);
    15         req.onerror = unexpectedErrorCallback;
    16         req.onsuccess = function (e) {
    17             that.handle = e.target.result;
    18             self.steps.push(evalAndLog("'" + id + ".open.onsuccess'"));
    19             that.handle.onversionchange = function(e) {
    20                 self.steps.push(evalAndLog("'" + id + ".onversionchange'"));
    21                 debug("    in versionchange, old = " + JSON.stringify(e.target.version) + " new = " + JSON.stringify(e.version));
    22                 if (opts && opts.onversion) { opts.onversion.call(that); }
    23             };
    24             if (opts && opts.onsuccess) { opts.onsuccess.call(that); }
    25         };
    26     };
    27 
    28     this.close = function() {
    29         self.steps.push(evalAndLog("'" + id + ".close'"));
    30         this.handle.close();
    31     };
    32 
    33     this.setVersion = function(opts) {
    34         self.steps.push(evalAndLog("'" + id + ".setVersion'"));
    35         var req = this.handle.setVersion(String(self.ver++));
    36         req.onabort = function (e) {
    37             self.steps.push(evalAndLog("'" + id + ".setVersion.onabort'"));
    38             if (opts && opts.onabort) { opts.onabort.call(that); }
    39         };
    40         req.onblocked = function (e) {
    41             self.steps.push(evalAndLog("'" + id + ".setVersion.onblocked'"));
    42             if (opts && opts.onblocked) { opts.onblocked.call(that); }
    43         };
    44         req.onsuccess = function (e) {
    45             self.steps.push(evalAndLog("'" + id + ".setVersion.onsuccess'"));
    46             if (that.handle.objectStoreNames.contains("test-store" + self.ver)) {
    47                 that.handle.deleteObjectStore("test-store" + self.ver);
    48             }
    49             var store = that.handle.createObjectStore("test-store" + self.ver);
    50             var count = 0;
    51             do_async_puts(); // Keep this transaction running for a while
    52             function do_async_puts() {
    53                 var req = store.put(count, count);
    54                 req.onerror = unexpectedErrorCallback;
    55                 req.onsuccess = function (e) {
    56                     if (++count < 10) {
    57                         do_async_puts();
    58                     } else {
    59                         self.steps.push(evalAndLog("'" + id + ".setVersion.transaction-complete'"));
    60                         if (opts && opts.onsuccess) { opts.onsuccess.call(that); }
    61                     }
    62                 };
    63             }
    64         };
    65         req.onerror = function (e) {
    66             self.steps.push(evalAndLog("'" + id + ".setVersion.onerror'"));
    67             if (opts && opts.onerror) { opts.onerror.call(that); }
    68         };
    69     };
    70 }
    71 
    72 function deleteDatabase(id, name, opts) {
    73     self.steps.push(evalAndLog("'deleteDatabase(" + id + ")'"));
    74     var req = indexedDB.deleteDatabase(dbprefix + name);
    75     req.onsuccess = function (e) {
    76         self.steps.push(evalAndLog("'deleteDatabase(" + id + ").onsuccess'"));
    77         if (opts && opts.onsuccess) { opts.onsuccess.call(null); }
    78     };
    79     req.onerror = function (e) {
    80         self.steps.push(evalAndLog("'deleteDatabase(" + id + ").onerror'"));
    81         if (opts && opts.onerror) { opts.onerror.call(null); }
    82     };
    83     req.onblocked = function (e) {
    84         self.steps.push(evalAndLog("'deleteDatabase(" + id + ").onblocked'"));
    85         if (opts && opts.onblocked) { opts.onblocked.call(null); }
    86     };
    87 }
    88 
    89 // run a series of steps that take a continuation function
    90 function runSteps(commands) {
    91     if (commands.length) {
    92         var command = commands.shift();
    93         command(function() { runSteps(commands); });
    94     }
     8// This is used to get the safety of evalAndLog() but produce no output
     9// like earlier iterations of this layout test.
     10// FIXME: Just use evalAndLog() once test conversion is complete.
     11function evalNoLog(_a)
     12{
     13  if (typeof _a != "string")
     14    debug("WARN: evalNoLog() expects a string argument");
     15
     16  var _av;
     17  try {
     18     _av = eval(_a);
     19  } catch (e) {
     20    testFailed(_a + " threw exception " + e);
     21  }
     22  return _av;
    9523}
    9624
    9725function test() {
    9826    removeVendorPrefixes();
     27    setDBNameFromPath();
    9928    test1();
    10029}
     
    10332    debug("");
    10433    debug("TEST: deleteDatabase blocked on open handles");
    105     evalAndLog("self.dbname = 'test1'; self.ver = 1; self.steps = []");
    106     var h = new Connection("h");
    107     runSteps([function(doNext) { h.open({onsuccess: doNext,
    108                                 onversion: function() {
    109                                     debug("    h closing, but not immediately");
    110                                     setTimeout(function() { h.close(); }, 0);
    111                                 }}); },
    112         function(doNext) { deleteDatabase("", self.dbname, {
    113                            onsuccess: finishTest}); },
    114         ]);
    115     function finishTest() {
    116         shouldBeEqualToString("self.steps.toString()",
    117                               ["h.open",
    118                                "h.open.onsuccess",
    119                                "deleteDatabase()",
    120                                "h.onversionchange",
    121                                "deleteDatabase().onblocked",
    122                                "h.close",
    123                                "deleteDatabase().onsuccess"
    124                                ].toString());
    125         test2();
    126     }
     34    evalAndLog("self.testname = 'test1'; self.ver = 1");
     35    evalNoLog("blockedEventFired = false");
     36
     37    debug("'h.open'");
     38    request = evalNoLog("indexedDB.open(dbname + testname)");
     39    request.onblocked = unexpectedBlockedCallback;
     40    request.onerror = unexpectedErrorCallback;
     41    request.onsuccess = function(e) {
     42        debug("'h.open.onsuccess'");
     43        h = e.target.result;
     44
     45        h.onversionchange = function(e) {
     46            debug("'h.onversionchange'");
     47            debug("    in versionchange, old = " + JSON.stringify(e.target.version) + " new = " + JSON.stringify(e.version));
     48            debug("    h closing, but not immediately");
     49            // This setTimeout() is used to move the close call outside of the event dispatch
     50            // callback. Per spec, a blocked event should only fire if connections are still
     51            // open after the versionchange event dispatch is complete.
     52            // FIXME: There is potential for test flakiness in the timing between when the
     53            // timeout runs and when the blocked event is dispatched. Move the close call
     54            // into or after the blocked event handler.
     55            setTimeout(function() {
     56                debug("'h.close'");
     57                h.close();
     58            }, 0);
     59        };
     60
     61        debug("'deleteDatabase()'");
     62        request = evalNoLog("indexedDB.deleteDatabase(dbname + testname)");
     63        request.onerror = unexpectedErrorCallback;
     64        request.onblocked = function(e) {
     65            debug("'deleteDatabase().onblocked'");
     66            evalNoLog("blockedEventFired = true");
     67        };
     68        request.onsuccess = function(e) {
     69            debug("'deleteDatabase().onsuccess'");
     70            shouldBeTrue("blockedEventFired");
     71            test2();
     72        };
     73    };
    12774}
    12875
     
    13077    debug("");
    13178    debug("TEST: deleteDatabase not blocked when handles close immediately");
    132     evalAndLog("self.dbname = 'test2'; self.ver = 1; self.steps = []");
    133     var h = new Connection("h");
    134     runSteps([function(doNext) { h.open({onsuccess: doNext,
    135                                           onversion: function() {
    136                                               debug("    h closing immediately");
    137                                               h.close();
    138                                           }}); },
    139         function(doNext) { deleteDatabase("", self.dbname, {
    140                            onsuccess: finishTest}); },
    141         ]);
    142     function finishTest() {
    143         debug("NOTE: Will FAIL with extra bogus deleteDatabase().onblocked step; https://bugs.webkit.org/show_bug.cgi?id=71130");
    144         shouldBeEqualToString("self.steps.toString()",
    145                               ["h.open",
    146                                "h.open.onsuccess",
    147                                "deleteDatabase()",
    148                                "h.onversionchange",
    149                                "h.close",
    150                                "deleteDatabase().onsuccess"
    151                                ].toString());
    152         test3();
    153     }
     79    evalAndLog("self.testname = 'test2'; self.ver = 1");
     80    evalNoLog("blockedEventFired = false");
     81
     82    debug("'h.open'");
     83    request = evalNoLog("indexedDB.open(dbname + testname)");
     84    request.onblocked = unexpectedBlockedCallback;
     85    request.onerror = unexpectedErrorCallback;
     86    request.onsuccess = function(e) {
     87        debug("'h.open.onsuccess'");
     88        h = e.target.result;
     89
     90        h.onversionchange = function(e) {
     91            debug("'h.onversionchange'");
     92            debug("    in versionchange, old = " + JSON.stringify(e.target.version) + " new = " + JSON.stringify(e.version));
     93            debug("    h closing immediately");
     94            debug("'h.close'");
     95            h.close();
     96        };
     97
     98        debug("'deleteDatabase()'");
     99        request = evalNoLog("indexedDB.deleteDatabase(dbname + testname)");
     100        request.onerror = unexpectedErrorCallback;
     101        request.onblocked = function(e) {
     102            debug("'deleteDatabase().onblocked'");
     103            evalNoLog("blockedEventFired = true");
     104        };
     105        request.onsuccess = function(e) {
     106            debug("'deleteDatabase().onsuccess'");
     107            debug("NOTE: Will FAIL with extra bogus deleteDatabase().onblocked step; https://bugs.webkit.org/show_bug.cgi?id=71130");
     108            shouldBeFalse("blockedEventFired");
     109            test3();
     110        };
     111    };
    154112}
    155113
     
    157115    debug("");
    158116    debug("TEST: deleteDatabase is delayed if a VERSION_CHANGE transaction is running");
    159     evalAndLog("self.dbname = 'test3'; self.ver = 1; self.steps = []");
    160     var h = new Connection("h");
    161     runSteps([function(doNext) { h.open({onsuccess: doNext,
    162                                 onversion: function() {
    163                                     debug("    h closing, but not immediately");
    164                                     setTimeout(function() { h.close(); }, 0);
    165                                 }}); },
    166               function(doNext) { h.setVersion(); doNext(); },
    167               function(doNext) { deleteDatabase("", self.dbname,
    168                                 {onsuccess: finishTest}); },
    169               ]);
    170 
    171     function finishTest() {
    172         shouldBeEqualToString("self.steps.toString()",
    173                               ["h.open",
    174                                "h.open.onsuccess",
    175                                "h.setVersion",
    176                                "deleteDatabase()",
    177                                "h.setVersion.onsuccess",
    178                                "h.setVersion.transaction-complete",
    179                                "h.onversionchange",
    180                                "deleteDatabase().onblocked",
    181                                "h.close",
    182                                "deleteDatabase().onsuccess"
    183                                ].toString());
    184         test4();
    185     }
     117    evalAndLog("self.testname = 'test3'; self.ver = 1");
     118    evalNoLog("versionChangeComplete = false");
     119
     120    debug("'h.open'");
     121    request = evalNoLog("indexedDB.open(dbname + testname)");
     122    request.onblocked = unexpectedBlockedCallback;
     123    request.onerror = unexpectedErrorCallback;
     124    request.onsuccess = function(e) {
     125        debug("'h.open.onsuccess'");
     126        h = e.target.result;
     127
     128        h.onversionchange = function(e) {
     129            debug("'h.onversionchange'");
     130            debug("    in versionchange, old = " + JSON.stringify(e.target.version) + " new = " + JSON.stringify(e.version));
     131            debug("    h closing, but not immediately");
     132            // This setTimeout() is used to move the close call outside of the event dispatch
     133            // callback. Per spec, a blocked event should only fire if connections are still
     134            // open after the versionchange event dispatch is complete.
     135            // FIXME: There is potential for test flakiness in the timing between when the
     136            // timeout runs and when the blocked event is dispatched. Move the close call
     137            // into or after the blocked event handler.
     138            setTimeout(function() {
     139                debug("'h.close'");
     140                h.close();
     141            }, 0);
     142        };
     143
     144        debug("'h.setVersion'");
     145        request = evalNoLog("h.setVersion(String(ver++))");
     146        request.onerror = unexpectedErrorCallback;
     147        request.onblocked = unexpectedBlockedCallback;
     148        request.onsuccess = function(e) {
     149            debug("'h.setVersion.onsuccess'");
     150
     151            transaction = e.target.result;
     152            transaction.onabort = unexpectedAbortCallback;
     153            transaction.oncomplete = function() {
     154                debug("'h.setVersion.transaction-complete'");
     155                evalNoLog("versionChangeComplete = true");
     156            };
     157        };
     158
     159        debug("'deleteDatabase()'");
     160        request = evalNoLog("indexedDB.deleteDatabase(dbname + testname)");
     161        request.onerror = unexpectedErrorCallback;
     162        request.onblocked = function(e) {
     163            debug("'deleteDatabase().onblocked'");
     164        };
     165        request.onsuccess = function(e) {
     166            debug("'deleteDatabase().onsuccess'");
     167            shouldBeTrue("versionChangeComplete");
     168            test4();
     169        };
     170    };
    186171}
    187172
     
    189174    debug("");
    190175    debug("TEST: Correct order when there are pending setVersion, delete and open calls.");
    191     evalAndLog("self.dbname = 'test4'; self.ver = 1; self.steps = []");
    192     var h = new Connection("h");
    193     var h2 = new Connection("h2");
    194     var h3 = new Connection("h3");
    195     runSteps([function(doNext) { h.open({onsuccess: doNext,
    196                                          onversion: function() {
    197                                              debug("    h closing, but not immediately");
    198                                              setTimeout(function() { h.close(); }, 0);
    199                                          }});
    200                                },
    201               function(doNext) { h2.open({onsuccess: doNext}); },
    202               function(doNext) { h.setVersion({onblocked: function() {
    203                                                h3.open({onsuccess: finishTest});
    204                                                h2.close();
    205                                            }});
    206                                  doNext();
    207                                },
    208               function(doNext) { deleteDatabase("", self.dbname); },
    209               ]);
    210 
    211     function finishTest() {
    212         shouldBeEqualToString("self.steps.toString()",
    213                               ["h.open",
    214                                "h.open.onsuccess",
    215                                "h2.open",
    216                                "h2.open.onsuccess",
    217                                "h.setVersion",
    218                                "deleteDatabase()",
    219                                "h2.onversionchange",
    220                                "h.setVersion.onblocked",
    221                                "h3.open",
    222                                "h2.close",
    223                                "h.setVersion.onsuccess",
    224                                "h.setVersion.transaction-complete",
    225                                "h.onversionchange",
    226                                "deleteDatabase().onblocked",
    227                                "h.close",
    228                                "deleteDatabase().onsuccess",
    229                                "h3.open.onsuccess"
    230                               ].toString());
    231         finishJSTest();
    232     }
     176    evalAndLog("self.testname = 'test4'; self.ver = 1");
     177    evalNoLog("setVersionBlockedEventFired = false");
     178    evalNoLog("versionChangeComplete = false");
     179    evalNoLog("deleteDatabaseBlockedEventFired = false");
     180    evalNoLog("deleteDatabaseComplete = false");
     181
     182    debug("'h.open'");
     183    request = evalNoLog("indexedDB.open(dbname + testname)");
     184    request.onblocked = unexpectedBlockedCallback;
     185    request.onerror = unexpectedErrorCallback;
     186    request.onsuccess = function(e) {
     187        debug("'h.open.onsuccess'");
     188        h = e.target.result;
     189
     190        h.onversionchange = function(e) {
     191            debug("'h.onversionchange'");
     192            debug("    in versionchange, old = " + JSON.stringify(e.target.version) + " new = " + JSON.stringify(e.version));
     193            debug("    h closing, but not immediately");
     194            // This setTimeout() is used to move the close call outside of the event dispatch
     195            // callback. Per spec, a blocked event should only fire if connections are still
     196            // open after the versionchange event dispatch is complete.
     197            // FIXME: There is potential for test flakiness in the timing between when the
     198            // timeout runs and when the blocked event is dispatched. Move the close call
     199            // into or after the blocked event handler.
     200            setTimeout(function() {
     201                debug("'h.close'");
     202                h.close();
     203            }, 0);
     204        };
     205
     206        debug("'h2.open'");
     207        request = evalNoLog("indexedDB.open(dbname + testname)");
     208        request.onblocked = unexpectedBlockedCallback;
     209        request.onerror = unexpectedErrorCallback;
     210        request.onsuccess = function(e) {
     211            debug("'h2.open.onsuccess'");
     212            h2 = e.target.result;
     213
     214            h2.onversionchange = function(e) {
     215                debug("'h2.onversionchange'");
     216                debug("    in versionchange, old = " + JSON.stringify(e.target.version) + " new = " + JSON.stringify(e.version));
     217            };
     218
     219            debug("'h.setVersion'");
     220            request = evalNoLog("h.setVersion(String(ver++))");
     221            request.onerror = unexpectedErrorCallback;
     222            request.onblocked = function() {
     223                debug("'h.setVersion.onblocked'");
     224                evalNoLog("setVersionBlockedEventFired = true");
     225
     226                debug("'h3.open'");
     227                request = evalNoLog("indexedDB.open(dbname + testname)");
     228                request.onblocked = unexpectedBlockedCallback;
     229                request.onerror = unexpectedErrorCallback;
     230                request.onsuccess = function(e) {
     231                    debug("'h3.open.onsuccess'");
     232                    h3 = e.target.result;
     233                    h3.onversionchange = unexpectedVersionChangeCallback;
     234
     235                    shouldBeTrue("versionChangeComplete");
     236                    shouldBeTrue("blockedEventFired");
     237                    shouldBeTrue("deleteDatabaseComplete");
     238
     239                    finishJSTest();
     240                };
     241
     242                debug("'h2.close'");
     243                h2.close();
     244            };
     245            request.onsuccess = function(e) {
     246                debug("'h.setVersion.onsuccess'");
     247
     248                transaction = e.target.result;
     249                transaction.onabort = unexpectedAbortCallback;
     250                transaction.oncomplete = function() {
     251                    debug("'h.setVersion.transaction-complete'");
     252                    evalNoLog("versionChangeComplete = true");
     253                };
     254            };
     255
     256            debug("'deleteDatabase()'");
     257            request = evalNoLog("indexedDB.deleteDatabase(dbname + testname)");
     258            request.onerror = unexpectedErrorCallback;
     259            request.onblocked = function(e) {
     260                debug("'deleteDatabase().onblocked'");
     261                evalNoLog("deleteDatabaseBlockedEventFired = true");
     262            };
     263            request.onsuccess = function(e) {
     264                debug("'deleteDatabase().onsuccess'");
     265                evalNoLog("deleteDatabaseComplete = true");
     266            };
     267        };
     268    };
    233269}
    234270
  • trunk/LayoutTests/storage/indexeddb/resources/open-close-version.js

    r120976 r129142  
    66description("Test interleaved open/close/setVersion calls in various permutations");
    77
    8 function Connection(id) {
    9     id = String(id);
    10     var that = this;
    11     this.open = function(opts) {
    12         self.steps.push(evalAndLog("'" + id + ".open'"));
    13         var req = indexedDB.open('open-close-version-' + self.dbname);
    14         req.onerror = unexpectedErrorCallback;
    15         req.onsuccess = function (e) {
    16             that.handle = e.target.result;
    17             self.steps.push(evalAndLog("'" + id + ".open.onsuccess'"));
    18             that.handle.onversionchange = function(e) {
    19                 self.steps.push(evalAndLog("'" + id + ".onversionchange'"));
    20                 if (opts && opts.onversion) { opts.onversion.call(that); }
    21             };
    22             if (opts && opts.onsuccess) { opts.onsuccess.call(that); }
    23         };
    24     };
    25 
    26     this.close = function() {
    27         self.steps.push(evalAndLog("'" + id + ".close'"));
    28         this.handle.close();
    29     };
    30 
    31     this.setVersion = function(opts) {
    32         self.steps.push(evalAndLog("'" + id + ".setVersion'"));
    33         var req = this.handle.setVersion(String(self.ver++));
    34         req.onabort = function (e) {
    35             self.steps.push(evalAndLog("'" + id + ".setVersion.onabort'"));
    36             if (opts && opts.onabort) { opts.onabort.call(that); }
    37         };
    38         req.onblocked = function (e) {
    39             self.steps.push(evalAndLog("'" + id + ".setVersion.onblocked'"));
    40             if (opts && opts.onblocked) { opts.onblocked.call(that); }
    41         };
    42         req.onsuccess = function (e) {
    43             self.steps.push(evalAndLog("'" + id + ".setVersion.onsuccess'"));
    44             if (that.handle.objectStoreNames.contains("test-store" + self.ver)) {
    45                 that.handle.deleteObjectStore("test-store" + self.ver);
    46             }
    47             var store = that.handle.createObjectStore("test-store" + self.ver);
    48             var count = 0;
    49             do_async_puts(); // Keep this transaction running for a while
    50             function do_async_puts() {
    51                 var req = store.put(count, count);
    52                 req.onerror = unexpectedErrorCallback;
    53                 req.onsuccess = function (e) {
    54                     if (++count < 10) {
    55                         do_async_puts();
    56                     } else {
    57                         self.steps.push(evalAndLog("'" + id + ".setVersion.transaction-complete'"));
    58                         if (opts && opts.onsuccess) { opts.onsuccess.call(that); }
    59                     }
    60                 };
    61             }
    62         };
    63         req.onerror = function (e) {
    64             self.steps.push(evalAndLog("'" + id + ".setVersion.onerror'"));
    65             if (opts && opts.onerror) { opts.onerror.call(that); }
    66         };
    67     };
    68 }
    69 
    70 // run a series of steps that take a continuation function
    71 function runSteps(commands) {
    72     if (commands.length) {
    73         var command = commands.shift();
    74         command(function() { runSteps(commands); });
    75     }
     8// This is used to get the safety of evalAndLog() but produce no output
     9// like earlier iterations of this layout test.
     10// FIXME: Just use evalAndLog() once test conversion is complete.
     11function evalNoLog(_a)
     12{
     13  if (typeof _a != "string")
     14    debug("WARN: evalNoLog() expects a string argument");
     15
     16  var _av;
     17  try {
     18     _av = eval(_a);
     19  } catch (e) {
     20    testFailed(_a + " threw exception " + e);
     21  }
     22  return _av;
    7623}
    7724
    7825function test() {
    7926    removeVendorPrefixes();
     27    setDBNameFromPath();
    8028    test1();
    8129}
     
    8432    debug("");
    8533    debug("TEST: setVersion blocked on open handles");
    86     evalAndLog("self.dbname = 'test1'; self.ver = 1; self.steps = []");
    87     var h1 = new Connection("h1");
    88     var h2 = new Connection("h2");
    89     runSteps([function(doNext) { h1.open({onsuccess: doNext}); },
    90          function(doNext) { h2.open({onsuccess: doNext,
    91                                 onversion: function() {
    92                                     debug("    h2 closing, but not immediately");
    93                                     setTimeout(function() { h2.close(); }, 0);
    94                                 }}); },
    95          function(doNext) { h1.setVersion({onsuccess: finishTest}); },
    96          ]);
    97     function finishTest() {
    98         shouldBeEqualToString("self.steps.toString()",
    99                               ["h1.open",
    100                                "h1.open.onsuccess",
    101                                "h2.open",
    102                                "h2.open.onsuccess",
    103                                "h1.setVersion",
    104                                "h2.onversionchange",
    105                                "h1.setVersion.onblocked",
    106                                "h2.close",
    107                                "h1.setVersion.onsuccess",
    108                                "h1.setVersion.transaction-complete"
    109                                ].toString());
    110         test2();
    111     }
     34    evalAndLog("self.testname = 'test1'; self.ver = 1");
     35    evalNoLog("blockedEventFired = false");
     36
     37    debug("'h1.open'");
     38    request = evalNoLog("indexedDB.open(dbname + testname)");
     39    request.onblocked = unexpectedBlockedCallback;
     40    request.onerror = unexpectedErrorCallback;
     41    request.onsuccess = function(e) {
     42        debug("'h1.open.onsuccess'");
     43        h1 = e.target.result;
     44
     45        h1.onversionchange = unexpectedVersionChangeCallback;
     46
     47        debug("'h2.open'");
     48        request = evalNoLog("indexedDB.open(dbname + testname)");
     49        request.onblocked = unexpectedBlockedCallback;
     50        request.onerror = unexpectedErrorCallback;
     51        request.onsuccess = function(e) {
     52            debug("'h2.open.onsuccess'");
     53            h2 = e.target.result;
     54
     55            h2.onversionchange = function() {
     56                debug("'h2.onversionchange'");
     57                debug("    h2 closing, but not immediately");
     58                // This setTimeout() is used to move the close call outside of the event dispatch
     59                // callback. Per spec, a blocked event should only fire if connections are still
     60                // open after the versionchange event dispatch is complete.
     61                // FIXME: There is potential for test flakiness in the timing between when the
     62                // timeout runs and when the blocked event is dispatched. Move the close call
     63                // into or after the blocked event handler.
     64                setTimeout(function() {
     65                    debug("'h2.close'");
     66                    evalNoLog("h2.close()");
     67                }, 0);
     68            };
     69
     70            debug("'h1.setVersion'");
     71            request = evalNoLog("h1.setVersion(String(ver++))");
     72            request.onerror = unexpectedErrorCallback;
     73            request.onblocked = function() {
     74                debug("'h1.setVersion.onblocked'");
     75                evalNoLog("blockedEventFired = true");
     76            };
     77            request.onsuccess = function(e) {
     78                debug("'h1.setVersion.onsuccess'");
     79
     80                transaction = e.target.result;
     81                transaction.onabort = unexpectedAbortCallback;
     82                transaction.oncomplete = function() {
     83                    debug("'h1.setVersion.transaction-complete'");
     84                    shouldBeTrue("blockedEventFired");
     85                    test2();
     86                };
     87            };
     88        };
     89    };
    11290}
    11391
     
    11593    debug("");
    11694    debug("TEST: setVersion not blocked if handle closed immediately");
    117     evalAndLog("self.dbname = 'test2'; self.ver = 1; self.steps = []");
    118     var h1 = new Connection("h1");
    119     var h2 = new Connection("h2");
    120     runSteps([function(doNext) { h1.open({onsuccess: doNext}); },
    121               function(doNext) { h2.open({onsuccess: doNext,
    122                                           onversion: function() {
    123                                               debug("    h2 closing immediately");
    124                                               h2.close();
    125                                           }}); },
    126               function(doNext) { h1.setVersion({onsuccess: doNext}); },
    127               finishTest
    128               ]);
    129 
    130     function finishTest() {
    131         debug("NOTE: Will FAIL with extra bogus h1.setVersion.onblocked step; https://bugs.webkit.org/show_bug.cgi?id=71130");
    132         shouldBeEqualToString("self.steps.toString()",
    133                               ["h1.open",
    134                                "h1.open.onsuccess",
    135                                "h2.open",
    136                                "h2.open.onsuccess",
    137                                "h1.setVersion",
    138                                "h2.onversionchange",
    139                                "h2.close",
    140                                "h1.setVersion.onsuccess",
    141                                "h1.setVersion.transaction-complete"
    142                                ].toString());
    143         test3();
    144     }
     95    evalAndLog("self.testname = 'test2'; self.ver = 1");
     96    evalNoLog("blockedEventFired = false");
     97
     98    debug("'h1.open'");
     99    request = evalNoLog("indexedDB.open(dbname + testname)");
     100    request.onblocked = unexpectedBlockedCallback;
     101    request.onerror = unexpectedErrorCallback;
     102    request.onsuccess = function(e) {
     103        debug("'h1.open.onsuccess'");
     104        h1 = e.target.result;
     105
     106        h1.onversionchange = unexpectedVersionChangeCallback;
     107
     108        debug("'h2.open'");
     109        request = evalNoLog("indexedDB.open(dbname + testname)");
     110        request.onblocked = unexpectedBlockedCallback;
     111        request.onerror = unexpectedErrorCallback;
     112        request.onsuccess = function(e) {
     113            debug("'h2.open.onsuccess'");
     114            h2 = e.target.result;
     115
     116            h2.onversionchange = function() {
     117                debug("'h2.onversionchange'");
     118                debug("    h2 closing immediately");
     119                debug("'h2.close'");
     120                evalNoLog("h2.close()");
     121            };
     122
     123            debug("'h1.setVersion'");
     124            request = evalNoLog("h1.setVersion(String(ver++))");
     125            request.onerror = unexpectedErrorCallback;
     126            request.onblocked = function() {
     127                debug("'h1.setVersion.onblocked'");
     128                evalNoLog("blockedEventFired = true");
     129            };
     130            request.onsuccess = function(e) {
     131                debug("'h1.setVersion.onsuccess'");
     132
     133                transaction = e.target.result;
     134                transaction.onabort = unexpectedAbortCallback;
     135                transaction.oncomplete = function() {
     136                    debug("'h1.setVersion.transaction-complete'");
     137                    debug("NOTE: Will FAIL with extra bogus h1.setVersion.onblocked step; https://bugs.webkit.org/show_bug.cgi?id=71130");
     138                    shouldBeFalse("blockedEventFired");
     139                    test3();
     140                };
     141            };
     142        };
     143    };
    145144}
    146145
     
    148147    debug("");
    149148    debug("TEST: open and setVersion blocked if a VERSION_CHANGE transaction is running - close when blocked");
    150     evalAndLog("self.dbname = 'test3'; self.ver = 1; self.steps = []");
    151     var h1 = new Connection("h1");
    152     var h2 = new Connection("h2");
    153     var h3 = new Connection("h3");
    154     runSteps([function(doNext) { h1.open({onsuccess: doNext}); },
    155               function(doNext) { h2.open({onsuccess: doNext}); },
    156               function(doNext) { h1.setVersion(); doNext(); },
    157               function(doNext) { h2.setVersion({
    158                                                    onblocked: function() {
    159                                                        debug("    h2 blocked so closing");
    160                                                        h2.close();
    161                                                        doNext();
    162                                                    }}); },
    163               function() { h3.open({onsuccess: finishTest});}
    164               ]);
    165 
    166     function finishTest() {
    167         shouldBeEqualToString("self.steps.toString()",
    168                               ["h1.open",
    169                                "h1.open.onsuccess",
    170                                "h2.open",
    171                                "h2.open.onsuccess",
    172                                "h1.setVersion",
    173                                "h2.setVersion",
    174                                "h2.onversionchange",
    175                                "h1.setVersion.onblocked",
    176                                "h1.onversionchange",
    177                                "h2.setVersion.onblocked",
    178                                "h2.close",
    179                                "h3.open",
    180                                "h2.setVersion.onerror",
    181                                "h1.setVersion.onsuccess",
    182                                "h1.setVersion.transaction-complete",
    183                                "h3.open.onsuccess"
    184                                ].toString());
    185         test4();
    186     }
     149    evalAndLog("self.testname = 'test3'; self.ver = 1");
     150    evalNoLog("blockedEventFired = false");
     151    evalNoLog("versionChangeComplete = false");
     152
     153    debug("'h1.open'");
     154    request = evalNoLog("indexedDB.open(dbname + testname)");
     155    request.onblocked = unexpectedBlockedCallback;
     156    request.onerror = unexpectedErrorCallback;
     157    request.onsuccess = function(e) {
     158        debug("'h1.open.onsuccess'");
     159        h1 = e.target.result;
     160
     161        h1.onversionchange = function() {
     162            debug("'h1.onversionchange'");
     163        };
     164
     165        debug("'h2.open'");
     166        request = evalNoLog("indexedDB.open(dbname + testname)");
     167        request.onblocked = unexpectedBlockedCallback;
     168        request.onerror = unexpectedErrorCallback;
     169        request.onsuccess = function(e) {
     170            debug("'h2.open.onsuccess'");
     171            h2 = e.target.result;
     172
     173            h2.onversionchange = function() {
     174                debug("'h2.onversionchange'");
     175            };
     176
     177            debug("'h1.setVersion'");
     178            request = evalNoLog("h1.setVersion(String(ver++))");
     179            request.onerror = unexpectedErrorCallback;
     180            request.onblocked = function() {
     181                debug("'h1.setVersion.onblocked'");
     182                evalNoLog("blockedEventFired = true");
     183            };
     184            request.onsuccess = function(e) {
     185                debug("'h1.setVersion.onsuccess'");
     186
     187                transaction = e.target.result;
     188                transaction.onabort = unexpectedAbortCallback;
     189                transaction.oncomplete = function() {
     190                    debug("'h1.setVersion.transaction-complete'");
     191                    evalNoLog("versionChangeComplete = true");
     192                };
     193            };
     194
     195            debug("'h2.setVersion'");
     196            request = evalNoLog("h2.setVersion(String(ver++))");
     197            request.onblocked = function() {
     198                debug("'h2.setVersion.onblocked'");
     199                debug("    h2 blocked so closing");
     200                debug("'h2.close'");
     201                h2.close();
     202
     203                debug("'h3.open'");
     204                request = evalNoLog("indexedDB.open(dbname + testname)");
     205                request.onblocked = unexpectedBlockedCallback;
     206                request.onerror = unexpectedErrorCallback;
     207                request.onsuccess = function() {
     208                    debug("'h3.open.onsuccess'");
     209                    shouldBeTrue("blockedEventFired");
     210                    shouldBeTrue("versionChangeComplete");
     211                    test4();
     212                };
     213            };
     214            request.onerror = function() {
     215                debug("'h2.setVersion.onerror'");
     216            };
     217        };
     218    };
    187219}
    188220
     
    190222    debug("");
    191223    debug("TEST: open and setVersion blocked if a VERSION_CHANGE transaction is running - just close");
    192     evalAndLog("self.dbname = 'test4'; self.ver = 1; self.steps = []");
    193     var h1 = new Connection("h1");
    194     var h2 = new Connection("h2");
    195     var h3 = new Connection("h3");
    196     runSteps([function(doNext) { h1.open({onsuccess: doNext}); },
    197               function(doNext) { h2.open({onsuccess: doNext}); },
    198               function(doNext) { h1.setVersion(); doNext(); },
    199               function(doNext) { h3.open({onsuccess: finishTest}); doNext(); },
    200               function(doNext) { h2.close(); },
    201               ]);
    202 
    203     function finishTest() {
    204         debug("NOTE: Will FAIL with extra bogus h1.setVersion.onblocked step; https://bugs.webkit.org/show_bug.cgi?id=71130");
    205         shouldBeEqualToString("self.steps.toString()",
    206                               ["h1.open",
    207                                "h1.open.onsuccess",
    208                                "h2.open",
    209                                "h2.open.onsuccess",
    210                                "h1.setVersion",
    211                                "h3.open",
    212                                "h2.close",
    213                                "h1.setVersion.onsuccess",
    214                                "h1.setVersion.transaction-complete",
    215                                "h3.open.onsuccess"
    216                                ].toString());
    217         test5();
    218     }
     224    evalAndLog("self.testname = 'test4'; self.ver = 1");
     225    evalNoLog("blockedEventFired = false");
     226    evalNoLog("versionChangeComplete = false");
     227
     228    debug("'h1.open'");
     229    request = evalNoLog("indexedDB.open(dbname + testname)");
     230    request.onblocked = unexpectedBlockedCallback;
     231    request.onerror = unexpectedErrorCallback;
     232    request.onsuccess = function(e) {
     233        debug("'h1.open.onsuccess'");
     234        h1 = e.target.result;
     235
     236        h1.onversionchange = unexpectedVersionChangeCallback;
     237
     238        debug("'h2.open'");
     239        request = evalNoLog("indexedDB.open(dbname + testname)");
     240        request.onblocked = unexpectedBlockedCallback;
     241        request.onerror = unexpectedErrorCallback;
     242        request.onsuccess = function(e) {
     243            debug("'h2.open.onsuccess'");
     244            h2 = e.target.result;
     245
     246            h2.onversionchange = unexpectedVersionChangeCallback;
     247
     248            debug("'h1.setVersion'");
     249            request = evalNoLog("h1.setVersion(String(ver++))");
     250            request.onerror = unexpectedErrorCallback;
     251            request.onblocked = function() {
     252                debug("'h1.setVersion.onblocked'");
     253                evalNoLog("blockedEventFired = true");
     254            };
     255            request.onsuccess = function(e) {
     256                debug("'h1.setVersion.onsuccess'");
     257
     258                transaction = e.target.result;
     259                transaction.onabort = unexpectedAbortCallback;
     260                transaction.oncomplete = function() {
     261                    debug("'h1.setVersion.transaction-complete'");
     262                    evalNoLog("versionChangeComplete = true");
     263                };
     264            };
     265
     266            debug("'h3.open'");
     267            request = evalNoLog("indexedDB.open(dbname + testname)");
     268            request.onblocked = unexpectedBlockedCallback;
     269            request.onerror = unexpectedErrorCallback;
     270            request.onsuccess = function() {
     271                debug("'h3.open.onsuccess'");
     272                debug("NOTE: Will FAIL with extra bogus h1.setVersion.onblocked step; https://bugs.webkit.org/show_bug.cgi?id=71130");
     273                shouldBeFalse("blockedEventFired");
     274                shouldBeTrue("versionChangeComplete");
     275                test5();
     276            };
     277
     278            debug("'h2.close'");
     279            evalNoLog("h2.close()");
     280        };
     281    };
    219282}
    220283
     
    222285    debug("");
    223286    debug("TEST: open blocked if a VERSION_CHANGE transaction is running");
    224     evalAndLog("self.dbname = 'test5'; self.ver = 1; self.steps = []");
    225     var h1 = new Connection("h1");
    226     var h2 = new Connection("h2");
    227 
    228     runSteps([function(doNext) { h1.open({onsuccess: doNext}); },
    229               function(doNext) { h1.setVersion(); doNext(); },
    230               function(doNext) { h2.open({onsuccess: finishTest}); }
    231               ]);
    232 
    233     function finishTest() {
    234         shouldBeEqualToString("self.steps.toString()",
    235                               ["h1.open",
    236                                "h1.open.onsuccess",
    237                                "h1.setVersion",
    238                                "h2.open",
    239                                "h1.setVersion.onsuccess",
    240                                "h1.setVersion.transaction-complete",
    241                                "h2.open.onsuccess"
    242                                ].toString());
    243         test6();
    244     }
     287    evalAndLog("self.testname = 'test5'; self.ver = 1");
     288    evalNoLog("versionChangeComplete = false");
     289
     290    debug("'h1.open'");
     291    request = evalNoLog("indexedDB.open(dbname + testname)");
     292    request.onblocked = unexpectedBlockedCallback;
     293    request.onerror = unexpectedErrorCallback;
     294    request.onsuccess = function(e) {
     295        debug("'h1.open.onsuccess'");
     296        h1 = e.target.result;
     297
     298        h1.onversionchange = unexpectedVersionChangeCallback;
     299
     300        debug("'h1.setVersion'");
     301        request = evalNoLog("h1.setVersion(String(ver++))");
     302        request.onerror = unexpectedErrorCallback;
     303        request.onblocked = unexpectedBlockedCallback;
     304        request.onsuccess = function(e) {
     305            debug("'h1.setVersion.onsuccess'");
     306
     307            transaction = e.target.result;
     308            transaction.onabort = unexpectedAbortCallback;
     309            transaction.oncomplete = function() {
     310                debug("'h1.setVersion.transaction-complete'");
     311                evalNoLog("versionChangeComplete = true");
     312            };
     313        };
     314
     315        debug("'h2.open'");
     316        request = evalNoLog("indexedDB.open(dbname + testname)");
     317        request.onblocked = unexpectedBlockedCallback;
     318        request.onerror = unexpectedErrorCallback;
     319        request.onsuccess = function(e) {
     320            debug("'h2.open.onsuccess'");
     321            h2 = e.target.result;
     322            h2.onversionchange = unexpectedVersionChangeCallback;
     323            shouldBeTrue("versionChangeComplete");
     324            test6();
     325        };
     326    };
    245327}
    246328
     
    248330    debug("");
    249331    debug("TEST: two setVersions from the same connection");
    250     evalAndLog("self.dbname = 'test6'; self.ver = 1; self.steps = []");
    251     var h1 = new Connection("h1");
    252 
    253     runSteps([function(doNext) { h1.open({onsuccess: doNext}); },
    254               function(doNext) { h1.setVersion({onsuccess: halfDone});
    255                                  h1.setVersion({onsuccess: halfDone}); }
    256               ]);
    257 
    258     var counter = 0;
    259     function halfDone() {
    260         counter++;
    261         if (counter < 2) {
    262             debug('half done');
    263         } else {
    264             finishTest();
    265         }
    266     }
    267 
    268     function finishTest() {
    269         shouldBeEqualToString("self.steps.toString()",
    270                               ["h1.open",
    271                                "h1.open.onsuccess",
    272                                "h1.setVersion",
    273                                "h1.setVersion",
    274                                "h1.setVersion.onsuccess",
    275                                "h1.setVersion.transaction-complete",
    276                                "h1.setVersion.onsuccess",
    277                                "h1.setVersion.transaction-complete"
    278                                ].toString());
    279         finishJSTest();
    280     }
     332    evalAndLog("self.testname = 'test6'; self.ver = 1");
     333    evalNoLog("versionChangeComplete = false");
     334
     335    debug("'h1.open'");
     336    request = evalNoLog("indexedDB.open(dbname + testname)");
     337    request.onblocked = unexpectedBlockedCallback;
     338    request.onerror = unexpectedErrorCallback;
     339    request.onsuccess = function(e) {
     340        debug("'h1.open.onsuccess'");
     341        h1 = e.target.result;
     342        h1.onversionchange = unexpectedVersionChangeCallback;
     343
     344        debug("'h1.setVersion'");
     345        request = evalNoLog("h1.setVersion(String(ver++))");
     346        request.onerror = unexpectedErrorCallback;
     347        request.onblocked = unexpectedBlockedCallback;
     348        request.onsuccess = function(e) {
     349            debug("'h1.setVersion.onsuccess'");
     350
     351            transaction = e.target.result;
     352            transaction.onabort = unexpectedAbortCallback;
     353            transaction.oncomplete = function() {
     354                debug("'h1.setVersion.transaction-complete'");
     355                debug("half done");
     356                evalNoLog("versionChangeComplete = true");
     357            };
     358        };
     359
     360
     361        debug("'h1.setVersion'");
     362        request = evalNoLog("h1.setVersion(String(ver++))");
     363        request.onerror = unexpectedErrorCallback;
     364        request.onblocked = unexpectedBlockedCallback;
     365        request.onsuccess = function(e) {
     366            debug("'h1.setVersion.onsuccess'");
     367
     368            transaction = e.target.result;
     369            transaction.onabort = unexpectedAbortCallback;
     370            transaction.oncomplete = function() {
     371                debug("'h1.setVersion.transaction-complete'");
     372                shouldBeTrue("versionChangeComplete");
     373                finishJSTest();
     374            };
     375        };
     376    };
    281377}
    282378
Note: See TracChangeset for help on using the changeset viewer.