summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/test/xpcshell/test_ext_runtime_getContexts.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/extensions/test/xpcshell/test_ext_runtime_getContexts.js')
-rw-r--r--toolkit/components/extensions/test/xpcshell/test_ext_runtime_getContexts.js180
1 files changed, 180 insertions, 0 deletions
diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_runtime_getContexts.js b/toolkit/components/extensions/test/xpcshell/test_ext_runtime_getContexts.js
new file mode 100644
index 0000000000..efef355f74
--- /dev/null
+++ b/toolkit/components/extensions/test/xpcshell/test_ext_runtime_getContexts.js
@@ -0,0 +1,180 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+add_task(async function test_runtime_getContexts() {
+ function background() {
+ browser.test.onMessage.addListener(async (msg, ...args) => {
+ if (msg === "runtime.getContexts") {
+ try {
+ const filter = args[0];
+ if (!filter) {
+ // Expected to be rejected.
+ await browser.runtime.getContexts();
+ } else {
+ // Expected to be resolved.
+ const result = await browser.runtime.getContexts(filter);
+ browser.test.sendMessage(`${msg}:result`, result);
+ }
+ } catch (err) {
+ browser.test.log(`runtime.getContexts error: ${err}\n`);
+ browser.test.sendMessage(`${msg}:error`, String(err));
+ }
+ }
+ });
+ browser.test.sendMessage("bgpage:loaded");
+ }
+
+ const extension = ExtensionTestUtils.loadExtension({
+ manifest: {
+ manifest_version: 3,
+ },
+ background,
+ files: {
+ "tab.html": `<!DOCTYPE html><html></html>`,
+ },
+ });
+
+ await extension.startup();
+ await extension.awaitMessage("bgpage:loaded");
+
+ const documentOrigin = extension.extension.baseURI.spec.slice(0, -1);
+ const tabDocumentUrl = extension.extension.baseURI.resolve("tab.html");
+ const bgDocumentUrl = extension.extension.baseURI.resolve(
+ "_generated_background_page.html"
+ );
+
+ let expectedBackground = {
+ contextType: "BACKGROUND",
+ documentOrigin,
+ documentUrl: bgDocumentUrl,
+ incognito: false,
+ frameId: 0,
+ tabId: -1,
+ windowId: -1,
+ };
+
+ let expectedTab = {
+ contextType: "TAB",
+ documentOrigin,
+ documentUrl: `${tabDocumentUrl}?fistOpenedTab=true`,
+ incognito: false,
+ frameId: 0,
+ // tabId and windowId are expected to be -1 in xpcshell test
+ // (these are also covered by browser_ext_getContexts.js).
+ tabId: -1,
+ windowId: -1,
+ };
+
+ const assertValidContextId = contextId => {
+ Assert.equal(
+ typeof contextId,
+ "string",
+ "contextId should be set to a string"
+ );
+ Assert.notEqual(
+ contextId.length,
+ 0,
+ "contextId should be set to a non-zero length string"
+ );
+ };
+ const assertGetContextsResult = (
+ actual,
+ expected,
+ msg,
+ { assertContextId = false } = {}
+ ) => {
+ const actualCopy = assertContextId ? actual : actual.map(it => ({ ...it }));
+ if (!assertContextId) {
+ actualCopy.forEach(it => delete it.contextId);
+ }
+ Assert.deepEqual(actualCopy, expected, msg);
+ };
+
+ info(
+ "Test runtime.getContexts rejects when called without any filter parameter"
+ );
+ extension.sendMessage("runtime.getContexts", undefined);
+ let resError = await extension.awaitMessage("runtime.getContexts:error");
+ Assert.equal(
+ resError,
+ "Error: Incorrect argument types for runtime.getContexts.",
+ "Got the expected error message"
+ );
+
+ info(
+ "Test runtime.getContext resolved when called with an empty filter parameter"
+ );
+
+ extension.sendMessage("runtime.getContexts", {});
+ let res = await extension.awaitMessage("runtime.getContexts:result");
+
+ assertGetContextsResult(
+ res,
+ [expectedBackground],
+ "Got the expected properties for the background context"
+ );
+
+ let actualBackground = res[0];
+ assertValidContextId(actualBackground.contextId);
+
+ const page = await ExtensionTestUtils.loadContentPage(
+ `${tabDocumentUrl}?fistOpenedTab=true`
+ );
+
+ res = await page.spawn([], () =>
+ this.content.wrappedJSObject.browser.runtime.getContexts({})
+ );
+
+ const bgItem = res.find(it => it.contextType === "BACKGROUND");
+ const tabItem = res.find(it => it.contextType === "TAB");
+
+ assertValidContextId(tabItem.contextId);
+
+ assertGetContextsResult(
+ res,
+ [expectedBackground, expectedTab],
+ "Got expected properties for backgrond and tab contexts"
+ );
+ assertGetContextsResult(
+ [bgItem],
+ [actualBackground],
+ "Expect the expected properties for the background context (included same contextId)",
+ { assertContextId: true }
+ );
+
+ info("Test runtime.getContexts with a contextType filter");
+ res = await page.spawn([], () =>
+ this.content.wrappedJSObject.browser.runtime.getContexts({
+ contextTypes: ["BACKGROUND"],
+ })
+ );
+ assertGetContextsResult(
+ res,
+ [actualBackground],
+ "Expect only the backgrund context to be included in the results",
+ { assertContextId: true }
+ );
+
+ info("Test runtime.ContextType enum");
+ const contextTypeEnum = await page.spawn([], () => {
+ return this.content.wrappedJSObject.browser.runtime.ContextType;
+ });
+
+ const expectedTypesMap = ["BACKGROUND", "POPUP", "SIDE_PANEL", "TAB"].reduce(
+ (acc, item) => {
+ acc[item] = item;
+ return acc;
+ },
+ {}
+ );
+
+ Assert.deepEqual(
+ contextTypeEnum,
+ expectedTypesMap,
+ "Got the expected values in the ContextType enum"
+ );
+
+ await extension.unload();
+});