| <!DOCTYPE html> |
| <meta charset=utf-8> |
| <title>Cross-realm IDBIndex methods from detached iframe work as expected</title> |
| <script src=/resources/testharness.js></script> |
| <script src=/resources/testharnessreport.js></script> |
| <script src=support.js></script> |
| |
| <body> |
| <script> |
| "use strict"; |
| const INDEX_LOWER = 1000; |
| const INDEX_UPPER = 1001; |
| const INDEX_RANGE = IDBKeyRange.bound(INDEX_LOWER, INDEX_UPPER); |
| |
| const testCases = [ |
| { |
| methodName: "get", |
| arguments: [INDEX_LOWER], |
| validateResult: e => { |
| assert_equals(e.target.result.indexedKey, INDEX_LOWER); |
| }, |
| }, |
| { |
| methodName: "getKey", |
| arguments: [INDEX_UPPER], |
| validateResult: e => { |
| assert_equals(e.target.result, INDEX_UPPER); |
| }, |
| }, |
| { |
| methodName: "getAll", |
| arguments: [INDEX_RANGE], |
| validateResult: e => { |
| assert_array_equals(e.target.result.map(v => v.indexedKey), [INDEX_LOWER, INDEX_UPPER]); |
| }, |
| }, |
| { |
| methodName: "getAllKeys", |
| arguments: [INDEX_RANGE], |
| validateResult: e => { |
| assert_array_equals(e.target.result, [INDEX_LOWER, INDEX_UPPER]); |
| }, |
| }, |
| { |
| methodName: "count", |
| arguments: [INDEX_RANGE], |
| validateResult: e => { |
| assert_equals(e.target.result, 2); |
| }, |
| }, |
| { |
| methodName: "openCursor", |
| arguments: [], |
| validateResult: e => { |
| const cursor = e.target.result; |
| assert_true(cursor instanceof IDBCursor); |
| assert_equals(cursor.value.indexedKey, INDEX_LOWER); |
| }, |
| }, |
| { |
| methodName: "openKeyCursor", |
| arguments: [], |
| validateResult: e => { |
| const cursor = e.target.result; |
| assert_true(cursor instanceof IDBCursor); |
| assert_equals(cursor.key, INDEX_LOWER); |
| }, |
| }, |
| ]; |
| |
| for (const testCase of testCases) { |
| async_test(t => { |
| const iframe = document.createElement("iframe"); |
| iframe.onload = t.step_func(() => { |
| const method = iframe.contentWindow.IDBIndex.prototype[testCase.methodName]; |
| iframe.remove(); |
| |
| let db; |
| const open_rq = createdb(t); |
| open_rq.onupgradeneeded = t.step_func(e => { |
| db = e.target.result; |
| const objectStore = db.createObjectStore("store"); |
| objectStore.createIndex("index", "indexedKey"); |
| objectStore.add({ indexedKey: INDEX_LOWER }, INDEX_LOWER); |
| objectStore.add({ indexedKey: INDEX_UPPER }, INDEX_UPPER); |
| }); |
| |
| open_rq.onsuccess = t.step_func(() => { |
| const index = db.transaction("store").objectStore("store").index("index"); |
| const rq = method.call(index, ...testCase.arguments); |
| rq.onsuccess = t.step_func_done(e => { |
| testCase.validateResult(e); |
| }); |
| }); |
| }); |
| document.body.append(iframe); |
| }, `Cross-realm IDBIndex::${testCase.methodName}() method from detached <iframe> works as expected`); |
| } |
| </script> |