| // Copyright 2019 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| const DB = 'db'; |
| const STORE = 'store'; |
| const DATA = 'blob value'; |
| run(); |
| |
| function run() { |
| Object.assign(indexedDB.open(DB), { |
| unexpectedErrorCallback, |
| onupgradeneeded(e) { |
| debug("Created object store."); |
| e.target.result.createObjectStore(STORE, { |
| keyPath: 'id', |
| }); |
| }, |
| onsuccess(e) { |
| debug("Opened database."); |
| const idb = /** @type IDBDatabase */ e.target.result; |
| const op = idb |
| .transaction(STORE, 'readwrite') |
| .objectStore(STORE) |
| .put({ |
| id: 'foo', |
| blob: new Blob([DATA]), |
| }); |
| op.onerror = onerror; |
| op.onsuccess = () => { |
| debug("Wrote blob."); |
| idb.close(); |
| setTimeout(verify); |
| } |
| }, |
| }); |
| } |
| |
| function verify(e) { |
| debug("Reading blob."); |
| Object.assign(indexedDB.open(DB), { |
| onerror, |
| onsuccess(e) { |
| const idb = /** @type IDBDatabase */ e.target.result; |
| const op = idb |
| .transaction(STORE, 'readonly') |
| .objectStore(STORE) |
| .get('foo'); |
| op.onerror = onerror; |
| op.onsuccess = async e => { |
| debug("Got blob."); |
| idb.close(); |
| const entry = e.target.result; |
| if (!entry) { |
| fail('BAD: nothing was written'); |
| } else { |
| const text = await ( |
| await fetch(URL.createObjectURL(entry.blob))).text(); |
| if (text === DATA) { |
| done(); |
| } else { |
| fail(`BAD: written "${DATA}", got "${text}"`) |
| } |
| } |
| } |
| }, |
| }); |
| } |