if (this.importScripts) {
    importScripts('../../../resources/js-test.js');
    importScripts('shared.js');
}

description("Check that read-only transactions don't starve read-write transactions.");

indexedDBTest(prepareDatabase, runTransactions);

function prepareDatabase(evt)
{
    preamble(evt);
    evalAndLog("db = event.target.result");
    evalAndLog("db.createObjectStore('store')");
}

function runTransactions(evt)
{
    preamble(evt);
    evalAndLog("db = event.target.result");
    debug("");

    evalAndLog("readWriteTransactionStarted = false");
    evalAndLog("readWriteTransactionComplete = false");

    startReadOnlyTransaction();
}


function startReadOnlyTransaction()
{
    preamble();
    evalAndLog("transaction = db.transaction('store', 'readonly')");
    transaction.onabort = unexpectedAbortCallback;
    evalAndLog("store = transaction.objectStore('store')");
    debug("Keep the transaction alive with an endless series of gets");

    function doGet() {
        request = store.get(0);
        request.onsuccess = function() {
            if (!readWriteTransactionStarted)
                startReadWriteTransaction();

            if (!readWriteTransactionComplete)
                doGet();
        };
    }
    doGet();
}

function startReadWriteTransaction()
{
    preamble();
    evalAndLog("transaction = db.transaction('store', 'readwrite')");
    transaction.onabort = unexpectedAbortCallback;
    evalAndLog("readWriteTransactionStarted = true");
    transaction.oncomplete = function readWriteTransactionComplete() {
        preamble();
        testPassed("Transaction wasn't starved");
        evalAndLog("readWriteTransactionComplete = true");
        finishJSTest();
    };
}