tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

error_events_abort_transactions_iframe.html (8824B)


      1 <!--
      2  Any copyright is dedicated to the Public Domain.
      3  http://creativecommons.org/publicdomain/zero/1.0/
      4 -->
      5 <html>
      6 <head>
      7  <title>Indexed Database Property Test</title>
      8 
      9  <script type="text/javascript">
     10 
     11    let testGenerator = testSteps();
     12 
     13    function ok(val, message) {
     14      val = val ? "true" : "false";
     15      window.parent.postMessage("SimpleTest.ok(" + val + ", '" + message +
     16                                "');", "*");
     17    }
     18 
     19    function is(a, b, message) {
     20      ok(a == b, message);
     21    }
     22 
     23    function grabEventAndContinueHandler(event) {
     24      testGenerator.next(event);
     25    }
     26 
     27    function errorHandler(event) {
     28      ok(false, "indexedDB error, code " + event.target.errorCcode);
     29      finishTest();
     30    }
     31 
     32    function unexpectedSuccessHandler() {
     33      ok(false, "got success when it was not expected!");
     34      finishTest();
     35    }
     36 
     37    function finishTest() {
     38      // Let window.onerror have a chance to fire
     39      setTimeout(function() {
     40        setTimeout(function() {
     41          window.parent.postMessage("SimpleTest.finish();", "*");
     42        }, 0);
     43      }, 0);
     44    }
     45 
     46    window.onerror = function(message) {
     47      is(message, "ConstraintError", "Expect a constraint error");
     48    };
     49 
     50    function* testSteps() {
     51      window.parent.SpecialPowers.addPermission("indexedDB", true, document);
     52 
     53      let request = indexedDB.open(window.location.pathname, 1);
     54      request.onsuccess = unexpectedSuccessHandler;
     55      request.onerror = grabEventAndContinueHandler;
     56      request.onupgradeneeded = grabEventAndContinueHandler;
     57      let event = yield undefined;
     58 
     59      let db = event.target.result;
     60      db.onversionchange = function(event) {
     61        event.target.close();
     62      };
     63 
     64      is(db.version, 1, "Correct version");
     65      is(db.objectStoreNames.length, 0, "Correct objectStoreNames length");
     66 
     67      let trans = event.target.transaction;
     68 
     69      trans.oncomplete = unexpectedSuccessHandler;
     70      trans.onabort = grabEventAndContinueHandler;
     71 
     72      let objectStore = db.createObjectStore("foo");
     73 
     74      is(db.objectStoreNames.length, 1, "Correct objectStoreNames length");
     75      ok(db.objectStoreNames.contains("foo"), "Has correct objectStore");
     76 
     77      let originalRequest = request;
     78      request = objectStore.add({}, 1);
     79      request.onsuccess = grabEventAndContinueHandler;
     80      request.onerror = errorHandler;
     81      event = yield undefined;
     82 
     83      request = objectStore.add({}, 1);
     84      request.onsuccess = unexpectedSuccessHandler;
     85      request.onerror = function() {
     86        // Don't do anything! ConstraintError is expected in window.onerror.
     87      };
     88      event = yield undefined;
     89 
     90      is(event.type, "abort", "Got a transaction abort event");
     91      is(db.version, 0, "Correct version");
     92      is(db.objectStoreNames.length, 0, "Correct objectStoreNames length");
     93      is(trans.error.name, "ConstraintError", "Right error");
     94      ok(trans.error === request.error, "Object identity holds");
     95      is(originalRequest.transaction, trans, "request.transaction should still be set");
     96 
     97      event = yield undefined;
     98      is(event.type, "error", "Got request error event");
     99      is(event.target, originalRequest, "error event has right target");
    100      is(event.target.error.name, "AbortError", "Right error");
    101      is(originalRequest.transaction, null, "request.transaction should now be null");
    102      // Skip the verification of ConstraintError in window.onerror.
    103      event.preventDefault();
    104 
    105      request = indexedDB.open(window.location.pathname, 1);
    106      request.onerror = errorHandler;
    107      request.onupgradeneeded = grabEventAndContinueHandler;
    108      event = yield undefined;
    109 
    110      db = event.target.result;
    111      db.onversionchange = function(event) {
    112        event.target.close();
    113      };
    114 
    115      event.target.transaction.oncomplete = grabEventAndContinueHandler;
    116      event.target.transaction.onabort = unexpectedSuccessHandler;
    117 
    118      is(db.version, "1", "Correct version");
    119      is(db.objectStoreNames.length, 0, "Correct objectStoreNames length");
    120 
    121      objectStore = db.createObjectStore("foo");
    122 
    123      is(db.objectStoreNames.length, 1, "Correct objectStoreNames length");
    124      ok(db.objectStoreNames.contains("foo"), "Has correct objectStore");
    125 
    126      objectStore.createIndex("baz", "key.path");
    127      objectStore.createIndex("dontDeleteMe", "");
    128 
    129      is(objectStore.indexNames.length, 2, "Correct indexNames length");
    130      ok(objectStore.indexNames.contains("baz"), "Has correct index");
    131      ok(objectStore.indexNames.contains("dontDeleteMe"), "Has correct index");
    132 
    133      let objectStoreForDeletion = db.createObjectStore("bar");
    134 
    135      is(db.objectStoreNames.length, 2, "Correct objectStoreNames length");
    136      ok(db.objectStoreNames.contains("bar"), "Has correct objectStore");
    137 
    138      objectStoreForDeletion.createIndex("foo", "key.path");
    139 
    140      is(objectStoreForDeletion.indexNames.length, 1, "Correct indexNames length");
    141      ok(objectStoreForDeletion.indexNames.contains("foo"), "Has correct index");
    142 
    143      request = objectStore.add({}, 1);
    144      request.onsuccess = grabEventAndContinueHandler;
    145      request.onerror = errorHandler;
    146      event = yield undefined;
    147 
    148      request = objectStore.add({}, 1);
    149      request.onsuccess = unexpectedSuccessHandler;
    150      request.onerror = function(event) {
    151        // Expected, but prevent the abort.
    152        event.preventDefault();
    153      };
    154      event = yield undefined;
    155 
    156      is(event.type, "complete", "Got a transaction complete event");
    157 
    158      is(db.version, "1", "Correct version");
    159      is(db.objectStoreNames.length, 2, "Correct objectStoreNames length");
    160      ok(db.objectStoreNames.contains("foo"), "Has correct objectStore");
    161      ok(db.objectStoreNames.contains("bar"), "Has correct objectStore");
    162 
    163      request = indexedDB.open(window.location.pathname, 2);
    164      request.onerror = errorHandler;
    165      request.onupgradeneeded = grabEventAndContinueHandler;
    166      event = yield undefined;
    167 
    168      db = event.target.result;
    169      db.onversionchange = function(event) {
    170        event.target.close();
    171      };
    172 
    173      trans = event.target.transaction;
    174      trans.oncomplete = unexpectedSuccessHandler;
    175 
    176      is(db.version, "2", "Correct version");
    177      is(db.objectStoreNames.length, 2, "Correct objectStoreNames length");
    178      ok(db.objectStoreNames.contains("foo"), "Has correct objectStore");
    179      ok(db.objectStoreNames.contains("bar"), "Has correct objectStore");
    180 
    181      let createdObjectStore = db.createObjectStore("newlyCreated");
    182      objectStore = trans.objectStore("foo");
    183      let deletedObjectStore = trans.objectStore("bar");
    184      deletedObjectStore.deleteIndex("foo");
    185      db.deleteObjectStore("bar");
    186 
    187      createdObjectStore.createIndex("newIndex", "key.path");
    188      objectStore.createIndex("newIndex", "key.path");
    189      objectStore.deleteIndex("baz");
    190 
    191      is(db.objectStoreNames.length, 2, "Correct objectStoreNames length");
    192      ok(db.objectStoreNames.contains("newlyCreated"), "Has correct objectStore");
    193      ok(db.objectStoreNames.contains("foo"), "Has correct objectStore");
    194 
    195      is(createdObjectStore.indexNames.length, 1, "Correct indexNames length");
    196      ok(createdObjectStore.indexNames.contains("newIndex"), "Has correct index");
    197 
    198      is(objectStore.indexNames.length, 2, "Correct indexNames length");
    199      ok(objectStore.indexNames.contains("dontDeleteMe"), "Has correct index");
    200      ok(objectStore.indexNames.contains("newIndex"), "Has correct index");
    201 
    202      // ConstraintError is expected in window.onerror.
    203      objectStore.add({}, 1);
    204      trans.onabort = grabEventAndContinueHandler;
    205 
    206      event = yield undefined;
    207 
    208      // Test that the world has been restored.
    209      is(db.version, "1", "Correct version");
    210      is(db.objectStoreNames.length, 2, "Correct objectStoreNames length");
    211      ok(db.objectStoreNames.contains("foo"), "Has correct objectStore");
    212      ok(db.objectStoreNames.contains("bar"), "Has correct objectStore");
    213 
    214      is(objectStore.indexNames.length, 2, "Correct indexNames length");
    215      ok(objectStore.indexNames.contains("dontDeleteMe"), "Has correct index");
    216      ok(objectStore.indexNames.contains("baz"), "Has correct index");
    217 
    218      is(createdObjectStore.indexNames.length, 0, "Correct indexNames length");
    219 
    220      is(deletedObjectStore.indexNames.length, 1, "Correct indexNames length");
    221      ok(deletedObjectStore.indexNames.contains("foo"), "Has correct index");
    222 
    223      request.onerror = grabEventAndContinueHandler;
    224 
    225      event = yield undefined;
    226      is(event.type, "error", "Got request error event");
    227      is(event.target.error.name, "AbortError", "Right error");
    228      // Skip the verification of ConstraintError in window.onerror.
    229      event.preventDefault();
    230 
    231      finishTest();
    232    }
    233  </script>
    234 
    235 </head>
    236 
    237 <body onload="testGenerator.next();"></body>
    238 
    239 </html>