102 lines
2.4 KiB
JavaScript
102 lines
2.4 KiB
JavaScript
"use strict";
|
|
|
|
const { XPCShellContentUtils } = ChromeUtils.importESModule(
|
|
"resource://testing-common/XPCShellContentUtils.sys.mjs"
|
|
);
|
|
|
|
XPCShellContentUtils.init(this);
|
|
|
|
function childFrameScript() {
|
|
addMessageListener("test:ipcClonedMessage", function (message) {
|
|
if (!Blob.isInstance(message.json)) {
|
|
sendAsyncMessage(message.name, message.json);
|
|
return;
|
|
}
|
|
|
|
let reader = new FileReader();
|
|
reader.addEventListener("load", function () {
|
|
let response =
|
|
reader.result == "this is a great success!" ? message.json : "error";
|
|
sendAsyncMessage(message.name, response);
|
|
});
|
|
reader.readAsText(message.json);
|
|
});
|
|
}
|
|
|
|
add_task(async function test() {
|
|
let page = await XPCShellContentUtils.loadContentPage("about:blank", {
|
|
remote: true,
|
|
});
|
|
|
|
page.loadFrameScript(childFrameScript);
|
|
|
|
const blobString = "this is a great success!";
|
|
|
|
const messages = [
|
|
"hi!",
|
|
"",
|
|
2,
|
|
-0.04,
|
|
34329873249872400000000000000,
|
|
true,
|
|
false,
|
|
null,
|
|
0,
|
|
|
|
// Make sure this one is always last.
|
|
new Blob(["this ", "is ", "a ", "great ", "success!"], {
|
|
type: "text/plain",
|
|
}),
|
|
];
|
|
let receivedMessageIndex = 0;
|
|
|
|
let mm = page.browser.messageManager;
|
|
let done = new Promise(resolve => {
|
|
mm.addMessageListener("test:ipcClonedMessage", async message => {
|
|
let data = message.json;
|
|
|
|
if (Blob.isInstance(data)) {
|
|
equal(receivedMessageIndex, messages.length - 1, "Blob is last");
|
|
equal(
|
|
data.size,
|
|
messages[receivedMessageIndex].size,
|
|
"Correct blob size"
|
|
);
|
|
equal(
|
|
data.type,
|
|
messages[receivedMessageIndex].type,
|
|
"Correct blob type"
|
|
);
|
|
|
|
let reader1 = new FileReader();
|
|
reader1.readAsText(data);
|
|
|
|
let reader2 = new FileReader();
|
|
reader2.readAsText(messages[receivedMessageIndex]);
|
|
|
|
await Promise.all([
|
|
new Promise(res => (reader1.onload = res)),
|
|
new Promise(res => (reader2.onload = res)),
|
|
]);
|
|
|
|
equal(reader1.result, blobString, "Result 1");
|
|
equal(reader2.result, blobString, "Result 2");
|
|
|
|
resolve();
|
|
} else {
|
|
equal(
|
|
data,
|
|
messages[receivedMessageIndex++],
|
|
"Got correct round-tripped response"
|
|
);
|
|
}
|
|
});
|
|
});
|
|
|
|
for (let message of messages) {
|
|
mm.sendAsyncMessage("test:ipcClonedMessage", message);
|
|
}
|
|
|
|
await done;
|
|
await page.close();
|
|
});
|