1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
<script>
// 5 MB is larger than default WAL auto-checkpoint limit of 4 MB.
const ROW_SIZE = 5 << 20;
function openIDBAsync() {
return new Promise((resolve, reject) => {
let req = indexedDB.open('test-wal-checkpoint');
req.onupgradeneeded = e => e.target.result.createObjectStore('objects');
req.onsuccess = e => resolve(e.target.result);
req.onerror = reject;
});
}
// This creates a hanging cursor that doesn't let go of its associated
// read transaction until the next count() call in older WebKits (202137).
function countAsync(db) {
let txn;
let txnPromise = new Promise((resolve, reject) => {
txn = db.transaction('objects', 'readwrite');
[txn.oncomplete, txn.onerror] = [resolve, reject];
});
let reqPromise = new Promise((resolve, reject) => {
let req = txn.objectStore('objects').count(IDBKeyRange.lowerBound(0xff));
[req.onsuccess, req.onerror] = [resolve, reject];
});
return Promise.all([txnPromise, reqPromise]).then(_ => db);
}
function insertRowAsync(db) {
let txn;
let txnPromise = new Promise((resolve, reject) => {
txn = db.transaction('objects', 'readwrite');
[txn.oncomplete, txn.onerror] = [resolve, reject];
});
let reqPromise = new Promise((resolve, reject) => {
let req = txn.objectStore('objects').put(new Int8Array(ROW_SIZE), 0xff);
[req.onsuccess, req.onerror] = [resolve, reject];
});
return Promise.all([txnPromise, reqPromise]).then(_ => db);
}
openIDBAsync()
.then(countAsync)
.then(insertRowAsync)
.then(_ => window.webkit.messageHandlers.testHandler.postMessage('Success'))
.catch(e => window.webkit.messageHandlers.testHandler.postMessage('Failed inserting row: ' + (e?.target?.error || e)))
</script>
|