// META: title=Bubbling and capturing of request events // META: global=window,worker // META: script=resources/support-promises.js // META: script=resources/support.js 'use strict'; async_test(t => { let events = []; let open_rq = createdb(t); open_rq.onupgradeneeded = function(e) { let db = e.target.result; let txn = e.target.transaction; let store = db.createObjectStore('s'); let rq1 = store.add('', 1); let 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'); t.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); }; } }, 'IndexedDB Request Event Propagation: Bubbling and Capturing');