<!DOCTYPE html>
<title>IDBVersionChangeEvent fired in upgradeneeded, versionchange and deleteDatabase</title>
<link rel="author" href="mailto:odinho@opera.com" title="Odin Hørthe Omdal">
<link rel=help href="http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#versionchange--transaction-steps">
<link rel=assert title="Fire a versionchange event at each object in openDatabases that is open. The event must not be fired on objects which has the closePending flag set. The event must use the IDBVersionChangeEvent interface and have the oldVersion property set to db's version and have the newVersion property set to version.">
<link rel=assert title="Fire a upgradeneeded event targeted at request. The event must use the IDBVersionChangeEvent interface and have the oldVersion property set to old version and have the newVersion property set to version.">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="support.js"></script>

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

<script>

    var db,
        t = async_test(document.title, {timeout: 10000});

    t.step(function() {
        var openrq = indexedDB.open('db', 3);

        openrq.onupgradeneeded = t.step_func(function(e) {
            assert_equals(e.oldVersion, 0, "old version (upgradeneeded)");
            assert_equals(e.newVersion, 3, "new version (upgradeneeded)");
            assert_true(e instanceof IDBVersionChangeEvent, "upgradeneeded instanceof IDBVersionChangeEvent");
        });

        openrq.onsuccess = t.step_func(function(e) {
            db = e.target.result;

            db.onversionchange = t.step_func(function(e) {
                assert_equals(e.oldVersion, 3, "old version (versionchange)");
                assert_equals(e.newVersion, null, "new version (versionchange)");
                assert_true(e instanceof IDBVersionChangeEvent, "versionchange instanceof IDBVersionChangeEvent");
                db.close();
            });

            // Errors
            db.onerror = fail(t, "db.error");
            db.onabort = fail(t, "db.abort");

            setTimeout(t.step_func(deleteDB), 10);
        });

        // Errors
        openrq.onerror = fail(t, "open.error");
        openrq.onblocked = fail(t, "open.blocked");

    });

    function deleteDB (e) {
        var deleterq = indexedDB.deleteDatabase('db');

        deleterq.onsuccess = t.step_func(function(e) {
            assert_equals(e.oldVersion, 3, "old version (delete.success)");
            assert_equals(e.newVersion, null, "new version (delete.success)");
            assert_true(e instanceof IDBVersionChangeEvent, "delete.success instanceof IDBVersionChangeEvent");

            setTimeout(function() { t.done(); }, 10);
        });

        // Errors
        deleterq.onerror = fail(t, "delete.error");
        deleterq.onblocked = fail(t, "delete.blocked");
    }

</script>
