MediaQueryList-extends-EventTarget-interop.html (4739B)
1 <!DOCTYPE html> 2 <meta charset="utf-8"> 3 <meta name="flags" content="dom"> 4 <title>CSS Test: CSSOM View MediaQueryList extends EventTarget (interop)</title> 5 <link rel="help" href="https://www.w3.org/TR/cssom-view-1/#the-mediaquerylist-interface"> 6 <script src="/resources/testharness.js"></script> 7 <script src="/resources/testharnessreport.js"></script> 8 <script src="resources/matchMedia.js"></script> 9 <div id="log"></div> 10 <script> 11 "use strict"; 12 13 test(() => { 14 const mql = window.matchMedia("all"); 15 16 let receivedEvent; 17 mql.addListener(event => { 18 receivedEvent = event; 19 }); 20 21 const dispatchedEvent = new Event("change"); 22 mql.dispatchEvent(dispatchedEvent); 23 24 assert_equals(receivedEvent, dispatchedEvent); 25 }, "dispatchEvent triggers listener added with addListener"); 26 27 promise_test(async t => { 28 const mql = await createMQL(t); 29 30 let calls = 0; 31 const listener = { 32 handleEvent() { 33 calls++; 34 }, 35 }; 36 37 mql.addListener(listener); 38 mql.addEventListener("change", listener); 39 40 triggerMQLEvent(mql); 41 await waitForChangesReported(); 42 assert_equals(calls, 1, "triggerMQLEvent"); 43 44 mql.dispatchEvent(new Event("change")); 45 assert_equals(calls, 2, "dispatchEvent"); 46 }, "listener added with addListener and addEventListener is called once"); 47 48 promise_test(async t => { 49 const mql = await createMQL(t); 50 51 let calls = 0; 52 const listener = () => { 53 calls++; 54 }; 55 56 mql.addListener(listener); 57 mql.addEventListener("change", listener, true); 58 59 triggerMQLEvent(mql); 60 await waitForChangesReported(); 61 assert_equals(calls, 2, "triggerMQLEvent"); 62 63 mql.dispatchEvent(new Event("change")); 64 assert_equals(calls, 4, "dispatchEvent"); 65 }, "listener added with addListener and addEventListener (capture) is called twice"); 66 67 promise_test(async t => { 68 const mql = await createMQL(t); 69 70 let calls = 0; 71 const listener = { 72 handleEvent() { 73 calls++; 74 }, 75 }; 76 77 mql.addListener(listener); 78 mql.removeEventListener("change", listener); 79 80 triggerMQLEvent(mql); 81 await waitForChangesReported(); 82 assert_equals(calls, 0, "triggerMQLEvent"); 83 84 mql.dispatchEvent(new Event("change")); 85 assert_equals(calls, 0, "dispatchEvent"); 86 }, "removeEventListener removes listener added with addListener"); 87 88 promise_test(async t => { 89 const mql = await createMQL(t); 90 91 let calls = 0; 92 const listener = () => { 93 calls++; 94 }; 95 96 mql.addListener(listener); 97 mql.removeEventListener("change", listener, true); 98 99 triggerMQLEvent(mql); 100 await waitForChangesReported(); 101 assert_equals(calls, 1, "triggerMQLEvent"); 102 103 mql.dispatchEvent(new Event("change")); 104 assert_equals(calls, 2, "dispatchEvent"); 105 }, "removeEventListener (capture) doesn't remove listener added with addListener"); 106 107 promise_test(async t => { 108 const mql = await createMQL(t); 109 110 let calls = 0; 111 const listener = { 112 handleEvent() { 113 calls++; 114 }, 115 }; 116 117 mql.addEventListener("change", listener); 118 mql.removeListener(listener); 119 120 triggerMQLEvent(mql); 121 await waitForChangesReported(); 122 assert_equals(calls, 0, "triggerMQLEvent"); 123 124 mql.dispatchEvent(new Event("change")); 125 assert_equals(calls, 0, "dispatchEvent"); 126 }, "removeListener removes listener added with addEventListener"); 127 128 promise_test(async t => { 129 const mql = await createMQL(t); 130 131 let calls = 0; 132 const listener = () => { 133 calls++; 134 }; 135 136 mql.addEventListener("change", listener, true); 137 mql.removeListener(listener); 138 139 triggerMQLEvent(mql); 140 await waitForChangesReported(); 141 assert_equals(calls, 1, "triggerMQLEvent"); 142 143 mql.dispatchEvent(new Event("change")); 144 assert_equals(calls, 2, "dispatchEvent"); 145 }, "removeListener doesn't remove listener added with addEventListener (capture)"); 146 147 // See: 148 // * https://github.com/whatwg/dom/issues/746 149 // * https://bugzilla.mozilla.org/show_bug.cgi?id=1492446 150 // * https://bugs.chromium.org/p/chromium/issues/detail?id=949432 151 promise_test(async t => { 152 const mql = await createMQL(t); 153 154 let calls = []; 155 mql.addListener(() => { 156 calls.push("addListener"); 157 }); 158 mql.addEventListener("change", { 159 handleEvent() { 160 calls.push("addEventListener"); 161 }, 162 }, true); 163 164 triggerMQLEvent(mql); 165 await waitForChangesReported(); 166 assert_array_equals(calls, ["addEventListener", "addListener"], "triggerMQLEvent"); 167 168 calls = []; 169 mql.dispatchEvent(new Event("change")); 170 assert_array_equals(calls, ["addEventListener", "addListener"], "dispatchEvent"); 171 }, "capturing event listener fires before non-capturing listener at target"); 172 </script>