<!DOCTYPE html>
<meta charset=utf-8>
<title>Capture and bubble</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 events = [];

    var open_rq = createdb(async_test(document.title, {timeout: 10000}));
    open_rq.onupgradeneeded = function(e) {
        var db = e.target.result;
        var txn = e.target.transaction;
        var store = db.createObjectStore("store");
        var rq1 = store.add("", 1);
        var rq2 = store.add("", 1);

        db.onerror = undefined; // We will run db.error, but don't let that fail the test

        log_events('db', db, 'success');
        log_events('db', db, 'error');

        log_events('txn', txn, 'success');
        log_events('txn', txn, 'error');

        log_events('rq1', rq1, 'success');
        log_events('rq1', rq1, 'error');

        log_events('rq2', rq2, 'success');
        log_events('rq2', rq2, 'error');

        // Don't let it get to abort
        db.addEventListener('error', function(e) { e.preventDefault(); }, false);
    }

    open_rq.onsuccess = function(e) {
        log("open_rq.success")(e);
        assert_array_equals(events, [
                                      "capture db.success",
                                      "capture txn.success",
                                      "capture rq1.success",
                                      "bubble  rq1.success",

                                      "capture db.error: ConstraintError",
                                      "capture txn.error: ConstraintError",
                                      "capture rq2.error: ConstraintError",
                                      "bubble  rq2.error: ConstraintError",
                                      "bubble  txn.error: ConstraintError",
                                      "bubble  db.error: ConstraintError",

                                      "open_rq.success",
                                     ],
                            "events");
        this.done();
    }


    function log_events(type, obj, evt) {
        obj.addEventListener(evt, log('capture ' + type + '.' + evt), true);
        obj.addEventListener(evt, log('bubble  ' + type + '.' + evt), false);
    }

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

<div id=log></div>
