<!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());
    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>
