[tbb-commits] [tor-browser/tor-browser-91.5.0esr-11.5-2] Bug 10760: Integrate TorButton to TorBrowser core

richard at torproject.org richard at torproject.org
Tue Feb 1 13:45:17 UTC 2022


commit cb3cd953f3bbe90d9bc1a66d8c1af04c9ce6bf91
Author: Alex Catarineu <acat at torproject.org>
Date:   Wed Feb 19 23:05:08 2020 +0100

    Bug 10760: Integrate TorButton to TorBrowser core
    
    Because of the non-restartless nature of Torbutton, it required
    a two-stage installation process. On mobile, it was a problem,
    because it was not loading when the user opened the browser for
    the first time.
    
    Moving it to tor-browser and making it a system extension allows it
    to load when the user opens the browser for first time.
    
    Additionally, this patch also fixes Bug 27611.
    
    Bug 26321: New Circuit and New Identity menu items
    
    Bug 14392: Make about:tor behave like other initial pages.
    
    Bug 25013: Add torbutton as a tor-browser submodule
    
    Bug 31575: Replace Firefox Home (newtab) with about:tor
    
    Avoid loading AboutNewTab in BrowserGlue.jsm in order
    to avoid several network requests that we do not need. Besides,
    about:newtab will now point to about:blank or about:tor (depending
    on browser.newtabpage.enabled) and about:home will point to
    about:tor.
---
 .gitmodules                                        |  3 ++
 browser/base/content/aboutDialog.xhtml             | 38 +++++++++++-------
 browser/base/content/appmenu-viewcache.inc.xhtml   | 28 +++++++++++++-
 browser/base/content/browser-doctype.inc           |  6 +++
 browser/base/content/browser-menubar.inc           | 45 ++++++++++++++++------
 browser/base/content/browser-sets.inc              |  2 +
 browser/base/content/browser.js                    |  1 +
 browser/base/content/browser.xhtml                 |  9 +++++
 browser/components/BrowserGlue.jsm                 | 33 +---------------
 .../controlcenter/content/identityPanel.inc.xhtml  | 22 +++++++++++
 browser/components/newtab/AboutNewTabService.jsm   | 15 +-------
 browser/components/preferences/home.inc.xhtml      |  4 +-
 browser/components/preferences/preferences.xhtml   |  5 ++-
 browser/installer/package-manifest.in              |  2 +
 browser/modules/HomePage.jsm                       |  2 +-
 docshell/base/nsAboutRedirector.cpp                |  6 ++-
 docshell/build/components.conf                     |  1 +
 mobile/android/installer/package-manifest.in       |  4 ++
 toolkit/moz.build                                  |  1 +
 .../mozapps/extensions/internal/XPIProvider.jsm    |  9 +++++
 toolkit/torproject/torbutton                       |  1 +
 .../lib/environments/browser-window.js             |  6 ++-
 22 files changed, 166 insertions(+), 77 deletions(-)

diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 000000000000..2f03bd8e22df
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "toolkit/torproject/torbutton"]
+	path = toolkit/torproject/torbutton
+	url = https://git.torproject.org/torbutton.git
diff --git a/browser/base/content/aboutDialog.xhtml b/browser/base/content/aboutDialog.xhtml
index 55c8b1c2c5f7..4eb122b0b2d8 100644
--- a/browser/base/content/aboutDialog.xhtml
+++ b/browser/base/content/aboutDialog.xhtml
@@ -7,11 +7,11 @@
 <?xml-stylesheet href="chrome://global/skin/global.css" type="text/css"?>
 <?xml-stylesheet href="chrome://browser/content/aboutDialog.css" type="text/css"?>
 <?xml-stylesheet href="chrome://branding/content/aboutDialog.css" type="text/css"?>
+<?xml-stylesheet href="chrome://torbutton/skin/aboutDialog.css" type="text/css"?>
 
+<!-- We need to include the localization DTDs until we migrate to Fluent -->
 <!DOCTYPE window [
-#ifdef XP_MACOSX
 #include browser-doctype.inc
-#endif
 ]>
 
 <window xmlns:html="http://www.w3.org/1999/xhtml"
@@ -28,7 +28,7 @@
         data-l10n-id="aboutDialog-title"
 #endif
         role="dialog"
-        aria-describedby="version distribution distributionId communityDesc contributeDesc trademark"
+        aria-describedby="version distribution distributionId projectDesc helpDesc trademark trademarkTor"
         >
 #ifdef XP_MACOSX
 #include macWindow.inc.xhtml
@@ -146,24 +146,36 @@
               <label is="text-link" useoriginprincipal="true" href="about:credits" data-l10n-name="community-exp-creditsLink"/>
             </description>
           </vbox>
-          <description class="text-blurb" id="communityDesc" data-l10n-id="community-2">
-            <label is="text-link" href="https://www.mozilla.org/?utm_source=firefox-browser&utm_medium=firefox-desktop&utm_campaign=about-dialog" data-l10n-name="community-mozillaLink"/>
-            <label is="text-link" useoriginprincipal="true" href="about:credits" data-l10n-name="community-creditsLink"/>
+          <!-- Keep communityDesc and contributeDesc to avoid JS errors trying to hide them -->
+          <description class="text-blurb" id="communityDesc" data-l10n-id="community-2" hidden="true"></description>
+          <description class="text-blurb" id="contributeDesc" data-l10n-id="helpus" hidden="true"></description>
+          <description class="text-blurb" id="projectDesc">
+            &project.start;
+            <label is="text-link" href="https://www.torproject.org/">
+              &project.tpoLink;
+            </label>&project.end;
           </description>
-          <description class="text-blurb" id="contributeDesc" data-l10n-id="helpus">
-            <label is="text-link" href="https://donate.mozilla.org/?utm_source=firefox&utm_medium=referral&utm_campaign=firefox_about&utm_content=firefox_about" data-l10n-name="helpus-donateLink"/>
-            <label is="text-link" href="https://www.mozilla.org/contribute/?utm_source=firefox-browser&utm_medium=firefox-desktop&utm_campaign=about-dialog" data-l10n-name="helpus-getInvolvedLink"/>
+          <description class="text-blurb" id="helpDesc">
+            &help.start;
+            <label is="text-link" href="https://donate.torproject.org/">
+              &help.donateLink;
+            </label>
+            &help.or;
+            <label is="text-link" href="https://community.torproject.org/">
+              &help.getInvolvedLink;
+            </label>&help.end;
           </description>
         </vbox>
       </vbox>
     </hbox>
     <vbox id="bottomBox">
-      <hbox pack="center">
-        <label is="text-link" class="bottom-link" useoriginprincipal="true" href="about:license" data-l10n-id="bottomLinks-license"/>
-        <label is="text-link" class="bottom-link" useoriginprincipal="true" href="about:rights" data-l10n-id="bottomLinks-rights"/>
-        <label is="text-link" class="bottom-link" href="https://www.mozilla.org/privacy/?utm_source=firefox-browser&utm_medium=firefox-desktop&utm_campaign=about-dialog" data-l10n-id="bottomLinks-privacy"/>
+      <hbox id="newBottom" pack="center" position="1">
+        <label is="text-link" class="bottom-link" href="https://support.torproject.org/">&bottomLinks.questions;</label>
+        <label is="text-link" class="bottom-link" href="https://community.torproject.org/relay/">&bottomLinks.grow;</label>
+        <label is="text-link" class="bottom-link" useoriginprincipal="true" href="about:license">&bottomLinks.license;</label>
       </hbox>
       <description id="trademark" data-l10n-id="trademarkInfo"></description>
+      <description id="trademarkTor">&tor.TrademarkStatement;</description>
     </vbox>
   </vbox>
 
diff --git a/browser/base/content/appmenu-viewcache.inc.xhtml b/browser/base/content/appmenu-viewcache.inc.xhtml
index 895ef976fc23..a473509f1647 100644
--- a/browser/base/content/appmenu-viewcache.inc.xhtml
+++ b/browser/base/content/appmenu-viewcache.inc.xhtml
@@ -45,7 +45,8 @@
                      class="subviewbutton subviewbutton-iconic"
                      data-l10n-id="appmenuitem-new-private-window"
                      key="key_privatebrowsing"
-                     command="Tools:PrivateBrowsing"/>
+                     command="Tools:PrivateBrowsing"
+                     hidden="true"/>
 #ifdef NIGHTLY_BUILD
       <toolbarbutton id="appMenu-fission-window-button"
                      class="subviewbutton subviewbutton-iconic"
@@ -61,7 +62,19 @@
       <toolbarbutton id="appMenuRestoreLastSession"
                      data-l10n-id="appmenu-restore-session"
                      class="subviewbutton subviewbutton-iconic"
-                     command="Browser:RestoreLastSession"/>
+                     command="Browser:RestoreLastSession"
+                     hidden="true"/>
+      <toolbarseparator/>
+      <toolbarbutton id="appMenuNewIdentity"
+                     class="subviewbutton subviewbutton-iconic"
+                     key="torbutton-new-identity-key"
+                     label="&torbutton.context_menu.new_identity;"
+                     oncommand="torbutton_new_identity();"/>
+      <toolbarbutton id="appMenuNewCircuit"
+                     class="subviewbutton subviewbutton-iconic"
+                     key="torbutton-new-circuit-key"
+                     label="&torbutton.context_menu.new_circuit;"
+                     oncommand="torbutton_new_circuit();"/>
       <toolbarseparator/>
       <toolbaritem id="appMenu-zoom-controls" class="toolbaritem-combined-buttons" closemenu="none">
         <!-- Use a spacer, because panel sizing code gets confused when using CSS methods. -->
@@ -256,6 +269,17 @@
                      key="key_privatebrowsing"
                      command="Tools:PrivateBrowsing"/>
       <toolbarseparator/>
+      <toolbarbutton id="appMenuNewIdentity"
+                     class="subviewbutton"
+                     key="torbutton-new-identity-key"
+                     label="&torbutton.context_menu.new_identity_sentence_case;"
+                     oncommand="torbutton_new_identity();"/>
+      <toolbarbutton id="appMenuNewCircuit"
+                     class="subviewbutton"
+                     key="torbutton-new-circuit-key"
+                     label="&torbutton.context_menu.new_circuit_sentence_case;"
+                     oncommand="torbutton_new_circuit();"/>
+      <toolbarseparator/>
       <toolbarbutton id="appMenu-bookmarks-button"
                      class="subviewbutton subviewbutton-nav"
                      data-l10n-id="library-bookmarks-menu"
diff --git a/browser/base/content/browser-doctype.inc b/browser/base/content/browser-doctype.inc
index cea0382acde2..691d16a7b2e5 100644
--- a/browser/base/content/browser-doctype.inc
+++ b/browser/base/content/browser-doctype.inc
@@ -6,3 +6,9 @@
 %textcontextDTD;
 <!ENTITY % placesDTD SYSTEM "chrome://browser/locale/places/places.dtd">
 %placesDTD;
+<!ENTITY % torbuttonDTD SYSTEM "chrome://torbutton/locale/torbutton.dtd">
+%torbuttonDTD;
+<!ENTITY % aboutTorDTD SYSTEM "chrome://torbutton/locale/aboutTor.dtd">
+%aboutTorDTD;
+<!ENTITY % aboutDialogDTD SYSTEM "chrome://torbutton/locale/aboutDialog.dtd">
+%aboutDialogDTD;
diff --git a/browser/base/content/browser-menubar.inc b/browser/base/content/browser-menubar.inc
index cd348e8e7817..4b7564cea087 100644
--- a/browser/base/content/browser-menubar.inc
+++ b/browser/base/content/browser-menubar.inc
@@ -38,6 +38,18 @@
                           command="Tools:NonFissionWindow"
                           accesskey="s" label="New Non-Fission Window"/>
 #endif
+                <menuseparator/>
+                <menuitem id="menu_newIdentity"
+                          accesskey="&torbutton.context_menu.new_identity_key;"
+                          key="torbutton-new-identity-key"
+                          label="&torbutton.context_menu.new_identity;"
+                          oncommand="torbutton_new_identity();"/>
+                <menuitem id="menu_newCircuit"
+                          accesskey="&torbutton.context_menu.new_circuit_key;"
+                          key="torbutton-new-circuit-key"
+                          label="&torbutton.context_menu.new_circuit;"
+                          oncommand="torbutton_new_circuit();"/>
+                <menuseparator/>
                 <menuitem id="menu_openLocation"
                           hidden="true"
                           command="Browser:OpenLocation"
@@ -463,23 +475,34 @@
               <menupopup id="menu_HelpPopup" onpopupshowing="buildHelpMenu();">
 <!-- Note: Items under here are cloned to the AppMenu Help submenu. The cloned items
      have their strings defined by appmenu-data-l10n-id. -->
-                <menuitem id="menu_openHelp"
+                <!-- dummy elements to avoid 'getElementById' errors -->
+                <box id="feedbackPage"/>
+                <box id="helpSafeMode"/>
+                <box id="menu_HelpPopup_reportPhishingtoolmenu"/>
+                <box id="menu_HelpPopup_reportPhishingErrortoolmenu"/>
+                <!-- Add Tor Browser manual link -->
+                <menuitem id="torBrowserUserManual"
+                          oncommand="gBrowser.selectedTab = gBrowser.addTab('https://tb-manual.torproject.org/' + Services.locale.requestedLocale, {triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()});"
+                          label="&aboutTor.torbrowser_user_manual.label;"
+                          accesskey="&aboutTor.torbrowser_user_manual.accesskey;"/>
+                <!-- Bug 18905: Hide unused help menu items -->
+                <!-- <menuitem id="menu_openHelp"
                           oncommand="openHelpLink('firefox-help')"
                           data-l10n-id="menu-get-help"
                           appmenu-data-l10n-id="appmenu-get-help"
 #ifdef XP_MACOSX
-                          key="key_openHelpMac"/>
+                          key="key_openHelpMac"/> -->
 #else
-                          />
+                          /> -->
 #endif
-                <menuitem id="feedbackPage"
+                <!-- <menuitem id="feedbackPage"
                           oncommand="openFeedbackPage()"
                           data-l10n-id="menu-help-feedback-page"
-                          appmenu-data-l10n-id="appmenu-help-feedback-page"/>
-                <menuitem id="helpSafeMode"
+                          appmenu-data-l10n-id="appmenu-help-feedback-page"/> -->
+                <!-- <menuitem id="helpSafeMode"
                           oncommand="safeModeRestart();"
                           data-l10n-id="menu-help-enter-troubleshoot-mode2"
-                          appmenu-data-l10n-id="appmenu-help-enter-troubleshoot-mode2"/>
+                          appmenu-data-l10n-id="appmenu-help-enter-troubleshoot-mode2"/> -->
                 <menuitem id="troubleShooting"
                           oncommand="openTroubleshootingPage()"
                           data-l10n-id="menu-help-more-troubleshooting-info"
@@ -489,18 +512,18 @@
                           data-l10n-id="menu-help-report-site-issue"
                           appmenu-data-l10n-id="appmenu-help-report-site-issue"
                           hidden="true"/>
-                <menuitem id="menu_HelpPopup_reportPhishingtoolmenu"
+                <!-- <menuitem id="menu_HelpPopup_reportPhishingtoolmenu"
                           disabled="true"
                           oncommand="openUILink(gSafeBrowsing.getReportURL('Phish'), event, {triggeringPrincipal: Services.scriptSecurityManager.createNullPrincipal({})});"
                           hidden="true"
                           data-l10n-id="menu-help-report-deceptive-site"
-                          appmenu-data-l10n-id="appmenu-help-report-deceptive-site"/>
-                <menuitem id="menu_HelpPopup_reportPhishingErrortoolmenu"
+                          appmenu-data-l10n-id="appmenu-help-report-deceptive-site"/> -->
+                <!-- <menuitem id="menu_HelpPopup_reportPhishingErrortoolmenu"
                           disabled="true"
                           oncommand="ReportFalseDeceptiveSite();"
                           data-l10n-id="menu-help-not-deceptive"
                           appmenu-data-l10n-id="appmenu-help-not-deceptive"
-                          hidden="true"/>
+                          hidden="true"/> -->
                 <menuseparator id="aboutSeparator"/>
                 <menuitem id="aboutName"
                           oncommand="openAboutDialog();"
diff --git a/browser/base/content/browser-sets.inc b/browser/base/content/browser-sets.inc
index fdd83f64896e..c3129d6aae07 100644
--- a/browser/base/content/browser-sets.inc
+++ b/browser/base/content/browser-sets.inc
@@ -383,4 +383,6 @@
          data-l10n-id="hide-other-apps-shortcut"
          modifiers="accel,alt"/>
 #endif
+    <key id="torbutton-new-identity-key" modifiers="accel shift" key="U" oncommand="torbutton_new_identity()"/>
+    <key id="torbutton-new-circuit-key" modifiers="accel shift" key="L" oncommand="torbutton_new_circuit()"/>
   </keyset>
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
index 90abfb43da02..f823ce536c5d 100644
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -633,6 +633,7 @@ var gPageIcons = {
 };
 
 var gInitialPages = [
+  "about:tor",
   "about:blank",
   "about:newtab",
   "about:home",
diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml
index 82fd0d32d670..8efb544918b8 100644
--- a/browser/base/content/browser.xhtml
+++ b/browser/base/content/browser.xhtml
@@ -29,6 +29,8 @@
 <?xml-stylesheet href="chrome://browser/skin/searchbar.css" type="text/css"?>
 <?xml-stylesheet href="chrome://browser/skin/places/tree-icons.css" type="text/css"?>
 <?xml-stylesheet href="chrome://browser/skin/places/editBookmark.css" type="text/css"?>
+<?xml-stylesheet href="chrome://torbutton/skin/tor-circuit-display.css" type="text/css"?>
+<?xml-stylesheet href="chrome://torbutton/skin/torbutton.css" type="text/css"?>
 
 # All DTD information is stored in a separate file so that it can be shared by
 # hiddenWindowMac.xhtml.
@@ -106,11 +108,18 @@
   Services.scriptloader.loadSubScript("chrome://browser/content/places/places-menupopup.js", this);
   Services.scriptloader.loadSubScript("chrome://browser/content/search/autocomplete-popup.js", this);
   Services.scriptloader.loadSubScript("chrome://browser/content/search/searchbar.js", this);
+  Services.scriptloader.loadSubScript("chrome://torbutton/content/tor-circuit-display.js", this);
+  Services.scriptloader.loadSubScript("chrome://torbutton/content/torbutton.js", this);
 
   window.onload = gBrowserInit.onLoad.bind(gBrowserInit);
   window.onunload = gBrowserInit.onUnload.bind(gBrowserInit);
   window.onclose = WindowIsClosing;
 
+  //onLoad Handler
+  try {
+    window.addEventListener("load", torbutton_init, false);
+  } catch (e) {}
+
   window.addEventListener("MozBeforeInitialXULLayout",
     gBrowserInit.onBeforeInitialXULLayout.bind(gBrowserInit), { once: true });
 
diff --git a/browser/components/BrowserGlue.jsm b/browser/components/BrowserGlue.jsm
index e3b29f47f8cb..0386e4159eeb 100644
--- a/browser/components/BrowserGlue.jsm
+++ b/browser/components/BrowserGlue.jsm
@@ -20,7 +20,6 @@ const { AppConstants } = ChromeUtils.import(
 Cu.importGlobalProperties(["Glean"]);
 
 XPCOMUtils.defineLazyModuleGetters(this, {
-  AboutNewTab: "resource:///modules/AboutNewTab.jsm",
   ActorManagerParent: "resource://gre/modules/ActorManagerParent.jsm",
   AddonManager: "resource://gre/modules/AddonManager.jsm",
   AppMenuNotifications: "resource://gre/modules/AppMenuNotifications.jsm",
@@ -211,28 +210,6 @@ let JSWINDOWACTORS = {
     matches: ["about:logins", "about:logins?*", "about:loginsimportreport"],
   },
 
-  AboutNewTab: {
-    parent: {
-      moduleURI: "resource:///actors/AboutNewTabParent.jsm",
-    },
-    child: {
-      moduleURI: "resource:///actors/AboutNewTabChild.jsm",
-      events: {
-        DOMContentLoaded: {},
-        pageshow: {},
-        visibilitychange: {},
-      },
-    },
-    // The wildcard on about:newtab is for the ?endpoint query parameter
-    // that is used for snippets debugging. The wildcard for about:home
-    // is similar, and also allows for falling back to loading the
-    // about:home document dynamically if an attempt is made to load
-    // about:home?jscache from the AboutHomeStartupCache as a top-level
-    // load.
-    matches: ["about:home*", "about:welcome", "about:newtab*"],
-    remoteTypes: ["privilegedabout"],
-  },
-
   AboutPlugins: {
     parent: {
       moduleURI: "resource:///actors/AboutPluginsParent.jsm",
@@ -1617,8 +1594,6 @@ BrowserGlue.prototype = {
 
   // the first browser window has finished initializing
   _onFirstWindowLoaded: function BG__onFirstWindowLoaded(aWindow) {
-    AboutNewTab.init();
-
     TabCrashHandler.init();
 
     ProcessHangMonitor.init();
@@ -5319,12 +5294,8 @@ var AboutHomeStartupCache = {
       return { pageInputStream: null, scriptInputStream: null };
     }
 
-    let state = AboutNewTab.activityStream.store.getState();
-    return new Promise(resolve => {
-      this._cacheDeferred = resolve;
-      this.log.trace("Parent is requesting cache streams.");
-      this._procManager.sendAsyncMessage(this.CACHE_REQUEST_MESSAGE, { state });
-    });
+    this.log.error("Activity Stream is disabled in Tor Browser.");
+    return { pageInputStream: null, scriptInputStream: null };
   },
 
   /**
diff --git a/browser/components/controlcenter/content/identityPanel.inc.xhtml b/browser/components/controlcenter/content/identityPanel.inc.xhtml
index 9a41ac1f33cc..06511866ae29 100644
--- a/browser/components/controlcenter/content/identityPanel.inc.xhtml
+++ b/browser/components/controlcenter/content/identityPanel.inc.xhtml
@@ -92,6 +92,28 @@
         </vbox>
       </hbox>
 
+      <!-- Circuit display section -->
+
+      <vbox id="circuit-display-container" class="identity-popup-section">
+        <toolbarseparator/>
+        <vbox id="circuit-display-header" flex="1" role="group"
+              aria-labelledby="circuit-display-headline">
+          <hbox flex="1">
+            <label id="circuit-display-headline"
+                   role="heading" aria-level="2">&torbutton.circuit_display.title;</label>
+          </hbox>
+        </vbox>
+        <vbox id="circuit-display-content">
+          <html:ul id="circuit-display-nodes" dir="auto"/>
+          <hbox id="circuit-guard-note-container"/>
+          <hbox id="circuit-reload-button-container">
+            <html:button id="circuit-reload-button"
+                    onclick="torbutton_new_circuit()"
+                    default="true">&torbutton.circuit_display.new_circuit;</html:button>
+          </hbox>
+        </vbox>
+      </vbox>
+
       <!-- Clear Site Data Button -->
       <vbox hidden="true"
             id="identity-popup-clear-sitedata-footer">
diff --git a/browser/components/newtab/AboutNewTabService.jsm b/browser/components/newtab/AboutNewTabService.jsm
index 44308daa2b2d..d98c014e3f9e 100644
--- a/browser/components/newtab/AboutNewTabService.jsm
+++ b/browser/components/newtab/AboutNewTabService.jsm
@@ -420,20 +420,7 @@ class BaseAboutNewTabService {
    * the newtab page has no effect on the result of this function.
    */
   get defaultURL() {
-    // Generate the desired activity stream resource depending on state, e.g.,
-    // "resource://activity-stream/prerendered/activity-stream.html"
-    // "resource://activity-stream/prerendered/activity-stream-debug.html"
-    // "resource://activity-stream/prerendered/activity-stream-noscripts.html"
-    return [
-      "resource://activity-stream/prerendered/",
-      "activity-stream",
-      // Debug version loads dev scripts but noscripts separately loads scripts
-      this.activityStreamDebug && !this.privilegedAboutProcessEnabled
-        ? "-debug"
-        : "",
-      this.privilegedAboutProcessEnabled ? "-noscripts" : "",
-      ".html",
-    ].join("");
+    return "about:tor";
   }
 
   get welcomeURL() {
diff --git a/browser/components/preferences/home.inc.xhtml b/browser/components/preferences/home.inc.xhtml
index 5bb936782ed9..e812d969837e 100644
--- a/browser/components/preferences/home.inc.xhtml
+++ b/browser/components/preferences/home.inc.xhtml
@@ -33,7 +33,7 @@
                 class="check-home-page-controlled"
                 data-preference-related="browser.startup.homepage">
         <menupopup>
-          <menuitem value="0" data-l10n-id="home-mode-choice-default" />
+          <menuitem value="0" label="&aboutTor.title;" />
           <menuitem value="2" data-l10n-id="home-mode-choice-custom" />
           <menuitem value="1" data-l10n-id="home-mode-choice-blank" />
         </menupopup>
@@ -84,7 +84,7 @@
         Preferences so we need to handle setting the pref manually.-->
       <menulist id="newTabMode" flex="1" data-preference-related="browser.newtabpage.enabled">
         <menupopup>
-          <menuitem value="0" data-l10n-id="home-mode-choice-default" />
+          <menuitem value="0" label="&aboutTor.title;" />
           <menuitem value="1" data-l10n-id="home-mode-choice-blank" />
         </menupopup>
       </menulist>
diff --git a/browser/components/preferences/preferences.xhtml b/browser/components/preferences/preferences.xhtml
index aab4a9e558bc..32184867ac17 100644
--- a/browser/components/preferences/preferences.xhtml
+++ b/browser/components/preferences/preferences.xhtml
@@ -13,7 +13,10 @@
 <?xml-stylesheet href="chrome://browser/skin/preferences/containers.css"?>
 <?xml-stylesheet href="chrome://browser/skin/preferences/privacy.css"?>
 
-<!DOCTYPE html>
+<!DOCTYPE html [
+<!ENTITY % aboutTorDTD SYSTEM "chrome://torbutton/locale/aboutTor.dtd">
+  %aboutTorDTD;
+]>
 
 <html xmlns="http://www.w3.org/1999/xhtml"
         xmlns:html="http://www.w3.org/1999/xhtml"
diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in
index 8f52da54f7b9..d4068cabb4ae 100644
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -239,6 +239,8 @@
 @RESPATH@/browser/chrome/browser.manifest
 @RESPATH@/chrome/pdfjs.manifest
 @RESPATH@/chrome/pdfjs/*
+ at RESPATH@/chrome/torbutton.manifest
+ at RESPATH@/chrome/torbutton/*
 @RESPATH@/chrome/toolkit at JAREXT@
 @RESPATH@/chrome/toolkit.manifest
 @RESPATH@/chrome/recording.manifest
diff --git a/browser/modules/HomePage.jsm b/browser/modules/HomePage.jsm
index f73b0f3e6c8c..26618374df3a 100644
--- a/browser/modules/HomePage.jsm
+++ b/browser/modules/HomePage.jsm
@@ -21,7 +21,7 @@ XPCOMUtils.defineLazyModuleGetters(this, {
 });
 
 const kPrefName = "browser.startup.homepage";
-const kDefaultHomePage = "about:home";
+const kDefaultHomePage = "about:tor";
 const kExtensionControllerPref =
   "browser.startup.homepage_override.extensionControlled";
 const kHomePageIgnoreListId = "homepage-urls";
diff --git a/docshell/base/nsAboutRedirector.cpp b/docshell/base/nsAboutRedirector.cpp
index a320b4ebd431..6ab1a57f92cf 100644
--- a/docshell/base/nsAboutRedirector.cpp
+++ b/docshell/base/nsAboutRedirector.cpp
@@ -158,7 +158,11 @@ static const RedirEntry kRedirMap[] = {
     {"crashcontent", "about:blank",
      nsIAboutModule::HIDE_FROM_ABOUTABOUT |
          nsIAboutModule::URI_CAN_LOAD_IN_CHILD |
-         nsIAboutModule::URI_MUST_LOAD_IN_CHILD}};
+         nsIAboutModule::URI_MUST_LOAD_IN_CHILD},
+    {"tor", "chrome://torbutton/content/aboutTor/aboutTor.xhtml",
+     nsIAboutModule::URI_MUST_LOAD_IN_CHILD |
+         nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
+         nsIAboutModule::ALLOW_SCRIPT}};
 static const int kRedirTotal = mozilla::ArrayLength(kRedirMap);
 
 NS_IMETHODIMP
diff --git a/docshell/build/components.conf b/docshell/build/components.conf
index 9987b60fa2ec..475546757fd4 100644
--- a/docshell/build/components.conf
+++ b/docshell/build/components.conf
@@ -29,6 +29,7 @@ about_pages = [
     'srcdoc',
     'support',
     'telemetry',
+    'tor',
     'url-classifier',
     'webrtc',
 ]
diff --git a/mobile/android/installer/package-manifest.in b/mobile/android/installer/package-manifest.in
index f0664be7b6ee..dc65078b7014 100644
--- a/mobile/android/installer/package-manifest.in
+++ b/mobile/android/installer/package-manifest.in
@@ -132,6 +132,10 @@
 @BINPATH@/chrome/devtools at JAREXT@
 @BINPATH@/chrome/devtools.manifest
 
+; Torbutton
+ at BINPATH@/chrome/torbutton at JAREXT@
+ at BINPATH@/chrome/torbutton.manifest
+
 ; [Default Preferences]
 ; All the pref files must be part of base to prevent migration bugs
 #ifndef MOZ_ANDROID_FAT_AAR_ARCHITECTURES
diff --git a/toolkit/moz.build b/toolkit/moz.build
index 14f4638b693e..4edccfac6d62 100644
--- a/toolkit/moz.build
+++ b/toolkit/moz.build
@@ -22,6 +22,7 @@ DIRS += [
     "mozapps/preferences",
     "profile",
     "themes",
+    "torproject/torbutton",
 ]
 
 if CONFIG["OS_ARCH"] == "WINNT" and CONFIG["MOZ_DEFAULT_BROWSER_AGENT"]:
diff --git a/toolkit/mozapps/extensions/internal/XPIProvider.jsm b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
index c1cef2814b38..8e16e236b238 100644
--- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm
+++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
@@ -1476,6 +1476,15 @@ var XPIStates = {
       for (let [id, file] of loc.readAddons()) {
         knownIds.delete(id);
 
+        // Uninstall torbutton if it is installed in the user profile
+        if (id === "torbutton at torproject.org" &&
+            loc.name === KEY_APP_PROFILE) {
+          logger.debug("Uninstalling torbutton 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
diff --git a/toolkit/torproject/torbutton b/toolkit/torproject/torbutton
new file mode 160000
index 000000000000..a7f607351517
--- /dev/null
+++ b/toolkit/torproject/torbutton
@@ -0,0 +1 @@
+Subproject commit a7f6073515175a1f2d7a2bca1eaec2bfaff03c0c
diff --git a/tools/lint/eslint/eslint-plugin-mozilla/lib/environments/browser-window.js b/tools/lint/eslint/eslint-plugin-mozilla/lib/environments/browser-window.js
index 76e03f2d49bb..2ff107b553b2 100644
--- a/tools/lint/eslint/eslint-plugin-mozilla/lib/environments/browser-window.js
+++ b/tools/lint/eslint/eslint-plugin-mozilla/lib/environments/browser-window.js
@@ -75,7 +75,11 @@ function getGlobalScriptIncludes(scriptPath) {
           "browser/components/search/content/"
         )
         .replace("chrome://browser/content/", "browser/base/content/")
-        .replace("chrome://global/content/", "toolkit/content/");
+        .replace("chrome://global/content/", "toolkit/content/")
+        .replace(
+          "chrome://torbutton/content/",
+          "toolkit/torproject/torbutton/chrome/content/"
+        );
 
       for (let mapping of Object.getOwnPropertyNames(MAPPINGS)) {
         if (sourceFile.includes(mapping)) {





More information about the tbb-commits mailing list