<!DOCTYPE html>
<title>IDBCursor.primaryKey</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_primarykey(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.createIndex("index", "");

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

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

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

                assert_equals(cursor.value, "data", "prequisite cursor.value");
                assert_equals(cursor.key, "data", "prequisite cursor.key");

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

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

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

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

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

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

</script>

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