| <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> |