chromium/third_party/blink/web_tests/storage/indexeddb/mozilla/index-prev-no-duplicate.html

<!DOCTYPE html>
<!--
  original test: http://mxr.mozilla.org/mozilla2.0/source/dom/indexedDB/test/test_indexes.html?force=1
  license of original test:
    " Any copyright is dedicated to the Public Domain.
      http://creativecommons.org/publicdomain/zero/1.0/ "
-->
<html>
<head>
<script src="../../../resources/js-test.js"></script>
<script src="../resources/shared.js"></script>
</head>
<body>
<script>

description("Test IndexedDB: iterating backwards through an index, skipping duplicates");

indexedDBTest(prepareDatabase, testPrev);
function prepareDatabase()
{
    db = event.target.result;
    trans = event.target.transaction;

    objectStoreName = "People";

    objectStoreData = [
        { key: "237-23-7732", value: { name: "Bob", height: 60, weight: 120 } },
        { key: "237-23-7733", value: { name: "Ann", height: 52, weight: 110 } },
        { key: "237-23-7734", value: { name: "Ron", height: 73, weight: 180 } },
        { key: "237-23-7735", value: { name: "Sue", height: 58, weight: 130 } },
        { key: "237-23-7736", value: { name: "Joe", height: 65, weight: 150 } },
        { key: "237-23-7737", value: { name: "Pat", height: 65, weight: 100 } },
        { key: "237-23-7738", value: { name: "Leo", height: 65, weight: 180 } },
        { key: "237-23-7739", value: { name: "Jef", height: 65, weight: 120 } },
        { key: "237-23-7740", value: { name: "Sam", height: 73, weight: 110 } },
    ];

    indexData = [
        { name: "name", keyPath: "name", options: { unique: true } },
        { name: "height", keyPath: "height", options: { } },
        { name: "weight", keyPath: "weight", options: { unique: false } }
    ];

    objectStoreDataHeightSort = [
        { key: "237-23-7733", value: { name: "Ann", height: 52, weight: 110 } },
        { key: "237-23-7735", value: { name: "Sue", height: 58, weight: 130 } },
        { key: "237-23-7732", value: { name: "Bob", height: 60, weight: 120 } },
        { key: "237-23-7736", value: { name: "Joe", height: 65, weight: 150 } },
        { key: "237-23-7737", value: { name: "Pat", height: 65, weight: 100 } },
        { key: "237-23-7738", value: { name: "Leo", height: 65, weight: 180 } },
        { key: "237-23-7739", value: { name: "Jef", height: 65, weight: 120 } },
        { key: "237-23-7734", value: { name: "Ron", height: 73, weight: 180 } },
        { key: "237-23-7740", value: { name: "Sam", height: 73, weight: 110 } },
    ];

    objectStore = evalAndLog("objectStore = db.createObjectStore(objectStoreName);");
    debug("First, add all our data to the object store.");
    addedData = 0;
    for (i in objectStoreData) {
      request = evalAndLog("request = objectStore.add(objectStoreData[i].value, objectStoreData[i].key);");
      request.onerror = unexpectedErrorCallback;
      request.onsuccess = function(event)
      {
        if (++addedData == objectStoreData.length) {
          createIndexes();
        }
      }
    }
    trans.oncomplete = function() {
        evalAndLog("trans = db.transaction(objectStoreName, 'readwrite')");
        evalAndLog("objectStore = trans.objectStore(objectStoreName)");
    };
}

function createIndexes()
{
    debug("Now create the indexes.");
    for (i in indexData) {
      evalAndLog("objectStore.createIndex(indexData[i].name, indexData[i].keyPath, indexData[i].options);");
    }
}

function testPrev()
{
    debug("testPrev()");
    trans = evalAndLog("trans = db.transaction(objectStoreName)");
    objectStore = evalAndLog("objectStore = trans.objectStore(objectStoreName);");
    keyIndex = evalAndLog("keyIndex = 8;");
    // first try with just PREV
    request = evalAndLog("request = objectStore.index('height').openCursor(null, 'prev');");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = function(event)
    {
        cursor = evalAndLog("cursor = event.target.result;");
        if (cursor) {
            shouldBe("cursor.key", "" + objectStoreDataHeightSort[keyIndex].value.height);
            shouldBe("cursor.primaryKey", "'" + objectStoreDataHeightSort[keyIndex].key + "'");
            shouldBe("cursor.value.name", "'" + objectStoreDataHeightSort[keyIndex].value.name + "'");
            shouldBe("cursor.value.height", "" + objectStoreDataHeightSort[keyIndex].value.height);
            if ('weight' in cursor.value) {
                shouldBe("cursor.value.weight", "" + objectStoreDataHeightSort[keyIndex].value.weight);
            }

            evalAndLog("cursor.continue();");
            evalAndLog("keyIndex--;");
            debug("  => " + keyIndex);
        }
        else {
            debug("No cursor: " + cursor);
            shouldBe("keyIndex", "-1");
        }
    };
    trans.oncomplete = testPrevNoDuplicate;
}

function testPrevNoDuplicate()
{
    debug("testPrevNoDuplicate()");
    objectStore = evalAndLog("objectStore = db.transaction(objectStoreName).objectStore(objectStoreName);");
    keyIndex = evalAndLog("keyIndex = 8;");
    request = evalAndLog("request = objectStore.index('height').openCursor(null, 'prevunique');");
    request.onerror = unexpectedErrorCallback;
    request.onsuccess = function (event)
    {
        cursor = evalAndLog("cursor = event.target.result;");
            if (keyIndex == 8) {
                evalAndLog("keyIndex -= 1");
            }
            if (keyIndex == 6) {
                evalAndLog("keyIndex -= 3;");
            }
        debug("  => Entering with keyIndex = " + keyIndex);
        if (cursor) {
            shouldBe("cursor.key", "" + objectStoreDataHeightSort[keyIndex].value.height);
            shouldBe("cursor.primaryKey", "'" + objectStoreDataHeightSort[keyIndex].key + "'");
            shouldBe("cursor.value.name", "'" + objectStoreDataHeightSort[keyIndex].value.name + "'");
            shouldBe("cursor.value.height", "" + objectStoreDataHeightSort[keyIndex].value.height);
            if ('weight' in cursor.value) {
                shouldBe("cursor.value.weight", "" + objectStoreDataHeightSort[keyIndex].value.weight);
            }

            evalAndLog("cursor.continue();");
            evalAndLog("keyIndex--;");
        }
        else {
            debug("No cursor: " + cursor);
            shouldBe("keyIndex", "-1");
            finishJSTest();
        }
    }
}

var successfullyParsed = true;

</script>
</body>
</html>