<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 webkitIDBObjectStore.clear().");
if (window.layoutTestController)
    layoutTestController.waitUntilDone();

function test()
{
    request = evalAndLog("webkitIndexedDB.open('objectstore-clear')");
    request.onsuccess = startSetVersion;
    request.onerror = unexpectedErrorCallback;
}

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

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

function deleteExisting()
{
    window.trans = evalAndLog("trans = event.target.result");
    shouldBeTrue("trans !== null");

    deleteAllObjectStores(db);

    store = evalAndLog("store = db.createObjectStore('storeName', null)");

    window.index = evalAndLog("store.createIndex('indexName', '')");
    shouldBeTrue("store.indexNames.contains('indexName')");

    request = evalAndLog("store.add('value', 'key')");
    request.onsuccess = createSecondObjectStoreAndAddValue;
    request.onerror = unexpectedErrorCallback;
}

function createSecondObjectStoreAndAddValue()
{
    otherStore = evalAndLog("otherStore = db.createObjectStore('otherStoreName', null)");

    request = evalAndLog("otherStore.add('value', 'key')");
    request.onsuccess = clearObjectStore;
    request.onerror = unexpectedErrorCallback;
}

function clearObjectStore()
{
    request = evalAndLog("store.clear()");
    request.onsuccess = clearSuccess;
    request.onerror = unexpectedErrorCallback;
}

function clearSuccess()
{
    shouldBeUndefined("event.target.result");

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

function openCursorSuccess()
{
    shouldBeNull("event.target.result");

    index = evalAndLog("index = store.index('indexName')");
    request = evalAndLog("index.openKeyCursor()");
    request.onsuccess = openKeyCursorSuccess;
    request.onerror = unexpectedErrorCallback;
}

function openKeyCursorSuccess()
{
    debug("openKeyCursorSuccess():");
    shouldBeNull("event.target.result");

    transaction = evalAndLog("db.transaction({mode: webkitIDBTransaction.READ_WRITE})");
    transaction.onabort = unexpectedErrorCallback;
    var otherStore = evalAndLog("otherStore = transaction.objectStore('otherStoreName')");

    request = evalAndLog("otherStore.get('key')");
    request.onsuccess = getSuccess;
    request.onerror = unexpectedErrorCallback;
}

function getSuccess()
{
    shouldBeEqualToString("event.target.result", "value");

    done();
}

test();

var successfullyParsed = true;
</script>
</body>
</html>
