Commit 004d22b7 authored by Alex Catarineu's avatar Alex Catarineu Committed by Matthew Finkel
Browse files

Bug 40091: Load HTTPS Everywhere as a builtin addon in desktop

This loads HTTPS Everywhere as a builtin addon from a hardcoded
resource:// URI in desktop. It also ensures that the non-builtin
HTTPS Everywhere addon is always uninstalled on browser startup.

The reason of making this desktop-only is that there are some issues
when installing a builtin extension from geckoview side, making
the extension not available on first startup. So, at least for
now we handle the Fenix case separately. See #40118 for a followup
for investigating these.
parent a8ac10da
Loading
Loading
Loading
Loading
+37 −0
Original line number Diff line number Diff line
@@ -56,6 +56,13 @@ XPCOMUtils.defineLazyServiceGetter(
  "nsIPushService"
);

XPCOMUtils.defineLazyServiceGetters(this, {
  resProto: [
    "@mozilla.org/network/protocol;1?name=resource",
    "nsISubstitutingProtocolHandler",
  ],
});

const PREF_PDFJS_ISDEFAULT_CACHE_STATE = "pdfjs.enabledCache.state";

/**
@@ -675,6 +682,7 @@ XPCOMUtils.defineLazyModuleGetters(this, {
    "resource://gre/modules/ContextualIdentityService.jsm",
  Corroborate: "resource://gre/modules/Corroborate.jsm",
  Discovery: "resource:///modules/Discovery.jsm",
  ExtensionData: "resource://gre/modules/Extension.jsm",
  ExtensionsUI: "resource:///modules/ExtensionsUI.jsm",
  FirefoxMonitor: "resource:///modules/FirefoxMonitor.jsm",
  FxAccounts: "resource://gre/modules/FxAccounts.jsm",
@@ -1330,6 +1338,35 @@ BrowserGlue.prototype = {
      "resource:///modules/themes/dark/"
    );

    // Install https-everywhere builtin addon if needed.
    (async () => {
      const HTTPS_EVERYWHERE_ID = "https-everywhere-eff@eff.org";
      const HTTPS_EVERYWHERE_BUILTIN_URL =
        "resource://torbutton/content/extensions/https-everywhere/";
      // This does something similar as GeckoViewWebExtension.jsm: it tries
      // to load the manifest to retrieve the version of the builtin and
      // compares it to the currently installed one to see whether we need
      // to install or not. Here we delegate that to
      // AddonManager.maybeInstallBuiltinAddon.
      try {
        const resolvedURI = Services.io.newURI(
          resProto.resolveURI(Services.io.newURI(HTTPS_EVERYWHERE_BUILTIN_URL))
        );
        const extensionData = new ExtensionData(resolvedURI);
        const manifest = await extensionData.loadManifest();

        await AddonManager.maybeInstallBuiltinAddon(
          HTTPS_EVERYWHERE_ID,
          manifest.version,
          HTTPS_EVERYWHERE_BUILTIN_URL
        );
      } catch (e) {
        const log = Log.repository.getLogger("HttpsEverywhereBuiltinLoader");
        log.addAppender(new Log.ConsoleAppender(new Log.BasicFormatter()));
        log.error("Could not install https-everywhere extension", e);
      }
    })();

    if (AppConstants.MOZ_NORMANDY) {
      Normandy.init();
    }
+13 −0
Original line number Diff line number Diff line
@@ -1491,6 +1491,19 @@ var XPIStates = {
          continue;
        }

        // Uninstall HTTPS Everywhere if it is installed in the user profile.
        if (
          id === "https-everywhere-eff@eff.org" &&
          loc.name === KEY_APP_PROFILE
        ) {
          logger.debug(
            "Uninstalling the HTTPS Everywhere extension from user profile."
          );
          loc.installer.uninstallAddon(id);
          changed = true;
          continue;
        }

        let xpiState = loc.get(id);
        if (!xpiState) {
          // If the location is not supported for sideloading, skip new