abortsignal.html (4199B)
1 <!doctype html> 2 <script src="/resources/testharness.js"></script> 3 <script src="/resources/testharnessreport.js"></script> 4 <script src="/resources/testdriver.js"></script> 5 <script src="/resources/testdriver-vendor.js"></script> 6 <script src="/resources/testdriver-actions.js"></script> 7 <script src="resources/helpers.js"></script> 8 9 <body> 10 <script> 11 // TODO(domenic): maybe update createRecordingCloseWatcher() to allow passing args and use it? 12 13 test(() => { 14 let watcher = new CloseWatcher({ signal: AbortSignal.abort() }); 15 let oncancel_called = false; 16 let onclose_called = false; 17 watcher.oncancel = () => oncancel_called = true; 18 watcher.onclose = () => onclose_called = true; 19 20 watcher.requestClose(); 21 22 assert_false(oncancel_called); 23 assert_false(onclose_called); 24 }, "already-aborted AbortSignal then requestClose() fires no events"); 25 26 test(() => { 27 let controller = new AbortController(); 28 let watcher = new CloseWatcher({ signal: controller.signal }); 29 let oncancel_called = false; 30 let onclose_called = false; 31 watcher.oncancel = () => oncancel_called = true; 32 watcher.onclose = () => onclose_called = true; 33 34 controller.abort(); 35 watcher.requestClose(); 36 37 assert_false(oncancel_called); 38 assert_false(onclose_called); 39 }, "abortController.abort() then requestClose() fires no events"); 40 41 test(() => { 42 let controller = new AbortController(); 43 let watcher = new CloseWatcher({ signal: controller.signal }); 44 let oncancel_call_count_ = 0; 45 let onclose_call_count_ = 0; 46 watcher.oncancel = () => oncancel_call_count_++; 47 watcher.onclose = () => onclose_call_count_++; 48 49 watcher.requestClose(); 50 controller.abort(); 51 52 assert_equals(oncancel_call_count_, 1); 53 assert_equals(onclose_call_count_, 1); 54 }, "requestClose() then abortController.abort() fires only one close event"); 55 56 promise_test(async () => { 57 let watcher = new CloseWatcher({ signal: AbortSignal.abort() }); 58 let oncancel_called = false; 59 let onclose_called = false; 60 watcher.oncancel = () => oncancel_called = true; 61 watcher.onclose = () => onclose_called = true; 62 63 await sendCloseRequest(); 64 65 assert_false(oncancel_called); 66 assert_false(onclose_called); 67 }, "already-aborted AbortSignal then Esc key fires no events"); 68 69 promise_test(async t => { 70 let controller = new AbortController(); 71 let watcher = new CloseWatcher({ signal: controller.signal }); 72 let oncancel_called = false; 73 let onclose_called = false; 74 watcher.oncancel = () => oncancel_called = true; 75 watcher.onclose = () => onclose_called = true; 76 77 controller.abort(); 78 await sendCloseRequest(); 79 80 assert_false(oncancel_called); 81 assert_false(onclose_called); 82 }, "abortController.abort() then close via Esc key fires no events"); 83 84 promise_test(async t => { 85 let controller = new AbortController(); 86 let watcher = new CloseWatcher({ signal: controller.signal }); 87 let oncancel_call_count_ = 0; 88 let onclose_call_count_ = 0; 89 watcher.oncancel = () => oncancel_call_count_++; 90 watcher.onclose = () => onclose_call_count_++; 91 92 await sendCloseRequest(); 93 controller.abort(); 94 95 assert_equals(oncancel_call_count_, 1); 96 assert_equals(onclose_call_count_, 1); 97 }, "Esc key then abortController.abort() fires only one close event"); 98 99 test(t => { 100 let controller = new AbortController(); 101 let watcher = new CloseWatcher({ signal: controller.signal }); 102 controller.abort(); 103 let watcher2 = new CloseWatcher(); 104 t.add_cleanup(() => watcher2.destroy()); 105 }, "abortController.abort()ing a free CloseWatcher allows a new one to be created without a user activation"); 106 107 promise_test(async t => { 108 let controller = new AbortController(); 109 let watcher = new CloseWatcher({ signal: controller.signal }); 110 watcher.oncancel = () => { controller.abort(); } 111 watcher.onclose = t.unreached_func("onclose"); 112 await test_driver.bless("give user activation so that cancel will fire", () => { 113 watcher.requestClose(); 114 }); 115 }, "abortController.abort() inside oncancel"); 116 117 test(t => { 118 let controller = new AbortController(); 119 let watcher = new CloseWatcher({ signal: controller.signal }); 120 watcher.onclose = () => { controller.abort(); } 121 watcher.requestClose(); 122 }, "abortController.abort() inside onclose is benign"); 123 </script>