<!DOCTYPE html>
<meta charset=utf-8>
<title>Bubbling and capturing of request events</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("s");
        var rq1 = store.add("", 1);
        var rq2 = store.add("", 1);
        db.onerror = function(){};

        log_request(' db',  db);
        log_request('txn', txn);
        log_request('rq1', rq1);
        log_request('rq2', rq2);

        // 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_request(type, obj) {
        obj.addEventListener('success', log('capture ' + type + '.success'), true);
        obj.addEventListener('success', log('bubble  ' + type + '.success'), false);
        obj.addEventListener('error', log('capture ' + type + '.error'), true);
        obj.addEventListener('error', log('bubble  ' + type + '.error'), 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>
