<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 the basics of IndexedDB's IDBDatabase.");
if (window.layoutTestController) 
    layoutTestController.waitUntilDone();

function test()
{
    request = evalAndLog("webkitIndexedDB.open('database-basics')");
    request.onsuccess = openSuccess;
    request.onerror = unexpectedErrorCallback;
}

function openSuccess()
{
    window.db = evalAndLog("db = event.target.result");

    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;

    deleteAllObjectStores(db);

    debug("Testing setVersion.");
    request = evalAndLog('db.setVersion("version a")');
    request.onsuccess = setVersionAgain;
    request.onerror = unexpectedErrorCallback;
}

function setVersionAgain()
{
    request = evalAndLog('db.setVersion("version b")');
    request.onsuccess = createObjectStore;
    request.onerror = unexpectedErrorCallback;
}

function createObjectStore()
{
    shouldBeEqualToString("db.version", "version b");
    shouldBeEqualToString("db.name", "database-basics");
    shouldBe("db.objectStoreNames", "[]");
    shouldBe("db.objectStoreNames.length", "0");
    shouldBe("db.objectStoreNames.contains('')", "false");
    shouldBeNull("db.objectStoreNames[0]");
    shouldBeNull("db.objectStoreNames.item(0)");

    objectStore = evalAndLog('db.createObjectStore("test123")');
    checkObjectStore();
    commitAndContinue();
}

function checkObjectStore()
{
    shouldBe("db.objectStoreNames", "['test123']");
    shouldBe("db.objectStoreNames.length", "1");
    shouldBe("db.objectStoreNames.contains('')", "false");
    shouldBe("db.objectStoreNames.contains('test456')", "false");
    shouldBe("db.objectStoreNames.contains('test123')", "true");
}

function commitAndContinue()
{
    window.setTimeout(testSetVersionAbort, 0);
}

function testSetVersionAbort()
{
    request = evalAndLog('db.setVersion("version c")');
    request.onsuccess = createAnotherObjectStore;
    request.onerror = unexpectedErrorCallback;
}

function createAnotherObjectStore()
{
    shouldBeEqualToString("db.version", "version c");
    shouldBeEqualToString("db.name", "database-basics");
    checkObjectStore();

    objectStore = evalAndLog('db.createObjectStore("test456")');
    var setVersionTrans = evalAndLog("setVersionTrans = event.target.result");
    shouldBeTrue("setVersionTrans !== null");
    setVersionTrans.oncomplete = unexpectedCompleteCallback;
    setVersionTrans.onabort = checkMetadata;
    setVersionTrans.abort();
}

function checkMetadata()
{
    shouldBeEqualToString("db.version", "version b");
    checkObjectStore();
    done();
}

test();

var successfullyParsed = true;

</script>
</body>
</html>
