description("This test makes sure that un-handled requests in a transaction receive onerror callbacks when the transaction is aborted.");

if (window.testRunner)
    testRunner.accummulateLogsForChannel("IndexedDB");
    
indexedDBTest(prepareDatabase);

function done()
{
    finishJSTest();
}

function log(message)
{
    debug(message);
}

var database;
var objectStore;

function setupRequest(code)
{
    var request = eval(code);
    request.onsuccess = function()
    {
        log ("Success handling: \"" + code + "\"");
    }
    request.onerror = function(e)
    {
        log ("Error handling: \"" + code + "\" (" + e.type + ")");
        e.stopPropagation();
    }   
}

var dbname;

function prepareDatabase(event) {
    debug("Initial upgrade needed: Old version - " + event.oldVersion + " New version - " + event.newVersion);

    var versionTransaction = event.target.transaction;
    var database = event.target.result;
    event.target.onerror = null;
    dbname = database.name;
    objectStore = database.createObjectStore("TestObjectStore");
    setupRequest("objectStore.put({ bar: 'A' }, 1);");
    setupRequest("objectStore.put({ bar: 'B' }, 2);");
    setupRequest("objectStore.put({ bar: 'C' }, 3);");

    versionTransaction.abort();

    versionTransaction.onabort = function(event) {
        debug("Initial upgrade versionchange transaction aborted");
        database.close();
        continueTest1();
    }

    versionTransaction.oncomplete = function(event) {
        debug("Initial upgrade versionchange transaction unexpected complete");
        done();
    }

    versionTransaction.onerror = function(event) {
        debug("Initial upgrade versionchange transaction error " + event);
    }
}

function continueTest1() {
    var createRequest = window.indexedDB.open(dbname, 1);
    createRequest.onupgradeneeded = function(event) {
        debug("Second upgrade needed: Old version - " + event.oldVersion + " New version - " + event.newVersion);

        var versionTransaction = event.target.transaction;
        database = event.target.result;
        objectStore = database.createObjectStore("TestObjectStore");
    
        setupRequest("objectStore.put({ bar: 'A' }, 1);");
        setupRequest("objectStore.put({ bar: 'B' }, 2);");
        setupRequest("objectStore.put({ bar: 'C' }, 3);");
    
        versionTransaction.onabort = function(event) {
            debug("Second upgrade versionchange transaction unexpected abort");
            done();
        }

        versionTransaction.oncomplete = function(event) {
            debug("Second upgrade versionchange transaction completed");
            continueTest2();
        }

        versionTransaction.onerror = function(event) {
            debug("Second upgrade versionchange transaction unexpected error" + event);
            done();
        }
    }
}

function continueTest2() {
    var transaction = database.transaction("TestObjectStore", "readwrite");
    objectStore = transaction.objectStore("TestObjectStore");

    setupRequest("objectStore.get(1);");
    setupRequest("objectStore.get(2);");
    setupRequest("objectStore.get(3);");
    setupRequest("objectStore.put({ bar: 'D' }, 4);");
    setupRequest("objectStore.put({ bar: 'E' }, 5);");
    setupRequest("objectStore.put({ bar: 'F' }, 6);");

    transaction.abort();

    transaction.onabort = function(event) {
        debug("readwrite transaction aborted");
        continueTest3();
    }

    transaction.oncomplete = function(event) {
        debug("readwrite transaction unexpected complete");
        done();
    }

    transaction.onerror = function(event) {
        debug("readwrite transaction unexpected error" + event);
        done();
    }
}

function continueTest3() {
    var transaction = database.transaction("TestObjectStore", "readonly");
    objectStore = transaction.objectStore("TestObjectStore");

    setupRequest("objectStore.get(1);");
    setupRequest("objectStore.get(2);");
    setupRequest("objectStore.get(3);");

    transaction.abort();

    transaction.onabort = function(event) {
        debug("readonly transaction aborted");
        done();
    }

    transaction.oncomplete = function(event) {
        debug("readwrite transaction unexpected complete");
        done();
    }

    transaction.onerror = function(event) {
        debug("readwrite transaction unexpected error" + event);
        done();
    }
}
