Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: http3 OR http2
- Manifest: docshell/test/mochitest/mochitest.toml
<!doctype html>
<html>
<head>
<script src="/tests/SimpleTest/SimpleTest.js"></script>
<script src="/tests/SimpleTest/EventUtils.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<iframe name="targetFrame" id="targetFrame"></iframe>
<form id="form" action="double_submit.sjs?delay=1000" method="POST" target="targetFrame">
<input id="token" type="text" name="token" value="">
<input id="button" type="submit">
</form>
<script>
"use strict";
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
function asyncClick(counts) {
let frame = document.createElement('iframe');
frame.addEventListener(
'load', () => frame.contentWindow.postMessage({command: "start"}, "*"),
{ once:true });
frame.src = "clicker.html";
addEventListener('message', ({source}) => {
if (source === frame.contentWindow) {
counts.click++;
synthesizeMouse(document.getElementById('button'), 5, 5, {});
}
}, { once: true });
document.body.appendChild(frame);
return stop;
}
function click(button) {
synthesizeMouse(button, 5, 5, {});
}
add_task(async function runTest() {
let frame = document.getElementById('targetFrame');
await new Promise(resolve => {
addEventListener('message', resolve, {once: true});
frame.src = CROSS_ORIGIN_URI;
});
let form = document.getElementById('form');
let button = document.getElementById('button');
let token = document.getElementById('token');
token.value = "first";
await new Promise((resolve, reject) => {
let counts = { click: 0, submit: 0 };
form.addEventListener('submit', () => counts.submit++);
asyncClick(counts);
form.requestSubmit(button);
token.value = "bad";
let steps = {
good: {
entered: false,
next: () => { steps.good.entered = true; resolve(); },
assertion: () => {
ok(steps.first.entered && !steps.bad.entered, "good comes after first, but not bad")
}
},
first: {
entered: false,
next: () => { steps.first.entered = true; token.value = "good"; click(button); },
assertion: () => {
ok(!steps.good.entered && !steps.bad.entered, "first message is first")
is(counts.click, 1, "clicked");
is(counts.submit, 2, "did submit");
}
},
bad: {
entered: false,
next: () => { reject(); },
assertion: () => ok(false, "we got a bad message")
}
};
addEventListener('message', ({source, data}) => {
if (source !== frame.contentWindow) {
return;
}
let step = steps[data] || reject;
step.assertion();
step.next();
})
});
});
</script>
</body>
</html>