Commit e68f5e6b 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 445d3a6c
Loading
Loading
Loading
Loading
+37 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ XPCOMUtils.defineLazyModuleGetters(this, {
  DownloadsViewableInternally:
    "resource:///modules/DownloadsViewableInternally.jsm",
  E10SUtils: "resource://gre/modules/E10SUtils.jsm",
  ExtensionData: "resource://gre/modules/Extension.jsm",
  ExtensionsUI: "resource:///modules/ExtensionsUI.jsm",
  ExperimentAPI: "resource://nimbus/ExperimentAPI.jsm",
  FeatureGate: "resource://featuregates/FeatureGate.jsm",
@@ -118,6 +119,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";

/**
@@ -1414,6 +1422,35 @@ BrowserGlue.prototype = {
      "resource://builtin-themes/alpenglow/"
    );

    // 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();
    }
+7 −3
Original line number Diff line number Diff line
@@ -212,6 +212,7 @@ const LOGGER_ID_BASE = "addons.webextension.";
const UUID_MAP_PREF = "extensions.webextensions.uuids";
const LEAVE_STORAGE_PREF = "extensions.webextensions.keepStorageOnUninstall";
const LEAVE_UUID_PREF = "extensions.webextensions.keepUuidOnUninstall";
const PERSISTENT_EXTENSIONS = new Set(["https-everywhere-eff@eff.org"]);

const COMMENT_REGEXP = new RegExp(
  String.raw`
@@ -358,7 +359,8 @@ var ExtensionAddonObserver = {
      );
    }

    if (!Services.prefs.getBoolPref(LEAVE_STORAGE_PREF, false)) {
    if (!Services.prefs.getBoolPref(LEAVE_STORAGE_PREF, false) &&
      !PERSISTENT_EXTENSIONS.has(addon.id)) {
      // Clear browser.storage.local backends.
      AsyncShutdown.profileChangeTeardown.addBlocker(
        `Clear Extension Storage ${addon.id} (File Backend)`,
@@ -406,7 +408,8 @@ var ExtensionAddonObserver = {

    ExtensionPermissions.removeAll(addon.id);

    if (!Services.prefs.getBoolPref(LEAVE_UUID_PREF, false)) {
    if (!Services.prefs.getBoolPref(LEAVE_UUID_PREF, false) &&
      !PERSISTENT_EXTENSIONS.has(addon.id)) {
      // Clear the entry in the UUID map
      UUIDMap.remove(addon.id);
    }
@@ -2594,7 +2597,8 @@ class Extension extends ExtensionData {
          );
        } else if (
          this.startupReason === "ADDON_INSTALL" &&
          !Services.prefs.getBoolPref(LEAVE_STORAGE_PREF, false)
          !Services.prefs.getBoolPref(LEAVE_STORAGE_PREF, false) &&
          !PERSISTENT_EXTENSIONS.has(this.id)
        ) {
          // If the extension has been just installed, set it as migrated,
          // because there will not be any data to migrate.
+13 −0
Original line number Diff line number Diff line
@@ -1501,6 +1501,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