| <!DOCTYPE html> | |
| <title>IndexedDB: SharedArrayBuffer keys</title> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src="resources/support.js"></script> | |
| <script> | |
| 'use strict'; | |
| const key_data = [1, 2, 3, 4]; | |
| function create_object_store(t, db) { | |
| db.createObjectStore('store'); | |
| } | |
| function create_shared_buffer() { | |
| const buffer = new SharedArrayBuffer(key_data.length); | |
| const view = new Uint8Array(buffer); | |
| view.set(key_data); | |
| return {buffer, view}; | |
| } | |
| function put_and_validate_key(t, db, key, view_on_sab, key_copy) { | |
| assert_true( | |
| self.crossOriginIsolated, 'The page should be cross-origin isolated'); | |
| // Put the SAB-backed key in the store. | |
| const tx = db.transaction('store', 'readwrite'); | |
| const store = tx.objectStore('store'); | |
| const put_request = store.put('value', key); | |
| put_request.onerror = t.unreached_func('put should succeed'); | |
| // Modifying the SAB after put should have no effect. | |
| view_on_sab.fill(0); | |
| // Reading the record back out of the key should work. | |
| const get_request = store.get(key_copy); | |
| get_request.onerror = t.unreached_func('get should succeed'); | |
| get_request.onsuccess = t.step_func(() => { | |
| assert_equals(get_request.result, 'value'); | |
| }); | |
| tx.oncomplete = t.step_func_done(); | |
| } | |
| indexeddb_test( | |
| create_object_store, | |
| (t, db) => { | |
| const {buffer, view} = create_shared_buffer(); | |
| put_and_validate_key( | |
| t, db, buffer, view, new Uint8Array(key_data)); | |
| }, | |
| 'A SharedArrayBuffer can be used as an IndexedDB key'); | |
| indexeddb_test( | |
| create_object_store, | |
| (t, db) => { | |
| const {view} = create_shared_buffer(); | |
| put_and_validate_key( | |
| t, db, view, view, new Uint8Array(key_data)); | |
| }, | |
| 'A SharedArrayBuffer-backed view can be used as an IndexedDB key'); | |
| indexeddb_test( | |
| create_object_store, | |
| (t, db) => { | |
| const {buffer, view} = create_shared_buffer(); | |
| put_and_validate_key( | |
| t, db, [buffer], view, [new Uint8Array(key_data)]); | |
| }, | |
| 'A SharedArrayBuffer in an array can be used as an IndexedDB key'); | |
| </script> |