Bug 1409054 - Remove code from the old about:home. r=Mardak draft
authorFelipe Gomes <felipc@gmail.com>
Tue, 22 May 2018 00:45:44 -0300
changeset 797947 2636bfb0aa6b3fd81a3380c844776c3e0c048c8e
parent 797837 384332e5c2643a9a85cbd6099bcc48ad80b34914
push id110637
push userfelipc@gmail.com
push dateTue, 22 May 2018 03:54:13 +0000
reviewersMardak
bugs1409054
milestone62.0a1
Bug 1409054 - Remove code from the old about:home. r=Mardak MozReview-Commit-ID: JrgIFr2kAvI
browser/app/profile/firefox.js
browser/base/content/abouthome/aboutHome.css
browser/base/content/abouthome/aboutHome.js
browser/base/content/abouthome/aboutHome.xhtml
browser/base/content/abouthome/addons.png
browser/base/content/abouthome/addons@2x.png
browser/base/content/abouthome/bookmarks.png
browser/base/content/abouthome/bookmarks@2x.png
browser/base/content/abouthome/downloads.png
browser/base/content/abouthome/downloads@2x.png
browser/base/content/abouthome/history.png
browser/base/content/abouthome/history@2x.png
browser/base/content/abouthome/restore-large.png
browser/base/content/abouthome/restore-large@2x.png
browser/base/content/abouthome/restore.png
browser/base/content/abouthome/restore@2x.png
browser/base/content/abouthome/settings.png
browser/base/content/abouthome/settings@2x.png
browser/base/content/abouthome/snippet1.png
browser/base/content/abouthome/snippet1@2x.png
browser/base/content/abouthome/snippet2.png
browser/base/content/abouthome/snippet2@2x.png
browser/base/content/abouthome/sync.png
browser/base/content/abouthome/sync@2x.png
browser/base/content/browser.js
browser/base/content/tab-content.js
browser/base/content/test/about/aboutHome_content_script.js
browser/base/content/test/about/browser.ini
browser/base/content/test/about/browser_aboutHome_imitate.js
browser/base/content/test/about/browser_aboutHome_input.js
browser/base/content/test/about/browser_aboutHome_snippets.js
browser/base/content/test/about/browser_aboutHome_wrapsCorrectly.js
browser/base/content/test/about/test_bug959531.html
browser/base/jar.mn
browser/branding/unofficial/content/about-logo@2x.png
browser/branding/unofficial/content/jar.mn
browser/components/newtab/aboutNewTabService.js
browser/components/nsBrowserGlue.js
browser/locales/en-US/chrome/browser/aboutHome.dtd
browser/locales/jar.mn
browser/modules/AboutHome.jsm
browser/modules/moz.build
tools/lint/eslint/modules.json
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -840,25 +840,16 @@ pref("gecko.handlerService.schemes.ircs.
 pref("gecko.handlerService.schemes.ircs.1.uriTemplate", "chrome://browser-region/locale/region.properties");
 pref("gecko.handlerService.schemes.ircs.2.name", "chrome://browser-region/locale/region.properties");
 pref("gecko.handlerService.schemes.ircs.2.uriTemplate", "chrome://browser-region/locale/region.properties");
 pref("gecko.handlerService.schemes.ircs.3.name", "chrome://browser-region/locale/region.properties");
 pref("gecko.handlerService.schemes.ircs.3.uriTemplate", "chrome://browser-region/locale/region.properties");
 
 pref("browser.geolocation.warning.infoURL", "https://www.mozilla.org/%LOCALE%/firefox/geolocation/");
 
-pref("browser.EULA.version", 3);
-pref("browser.rights.version", 3);
-pref("browser.rights.3.shown", false);
-
-#ifdef DEBUG
-// Don't show the about:rights notification in debug builds.
-pref("browser.rights.override", true);
-#endif
-
 pref("browser.sessionstore.resume_from_crash", true);
 pref("browser.sessionstore.resume_session_once", false);
 
 // Minimal interval between two save operations in milliseconds (while the user is active).
 pref("browser.sessionstore.interval", 15000); // 15 seconds
 
 // Minimal interval between two save operations in milliseconds (while the user is idle).
 pref("browser.sessionstore.interval.idle", 3600000); // 1h
deleted file mode 100644
--- a/browser/base/content/abouthome/aboutHome.css
+++ /dev/null
@@ -1,430 +0,0 @@
-%if 0
-/* 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/. */
-%endif
-
-html {
-  font: message-box;
-  font-size: 100%;
-  background-color: #F9F9FA;
-  color: #0C0C0D;
-  height: 100%;
-}
-
-body {
-  margin: 0;
-  display: -moz-box;
-  -moz-box-orient: vertical;
-  width: 100%;
-  height: 100%;
-}
-
-input,
-button {
-  font-size: inherit;
-  font-family: inherit;
-}
-
-a {
-  color: -moz-nativehyperlinktext;
-  text-decoration: none;
-}
-
-.spacer {
-  -moz-box-flex: 1;
-}
-
-#topSection {
-  text-align: center;
-  margin-top: -90px;
-  position: relative;
-}
-
-#brandLogo {
-  height: 192px;
-  width: 192px;
-  margin: 0 auto 20px;
-  background-image: url("chrome://branding/content/about-logo.png");
-  background-size: 192px auto;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-
-#searchWrapper,
-#snippets {
-  width: 470px;
-}
-
-#searchWrapper {
-  cursor: default;
-  display: flex;
-  position: relative;
-  margin: 0 auto;
-  height: 36px;
-}
-
-#searchText {
-  border: 1px solid rgba(0, 0, 0, 0.15);
-  border-radius: 3px;
-  box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1);
-  color: inherit;
-  padding: 0;
-  padding-inline-end: 36px;
-  padding-inline-start: 35px;
-  width: 100%;
-  font-size: 15px;
-}
-
-#searchText:active,
-#searchText:focus {
-  border-color: #0A84FF;
-  box-shadow: 0 0 0 2px #0A84FF;
-}
-
-#searchIcon {
-  background: url("chrome://browser/skin/search-glass.svg") no-repeat 12px center/16px;
-  fill: rgba(12, 12, 13, 0.4);
-  -moz-context-properties: fill;
-  position: absolute;
-  offset-inline-start: 0;
-  height: 35px;
-  width: 35px;
-}
-
-#searchSubmit {
-  background: url("chrome://browser/skin/forward.svg") no-repeat center center;
-  border-radius: 0 3px 3px 0;
-  border: 0;
-  width: 36px;
-  fill: rgba(12, 12, 13, 0.4);
-  -moz-context-properties: fill;
-  background-size: 16px 16px;
-  height: 100%;
-  offset-inline-end: 0;
-  position: absolute;
-  color: transparent;
-}
-
-#searchSubmit:focus, #searchSubmit:hover {
-  background-color: rgba(12, 12, 13, 0.1);
-  cursor: pointer;
-}
-
-#searchSubmit:active {
-  background-color: rgba(12, 12, 13, 0.15);
-}
-
-#searchSubmit:dir(rtl) {
-  transform: scaleX(-1);
-}
-
-.contentSearchSuggestionTable {
-  border: 0;
-  transform: translateY(2px);
-}
-
-#defaultSnippet1,
-#defaultSnippet2,
-#rightsSnippet {
-  display: block;
-  min-height: 38px;
-  background: 0 center no-repeat;
-  padding: 6px 0;
-  padding-inline-start: 49px;
-}
-
-#rightsSnippet[hidden] {
-  display: none;
-}
-
-#defaultSnippet1:dir(rtl),
-#defaultSnippet2:dir(rtl),
-#rightsSnippet:dir(rtl) {
-  background-position: right 0 center;
-}
-
-#defaultSnippet1 {
-  background-image: url("chrome://browser/content/abouthome/snippet1.png");
-}
-
-#defaultSnippet2 {
-  background-image: url("chrome://browser/content/abouthome/snippet2.png");
-}
-
-#snippets {
-  display: inline-block;
-  text-align: start;
-  margin: 12px 0;
-  color: #3c3c3c;
-  font-size: 75%;
-  /* 12px is the computed font size, 15px the computed line height of the snippets
-     with Segoe UI on a default Windows 7 setup. The 15/12 multiplier approximately
-     converts em from units of font-size to units of line-height. The goal is to
-     preset the height of a three-line snippet to avoid visual moving/flickering as
-     the snippets load. */
-  min-height: calc(15/12 * 3em);
-}
-
-#launcher {
-  display: none;
-  -moz-box-align: center;
-  -moz-box-pack: center;
-  width: 100%;
-  background-color: hsla(0,0%,0%,.03);
-  border-top: 1px solid hsla(0,0%,0%,.03);
-  box-shadow: 0 1px 2px hsla(0,0%,0%,.02) inset,
-              0 -1px 0 hsla(0,0%,100%,.25);
-}
-
-#launcher:not([session]),
-body[narrow] #launcher[session] {
-  display: none; /* display separator and restore button on separate lines */
-  text-align: center;
-  white-space: nowrap; /* prevent navigational buttons from wrapping */
-}
-
-.launchButton {
-  display: -moz-box;
-  -moz-box-orient: vertical;
-  margin: 16px 1px;
-  padding: 14px 6px;
-  min-width: 88px;
-  max-width: 176px;
-  max-height: 85px;
-  vertical-align: top;
-  white-space: normal;
-  background: transparent padding-box;
-  border: 1px solid transparent;
-  border-radius: 2px;
-  color: #525c66;
-  font-size: 75%;
-  cursor: pointer;
-  transition-property: background-color, border-color, box-shadow;
-  transition-duration: 150ms;
-}
-
-body[narrow] #launcher[session] > .launchButton {
-  margin: 4px 1px;
-}
-
-.launchButton:hover {
-  background-color: hsla(211,79%,6%,.03);
-  border-color: hsla(210,54%,20%,.15) hsla(210,54%,20%,.17) hsla(210,54%,20%,.2);
-}
-
-.launchButton:hover:active {
-  background-image: linear-gradient(hsla(211,79%,6%,.02), hsla(211,79%,6%,.05));
-  border-color: hsla(210,54%,20%,.2) hsla(210,54%,20%,.23) hsla(210,54%,20%,.25);
-  box-shadow: 0 1px 1px hsla(211,79%,6%,.05) inset,
-              0 0 1px hsla(211,79%,6%,.1) inset;
-  transition-duration: 0ms;
-}
-
-.launchButton[hidden],
-#launcher:not([session]) > #restorePreviousSessionSeparator,
-#launcher:not([session]) > #restorePreviousSession {
-  display: none;
-}
-
-#restorePreviousSessionSeparator {
-  width: 3px;
-  height: 116px;
-  margin: 0 10px;
-  background-image: linear-gradient(hsla(0,0%,100%,0), hsla(0,0%,100%,.35), hsla(0,0%,100%,0)),
-                    linear-gradient(hsla(211,79%,6%,0), hsla(211,79%,6%,.2), hsla(211,79%,6%,0)),
-                    linear-gradient(hsla(0,0%,100%,0), hsla(0,0%,100%,.35), hsla(0,0%,100%,0));
-  background-position: left top, center, right bottom;
-  background-size: 1px auto;
-  background-repeat: no-repeat;
-}
-
-body[narrow] #restorePreviousSessionSeparator {
-  margin: 0 auto;
-  width: 512px;
-  height: 3px;
-  background-image: linear-gradient(to right, hsla(0,0%,100%,0), hsla(0,0%,100%,.35), hsla(0,0%,100%,0)),
-                    linear-gradient(to right, hsla(211,79%,6%,0), hsla(211,79%,6%,.2), hsla(211,79%,6%,0)),
-                    linear-gradient(to right, hsla(0,0%,100%,0), hsla(0,0%,100%,.35), hsla(0,0%,100%,0));
-  background-size: auto 1px;
-}
-
-#restorePreviousSession {
-  max-width: none;
-  font-size: 90%;
-}
-
-body[narrow] #restorePreviousSession {
-  font-size: 80%;
-}
-
-.launchButton::before {
-  display: block;
-  width: 32px;
-  height: 32px;
-  margin: 0 auto 6px;
-  line-height: 0; /* remove extra vertical space due to non-zero font-size */
-}
-
-#downloads::before {
-  content: url("chrome://browser/content/abouthome/downloads.png");
-}
-
-#bookmarks::before {
-  content: url("chrome://browser/content/abouthome/bookmarks.png");
-}
-
-#history::before {
-  content: url("chrome://browser/content/abouthome/history.png");
-}
-
-#addons::before {
-  content: url("chrome://browser/content/abouthome/addons.png");
-}
-
-#sync::before {
-  content: url("chrome://browser/content/abouthome/sync.png");
-}
-
-#settings::before {
-  content: url("chrome://browser/content/abouthome/settings.png");
-}
-
-#restorePreviousSession::before {
-  content: url("chrome://browser/content/abouthome/restore-large.png");
-  height: 48px;
-  width: 48px;
-  display: inline-block; /* display on same line as text label */
-  vertical-align: middle;
-  margin-bottom: 0;
-  margin-inline-end: 8px;
-}
-
-#restorePreviousSession:dir(rtl)::before {
-  transform: scaleX(-1);
-}
-
-body[narrow] #restorePreviousSession::before {
-  content: url("chrome://browser/content/abouthome/restore.png");
-  height: 32px;
-  width: 32px;
-}
-
-/* [HiDPI]
- * At resolutions above 1dppx, prefer downscaling the 2x Retina graphics
- * rather than upscaling the original-size ones (bug 818940).
- */
-@media not all and (max-resolution: 1dppx) {
-  #brandLogo {
-    background-image: url("chrome://branding/content/about-logo@2x.png");
-  }
-
-  #defaultSnippet1,
-  #defaultSnippet2,
-  #rightsSnippet {
-    background-size: 40px;
-  }
-
-  #defaultSnippet1 {
-    background-image: url("chrome://browser/content/abouthome/snippet1@2x.png");
-  }
-
-  #defaultSnippet2 {
-    background-image: url("chrome://browser/content/abouthome/snippet2@2x.png");
-  }
-
-  .launchButton::before {
-    transform: scale(.5);
-    transform-origin: 0 0;
-  }
-
-  .launchButton:dir(rtl)::before {
-    transform: scale(.5) translateX(32px);
-  }
-
-  #downloads::before {
-    content: url("chrome://browser/content/abouthome/downloads@2x.png");
-  }
-
-  #bookmarks::before {
-    content: url("chrome://browser/content/abouthome/bookmarks@2x.png");
-  }
-
-  #history::before {
-    content: url("chrome://browser/content/abouthome/history@2x.png");
-  }
-
-  #addons::before {
-    content: url("chrome://browser/content/abouthome/addons@2x.png");
-  }
-
-  #sync::before {
-    content: url("chrome://browser/content/abouthome/sync@2x.png");
-  }
-
-  #settings::before {
-    content: url("chrome://browser/content/abouthome/settings@2x.png");
-  }
-
-  #restorePreviousSession::before {
-    content: url("chrome://browser/content/abouthome/restore-large@2x.png");
-  }
-
-  body[narrow] #restorePreviousSession::before {
-    content: url("chrome://browser/content/abouthome/restore@2x.png");
-  }
-
-  #restorePreviousSession:dir(rtl)::before {
-    transform: scale(-0.5, 0.5) translateX(24px);
-    transform-origin: top center;
-  }
-}
-
-/* Overrides for onboarding
-   These overrides hide the Firefox logo (since about:home has a
-   large logo already) and make the helper icon larger */
-
-#about-home #onboarding-notification-body,
-#about-home #onboarding-notification-tour-title {
-  color: #0C0C0D;
-}
-
-#about-home #onboarding-notification-body {
-  padding-inline-start: 46px;
-}
-
-#about-home #onboarding-notification-tour-message {
-  margin-bottom: 0;
-}
-
-#about-home #onboarding-notification-tour-icon {
-  display: none;
-}
-
-#about-home #onboarding-notification-tour-title::before {
-  display: block;
-  position: absolute;
-  top: 0;
-  offset-inline-start: 0;
-  height: 100%;
-  width: 42px;
-  background-size: 42px;
-  background-position: center;
-  -moz-context-properties: fill;
-  fill: #4A4A4F;
-}
-
-#about-home #onboarding-notification-bar {
-  z-index: 100;
-}
-
-/* Overrides for snippets
-   These changes make it so that snippets do not affect the height of the
-   main element, so that elements don't move around on page load. */
-#snippetContainer {
-  position: absolute;
-  left: 50%;
-  top: 100%;
-  margin-left: -235px;
-  width: 470px;
-}
deleted file mode 100644
--- a/browser/base/content/abouthome/aboutHome.js
+++ /dev/null
@@ -1,389 +0,0 @@
-/* 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/. */
-
-"use strict";
-
-/* import-globals-from ../contentSearchUI.js */
-
-// The process of adding a new default snippet involves:
-//   * add a new entity to aboutHome.dtd
-//   * add a <span/> for it in aboutHome.xhtml
-//   * add an entry here in the proper ordering (based on spans)
-// The <a/> part of the snippet will be linked to the corresponding url.
-const DEFAULT_SNIPPETS_URLS = [
-  "https://www.mozilla.org/firefox/features/?utm_source=snippet&utm_medium=snippet&utm_campaign=default+feature+snippet",
-  "https://addons.mozilla.org/firefox/?utm_source=snippet&utm_medium=snippet&utm_campaign=addons"
-];
-
-const SNIPPETS_UPDATE_INTERVAL_MS = 14400000; // 4 hours.
-
-// IndexedDB storage constants.
-const DATABASE_NAME = "abouthome";
-const DATABASE_VERSION = 1;
-const DATABASE_STORAGE = "persistent";
-const SNIPPETS_OBJECTSTORE_NAME = "snippets";
-var searchText;
-
-// This global tracks if the page has been set up before, to prevent double inits
-var gInitialized = false;
-var gObserver = new MutationObserver(function(mutations) {
-  for (let mutation of mutations) {
-    // The addition of the restore session button changes our width:
-    if (mutation.attributeName == "session") {
-      fitToWidth();
-    }
-    if (mutation.attributeName == "snippetsVersion") {
-      if (!gInitialized) {
-        ensureSnippetsMapThen(loadSnippets);
-        gInitialized = true;
-      }
-      return;
-    }
-  }
-});
-
-window.addEventListener("pageshow", function() {
-  // Delay search engine setup, cause browser.js::BrowserOnAboutPageLoad runs
-  // later and may use asynchronous getters.
-  window.gObserver.observe(document.documentElement, { attributes: true });
-  fitToWidth();
-  setupSearch();
-  window.addEventListener("resize", fitToWidth);
-
-  // Ask chrome to update snippets.
-  var event = new CustomEvent("AboutHomeLoad", {bubbles: true});
-  document.dispatchEvent(event);
-});
-
-window.addEventListener("pagehide", function() {
-  window.gObserver.disconnect();
-  window.removeEventListener("resize", fitToWidth);
-});
-
-window.addEventListener("keypress", ev => {
-  if (ev.defaultPrevented) {
-    return;
-  }
-
-  // don't focus the search-box on keypress if something other than the
-  // body or document element has focus - don't want to steal input from other elements
-  // Make an exception for <a> and <button> elements (and input[type=button|submit])
-  // which don't usefully take keypresses anyway.
-  // (except space, which is handled below)
-  if (document.activeElement && document.activeElement != document.body &&
-      document.activeElement != document.documentElement &&
-      !["a", "button"].includes(document.activeElement.localName) &&
-      !document.activeElement.matches("input:-moz-any([type=button],[type=submit])")) {
-    return;
-  }
-
-  let modifiers = ev.ctrlKey + ev.altKey + ev.metaKey;
-  // ignore Ctrl/Cmd/Alt, but not Shift
-  // also ignore Tab, Insert, PageUp, etc., and Space
-  if (modifiers != 0 || ev.charCode == 0 || ev.charCode == 32)
-    return;
-
-  searchText.focus();
-  // need to send the first keypress outside the search-box manually to it
-  searchText.value += ev.key;
-});
-
-// This object has the same interface as Map and is used to store and retrieve
-// the snippets data.  It is lazily initialized by ensureSnippetsMapThen(), so
-// be sure its callback returned before trying to use it.
-var gSnippetsMap;
-var gSnippetsMapCallbacks = [];
-
-/**
- * Ensure the snippets map is properly initialized.
- *
- * @param aCallback
- *        Invoked once the map has been initialized, gets the map as argument.
- * @note Snippets should never directly manage the underlying storage, since
- *       it may change inadvertently.
- */
-function ensureSnippetsMapThen(aCallback) {
-  if (gSnippetsMap) {
-    aCallback(gSnippetsMap);
-    return;
-  }
-
-  // Handle multiple requests during the async initialization.
-  gSnippetsMapCallbacks.push(aCallback);
-  if (gSnippetsMapCallbacks.length > 1) {
-    // We are already updating, the callbacks will be invoked when done.
-    return;
-  }
-
-  let invokeCallbacks = function() {
-    if (!gSnippetsMap) {
-      gSnippetsMap = Object.freeze(new Map());
-    }
-
-    for (let callback of gSnippetsMapCallbacks) {
-      callback(gSnippetsMap);
-    }
-    gSnippetsMapCallbacks.length = 0;
-  };
-
-  let openRequest = indexedDB.open(DATABASE_NAME, {version: DATABASE_VERSION,
-                                                   storage: DATABASE_STORAGE});
-
-  openRequest.onerror = function(event) {
-    // Try to delete the old database so that we can start this process over
-    // next time.
-    indexedDB.deleteDatabase(DATABASE_NAME);
-    invokeCallbacks();
-  };
-
-  openRequest.onupgradeneeded = function(event) {
-    let db = event.target.result;
-    if (!db.objectStoreNames.contains(SNIPPETS_OBJECTSTORE_NAME)) {
-      db.createObjectStore(SNIPPETS_OBJECTSTORE_NAME);
-    }
-  };
-
-  openRequest.onsuccess = function(event) {
-    let db = event.target.result;
-
-    db.onerror = function() {
-      invokeCallbacks();
-    };
-
-    db.onversionchange = function(versionChangeEvent) {
-      versionChangeEvent.target.close();
-      invokeCallbacks();
-    };
-
-    let cache = new Map();
-    let cursorRequest;
-    try {
-      cursorRequest = db.transaction(SNIPPETS_OBJECTSTORE_NAME)
-                        .objectStore(SNIPPETS_OBJECTSTORE_NAME).openCursor();
-    } catch (ex) {
-      console.error(ex);
-      invokeCallbacks();
-      return;
-    }
-
-    cursorRequest.onerror = function() {
-      invokeCallbacks();
-    };
-
-    cursorRequest.onsuccess = function(cursorRequestEvent) {
-      let cursor = cursorRequestEvent.target.result;
-
-      // Populate the cache from the persistent storage.
-      if (cursor) {
-        cache.set(cursor.key, cursor.value);
-        cursor.continue();
-        return;
-      }
-
-      // The cache has been filled up, create the snippets map.
-      gSnippetsMap = Object.freeze({
-        get: (aKey) => cache.get(aKey),
-        set(aKey, aValue) {
-          db.transaction(SNIPPETS_OBJECTSTORE_NAME, "readwrite")
-            .objectStore(SNIPPETS_OBJECTSTORE_NAME).put(aValue, aKey);
-          return cache.set(aKey, aValue);
-        },
-        has: (aKey) => cache.has(aKey),
-        delete(aKey) {
-          db.transaction(SNIPPETS_OBJECTSTORE_NAME, "readwrite")
-            .objectStore(SNIPPETS_OBJECTSTORE_NAME).delete(aKey);
-          return cache.delete(aKey);
-        },
-        clear() {
-          db.transaction(SNIPPETS_OBJECTSTORE_NAME, "readwrite")
-            .objectStore(SNIPPETS_OBJECTSTORE_NAME).clear();
-          return cache.clear();
-        },
-        get size() { return cache.size; },
-      });
-
-      setTimeout(invokeCallbacks, 0);
-    };
-  };
-}
-
-function onSearchSubmit(aEvent) {
-  gContentSearchController.search(aEvent);
-}
-
-
-var gContentSearchController;
-
-function setupSearch() {
-  // Set submit button label for when CSS background are disabled (e.g.
-  // high contrast mode).
-  document.getElementById("searchSubmit").value =
-    document.body.getAttribute("dir") == "ltr" ? "\u25B6" : "\u25C0";
-
-  // The "autofocus" attribute doesn't focus the form element
-  // immediately when the element is first drawn, so the
-  // attribute is also used for styling when the page first loads.
-  searchText = document.getElementById("searchText");
-  searchText.addEventListener("blur", function() {
-    searchText.removeAttribute("autofocus");
-  }, {once: true});
-
-  if (!gContentSearchController) {
-    gContentSearchController =
-      new ContentSearchUIController(searchText, searchText.parentNode,
-                                    "abouthome", "homepage");
-  }
-}
-
-/**
- * Inform the test harness that we're done loading the page.
- */
-function loadCompleted() {
-  var event = new CustomEvent("AboutHomeLoadSnippetsCompleted", {bubbles: true});
-  document.dispatchEvent(event);
-}
-
-/**
- * Update the local snippets from the remote storage, then show them through
- * showSnippets.
- */
-function loadSnippets() {
-  if (!gSnippetsMap)
-    throw new Error("Snippets map has not properly been initialized");
-
-  // Allow tests to modify the snippets map before using it.
-  var event = new CustomEvent("AboutHomeLoadSnippets", {bubbles: true});
-  document.dispatchEvent(event);
-
-  // Check cached snippets version.
-  let cachedVersion = gSnippetsMap.get("snippets-cached-version") || 0;
-  let currentVersion = document.documentElement.getAttribute("snippetsVersion");
-  if (cachedVersion < currentVersion) {
-    // The cached snippets are old and unsupported, restart from scratch.
-    gSnippetsMap.clear();
-  }
-
-  // Check last snippets update.
-  let lastUpdate = gSnippetsMap.get("snippets-last-update");
-  let updateURL = document.documentElement.getAttribute("snippetsURL");
-  let shouldUpdate = !lastUpdate ||
-                     Date.now() - lastUpdate > SNIPPETS_UPDATE_INTERVAL_MS;
-  if (updateURL && shouldUpdate) {
-    // Try to update from network.
-    let xhr = new XMLHttpRequest();
-    xhr.timeout = 5000;
-    // Even if fetching should fail we don't want to spam the server, thus
-    // set the last update time regardless its results.  Will retry tomorrow.
-    gSnippetsMap.set("snippets-last-update", Date.now());
-    xhr.onloadend = function() {
-      if (xhr.status == 200) {
-        gSnippetsMap.set("snippets", xhr.responseText);
-        gSnippetsMap.set("snippets-cached-version", currentVersion);
-      }
-      showSnippets();
-      loadCompleted();
-    };
-    try {
-      xhr.open("GET", updateURL, true);
-      xhr.send(null);
-    } catch (ex) {
-      showSnippets();
-      loadCompleted();
-    }
-  } else {
-    showSnippets();
-    loadCompleted();
-  }
-}
-
-/**
- * Shows locally cached remote snippets, or default ones when not available.
- *
- * @note: snippets should never invoke showSnippets(), or they may cause
- *        a "too much recursion" exception.
- */
-var _snippetsShown = false;
-function showSnippets() {
-  let snippetsElt = document.getElementById("snippets");
-
-  // Show about:rights notification, if needed.
-  let showRights = document.documentElement.getAttribute("showKnowYourRights");
-  if (showRights) {
-    let rightsElt = document.getElementById("rightsSnippet");
-    let anchor = rightsElt.getElementsByTagName("a")[0];
-    anchor.href = "about:rights";
-    snippetsElt.appendChild(rightsElt);
-    rightsElt.removeAttribute("hidden");
-    return;
-  }
-
-  if (!gSnippetsMap)
-    throw new Error("Snippets map has not properly been initialized");
-  if (_snippetsShown) {
-    // There's something wrong with the remote snippets, just in case fall back
-    // to the default snippets.
-    showDefaultSnippets();
-    throw new Error("showSnippets should never be invoked multiple times");
-  }
-  _snippetsShown = true;
-
-  let snippets = gSnippetsMap.get("snippets");
-  // If there are remotely fetched snippets, try to to show them.
-  if (snippets) {
-    // Injecting snippets can throw if they're invalid XML.
-    try {
-      // eslint-disable-next-line no-unsanitized/property
-      snippetsElt.innerHTML = snippets;
-      // Scripts injected by innerHTML are inactive, so we have to relocate them
-      // through DOM manipulation to activate their contents.
-      Array.forEach(snippetsElt.getElementsByTagName("script"), function(elt) {
-        let relocatedScript = document.createElement("script");
-        relocatedScript.type = "text/javascript";
-        relocatedScript.text = elt.text;
-        elt.parentNode.replaceChild(relocatedScript, elt);
-      });
-      return;
-    } catch (ex) {
-      // Bad content, continue to show default snippets.
-    }
-  }
-
-  showDefaultSnippets();
-}
-
-/**
- * Clear snippets element contents and show default snippets.
- */
-function showDefaultSnippets() {
-  // Clear eventual contents...
-  let snippetsElt = document.getElementById("snippets");
-  snippetsElt.innerHTML = "";
-
-  // ...then show default snippets.
-  let defaultSnippetsElt = document.getElementById("defaultSnippets");
-  let entries = defaultSnippetsElt.querySelectorAll("span");
-  // Choose a random snippet.  Assume there is always at least one.
-  let randIndex = Math.floor(Math.random() * entries.length);
-  let entry = entries[randIndex];
-  // Inject url in the eventual link.
-  if (DEFAULT_SNIPPETS_URLS[randIndex]) {
-    let links = entry.getElementsByTagName("a");
-    // Default snippets can have only one link, otherwise something is messed
-    // up in the translation.
-    if (links.length == 1) {
-      links[0].href = DEFAULT_SNIPPETS_URLS[randIndex];
-    }
-  }
-  // Move the default snippet to the snippets element.
-  snippetsElt.appendChild(entry);
-}
-
-function fitToWidth() {
-  if (document.documentElement.scrollWidth > window.innerWidth) {
-    document.body.setAttribute("narrow", "true");
-  } else if (document.body.hasAttribute("narrow")) {
-    document.body.removeAttribute("narrow");
-    fitToWidth();
-  }
-}
deleted file mode 100644
--- a/browser/base/content/abouthome/aboutHome.xhtml
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!-- 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/. -->
-
-<!DOCTYPE html [
-  <!ENTITY % htmlDTD
-    PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "DTD/xhtml1-strict.dtd">
-  %htmlDTD;
-  <!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd">
-  %globalDTD;
-  <!ENTITY % aboutHomeDTD SYSTEM "chrome://browser/locale/aboutHome.dtd">
-  %aboutHomeDTD;
-  <!ENTITY % browserDTD SYSTEM "chrome://browser/locale/browser.dtd" >
-  %browserDTD;
-]>
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Security-Policy" content="default-src chrome:" />
-    <title>&abouthome.pageTitle;</title>
-
-    <link rel="icon" type="image/png" id="favicon"
-          href="chrome://branding/content/icon32.png"/>
-    <link rel="stylesheet" type="text/css" media="all"
-          href="chrome://browser/content/contentSearchUI.css"/>
-    <link rel="stylesheet" type="text/css" media="all" defer="defer"
-          href="chrome://browser/content/abouthome/aboutHome.css"/>
-
-    <script type="text/javascript"
-            src="chrome://browser/content/abouthome/aboutHome.js"/>
-    <script type="text/javascript"
-            src="chrome://browser/content/contentSearchUI.js"/>
-  </head>
-
-  <body id="about-home" dir="&locale.dir;">
-    <div class="spacer"/>
-    <div id="topSection">
-      <div id="brandLogo"></div>
-
-      <div id="searchWrapper">
-        <div id="searchIcon"/>
-        <input type="text" name="q" value="" id="searchText" maxlength="256"
-               placeholder="&searchInput.placeholder;"
-               aria-label="&contentSearchInput.label;" autofocus="autofocus"/>
-        <input id="searchSubmit" type="button" onclick="onSearchSubmit(event)"
-               title="&contentSearchSubmit.tooltip;"/>
-      </div>
-
-      <div id="snippetContainer">
-        <div id="defaultSnippets" hidden="true">
-          <span id="defaultSnippet1">&abouthome.defaultSnippet1.v1;</span>
-          <span id="defaultSnippet2">&abouthome.defaultSnippet2.v1;</span>
-        </div>
-        <span id="rightsSnippet" hidden="true">&abouthome.rightsSnippet;</span>
-        <div id="snippets"/>
-      </div>
-    </div>
-    <div class="spacer"/>
-
-    <div id="launcher">
-      <button class="launchButton" id="downloads">&abouthome.downloadsButton.label;</button>
-      <button class="launchButton" id="bookmarks">&abouthome.bookmarksButton.label;</button>
-      <button class="launchButton" id="history">&abouthome.historyButton.label;</button>
-      <button class="launchButton" id="addons">&abouthome.addonsButton.label;</button>
-      <button class="launchButton" id="sync">&abouthome.syncButton.label;</button>
-#ifdef XP_WIN
-      <button class="launchButton" id="settings">&abouthome.preferencesButtonWin.label;</button>
-#else
-      <button class="launchButton" id="settings">&abouthome.preferencesButtonUnix.label;</button>
-#endif
-      <div id="restorePreviousSessionSeparator"/>
-      <button class="launchButton" id="restorePreviousSession">&historyRestoreLastSession.label;</button>
-    </div>
-  </body>
-</html>
deleted file mode 100644
index 238a5f6daa3b6eab2e68307509f27796bf3437f6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 1510904a510bb7c45a2afe448d3a6a58db185edf..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index dc6b9ab7f49dd5e758df1754f2bd3eccbfe1ad66..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 111212ef2027652f2984c7e5b8f5d33cbad39ac1..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 2ae5407c314bd901826ccc43c5fa9822e0cc9b3c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 2cbd2d1e968c7e81d6027ddadce6444795a216d3..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index adfbfb9cab6084137f711a356f3f5296d18de1da..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 92bb6dd43a72ba436b6f1c7837f9ed5816e07850..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 4d6cf21aa8929ca5d8dc728fa13e2f2ee1cdfaf4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 7b080af77ba315314bf7b76f9bc85fe1c582a1f7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index a3ba25ce80c9a04611e4dc53d033395643743aff..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 21348fcf5d8597ce865c8a5e90bdc3b699691080..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index cc8dd79f51940bc9ec92ddef8910ea9dea7fa5ab..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index c995ae6313351d9d535c8559067ebd8220f5c51a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 05a9630b98a3537f541dbad1ffd0a105b7320c82..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 781af04e008aa479993265befe4363fcb2bb6f9b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 24325f87549162883ff10b9e0935b9749c8f2dcf..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 7c27a8e88a463e81b61e176983bd645741e6dc64..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 1d862d1f35916ff3c43f39a29efa93d83705a601..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index cbbc2e6ca8d297ebf5442e5611ad0ea4db4bbdae..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -11,17 +11,16 @@ ChromeUtils.import("resource://gre/modul
 ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
 ChromeUtils.import("resource://gre/modules/NotificationDB.jsm");
 
 const {WebExtensionPolicy} = Cu.getGlobalForObject(Services);
 
 // lazy module getters
 
 XPCOMUtils.defineLazyModuleGetters(this, {
-  AboutHome: "resource:///modules/AboutHome.jsm",
   BrowserUITelemetry: "resource:///modules/BrowserUITelemetry.jsm",
   BrowserUsageTelemetry: "resource:///modules/BrowserUsageTelemetry.jsm",
   BrowserUtils: "resource://gre/modules/BrowserUtils.jsm",
   BrowserWindowTracker: "resource:///modules/BrowserWindowTracker.jsm",
   CharsetMenu: "resource://gre/modules/CharsetMenu.jsm",
   Color: "resource://gre/modules/Color.jsm",
   ContentSearch: "resource:///modules/ContentSearch.jsm",
   ContextualIdentityService: "resource://gre/modules/ContextualIdentityService.jsm",
--- a/browser/base/content/tab-content.js
+++ b/browser/base/content/tab-content.js
@@ -87,134 +87,16 @@ addMessageListener("Browser:Reload", fun
   } catch (e) {
   }
 });
 
 addMessageListener("MixedContent:ReenableProtection", function() {
   docShell.mixedContentChannel = null;
 });
 
-var AboutHomeListener = {
-  init(chromeGlobal) {
-    chromeGlobal.addEventListener("AboutHomeLoad", this, false, true);
-  },
-
-  get isAboutHome() {
-    return content.document.documentURI.toLowerCase() == "about:home";
-  },
-
-  handleEvent(aEvent) {
-    if (!this.isAboutHome) {
-      return;
-    }
-    switch (aEvent.type) {
-      case "AboutHomeLoad":
-        this.onPageLoad();
-        break;
-      case "click":
-        this.onClick(aEvent);
-        break;
-      case "pagehide":
-        this.onPageHide(aEvent);
-        break;
-    }
-  },
-
-  receiveMessage(aMessage) {
-    if (!this.isAboutHome) {
-      return;
-    }
-    switch (aMessage.name) {
-      case "AboutHome:Update":
-        this.onUpdate(aMessage.data);
-        break;
-    }
-  },
-
-  onUpdate(aData) {
-    let doc = content.document;
-    if (aData.showRestoreLastSession && !PrivateBrowsingUtils.isContentWindowPrivate(content))
-      doc.getElementById("launcher").setAttribute("session", "true");
-
-    // Inject search engine and snippets URL.
-    let docElt = doc.documentElement;
-    // Set snippetsVersion last, which triggers to show the snippets when it's set.
-    docElt.setAttribute("snippetsURL", aData.snippetsURL);
-    if (aData.showKnowYourRights)
-      docElt.setAttribute("showKnowYourRights", "true");
-    docElt.setAttribute("snippetsVersion", aData.snippetsVersion);
-  },
-
-  onPageLoad() {
-    addMessageListener("AboutHome:Update", this);
-    addEventListener("click", this, true);
-    addEventListener("pagehide", this, true);
-
-    sendAsyncMessage("AboutHome:MaybeShowMigrateMessage");
-    sendAsyncMessage("AboutHome:RequestUpdate");
-  },
-
-  onClick(aEvent) {
-    if (!aEvent.isTrusted || // Don't trust synthetic events
-        aEvent.button == 2 || aEvent.target.localName != "button") {
-      return;
-    }
-
-    let originalTarget = aEvent.originalTarget;
-    let ownerDoc = originalTarget.ownerDocument;
-    if (ownerDoc.documentURI != "about:home") {
-      // This shouldn't happen, but we're being defensive.
-      return;
-    }
-
-    let elmId = originalTarget.getAttribute("id");
-
-    switch (elmId) {
-      case "restorePreviousSession":
-        sendAsyncMessage("AboutHome:RestorePreviousSession");
-        ownerDoc.getElementById("launcher").removeAttribute("session");
-        break;
-
-      case "downloads":
-        sendAsyncMessage("AboutHome:Downloads");
-        break;
-
-      case "bookmarks":
-        sendAsyncMessage("AboutHome:Bookmarks");
-        break;
-
-      case "history":
-        sendAsyncMessage("AboutHome:History");
-        break;
-
-      case "addons":
-        sendAsyncMessage("AboutHome:Addons");
-        break;
-
-      case "sync":
-        sendAsyncMessage("AboutHome:Sync");
-        break;
-
-      case "settings":
-        sendAsyncMessage("AboutHome:Settings");
-        break;
-    }
-  },
-
-  onPageHide(aEvent) {
-    if (aEvent.target.defaultView.frameElement) {
-      return;
-    }
-    removeMessageListener("AboutHome:Update", this);
-    removeEventListener("click", this, true);
-    removeEventListener("pagehide", this, true);
-  },
-};
-AboutHomeListener.init(this);
-
 var AboutReaderListener = {
 
   _articlePromise: null,
 
   _isLeavingReaderableReaderMode: false,
 
   init() {
     addEventListener("AboutReaderContentLoaded", this, false, true);
deleted file mode 100644
--- a/browser/base/content/test/about/aboutHome_content_script.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/* eslint-env mozilla/frame-script */
-
-addMessageListener("AboutHome:SearchTriggered", function(msg) {
-  sendAsyncMessage("AboutHomeTest:CheckRecordedSearch", msg.data);
-});
--- a/browser/base/content/test/about/browser.ini
+++ b/browser/base/content/test/about/browser.ini
@@ -1,30 +1,21 @@
 [DEFAULT]
 support-files =
-  aboutHome_content_script.js
   head.js
   print_postdata.sjs
   searchSuggestionEngine.sjs
   searchSuggestionEngine.xml
-  test_bug959531.html
   POSTSearchEngine.xml
 
 [browser_aboutCertError.js]
 support-files =
   dummy_page.html
-[browser_aboutHome_imitate.js]
-[browser_aboutHome_input.js]
-skip-if = true # Bug 1409054 to remove; previously skipped for intermittents, e.g., Bug 1399648
 [browser_aboutHome_search_POST.js]
 [browser_aboutHome_search_composing.js]
 [browser_aboutHome_search_searchbar.js]
 [browser_aboutHome_search_suggestion.js]
 skip-if = os == "mac" || (os == "linux" && (!debug || bits == 64)) # Bug 1399648, bug 1402502
 [browser_aboutHome_search_telemetry.js]
-[browser_aboutHome_snippets.js]
-skip-if = true # Bug 1409054 to remove
-[browser_aboutHome_wrapsCorrectly.js]
-skip-if = true # Bug 1409054 to remove; previously skipped for intermittents, e.g., Bug 1395602
 [browser_aboutNetError.js]
 [browser_aboutStopReload.js]
 [browser_aboutSupport.js]
 [browser_aboutSupport_newtab_security_state.js]
deleted file mode 100644
--- a/browser/base/content/test/about/browser_aboutHome_imitate.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/
- */
-
-ignoreAllUncaughtExceptions();
-
-add_task(async function() {
-  info("Make sure that a page can't imitate about:home");
-
-  await BrowserTestUtils.withNewTab({ gBrowser, url: "about:home" }, async function(browser) {
-    let promise = BrowserTestUtils.browserLoaded(browser);
-    browser.loadURI("https://example.com/browser/browser/base/content/test/about/test_bug959531.html");
-    await promise;
-
-    await ContentTask.spawn(browser, null, async function() {
-      let button = content.document.getElementById("settings");
-      ok(button, "Found settings button in test page");
-      button.click();
-    });
-
-    await new Promise(resolve => {
-      // It may take a few turns of the event loop before the window
-      // is displayed, so we wait.
-      function check(n) {
-        let win = Services.wm.getMostRecentWindow("Browser:Preferences");
-        ok(!win, "Preferences window not showing");
-        if (win) {
-          win.close();
-        }
-
-        if (n > 0) {
-          executeSoon(() => check(n - 1));
-        } else {
-          resolve();
-        }
-      }
-
-      check(5);
-    });
-  });
-});
deleted file mode 100644
--- a/browser/base/content/test/about/browser_aboutHome_input.js
+++ /dev/null
@@ -1,81 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/
- */
-
-ChromeUtils.defineModuleGetter(this, "AppConstants",
-  "resource://gre/modules/AppConstants.jsm");
-
-ignoreAllUncaughtExceptions();
-
-// The following two tests need to be skipped for the time being, since we're
-// no longer showing the launcher options on about:home. When we remove about:home
-// and all of it's code, we can delete these tests
-add_task(async function() {
-  info("Pressing Space while the Addons button is focused should activate it");
-
-  // Skip this test on Mac, because Space doesn't activate the button there.
-  if (AppConstants.platform == "macosx") {
-    return;
-  }
-
-  await BrowserTestUtils.withNewTab({ gBrowser, url: "about:home" }, async function(browser) {
-    info("Waiting for about:addons tab to open...");
-    let promiseTabLoaded = BrowserTestUtils.browserLoaded(browser, false, "about:addons");
-
-    await ContentTask.spawn(browser, null, async function() {
-      let addOnsButton = content.document.getElementById("addons");
-      addOnsButton.focus();
-    });
-    await BrowserTestUtils.synthesizeKey(" ", {}, browser);
-
-    await promiseTabLoaded;
-    is(browser.currentURI.spec, "about:addons",
-      "Should have seen the about:addons tab");
-  });
-}).skip();
-
-add_task(async function() {
-  info("Sync button should open about:preferences#sync");
-
-  await BrowserTestUtils.withNewTab({ gBrowser, url: "about:home" }, async function(browser) {
-    let oldOpenPrefs = window.openPreferences;
-    let openPrefsPromise = new Promise(resolve => {
-      window.openPreferences = function(pane, params) {
-        resolve({ pane, params });
-      };
-    });
-
-    await BrowserTestUtils.synthesizeMouseAtCenter("#sync", {}, browser);
-
-    let result = await openPrefsPromise;
-    window.openPreferences = oldOpenPrefs;
-
-    is(result.pane, "paneSync", "openPreferences should be called with paneSync");
-    is(result.params.urlParams.entrypoint, "abouthome",
-      "openPreferences should be called with abouthome entrypoint");
-  });
-}).skip();
-
-add_task(async function() {
-  info("Pressing any key should focus the search box in the page, and send the key to it");
-
-  await BrowserTestUtils.withNewTab({ gBrowser, url: "about:home" }, async function(browser) {
-    await BrowserTestUtils.synthesizeMouseAtCenter("#brandLogo", {}, browser);
-
-    await ContentTask.spawn(browser, null, async function() {
-      let doc = content.document;
-      isnot(doc.getElementById("searchText"), doc.activeElement,
-        "Search input should not be the active element.");
-    });
-
-    await BrowserTestUtils.synthesizeKey("a", {}, browser);
-
-    await ContentTask.spawn(browser, null, async function() {
-      let doc = content.document;
-      let searchInput = doc.getElementById("searchText");
-      await ContentTaskUtils.waitForCondition(() => doc.activeElement === searchInput,
-        "Search input should be the active element.");
-      is(searchInput.value, "a", "Search input should be 'a'.");
-    });
-  });
-});
deleted file mode 100644
--- a/browser/base/content/test/about/browser_aboutHome_snippets.js
+++ /dev/null
@@ -1,234 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/
- */
-
-ChromeUtils.defineModuleGetter(this, "AboutHomeUtils",
-  "resource:///modules/AboutHome.jsm");
-
-ignoreAllUncaughtExceptions();
-var gRightsVersion = Services.prefs.getIntPref("browser.rights.version");
-
-add_task(async function setup() {
-  // The following prefs would affect tests so make sure to disable them
-  // before any tests start.
-  await SpecialPowers.pushPrefEnv({set: [
-    ["browser.onboarding.enabled", false],
-    ["network.cookie.cookieBehavior", 0],
-    ["network.cookie.lifetimePolicy", 0],
-    ["browser.rights.override", true],
-    [`browser.rights.${gRightsVersion}.shown`, false]
-  ]});
-});
-
-add_task(async function() {
-  info("Check that clearing cookies does not clear storage");
-
-  await withSnippetsMap(
-    () => {
-      Services.obs.notifyObservers(null, "cookie-changed", "cleared");
-    },
-    function() {
-      isnot(content.gSnippetsMap.get("snippets-last-update"), null,
-            "snippets-last-update should have a value");
-    });
-});
-
-add_task(async function() {
-  info("Check default snippets are shown");
-
-  await withSnippetsMap(null, function() {
-    let doc = content.document;
-    let snippetsElt = doc.getElementById("snippets");
-    ok(snippetsElt, "Found snippets element");
-    is(snippetsElt.getElementsByTagName("span").length, 1,
-       "A default snippet is present.");
-  });
-});
-
-add_task(async function() {
-  info("Check default snippets are shown if snippets are invalid xml");
-
-  await withSnippetsMap(
-    // This must set some incorrect xhtml code.
-    snippetsMap => snippetsMap.set("snippets", "<p><b></p></b>"),
-    function() {
-      let doc = content.document;
-      let snippetsElt = doc.getElementById("snippets");
-      ok(snippetsElt, "Found snippets element");
-      is(snippetsElt.getElementsByTagName("span").length, 1,
-         "A default snippet is present.");
-
-      content.gSnippetsMap.delete("snippets");
-    });
-});
-
-add_task(async function() {
-  info("Check snippets map is cleared if cached version is old");
-
-  await withSnippetsMap(
-    snippetsMap => {
-      snippetsMap.set("snippets", "test");
-      snippetsMap.set("snippets-cached-version", 0);
-    },
-    function() {
-      let snippetsMap = content.gSnippetsMap;
-      ok(!snippetsMap.has("snippets"), "snippets have been properly cleared");
-      ok(!snippetsMap.has("snippets-cached-version"),
-         "cached-version has been properly cleared");
-    });
-});
-
-add_task(async function() {
-  info("Check cached snippets are shown if cached version is current");
-
-  await withSnippetsMap(
-    snippetsMap => snippetsMap.set("snippets", "test"),
-    function(args) {
-      let doc = content.document;
-      let snippetsMap = content.gSnippetsMap;
-
-      let snippetsElt = doc.getElementById("snippets");
-      ok(snippetsElt, "Found snippets element");
-      is(snippetsElt.innerHTML, "test", "Cached snippet is present.");
-
-      is(snippetsMap.get("snippets"), "test", "snippets still cached");
-      is(snippetsMap.get("snippets-cached-version"),
-         args.expectedVersion,
-         "cached-version is correct");
-      ok(snippetsMap.has("snippets-last-update"), "last-update still exists");
-    }, { expectedVersion: AboutHomeUtils.snippetsVersion });
-});
-
-add_task(async function() {
-  info("Check if the 'Know Your Rights' default snippet is shown when " +
-    "'browser.rights.override' pref is set and that its link works");
-
-  Services.prefs.setBoolPref("browser.rights.override", false);
-
-  ok(AboutHomeUtils.showKnowYourRights, "AboutHomeUtils.showKnowYourRights should be TRUE");
-
-  await withSnippetsMap(null, function() {
-    let doc = content.document;
-    let snippetsElt = doc.getElementById("snippets");
-    ok(snippetsElt, "Found snippets element");
-    let linkEl = snippetsElt.querySelector("a");
-    is(linkEl.href, "about:rights", "Snippet link is present.");
-  }, null, async function() {
-    let loadPromise = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser, false, "about:rights");
-    await BrowserTestUtils.synthesizeMouseAtCenter("a[href='about:rights']", {
-      button: 0
-    }, gBrowser.selectedBrowser);
-    await loadPromise;
-    is(gBrowser.currentURI.spec, "about:rights", "about:rights should have opened.");
-  });
-});
-
-add_task(async function() {
-  info("Check if the 'Know Your Rights' default snippet is NOT shown when " +
-    "'browser.rights.override' pref is NOT set");
-
-  Services.prefs.setBoolPref("browser.rights.override", true);
-
-  let rightsData = AboutHomeUtils.knowYourRightsData;
-  ok(!rightsData, "AboutHomeUtils.knowYourRightsData should be FALSE");
-
-  await withSnippetsMap(null, function() {
-    let doc = content.document;
-    let snippetsElt = doc.getElementById("snippets");
-    ok(snippetsElt, "Found snippets element");
-    ok(snippetsElt.getElementsByTagName("a")[0].href != "about:rights",
-      "Snippet link should not point to about:rights.");
-  });
-});
-
-/**
- * Cleans up snippets and ensures that by default we don't try to check for
- * remote snippets since that may cause network bustage or slowness.
- *
- * @param aSetupFn
- *        The setup function to be run.
- * @param testFn
- *        the content task to run
- * @param testArgs (optional)
- *        the parameters to pass to the content task
- * @param parentFn (optional)
- *        the function to run in the parent after the content task has completed.
- * @return {Promise} resolved when the snippets are ready.  Gets the snippets map.
- */
-async function withSnippetsMap(setupFn, testFn, testArgs = null, parentFn = null) {
-  let setupFnSource;
-  if (setupFn) {
-    setupFnSource = setupFn.toSource();
-  }
-
-  await BrowserTestUtils.withNewTab({ gBrowser, url: "about:blank" }, async function(browser) {
-    let promiseAfterLocationChange = () => {
-      return ContentTask.spawn(browser, {
-        setupFnSource,
-        version: AboutHomeUtils.snippetsVersion,
-      }, async function(args) {
-        return new Promise(resolve => {
-          let document = content.document;
-          // We're not using Promise-based listeners, because they resolve asynchronously.
-          // The snippets test setup code relies on synchronous behaviour here.
-          document.addEventListener("AboutHomeLoadSnippets", function() {
-            let updateSnippets;
-            if (args.setupFnSource) {
-              // eslint-disable-next-line no-eval
-              updateSnippets = eval(`(() => (${args.setupFnSource}))()`);
-            }
-
-            content.wrappedJSObject.ensureSnippetsMapThen(snippetsMap => {
-              snippetsMap = Cu.waiveXrays(snippetsMap);
-              info("Got snippets map: " +
-                   "{ last-update: " + snippetsMap.get("snippets-last-update") +
-                   ", cached-version: " + snippetsMap.get("snippets-cached-version") +
-                   " }");
-              // Don't try to update.
-              snippetsMap.set("snippets-last-update", Date.now());
-              snippetsMap.set("snippets-cached-version", args.version);
-              // Clear snippets.
-              snippetsMap.delete("snippets");
-
-              if (updateSnippets) {
-                updateSnippets(snippetsMap);
-              }
-
-              // Tack it to the global object
-              content.gSnippetsMap = snippetsMap;
-
-              resolve();
-            });
-          }, {once: true});
-        });
-      });
-    };
-
-    // We'd like to listen to the 'AboutHomeLoadSnippets' event on a fresh
-    // document as soon as technically possible, so we use webProgress.
-    let promise = new Promise(resolve => {
-      let wpl = {
-        onLocationChange() {
-          gBrowser.removeProgressListener(wpl);
-          // Phase 2: retrieving the snippets map is the next promise on our agenda.
-          promiseAfterLocationChange().then(resolve);
-        },
-        onProgressChange() {},
-        onStatusChange() {},
-        onSecurityChange() {}
-      };
-      gBrowser.addProgressListener(wpl);
-    });
-
-    // Set the URL to 'about:home' here to allow capturing the 'AboutHomeLoadSnippets'
-    // event.
-    browser.loadURI("about:home");
-    // Wait for LocationChange.
-    await promise;
-
-    await ContentTask.spawn(browser, testArgs, testFn);
-    if (parentFn) {
-      await parentFn();
-    }
-  });
-}
deleted file mode 100644
--- a/browser/base/content/test/about/browser_aboutHome_wrapsCorrectly.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/
- */
-
-add_task(async function() {
-  let newWindow = await BrowserTestUtils.openNewBrowserWindow();
-
-  let resizedPromise = BrowserTestUtils.waitForEvent(newWindow, "resize");
-  newWindow.resizeTo(300, 300);
-  await resizedPromise;
-
-  await BrowserTestUtils.openNewForegroundTab(newWindow.gBrowser, "about:home");
-
-  await ContentTask.spawn(newWindow.gBrowser.selectedBrowser, {}, async function() {
-    Assert.equal(content.document.body.getAttribute("narrow"), "true", "narrow mode");
-  });
-
-  resizedPromise = BrowserTestUtils.waitForContentEvent(newWindow.gBrowser.selectedBrowser, "resize");
-
-
-  await ContentTask.spawn(newWindow.gBrowser.selectedBrowser, {}, async function() {
-    content.window.resizeTo(800, 800);
-  });
-
-  await resizedPromise;
-
-  await ContentTask.spawn(newWindow.gBrowser.selectedBrowser, {}, async function() {
-    Assert.equal(content.document.body.hasAttribute("narrow"), false, "non-narrow mode");
-  });
-
-  await BrowserTestUtils.closeWindow(newWindow);
-});
deleted file mode 100644
--- a/browser/base/content/test/about/test_bug959531.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <title>Test for content page with settings button</title>
-  </head>
-  <body>
-    <button name="settings" id="settings">Settings</button>
-  </body>
-</html>
--- a/browser/base/jar.mn
+++ b/browser/base/jar.mn
@@ -8,39 +8,16 @@ browser.jar:
 *       content/browser/aboutDialog.xul               (content/aboutDialog.xul)
         content/browser/aboutDialog.js                (content/aboutDialog.js)
         content/browser/aboutDialog.css               (content/aboutDialog.css)
         content/browser/aboutRestartRequired.js       (content/aboutRestartRequired.js)
         content/browser/aboutRestartRequired.xhtml    (content/aboutRestartRequired.xhtml)
         content/browser/aboutRobots.xhtml             (content/aboutRobots.xhtml)
         content/browser/aboutRobots.js                (content/aboutRobots.js)
         content/browser/aboutRobots.css               (content/aboutRobots.css)
-*       content/browser/abouthome/aboutHome.xhtml     (content/abouthome/aboutHome.xhtml)
-        content/browser/abouthome/aboutHome.js        (content/abouthome/aboutHome.js)
-*       content/browser/abouthome/aboutHome.css       (content/abouthome/aboutHome.css)
-        content/browser/abouthome/snippet1.png        (content/abouthome/snippet1.png)
-        content/browser/abouthome/snippet2.png        (content/abouthome/snippet2.png)
-        content/browser/abouthome/downloads.png       (content/abouthome/downloads.png)
-        content/browser/abouthome/bookmarks.png       (content/abouthome/bookmarks.png)
-        content/browser/abouthome/history.png         (content/abouthome/history.png)
-        content/browser/abouthome/addons.png          (content/abouthome/addons.png)
-        content/browser/abouthome/sync.png            (content/abouthome/sync.png)
-        content/browser/abouthome/settings.png        (content/abouthome/settings.png)
-        content/browser/abouthome/restore.png         (content/abouthome/restore.png)
-        content/browser/abouthome/restore-large.png   (content/abouthome/restore-large.png)
-        content/browser/abouthome/snippet1@2x.png      (content/abouthome/snippet1@2x.png)
-        content/browser/abouthome/snippet2@2x.png      (content/abouthome/snippet2@2x.png)
-        content/browser/abouthome/downloads@2x.png     (content/abouthome/downloads@2x.png)
-        content/browser/abouthome/bookmarks@2x.png     (content/abouthome/bookmarks@2x.png)
-        content/browser/abouthome/history@2x.png       (content/abouthome/history@2x.png)
-        content/browser/abouthome/addons@2x.png        (content/abouthome/addons@2x.png)
-        content/browser/abouthome/sync@2x.png          (content/abouthome/sync@2x.png)
-        content/browser/abouthome/settings@2x.png      (content/abouthome/settings@2x.png)
-        content/browser/abouthome/restore@2x.png       (content/abouthome/restore@2x.png)
-        content/browser/abouthome/restore-large@2x.png (content/abouthome/restore-large@2x.png)
 
         content/browser/illustrations/error-connection-failure.svg (content/illustrations/error-connection-failure.svg)
         content/browser/illustrations/error-server-not-found.svg (content/illustrations/error-server-not-found.svg)
         content/browser/illustrations/error-malformed-url.svg (content/illustrations/error-malformed-url.svg)
         content/browser/illustrations/under-construction.svg (content/illustrations/under-construction.svg)
         content/browser/aboutNetError.xhtml            (content/aboutNetError.xhtml)
         content/browser/aboutNetError.js               (content/aboutNetError.js)
         content/browser/aboutRobots-icon.png          (content/aboutRobots-icon.png)
deleted file mode 100644
index 3f1d2d39652926f67bc4fe9344ea18c09cdde478..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/branding/unofficial/content/jar.mn
+++ b/browser/branding/unofficial/content/jar.mn
@@ -2,17 +2,16 @@
 # 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/.
 
 browser.jar:
 % content branding %content/branding/ contentaccessible=yes
   content/branding/about.png
   content/branding/about-background.png
   content/branding/about-logo.png
-  content/branding/about-logo@2x.png
   content/branding/about-wordmark.svg
   content/branding/icon16.png                    (../default16.png)
   content/branding/icon32.png                    (../default32.png)
   content/branding/icon48.png                    (../default48.png)
   content/branding/icon64.png                    (../default64.png)
   content/branding/icon128.png                   (../default128.png)
   content/branding/identity-icons-brand.svg
   content/branding/aboutDialog.css
--- a/browser/components/newtab/aboutNewTabService.js
+++ b/browser/components/newtab/aboutNewTabService.js
@@ -8,19 +8,16 @@
 
 ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
 ChromeUtils.import("resource://gre/modules/Services.jsm");
 ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
 
 ChromeUtils.defineModuleGetter(this, "AboutNewTab",
                                "resource:///modules/AboutNewTab.jsm");
 
-// Dummy references to the files that this service no longer allows loading.
-// Bug 1409054 to remove "chrome://browser/content/abouthome/aboutHome.xhtml"
-
 const TOPIC_APP_QUIT = "quit-application-granted";
 const TOPIC_LOCALES_CHANGE = "intl:app-locales-changed";
 
 // Automated tests ensure packaged locales are in this list. Copied output of:
 // https://github.com/mozilla/activity-stream/blob/master/bin/render-activity-stream-html.js
 const ACTIVITY_STREAM_LOCALES = "en-US ach an ar ast az be bg bn-BD bn-IN br bs ca cak crh cs cy da de dsb el en-CA en-GB eo es-AR es-CL es-ES es-MX et eu fa ff fi fr fy-NL ga-IE gd gl gn gu-IN he hi-IN hr hsb hu hy-AM ia id it ja ka kab kk km kn ko lij lo lt ltg lv mai mk ml mr ms my nb-NO ne-NP nl nn-NO pa-IN pl pt-BR pt-PT rm ro ru si sk sl sq sr sv-SE ta te th tl tr uk ur uz vi zh-CN zh-TW".split(" ");
 
 const ABOUT_URL = "about:newtab";
--- a/browser/components/nsBrowserGlue.js
+++ b/browser/components/nsBrowserGlue.js
@@ -136,28 +136,27 @@ XPCOMUtils.defineLazyModuleGetters(this,
   ShellService: "resource:///modules/ShellService.jsm",
   TabCrashHandler: "resource:///modules/ContentCrashHandlers.jsm",
   UIState: "resource://services-sync/UIState.jsm",
   UITour: "resource:///modules/UITour.jsm",
   WebChannel: "resource://gre/modules/WebChannel.jsm",
   WindowsRegistry: "resource://gre/modules/WindowsRegistry.jsm",
 });
 
-/* global AboutHome:false, ContentPrefServiceParent:false, ContentSearch:false,
+/* global ContentPrefServiceParent:false, ContentSearch:false,
           UpdateListener:false, webrtcUI:false */
 
 /**
  * IF YOU ADD OR REMOVE FROM THIS LIST, PLEASE UPDATE THE LIST ABOVE AS WELL.
  * XXX Bug 1325373 is for making eslint detect these automatically.
  */
 
 let initializedModules = {};
 
 [
-  ["AboutHome", "resource:///modules/AboutHome.jsm", "init"],
   ["ContentPrefServiceParent", "resource://gre/modules/ContentPrefServiceParent.jsm", "alwaysInit"],
   ["ContentSearch", "resource:///modules/ContentSearch.jsm", "init"],
   ["UpdateListener", "resource://gre/modules/UpdateListener.jsm", "init"],
   ["webrtcUI", "resource:///modules/webrtcUI.jsm", "init"],
 ].forEach(([name, resource, init]) => {
   XPCOMUtils.defineLazyGetter(this, name, () => {
     ChromeUtils.import(resource, initializedModules);
     initializedModules[name][init]();
@@ -205,18 +204,16 @@ const listeners = {
 
     "FeedConverter:addLiveBookmark": ["Feeds"],
     "WCCR:setAutoHandler": ["Feeds"],
     "webrtc:UpdateGlobalIndicators": ["webrtcUI"],
     "webrtc:UpdatingIndicators": ["webrtcUI"],
   },
 
   mm: {
-    "AboutHome:MaybeShowMigrateMessage": ["AboutHome"],
-    "AboutHome:RequestUpdate": ["AboutHome"],
     "Content:Click": ["ContentClick"],
     "ContentSearch": ["ContentSearch"],
     "FormValidation:ShowPopup": ["FormValidationHandler"],
     "FormValidation:HidePopup": ["FormValidationHandler"],
     "Prompt:Open": ["RemotePrompt"],
     "Reader:FaviconRequest": ["ReaderParent"],
     "Reader:UpdateReaderButton": ["ReaderParent"],
     // PLEASE KEEP THIS LIST IN SYNC WITH THE MOBILE LISTENERS IN BrowserCLH.js
deleted file mode 100644
--- a/browser/locales/en-US/chrome/browser/aboutHome.dtd
+++ /dev/null
@@ -1,40 +0,0 @@
-<!-- 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 % brandDTD SYSTEM "chrome://branding/locale/brand.dtd">
-%brandDTD;
-<!ENTITY % syncBrandDTD SYSTEM "chrome://browser/locale/syncBrand.dtd">
-%syncBrandDTD;
-
-<!-- These strings are used in the about:home page -->
-
-<!ENTITY abouthome.pageTitle "&brandFullName; Start Page">
-
-<!-- LOCALIZATION NOTE (abouthome.defaultSnippet1.v1):
-     text in <a/> will be linked to the Firefox features page on mozilla.com
--->
-<!ENTITY abouthome.defaultSnippet1.v1 "Thanks for choosing Firefox! To get the most out of your browser, learn more about the <a>latest features</a>.">
-<!-- LOCALIZATION NOTE (abouthome.defaultSnippet2.v1):
-     text in <a/> will be linked to the featured add-ons on addons.mozilla.org
--->
-<!ENTITY abouthome.defaultSnippet2.v1 "It’s easy to customize your Firefox exactly the way you want it. <a>Choose from thousands of add-ons</a>.">
-<!-- LOCALIZATION NOTE (abouthome.rightsSnippet): text in <a/> will be linked to about:rights -->
-<!ENTITY abouthome.rightsSnippet "&brandFullName; is free and open source software from the non-profit Mozilla Foundation. <a>Know your rights…</a>">
-
-<!ENTITY abouthome.bookmarksButton.label "Bookmarks">
-<!ENTITY abouthome.historyButton.label   "History">
-<!-- LOCALIZATION NOTE (abouthome.preferencesButtonWin.label): The label for the
-     preferences/options item on about:home on Windows -->
-<!ENTITY abouthome.preferencesButtonWin.label  "Options">
-<!-- LOCALIZATION NOTE (abouthome.preferencesButtonUnix.label): The label for the
-     preferences/options item on about:home on Linux and OS X -->
-<!ENTITY abouthome.preferencesButtonUnix.label  "Preferences">
-<!ENTITY abouthome.addonsButton.label    "Add-ons">
-<!ENTITY abouthome.downloadsButton.label "Downloads">
-<!ENTITY abouthome.syncButton.label      "&syncBrand.shortName.label;">
-
-<!-- LOCALIZATION NOTE (abouthome.aboutMozilla.label): The (invisible) label for
-     the mozilla wordmark in the top-right corner that links to Mozilla's main
-     about page. -->
-<!ENTITY abouthome.aboutMozilla.label    "About Mozilla">
--- a/browser/locales/jar.mn
+++ b/browser/locales/jar.mn
@@ -11,17 +11,16 @@
   browser                                          (%browser/**/*.ftl)
 
 @AB_CD@.jar:
 % locale browser @AB_CD@ %locale/browser/
 *   locale/browser/bookmarks.html                  (generic/profile/bookmarks.html.in)
     locale/browser/aboutDialog.dtd                 (%chrome/browser/aboutDialog.dtd)
     locale/browser/aboutPrivateBrowsing.dtd        (%chrome/browser/aboutPrivateBrowsing.dtd)
     locale/browser/aboutRobots.dtd                 (%chrome/browser/aboutRobots.dtd)
-    locale/browser/aboutHome.dtd                   (%chrome/browser/aboutHome.dtd)
     locale/browser/accounts.properties             (%chrome/browser/accounts.properties)
     locale/browser/aboutRestartRequired.dtd        (%chrome/browser/aboutRestartRequired.dtd)
     locale/browser/aboutSearchReset.dtd            (%chrome/browser/aboutSearchReset.dtd)
     locale/browser/aboutSessionRestore.dtd         (%chrome/browser/aboutSessionRestore.dtd)
     locale/browser/aboutTabCrashed.dtd             (%chrome/browser/aboutTabCrashed.dtd)
     locale/browser/browser.dtd                     (%chrome/browser/browser.dtd)
     locale/browser/baseMenuOverlay.dtd             (%chrome/browser/baseMenuOverlay.dtd)
     locale/browser/browser.properties              (%chrome/browser/browser.properties)
deleted file mode 100644
--- a/browser/modules/AboutHome.jsm
+++ /dev/null
@@ -1,179 +0,0 @@
-/* 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/. */
-
-"use strict";
-
-var EXPORTED_SYMBOLS = [ "AboutHomeUtils", "AboutHome" ];
-
-ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
-ChromeUtils.import("resource://gre/modules/Services.jsm");
-
-ChromeUtils.defineModuleGetter(this, "AppConstants",
-  "resource://gre/modules/AppConstants.jsm");
-ChromeUtils.defineModuleGetter(this, "AutoMigrate",
-  "resource:///modules/AutoMigrate.jsm");
-ChromeUtils.defineModuleGetter(this, "SessionStore",
-  "resource:///modules/sessionstore/SessionStore.jsm");
-
-// Url to fetch snippets, in the urlFormatter service format.
-const SNIPPETS_URL_PREF = "browser.aboutHomeSnippets.updateUrl";
-
-// Should be bumped up if the snippets content format changes.
-const STARTPAGE_VERSION = 4;
-
-var AboutHomeUtils = {
-  get snippetsVersion() {
-    return STARTPAGE_VERSION;
-  },
-
-  /*
-   * showKnowYourRights - Determines if the user should be shown the
-   * about:rights notification. The notification should *not* be shown if
-   * we've already shown the current version, or if the override pref says to
-   * never show it. The notification *should* be shown if it's never been seen
-   * before, if a newer version is available, or if the override pref says to
-   * always show it.
-   */
-  get showKnowYourRights() {
-    // Look for an unconditional override pref. If set, do what it says.
-    // (true --> never show, false --> always show)
-    try {
-      return !Services.prefs.getBoolPref("browser.rights.override");
-    } catch (e) { }
-    // Ditto, for the legacy EULA pref.
-    try {
-      return !Services.prefs.getBoolPref("browser.EULA.override");
-    } catch (e) { }
-
-    if (!AppConstants.MOZILLA_OFFICIAL) {
-      // Non-official builds shouldn't show the notification.
-      return false;
-    }
-
-    // Look to see if the user has seen the current version or not.
-    var currentVersion = Services.prefs.getIntPref("browser.rights.version");
-    try {
-      return !Services.prefs.getBoolPref("browser.rights." + currentVersion + ".shown");
-    } catch (e) { }
-
-    // Legacy: If the user accepted a EULA, we won't annoy them with the
-    // equivalent about:rights page until the version changes.
-    try {
-      return !Services.prefs.getBoolPref("browser.EULA." + currentVersion + ".accepted");
-    } catch (e) { }
-
-    // We haven't shown the notification before, so do so now.
-    return true;
-  }
-};
-
-/**
- * Returns the URL to fetch snippets from, in the urlFormatter service format.
- */
-XPCOMUtils.defineLazyGetter(AboutHomeUtils, "snippetsURL", function() {
-  let updateURL = Services.prefs
-                          .getCharPref(SNIPPETS_URL_PREF)
-                          .replace("%STARTPAGE_VERSION%", STARTPAGE_VERSION);
-  return Services.urlFormatter.formatURL(updateURL);
-});
-
-/**
- * This code provides services to the about:home page. Whenever
- * about:home needs to do something chrome-privileged, it sends a
- * message that's handled here.
- */
-var AboutHome = {
-  MESSAGES: [
-    "AboutHome:RestorePreviousSession",
-    "AboutHome:Downloads",
-    "AboutHome:Bookmarks",
-    "AboutHome:History",
-    "AboutHome:Addons",
-    "AboutHome:Sync",
-    "AboutHome:Settings",
-  ],
-
-  init() {
-    for (let msg of this.MESSAGES) {
-      Services.mm.addMessageListener(msg, this);
-    }
-  },
-
-  // Additional listeners are registered in nsBrowserGlue.js
-  receiveMessage(aMessage) {
-    let window = aMessage.target.ownerGlobal;
-
-    switch (aMessage.name) {
-      case "AboutHome:RestorePreviousSession":
-        if (SessionStore.canRestoreLastSession) {
-          SessionStore.restoreLastSession();
-        }
-        break;
-
-      case "AboutHome:Downloads":
-        window.BrowserDownloadsUI();
-        break;
-
-      case "AboutHome:Bookmarks":
-        window.PlacesCommandHook.showPlacesOrganizer("UnfiledBookmarks");
-        break;
-
-      case "AboutHome:History":
-        window.PlacesCommandHook.showPlacesOrganizer("History");
-        break;
-
-      case "AboutHome:Addons":
-        window.BrowserOpenAddonsMgr();
-        break;
-
-      case "AboutHome:Sync":
-        window.openPreferences("paneSync", { urlParams: { entrypoint: "abouthome" }, origin: "aboutHome"  });
-        break;
-
-      case "AboutHome:Settings":
-        window.openPreferences(undefined, {origin: "aboutHome"} );
-        break;
-
-      case "AboutHome:RequestUpdate":
-        this.sendAboutHomeData(aMessage.target);
-        break;
-
-      case "AboutHome:MaybeShowMigrateMessage":
-        AutoMigrate.shouldShowMigratePrompt(aMessage.target).then((prompt) => {
-          if (prompt) {
-            AutoMigrate.showUndoNotificationBar(aMessage.target);
-          }
-        });
-        break;
-    }
-  },
-
-  // Send all the chrome-privileged data needed by about:home. This
-  // gets re-sent when the search engine changes.
-  sendAboutHomeData(target) {
-    SessionStore.promiseInitialized.then(function() {
-      let data = {
-        showRestoreLastSession: SessionStore.canRestoreLastSession,
-        snippetsURL: AboutHomeUtils.snippetsURL,
-        showKnowYourRights: AboutHomeUtils.showKnowYourRights,
-        snippetsVersion: AboutHomeUtils.snippetsVersion,
-      };
-
-      if (AboutHomeUtils.showKnowYourRights) {
-        // Set pref to indicate we've shown the notification.
-        let currentVersion = Services.prefs.getIntPref("browser.rights.version");
-        Services.prefs.setBoolPref("browser.rights." + currentVersion + ".shown", true);
-      }
-
-      if (target && target.messageManager) {
-        target.messageManager.sendAsyncMessage("AboutHome:Update", data);
-      } else {
-        Services.mm.broadcastAsyncMessage("AboutHome:Update", data);
-      }
-    }).catch(function onError(x) {
-      Cu.reportError("Error in AboutHome.sendAboutHomeData: " + x);
-    });
-  },
-
-};
--- a/browser/modules/moz.build
+++ b/browser/modules/moz.build
@@ -118,17 +118,16 @@ with Files("ZoomUI.jsm"):
 
 BROWSER_CHROME_MANIFESTS += [
     'test/browser/browser.ini',
     'test/browser/formValidation/browser.ini',
 ]
 XPCSHELL_TESTS_MANIFESTS += ['test/unit/xpcshell.ini']
 
 EXTRA_JS_MODULES += [
-    'AboutHome.jsm',
     'AboutNewTab.jsm',
     'AsyncTabSwitcher.jsm',
     'AttributionCode.jsm',
     'BrowserErrorReporter.jsm',
     'BrowserUITelemetry.jsm',
     'BrowserUsageTelemetry.jsm',
     'BrowserWindowTracker.jsm',
     'ContentClick.jsm',
--- a/tools/lint/eslint/modules.json
+++ b/tools/lint/eslint/modules.json
@@ -1,10 +1,9 @@
 {
-  "AboutHome.jsm": ["AboutHomeUtils", "AboutHome"],
   "AddonManager.jsm": ["AddonManager", "AddonManagerPrivate"],
   "addons.js": ["AddonsEngine", "AddonValidator"],
   "addons.jsm": ["Addon", "STATE_ENABLED", "STATE_DISABLED"],
   "addonsreconciler.js": ["AddonsReconciler", "CHANGE_INSTALLED", "CHANGE_UNINSTALLED", "CHANGE_ENABLED", "CHANGE_DISABLED"],
   "AddonTestUtils.jsm": ["AddonTestUtils", "MockAsyncShutdown"],
   "addonutils.js": ["AddonUtils"],
   "ajv-4.1.1.js": ["Ajv"],
   "AlertsHelper.jsm": [],