chromium/third_party/blink/web_tests/storage/indexeddb/resources/cursor-added-bug.js

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()");
}