chromium/third_party/blink/web_tests/storage/indexeddb/mozilla/resources/cursors.js

// original test:
// http://mxr.mozilla.org/mozilla2.0/source/dom/indexedDB/test/test_cursors.html?force=1
// license of original test:
// " Any copyright is dedicated to the Public Domain.
//   http://creativecommons.org/publicdomain/zero/1.0/ "

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

description("Test IndexedDB cursor behavior");

indexedDBTest(prepareDatabase);
function prepareDatabase()
{
    db = event.target.result;
    event.target.transaction.onabort = unexpectedAbortCallback;
    objectStore = evalAndLog("db.createObjectStore('autoIncrement', { autoIncrement: true });");

    request = evalAndLog("request = objectStore.openCursor();");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = function (event) {
      shouldBe("event.target.result", "null");
      testGroup2();
    }
}

function testGroup2()
{
    objectStore = evalAndLog("db.createObjectStore('autoIncrementKeyPath', { keyPath: 'foo', autoIncrement: true });");

    request = evalAndLog("request = objectStore.openCursor();");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = function (event) {
      shouldBe("event.target.result", "null");
      testGroup3();
    }
}

function testGroup3()
{
    objectStore = evalAndLog("db.createObjectStore('keyPath', { keyPath: 'foo' });");

    request = evalAndLog("request = objectStore.openCursor();");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = function (event) {
      shouldBe("event.target.result", "null");
      testGroup4();
    }
}

function testGroup4()
{
    objectStore = evalAndLog("db.createObjectStore('foo');");

    request = evalAndLog("request = objectStore.openCursor();");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = function (event) {
      shouldBe("event.target.result", "null");
      testGroup5();
    }
}

function testGroup5()
{
    keys = evalAndLog("keys = [1, -1, 0, 10, 2000, 'q', 'z', 'two', 'b', 'a'];");
    sortedKeys = evalAndLog("sortedKeys = [-1, 0, 1, 10, 2000, 'a', 'b', 'q', 'two', 'z'];");

    keyIndex = evalAndLog("keyIndex = 0;");

    for (i in keys) {
      request = evalAndLog("request = objectStore.add('foo', keys[i]);");
      request.onerror = unexpectedErrorCallback;
      request.onsuccess = function(event) {
        if (++keyIndex == keys.length) {
          testGroup6();
        }
      };
    }
}

function testGroup6()
{
    keyIndex = 0;

    request = evalAndLog("request = objectStore.openCursor();");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = function (event) {
      cursor = evalAndLog("cursor = event.target.result;");
      if (cursor) {
        shouldBe("cursor.key", "sortedKeys[keyIndex]");
        shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
        shouldBe("cursor.value", "'foo'");

        evalAndLog("cursor.continue();");
        evalAndExpectException("cursor.continue();", "DOMException.INVALID_STATE_ERR");

        shouldBe("cursor.key", "sortedKeys[keyIndex]");
        shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
        shouldBe("cursor.value", "'foo'");

        evalAndLog("keyIndex++;");
      }
      else {
        shouldBe("keyIndex", "keys.length");
        testGroup7();
      }
    }
}

function testGroup7()
{
    keyIndex = evalAndLog("keyIndex = 4;");

    range = evalAndLog("range = IDBKeyRange.bound(2000, 'q');");
    request = evalAndLog("request = objectStore.openCursor(range);");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = function (event) {
      cursor = evalAndLog("cursor = event.target.result;");
      if (cursor) {
        shouldBe("cursor.key", "sortedKeys[keyIndex]");
        shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
        shouldBe("cursor.value", "'foo'");

        evalAndLog("cursor.continue();");

        shouldBe("cursor.key", "sortedKeys[keyIndex]");
        shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
        shouldBe("cursor.value", "'foo'");

        evalAndLog("keyIndex++;");
      }
      else {
        shouldBe("keyIndex", "8");
        testGroup8();
      }
    }
}

function testGroup8()
{
    keyIndex = 0;

    request = evalAndLog("request = objectStore.openCursor();");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = function (event) {
      cursor = evalAndLog("cursor = event.target.result;");
      if (cursor) {
        shouldBe("cursor.key", "sortedKeys[keyIndex]");
        shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
        shouldBe("cursor.value", "'foo'");

        if (keyIndex) {
          evalAndLog("cursor.continue();");
        }
        else {
          evalAndLog("cursor.continue('b');");
        }

        shouldBe("cursor.key", "sortedKeys[keyIndex]");
        shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
        shouldBe("cursor.value", "'foo'");

        evalAndLog("keyIndex += keyIndex ? 1: 6;");
      }
      else {
        shouldBe("keyIndex", "keys.length");
        testGroup9();
      }
    }
}

function testGroup9()
{
    keyIndex = evalAndLog("keyIndex = 0;");

    request = evalAndLog("request = objectStore.openCursor();");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = function (event) {
      cursor = evalAndLog("cursor = event.target.result;");
      if (cursor) {
        shouldBe("cursor.key", "sortedKeys[keyIndex]");
        shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
        shouldBe("cursor.value", "'foo'");

        if (keyIndex) {
          evalAndLog("cursor.continue();");
        }
        else {
          evalAndLog("cursor.continue(10);");
        }

        shouldBe("cursor.key", "sortedKeys[keyIndex]");
        shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
        shouldBe("cursor.value", "'foo'");

        evalAndLog("keyIndex += keyIndex ? 1: 3;");
      }
      else {
        shouldBe("keyIndex", "keys.length");
        testGroup10();
      }
    }
}

function testGroup10()
{
    keyIndex = evalAndLog("keyIndex = 0;");

    request = evalAndLog("request = objectStore.openCursor();");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = function (event) {
      cursor = evalAndLog("cursor = event.target.result;");
      if (cursor) {
        shouldBe("cursor.key", "sortedKeys[keyIndex]");
        shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
        shouldBe("cursor.value", "'foo'");

        if (keyIndex) {
          evalAndLog("cursor.continue();");
        }
        else {
          evalAndLog("cursor.continue('c');");
        }

        shouldBe("cursor.key", "sortedKeys[keyIndex]");
        shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
        shouldBe("cursor.value", "'foo'");

        evalAndLog("keyIndex += keyIndex ? 1 : 7;");
      }
      else {
        shouldBe("keyIndex", "keys.length");
        testGroup11();
      }
    }
}

function testGroup11()
{
    keyIndex = evalAndLog("keyIndex = 0;");

    request = evalAndLog("request = objectStore.openCursor();");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = function (event) {
      cursor = evalAndLog("cursor = event.target.result;");
      if (cursor) {
        shouldBe("cursor.key", "sortedKeys[keyIndex]");
        shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
        shouldBe("cursor.value", "'foo'");

        if (keyIndex == 4) {
          request = evalAndLog("request = cursor.update('bar');");
          request.onerror = unexpectedErrorCallback;
          request.onsuccess = function(event) {
            evalAndLog("keyIndex++;");
            evalAndLog("cursor.continue();");
          };
        }
        else {
          evalAndLog("keyIndex++;");
          evalAndLog("cursor.continue();");
        }
      }
      else {
        shouldBe("keyIndex", "keys.length");
        testGroup12();
      }
    }
}

function testGroup12()
{
    request = evalAndLog("request = objectStore.get(sortedKeys[4]);");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = testGroup12b;
}

function testGroup12b()
{
    shouldBe("event.target.result", "'bar'");

    request = evalAndLog("request = objectStore.put('foo', sortedKeys[4]);");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = testGroup13;
}

function testGroup13()
{
    keyIndex = evalAndLog("keyIndex = 0;");

    gotRemoveEvent = false;
    retval = false;

    request = evalAndLog("request = objectStore.openCursor(null, 'next');");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = function (event) {
      cursor = evalAndLog("cursor = event.target.result;");
      if (cursor) {
        shouldBe("cursor.key", "sortedKeys[keyIndex]");
        shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
        shouldBe("cursor.value", "'foo'");

        if (keyIndex == 4) {
          request = evalAndLog("request = cursor.delete();");
          request.onerror = unexpectedErrorCallback;
          request.onsuccess = function(event) {
            shouldBe("keyIndex", "5");
            gotRemoveEvent = evalAndLog("gotRemoveEvent = true;");
          };
        }

        evalAndLog("keyIndex++;");
        evalAndLog("cursor.continue();");
      }
      else {
        shouldBe("keyIndex", "keys.length");
        shouldBe("gotRemoveEvent", "true");
        testGroup14();
      }
    }
}

function testGroup14()
{
    request = evalAndLog("request = objectStore.get(sortedKeys[4]);");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = testGroup14b;
}

function testGroup14b()
{
    shouldBe("event.target.result", "undefined");

    request = evalAndLog("request = objectStore.add('foo', sortedKeys[4]);");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = testGroup15;
}

function testGroup15()
{
    keyIndex = sortedKeys.length - 1;

    request = evalAndLog("request = objectStore.openCursor(null, 'prev');");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = function (event) {
      cursor = evalAndLog("cursor = event.target.result;");
      if (cursor) {
        shouldBe("cursor.key", "sortedKeys[keyIndex]");
        shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
        shouldBe("cursor.value", "'foo'");

        evalAndLog("cursor.continue();");

        shouldBe("cursor.key", "sortedKeys[keyIndex]");
        shouldBe("cursor.primaryKey", "sortedKeys[keyIndex]");
        shouldBe("cursor.value", "'foo'");

        evalAndLog("keyIndex--;");
      }
      else {
        shouldBe("keyIndex", "-1");
        finishJSTest();
      }
    }
}