diff options
Diffstat (limited to 'dom/indexedDB/test/test_sandbox.html')
-rw-r--r-- | dom/indexedDB/test/test_sandbox.html | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/dom/indexedDB/test/test_sandbox.html b/dom/indexedDB/test/test_sandbox.html new file mode 100644 index 0000000000..0a15a53287 --- /dev/null +++ b/dom/indexedDB/test/test_sandbox.html @@ -0,0 +1,103 @@ +<!doctype html> +<html> +<head> + <title>indexedDB in JS Sandbox</title> + <script src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"></link> +</head> +<body> +<script type="application/javascript"> + +SimpleTest.waitForExplicitFinish(); + +// This runs inside a same-origin sandbox. +// The intent being to show that the data store is the same. +function storeValue() { + function createDB_inner() { + var op = indexedDB.open("db"); + op.onupgradeneeded = e => { + var db = e.target.result; + db.createObjectStore("store"); + }; + return new Promise(resolve => { + op.onsuccess = e => resolve(e.target.result); + }); + } + + function add(k, v) { + return createDB_inner().then(db => { + var tx = db.transaction("store", "readwrite"); + var store = tx.objectStore("store"); + var op = store.add(v, k); + return new Promise((resolve, reject) => { + op.onsuccess = e => resolve(e.target.result); + op.onerror = _ => reject(op.error); + tx.onabort = _ => reject(tx.error); + }); + }); + } + + return add("x", [ 10, {} ]) + .then(_ => step_done(), + _ => ok(false, "failed to store")); +} + +function createDB_outer() { + var op = indexedDB.open("db"); + op.onupgradeneeded = e => { + ok(false, "upgrade should not be needed"); + var db = e.target.result; + db.createObjectStore("store"); + }; + return new Promise(resolve => { + op.onsuccess = e => resolve(e.target.result); + }); +} + +function get(k) { + return createDB_outer().then(db => { + var tx = db.transaction("store", "readonly"); + var store = tx.objectStore("store"); + var op = store.get(k); + return new Promise((resolve, reject) => { + op.onsuccess = e => resolve(e.target.result); + op.onerror = _ => reject(op.error); + tx.onabort = _ => reject(tx.error); + }); + }); +} + +function runInSandbox(sandbox, testFunc) { + is(typeof testFunc, "function"); + var resolvePromise; + // Step-done is defined in the sandbox and used in the add() function above. + /* global step_done */ + var testPromise = new Promise(r => resolvePromise = r); + SpecialPowers.Cu.exportFunction(_ => resolvePromise(), sandbox, + { defineAs: "step_done" }); + SpecialPowers.Cu.evalInSandbox("(" + testFunc.toString() + ")()" + + ".then(step_done);", sandbox); + return testPromise; +} + +// Use the window principal for the sandbox; location.origin is not sufficient. +var sb = new SpecialPowers.Cu.Sandbox(window, + { wantGlobalProperties: ["indexedDB"] }); + +sb.ok = SpecialPowers.Cu.exportFunction(ok, sb); + +Promise.resolve() + .then(_ => runInSandbox(sb, storeValue)) + .then(_ => get("x")) + .then(x => { + ok(x, "a value should be present"); + is(x.length, 2); + is(x[0], 10); + is(typeof x[1], "object"); + is(Object.keys(x[1]).length, 0); + }) + .then(_ => SimpleTest.finish()); + +</script> +</body> +</html> |