tor-browser

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

exceptions_in_events_iframe.html (6006B)


      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 src="/tests/SimpleTest/SimpleTest.js"></script>
     10  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
     11 
     12  <script type="text/javascript">
     13    let testGenerator = testSteps();
     14 
     15    function ok(val, message) {
     16      val = val ? "true" : "false";
     17      window.parent.postMessage("SimpleTest.ok(" + val + ", '" + message +
     18                                "');", "*");
     19    }
     20 
     21    function is(a, b, message) {
     22      ok(a == b, message);
     23    }
     24 
     25    function grabEventAndContinueHandler(event) {
     26      testGenerator.next(event);
     27    }
     28 
     29    function errorHandler(event) {
     30      ok(false, "indexedDB error, code " + event.target.error.name);
     31      finishTest();
     32    }
     33 
     34    function unexpectedSuccessHandler() {
     35      ok(false, "got success when it was not expected!");
     36      finishTest();
     37    }
     38 
     39    function finishTest() {
     40      // Let window.onerror have a chance to fire
     41      setTimeout(function() {
     42        setTimeout(function() {
     43          testGenerator.return();
     44          window.parent.postMessage("SimpleTest.finish();", "*");
     45        }, 0);
     46      }, 0);
     47    }
     48 
     49    window.onerror = function() {
     50      return false;
     51    };
     52 
     53    function* testSteps() {
     54      window.parent.SpecialPowers.addPermission("indexedDB", true, document);
     55 
     56      // Test 1: Throwing an exception in an upgradeneeded handler should
     57      // abort the versionchange transaction and fire an error at the request.
     58      let request = indexedDB.open(window.location.pathname, 1);
     59      request.onerror = errorHandler;
     60      request.onsuccess = unexpectedSuccessHandler;
     61      request.onupgradeneeded = function() {
     62        let transaction = request.transaction;
     63        transaction.oncomplete = unexpectedSuccessHandler;
     64        transaction.onabort = grabEventAndContinueHandler;
     65        throw new Error("STOP");
     66      };
     67 
     68      let event = yield undefined;
     69      is(event.type, "abort",
     70         "Throwing during an upgradeneeded event should abort the transaction.");
     71      is(event.target.error.name, "AbortError", "Got AbortError object");
     72 
     73      request.onerror = grabEventAndContinueHandler;
     74      event = yield undefined;
     75 
     76      is(event.type, "error",
     77         "Throwing during an upgradeneeded event should fire an error.");
     78 
     79      // Test 2: Throwing during a request's success handler should abort the
     80      // transaction.
     81      request = indexedDB.open(window.location.pathname, 1);
     82      request.onerror = errorHandler;
     83      request.onblocked = errorHandler;
     84      request.onupgradeneeded = grabEventAndContinueHandler;
     85      request.onsuccess = unexpectedSuccessHandler;
     86      let openrequest = request;
     87      event = yield undefined;
     88 
     89      request.onupgradeneeded = unexpectedSuccessHandler;
     90 
     91      let db = event.target.result;
     92      db.onerror = function(event) {
     93        event.preventDefault();
     94      };
     95 
     96      event.target.transaction.oncomplete = unexpectedSuccessHandler;
     97      event.target.transaction.onabort = grabEventAndContinueHandler;
     98 
     99      is(db.version, 1, "Correct version");
    100      is(db.objectStoreNames.length, 0, "Correct objectStoreNames length");
    101 
    102      let objectStore = db.createObjectStore("foo");
    103 
    104      is(db.objectStoreNames.length, 1, "Correct objectStoreNames length");
    105      ok(db.objectStoreNames.contains("foo"), "Has correct objectStore");
    106 
    107      request = objectStore.add({}, 1);
    108      request.onsuccess = function() {
    109        throw new Error("foo");
    110      };
    111 
    112      event = yield undefined;
    113 
    114      is(event.type, "abort", "Got transaction abort event");
    115      is(event.target.error.name, "AbortError", "Got AbortError object");
    116      openrequest.onerror = grabEventAndContinueHandler;
    117 
    118      event = yield undefined;
    119 
    120      is(event.type, "error", "Got IDBOpenDBRequest error event");
    121      is(event.target, openrequest, "Right event target");
    122      is(event.target.error.name, "AbortError", "Right error name");
    123 
    124      // Test 3: Throwing during a request's error handler should abort the
    125      // transaction, even if preventDefault is called on the error event.
    126      request = indexedDB.open(window.location.pathname, 1);
    127      request.onerror = errorHandler;
    128      request.onblocked = errorHandler;
    129      request.onupgradeneeded = grabEventAndContinueHandler;
    130      request.onsuccess = unexpectedSuccessHandler;
    131      openrequest = request;
    132      event = yield undefined;
    133 
    134      request.onupgradeneeded = unexpectedSuccessHandler;
    135 
    136      db = event.target.result;
    137      db.onerror = function(event) {
    138        event.preventDefault();
    139      };
    140 
    141      event.target.transaction.oncomplete = unexpectedSuccessHandler;
    142      event.target.transaction.onabort = grabEventAndContinueHandler;
    143 
    144      is(db.version, 1, "Correct version");
    145      is(db.objectStoreNames.length, 0, "Correct objectStoreNames length");
    146 
    147      objectStore = db.createObjectStore("foo");
    148 
    149      is(db.objectStoreNames.length, 1, "Correct objectStoreNames length");
    150      ok(db.objectStoreNames.contains("foo"), "Has correct objectStore");
    151 
    152      request = objectStore.add({}, 1);
    153      request.onerror = errorHandler;
    154      request = objectStore.add({}, 1);
    155      request.onsuccess = unexpectedSuccessHandler;
    156      request.onerror = function(event) {
    157        event.preventDefault();
    158        throw new Error("STOP");
    159      };
    160 
    161      event = yield undefined;
    162 
    163      is(event.type, "abort", "Got transaction abort event");
    164      is(event.target.error.name, "AbortError", "Got AbortError object");
    165      openrequest.onerror = grabEventAndContinueHandler;
    166 
    167      event = yield undefined;
    168 
    169      is(event.type, "error", "Got IDBOpenDBRequest error event");
    170      is(event.target, openrequest, "Right event target");
    171      is(event.target.error.name, "AbortError", "Right error name");
    172 
    173      finishTest();
    174      yield undefined;
    175    }
    176  </script>
    177 
    178 </head>
    179 
    180 <body onload="testGenerator.next();"></body>
    181 
    182 </html>