<!DOCTYPE html>
<title>IDBFactory.open() - error in upgradeneeded resets db</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, db2;
    var open_rq = createdb(async_test(), undefined, 9);

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

        var st = db.createObjectStore("store");
        st.createIndex("index", "i");

        assert_equals(db.version, 9, "first db.version");
        assert_true(db.objectStoreNames.contains("store"), "objectStoreNames contains store");
        assert_true(st.indexNames.contains("index"), "indexNames contains index");

        st.add({i: "Joshua"}, 1);
        st.add({i: "Jonas"}, 2);
    };
    open_rq.onsuccess = function(e) {
        db.close();
        var open_rq2 = window.indexedDB.open(db.name, 10);
        open_rq2.onupgradeneeded = this.step_func(function(e) {
            db2 = e.target.result;

            db2.createObjectStore("store2");

            var store = open_rq2.transaction.objectStore("store")
            store.createIndex("index2", "i");

            assert_equals(db2.version, 10, "db2.version");

            assert_true(db2.objectStoreNames.contains("store"), "second objectStoreNames contains store");
            assert_true(db2.objectStoreNames.contains("store2"), "second objectStoreNames contains store2");
            assert_true(store.indexNames.contains("index"), "second indexNames contains index");
            assert_true(store.indexNames.contains("index2"), "second indexNames contains index2");

            store.add({i: "Odin"}, 3);
            store.put({i: "Sicking"}, 2);

            open_rq2.transaction.abort();
        });
        open_rq2.onerror = this.step_func(function(e) {
            assert_equals(db2.version, 9, "db2.version after error");
            assert_true(db2.objectStoreNames.contains("store"), "objectStoreNames contains store after error");
            assert_false(db2.objectStoreNames.contains("store2"), "objectStoreNames not contains store2 after error");

            var open_rq3 = window.indexedDB.open(db.name);
            open_rq3.onsuccess = this.step_func(function(e) {
                var db3 = e.target.result;

                assert_true(db3.objectStoreNames.contains("store"), "third objectStoreNames contains store");
                assert_false(db3.objectStoreNames.contains("store2"), "third objectStoreNames contains store2");

                var st = db3.transaction("store").objectStore("store");

                assert_equals(db3.version, 9, "db3.version");

                assert_true(st.indexNames.contains("index"), "third indexNames contains index");
                assert_false(st.indexNames.contains("index2"), "third indexNames contains index2");

                st.openCursor(null, "prev").onsuccess = this.step_func(function(e) {
                    assert_equals(e.target.result.key, 2, "opencursor(prev) key");
                    assert_equals(e.target.result.value.i, "Jonas", "opencursor(prev) value");
                });
                st.get(3).onsuccess = this.step_func(function(e) {
                    assert_equals(e.target.result, undefined, "get(3)");
                });

                var idx = st.index("index");
                idx.getKey("Jonas").onsuccess = this.step_func(function(e) {
                    assert_equals(e.target.result, 2, "getKey(Jonas)");
                });
                idx.getKey("Odin").onsuccess = this.step_func(function(e) {
                    assert_equals(e.target.result, undefined, "getKey(Odin)");
                });
                idx.getKey("Sicking").onsuccess = this.step_func(function(e) {
                    assert_equals(e.target.result, undefined, "getKey(Sicking)");

                    db3.close();
                    this.done();
                });
            });
        });
    };
</script>

<div id=log></div>
