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

description("Test IndexedDB transaction rollback.");

indexedDBTest(prepareDatabase, setVersionComplete);
function prepareDatabase()
{
    db = event.target.result;
    event.target.transaction.onabort = unexpectedAbortCallback;
    evalAndLog("db.createObjectStore('myObjectStore')");
    shouldBe("db.objectStoreNames.length", "1");
}

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

    self.transaction = evalAndLog("transaction = db.transaction(['myObjectStore'], 'readwrite')");
    transaction.onabort = abortCallback;
    transaction.oncomplete = unexpectedCompleteCallback;

    self.store = evalAndLog("store = transaction.objectStore('myObjectStore')");
    request = evalAndLog("store.add('rollbackValue', 'rollbackKey123')");
    request.onsuccess = addSuccess;
    request.onerror = unexpectedErrorCallback;
}

function addSuccess()
{
    debug("addSuccess():");
    shouldBeEqualToString("event.target.result", "rollbackKey123");

    request = evalAndLog("store.openCursor()");
    request.onsuccess = openCursorSuccess;
    request.onerror = unexpectedErrorCallback;
}

function openCursorSuccess()
{
    debug("openCursorSuccess():");
    self.cursor = evalAndLog("cursor = event.target.result");

    transaction.abort();
}

function abortCallback()
{
    debug("abortCallback():");
    debug('Transaction was aborted.');

    self.transaction = evalAndLog("transaction = db.transaction(['myObjectStore'], 'readonly')");
    self.store = evalAndLog("store = transaction.objectStore('myObjectStore')");
    request = evalAndLog("store.get('rollbackKey123')");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = getSuccess;
}

function getSuccess()
{
    debug("getSuccess():");
    shouldBe("event.target.result", "undefined");

    shouldBeEqualToString("cursor.value", "rollbackValue");
    finishJSTest();
}
