<!DOCTYPE html>
<title>IndexedDB: Commit ordering of empty transactions</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support.js"></script>
<script>

// Call with a test object and array of expected values. Returns a
// function to call with each actual value. Once the expected number
// of values is seen, asserts that the value orders match and completes
// the test.
function expect(t, expected) {
    var results = [];
    return result => {
        results.push(result);
        if (results.length === expected.length) {
            assert_array_equals(results, expected);
            t.done();
        }
    };
}

indexeddb_test(
    (t, db) => {
        db.createObjectStore('store');
    },
    (t, db) => {
        var saw = expect(t, ['rq1.onsuccess',
                           'rq2.onsuccess',
                           'tx1.oncomplete',
                           'tx2.oncomplete']);

        var tx1 = db.transaction('store', 'readwrite');
        tx1.onabort = t.unreached_func('transaction should commit');
        tx1.oncomplete = t.step_func(() => saw('tx1.oncomplete'));

        var store = tx1.objectStore('store');
        var rq1 = store.put('a', 1);
        rq1.onerror = t.unreached_func('put should succeed');
        rq1.onsuccess = t.step_func(() => {
            saw('rq1.onsuccess');

            var tx2 = db.transaction('store', 'readonly');
            tx2.onabort = t.unreached_func('transaction should commit');
            tx2.oncomplete = t.step_func(() => saw('tx2.oncomplete'));

            var rq2 = store.put('b', 2);
            rq2.onsuccess = t.step_func(() => saw('rq2.onsuccess'));
            rq2.onerror = t.unreached_func('request should succeed');
        });

    },
    'Transactions without requests complete in the expected order');

indexeddb_test(
    (t, db) => {
        db.createObjectStore('store');
    },
    (t, db) => {
        var saw = expect(t, ['rq1.onsuccess',
                           'rq2.onsuccess',
                           'tx1.oncomplete',
                           'tx2.oncomplete',
                           'tx3.oncomplete']);
        var tx1 = db.transaction('store', 'readwrite');
        tx1.onabort = t.unreached_func('transaction should commit');
        tx1.oncomplete = t.step_func(() => saw('tx1.oncomplete'));

        var store = tx1.objectStore('store');
        var rq1 = store.put('a', 1);
        rq1.onerror = t.unreached_func('put should succeed');
        rq1.onsuccess = t.step_func(() => {
            saw('rq1.onsuccess');

            var tx2 = db.transaction('store', 'readonly');
            tx2.onabort = t.unreached_func('transaction should commit');
            tx2.oncomplete = t.step_func(() => saw('tx2.oncomplete'));

            var tx3 = db.transaction('store', 'readonly');
            tx3.onabort = t.unreached_func('transaction should commit');
            tx3.oncomplete = t.step_func(() => saw('tx3.oncomplete'));

            var rq2 = store.put('b', 2);
            rq2.onsuccess = t.step_func(() => saw('rq2.onsuccess'));
            rq2.onerror = t.unreached_func('request should succeed');
        });
    },
    'Multiple transactions without requests complete in the expected order');
</script>
