<!DOCTYPE html>
<title>IDBFactory.open() - second open's transaction is available to get objectStores</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;
    var count_done = 0;
    var open_rq = createdb(async_test(document.title, {timeout: 10000}));

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

        db.createObjectStore("store");
        assert_true(db.objectStoreNames.contains("store"), "objectStoreNames contains store");

        var store = e.target.transaction.objectStore("store");
        assert_equals(store.name, "store", "store.name");

        store.add("data", 1);

        store.count().onsuccess = this.step_func(function(e) {
            assert_equals(e.target.result, 1, "count()");
            count_done++;
        });

        store.add("data2", 2);
    };
    open_rq.onsuccess = function(e) {
        var store = db.transaction("store").objectStore("store");
        assert_equals(store.name, "store", "store.name");
        store.count().onsuccess = this.step_func(function(e) {
            assert_equals(e.target.result, 2, "count()");
            count_done++;
        });
        db.close();

        var open_rq2 = window.indexedDB.open(db.name, 10);
        open_rq2.onupgradeneeded = this.step_func(function(e) {
            var db2 = e.target.result;
            assert_true(db2.objectStoreNames.contains("store"), "objectStoreNames contains store");
            var store = open_rq2.transaction.objectStore("store");
            assert_equals(store.name, "store", "store.name");

            store.add("data3", 3);

            store.count().onsuccess = this.step_func(function(e) {
                assert_equals(e.target.result, 3, "count()");
                count_done++;

                assert_equals(count_done, 3, "count_done");
                this.done();
            });
        });
    };
</script>

<div id=log></div>
