fire-upgradeneeded-event-exception.any.js (2462B)
1 // META: global=window,worker 2 // META: title=Fire upgradeneeded event - Exception thrown 3 // META: script=resources/support.js 4 'use strict'; 5 6 // Spec: "https://w3c.github.io/IndexedDB/#fire-a-version-change-event" 7 8 setup({allow_uncaught_exception: true}); 9 10 function fire_upgradeneeded_event_test(func, description) { 11 async_test(t => { 12 const dbname = self.location + '-' + t.name; 13 const del = indexedDB.deleteDatabase(dbname); 14 del.onerror = t.unreached_func('deleteDatabase should succeed'); 15 const open = indexedDB.open(dbname, 1); 16 open.onsuccess = t.unreached_func('open should fail'); 17 let tx; 18 open.addEventListener('upgradeneeded', () => { 19 tx = open.transaction; 20 }); 21 func(t, open); 22 open.addEventListener('error', t.step_func_done(() => { 23 assert_equals(tx.error.name, 'AbortError'); 24 })); 25 }, description); 26 } 27 28 fire_upgradeneeded_event_test((t, open) => { 29 open.onupgradeneeded = () => { 30 throw Error(); 31 }; 32 }, 'Exception in upgradeneeded handler'); 33 34 fire_upgradeneeded_event_test((t, open) => { 35 open.addEventListener('upgradeneeded', () => { 36 throw Error(); 37 }); 38 }, 'Exception in upgradeneeded listener'); 39 40 fire_upgradeneeded_event_test((t, open) => { 41 open.addEventListener('upgradeneeded', { 42 get handleEvent() { 43 throw new Error(); 44 }, 45 }); 46 }, 'Exception in upgradeneeded "handleEvent" lookup'); 47 48 fire_upgradeneeded_event_test((t, open) => { 49 open.addEventListener('upgradeneeded', { 50 get handleEvent() { 51 return 10; 52 }, 53 }); 54 }, 'Exception in upgradeneeded due to non-callable "handleEvent"'); 55 56 fire_upgradeneeded_event_test((t, open) => { 57 open.addEventListener( 58 'upgradeneeded', 59 () => { 60 // No-op. 61 }); 62 open.addEventListener('upgradeneeded', () => { 63 throw Error(); 64 }); 65 }, 'Exception in second upgradeneeded listener'); 66 67 fire_upgradeneeded_event_test((t, open) => { 68 let second_listener_called = false; 69 open.addEventListener('upgradeneeded', () => { 70 open.result.createObjectStore('s'); 71 throw Error(); 72 }); 73 open.addEventListener('upgradeneeded', t.step_func(() => { 74 second_listener_called = true; 75 assert_true( 76 is_transaction_active(open.transaction, 's'), 77 'Transaction should be active until dispatch completes'); 78 })); 79 open.addEventListener('error', t.step_func(() => { 80 assert_true(second_listener_called); 81 })); 82 }, 'Exception in first upgradeneeded listener, tx active in second');