summaryrefslogtreecommitdiffstats
path: root/dom/ipc/tests/test_bug1086684.js
blob: 8a349066864dec112b13c1dcb53d62a477e2dd0b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
"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);
    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 });
    });

    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");
});