summaryrefslogtreecommitdiffstats
path: root/browser/components/protections/test/browser/browser_protections_vpn.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/protections/test/browser/browser_protections_vpn.js')
-rw-r--r--browser/components/protections/test/browser/browser_protections_vpn.js282
1 files changed, 282 insertions, 0 deletions
diff --git a/browser/components/protections/test/browser/browser_protections_vpn.js b/browser/components/protections/test/browser/browser_protections_vpn.js
new file mode 100644
index 0000000000..9a174c07bf
--- /dev/null
+++ b/browser/components/protections/test/browser/browser_protections_vpn.js
@@ -0,0 +1,282 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+const { AboutProtectionsParent } = ChromeUtils.importESModule(
+ "resource:///actors/AboutProtectionsParent.sys.mjs"
+);
+
+let { Region } = ChromeUtils.importESModule(
+ "resource://gre/modules/Region.sys.mjs"
+);
+
+const initialHomeRegion = Region._home;
+const initialCurrentRegion = Region._current;
+
+async function checkVPNCardVisibility(tab, shouldBeHidden, subscribed = false) {
+ await SpecialPowers.spawn(
+ tab.linkedBrowser,
+ [{ _shouldBeHidden: shouldBeHidden, _subscribed: subscribed }],
+ async function ({ _shouldBeHidden, _subscribed }) {
+ await ContentTaskUtils.waitForCondition(() => {
+ const vpnCard = content.document.querySelector(".vpn-card");
+ const subscribedStateCorrect =
+ vpnCard.classList.contains("subscribed") == _subscribed;
+ return (
+ ContentTaskUtils.is_hidden(vpnCard) === _shouldBeHidden &&
+ subscribedStateCorrect
+ );
+ });
+
+ const visibilityState = _shouldBeHidden ? "hidden" : "shown";
+ ok(true, `VPN card is ${visibilityState}.`);
+ }
+ );
+}
+
+async function checkVPNPromoBannerVisibility(tab, shouldBeHidden) {
+ await SpecialPowers.spawn(
+ tab.linkedBrowser,
+ [{ _shouldBeHidden: shouldBeHidden }],
+ async function ({ _shouldBeHidden }) {
+ await ContentTaskUtils.waitForCondition(() => {
+ const vpnBanner = content.document.querySelector(".vpn-banner");
+ return ContentTaskUtils.is_hidden(vpnBanner) === _shouldBeHidden;
+ });
+
+ const visibilityState = _shouldBeHidden ? "hidden" : "shown";
+ ok(true, `VPN banner is ${visibilityState}.`);
+ }
+ );
+}
+
+async function setCurrentRegion(region) {
+ Region._setCurrentRegion(region);
+}
+
+async function setHomeRegion(region) {
+ // _setHomeRegion sets a char pref to the value of region. A non-string value will result in an error, so default to an empty string when region is falsey.
+ Region._setHomeRegion(region || "");
+}
+
+async function revertRegions() {
+ setCurrentRegion(initialCurrentRegion);
+ setHomeRegion(initialHomeRegion);
+}
+
+add_setup(async function () {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["browser.contentblocking.report.monitor.enabled", false],
+ ["browser.contentblocking.report.lockwise.enabled", false],
+ ["browser.vpn_promo.enabled", true],
+ ],
+ });
+ AboutProtectionsParent.setTestOverride(getVPNOverrides(false));
+ setCurrentRegion("us");
+ const avLocales = Services.locale.availableLocales;
+
+ registerCleanupFunction(() => {
+ Services.locale.availableLocales = avLocales;
+ });
+});
+
+add_task(async function testVPNCardVisibility() {
+ AboutProtectionsParent.setTestOverride(getVPNOverrides(false));
+ await promiseSetHomeRegion("us");
+ setCurrentRegion("us");
+
+ let tab = await BrowserTestUtils.openNewForegroundTab({
+ url: "about:protections",
+ gBrowser,
+ });
+
+ info("Enable showing the VPN card");
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["browser.vpn_promo.enabled", true],
+ ["browser.contentblocking.report.vpn_regions", "us,ca,nz,sg,my,gb"],
+ [
+ "browser.vpn_promo.disallowed_regions",
+ "ae,by,cn,cu,iq,ir,kp,om,ru,sd,sy,tm,tr,ua",
+ ],
+ ],
+ });
+
+ info(
+ "Check that vpn card is hidden if neither the user's home nor current location is on the regions list."
+ );
+ AboutProtectionsParent.setTestOverride(getVPNOverrides(false));
+ setCurrentRegion("ls");
+ await promiseSetHomeRegion("ls");
+ await BrowserTestUtils.reloadTab(tab);
+ await checkVPNCardVisibility(tab, true);
+
+ info(
+ "Check that vpn card is hidden if user's location is in the list of disallowed regions."
+ );
+ AboutProtectionsParent.setTestOverride(getVPNOverrides(false));
+ setCurrentRegion("sy");
+ await BrowserTestUtils.reloadTab(tab);
+ await checkVPNCardVisibility(tab, true);
+
+ info(
+ "Check that vpn card shows a different version if user has subscribed to Mozilla vpn."
+ );
+ AboutProtectionsParent.setTestOverride(getVPNOverrides(true));
+ setCurrentRegion("us");
+ await BrowserTestUtils.reloadTab(tab);
+ await checkVPNCardVisibility(tab, false, true);
+
+ info(
+ "VPN card should be hidden when vpn not enabled, though all other conditions are true"
+ );
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.vpn_promo.enabled", false]],
+ });
+ await BrowserTestUtils.reloadTab(tab);
+ await checkVPNCardVisibility(tab, true);
+
+ await BrowserTestUtils.removeTab(tab);
+ revertRegions();
+});
+
+add_task(async function testVPNPromoBanner() {
+ AboutProtectionsParent.setTestOverride(getVPNOverrides(false));
+
+ let tab = await BrowserTestUtils.openNewForegroundTab({
+ url: "about:protections",
+ gBrowser,
+ });
+
+ info("Enable showing the VPN card and banner");
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["browser.vpn_promo.enabled", true],
+ ["browser.contentblocking.report.vpn_regions", "us,ca,nz,sg,my,gb"],
+ [
+ "browser.vpn_promo.disallowed_regions",
+ "ae,by,cn,cu,iq,ir,kp,om,ru,sd,sy,tm,tr,ua",
+ ],
+ ["browser.contentblocking.report.hide_vpn_banner", false],
+ ],
+ });
+
+ info("Check that vpn banner is shown if user's region is supported");
+ setCurrentRegion("us");
+ await BrowserTestUtils.reloadTab(tab);
+ await checkVPNPromoBannerVisibility(tab, false);
+
+ is(
+ Services.prefs.getBoolPref(
+ "browser.contentblocking.report.hide_vpn_banner",
+ false
+ ),
+ true,
+ "After showing the banner once, the pref to hide the VPN banner is flipped"
+ );
+ info("The banner does not show when the pref to hide it is flipped");
+ await BrowserTestUtils.reloadTab(tab);
+ await checkVPNPromoBannerVisibility(tab, true);
+
+ // VPN Banner flips this pref each time it shows, flip back between each instruction.
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.contentblocking.report.hide_vpn_banner", false]],
+ });
+
+ info(
+ "Check that VPN banner is hidden if user's location is not on the regions list."
+ );
+ AboutProtectionsParent.setTestOverride(getVPNOverrides(false));
+ setCurrentRegion("ls");
+ await setHomeRegion("ls'");
+ await BrowserTestUtils.reloadTab(tab);
+ await checkVPNPromoBannerVisibility(tab, true);
+
+ info(
+ "Check that VPN banner is hidden if user's location is in the disallowed regions list."
+ );
+ AboutProtectionsParent.setTestOverride(getVPNOverrides(false));
+ setCurrentRegion("sy");
+ await BrowserTestUtils.reloadTab(tab);
+ await checkVPNPromoBannerVisibility(tab, true);
+
+ info(
+ "VPN banner should be hidden when vpn not enabled, though all other conditions are true"
+ );
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["browser.vpn_promo.enabled", false],
+ ["browser.contentblocking.report.hide_vpn_banner", false],
+ ],
+ });
+ await BrowserTestUtils.reloadTab(tab);
+ await checkVPNPromoBannerVisibility(tab, true);
+
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["browser.vpn_promo.enabled", true],
+ ["browser.contentblocking.report.hide_vpn_banner", false],
+ ],
+ });
+
+ info("If user is subscribed to VPN already the promo banner should not show");
+ AboutProtectionsParent.setTestOverride(getVPNOverrides(true));
+ setCurrentRegion("us");
+ await BrowserTestUtils.reloadTab(tab);
+ await checkVPNPromoBannerVisibility(tab, true);
+
+ await BrowserTestUtils.removeTab(tab);
+ revertRegions();
+});
+
+// Expect the vpn card and banner to not show as we are expressly excluding China. Even when cn is in the supported region pref.
+add_task(async function testVPNDoesNotShowChina() {
+ AboutProtectionsParent.setTestOverride(getVPNOverrides(false));
+ setCurrentRegion("us");
+ let tab = await BrowserTestUtils.openNewForegroundTab({
+ url: "about:protections",
+ gBrowser,
+ });
+
+ info("Enable showing the VPN card and banners");
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["browser.vpn_promo.enabled", true],
+ ["browser.contentblocking.report.vpn_regions", "us,ca,nz,sg,my,gb,cn"],
+ [
+ "browser.vpn_promo.disallowed_regions",
+ "ae,by,cn,cu,iq,ir,kp,om,ru,sd,sy,tm,tr,ua",
+ ],
+ ["browser.contentblocking.report.hide_vpn_banner", false],
+ ],
+ });
+
+ info(
+ "set home location to China, even though user is currently in the US, expect vpn card to be hidden"
+ );
+ await promiseSetHomeRegion("CN");
+ await BrowserTestUtils.reloadTab(tab);
+ await checkVPNPromoBannerVisibility(tab, true);
+ await BrowserTestUtils.reloadTab(tab);
+ await checkVPNCardVisibility(tab, true);
+
+ // VPN Banner flips this pref each time it shows, flip back between each instruction.
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.contentblocking.report.hide_vpn_banner", false]],
+ });
+
+ info("home region is US, but current location is China");
+ AboutProtectionsParent.setTestOverride(getVPNOverrides(false));
+ await promiseSetHomeRegion("US");
+ setCurrentRegion("CN");
+ await BrowserTestUtils.reloadTab(tab);
+ await checkVPNPromoBannerVisibility(tab, true);
+ await BrowserTestUtils.reloadTab(tab);
+ await checkVPNCardVisibility(tab, true);
+
+ await BrowserTestUtils.removeTab(tab);
+ revertRegions();
+});