"use strict";
const { XPCShellContentUtils } = ChromeUtils.importESModule(
"resource://testing-common/XPCShellContentUtils.sys.mjs"
);
XPCShellContentUtils.init(
this);
const childFramePath =
"/file_bug1086684.html";
const childFrameURL =
"http://example.com" + childFramePath;
const childFrameContents = `<!DOCTYPE html>
<html>
<head>
<meta charset=
"UTF-8">
</head>
<body>
<div id=
"content">
<input type=
"file" id=
"f">
</div>
</body>
</html>`;
const server = XPCShellContentUtils.createHttpServer({
hosts: [
"example.com"],
});
server.registerPathHandler(childFramePath, (request, response) => {
response.write(childFrameContents);
});
function childFrameScript() {
/* eslint-env mozilla/frame-script */
"use strict";
let { MockFilePicker } = ChromeUtils.importESModule(
"resource://testing-common/MockFilePicker.sys.mjs"
);
function parentReady(message) {
MockFilePicker.init(content.browsingContext);
MockFilePicker.setFiles([message.data.file]);
MockFilePicker.returnValue = MockFilePicker.returnOK;
let input = content.document.getElementById(
"f");
input.addEventListener(
"change", () => {
MockFilePicker.cleanup();
let value = input.value;
message.target.sendAsyncMessage(
"testBug1086684:childDone", { value });
});
// Activate the page to allow opening the file picker.
content.document.notifyUserGestureActivation();
input.focus();
input.click();
}
addMessageListener(
"testBug1086684:parentReady",
function (message) {
parentReady(message);
});
}
add_task(async
function () {
Services.prefs.setBoolPref(
"dom.security.https_first",
false);
let page = await XPCShellContentUtils.loadContentPage(childFrameURL, {
remote:
true,
});
page.loadFrameScript(childFrameScript);
await
new Promise(resolve => {
let test;
function* testStructure(mm) {
let value;
function testDone(msg) {
test.next(msg.data.value);
}
mm.addMessageListener(
"testBug1086684:childDone", testDone);
let blob =
new Blob([]);
let file =
new File([blob],
"helloworld.txt", { type:
"text/plain" });
mm.sendAsyncMessage(
"testBug1086684:parentReady", { file });
value = yield;
// Note that the "helloworld.txt" passed in above doesn't affect the
// 'value' getter. Because we're mocking a file using a blob, we ask the
// blob for its path, which is the empty string.
equal(value,
"",
"got the right answer and didn't crash");
resolve();
}
test = testStructure(page.browser.messageManager);
test.next();
});
await page.close();
Services.prefs.clearUserPref(
"dom.security.https_first");
});