<!DOCTYPE html>
<title>IDBCursor.continue() - index - attempt to iterate to the next record when the direction is set for the previous record</title>
<link rel="author" title="Microsoft" href="http://www.microsoft.com">
<link rel=help href="http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#widl-IDBCursor-continue-void-any-key">
<link rel=assert title="The parameter is greater than or equal to this cursor's position and this cursor's direction is 'prev' or 'prevunique'.">
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="support.js"></script>

<script>

    var db,
      t = async_test(),
      records = [ { pKey: "primaryKey_0", iKey: "indexKey_0" },
                  { pKey: "primaryKey_1", iKey: "indexKey_1" },
                  { pKey: "primaryKey_2", iKey: "indexKey_2" } ];

    var open_rq = createdb(t);
    open_rq.onupgradeneeded = function(e) {
        db = e.target.result;
        var objStore = db.createObjectStore("test", { keyPath: "pKey" });

        objStore.createIndex("index", "iKey");

        for (var i = 0; i < records.length; i++)
            objStore.add(records[i]);
    };

    open_rq.onsuccess = function(e) {
        var count = 0,
          cursor_rq = db.transaction("test")
                        .objectStore("test")
                        .index("index")
                        .openCursor(undefined, "prev"); // XXX Fx issues w undefined

        cursor_rq.onsuccess = t.step_func(function(e) {
            var cursor = e.target.result,
              record = cursor.value;

            switch(count) {
            case 0:
                assert_equals(record.pKey, records[2].pKey, "first pKey");
                assert_equals(record.iKey, records[2].iKey, "first iKey");
                cursor.continue();
                break;

            case 1:
                assert_equals(record.pKey, records[1].pKey, "second pKey");
                assert_equals(record.iKey, records[1].iKey, "second iKey");
                assert_throws("DataError",
                    function() { cursor.continue("indexKey_2"); });
                t.done();
                break;

            default:
                assert_unreached("Unexpected count value: " + count);
            }

            count++;
        });
    };

</script>

<div id="log"></div>
