mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-08-26 01:08:39 +09:00
199 lines
5.8 KiB
HTML
199 lines
5.8 KiB
HTML
<!DOCTYPE HTML>
|
||
|
||
<html>
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||
<script type="text/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
|
||
<script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
|
||
<script type="text/javascript" src="head.js"></script>
|
||
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
||
</head>
|
||
<body>
|
||
|
||
<form method="post"
|
||
action="file_WebRequest_page3.html?trigger=form"
|
||
target="_blank"
|
||
enctype="multipart/form-data"
|
||
>
|
||
<input type="text" name=""special" chˆrs" value="spÛcial">
|
||
<input type="file" name="testFile">
|
||
<input type="file" name="emptyFile">
|
||
<input type="text" name="textInput1" value="value1">
|
||
</form>
|
||
|
||
<form method="post"
|
||
action="file_WebRequest_page3.html?trigger=form"
|
||
target="_blank"
|
||
enctype="multipart/form-data"
|
||
>
|
||
<input type="text" name="textInput2" value="value2">
|
||
<input type="file" name="testFile">
|
||
<input type="file" name="emptyFile">
|
||
</form>
|
||
|
||
</form>
|
||
<form method="post"
|
||
action="file_WebRequest_page3.html?trigger=form"
|
||
target="_blank"
|
||
>
|
||
<input type="text" name="textInput" value="value1">
|
||
<input type="text" name="textInput" value="value2">
|
||
</form>
|
||
<script>
|
||
"use strict";
|
||
|
||
let files, testFile, blob, file, uploads;
|
||
add_task(function* test_setup() {
|
||
files = yield new Promise(resolve => {
|
||
SpecialPowers.createFiles([{name: "testFile.pdf", data: "Not really a PDF file :)", "type": "application/x-pdf"}], (result) => {
|
||
resolve(result);
|
||
});
|
||
});
|
||
testFile = files[0];
|
||
blob = {
|
||
name: "blobAsFile",
|
||
content: new Blob(["A blob sent as a file"], {type: "text/csv"}),
|
||
fileName: "blobAsFile.csv",
|
||
};
|
||
file = {
|
||
name: "testFile",
|
||
fileName: testFile.name,
|
||
};
|
||
uploads = {
|
||
[blob.name]: blob,
|
||
[file.name]: file,
|
||
};
|
||
});
|
||
|
||
function background() {
|
||
const FILTERS = {urls: ["<all_urls>"]};
|
||
|
||
let requestBodySupported = true;
|
||
|
||
function onUpload(details) {
|
||
let url = new URL(details.url);
|
||
let upload = url.searchParams.get("upload");
|
||
if (!upload || !requestBodySupported) {
|
||
return;
|
||
}
|
||
let requestBody = details.requestBody;
|
||
browser.test.log(`onBeforeRequest upload: ${details.url} ${JSON.stringify(details.requestBody)}`);
|
||
browser.test.assertTrue(!!requestBody, `Intercepted upload ${details.url} #${details.requestId} ${upload} have a requestBody`);
|
||
if (!requestBody) {
|
||
return;
|
||
}
|
||
let byteLength = parseInt(upload, 10);
|
||
if (byteLength) {
|
||
browser.test.assertTrue(!!requestBody.raw, `Binary upload ${details.url} #${details.requestId} ${upload} have a raw attribute`);
|
||
browser.test.assertEq(byteLength, requestBody.raw && requestBody.raw.map(r => r.bytes && r.bytes.byteLength || 0).reduce((a, b) => a + b), `Binary upload size matches`);
|
||
return;
|
||
}
|
||
if ("raw" in requestBody) {
|
||
browser.test.assertEq(upload, JSON.stringify(requestBody.raw).replace(/(\bfile: ")[^"]+/, "$1<file>"), `Upload ${details.url} #${details.requestId} matches raw data`);
|
||
} else {
|
||
browser.test.assertEq(upload, JSON.stringify(requestBody.formData), `Upload ${details.url} #${details.requestId} matches form data.`);
|
||
}
|
||
}
|
||
|
||
browser.webRequest.onCompleted.addListener(
|
||
details => {
|
||
browser.test.log(`onCompleted ${details.requestId} ${details.url}`);
|
||
|
||
browser.test.sendMessage("done");
|
||
},
|
||
FILTERS);
|
||
|
||
let onBeforeRequest = details => {
|
||
browser.test.log(`${name} ${details.requestId} ${details.url}`);
|
||
|
||
onUpload(details);
|
||
};
|
||
|
||
try {
|
||
browser.webRequest.onBeforeRequest.addListener(
|
||
onBeforeRequest, FILTERS, ["requestBody"]);
|
||
} catch (e) {
|
||
browser.test.assertTrue(/\brequestBody\b/.test(e.message),
|
||
"Request body is unsupported");
|
||
|
||
// requestBody is disabled in release builds
|
||
if (!/\brequestBody\b/.test(e.message)) {
|
||
throw e;
|
||
}
|
||
|
||
browser.webRequest.onBeforeRequest.addListener(
|
||
onBeforeRequest, FILTERS);
|
||
}
|
||
}
|
||
|
||
add_task(function* test_xhr_forms() {
|
||
let extension = ExtensionTestUtils.loadExtension({
|
||
manifest: {
|
||
permissions: [
|
||
"webRequest",
|
||
"webRequestBlocking",
|
||
"<all_urls>",
|
||
],
|
||
},
|
||
background,
|
||
});
|
||
|
||
yield extension.startup();
|
||
|
||
for (let form of document.forms) {
|
||
if (file.name in form.elements) {
|
||
SpecialPowers.wrap(form.elements[file.name]).mozSetFileArray(files);
|
||
}
|
||
let action = new URL(form.action);
|
||
let formData = new FormData(form);
|
||
let webRequestFD = {};
|
||
|
||
let updateActionURL = () => {
|
||
for (let name of formData.keys()) {
|
||
webRequestFD[name] = name in uploads ? [uploads[name].fileName] : formData.getAll(name);
|
||
}
|
||
action.searchParams.set("upload", JSON.stringify(webRequestFD));
|
||
action.searchParams.set("enctype", form.enctype);
|
||
};
|
||
|
||
updateActionURL();
|
||
|
||
form.action = action;
|
||
form.submit();
|
||
yield extension.awaitMessage("done");
|
||
|
||
if (form.enctype !== "multipart/form-data") {
|
||
continue;
|
||
}
|
||
|
||
let post = (data) => {
|
||
let xhr = new XMLHttpRequest();
|
||
action.searchParams.set("xhr", "1");
|
||
xhr.open("POST", action.href);
|
||
xhr.send(data);
|
||
action.searchParams.delete("xhr");
|
||
return extension.awaitMessage("done");
|
||
};
|
||
|
||
formData.append(blob.name, blob.content, blob.fileName);
|
||
formData.append("formDataField", "some value");
|
||
updateActionURL();
|
||
yield post(formData);
|
||
|
||
action.searchParams.set("upload", JSON.stringify([{file: "<file>"}]));
|
||
yield post(testFile);
|
||
|
||
action.searchParams.set("upload", `${blob.content.size} bytes`);
|
||
yield post(blob.content);
|
||
|
||
let byteLength = 16;
|
||
action.searchParams.set("upload", `${byteLength} bytes`);
|
||
yield post(new ArrayBuffer(byteLength));
|
||
}
|
||
|
||
yield extension.unload();
|
||
});
|
||
</script>
|
||
</body>
|
||
</html>
|