idbindex-cross-realm-methods.html (3187B)
1 <!DOCTYPE html> 2 <meta charset=utf-8> 3 <title>Cross-realm IDBIndex methods from detached iframe work as expected</title> 4 <script src=/resources/testharness.js></script> 5 <script src=/resources/testharnessreport.js></script> 6 <script src=resources/support.js></script> 7 8 <body> 9 <script> 10 "use strict"; 11 const INDEX_LOWER = 1000; 12 const INDEX_UPPER = 1001; 13 const INDEX_RANGE = IDBKeyRange.bound(INDEX_LOWER, INDEX_UPPER); 14 15 const testCases = [ 16 { 17 methodName: "get", 18 arguments: [INDEX_LOWER], 19 validateResult: e => { 20 assert_equals(e.target.result.indexedKey, INDEX_LOWER); 21 }, 22 }, 23 { 24 methodName: "getKey", 25 arguments: [INDEX_UPPER], 26 validateResult: e => { 27 assert_equals(e.target.result, INDEX_UPPER); 28 }, 29 }, 30 { 31 methodName: "getAll", 32 arguments: [INDEX_RANGE], 33 validateResult: e => { 34 assert_array_equals(e.target.result.map(v => v.indexedKey), [INDEX_LOWER, INDEX_UPPER]); 35 }, 36 }, 37 { 38 methodName: "getAllKeys", 39 arguments: [INDEX_RANGE], 40 validateResult: e => { 41 assert_array_equals(e.target.result, [INDEX_LOWER, INDEX_UPPER]); 42 }, 43 }, 44 { 45 methodName: "count", 46 arguments: [INDEX_RANGE], 47 validateResult: e => { 48 assert_equals(e.target.result, 2); 49 }, 50 }, 51 { 52 methodName: "openCursor", 53 arguments: [], 54 validateResult: e => { 55 const cursor = e.target.result; 56 assert_true(cursor instanceof IDBCursor); 57 assert_equals(cursor.value.indexedKey, INDEX_LOWER); 58 }, 59 }, 60 { 61 methodName: "openKeyCursor", 62 arguments: [], 63 validateResult: e => { 64 const cursor = e.target.result; 65 assert_true(cursor instanceof IDBCursor); 66 assert_equals(cursor.key, INDEX_LOWER); 67 }, 68 }, 69 ]; 70 71 for (const testCase of testCases) { 72 async_test(t => { 73 const iframe = document.createElement("iframe"); 74 iframe.onload = t.step_func(() => { 75 const method = iframe.contentWindow.IDBIndex.prototype[testCase.methodName]; 76 iframe.remove(); 77 78 let db; 79 const open_rq = createdb(t); 80 open_rq.onupgradeneeded = t.step_func(e => { 81 db = e.target.result; 82 const objectStore = db.createObjectStore("store"); 83 objectStore.createIndex("index", "indexedKey"); 84 objectStore.add({ indexedKey: INDEX_LOWER }, INDEX_LOWER); 85 objectStore.add({ indexedKey: INDEX_UPPER }, INDEX_UPPER); 86 }); 87 88 open_rq.onsuccess = t.step_func(() => { 89 const index = db.transaction("store", "readonly").objectStore("store").index("index"); 90 const rq = method.call(index, ...testCase.arguments); 91 rq.onsuccess = t.step_func_done(e => { 92 testCase.validateResult(e); 93 }); 94 }); 95 }); 96 document.body.append(iframe); 97 }, `Cross-realm IDBIndex::${testCase.methodName}() method from detached <iframe> works as expected`); 98 } 99 </script>