<!DOCTYPE html>
<title>IDBCursor.key</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>

    function cursor_key(key)
    {
        var db,
          t = async_test(document.title + " - " + key);

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

            objStore.add("data", key);
        };

        open_rq.onsuccess = t.step_func(function(e) {
            var cursor_rq = db.transaction("test")
                              .objectStore("test")
                              .openCursor();

            cursor_rq.onsuccess = t.step_func(function(e) {
                var cursor = e.target.result;
                assert_equals(cursor.value, "data", "prequisite cursor.value");

                assert_key_equals(cursor.key, key, 'key');
                assert_readonly(cursor, 'key');

                if (key instanceof Array) {
                    cursor.key.push("new");
                    key.push("new");

                    assert_key_equals(cursor.key, key, 'key after array push');

                    // But we can not change key (like readonly, just a bit different)
                    cursor.key = 10;
                    assert_key_equals(cursor.key, key, 'key after assignment');
                }

                t.done();
            });
        });
    }

    cursor_key(1);
    cursor_key("key");
    cursor_key(["my", "key"]);

</script>

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