<!DOCTYPE html>
<title>IDBCursor.continue() - objectstore - delete next element, and iterate to it</title>
<link rel="author" href="mailto:odinho@opera.com" title="Odin Hørthe Omdal">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support.js"></script>

<script>
    var db,
      count = 0,
      t = async_test(),
      records = [ { pKey: "primaryKey_0" },
                  { pKey: "primaryKey_1" },
                  { pKey: "primaryKey_2" } ],
      expected_records = [ { pKey: "primaryKey_0" },
                           { pKey: "primaryKey_2" }];

    var open_rq = createdb(t);
    open_rq.onupgradeneeded = function(e) {
        db = e.target.result;
        t.add_cleanup(function() { db.close(); indexedDB.deleteDatabase(db.name); });
        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 cursor_rq = db.transaction("test", "readwrite")
                          .objectStore("test")
                          .openCursor();

        cursor_rq.onsuccess = t.step_func(function(e) {
            var cursor = e.target.result;
            if (!cursor) {
                assert_equals(count, 2, "cursor run count");
                t.done();
            }

            var record = cursor.value;
            if (record.pKey == "primaryKey_0") {
               e.target.source.delete("primaryKey_1");
            }
            assert_equals(record.pKey, expected_records[count].pKey, "primary key");

            cursor.continue();
            count++;
        });
    };
</script>
