tor-browser

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

test_sandbox.html (3027B)


      1 <!doctype html>
      2 <html>
      3 <head>
      4  <title>indexedDB in JS Sandbox</title>
      5  <script src="/tests/SimpleTest/SimpleTest.js"></script>
      6  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"></link>
      7 </head>
      8 <body>
      9 <script type="application/javascript">
     10 
     11 SimpleTest.waitForExplicitFinish();
     12 
     13 // This runs inside a same-origin sandbox.
     14 // The intent being to show that the data store is the same.
     15 function storeValue() {
     16  function createDB_inner() {
     17    var op = indexedDB.open("db");
     18    op.onupgradeneeded = e => {
     19      var db = e.target.result;
     20      db.createObjectStore("store");
     21    };
     22    return new Promise(resolve => {
     23      op.onsuccess = e => resolve(e.target.result);
     24    });
     25  }
     26 
     27  function add(k, v) {
     28    return createDB_inner().then(db => {
     29      var tx = db.transaction("store", "readwrite");
     30      var store = tx.objectStore("store");
     31      var op = store.add(v, k);
     32      return new Promise((resolve, reject) => {
     33        op.onsuccess = e => resolve(e.target.result);
     34        op.onerror = _ => reject(op.error);
     35        tx.onabort = _ => reject(tx.error);
     36      });
     37    });
     38  }
     39 
     40  return add("x", [ 10, {} ])
     41    .then(_ => step_done(),
     42          _ => ok(false, "failed to store"));
     43 }
     44 
     45 function createDB_outer() {
     46  var op = indexedDB.open("db");
     47  op.onupgradeneeded = e => {
     48    ok(false, "upgrade should not be needed");
     49    var db = e.target.result;
     50    db.createObjectStore("store");
     51  };
     52  return new Promise(resolve => {
     53    op.onsuccess = e => resolve(e.target.result);
     54  });
     55 }
     56 
     57 function get(k) {
     58  return createDB_outer().then(db => {
     59      var tx = db.transaction("store", "readonly");
     60      var store = tx.objectStore("store");
     61      var op = store.get(k);
     62      return new Promise((resolve, reject) => {
     63        op.onsuccess = e => resolve(e.target.result);
     64        op.onerror = _ => reject(op.error);
     65        tx.onabort = _ => reject(tx.error);
     66      });
     67  });
     68 }
     69 
     70 function runInSandbox(sandbox, testFunc) {
     71  is(typeof testFunc, "function");
     72  var resolvePromise;
     73  // Step-done is defined in the sandbox and used in the add() function above.
     74  /* global step_done */
     75  var testPromise = new Promise(r => resolvePromise = r);
     76  SpecialPowers.Cu.exportFunction(_ => resolvePromise(), sandbox,
     77                                  { defineAs: "step_done" });
     78  SpecialPowers.Cu.evalInSandbox("(" + testFunc.toString() + ")()" +
     79                                 ".then(step_done);", sandbox);
     80  return testPromise;
     81 }
     82 
     83 // Use the window principal for the sandbox; location.origin is not sufficient.
     84 var sb = new SpecialPowers.Cu.Sandbox(window,
     85                                      { wantGlobalProperties: ["indexedDB"] });
     86 
     87 sb.ok = SpecialPowers.Cu.exportFunction(ok, sb);
     88 
     89 Promise.resolve()
     90  .then(_ => runInSandbox(sb, storeValue))
     91  .then(_ => get("x"))
     92  .then(x => {
     93    ok(x, "a value should be present");
     94    is(x.length, 2);
     95    is(x[0], 10);
     96    is(typeof x[1], "object");
     97    is(Object.keys(x[1]).length, 0);
     98  })
     99  .then(_ => SimpleTest.finish());
    100 
    101 </script>
    102 </body>
    103 </html>