<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's createObjectStore's various options");
if (window.layoutTestController)
    layoutTestController.waitUntilDone();

function test()
{
    shouldBeTrue("'webkitIndexedDB' in window");
    shouldBeFalse("webkitIndexedDB == null");

    request = evalAndLog("webkitIndexedDB.open('create-object-store-options', 'description')");
    request.onsuccess = openSuccess;
    request.onerror = unexpectedErrorCallback;
}

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

    request = evalAndLog("request = db.setVersion('version 1')");
    request.onsuccess = cleanDatabase;
    request.onerror = unexpectedErrorCallback;
}

function cleanDatabase()
{
    deleteAllObjectStores(db);

    evalAndLog("db.createObjectStore('a', {keyPath: 'a'})");
    evalAndLog("db.createObjectStore('b')");

    debug("db.createObjectStore('c', {autoIncrement: true});");
    db.createObjectStore('c', {autoIncrement: true});

    trans = evalAndLog("trans = db.transaction([], webkitIDBTransaction.READ_WRITE)");
    shouldBe("trans.mode", "webkitIDBTransaction.READ_WRITE");

    req = evalAndLog("trans.objectStore('a').put({'a': 0})");
    req.onsuccess = putB;
    req.onerror = unexpectedErrorCallback;
}

function putB()
{
    req = evalAndLog("trans.objectStore('b').put({'a': 0}, 0)");  // OOPS
    req.onsuccess = getA;
    req.onerror = unexpectedErrorCallback;
}

function getA()
{
    req = evalAndLog("trans.objectStore('a').get(0)");
    req.onsuccess = getB;
    req.onerror = unexpectedErrorCallback;
}

function getB()
{
    shouldBe("event.target.result.a", "{a: 0}");

    req = evalAndLog("trans.objectStore('b').get(0)");
    req.onsuccess = checkB;
    req.onerror = unexpectedErrorCallback;
}

function checkB()
{
    shouldBe("event.target.result.a", "{a: 0}");

    done();
}

var successfullyParsed = true;

test();

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