<!
doctype html>
<
html>
<
head>
<
title>Test for Bug 1590762</
title>
<
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>
<
form id=
"form" action=
"form_submit.sjs" method=
"POST" target=
"targetFrame">
<
input id=
"input" type=
"text" name=
"name" value=
"">
<
input id=
"button" type=
"submit">
</
form>
<
script>
"use strict";
const PATH =
"/tests/docshell/test/mochitest/";
const SAME_ORIGIN = new URL(PATH, window.location.origin);;
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
const CROSS_ORIGIN_1 = new URL(PATH,
"http://test1.example.com/");
const CROSS_ORIGIN_2 = new URL(PATH,
"https://example.com/");
const TARGET =
"ping.html";
const ACTION =
"form_submit.sjs";
function generateBody(size) {
let data = new Uint8Array(size);
for (let i = 0; i < size; ++i) {
data[i] = 97 + Math.random() * (123 - 97);
}
return new TextDecoder().decode(data);
}
async function withFrame(url) {
info(
"Creating frame");
let
frame = document.createElement(
'iframe');
frame.name =
"targetFrame";
return new Promise(resolve => {
addEventListener(
'message', async function({
source}) {
info(
"Frame loaded");
if (
frame.contentWindow ==
source) {
resolve(
frame);
}
}, { once: true });
frame.src = url;
document.
body.appendChild(
frame);
});
}
function click() {
synthesizeMouse(document.getElementById(
'button'), 5, 5, {});
}
function* spec() {
let urls = [SAME_ORIGIN, CROSS_ORIGIN_1, CROSS_ORIGIN_2];
for (let action of urls) {
for (let target of urls) {
yield { action: new URL(ACTION, action),
target: new URL(TARGET, target) };
}
}
}
info(
"Starting tests");
let
form = document.getElementById(
'form');
// The
body of the POST needs to be large to trigger this.
// 1024*1024 seems to be enough, but scaling to get a margin.
document.getElementById(
'input').value = generateBody(1024*1024);
for (let { target, action } of spec()) {
add_task(async function runTest() {
info(`Running test ${target} with ${action}`);
form.action = action;
let
frame = await withFrame(target);
await new Promise(resolve => {
addEventListener(
'message', async function() {
info(
"Form loaded");
frame.remove();
resolve();
}, { once: true });
click();
});
ok(true, `Submitted to ${origin} with target ${action}`)
});
};
</
script>
</
body>
</
html>