<!doctype html>
<meta charset=utf-8>
<title>IndexedDB: Detached buffers supplied as binary keys</title>
<meta name="help" href="http://w3c.github.io/IndexedDB/#convert-a-value-to-a-key">
<meta name="help" href="https://heycam.github.io/webidl/#dfn-get-buffer-source-copy">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support.js"></script>
<script>

indexeddb_test(
  (t, db) => { db.createObjectStore('store'); },
  (t, db) => {
    const tx = db.transaction('store', 'readwrite');
    const store = tx.objectStore('store');

    const array = new Uint8Array([1,2,3,4]);
    const buffer = array.buffer;
    assert_equals(array.byteLength, 4);

    // Detach the ArrayBuffer by transferring it to a worker.
    const worker = new Worker(URL.createObjectURL(new Blob([])));
    worker.postMessage('', [buffer]);
    assert_equals(array.byteLength, 0);

    assert_throws(new TypeError, () => { store.put('', buffer); });
    t.done();
  },
  'Detached ArrayBuffer'
);

indexeddb_test(
  (t, db) => { db.createObjectStore('store'); },
  (t, db) => {
    const tx = db.transaction('store', 'readwrite');
    const store = tx.objectStore('store');

    const array = new Uint8Array([1,2,3,4]);
    assert_equals(array.length, 4);

    // Detach the ArrayBuffer by transferring it to a worker.
    const worker = new Worker(URL.createObjectURL(new Blob([])));
    worker.postMessage('', [array.buffer]);
    assert_equals(array.length, 0);

    assert_throws(new TypeError, () => { store.put('', array); });
    t.done();
  },
  'Detached TypedArray'
);

</script>
