<!DOCTYPE html>
<meta charset=utf-8>
<title>Attempt to create new transactions inside a versionchange transaction</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, events = [],
        open_rq = createdb(async_test())

    open_rq.onupgradeneeded = function(e) {
        db = e.target.result

        db.createObjectStore("store")
            .add("versionchange1", 1)
            .addEventListener("success", log("versionchange_add.success"))

        assert_throws('InvalidStateError', function() { db.transaction("store") })

        e.target.transaction
            .objectStore("store")
            .count(2)
            .addEventListener("success", log("versionchange_count.success"))

        assert_throws('InvalidStateError', function() { db.transaction("store", "readwrite") })

        open_rq.transaction
            .objectStore("store")
            .add("versionchange2", 2)
            .addEventListener("success", log("versionchange_add2.success"))

        open_rq.transaction.oncomplete = function(e) {
            log("versionchange_txn.complete")(e)

            db.transaction("store")
                .objectStore("store")
                .count()
                .addEventListener("success", log("complete_count.success"))
        }
    }

    open_rq.onsuccess = function(e) {
        log("open_rq.success")(e)

        var txn = db.transaction("store", "readwrite")
        txn.objectStore("store")
            .put("woo", 1)
            .addEventListener("success", log("complete2_get.success"))

        txn.oncomplete = this.step_func(function(e) {
            assert_array_equals(events, [
                                  "versionchange_add.success: 1",
                                  "versionchange_count.success: 0",
                                  "versionchange_add2.success: 2",
                                  "versionchange_txn.complete",

                                  "open_rq.success: [object IDBDatabase]",

                                  "complete_count.success: 2",
                                  "complete2_get.success: 1",
                                ],
                       "events")
            this.done()
        })
    }


    function log(msg) {
        return function(e) {
            if(e && e.target && e.target.error)
                events.push(msg + ": " + e.target.error.name)
            else if(e && e.target && e.target.result !== undefined)
                events.push(msg + ": " + e.target.result)
            else
                events.push(msg)
        };
    }
</script>

<div id=log></div>
