<!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(document.title, {timeout: 10000}), 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)");
                    this.done();
                });
            });
        });
    };
</script>

<div id=log></div>
