summaryrefslogtreecommitdiffstats
path: root/dom/file/tests/test_ipc_messagemanager_blob.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--dom/file/tests/test_ipc_messagemanager_blob.js102
1 files changed, 102 insertions, 0 deletions
diff --git a/dom/file/tests/test_ipc_messagemanager_blob.js b/dom/file/tests/test_ipc_messagemanager_blob.js
new file mode 100644
index 0000000000..dacdc9e7bb
--- /dev/null
+++ b/dom/file/tests/test_ipc_messagemanager_blob.js
@@ -0,0 +1,102 @@
+"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();
+});