File: IDBCheckpointWAL.html

package info (click to toggle)
wpewebkit 2.38.6-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 311,508 kB
  • sloc: cpp: 2,653,313; javascript: 289,013; ansic: 121,268; xml: 64,149; python: 35,534; ruby: 17,287; perl: 15,877; asm: 11,072; yacc: 2,326; sh: 1,863; lex: 1,319; java: 937; makefile: 146; pascal: 60
file content (53 lines) | stat: -rw-r--r-- 1,814 bytes parent folder | download | duplicates (15)
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>