summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/test/xpcshell/test_ext_contentscript_perf_observers.js
blob: 2546b257fb146276664971e78e0f9b9d657d9d92 (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
"use strict";

const server = createHttpServer({
  hosts: ["a.example.com", "b.example.com", "c.example.com"],
});
server.registerDirectory("/data/", do_get_file("data"));

add_task(async function test_perf_observers_cors() {
  const extension = ExtensionTestUtils.loadExtension({
    manifest: {
      permissions: ["http://b.example.com/"],
      content_scripts: [
        {
          matches: ["http://a.example.com/data/file_sample.html"],
          js: ["cs.js"],
        },
      ],
    },
    files: {
      "cs.js"() {
        let obs = new window.PerformanceObserver(list => {
          list.getEntries().forEach(e => {
            browser.test.sendMessage("observed", {
              url: e.name,
              time: e.connectEnd,
              size: e.encodedBodySize,
            });
          });
        });
        obs.observe({ entryTypes: ["resource"] });

        let b = document.createElement("link");
        b.rel = "stylesheet";

        // Simulate page including a cross-origin resource from b.example.com.
        b.wrappedJSObject.href = "http://b.example.com/data/file_download.txt";
        document.head.appendChild(b);

        let c = document.createElement("link");
        c.rel = "stylesheet";

        // Simulate page including a cross-origin resource from c.example.com.
        c.wrappedJSObject.href = "http://c.example.com/data/file_download.txt";
        document.head.appendChild(c);
      },
    },
  });

  let page = await ExtensionTestUtils.loadContentPage(
    "http://a.example.com/data/file_sample.html"
  );
  await extension.startup();

  let b = await extension.awaitMessage("observed");
  let c = await extension.awaitMessage("observed");

  if (b.url.startsWith("http://c.")) {
    [c, b] = [b, c];
  }

  ok(b.url.startsWith("http://b."), "Observed resource from b.example.com");
  ok(b.time > 0, "connectionEnd available from b.example.com");
  equal(b.size, 46, "encodedBodySize available from b.example.com");

  ok(c.url.startsWith("http://c."), "Observed resource from c.example.com");
  equal(c.time, 0, "connectionEnd == 0 from c.example.com");
  equal(c.size, 0, "encodedBodySize == 0 from c.example.com");

  await extension.unload();
  await page.close();
});