summaryrefslogtreecommitdiffstats
path: root/browser/components/extensions/test/browser/browser_unified_extensions_messages.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/extensions/test/browser/browser_unified_extensions_messages.js')
-rw-r--r--browser/components/extensions/test/browser/browser_unified_extensions_messages.js227
1 files changed, 227 insertions, 0 deletions
diff --git a/browser/components/extensions/test/browser/browser_unified_extensions_messages.js b/browser/components/extensions/test/browser/browser_unified_extensions_messages.js
new file mode 100644
index 0000000000..2c13e08727
--- /dev/null
+++ b/browser/components/extensions/test/browser/browser_unified_extensions_messages.js
@@ -0,0 +1,227 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+loadTestSubscript("head_unified_extensions.js");
+
+const verifyMessageBar = message => {
+ Assert.equal(
+ message.getAttribute("type"),
+ "warning",
+ "expected warning message"
+ );
+ Assert.ok(
+ !message.hasAttribute("dismissable"),
+ "expected message to not be dismissable"
+ );
+
+ const supportLink = message.querySelector("a");
+ Assert.equal(
+ supportLink.getAttribute("support-page"),
+ "quarantined-domains",
+ "expected the correct support page ID"
+ );
+ Assert.equal(
+ supportLink.getAttribute("aria-labelledby"),
+ "unified-extensions-mb-quarantined-domain-title",
+ "expected the correct aria-labelledby value"
+ );
+ Assert.equal(
+ supportLink.getAttribute("aria-describedby"),
+ "unified-extensions-mb-quarantined-domain-message",
+ "expected the correct aria-describedby value"
+ );
+};
+
+add_task(async function test_quarantined_domain_message_disabled() {
+ const quarantinedDomain = "example.org";
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["extensions.quarantinedDomains.enabled", false],
+ ["extensions.quarantinedDomains.list", quarantinedDomain],
+ ],
+ });
+
+ // Load an extension that will have access to all domains, including the
+ // quarantined domain.
+ const extension = ExtensionTestUtils.loadExtension({
+ manifest: {
+ permissions: ["activeTab"],
+ browser_action: {},
+ },
+ });
+ await extension.startup();
+
+ await BrowserTestUtils.withNewTab(
+ { gBrowser, url: `https://${quarantinedDomain}/` },
+ async () => {
+ await openExtensionsPanel();
+ Assert.equal(getMessageBars().length, 0, "expected no message");
+ await closeExtensionsPanel();
+ }
+ );
+
+ await extension.unload();
+ await SpecialPowers.popPrefEnv();
+});
+
+add_task(async function test_quarantined_domain_message() {
+ const quarantinedDomain = "example.org";
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["extensions.quarantinedDomains.enabled", true],
+ ["extensions.quarantinedDomains.list", quarantinedDomain],
+ ],
+ });
+
+ // Load an extension that will have access to all domains, including the
+ // quarantined domain.
+ const extension = ExtensionTestUtils.loadExtension({
+ manifest: {
+ permissions: ["activeTab"],
+ browser_action: {},
+ },
+ });
+ await extension.startup();
+
+ await BrowserTestUtils.withNewTab(
+ { gBrowser, url: `https://${quarantinedDomain}/` },
+ async () => {
+ await openExtensionsPanel();
+
+ const messages = getMessageBars();
+ Assert.equal(messages.length, 1, "expected a message");
+
+ const [message] = messages;
+ verifyMessageBar(message);
+
+ await closeExtensionsPanel();
+ }
+ );
+
+ // Navigating to a different tab/domain shouldn't show any message.
+ await BrowserTestUtils.withNewTab(
+ { gBrowser, url: `http://mochi.test:8888/` },
+ async () => {
+ await openExtensionsPanel();
+ Assert.equal(getMessageBars().length, 0, "expected no message");
+ await closeExtensionsPanel();
+ }
+ );
+
+ // Back to a quarantined domain, if we update the list, we expect the message
+ // to be gone when we re-open the panel (and not before because we don't
+ // listen to the pref currently).
+ await BrowserTestUtils.withNewTab(
+ { gBrowser, url: `https://${quarantinedDomain}/` },
+ async () => {
+ await openExtensionsPanel();
+
+ const messages = getMessageBars();
+ Assert.equal(messages.length, 1, "expected a message");
+
+ const [message] = messages;
+ verifyMessageBar(message);
+
+ await closeExtensionsPanel();
+
+ // Clear the list of quarantined domains.
+ Services.prefs.setStringPref("extensions.quarantinedDomains.list", "");
+
+ await openExtensionsPanel();
+ Assert.equal(getMessageBars().length, 0, "expected no message");
+ await closeExtensionsPanel();
+ }
+ );
+
+ await extension.unload();
+ await SpecialPowers.popPrefEnv();
+});
+
+add_task(async function test_quarantined_domain_message_learn_more_link() {
+ const quarantinedDomain = "example.org";
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["extensions.quarantinedDomains.enabled", true],
+ ["extensions.quarantinedDomains.list", quarantinedDomain],
+ ],
+ });
+
+ // Load an extension that will have access to all domains, including the
+ // quarantined domain.
+ const extension = ExtensionTestUtils.loadExtension({
+ manifest: {
+ permissions: ["activeTab"],
+ browser_action: {},
+ },
+ });
+ await extension.startup();
+
+ const expectedSupportURL =
+ Services.urlFormatter.formatURLPref("app.support.baseURL") +
+ "quarantined-domains";
+
+ // We expect the SUMO page to be open in a new tab and the panel to be closed
+ // when the user clicks on the "learn more" link.
+ await BrowserTestUtils.withNewTab(
+ { gBrowser, url: `https://${quarantinedDomain}/` },
+ async () => {
+ await openExtensionsPanel();
+ const messages = getMessageBars();
+ Assert.equal(messages.length, 1, "expected a message");
+
+ const [message] = messages;
+ verifyMessageBar(message);
+
+ const tabPromise = BrowserTestUtils.waitForNewTab(
+ gBrowser,
+ expectedSupportURL
+ );
+ const hidden = BrowserTestUtils.waitForEvent(
+ gUnifiedExtensions.panel,
+ "popuphidden",
+ true
+ );
+ message.querySelector("a").click();
+ const [tab] = await Promise.all([tabPromise, hidden]);
+ BrowserTestUtils.removeTab(tab);
+ }
+ );
+
+ // Same as above but with keyboard navigation.
+ await BrowserTestUtils.withNewTab(
+ { gBrowser, url: `https://${quarantinedDomain}/` },
+ async () => {
+ await openExtensionsPanel();
+ const messages = getMessageBars();
+ Assert.equal(messages.length, 1, "expected a message");
+
+ const [message] = messages;
+ verifyMessageBar(message);
+
+ const supportLink = message.querySelector("a");
+
+ // Focus the "learn more" (support) link.
+ const focused = BrowserTestUtils.waitForEvent(supportLink, "focus");
+ EventUtils.synthesizeKey("VK_TAB", {});
+ await focused;
+
+ const tabPromise = BrowserTestUtils.waitForNewTab(
+ gBrowser,
+ expectedSupportURL
+ );
+ const hidden = BrowserTestUtils.waitForEvent(
+ gUnifiedExtensions.panel,
+ "popuphidden",
+ true
+ );
+ EventUtils.synthesizeKey("KEY_Enter", {});
+ const [tab] = await Promise.all([tabPromise, hidden]);
+ BrowserTestUtils.removeTab(tab);
+ }
+ );
+
+ await extension.unload();
+ await SpecialPowers.popPrefEnv();
+});