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

description("Test IndexedDB cursor iterates correctly over values added during iteration.");

indexedDBTest(prepareDatabase, openCursor);
function prepareDatabase()
{
    db = event.target.result;
    trans = evalAndLog("trans = event.target.transaction");
    shouldBeNonNull("trans");
    trans.onabort = unexpectedAbortCallback;

    var objectStore = evalAndLog("objectStore = db.createObjectStore('test')");
    evalAndLog("objectStore.add(1, 1)");
    evalAndLog("objectStore.add(2, 2)");
    evalAndLog("objectStore.add(3, 3)");
}

function openCursor()
{
    evalAndLog("trans = db.transaction(['test'], 'readwrite')");
    trans.onabort = finishJSTest;
    trans.oncomplete = finishJSTest;
    request = evalAndLog("trans.objectStore('test').openCursor()");
    request.onsuccess = cursorSuccess;
    request.onerror = unexpectedErrorCallback;
    counter = 0;
}

function cursorSuccess()
{
    if (event.target.result == null) {
      shouldBe("counter", "6");
      return;
    }

    counter = counter + 1;

    shouldBe("event.target.result.key", String(counter));
    if (event.target.result.key == 1) {
      evalAndLog("trans.objectStore('test').add(6, 6)");
    }
    if (event.target.result.key == 2) {
      evalAndLog("trans.objectStore('test').add(5, 5)");
    }
    if (event.target.result.key == 3) {
      evalAndLog("trans.objectStore('test').add(4, 4)");
    }

    evalAndLog("event.target.result.continue()");
}
