test_sandbox.js (2006B)
1 /* Any copyright is dedicated to the Public Domain. 2 * http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 function exerciseInterface() { 5 function DB(name, store) { 6 this.name = name; 7 this.store = store; 8 this._db = this._create(); 9 } 10 11 DB.prototype = { 12 _create() { 13 var op = indexedDB.open(this.name); 14 op.onupgradeneeded = e => { 15 var db = e.target.result; 16 db.createObjectStore(this.store); 17 }; 18 return new Promise(resolve => { 19 op.onsuccess = e => resolve(e.target.result); 20 }); 21 }, 22 23 _result(tx, op) { 24 return new Promise((resolve, reject) => { 25 op.onsuccess = e => resolve(e.target.result); 26 op.onerror = () => reject(op.error); 27 tx.onabort = () => reject(tx.error); 28 }); 29 }, 30 31 get(k) { 32 return this._db.then(db => { 33 var tx = db.transaction(this.store, "readonly"); 34 var store = tx.objectStore(this.store); 35 return this._result(tx, store.get(k)); 36 }); 37 }, 38 39 add(k, v) { 40 return this._db.then(db => { 41 var tx = db.transaction(this.store, "readwrite"); 42 var store = tx.objectStore(this.store); 43 return this._result(tx, store.add(v, k)); 44 }); 45 }, 46 }; 47 48 var db = new DB("data", "base"); 49 return db 50 .add("x", [10, {}]) 51 .then(_ => db.get("x")) 52 .then(x => { 53 equal(x.length, 2); 54 equal(x[0], 10); 55 equal(typeof x[1], "object"); 56 equal(Object.keys(x[1]).length, 0); 57 }); 58 } 59 60 function run_test() { 61 do_get_profile(); 62 63 let sb = new Cu.Sandbox("https://www.example.com", { 64 wantGlobalProperties: ["indexedDB"], 65 }); 66 67 sb.equal = equal; 68 var innerPromise = new Promise((resolve, reject) => { 69 sb.test_done = resolve; 70 sb.test_error = reject; 71 }); 72 Cu.evalInSandbox( 73 "(" + 74 exerciseInterface.toSource() + 75 ")()" + 76 ".then(test_done, test_error);", 77 sb 78 ); 79 80 do_test_pending(); 81 Promise.all([innerPromise, exerciseInterface()]).then(do_test_finished); 82 }