if (this.importScripts) {
    importScripts('../../../resources/js-test.js');
    importScripts('shared.js');
}

description("Test IndexedDB index population.");

indexedDBTest(prepareDatabase, doSetVersion2);
function prepareDatabase()
{
    db = event.target.result;
    evalAndLog("transaction = event.target.transaction");
    transaction.onerror = unexpectedErrorCallback;
    transaction.onabort = unexpectedAbortCallback;
    store = evalAndLog("store = db.createObjectStore('store1')");
    evalAndLog("store.put({data: 'a', indexKey: 10}, 1)");
    evalAndLog("store.put({data: 'b', indexKey: 20}, 2)");
    evalAndLog("store.put({data: 'c', indexKey: 10}, 3)");
    evalAndLog("store.put({data: 'd', indexKey: 20}, 4)");
    evalAndLog("index = store.createIndex('index1', 'indexKey')");
    shouldBeTrue("index instanceof IDBIndex");
    shouldBeFalse("index.unique");
    request = evalAndLog("request = index.count(IDBKeyRange.bound(-Infinity, Infinity))");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = function () {
        shouldBe("request.result", "4");
    };
}

function doSetVersion2() {
    debug("");
    debug("doSetVersion2():");
    evalAndLog("db.close()");
    evalAndLog("request = indexedDB.open(dbname, 2)");
    request.onupgradeneeded = setVersion2;
    request.onblocked = unexpectedBlockedCallback;
}

function setVersion2()
{
    debug("");
    debug("setVersion2():");
    db = event.target.result;
    transaction2 = evalAndLog("transaction = request.transaction");
    transaction2.onabort = setVersion2Abort;
    transaction2.oncomplete = unexpectedCompleteCallback;

    var capturePhase = true;
    transaction2.addEventListener("error", unexpectedErrorCallback, !capturePhase);
    transaction2.addEventListener("error", unexpectedErrorCallback, capturePhase);
    db.addEventListener("error", unexpectedErrorCallback, !capturePhase);
    db.addEventListener("error", unexpectedErrorCallback, capturePhase);

    store = evalAndLog("store = db.createObjectStore('store2')");
    evalAndLog("store.put({data: 'a', indexKey: 10}, 1)");
    evalAndLog("store.put({data: 'b', indexKey: 20}, 2)");
    evalAndLog("store.put({data: 'c', indexKey: 10}, 3)");
    evalAndLog("store.put({data: 'd', indexKey: 20}, 4)");
    evalAndLog("index2 = store.createIndex('index2', 'indexKey', { unique: true })");
    shouldBeTrue("index2 instanceof IDBIndex");
    shouldBeTrue("index2.unique");
}

function setVersion2Abort()
{
    debug("");
    debug("setVersion2Abort():");
    shouldBe("db.objectStoreNames.length", "1");
    shouldBeEqualToString("db.objectStoreNames[0]", "store1");
    finishJSTest();
}
