summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/test/mochitest/test_ext_runtime_getContexts.html
blob: fa3b7385daf1e38d7ee6c67bab90cd0a8e0696cd (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
<!DOCTYPE HTML>
<html>
<head>
  <title>runtime.getContexts Test</title>
  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <script type="text/javascript" src="/tests/SimpleTest/ExtensionTestUtils.js"></script>
  <script type="text/javascript" src="head.js"></script>
  <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
</head>
<body>

<script type="text/javascript">
"use strict";

function genericChecker() {
  const params = new URLSearchParams(window.location.search);
  const kind = params.get("kind");
  const createdTabIds = [];

  browser.test.onMessage.addListener(async msg => {
    if (msg == `${kind}-test-get-contexts`) {
      try {
        const result = await browser.runtime.getContexts({});
        browser.test.assertEq(3, result.length, "Expect 3 extension contexts to be found");

        const bgContext = result.find(it => it.contextType === browser.runtime.ContextType.BACKGROUND);
        const tabContext = result.find(it => it.documentUrl.endsWith("kind=tab"));
        const popupContext = result.find(it => it.documentUrl.endsWith("kind=action"));

        browser.test.assertEq(window.location.href, bgContext.documentUrl, "background context has the expected documentUrl");
        browser.test.assertEq(-1, bgContext.windowId, "background context has the expected windowId");
        browser.test.assertEq(-1, bgContext.tabId, "background context has the expected tabId");
        browser.test.assertEq("TAB", tabContext.contextType, "Got expected tab context type");
        browser.test.assertTrue(
          typeof tabContext.windowId === "number" && tabContext.windowId > 0,
          "Got expected windowId on tab context"
        );
        browser.test.assertTrue(
          typeof tabContext.windowId === "number" && tabContext.tabId > 0,
          "Got expected tabId on tab context"
        );
        browser.test.assertEq(
          tabContext.windowId,
          popupContext.windowId,
          "Poup and tab expected to have the same windowId"
        );
        browser.test.assertEq(-1, popupContext.tabId, "popup context has the expected tabId");
        browser.test.assertEq("POPUP", popupContext.contextType, "Got expected popup context type");

        browser.test.sendMessage(`${msg}:done`);
      } catch (err) {
        browser.test.fail(`broser.runtime.getContexts call rejected: ${err}`);
        browser.test.sendMessage(`${msg}:done`);
      }
    } else if (msg == `${kind}-open-tab`) {
      const tab = await browser.tabs.create({ url: "/page.html?kind=tab" });
      createdTabIds.push(tab.id);
    } else if (msg == `${kind}-close-tabs`) {
      await browser.tabs.remove(createdTabIds);
      browser.test.sendMessage(`${msg}:done`);
    }
  });

  browser.test.log(`${kind} extension page loaded`);
  browser.test.sendMessage(`${kind}-loaded`);
}

add_task(async function test_runtime_getContexts() {
  const EXT_ID = "runtime-getContexts@mochitest";
  let extension = ExtensionTestUtils.loadExtension({
    useAddonManager: "temporary", // To automatically show sidebar on load.
    incognitoOverride: "spanning",
    manifest: {
      manifest_version: 3,
      browser_specific_settings: { gecko: { id: EXT_ID } },

      action: {
        default_popup: "page.html?kind=action",
        default_area: "navbar",
      },

      background: {
        page: "page.html?kind=background",
      },
    },

    files: {
      "page.html": `
      <!DOCTYPE html>
      <html>
      <head><meta charset="utf-8"><\/head>
      <body>
      <script src="page.js"><\/script>
      <\/body>
      <\/html>
      `,

      "page.js": genericChecker,
    },
  });

  await extension.startup();
  await extension.awaitMessage("background-loaded");

  extension.sendMessage("background-open-tab");
  await extension.awaitMessage("tab-loaded");

  await AppTestDelegate.clickBrowserAction(window, extension);
  await extension.awaitMessage("action-loaded");

  extension.sendMessage("background-test-get-contexts");
  await extension.awaitMessage("background-test-get-contexts:done");

  // Close popup window.
  await AppTestDelegate.closeBrowserAction(window, extension);

  // Close extension page tabs.
  extension.sendMessage("background-close-tabs");
  await extension.awaitMessage("background-close-tabs:done");

  await extension.unload();
});

</script>
</body>
</html>