<html>
<head>
<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
<script src="../../fast/js/resources/js-test-pre.js"></script>
<script src="../../fast/js/resources/js-test-post-function.js"></script>
<script src="resources/shared.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<script>

description("Test IndexedDB transaction basics.");
if (window.layoutTestController)
    layoutTestController.waitUntilDone();

function test()
{
    shouldBeTrue("'webkitIndexedDB' in window");
    shouldBeFalse("webkitIndexedDB == null");

    request = evalAndLog("webkitIndexedDB.open('transaction-basics')");
    request.onsuccess = openSuccess;
    request.onerror = unexpectedErrorCallback;
}

function openSuccess()
{
    debug("openSuccess():");
    window.db = evalAndLog("db = event.target.result");
    request = evalAndLog("request = db.setVersion('version 1')");
    request.onsuccess = cleanDatabase;
    request.onerror = unexpectedErrorCallback;
}

function cleanDatabase()
{
    deleteAllObjectStores(db, checkMetadataEmpty);
    commitAndContinue(testSetVersionAbort1);
}

function testSetVersionAbort1()
{
    checkMetadataEmpty();
    request = evalAndLog("request = startSetVersion('version fail')");
    request.onsuccess = addRemoveIDBObjects;
}

function addRemoveIDBObjects()
{
    debug("addRemoveIDBObjects():");
    var trans = evalAndLog("trans = event.target.result");
    shouldBeTrue("trans !== null");
    trans.addEventListener('abort', testSetVersionAbort2, true);
    trans.oncomplete = unexpectedCompleteCallback;

    var store = evalAndLog("store = db.createObjectStore('storeFail', null)");
    var index = evalAndLog("index = store.createIndex('indexFail', 'x', false)");

    evalAndLog("db.deleteObjectStore('storeFail')");
    evalAndLog("store.deleteIndex('indexFail')");

    trans.abort();
}

function testSetVersionAbort2()
{
    checkMetadataEmpty();
    request = evalAndLog("request = startSetVersion('version fail')");
    request.onsuccess = addRemoveAddIDBObjects;
}

function addRemoveAddIDBObjects()
{
    debug("addRemoveAddIDBObjects():");
    var trans = evalAndLog("trans = event.target.result");
    shouldBeTrue("trans !== null");
    trans.addEventListener('abort', testSetVersionAbort3, false);
    trans.oncomplete = unexpectedCompleteCallback;

    var store = evalAndLog("store = db.createObjectStore('storeFail', null)");
    var index = evalAndLog("index = store.createIndex('indexFail', 'x', false)");

    evalAndLog("db.deleteObjectStore('storeFail')");
    evalAndLog("store.deleteIndex('indexFail')");

    var store = evalAndLog("store = db.createObjectStore('storeFail', null)");
    var index = evalAndLog("index = store.createIndex('indexFail', 'x', false)");

    trans.abort();
}

function testSetVersionAbort3()
{
    shouldBeFalse("event.cancelable");
    checkMetadataEmpty();
    request = evalAndLog("request = startSetVersion('version fail')");
    request.onsuccess = addIDBObjects;
}

function addIDBObjects()
{
    shouldBeFalse("event.cancelable");
    debug("addIDBObjects():");
    var trans = evalAndLog("trans = event.target.result");
    shouldBeTrue("trans !== null");
    trans.onabort = testSetVersionAbort4;
    trans.oncomplete = unexpectedCompleteCallback;

    var store = evalAndLog("store = db.createObjectStore('storeFail', null)");
    var index = evalAndLog("index = store.createIndex('indexFail', 'x', false)");

    trans.abort();
}

function testSetVersionAbort4()
{
    checkMetadataEmpty();
    request = evalAndLog("request = startSetVersion('version fail')");
    request.onsuccess = addIDBObjectsAndCommit;
}

function addIDBObjects()
{
    debug("addIDBObjects():");
    var trans = evalAndLog("trans = event.target.result");
    shouldBeTrue("trans !== null");
    trans.onabort = unexpectedAbortCallback;

    var store = evalAndLog("store = db.createObjectStore('storeFail', null)");
    var index = evalAndLog("index = store.createIndex('indexFail', 'x', false)");

    commitAndContinue(testSetVersionAbort5);
}

function commitAndContinue(continueFunction)
{
    window.setTimeout(continueFunction, 0);
}

function testSetVersionAbort5()
{
    checkMetadataExistingObjectStore();
    request = evalAndLog("request = startSetVersion('version fail')");
    request.onsuccess = removeIDBObjects;
}

function removeIDBObjects()
{
    debug("removeIDBObjects():");
    var trans = evalAndLog("trans = event.target.result");
    shouldBeTrue("trans !== null");
    trans.onabort = testSetVersionAbort6;
    trans.oncomplete = unexpectedCompleteCallback;

    var store = evalAndLog("store = trans.objectStore('storeFail')");
    evalAndLog("store.deleteIndex('indexFail')");
    evalAndLog("db.deleteObjectStore('storeFail')");

    trans.abort();
}

function testSetVersionAbort6()
{
    checkMetadataExistingObjectStore();
    setNewVersion();
}

function startSetVersion(versionName)
{
    request = db.setVersion(versionName);
    request.onerror = unexpectedErrorCallback;
    return request;
}

function checkMetadataEmpty()
{
    shouldBe("window.db.objectStoreNames", "[]");
    shouldBe("window.db.objectStoreNames.length", "0");
    shouldBe("window.db.objectStoreNames.contains('storeFail')", "false");
}

function checkMetadataExistingObjectStore()
{
    shouldBe("db.objectStoreNames", "['storeFail']");
    shouldBe("db.objectStoreNames.length", "1");
    shouldBe("db.objectStoreNames.contains('storeFail')", "true");
}

function setNewVersion()
{
    request = evalAndLog("db.setVersion('new version')");
    request.onsuccess = setVersionSuccess;
    request.onerror = unexpectedErrorCallback;
}

function setVersionSuccess()
{
    debug("setVersionSuccess():");
    window.trans = evalAndLog("trans = event.target.result");
    shouldBeTrue("trans !== null");
    trans.onabort = unexpectedAbortCallback;
    trans.addEventListener('complete', completeCallback, false);
    window.completeEventFired = false;

    deleteAllObjectStores(db);

    evalAndLog("db.createObjectStore('storeName', null)");
    transaction = evalAndLog("db.transaction({mode: webkitIDBTransaction.READ_WRITE})");
    transaction.onabort = abortCallback;
    var store = evalAndLog("store = transaction.objectStore('storeName')");
    shouldBeEqualToString("store.name", "storeName");
}

function completeCallback()
{
    shouldBeFalse("event.cancelable");
    testPassed("complete event fired");
    window.completeEventFired = true;
}

function abortCallback()
{
    testPassed("complete event fired");
    checkForCompleteEvent();
}

function checkForCompleteEvent()
{
    if (completeEventFired) {
        testPassed("oncomplete event had fired");
        done();
    } else
        setTimeout(checkForCompleteEvent, 1);
}

var successfullyParsed = true;

test();

</script>
</body>
</html>
