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>