Skip to content

Commit d8f3c9c

Browse files
shaseleychromium-wpt-export-bot
authored andcommitted
[dom] Add tests for "inner invoke" with EventTarget in a detached iframe
This adds tests for dispatching events to an EventTarget created in an iframe that gets detached --- both prior to and during event dispatch. The behavior of engines for this case is to not run event listeners after the EventTarget's associated global is detached, which is what we check for in the tests. Spec: https://dom.spec.whatwg.org/#concept-event-listener-inner-invoke PR: whatwg/dom#1085 Bug: 1323391 Change-Id: I57aac7d444d3532ad0940a228452d206b5c1be07
1 parent c801c26 commit d8f3c9c

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<!DOCTYPE html>
2+
<meta charset="utf-8">
3+
<title>EventTarget in Detached iframe</title>
4+
<link rel="help" href="https://dom.spec.whatwg.org/#concept-event-listener-inner-invoke">
5+
<script src="/resources/testharness.js"></script>
6+
<script src="/resources/testharnessreport.js"></script>
7+
8+
<body>
9+
<script>
10+
"use strict";
11+
12+
async function addFrameAndWaitForLoad(srcdoc) {
13+
const frame = document.createElement('iframe');
14+
frame.srcdoc = srcdoc;
15+
await new Promise((resolve) => {
16+
frame.addEventListener('load', resolve);
17+
document.body.appendChild(frame);
18+
});
19+
return frame;
20+
}
21+
22+
for (let eventType of ["inner", "outer"]) {
23+
promise_test(async t => {
24+
const frame = await addFrameAndWaitForLoad(`<script>
25+
window.parent.innerEventTarget = new EventTarget();
26+
window.parent.innerEvent = new Event('event');
27+
<\/script>`);
28+
29+
let fireCount = 0;
30+
window.innerEventTarget.addEventListener('event', () => {
31+
++fireCount;
32+
});
33+
34+
const event = eventType == "inner" ? window.innerEvent : new Event('event');
35+
window.innerEventTarget.dispatchEvent(event);
36+
frame.remove();
37+
window.innerEventTarget.dispatchEvent(event);
38+
39+
assert_equals(fireCount, 1, `Expected one listener to run for type "${eventType}"`);
40+
}, `Event handlers for EventTargets in detached iframes do not fire with ${eventType} iframe events`);
41+
}
42+
43+
promise_test(async t => {
44+
const frame = await addFrameAndWaitForLoad(`<script>
45+
window.parent.innerEventTarget = new EventTarget();
46+
<\/script>`);
47+
48+
let fireCount = 0;
49+
window.innerEventTarget.addEventListener('event', () => {
50+
++fireCount;
51+
frame.remove();
52+
});
53+
window.innerEventTarget.addEventListener('event', () => {
54+
++fireCount;
55+
});
56+
57+
window.innerEventTarget.dispatchEvent(new Event('event'));
58+
59+
assert_equals(fireCount, 1);
60+
}, "Event listeners do not run after detaching an EventTarget's iframe during event dispatch");
61+
62+
</script>

0 commit comments

Comments
 (0)