summaryrefslogtreecommitdiffstats
path: root/testing/mochitest/tests/Harness_sanity/test_SpecialPowersSandbox.js
blob: 42ec471bb8a1a809288bf0a9853b02b3e9b5fe18 (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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
"use strict";

/* eslint-disable @microsoft/sdl/no-insecure-url */

const { XPCShellContentUtils } = ChromeUtils.import(
  "resource://testing-common/XPCShellContentUtils.jsm"
);

XPCShellContentUtils.init(this);

const HTML = String.raw`<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  <span id="span">Hello there.</span>
</body>
</html>`;

const server = XPCShellContentUtils.createHttpServer({
  hosts: ["example.com", "example.org"],
});

server.registerPathHandler("/", (request, response) => {
  response.setHeader("Content-Type", "text/html");
  response.write(HTML);
});
/**
 * Tests that the shared sandbox functionality for cross-process script
 * execution works as expected. In particular, ensures that Assert methods
 * report the correct diagnostics in the caller scope.
 */

let scope = this;

async function interceptDiagnostics(func) {
  let originalRecord = scope.do_report_result;
  try {
    let diags = [];

    scope.do_report_result = (passed, msg, stack) => {
      diags.push({ passed, msg, stack });
    };

    await func();

    return diags;
  } finally {
    scope.do_report_result = originalRecord;
  }
}

add_task(async function () {
  const frameSrc = "http://example.com/";
  const subframeSrc = "http://example.org/";

  let page = await XPCShellContentUtils.loadContentPage(frameSrc, {
    remote: true,
    remoteSubframes: true,
  });

  let { SpecialPowers, browsingContext } = page;

  let expected = [
    [false, "Thing - 1 == 2"],
    [true, "Hmm - 1 == 1"],
    [true, "Yay. - true == true"],
    [false, "Boo!. - false == true"],
  ];

  // Test that a representative variety of assertions work as expected, and
  // trigger the expected calls to the harness's reporting function.
  //
  // Note: Assert.sys.mjs has its own tests, and defers all of its reporting to a
  // single reporting function, so we don't need to test it comprehensively. We
  // just need to make sure that the general functionality works as expected.
  let tests = {
    "SpecialPowers.spawn": () => {
      return SpecialPowers.spawn(browsingContext, [], async () => {
        Assert.equal(1, 2, "Thing");
        Assert.equal(1, 1, "Hmm");
        Assert.ok(true, "Yay.");
        Assert.ok(false, "Boo!.");
      });
    },
    "SpecialPowers.spawn-subframe": () => {
      return SpecialPowers.spawn(browsingContext, [subframeSrc], async src => {
        let subFrame = this.content.document.createElement("iframe");
        subFrame.src = src;
        this.content.document.body.appendChild(subFrame);

        await new Promise(resolve => {
          subFrame.addEventListener("load", resolve, { once: true });
        });

        await SpecialPowers.spawn(subFrame, [], () => {
          Assert.equal(1, 2, "Thing");
          Assert.equal(1, 1, "Hmm");
          Assert.ok(true, "Yay.");
          Assert.ok(false, "Boo!.");
        });
      });
    },
    "SpecialPowers.spawnChrome": () => {
      return SpecialPowers.spawnChrome([], async () => {
        Assert.equal(1, 2, "Thing");
        Assert.equal(1, 1, "Hmm");
        Assert.ok(true, "Yay.");
        Assert.ok(false, "Boo!.");
      });
    },
    "SpecialPowers.loadChromeScript": async () => {
      let script = SpecialPowers.loadChromeScript(() => {
        /* eslint-env mozilla/chrome-script */
        this.addMessageListener("ping", () => "pong");

        Assert.equal(1, 2, "Thing");
        Assert.equal(1, 1, "Hmm");
        Assert.ok(true, "Yay.");
        Assert.ok(false, "Boo!.");
      });

      await script.sendQuery("ping");
      script.destroy();
    },
  };

  for (let [name, func] of Object.entries(tests)) {
    info(`Starting task: ${name}`);

    let diags = await interceptDiagnostics(func);

    let results = diags.map(diag => [diag.passed, diag.msg]);

    deepEqual(results, expected, "Got expected assertions");
  }
});