Backed out 5 changesets (bug 1408044) for failing Android test: TestAboutPagesPreparer.java:24: cannot find symbol. r=backout on a CLOSED TREE
authorCiure Andrei <aciure@mozilla.com>
Fri, 17 Nov 2017 12:19:30 +0200
changeset 699971 19229263df318cdb51b797ef02b97e0701671bb9
parent 699970 5ded2b81bed157d30d5f0ffd28b4bb80f298dcd1
child 699972 2de93d419be11b52a23b233ef5f55251c85fad86
push id89725
push userbmo:mfroman@nostrum.com
push dateFri, 17 Nov 2017 23:50:31 +0000
reviewersbackout
bugs1408044
milestone59.0a1
backs out5c5152ad910d21ef40f67a61029640985caed7c7
c9a062838c12374b6fdd20f5484438b36198d6b7
9ceaa645f2a9b4f136c3c45b941cec71e5c5b3eb
10fc0a581606e5a501ab91b66046ed50fdfcf59a
5131400190142ce57036f9e1d50db2324d981ac8
Backed out 5 changesets (bug 1408044) for failing Android test: TestAboutPagesPreparer.java:24: cannot find symbol. r=backout on a CLOSED TREE Backed out changeset 5c5152ad910d (bug 1408044) Backed out changeset c9a062838c12 (bug 1408044) Backed out changeset 9ceaa645f2a9 (bug 1408044) Backed out changeset 10fc0a581606 (bug 1408044) Backed out changeset 513140019014 (bug 1408044)
accessible/tests/mochitest/events/docload/test_docload_busy.html
accessible/tests/mochitest/events/docload/test_docload_embedded.html
accessible/tests/mochitest/events/docload/test_docload_root.html
accessible/tests/mochitest/name/test_browserui.xul
accessible/tests/mochitest/name/test_general.html
accessible/tests/mochitest/relations/test_embeds.xul
accessible/tests/mochitest/relations/test_tabbrowser.xul
accessible/tests/mochitest/textcaret/test_browserui.xul
accessible/tests/mochitest/textcaret/test_general.html
accessible/tests/mochitest/tree/test_tabbrowser.xul
browser/base/content/test/general/browser_audioTabIcon.js
browser/base/content/test/general/browser_bug537474.js
browser/base/content/test/tabs/browser_navigatePinnedTab.js
browser/components/places/tests/browser/browser_library_left_pane_middleclick.js
browser/components/places/tests/browser/browser_library_middleclick.js
browser/components/privatebrowsing/test/browser/browser_privatebrowsing_zoom.js
browser/components/sessionstore/test/browser_350525.js
browser/components/sessionstore/test/browser_367052.js
docshell/base/nsAboutRedirector.cpp
docshell/build/nsDocShellModule.cpp
dom/base/test/chrome/frame_bug814638.xul
js/xpconnect/tests/chrome/test_bug865948.xul
mobile/android/app/src/main/res/xml/preferences_vendor.xml
mobile/android/app/src/test/java/org/mozilla/gecko/icons/TestIconsHelper.java
mobile/android/base/java/org/mozilla/gecko/AboutPages.java
mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
mobile/android/chrome/content/browser.js
mobile/android/chrome/jar.mn
mobile/android/components/AboutRedirector.js
mobile/android/locales/filter.py
mobile/android/locales/jar.mn
mobile/android/locales/l10n.toml
mobile/android/tests/browser/chrome/test_identity_mode.html
mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testAboutPage.java
mobile/android/themes/core/about.css
mobile/locales/filter.py
testing/firefox-ui/tests/puppeteer/test_l10n.py
testing/marionette/client/marionette_driver/localization.py
testing/marionette/driver.js
testing/marionette/l10n.js
toolkit/content/about.xhtml
toolkit/content/jar.mn
toolkit/locales/en-US/chrome/global/about.dtd
toolkit/locales/jar.mn
toolkit/mozapps/extensions/test/mochitest/test_bug887098.html
toolkit/themes/shared/about.css
--- a/accessible/tests/mochitest/events/docload/test_docload_busy.html
+++ b/accessible/tests/mochitest/events/docload/test_docload_busy.html
@@ -74,11 +74,11 @@
     Mozilla Bug 658185
   </a>
 
   <p id="display"></p>
   <div id="content" style="display: none"></div>
   <pre id="test">
   </pre>
 
-  <div id="testContainer"><iframe id="iframe" src="about:mozilla" style="visibility: hidden;"></iframe></div>
+  <div id="testContainer"><iframe id="iframe" src="about:" style="visibility: hidden;"></iframe></div>
 </body>
 </html>
--- a/accessible/tests/mochitest/events/docload/test_docload_embedded.html
+++ b/accessible/tests/mochitest/events/docload/test_docload_embedded.html
@@ -35,30 +35,30 @@
       this.invoke = () => (this.DOMNode.src = aURL);
 
       this.finalCheck = () =>
         testAccessibleTree(this.DOMNode, {
           role: ROLE_INTERNAL_FRAME,
           children: [
             {
               role: ROLE_DOCUMENT,
-              name: aURL == "about:license" ? "Licenses" : aURL
+              name: aURL == "about:" ? "About:" : aURL
             }
           ]
         });
 
       this.getID = () => `change iframe src on ${aURL}`;
     }
 
     // //////////////////////////////////////////////////////////////////////////
     // Do tests
 
     function doTests() {
       const gQueue = new eventQueue();
-      gQueue.push(new changeIframeSrc("iframe", "about:license"));
+      gQueue.push(new changeIframeSrc("iframe", "about:"));
       gQueue.push(new changeIframeSrc("iframe", "about:buildconfig"));
       gQueue.invoke(); // Will call SimpleTest.finish();
     }
 
     SimpleTest.waitForExplicitFinish();
     addA11yLoadEvent(doTests);
   </script>
 </head>
--- a/accessible/tests/mochitest/events/docload/test_docload_root.html
+++ b/accessible/tests/mochitest/events/docload/test_docload_root.html
@@ -107,17 +107,17 @@
       this.getID = () => "close dialog";
     }
 
     // //////////////////////////////////////////////////////////////////////////
     // Do tests
 
     function doTests() {
       const gQueue = new eventQueue();
-      gQueue.push(new openDialogWnd("about:about"));
+      gQueue.push(new openDialogWnd("about:"));
       gQueue.push(new closeDialogWnd());
       gQueue.invoke(); // Will call SimpleTest.finish();
     }
 
     SimpleTest.waitForExplicitFinish();
     addA11yLoadEvent(doTests);
   </script>
 </head>
--- a/accessible/tests/mochitest/name/test_browserui.xul
+++ b/accessible/tests/mochitest/name/test_browserui.xul
@@ -79,17 +79,17 @@
       {
         closeBrowserWindow();
       }
 
       gQueue.invoke();
     }
 
     SimpleTest.waitForExplicitFinish();
-    openBrowserWindow(doTests, "about:license");
+    openBrowserWindow(doTests, "about:");
   ]]>
   </script>
 
   <vbox flex="1" style="overflow: auto;">
   <body xmlns="http://www.w3.org/1999/xhtml">
     <a target="_blank"
        href="https://bugzilla.mozilla.org/show_bug.cgi?id=507382"
        title="focus is fired earlier than root accessible name is changed when switching between tabs">
--- a/accessible/tests/mochitest/name/test_general.html
+++ b/accessible/tests/mochitest/name/test_general.html
@@ -418,17 +418,17 @@
          title="Input your country of origin"/ >
 
   <!-- name from subtree, surround control by spaces to not jamm the text -->
   <label id="insert_spaces_around_control">
     start<input value="value">end
   </label>
 
   <!-- no name from subtree because it holds whitespaces only -->
-  <a id="from_label_ignore_ws_subtree" href="about:mozilla" title="about">&nbsp;&nbsp;  </a>
+  <a id="from_label_ignore_ws_subtree" href="about:" title="about">&nbsp;&nbsp;  </a>
 
   <!-- label element, label contains control -->
   <label>text<button id="btn_label_inside">10</button>text</label>
   <br/>
 
   <!-- label element, label and the button are in the same form -->
   <form>
     <label for="btn_label_inform">in form</label>
--- a/accessible/tests/mochitest/relations/test_embeds.xul
+++ b/accessible/tests/mochitest/relations/test_embeds.xul
@@ -90,29 +90,29 @@
     function doTests()
     {
       testRelation(browserDocument(), RELATION_EMBEDS,
                    getAccessible(currentTabDocument()));
 
       enableLogging("docload");
       gQueue = new eventQueue();
 
-      gQueue.push(new loadURI("about:robots"));
+      gQueue.push(new loadURI("about:about"));
       gQueue.push(new loadOneTab("about:mozilla"));
 
       gQueue.onFinish = function()
       {
         disableLogging();
         closeBrowserWindow();
       }
       gQueue.invoke();
     }
 
     SimpleTest.waitForExplicitFinish();
-    openBrowserWindow(doTests, "about:license");
+    openBrowserWindow(doTests, "about:");
   ]]>
   </script>
 
   <vbox flex="1" style="overflow: auto;">
   <body xmlns="http://www.w3.org/1999/xhtml">
     <a target="_blank"
        href="https://bugzilla.mozilla.org/show_bug.cgi?id=707654"
        title="Embeds relation on root accessible can return not content document">
--- a/accessible/tests/mochitest/relations/test_tabbrowser.xul
+++ b/accessible/tests/mochitest/relations/test_tabbrowser.xul
@@ -30,17 +30,17 @@
     {
       this.eventSeq = [
         new asyncInvokerChecker(EVENT_DOCUMENT_LOAD_COMPLETE, tabDocumentAt, 0),
         new asyncInvokerChecker(EVENT_DOCUMENT_LOAD_COMPLETE, tabDocumentAt, 1)
      ];
 
       this.invoke = function testTabRelations_invoke()
       {
-        var docURIs = ["about:license", "about:mozilla"];
+        var docURIs = ["about:", "about:mozilla"];
         tabBrowser().loadTabs(docURIs, {
           inBackground: false,
           replace: true,
           triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(),
         });
       }
 
       this.finalCheck = function testTabRelations_finalCheck(aEvent)
--- a/accessible/tests/mochitest/textcaret/test_browserui.xul
+++ b/accessible/tests/mochitest/textcaret/test_browserui.xul
@@ -41,17 +41,17 @@
       {
         closeBrowserWindow();
       }
 
       gQueue.invoke();
     }
 
     SimpleTest.waitForExplicitFinish();
-    openBrowserWindow(doTests, "about:mozilla");
+    openBrowserWindow(doTests, "about:");
   ]]>
   </script>
 
   <vbox flex="1" style="overflow: auto;">
   <body xmlns="http://www.w3.org/1999/xhtml">
     <a target="_blank"
        href="https://bugzilla.mozilla.org/show_bug.cgi?id=723833"
        title="IAccessibleText::setCaretOffset on location or search bar causes focus to jump">
--- a/accessible/tests/mochitest/textcaret/test_general.html
+++ b/accessible/tests/mochitest/textcaret/test_general.html
@@ -162,16 +162,16 @@
   <p id="display"></p>
   <div id="content" style="display: none"></div>
   <pre id="test">
   </pre>
 
   <input id="textbox" value="hello"/>
   <textarea id="textarea">text<br>text</textarea>
   <p id="p" contentEditable="true"><span>text</span><br/>text</p>
-  <a id="link" href="about:mozilla">about mozilla</a>
+  <a id="link" href="about:">about mozilla</a>
   <h5 id="heading">heading</h5>
   <iframe id="p2_container"
           src="data:text/html,<p id='p2' contentEditable='true'>a<a id='p2_a' href='mozilla.org'>b</a>c</p>"></iframe>
 
   <div id="eventdump"></div>
 </body>
 </html>
--- a/accessible/tests/mochitest/tree/test_tabbrowser.xul
+++ b/accessible/tests/mochitest/tree/test_tabbrowser.xul
@@ -29,17 +29,17 @@
     {
       this.eventSeq = [
         new asyncInvokerChecker(EVENT_DOCUMENT_LOAD_COMPLETE, tabDocumentAt, 0),
         new asyncInvokerChecker(EVENT_DOCUMENT_LOAD_COMPLETE, tabDocumentAt, 1)
       ];
 
       this.invoke = function testTabHierarchy_invoke()
       {
-        var docURIs = ["about:license", "about:mozilla"];
+        var docURIs = ["about:", "about:mozilla"];
         tabBrowser().loadTabs(docURIs, {
           inBackground: false,
           replace: true,
           triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(),
         });
       }
 
       this.finalCheck = function testTabHierarchy_finalCheck(aEvent)
@@ -61,17 +61,17 @@
 
           tabsAccTree.children.splice(0, 0,
             {
               // xul:toolbarbutton ("Open a new tab")
               role: ROLE_PUSHBUTTON,
               children: []
             },
             {
-              // xul:tab ("about:license")
+              // xul:tab ("about:")
               role: ROLE_PAGETAB,
               children: []
             },
             {
               // tab ("about:mozilla")
               role: ROLE_PAGETAB,
               children: []
             },
@@ -103,17 +103,17 @@
               }
             ];
           }
 
           // NB: The (3) buttons are not visible, unless manually hovered,
           //     probably due to size reduction in this test.
           tabsAccTree.children.splice(0, 0,
             {
-              // xul:tab ("about:license")
+              // xul:tab ("about:")
               role: ROLE_PAGETAB,
               children: [
                 {
                   // xul:text, i.e. the tab label text
                   role: ROLE_TEXT_LEAF,
                   children: []
                 },
                 {
@@ -163,17 +163,17 @@
               // xul:notificationbox
               role: ROLE_PROPERTYPAGE,
               children: [
                 {
                   // xul:browser
                   role: ROLE_INTERNAL_FRAME,
                   children: [
                     {
-                      // #document ("about:license")
+                      // #document ("about:")
                       role: ROLE_DOCUMENT
                       // children: [ ... ] // Ignore document content.
                     }
                   ]
                 }
               ]
             },
             {
--- a/browser/base/content/test/general/browser_audioTabIcon.js
+++ b/browser/base/content/test/general/browser_audioTabIcon.js
@@ -398,17 +398,17 @@ async function test_cross_process_load()
     //   Start playback and wait for it to finish.
     await play(tab);
 
     let soundPlayingStoppedPromise = BrowserTestUtils.waitForEvent(tab, "TabAttrModified", false,
       event => event.detail.changed.includes("soundplaying")
     );
 
     // Go to a different process.
-    browser.loadURI("about:mozilla");
+    browser.loadURI("about:");
     await BrowserTestUtils.browserLoaded(browser);
 
     await soundPlayingStoppedPromise;
 
     ok(!tab.hasAttribute("soundplaying"), "Tab should not be playing sound any more");
     ok(!tab.soundPlaying, "Tab should not be playing sound any more");
   }
 
--- a/browser/base/content/test/general/browser_bug537474.js
+++ b/browser/base/content/test/general/browser_bug537474.js
@@ -1,8 +1,8 @@
 add_task(async function() {
   let browserLoadedPromise = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
-  window.browserDOMWindow.openURI(makeURI("about:mozilla"), null,
+  window.browserDOMWindow.openURI(makeURI("about:"), null,
                                   Ci.nsIBrowserDOMWindow.OPEN_CURRENTWINDOW, null,
                                   Services.scriptSecurityManager.getSystemPrincipal());
   await browserLoadedPromise;
-  is(gBrowser.currentURI.spec, "about:mozilla", "page loads in the current content window");
+  is(gBrowser.currentURI.spec, "about:", "page loads in the current content window");
 });
--- a/browser/base/content/test/tabs/browser_navigatePinnedTab.js
+++ b/browser/base/content/test/tabs/browser_navigatePinnedTab.js
@@ -1,17 +1,17 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 add_task(async function() {
   // Test that changing the URL in a pinned tab works correctly
 
-  let TEST_LINK_INITIAL = "about:mozilla";
+  let TEST_LINK_INITIAL = "about:";
   let TEST_LINK_CHANGED = "about:support";
 
   let appTab = BrowserTestUtils.addTab(gBrowser, TEST_LINK_INITIAL);
   let browser = appTab.linkedBrowser;
   await BrowserTestUtils.browserLoaded(browser);
 
   gBrowser.pinTab(appTab);
   is(appTab.pinned, true, "Tab was successfully pinned");
--- a/browser/components/places/tests/browser/browser_library_left_pane_middleclick.js
+++ b/browser/components/places/tests/browser/browser_library_left_pane_middleclick.js
@@ -2,17 +2,17 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
  /**
  * Tests middle-clicking items in the Library.
  */
 
-const URIs = ["about:license", "about:mozilla"];
+const URIs = ["about:license", "about:"];
 
 var gLibrary = null;
 
 add_task(async function test_setup() {
   // Temporary disable history, so we won't record pages navigation.
   await SpecialPowers.pushPrefEnv({set: [
     ["places.history.enabled", false]
   ]});
--- a/browser/components/places/tests/browser/browser_library_middleclick.js
+++ b/browser/components/places/tests/browser/browser_library_middleclick.js
@@ -2,17 +2,17 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
  /**
  * Tests middle-clicking items in the Library.
  */
 
-const URIs = ["about:license", "about:mozilla"];
+const URIs = ["about:license", "about:"];
 
 var gLibrary = null;
 var gTests = [];
 
 add_task(async function test_setup() {
   // Increase timeout, this test can be quite slow due to waitForFocus calls.
   requestLongerTimeout(2);
 
@@ -67,17 +67,17 @@ gTests.push({
   }
 });
 
 // ------------------------------------------------------------------------------
 // Open a folder in tabs.
 //
 gTests.push({
   desc: "Open a folder in tabs.",
-  URIs: ["about:buildconfig", "about:mozilla"],
+  URIs: ["about:buildconfig", "about:"],
   _bookmarks: null,
 
   async setup() {
     // Create a new folder.
     let children = this.URIs.map(url => {
       return {
         title: "Title",
         url,
@@ -107,17 +107,17 @@ gTests.push({
   }
 });
 
 // ------------------------------------------------------------------------------
 // Open a query in tabs.
 
 gTests.push({
   desc: "Open a query in tabs.",
-  URIs: ["about:buildconfig", "about:mozilla"],
+  URIs: ["about:buildconfig", "about:"],
   _bookmarks: null,
   _query: null,
 
   async setup() {
     let children = this.URIs.map(url => {
       return {
         title: "Title",
         url,
--- a/browser/components/privatebrowsing/test/browser/browser_privatebrowsing_zoom.js
+++ b/browser/components/privatebrowsing/test/browser/browser_privatebrowsing_zoom.js
@@ -2,18 +2,18 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 // This test makes sure that private browsing turns off doesn't cause zoom
 // settings to be reset on tab switch (bug 464962)
 
 add_task(async function test() {
   let win = (await BrowserTestUtils.openNewBrowserWindow({ private: true }));
-  let tabAbout = (await BrowserTestUtils.openNewForegroundTab(win.gBrowser, "about:mozilla"));
-  let tabMozilla = (await BrowserTestUtils.openNewForegroundTab(win.gBrowser, "about:mozilla"));
+  let tabAbout = (await BrowserTestUtils.openNewForegroundTab(win.gBrowser, "about:"));
+  let tabMozilla = (await BrowserTestUtils.openNewForegroundTab(win.gBrowser, "about:"));
 
   let mozillaZoom = win.ZoomManager.zoom;
 
   // change the zoom on the mozilla page
   win.FullZoom.enlarge();
   // make sure the zoom level has been changed
   isnot(win.ZoomManager.zoom, mozillaZoom, "Zoom level can be changed");
   mozillaZoom = win.ZoomManager.zoom;
--- a/browser/components/sessionstore/test/browser_350525.js
+++ b/browser/components/sessionstore/test/browser_350525.js
@@ -69,17 +69,17 @@ add_task(async function() {
 
   // get closed tab count
   let count = ss.getClosedTabCount(window);
   let max_tabs_undo = gPrefService.getIntPref("browser.sessionstore.max_tabs_undo");
   ok(0 <= count && count <= max_tabs_undo,
      "getClosedTabCount returns zero or at most max_tabs_undo");
 
   // create a new tab
-  let testURL = "about:mozilla";
+  let testURL = "about:";
   tab = BrowserTestUtils.addTab(gBrowser, testURL);
   await promiseBrowserLoaded(tab.linkedBrowser);
 
   // make sure that the next closed tab will increase getClosedTabCount
   gPrefService.setIntPref("browser.sessionstore.max_tabs_undo", max_tabs_undo + 1);
   registerCleanupFunction(() => gPrefService.clearUserPref("browser.sessionstore.max_tabs_undo"));
 
   // remove tab
--- a/browser/components/sessionstore/test/browser_367052.js
+++ b/browser/components/sessionstore/test/browser_367052.js
@@ -11,17 +11,17 @@ add_task(async function() {
   registerCleanupFunction(() => gPrefService.clearUserPref("browser.sessionstore.max_tabs_undo"));
 
   // Empty the list of closed tabs.
   while (ss.getClosedTabCount(window)) {
     ss.forgetClosedTab(window, 0);
   }
 
   // restore a blank tab
-  let tab = BrowserTestUtils.addTab(gBrowser, "about:mozilla");
+  let tab = BrowserTestUtils.addTab(gBrowser, "about:");
   await promiseBrowserLoaded(tab.linkedBrowser);
 
   let count = await promiseSHistoryCount(tab.linkedBrowser);
   ok(count >= 1, "the new tab does have at least one history entry");
 
   await promiseTabState(tab, {entries: []});
 
   // We may have a different sessionHistory object if the tab
--- a/docshell/base/nsAboutRedirector.cpp
+++ b/docshell/base/nsAboutRedirector.cpp
@@ -25,16 +25,20 @@ struct RedirEntry
   URI_SAFE_FOR_UNTRUSTED_CONTENT in the third argument to each map item below
   unless your about: page really needs chrome privileges. Security review is
   required before adding new map entries without
   URI_SAFE_FOR_UNTRUSTED_CONTENT.  Also note, however, that adding
   URI_SAFE_FOR_UNTRUSTED_CONTENT will allow random web sites to link to that
   URI.  Perhaps we should separate the two concepts out...
  */
 static const RedirEntry kRedirMap[] = {
+  {
+    "", "chrome://global/content/about.xhtml",
+    nsIAboutModule::ALLOW_SCRIPT
+  },
   { "about", "chrome://global/content/aboutAbout.xhtml", 0 },
   {
     "addons", "chrome://mozapps/content/extensions/extensions.xul",
     nsIAboutModule::ALLOW_SCRIPT
   },
   {
     "buildconfig", "chrome://global/content/buildconfig.html",
     nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT
--- a/docshell/build/nsDocShellModule.cpp
+++ b/docshell/build/nsDocShellModule.cpp
@@ -170,16 +170,17 @@ const mozilla::Module::CIDEntry kDocShel
   { &kNS_PRIVATELOADCONTEXT_CID, false, nullptr, mozilla::CreatePrivateTestLoadContext },
   { nullptr }
 };
 
 const mozilla::Module::ContractIDEntry kDocShellContracts[] = {
   { "@mozilla.org/docshell;1", &kNS_DOCSHELL_CID },
   { NS_URIFIXUP_CONTRACTID, &kNS_DEFAULTURIFIXUP_CID },
   { NS_WEBNAVIGATION_INFO_CONTRACTID, &kNS_WEBNAVIGATION_INFO_CID },
+  { NS_ABOUT_MODULE_CONTRACTID_PREFIX "", &kNS_ABOUT_REDIRECTOR_MODULE_CID },
   { NS_ABOUT_MODULE_CONTRACTID_PREFIX "about", &kNS_ABOUT_REDIRECTOR_MODULE_CID },
   { NS_ABOUT_MODULE_CONTRACTID_PREFIX "addons", &kNS_ABOUT_REDIRECTOR_MODULE_CID },
   { NS_ABOUT_MODULE_CONTRACTID_PREFIX "buildconfig", &kNS_ABOUT_REDIRECTOR_MODULE_CID },
   { NS_ABOUT_MODULE_CONTRACTID_PREFIX "checkerboard", &kNS_ABOUT_REDIRECTOR_MODULE_CID },
   { NS_ABOUT_MODULE_CONTRACTID_PREFIX "config", &kNS_ABOUT_REDIRECTOR_MODULE_CID },
 #ifdef MOZ_CRASHREPORTER
   { NS_ABOUT_MODULE_CONTRACTID_PREFIX "crashes", &kNS_ABOUT_REDIRECTOR_MODULE_CID },
 #endif
--- a/dom/base/test/chrome/frame_bug814638.xul
+++ b/dom/base/test/chrome/frame_bug814638.xul
@@ -5,11 +5,11 @@ https://bugzilla.mozilla.org/show_bug.cg
 -->
 <window title="Mozilla Bug 814638"
         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 
   <keyset>
     <key key="T" modifiers="control" oncommand="receivedKeyEvent()"/>
   </keyset>
 
-  <iframe flex="1" src="about:mozilla"/>
+  <iframe flex="1" src="about:"/>
 
 </window>
--- a/js/xpconnect/tests/chrome/test_bug865948.xul
+++ b/js/xpconnect/tests/chrome/test_bug865948.xul
@@ -21,16 +21,16 @@ https://bugzilla.mozilla.org/show_bug.cg
   /** Test for Bug 865948 **/
   SimpleTest.waitForExplicitFinish();
   const Cu = Components.utils;
   function go() {
     $('ifr').onload = null;
     var sb = Cu.Sandbox(['http://example.com', 'http://example.org']);
     sb.iwin = $('ifr').contentWindow;
     sb.ok = ok;
-    Cu.evalInSandbox('try { iwin.location = "about:mozilla"; ok(false, "didnt throw"); } catch (e) { ok(!!/denied/.exec(e), "threw: " + e); }', sb);
+    Cu.evalInSandbox('try { iwin.location = "about:"; ok(false, "didnt throw"); } catch (e) { ok(!!/denied/.exec(e), "threw: " + e); }', sb);
     SimpleTest.finish();
   }
 
   ]]>
   </script>
 <iframe id="ifr" type="content" onload="go();" src="http://example.org/tests/js/xpconnect/tests/mochitest/file_empty.html" />
 </window>
--- a/mobile/android/app/src/main/res/xml/preferences_vendor.xml
+++ b/mobile/android/app/src/main/res/xml/preferences_vendor.xml
@@ -6,17 +6,17 @@
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
                   xmlns:gecko="http://schemas.android.com/apk/res-auto"
                   android:title="@string/pref_category_vendor"
                   android:enabled="false">
 
     <org.mozilla.gecko.preferences.LinkPreference android:key="android.not_a_preference.about.link"
                                                   android:title="@string/pref_about_firefox"
                                                   android:persistent="false"
-                                                  url="about:firefox" />
+                                                  url="about:" />
 
     <org.mozilla.gecko.preferences.LinkPreference android:key="android.not_a_preference.faq.link"
                                                   android:title="@string/pref_vendor_faqs"
                                                   android:persistent="false"/>
 
     <org.mozilla.gecko.preferences.LinkPreference android:key="android.not_a_preference.feedback.link"
                                                   android:title="@string/pref_vendor_feedback"
                                                   android:persistent="false"/>
--- a/mobile/android/app/src/test/java/org/mozilla/gecko/icons/TestIconsHelper.java
+++ b/mobile/android/app/src/test/java/org/mozilla/gecko/icons/TestIconsHelper.java
@@ -28,18 +28,18 @@ public class TestIconsHelper {
 
         // Special about: URLs.
 
         Assert.assertEquals(
                 "about:home",
                 IconsHelper.guessDefaultFaviconURL("about:home"));
 
         Assert.assertEquals(
-                "about:firefox",
-                IconsHelper.guessDefaultFaviconURL("about:firefox"));
+                "about:",
+                IconsHelper.guessDefaultFaviconURL("about:"));
 
         Assert.assertEquals(
                 "about:addons",
                 IconsHelper.guessDefaultFaviconURL("about:addons"));
 
         // Non http(s) URLS
 
         final String jarUrl = GeckoJarReader.getJarURL(RuntimeEnvironment.application, "chrome/chrome/content/branding/favicon64.png");
--- a/mobile/android/base/java/org/mozilla/gecko/AboutPages.java
+++ b/mobile/android/base/java/org/mozilla/gecko/AboutPages.java
@@ -21,16 +21,17 @@ public class AboutPages {
     public static final String CONFIG          = "about:config";
     public static final String DOWNLOADS       = "about:downloads";
     public static final String FIREFOX         = "about:firefox";
     public static final String HEALTHREPORT    = "about:healthreport";
     public static final String HOME            = "about:home";
     public static final String LOGINS          = "about:logins";
     public static final String PRIVATEBROWSING = "about:privatebrowsing";
     public static final String READER          = "about:reader";
+    public static final String UPDATER         = "about:";
 
     public static final String URL_FILTER = "about:%";
 
     public static final String PANEL_PARAM = "panel";
 
     public static final boolean isAboutPage(final String url) {
         return url != null && url.startsWith("about:");
     }
@@ -77,17 +78,18 @@ public class AboutPages {
 
     public static final List<String> DEFAULT_ICON_PAGES = Collections.unmodifiableList(Arrays.asList(
             HOME,
             ACCOUNTS,
             ADDONS,
             CONFIG,
             DOWNLOADS,
             FIREFOX,
-            HEALTHREPORT
+            HEALTHREPORT,
+            UPDATER
     ));
 
     public static boolean isBuiltinIconPage(final String url) {
         if (url == null ||
             !url.startsWith("about:")) {
             return false;
         }
 
--- a/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
+++ b/mobile/android/base/java/org/mozilla/gecko/BrowserApp.java
@@ -2131,29 +2131,29 @@ public class BrowserApp extends GeckoApp
                 break;
 
             case "Updater:Launch":
                 /**
                  * Launch UI that lets the user update Firefox.
                  *
                  * This depends on the current channel: Release and Beta both direct to
                  * the Google Play Store. If updating is enabled, Aurora, Nightly, and
-                 * custom builds open about:firefox, which provides an update interface.
+                 * custom builds open about:, which provides an update interface.
                  *
                  * If updating is not enabled, this simply logs an error.
                  */
                 if (AppConstants.RELEASE_OR_BETA) {
                     Intent intent = new Intent(Intent.ACTION_VIEW);
                     intent.setData(Uri.parse("market://details?id=" + getPackageName()));
                     startActivity(intent);
                     break;
                 }
 
                 if (AppConstants.MOZ_UPDATER) {
-                    Tabs.getInstance().loadUrlInTab(AboutPages.FIREFOX);
+                    Tabs.getInstance().loadUrlInTab(AboutPages.UPDATER);
                     break;
                 }
 
                 Log.w(LOGTAG, "No candidate updater found; ignoring launch request.");
                 break;
 
             case "Download:AndroidDownloadManager":
                 // Downloading via Android's download manager
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -5533,17 +5533,18 @@ var IdentityHandler = {
     if (aState & Ci.nsIWebProgressListener.STATE_IDENTITY_EV_TOPLEVEL) {
       return this.IDENTITY_MODE_VERIFIED;
     }
 
     if (aState & Ci.nsIWebProgressListener.STATE_IS_SECURE) {
       return this.IDENTITY_MODE_IDENTIFIED;
     }
 
-    let whitelist = /^about:(about|accounts|addons|buildconfig|cache|config|crashes|devices|downloads|fennec|firefox|feedback|healthreport|home|license|logins|logo|memory|mozilla|networking|privatebrowsing|rights|serviceworkers|support|telemetry|webrtc)($|\?)/i;
+    // We also allow "about:" by allowing the selector to be empty (i.e. '(|.....|...|...)'
+    let whitelist = /^about:($|about|accounts|addons|buildconfig|cache|config|crashes|devices|downloads|fennec|firefox|feedback|healthreport|home|license|logins|logo|memory|mozilla|networking|privatebrowsing|rights|serviceworkers|support|telemetry|webrtc)($|\?)/i;
     if (uri.schemeIs("about") && whitelist.test(uri.spec)) {
         return this.IDENTITY_MODE_CHROMEUI;
     }
 
     return this.IDENTITY_MODE_UNKNOWN;
   },
 
   getMixedDisplayMode: function getMixedDisplayMode(aState) {
--- a/mobile/android/chrome/jar.mn
+++ b/mobile/android/chrome/jar.mn
@@ -58,16 +58,17 @@ chrome.jar:
 
 % content branding %content/branding/
 
 % override chrome://global/content/config.xul chrome://browser/content/config.xhtml
 % override chrome://global/content/netError.xhtml chrome://browser/content/netError.xhtml
 % override chrome://mozapps/content/extensions/extensions.xul chrome://browser/content/aboutAddons.xhtml
 
 # L10n resource overrides.
+% override chrome://global/locale/about.dtd chrome://browser/locale/overrides/about.dtd
 % override chrome://global/locale/aboutAbout.dtd chrome://browser/locale/overrides/aboutAbout.dtd
 % override chrome://global/locale/aboutReader.properties chrome://browser/locale/overrides/aboutReader.properties
 % override chrome://global/locale/aboutRights.dtd chrome://browser/locale/overrides/aboutRights.dtd
 % override chrome://global/locale/charsetMenu.properties chrome://browser/locale/overrides/charsetMenu.properties
 % override chrome://global/locale/commonDialogs.properties chrome://browser/locale/overrides/commonDialogs.properties
 % override chrome://global/locale/intl.properties chrome://browser/locale/overrides/intl.properties
 % override chrome://global/locale/intl.css chrome://browser/locale/overrides/intl.css
 % override chrome://global/locale/search/search.properties chrome://browser/locale/overrides/search/search.properties
--- a/mobile/android/components/AboutRedirector.js
+++ b/mobile/android/components/AboutRedirector.js
@@ -4,25 +4,31 @@
 const Cc = Components.classes;
 const Ci = Components.interfaces;
 const Cu = Components.utils;
 
 Cu.import("resource://gre/modules/AppConstants.jsm");
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 
 var modules = {
+  // about:
+  "": {
+    uri: "chrome://browser/content/about.xhtml",
+    privileged: true
+  },
+
+  // about:fennec and about:firefox are aliases for about:,
+  // but hidden from about:about
   fennec: {
     uri: "chrome://browser/content/about.xhtml",
     privileged: true,
     hide: true
   },
-
-  // about:firefox is an alias for about:fennec, but not hidden from about:about
   get firefox() {
-    return Object.assign({}, this.fennec, {hide: false});
+    return this.fennec;
   },
 
   // about:blank has some bad loading behavior we can avoid, if we use an alias
   empty: {
     uri: "about:blank",
     privileged: false,
     hide: true
   },
--- a/mobile/android/locales/filter.py
+++ b/mobile/android/locales/filter.py
@@ -12,16 +12,17 @@ def test(mod, path, entity = None):
   # ignore anything but mobile, which is our local repo checkout name
   if mod not in ("dom", "toolkit", "mobile",
                  "mobile/android/base",  "mobile/android"):
     return "ignore"
 
   if mod == "toolkit":
     # keep this file list in sync with jar.mn
     if path in (
+        "chrome/global/about.dtd",
         "chrome/global/aboutAbout.dtd",
         "chrome/global/aboutReader.properties",
         "chrome/global/aboutRights.dtd",
         "chrome/global/charsetMenu.properties",
         "chrome/global/commonDialogs.properties",
         "chrome/global/intl.properties",
         "chrome/global/intl.css",
         "chrome/search/search.properties",
--- a/mobile/android/locales/jar.mn
+++ b/mobile/android/locales/jar.mn
@@ -35,16 +35,17 @@
 #ifndef RELEASE_OR_BETA
   locale/@AB_CD@/browser/webcompatReporter.properties (%chrome/webcompatReporter.properties)
 #endif
 % resource search-plugins chrome://browser/locale/searchplugins/
 
 # overrides for toolkit l10n, also for en-US
 # keep this file list in sync with l10n.toml and filter.py
 relativesrcdir toolkit/locales:
+  locale/@AB_CD@/browser/overrides/about.dtd                       (%chrome/global/about.dtd)
   locale/@AB_CD@/browser/overrides/aboutAbout.dtd                  (%chrome/global/aboutAbout.dtd)
   locale/@AB_CD@/browser/overrides/aboutReader.properties          (%chrome/global/aboutReader.properties)
   locale/@AB_CD@/browser/overrides/aboutRights.dtd                 (%chrome/global/aboutRights.dtd)
   locale/@AB_CD@/browser/overrides/charsetMenu.properties          (%chrome/global/charsetMenu.properties)
   locale/@AB_CD@/browser/overrides/commonDialogs.properties        (%chrome/global/commonDialogs.properties)
   locale/@AB_CD@/browser/overrides/intl.properties                 (%chrome/global/intl.properties)
   locale/@AB_CD@/browser/overrides/intl.css                        (%chrome/global/intl.css)
   locale/@AB_CD@/browser/overrides/search/search.properties        (%chrome/search/search.properties)
--- a/mobile/android/locales/l10n.toml
+++ b/mobile/android/locales/l10n.toml
@@ -145,16 +145,20 @@ exclude-multi-locale = [
     reference = "dom/locales/en-US/chrome/dom/dom.properties"
     l10n = "{l}dom/chrome/dom/dom.properties"
 
 [[paths]]
     reference = "dom/locales/en-US/chrome/plugins.properties"
     l10n = "{l}dom/chrome/plugins.properties"
 
 [[paths]]
+    reference = "toolkit/locales/en-US/chrome/global/about.dtd"
+    l10n = "{l}toolkit/chrome/global/about.dtd"
+
+[[paths]]
     reference = "toolkit/locales/en-US/chrome/global/aboutAbout.dtd"
     l10n = "{l}toolkit/chrome/global/aboutAbout.dtd"
 
 [[paths]]
     reference = "toolkit/locales/en-US/chrome/global/aboutReader.properties"
     l10n = "{l}toolkit/chrome/global/aboutReader.properties"
 
 [[paths]]
--- a/mobile/android/tests/browser/chrome/test_identity_mode.html
+++ b/mobile/android/tests/browser/chrome/test_identity_mode.html
@@ -17,18 +17,18 @@ https://bugzilla.mozilla.org/show_bug.cg
 
   const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
 
   Cu.import("resource://gre/modules/Services.jsm");
 
   let chromeWin = Services.wm.getMostRecentWindow("navigator:browser");
   let IdentityHandler = chromeWin.IdentityHandler;
 
-  ok(IdentityHandler.getIdentityMode(0, Services.io.newURI("about:firefox")) == IdentityHandler.IDENTITY_MODE_CHROMEUI,
-     "'about:firefox' is a verified internal page");
+  ok(IdentityHandler.getIdentityMode(0, Services.io.newURI("about:")) == IdentityHandler.IDENTITY_MODE_CHROMEUI,
+     "'about:' is a verified internal page");
   ok(IdentityHandler.getIdentityMode(0, Services.io.newURI("about:config")) == IdentityHandler.IDENTITY_MODE_CHROMEUI,
      "'about:config' is a verified internal page");
   ok(IdentityHandler.getIdentityMode(0, Services.io.newURI("about:accounts")) == IdentityHandler.IDENTITY_MODE_CHROMEUI,
      "'about:accounts is a verified internal page");
   ok(IdentityHandler.getIdentityMode(0, Services.io.newURI("about:addonss")) == IdentityHandler.IDENTITY_MODE_UNKNOWN,
      "'about:addonss is not a verified internal page");
   ok(IdentityHandler.getIdentityMode(0, Services.io.newURI("about:accountss")) == IdentityHandler.IDENTITY_MODE_UNKNOWN,
      "'about:accountss is not a verified internal page");
--- a/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testAboutPage.java
+++ b/mobile/android/tests/browser/robocop/src/org/mozilla/gecko/tests/testAboutPage.java
@@ -1,32 +1,32 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 package org.mozilla.gecko.tests;
 
 import org.mozilla.gecko.Actions;
 
-/* Tests related to the about:firefox page:
- *  - check that about:firefox loads from the URL bar
- *  - check that about:firefox loads from Settings/About...
+/* Tests related to the about: page:
+ *  - check that about: loads from the URL bar
+ *  - check that about: loads from Settings/About...
  */
 public class testAboutPage extends PixelTest {
 
     public void testAboutPage() {
         blockForGeckoReady();
 
-        // Load the about:firefox page and verify its title.
-        String url = mStringHelper.ABOUT_SCHEME + "firefox";
+        // Load the about: page and verify its title.
+        String url = mStringHelper.ABOUT_SCHEME;
         loadAndPaint(url);
 
         verifyUrlInContentDescription(url);
 
-        // Open a new page to remove the about:firefox page from the current tab.
+        // Open a new page to remove the about: page from the current tab.
         url = getAbsoluteUrl(mStringHelper.ROBOCOP_BLANK_PAGE_01_URL);
         loadUrlAndWait(url);
 
         // At this point the page title should have been set.
         verifyUrlInContentDescription(url);
 
         // Set up listeners to catch the page load we're about to do.
         Actions.EventExpecter tabEventExpecter = mActions.expectGlobalEvent(Actions.EventType.UI, "Tab:Added");
@@ -36,12 +36,12 @@ public class testAboutPage extends Pixel
 
         // Wait for the new tab and page to load
         tabEventExpecter.blockForEvent();
         contentEventExpecter.blockForEvent();
 
         tabEventExpecter.unregisterListener();
         contentEventExpecter.unregisterListener();
 
-        // Make sure the about:firefox page was loaded.
-        verifyUrlInContentDescription(mStringHelper.ABOUT_SCHEME + "firefox");
+        // Make sure the about: page was loaded.
+        verifyUrlInContentDescription(mStringHelper.ABOUT_SCHEME);
     }
 }
--- a/mobile/android/themes/core/about.css
+++ b/mobile/android/themes/core/about.css
@@ -21,18 +21,30 @@ body {
   padding-inline-start: 30px;
   background: white;
 }
 
 .aboutPageWideContainer {
   max-width: 80%;
 }
 
+#aboutLogoContainer {
+  border: 1px solid lightgray;
+  width: 300px;
+  margin-bottom: 2em;
+}
+
 img {
   border: 0;
 }
 
+#version {
+  font-weight: bold;
+  color: #909090;
+  margin: -24px 0 9px 17px;
+}
+
 ul {
   margin: 0;
   margin-inline-start: 1.5em;
   padding: 0;
   list-style: square;
 }
--- a/mobile/locales/filter.py
+++ b/mobile/locales/filter.py
@@ -12,16 +12,17 @@ def test(mod, path, entity = None):
   # ignore anything but mobile, which is our local repo checkout name
   if mod not in ("dom", "toolkit", "mobile",
                  "mobile/android/base",  "mobile/android"):
     return "ignore"
 
   if mod == "toolkit":
     # keep this file list in sync with jar.mn
     if path in (
+        "chrome/global/about.dtd",
         "chrome/global/aboutAbout.dtd",
         "chrome/global/aboutReader.properties",
         "chrome/global/aboutRights.dtd",
         "chrome/global/charsetMenu.properties",
         "chrome/global/commonDialogs.properties",
         "chrome/global/intl.properties",
         "chrome/global/intl.css",
         "chrome/search/search.properties",
--- a/testing/firefox-ui/tests/puppeteer/test_l10n.py
+++ b/testing/firefox-ui/tests/puppeteer/test_l10n.py
@@ -12,28 +12,28 @@ from marionette_harness import Marionett
 class TestL10n(PuppeteerMixin, MarionetteTestCase):
 
     def setUp(self):
         super(TestL10n, self).setUp()
 
         self.l10n = L10n(self.marionette)
 
     def test_dtd_entity_chrome(self):
-        dtds = ['chrome://branding/locale/brand.dtd',
+        dtds = ['chrome://global/locale/about.dtd',
                 'chrome://browser/locale/baseMenuOverlay.dtd']
 
         value = self.l10n.localize_entity(dtds, 'helpSafeMode.label')
         elm = self.marionette.find_element(By.ID, 'helpSafeMode')
         self.assertEqual(value, elm.get_attribute('label'))
 
         self.assertRaises(NoSuchElementException,
                           self.l10n.localize_entity, dtds, 'notExistent')
 
     def test_dtd_entity_content(self):
-        dtds = ['chrome://branding/locale/brand.dtd',
+        dtds = ['chrome://global/locale/about.dtd',
                 'chrome://global/locale/aboutSupport.dtd']
 
         value = self.l10n.localize_entity(dtds, 'aboutSupport.pageTitle')
 
         self.marionette.set_context(self.marionette.CONTEXT_CONTENT)
         self.marionette.navigate('about:support')
 
         elm = self.marionette.find_element(By.TAG_NAME, 'h1')
--- a/testing/marionette/client/marionette_driver/localization.py
+++ b/testing/marionette/client/marionette_driver/localization.py
@@ -12,17 +12,17 @@ class L10n(object):
     .property files. Both types of elements can be identifed via a unique id,
     and the translated content retrieved.
 
     For example::
 
         from marionette_driver.localization import L10n
         l10n = L10n(marionette)
 
-        l10n.localize_entity(["chrome://branding/locale/brand.dtd"], "brandShortName")
+        l10n.localize_entity(["chrome://global/locale/about.dtd"], "about.version")
         l10n.localize_property(["chrome://global/locale/findbar.properties"], "FastFind"))
 
     .. _localization: https://mzl.la/2eUMjyF
     """
 
     def __init__(self, marionette):
         self._marionette = marionette
 
--- a/testing/marionette/driver.js
+++ b/testing/marionette/driver.js
@@ -3491,17 +3491,17 @@ GeckoDriver.prototype.responseCompleted 
     this.curBrowser.pendingCommands = [];
   }
 };
 
 /**
  * Retrieve the localized string for the specified entity id.
  *
  * Example:
- *     localizeEntity(["chrome://branding/locale/brand.dtd"], "brandShortName")
+ *     localizeEntity(["chrome://global/locale/about.dtd"], "about.version")
  *
  * @param {Array.<string>} urls
  *     Array of .dtd URLs.
  * @param {string} id
  *     The ID of the entity to retrieve the localized string for.
  *
  * @return {string}
  *     The localized string for the requested entity.
--- a/testing/marionette/l10n.js
+++ b/testing/marionette/l10n.js
@@ -30,17 +30,17 @@ this.EXPORTED_SYMBOLS = ["l10n"];
 
 /** @namespace */
 this.l10n = {};
 
 /**
  * Retrieve the localized string for the specified entity id.
  *
  * Example:
- *     localizeEntity(["chrome://branding/locale/brand.dtd"], "brandShortName")
+ *     localizeEntity(["chrome://global/locale/about.dtd"], "about.version")
  *
  * @param {Array.<string>} urls
  *     Array of .dtd URLs.
  * @param {string} id
  *     The ID of the entity to retrieve the localized string for.
  *
  * @return {string}
  *     The localized string for the requested entity.
new file mode 100644
--- /dev/null
+++ b/toolkit/content/about.xhtml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+  "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" [
+<!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd" >
+%brandDTD;
+<!ENTITY % aboutDTD SYSTEM "chrome://global/locale/about.dtd" >
+%aboutDTD;
+<!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd">
+%globalDTD;
+]>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+  <title>About:</title>
+  <link rel="stylesheet" href="chrome://global/skin/about.css" type="text/css"/>
+</head>
+
+<body dir="&locale.dir;">
+  <div id="aboutLogoContainer">
+    <a id="vendorURL">
+      <img src="about:logo" alt="&brandShortName;"/>
+      <p id="version">&about.version;</p>
+    </a>
+  </div>
+
+  <ul id="aboutPageList">
+    <li>&about.credits.beforeLink;<a href="about:credits">&about.credits.linkTitle;</a>&about.credits.afterLink;</li>
+    <li>&about.license.beforeTheLink;<a href="about:license">&about.license.linkTitle;</a>&about.license.afterTheLink;</li>
+    <li hidden="true">&about.relnotes.beforeTheLink;<a id="releaseNotesURL">&about.relnotes.linkTitle;</a>&about.relnotes.afterTheLink;</li>
+    <li>&about.buildconfig.beforeTheLink;<a href="about:buildconfig">&about.buildconfig.linkTitle;</a>&about.buildconfig.afterTheLink;</li>
+    <li id="buildID">&about.buildIdentifier;</li>
+    <script type="application/javascript" src="chrome://global/content/about.js"/>
+  </ul>
+
+</body>
+</html>
--- a/toolkit/content/jar.mn
+++ b/toolkit/content/jar.mn
@@ -2,16 +2,18 @@ toolkit.jar:
 %  content global %content/global/ contentaccessible=yes
 *  content/global/license.html
    content/global/XPCNativeWrapper.js
    content/global/minimal-xul.css
 *  content/global/xul.css
    content/global/textbox.css
    content/global/menulist.css
    content/global/autocomplete.css
+   content/global/about.js
+   content/global/about.xhtml
    content/global/aboutAbout.js
    content/global/aboutAbout.xhtml
 #ifdef MOZILLA_OFFICIAL
    content/global/aboutRights.xhtml
 #else
    content/global/aboutRights.xhtml           (aboutRights-unbranded.xhtml)
 #endif
    content/global/aboutNetworking.js
new file mode 100644
--- /dev/null
+++ b/toolkit/locales/en-US/chrome/global/about.dtd
@@ -0,0 +1,30 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!ENTITY about.version                "version">
+
+<!-- LOCALIZATION NOTE (about.credits.beforeLink): note that there is no space between this phrase and the linked about.credits.linkTitle phrase, so if your locale needs a space between words, add it at the end of this entity. -->
+<!ENTITY about.credits.beforeLink     "See a list of ">
+<!ENTITY about.credits.linkTitle      "contributors">
+<!-- LOCALIZATION NOTE (about.credits.afterLink): note that there is no space between the linked about.credits.linkTitle phrase and this phrase, so if your locale needs a space between words, add it at the start of this entity. -->
+<!ENTITY about.credits.afterLink      " to the Mozilla Project.">
+
+<!-- LOCALIZATION NOTE (about.license.beforeTheLink): note that there is no space between this phrase and the linked about.license.linkTitle phrase, so if your locale needs a space between words, add it at the end of this entity. -->
+<!ENTITY about.license.beforeTheLink  "Read the ">
+<!ENTITY about.license.linkTitle      "licensing information">
+<!-- LOCALIZATION NOTE (about.license.afterTheLink): note that there is no space between the linked about.license.linkTitle phrase and this phrase, so if your locale needs a space between words, add it at the start of this entity. -->
+<!ENTITY about.license.afterTheLink   " for this product.">
+
+<!-- LOCALIZATION NOTE (about.relnotes.beforeTheLink): note that there is no space between this phrase and the linked about.relnotes.linkTitle phrase, so if your locale needs a space between words, add it at the end of this entity. -->
+<!ENTITY about.relnotes.beforeTheLink "Read the ">
+<!ENTITY about.relnotes.linkTitle     "release notes">
+<!-- LOCALIZATION NOTE (about.relnotes.afterTheLink): note that there is no space between the linked about.relnotes.linkTitle phrase and this phrase, so if your locale needs a space between words, add it at the start of this entity. -->
+<!ENTITY about.relnotes.afterTheLink  " for this version.">
+
+<!-- LOCALIZATION NOTE (about.buildconfig.beforeTheLink): note that there is no space between this phrase and the linked about.buildconfig.linkTitle phrase, so if your locale needs a space between words, add it at the end of this entity. -->
+<!ENTITY about.buildconfig.beforeTheLink "See the ">
+<!ENTITY about.buildconfig.linkTitle     "build configuration">
+<!-- LOCALIZATION NOTE (about.buildconfig.afterTheLink): note that there is no space between the linked about.buildconfig.linkTitle phrase and this phrase, so if your locale needs a space between words, add it at the start of this entity. -->
+<!ENTITY about.buildconfig.afterTheLink  " used for this version.">
+
+<!ENTITY about.buildIdentifier        "Build identifier: ">
--- a/toolkit/locales/jar.mn
+++ b/toolkit/locales/jar.mn
@@ -1,16 +1,17 @@
 #filter substitution
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 
 @AB_CD@.jar:
 % locale global @AB_CD@ %locale/@AB_CD@/global/
+  locale/@AB_CD@/global/about.dtd                       (%chrome/global/about.dtd)
   locale/@AB_CD@/global/aboutAbout.dtd                  (%chrome/global/aboutAbout.dtd)
   locale/@AB_CD@/global/aboutReader.properties          (%chrome/global/aboutReader.properties)
   locale/@AB_CD@/global/aboutRights.dtd                 (%chrome/global/aboutRights.dtd)
   locale/@AB_CD@/global/aboutNetworking.dtd             (%chrome/global/aboutNetworking.dtd)
 #ifndef ANDROID
   locale/@AB_CD@/global/aboutProfiles.dtd               (%chrome/global/aboutProfiles.dtd)
   locale/@AB_CD@/global/aboutProfiles.properties        (%chrome/global/aboutProfiles.properties)
 #endif
--- a/toolkit/mozapps/extensions/test/mochitest/test_bug887098.html
+++ b/toolkit/mozapps/extensions/test/mochitest/test_bug887098.html
@@ -16,26 +16,26 @@ https://bugzilla.mozilla.org/show_bug.cg
   /* globals $,evalRef */
 
   function loaded() {
     var iwin = $("ifr").contentWindow;
     var href = SpecialPowers.wrap(iwin).location.href;
     if (/file_empty/.test(href)) {
       window.evalRef = iwin.eval;
       window.installTriggerRef = iwin.InstallTrigger; // Force lazy instantiation.
-      // about:mozilla is privileged, so we need to be privileged to load it.
-      SpecialPowers.wrap(iwin).location.href = "about:mozilla";
+      // about: is privileged, so we need to be privileged to load it.
+      SpecialPowers.wrap(iwin).location.href = "about:";
     } else {
-      is(href, "about:mozilla", "Successfully navigated to about:mozilla");
+      is(href, "about:", "Successfully navigated to about:");
       try {
         evalRef('InstallTrigger.install({URL: "chrome://global/skin/global.css"});');
         ok(false, "Should have thrown when trying to install restricted URI from InstallTrigger");
       } catch (e) {
         // XXXgijs this test broke because of the switch to webidl. I'm told
-        // it has to do with compartments and the fact that we eval in "about:mozilla".
+        // it has to do with compartments and the fact that we eval in "about:".
         // Tracking in bug 1007671
         todo(/permission/.test(e), "We should throw a security exception. Got: " + e);
       }
       SimpleTest.finish();
     }
   }
 
   </script>
--- a/toolkit/themes/shared/about.css
+++ b/toolkit/themes/shared/about.css
@@ -16,25 +16,38 @@ body {
   margin: 4em auto;
   padding-inline-start: 30px;
 }
 
 .aboutPageWideContainer {
   max-width: 80%;
 }
 
+#aboutLogoContainer {
+  border: 1px solid ThreeDLightShadow;
+  width: 300px;
+  margin-bottom: 2em;
+}
+
 h1 {
   font-weight: lighter;
   font-size: 2.4em;
 }
 
 img {
   border: 0;
 }
 
+#version {
+  font-weight: bold;
+  color: #909090;
+  margin: -24px 0 9px 17px;
+  text-align: left; /* Override direction alignment on RTL to make sure that the version will fit well on the background. bug 1325232 */
+}
+
 ul {
   margin: 0;
   margin-inline-start: 1.5em;
   padding: 0;
 }
 
 ul > li {
   margin-top: .5em;