<!DOCTYPE html>
<title>IDBCursor.source</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>
    setup({ explicit_done: true });

    var db;
    var open_rq = indexedDB.open('testdb-' + new Date().getTime());
    open_rq.onupgradeneeded = function(e) {
        db = e.target.result;
        var objStore = db.createObjectStore("my_objectstore");
        objStore.createIndex("my_index", "");

        objStore.add("data",  1);
        objStore.add("data2", 2);
    };

    function cursor_source(name, stringified_object, cursor_rq) {
        var cursor;

        cursor_rq.onsuccess = this.step_func(function(e) {
            if (!e.target.result) {
                return;
            }
            cursor = e.target.result;
            assert_readonly(cursor, 'source');

            // Direct try
            assert_true(cursor.source instanceof Object, "source isobject");
            assert_equals(cursor.source + "", stringified_object, "source");
            assert_equals(cursor.source.name, name, "name");

            cursor.continue();
        });

        cursor_rq.transaction.oncomplete = this.step_func(function(e) {
            this.done();
         });

        cursor_rq.transaction.onerror = this.step_func(function(e) {
            assert_unreached("Transaction got error. " + (e.target.error ? e.target.error.name : "unknown"));
        });
    }

    open_rq.onsuccess = function() {
        async_test(document.title + ' - IDBObjectStore').step(function() {
            cursor_source.call(this, "my_objectstore", "[object IDBObjectStore]", db.transaction("my_objectstore")
                                                       .objectStore("my_objectstore")
                                                       .openCursor());
        });

        async_test(document.title + ' - IDBIndex').step(function() {
            cursor_source.call(this, "my_index", "[object IDBIndex]", db.transaction("my_objectstore")
                                                 .objectStore("my_objectstore")
                                                 .index("my_index")
                                                 .openCursor());
        });

        done();
    };

</script>

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