<!DOCTYPE html>
<title>IDBCursor.continue() - object store - 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">
<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" },
                  { pKey: "primaryKey_1" },
                  { pKey: "primaryKey_2" } ];

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

        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")
                        .openCursor(null, "prev");

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

            assert_true(cursor != null, "cursor exist");

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

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

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

            count++;
        });
    };
</script>

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