blob: 48317d273b53a0c614b57bef7d3fcb41323dcf9c [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webkit-test-resources/ui-helper.js"></script>
</head>
<body>
<script>
const tempFileContent = "TEST";
const tempFileName = "test.tmp";
var fileInput = document.createElement("input");
fileInput.type = 'file';
fileInput.style.width = "100%"; // So that any manual testing will show full file names
document.body.insertBefore(fileInput, document.body.firstChild);
var scope = "resources";
var activeWorker;
var frame;
var fileFrame;
var formData;
var fileSize;
function with_iframe(url) {
return new Promise(function(resolve) {
var frame = document.createElement('iframe');
frame.className = 'test-iframe';
frame.src = url;
frame.onload = function() { resolve(frame); };
document.body.appendChild(frame);
});
}
function prepareUpload()
{
let resolve, reject;
const promise = new Promise((resolve_, reject_) => {
resolve = resolve_;
reject = reject_;
});
setTimeout(() => reject("test timed out"), 5000);
var input = document.getElementsByTagName("input")[0];
input.onchange = async (e) => {
var formData = new FormData;
formData.append("file", e.target.files[0], tempFileName);
fileSize = e.target.files[0].size;
resolve(formData);
};
if (window.testRunner) {
testRunner.setOpenPanelFiles([tempFilePath]);
var centerX = input.offsetLeft + input.offsetWidth / 2;
var centerY = input.offsetTop + input.offsetHeight / 2;
UIHelper.activateAt(centerX, centerY);
}
return promise;
}
promise_test(async (test) => {
if (window.testRunner) {
testRunner.setUseSeparateServiceWorkerProcess(true);
await fetch("").then(() => { }, () => { });
}
var registration = await navigator.serviceWorker.register("form-data-upload-worker.js", { scope : scope });
activeWorker = registration.active;
if (!activeWorker) {
activeWorker = registration.installing;
await new Promise(resolve => {
activeWorker.addEventListener('statechange', () => {
if (activeWorker.state === "activated")
resolve();
});
});
}
}, "Setup worker");
const channel = new MessageChannel();
promise_test(async (test) => {
activeWorker.postMessage({ port: channel.port1 }, [channel.port1]);
await new Promise(resolve => channel.port2.onmessage = resolve);
}, "Create channel with worker");
promise_test(async (test) => {
frame = await with_iframe("resources/");
}, "Setup frame");
promise_test(async (test) => {
const promise = new Promise(resolve => window.onmessage = resolve);
fileFrame = await with_iframe("/WebKit/service-workers/resources/create-temp-file-iframe.html");
let event = await promise;
tempFilePath = event.data;
}, "Setup file to upload");
promise_test(async (test) => {
formData = await prepareUpload();
assert_equals(fileSize, 4);
}, "Setup file form data");
promise_test(async (test) => {
const blob = new Blob(["'Hello'"], { "type" : "text/plain" });
formData.append("blob", blob, "blob.file");
formData.append("name", "value");
const response = await frame.contentWindow.fetch("/WebKit/service-workers/resources/file-upload-check.py", {method: "POST", body: formData});
const text = await response.text();
assert_true(text.includes(tempFileContent), "content");
assert_true(text.includes(tempFileName), "name");
assert_true(text.includes('name="name"'), "name");
assert_true(text.includes('value'), "name");
assert_true(text.includes('name="blob"'), "blob");
assert_true(text.includes('Hello'), "Hello");
}, "Upload intercepted by service worker");
promise_test(async (test) => {
const blob = new Blob(["'Hello'"], { "type" : "text/plain" });
formData.append("blob", blob, "blob.file");
formData.append("name", "value");
const messagePromise = new Promise(resolve => channel.port2.onmessage = (e) => resolve(e.data));
const response = await frame.contentWindow.fetch("/WebKit/service-workers/resources/file-upload-check.py?clone", {method: "POST", body: formData});
const text = await response.text();
const messageText = await messagePromise;
assert_equals(text, messageText);
assert_true(text.includes('name="name"'), "name");
assert_true(text.includes('value'), "name");
assert_true(text.includes('name="blob"'), "blob");
assert_true(text.includes('Hello'), "Hello");
}, "Upload cloned by service worker");
promise_test(async (test) => {
await with_iframe("/WebKit/resources/delete-temp-file-iframe.html");
}, "Delete temporary file");
</script>
</body>
</html>