<!DOCTYPE html>
<title>IDBTransaction</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,
      t = async_test(document.title + " - request gotten by the handler"),
      open_t = async_test(document.title + " - request returned by open()"),

    open_rq = indexedDB.open("idbtransaction-" + new Date().getTime() + Math.random());

    open_t.step(function() {
        assert_equals(open_rq.transaction, null, "IDBOpenDBRequest.transaction");
        assert_equals(open_rq.source, null, "IDBOpenDBRequest.source");
        assert_equals(open_rq.readyState, "pending", "IDBOpenDBRequest.readyState");

        assert_true(open_rq instanceof IDBOpenDBRequest, "open_rq instanceof IDBOpenDBRequest");
        assert_equals(open_rq + "", "[object IDBOpenDBRequest]", "IDBOpenDBRequest (open_rq)");

        open_t.done();
    });

    open_rq.onupgradeneeded = t.step_func(function(e) {
        assert_equals(e.target, open_rq, "e.target is reusing the same IDBOpenDBRequest");
        assert_equals(e.target.transaction, open_rq.transaction, "IDBOpenDBRequest.transaction");

        assert_true(e.target.transaction instanceof IDBTransaction, "transaction instanceof IDBTransaction");
        t.done();
    });


    // Not plausible conditions...
    function fail_helper(name) {
        return function() {
            t.step(function() { assert_unreached(name); });
            open_t.step(function() { assert_unreached(name); });
        };
    }
    open_rq.onblocked = fail_helper('open_rq.onblocked');
    open_rq.onerror = fail_helper('open_rq.onerror');
</script>

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