Verified Commit 4e4718b4 authored by ma1's avatar ma1
Browse files

fixup! Bug 40926: Implemented the New Identity feature

Bug 42236: Let users decide whether to load their home page on new identity.
parent 86143252
Loading
Loading
Loading
Loading
+82 −25
Changes for browser/components/newidentity/content/newidentity.js: 82 added lines, 25 removed lines.
Original line number Diff line number Diff line
@@ -10,37 +10,28 @@ XPCOMUtils.defineLazyGetter(this, "NewIdentityStrings", () => {
  );
  const brandShortName = brandBundle.GetStringFromName("brandShortName");

  let strings = {
    new_identity: "New Identity",
    new_identity_sentence_case: "New identity",
    new_identity_prompt_title: "Reset your identity?",
    new_identity_prompt: `${brandShortName} will close all windows and tabs. All website sessions will be lost. \nRestart ${brandShortName} now to reset your identity?`,
    new_identity_restart: `Restart ${brandShortName}`,
    new_identity_ask_again: "Never ask me again",
    new_identity_menu_accesskey: "I",
  };
  let bundle = null;
  const fallbackBundle = Services.strings.createBundle(
    "resource:///chrome/en-US/locale/browser/newIdentity.properties"
  );
  const strings = {};
  const brandedStrings = ["new_identity_prompt", "new_identity_restart"];
  for (let { key } of fallbackBundle.getSimpleEnumeration()) {
    strings[key] = fallbackBundle.GetStringFromName(key);
  }
  try {
    bundle = Services.strings.createBundle(
    const bundle = Services.strings.createBundle(
      "chrome://browser/locale/newIdentity.properties"
    );
  } catch (e) {
    console.warn("Could not load the New Identity strings");
  }
  if (bundle) {
    for (const key of Object.keys(strings)) {
      try {
        strings[key] = bundle.GetStringFromName(key);
      } catch (e) {}
    }
    strings.new_identity_prompt = strings.new_identity_prompt.replaceAll(
      "%S",
      brandShortName
    );
    strings.new_identity_restart = strings.new_identity_restart.replaceAll(
      "%S",
      brandShortName
    );
  } catch (e) {
    console.warn("Could not load localized New Identity strings");
  }
  for (let key of brandedStrings) {
    strings[key] = strings[key].replaceAll("%S", brandShortName);
  }
  return strings;
});
@@ -437,10 +428,76 @@ XPCOMUtils.defineLazyGetter(this, "NewIdentityButton", () => {
      logger.info("Opening a new window");
      return new Promise(resolve => {
        // Open a new window forcing the about:privatebrowsing page (tor-browser#41765)
        const win = OpenBrowserWindow({private: "no-home"});
        // unless user explicitly overrides this policy (tor-browser #42236)
        const homePref = "browser.startup.homepage";
        const trustedHomePref = "browser.startup.homepage.new_identity";
        const homeURL = Services.prefs.getStringPref(homePref, "");
        const isTrustedHome =
          homeURL === "about:tor" ||
          homeURL.startsWith("chrome://") || // about:blank and other built-ins
          homeURL === Services.prefs.getStringPref(trustedHomePref, "");
        const isCustomHome =
          Services.prefs.getIntPref("browser.startup.page") === 1;
        const win = OpenBrowserWindow({
          private: isCustomHome && isTrustedHome ? "private" : "no-home",
        });
        // This mechanism to know when the new window is ready is used by
        // OpenBrowserWindow itself (see its definition in browser.js).
        win.addEventListener("MozAfterPaint", () => resolve(), { once: true });
        win.addEventListener(
          "MozAfterPaint",
          () => {
            resolve();
            if (isTrustedHome || !isCustomHome) {
              return;
            }
            const tbl = win.TabsProgressListener;
            const { onLocationChange } = tbl;
            tbl.onLocationChange = (...args) => {
              tbl.onLocationChange = onLocationChange;
              tbl.onLocationChange(...args);
              let displayAddress;
              try {
                const url = new URL(homeURL);
                displayAddress = url.hostname;
                if (!displayAddress) {
                  // no host, use full address and truncate if too long
                  const MAX_LEN = 32;
                  displayAddress = url.href;
                  if (displayAddress.length > MAX_LEN) {
                    displayAddress = `${displayAddress.substring(0, MAX_LEN)}…`;
                  }
                }
              } catch (e) {
                // malformed URL, bail out
                return;
              }
              const label =
                NewIdentityStrings.new_identity_home_notification.replace(
                  "%S",
                  displayAddress
                );
              const callback = () => {
                Services.prefs.setStringPref(trustedHomePref, homeURL);
                win.BrowserHome();
              };
              const notificationBox = win.gBrowser.getNotificationBox();
              notificationBox.appendNotification(
                "new-identity-safe-home",
                {
                  label,
                  priority: notificationBox.PRIORITY_INFO_MEDIUM,
                },
                [
                  {
                    label: NewIdentityStrings.new_identity_home_load_button,
                    callback,
                  },
                ]
              );
            };
          },
          { once: true }
        );
      });
    }

+3 −0
Changes for browser/locales/en-US/chrome/browser/newIdentity.properties: 3 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -8,3 +8,6 @@ new_identity_restart = Restart %S
new_identity_ask_again = Never ask me again
# Shown in the File menu (use Alt to show File, if you do not see)
new_identity_menu_accesskey = I
new_identity_home_notification = Tor Browser blocked your homepage (%S) from loading because it might recognize your previous session.
# %S is replaced with the custom homepage URL's domain if applicable, or some short-hand of it otherwise
new_identity_home_load_button  = Load it anyway