tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

vpn-card.mjs (3319B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 export default class VPNCard {
      6  constructor(doc) {
      7    this.doc = doc;
      8  }
      9 
     10  init() {
     11    const vpnLink = this.doc.getElementById("get-vpn-link");
     12    const vpnBannerLink = this.doc.getElementById("vpn-banner-link");
     13    vpnLink.href = RPMGetStringPref(
     14      "browser.contentblocking.report.vpn.url",
     15      ""
     16    );
     17    vpnBannerLink.href = RPMGetStringPref(
     18      "browser.contentblocking.report.vpn-promo.url",
     19      ""
     20    );
     21 
     22    vpnLink.addEventListener("click", () => {
     23      this.doc.sendTelemetryEvent("clickVpnCardLink");
     24    });
     25    let androidVPNAppLink = document.getElementById(
     26      "vpn-google-playstore-link"
     27    );
     28    androidVPNAppLink.href = RPMGetStringPref(
     29      "browser.contentblocking.report.vpn-android.url"
     30    );
     31    androidVPNAppLink.addEventListener("click", () => {
     32      document.sendTelemetryEvent("clickVpnAppLinkAndroid");
     33    });
     34    let iosVPNAppLink = document.getElementById("vpn-app-store-link");
     35    iosVPNAppLink.href = RPMGetStringPref(
     36      "browser.contentblocking.report.vpn-ios.url"
     37    );
     38    iosVPNAppLink.addEventListener("click", () => {
     39      document.sendTelemetryEvent("clickVpnAppLinkIos");
     40    });
     41 
     42    const vpnBanner = this.doc.querySelector(".vpn-banner");
     43    const exitIcon = vpnBanner.querySelector(".exit-icon");
     44    vpnBannerLink.addEventListener("click", () => {
     45      this.doc.sendTelemetryEvent("clickVpnBannerLink");
     46    });
     47    // User has closed the vpn banner, hide it.
     48    exitIcon.addEventListener("click", () => {
     49      vpnBanner.classList.add("hidden");
     50      this.doc.sendTelemetryEvent("clickVpnBannerClose");
     51    });
     52 
     53    this.showVPNCard();
     54  }
     55 
     56  // Show the VPN card if user is located in areas, and on platforms, it serves
     57  async showVPNCard() {
     58    const showVPNBanner = this.showVPNBanner.bind(this);
     59    RPMSendQuery("FetchShowVPNCard", {}).then(shouldShow => {
     60      if (!shouldShow) {
     61        return;
     62      }
     63      const vpnCard = this.doc.querySelector(".vpn-card");
     64 
     65      // add 'subscribed' class if user is subscribed to vpn
     66      RPMSendQuery("FetchVPNSubStatus", {}).then(async hasVPN => {
     67        if (hasVPN) {
     68          vpnCard.classList.add("subscribed");
     69          document.l10n.setAttributes(
     70            vpnCard.querySelector(".card-title"),
     71            "vpn-title-subscribed"
     72          );
     73 
     74          // hide the promo banner if the user is already subscribed to vpn
     75          await RPMSetPref(
     76            "browser.contentblocking.report.hide_vpn_banner",
     77            true
     78          );
     79        }
     80 
     81        vpnCard.classList.remove("hidden");
     82        showVPNBanner();
     83      });
     84    });
     85  }
     86 
     87  showVPNBanner() {
     88    if (
     89      RPMGetBoolPref("browser.contentblocking.report.hide_vpn_banner", false) ||
     90      !RPMGetBoolPref("browser.vpn_promo.enabled", false)
     91    ) {
     92      return;
     93    }
     94 
     95    const vpnBanner = this.doc.querySelector(".vpn-banner");
     96    vpnBanner.classList.remove("hidden");
     97    this.doc.sendTelemetryEvent("showVpnBanner");
     98    // VPN banner only shows on the first visit, flip a pref so it does not show again.
     99    RPMSetPref("browser.contentblocking.report.hide_vpn_banner", true);
    100  }
    101 }