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

description("Test IndexedDB transaction internal active flag.");

indexedDBTest(prepareDatabase, runTransaction);
function prepareDatabase()
{
    db = event.target.result;
    event.target.transaction.onabort = unexpectedAbortCallback;
    evalAndLog("store = db.createObjectStore('store')");
    evalAndLog("store.createIndex('index', 'keypath')");
}

function runTransaction()
{
    debug("");
    debug("runTransaction():");
    evalAndLog("transaction = db.transaction('store', 'readwrite')");

    debug("");
    debug("Verify that transactions are created with |active| flag set:");
    evalAndLog("store = transaction.objectStore('store')");
    evalAndLog("index = store.index('index')");
    for (i = 0; i < statements.length; ++i) {
        shouldNotThrow(statements[i]);
    }

    debug("");
    debug("Transaction shouldn't be active inside a non-IDB-event callback");
    evalAndLog("setTimeout(testTimeout, 0)");

    timeoutComplete = false;

    // Keep transaction alive until timeout callback completes - don't log
    // anything here as this could run a variable number of times depending
    // on the port.
    function busy() {
        if (timeoutComplete) {
            testEventCallback();
            return;
        }
        busyRequest = transaction.objectStore('store').get(0);
        busyRequest.onerror = unexpectedErrorCallback;
        busyRequest.onsuccess = function () {
            busy();
        };
    }
    busy();

    transaction.oncomplete = transactionComplete;
}

var statements = [
    "store.add(0, 0)",
    "store.put(0, 0)",
    "store.get(0)",
    "store.get(IDBKeyRange.only(0))",
    "store.delete(0)",
    "store.delete(IDBKeyRange.only(0))",
    "store.count()",
    "store.count(0)",
    "store.count(IDBKeyRange.only(0))",
    "store.clear()",
    "store.openCursor()",
    "store.openCursor(0)",
    "store.openCursor(0, 'next')",
    "store.openCursor(IDBKeyRange.only(0))",
    "store.openCursor(IDBKeyRange.only(0), 'next')",
    "index.get(0)",
    "index.get(IDBKeyRange.only(0))",
    "index.getKey(0)",
    "index.getKey(IDBKeyRange.only(0))",
    "index.count()",
    "index.count(0)",
    "index.count(IDBKeyRange.only(0))",
    "index.openCursor()",
    "index.openCursor(0)",
    "index.openCursor(0, 'next')",
    "index.openCursor(IDBKeyRange.only(0))",
    "index.openCursor(IDBKeyRange.only(0), 'next')",
    "index.openKeyCursor()",
    "index.openKeyCursor(0)",
    "index.openKeyCursor(0, 'next')",
    "index.openKeyCursor(IDBKeyRange.only(0))",
    "index.openKeyCursor(IDBKeyRange.only(0), 'next')"
];

function testTimeout()
{
    debug("");
    debug("testTimeout():");
    evalAndLog("store = transaction.objectStore('store')");
    evalAndLog("index = store.index('index')");
    for (i = 0; i < statements.length; ++i) {
        evalAndExpectException(statements[i], "0", "'TransactionInactiveError'");
    }
    timeoutComplete = true;
}

function testEventCallback()
{
    debug("");
    debug("testEventCallback():");

    debug("Transaction should be active inside a non-IDB-event callback");
    evalAndLog("store = transaction.objectStore('store')");
    evalAndLog("index = store.index('index')");
    for (i = 0; i < statements.length; ++i) {
        shouldNotThrow(statements[i]);
    }
}

function transactionComplete()
{
    debug("");
    debug("transactionComplete():");
    evalAndExpectException("store = transaction.objectStore('store')", "DOMException.INVALID_STATE_ERR", "'InvalidStateError'");
    finishJSTest();
}
