Bug 1395460 p2 - Remove about:accounts. r?tcsc draft
authorEdouard Oger <eoger@fastmail.com>
Tue, 24 Oct 2017 17:57:03 -0400
changeset 687071 0c7cdd914475357334cd1509a036b675e64c2e3d
parent 687070 cb1ac4765c717e85fa6e746131af35a5693dfefa
child 737572 fdc62480910757cafeaced85a861e9410bccc581
push id86410
push userbmo:eoger@fastmail.com
push dateThu, 26 Oct 2017 21:40:14 +0000
reviewerstcsc
bugs1395460
milestone58.0a1
Bug 1395460 p2 - Remove about:accounts. r?tcsc MozReview-Commit-ID: CdNZRf4divV
browser/base/content/aboutaccounts/aboutaccounts.css
browser/base/content/aboutaccounts/aboutaccounts.js
browser/base/content/aboutaccounts/aboutaccounts.xhtml
browser/base/content/aboutaccounts/main.css
browser/base/content/aboutaccounts/normalize.css
browser/base/content/moz.build
browser/base/content/test/static/browser_parsable_css.js
browser/base/content/test/sync/browser.ini
browser/base/content/test/sync/browser_aboutAccounts.js
browser/base/content/test/sync/content_aboutAccounts.js
browser/base/jar.mn
browser/components/about/AboutRedirector.cpp
browser/components/preferences/in-content/sync.js
browser/components/uitour/test/browser_fxa.js
browser/locales/en-US/chrome/browser/aboutAccounts.dtd
browser/locales/jar.mn
deleted file mode 100644
--- a/browser/base/content/aboutaccounts/aboutaccounts.css
+++ /dev/null
@@ -1,24 +0,0 @@
-html, body {
-  height: 100%;
-}
-
-#remote {
-  width: 100%;
-  height: 100%;
-  border: 0;
-  display: none;
-}
-
-#networkError, #manage, #intro, #stage, #configError {
-  display: none;
-}
-
-#oldsync {
-  background: none;
-  border: 0;
-  color: #0095dd;
-}
-
-#oldsync:focus {
-  outline: 1px dotted #0095dd;
-}
deleted file mode 100644
--- a/browser/base/content/aboutaccounts/aboutaccounts.js
+++ /dev/null
@@ -1,320 +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 {classes: Cc, interfaces: Ci, utils: Cu} = Components;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-Cu.import("resource://gre/modules/FxAccounts.jsm");
-
-var fxAccountsCommon = {};
-Cu.import("resource://gre/modules/FxAccountsCommon.js", fxAccountsCommon);
-
-// for master-password utilities
-Cu.import("resource://services-sync/util.js");
-
-const ACTION_URL_PARAM = "action";
-
-function log(msg) {
-  // dump("FXA: " + msg + "\n");
-}
-
-function updateDisplayedEmail(user) {
-  let emailDiv = document.getElementById("email");
-  if (emailDiv && user) {
-    emailDiv.textContent = user.email;
-  }
-}
-
-var wrapper = {
-  iframe: null,
-
-  init(url, urlParams) {
-    // If a master-password is enabled, we want to encourage the user to
-    // unlock it.  Things still work if not, but the user will probably need
-    // to re-auth next startup (in which case we will get here again and
-    // re-prompt)
-    Utils.ensureMPUnlocked();
-
-    let iframe = document.getElementById("remote");
-    this.iframe = iframe;
-    let docShell = this.iframe.frameLoader.docShell;
-    docShell.QueryInterface(Ci.nsIWebProgress);
-    docShell.addProgressListener(this.iframeListener,
-                                 Ci.nsIWebProgress.NOTIFY_STATE_DOCUMENT |
-                                 Ci.nsIWebProgress.NOTIFY_LOCATION);
-
-    // Ideally we'd just merge urlParams with new URL(url).searchParams, but our
-    // URLSearchParams implementation doesn't support iteration (bug 1085284).
-    let urlParamStr = urlParams.toString();
-    if (urlParamStr) {
-      url += (url.includes("?") ? "&" : "?") + urlParamStr;
-    }
-    this.url = url;
-    // Set the iframe's location with loadURI/LOAD_FLAGS_REPLACE_HISTORY to
-    // avoid having a new history entry being added. REPLACE_HISTORY is used
-    // to replace the current entry, which is `about:blank`.
-    let webNav = iframe.frameLoader.docShell.QueryInterface(Ci.nsIWebNavigation);
-    webNav.loadURI(url, Ci.nsIWebNavigation.LOAD_FLAGS_REPLACE_HISTORY, null, null, null);
-  },
-
-  retry() {
-    let webNav = this.iframe.frameLoader.docShell.QueryInterface(Ci.nsIWebNavigation);
-    webNav.loadURI(this.url, Ci.nsIWebNavigation.LOAD_FLAGS_BYPASS_HISTORY, null, null, null);
-  },
-
-  iframeListener: {
-    QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener,
-                                         Ci.nsISupportsWeakReference,
-                                         Ci.nsISupports]),
-
-    onStateChange(aWebProgress, aRequest, aState, aStatus) {
-      let failure = false;
-
-      // Captive portals sometimes redirect users
-      if ((aState & Ci.nsIWebProgressListener.STATE_REDIRECTING)) {
-        failure = true;
-      } else if ((aState & Ci.nsIWebProgressListener.STATE_STOP)) {
-        if (aRequest instanceof Ci.nsIHttpChannel) {
-          try {
-            failure = aRequest.responseStatus != 200;
-          } catch (e) {
-            failure = aStatus != Components.results.NS_OK;
-          }
-        }
-      }
-
-      // Calling cancel() will raise some OnStateChange notifications by itself,
-      // so avoid doing that more than once
-      if (failure && aStatus != Components.results.NS_BINDING_ABORTED) {
-        aRequest.cancel(Components.results.NS_BINDING_ABORTED);
-        setErrorPage("networkError");
-      }
-    },
-
-    onLocationChange(aWebProgress, aRequest, aLocation, aFlags) {
-      if (aRequest && aFlags & Ci.nsIWebProgressListener.LOCATION_CHANGE_ERROR_PAGE) {
-        aRequest.cancel(Components.results.NS_BINDING_ABORTED);
-        setErrorPage("networkError");
-      }
-    },
-  }
-};
-
-
-// Button onclick handlers
-
-function getStarted() {
-  show("remote");
-}
-
-function retry() {
-  show("remote");
-  wrapper.retry();
-}
-
-function openPrefs() {
-  // Bug 1199303 calls for this tab to always be replaced with Preferences
-  // rather than it opening in a different tab.
-  window.location = "about:preferences#sync";
-}
-
-function init() {
-  fxAccounts.getSignedInUser().then(user => {
-    // tests in particular might cause the window to start closing before
-    // getSignedInUser has returned.
-    if (window.closed) {
-      return Promise.resolve();
-    }
-
-    updateDisplayedEmail(user);
-
-    // Ideally we'd use new URL(document.URL).searchParams, but for about: URIs,
-    // searchParams is empty.
-    let urlParams = new URLSearchParams(document.URL.split("?")[1] || "");
-    let action = urlParams.get(ACTION_URL_PARAM);
-    urlParams.delete(ACTION_URL_PARAM);
-
-    switch (action) {
-    case "signin":
-      if (user) {
-        // asking to sign-in when already signed in just shows manage.
-        show("stage", "manage");
-      } else {
-        return fxAccounts.promiseAccountsSignInURI().then(url => {
-          show("remote");
-          wrapper.init(url, urlParams);
-        });
-      }
-      break;
-    case "email":
-      if (user) {
-        // asking to sign-in/up when already signed in just shows manage.
-        show("stage", "manage");
-      } else {
-        return fxAccounts.promiseAccountsEmailURI().then(url => {
-          show("remote");
-          wrapper.init(url, urlParams);
-        });
-      }
-      break;
-    case "signup":
-      if (user) {
-        // asking to sign-up when already signed in just shows manage.
-        show("stage", "manage");
-      } else {
-        return fxAccounts.promiseAccountsSignUpURI().then(url => {
-          show("remote");
-          wrapper.init(url, urlParams);
-        });
-      }
-      break;
-    case "reauth":
-      // ideally we would only show this when we know the user is in a
-      // "must reauthenticate" state - but we don't.
-      // As the email address will be included in the URL returned from
-      // promiseAccountsForceSigninURI, just always show it.
-      return fxAccounts.promiseAccountsForceSigninURI().then(url => {
-        show("remote");
-        wrapper.init(url, urlParams);
-      });
-    default:
-      // No action specified.
-      if (user) {
-        show("stage", "manage");
-      } else {
-        // Attempt a migration if enabled or show the introductory page
-        // otherwise.
-        return migrateToDevEdition(urlParams).then(migrated => {
-          if (!migrated) {
-            show("stage", "intro");
-            // load the remote frame in the background
-            return fxAccounts.promiseAccountsSignUpURI().then(uri =>
-              wrapper.init(uri, urlParams));
-          }
-          return Promise.resolve();
-        });
-      }
-      break;
-    }
-    return Promise.resolve();
-  }).catch(err => {
-    console.log("Configuration or sign in error", err);
-    setErrorPage("configError");
-  });
-}
-
-function setErrorPage(errorType) {
-  show("stage", errorType);
-}
-
-// Causes the "top-level" element with |id| to be shown - all other top-level
-// elements are hidden.  Optionally, ensures that only 1 "second-level" element
-// inside the top-level one is shown.
-function show(id, childId) {
-  // top-level items are either <div> or <iframe>
-  let allTop = document.querySelectorAll("body > div, iframe");
-  for (let elt of allTop) {
-    if (elt.getAttribute("id") == id) {
-      elt.style.display = "block";
-    } else {
-      elt.style.display = "none";
-    }
-  }
-  if (childId) {
-    // child items are all <div>
-    let allSecond = document.querySelectorAll("#" + id + " > div");
-    for (let elt of allSecond) {
-      if (elt.getAttribute("id") == childId) {
-        elt.style.display = "block";
-      } else {
-        elt.style.display = "none";
-      }
-    }
-  }
-}
-
-// Migrate sync data from the default profile to the dev-edition profile.
-// Returns a promise of a true value if migration succeeded, or false if it
-// failed.
-function migrateToDevEdition(urlParams) {
-  let defaultProfilePath;
-  try {
-    defaultProfilePath = window.getDefaultProfilePath();
-  } catch (e) {} // no default profile.
-
-  if (!defaultProfilePath ||
-      !Services.prefs.getBoolPref("identity.fxaccounts.migrateToDevEdition", false)) {
-    return Promise.resolve(false);
-  }
-
-  Cu.import("resource://gre/modules/osfile.jsm");
-  let fxAccountsStorage = OS.Path.join(defaultProfilePath, fxAccountsCommon.DEFAULT_STORAGE_FILENAME);
-  return OS.File.read(fxAccountsStorage, { encoding: "utf-8" }).then(text => {
-    let accountData = JSON.parse(text).accountData;
-    updateDisplayedEmail(accountData);
-    return fxAccounts.setSignedInUser(accountData);
-  }).then(() => {
-    return fxAccounts.promiseAccountsForceSigninURI().then(url => {
-      show("remote");
-      wrapper.init(url, urlParams);
-    });
-  }).catch(error => {
-    log("Failed to migrate FX Account: " + error);
-    show("stage", "intro");
-    // load the remote frame in the background
-    fxAccounts.promiseAccountsSignUpURI().then(uri => {
-      wrapper.init(uri, urlParams);
-    }).catch(e => {
-      console.log("Failed to load signup page", e);
-      setErrorPage("configError");
-    });
-  }).then(() => {
-    // Reset the pref after migration.
-    Services.prefs.setBoolPref("identity.fxaccounts.migrateToDevEdition", false);
-    return true;
-  }).catch(err => {
-    Cu.reportError("Failed to reset the migrateToDevEdition pref: " + err);
-    return false;
-  });
-}
-
-// Helper function that returns the path of the default profile on disk. Will be
-// overridden in tests.
-function getDefaultProfilePath() {
-  let defaultProfile = Cc["@mozilla.org/toolkit/profile-service;1"]
-                        .getService(Ci.nsIToolkitProfileService)
-                        .defaultProfile;
-  return defaultProfile.rootDir.path;
-}
-
-document.addEventListener("DOMContentLoaded", function() {
-  init();
-  var buttonGetStarted = document.getElementById("buttonGetStarted");
-  buttonGetStarted.addEventListener("click", getStarted);
-
-  var buttonRetry = document.getElementById("buttonRetry");
-  buttonRetry.addEventListener("click", retry);
-
-  var buttonOpenPrefs = document.getElementById("buttonOpenPrefs");
-  buttonOpenPrefs.addEventListener("click", openPrefs);
-}, {capture: true, once: true});
-
-function initObservers() {
-  function observe(subject, topic, data) {
-    log("about:accounts observed " + topic);
-    window.location = "about:accounts?action=signin";
-  }
-
-  Services.obs.addObserver(observe, fxAccountsCommon.ONLOGOUT_NOTIFICATION);
-
-  window.addEventListener("unload", function(event) {
-    log("about:accounts unloading");
-    Services.obs.removeObserver(observe,
-                                fxAccountsCommon.ONLOGOUT_NOTIFICATION);
-  });
-}
-initObservers();
deleted file mode 100644
--- a/browser/base/content/aboutaccounts/aboutaccounts.xhtml
+++ /dev/null
@@ -1,104 +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 % brandDTD SYSTEM "chrome://branding/locale/brand.dtd">
-  %brandDTD;
-  <!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd">
-  %globalDTD;
-  <!ENTITY % aboutAccountsDTD SYSTEM "chrome://browser/locale/aboutAccounts.dtd">
-  %aboutAccountsDTD;
-  <!ENTITY % syncBrandDTD SYSTEM "chrome://browser/locale/syncBrand.dtd">
-  %syncBrandDTD;
-]>
-
-<html xmlns="http://www.w3.org/1999/xhtml" dir="&locale.dir;">
-  <head>
-   <title>&syncBrand.fullName.label;</title>
-   <meta name="viewport" content="width=device-width"/>
-
-
-   <link rel="icon" type="image/png" id="favicon"
-         href="chrome://branding/content/icon32.png"/>
-   <link rel="stylesheet"
-     href="chrome://browser/content/aboutaccounts/normalize.css"
-     type="text/css" />
-   <link rel="stylesheet"
-     href="chrome://browser/content/aboutaccounts/main.css"
-     type="text/css" />
-   <link rel="stylesheet"
-     href="chrome://browser/content/aboutaccounts/aboutaccounts.css"
-     type="text/css" />
-  </head>
-  <body>
-    <div id="stage">
-
-      <div id="manage">
-        <header>
-          <div id="email"></div>
-        </header>
-
-        <section>
-            <img class="graphic graphic-sync-intro" src="chrome://browser/skin/fxa/sync-illustration.svg"/>
-
-            <div class="button-row">
-              <button id="buttonOpenPrefs" class="button" href="#" tabindex="0">&aboutAccountsConfig.syncPreferences.label;</button>
-            </div>
-        </section>
-      </div>
-
-      <div id="intro">
-        <header>
-          <h1>&aboutAccounts.welcome;</h1>
-        </header>
-
-        <section>
-            <img class="graphic graphic-sync-intro" src="chrome://browser/skin/fxa/sync-illustration.svg"/>
-            <div class="description">&aboutAccountsConfig.description;</div>
-
-            <div class="button-row">
-              <button id="buttonGetStarted" class="button" tabindex="1">&aboutAccountsConfig.startButton.label;</button>
-            </div>
-        </section>
-      </div>
-
-      <div id="networkError">
-        <header>
-          <h1>&aboutAccounts.noConnection.title;</h1>
-        </header>
-
-        <section>
-            <img class="graphic graphic-sync-intro" src="chrome://browser/skin/fxa/sync-illustration.svg"/>
-            <div class="description">&aboutAccounts.noConnection.description;</div>
-
-            <div class="button-row">
-              <button id="buttonRetry" class="button" tabindex="3">&aboutAccounts.noConnection.retry;</button>
-            </div>
-        </section>
-      </div>
-
-      <div id="configError">
-        <header>
-          <h1>&aboutAccounts.badConfig.title;</h1>
-        </header>
-
-        <section>
-            <img class="graphic graphic-sync-intro" src="chrome://browser/skin/fxa/sync-illustration.svg"/>
-            <div class="description">&aboutAccounts.badConfig.description;</div>
-
-        </section>
-      </div>
-
-    </div>
-
-    <iframe mozframetype="content" id="remote" />
-
-    <script type="application/javascript"
-      src="chrome://browser/content/utilityOverlay.js"/>
-    <script type="text/javascript"
-      src="chrome://browser/content/aboutaccounts/aboutaccounts.js" />
-  </body>
-</html>
deleted file mode 100644
--- a/browser/base/content/aboutaccounts/main.css
+++ /dev/null
@@ -1,157 +0,0 @@
-*,
-*:before,
-*:after {
-  box-sizing: border-box;
-}
-
-html {
-  background-color: #F2F2F2;
-  height: 100%;
-}
-
-body {
-  color: #424f59;
-  font: message-box;
-  font-size: 14px;
-  height: 100%;
-}
-
-a {
-  color: #0095dd;
-  cursor: pointer; /* Use the correct cursor for anchors without an href */
-}
-
-a:active {
-  outline: none;
-}
-
-a:focus {
-  outline: 1px dotted #0095dd;
-}
-
-
-a.no-underline {
-  text-decoration: none;
-}
-
-#stage {
-  background:#fff;
-  border-radius: 5px;
-  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.25);
-  margin: 0 auto;
-  min-height: 300px;
-  padding: 60px 40px 40px 40px;
-  position: relative;
-  text-align: center;
-  top: 80px;
-  width: 420px;
-}
-
-header h1
-{
-  font-size: 24px;
-  font-weight: 200;
-  line-height: 1em;
-}
-
-#intro header h1 {
-  margin: 0 0 32px 0;
-}
-
-#manage header h1 {
-  margin: 0 0 12px 0;
-}
-
-#manage header #email {
-  margin-bottom: 23px;
-  color: rgb(138, 155, 168);
-  font-size: 19px;
-  text-overflow: ellipsis;
-  overflow: hidden;
-  white-space: nowrap;
-}
-
-.description {
-  font-size: 18px;
-}
-
-.button-row {
-  margin-top: 45px;
-  margin-bottom:20px;
-}
-
-.button-row button,
-.button-row a.button {
-  background: #0095dd;
-  border: none;
-  border-radius: 5px;
-  color: #FFFFFF;
-  cursor: pointer;
-  font-size: 24px;
-  padding: 15px 0;
-  transition-duration: 150ms;
-  transition-property: background-color;
-  width: 100%;
-}
-
-.button-row a.button {
-  display: inline-block;
-  text-decoration: none;
-}
-
-.button-row a.button:active,
-.button-row a.button:hover,
-.button-row a.button:focus,
-.button-row button:active,
-.button-row button:hover,
-.button-row button:focus {
-  background: #08c;
-}
-
-
-.graphic-sync-intro {
-  background-repeat: no-repeat;
-  background-size: contain;
-  height: 231px;
-  width: 231px;
-  margin: 0 auto;
-  overflow: hidden;
-  text-indent: 100%;
-  white-space: nowrap;
-  -moz-context-properties: fill;
-  fill: #bfcbd3;
-}
-
-.description,
-.button-row {
-  margin-top: 30px;
-}
-
-.links  {
-  margin: 20px 0;
-}
-
-@media only screen and (max-width: 500px) {
-  html {
-    background: #fff;
-  }
-
-  #stage {
-    box-shadow: none;
-    margin: 30px auto 0 auto;
-    min-height: none;
-    min-width: 320px;
-    padding: 0 10px;
-    width: 100%;
-  }
-
-  .button-row {
-    margin-top: 20px;
-  }
-
-  .button-row button,
-  .button-row a.button {
-    padding: 10px 0;
-  }
-
-}
deleted file mode 100644
--- a/browser/base/content/aboutaccounts/normalize.css
+++ /dev/null
@@ -1,402 +0,0 @@
-/*! normalize.css v2.1.3 | MIT License | git.io/normalize */
-
-/* ==========================================================================
-   HTML5 display definitions
-   ========================================================================== */
-
-/**
- * Correct `block` display not defined in IE 8/9.
- */
-
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-main,
-nav,
-section,
-summary {
-    display: block;
-}
-
-/**
- * Correct `inline-block` display not defined in IE 8/9.
- */
-
-audio,
-canvas,
-video {
-    display: inline-block;
-}
-
-/**
- * Prevent modern browsers from displaying `audio` without controls.
- * Remove excess height in iOS 5 devices.
- */
-
-audio:not([controls]) {
-    display: none;
-    height: 0;
-}
-
-/**
- * Address `[hidden]` styling not present in IE 8/9.
- * Hide the `template` element in IE, Safari, and Firefox < 22.
- */
-
-[hidden],
-template {
-    display: none;
-}
-
-/* ==========================================================================
-   Base
-   ========================================================================== */
-
-/**
- * 1. Set default font family to sans-serif.
- * 2. Prevent iOS text size adjust after orientation change, without disabling
- *    user zoom.
- */
-
-html {
-    font-family: sans-serif; /* 1 */
-    -ms-text-size-adjust: 100%; /* 2 */
-    -webkit-text-size-adjust: 100%; /* 2 */
-}
-
-/**
- * Remove default margin.
- */
-
-body {
-    margin: 0;
-}
-
-/* ==========================================================================
-   Links
-   ========================================================================== */
-
-/**
- * Remove the gray background color from active links in IE 10.
- */
-
-a {
-    background: transparent;
-}
-
-/**
- * Address `outline` inconsistency between Chrome and other browsers.
- */
-
-a:focus {
-    outline: thin dotted;
-}
-
-/**
- * Improve readability when focused and also mouse hovered in all browsers.
- */
-
-a:active,
-a:hover {
-    outline: 0;
-}
-
-/* ==========================================================================
-   Typography
-   ========================================================================== */
-
-/**
- * Address variable `h1` font-size and margin within `section` and `article`
- * contexts in Firefox 4+, Safari 5, and Chrome.
- */
-
-h1 {
-    font-size: 2em;
-    margin: 0.67em 0;
-}
-
-/**
- * Address styling not present in IE 8/9, Safari 5, and Chrome.
- */
-
-abbr[title] {
-    border-bottom: 1px dotted;
-}
-
-/**
- * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
- */
-
-b,
-strong {
-    font-weight: bold;
-}
-
-/**
- * Address styling not present in Safari 5 and Chrome.
- */
-
-dfn {
-    font-style: italic;
-}
-
-/**
- * Address differences between Firefox and other browsers.
- */
-
-hr {
-    box-sizing: content-box;
-    height: 0;
-}
-
-/**
- * Address styling not present in IE 8/9.
- */
-
-mark {
-    background: #ff0;
-    color: #000;
-}
-
-/**
- * Correct font family set oddly in Safari 5 and Chrome.
- */
-
-code,
-kbd,
-pre,
-samp {
-    font-family: monospace, serif;
-    font-size: 1em;
-}
-
-/**
- * Improve readability of pre-formatted text in all browsers.
- */
-
-pre {
-    white-space: pre-wrap;
-}
-
-/**
- * Set consistent quote types.
- */
-
-q {
-    quotes: "\201C" "\201D" "\2018" "\2019";
-}
-
-/**
- * Address inconsistent and variable font size in all browsers.
- */
-
-small {
-    font-size: 80%;
-}
-
-/**
- * Prevent `sub` and `sup` affecting `line-height` in all browsers.
- */
-
-sub,
-sup {
-    font-size: 75%;
-    line-height: 0;
-    position: relative;
-    vertical-align: baseline;
-}
-
-sup {
-    top: -0.5em;
-}
-
-sub {
-    bottom: -0.25em;
-}
-
-/* ==========================================================================
-   Embedded content
-   ========================================================================== */
-
-/**
- * Remove border when inside `a` element in IE 8/9.
- */
-
-img {
-    border: 0;
-}
-
-/**
- * Correct overflow displayed oddly in IE 9.
- */
-
-svg:not(:root) {
-    overflow: hidden;
-}
-
-/* ==========================================================================
-   Figures
-   ========================================================================== */
-
-/**
- * Address margin not present in IE 8/9 and Safari 5.
- */
-
-figure {
-    margin: 0;
-}
-
-/* ==========================================================================
-   Forms
-   ========================================================================== */
-
-/**
- * Define consistent border, margin, and padding.
- */
-
-fieldset {
-    border: 1px solid #c0c0c0;
-    margin: 0 2px;
-    padding: 0.35em 0.625em 0.75em;
-}
-
-/**
- * 1. Correct `color` not being inherited in IE 8/9.
- * 2. Remove padding so people aren't caught out if they zero out fieldsets.
- */
-
-legend {
-    border: 0; /* 1 */
-    padding: 0; /* 2 */
-}
-
-/**
- * 1. Correct font family not being inherited in all browsers.
- * 2. Correct font size not being inherited in all browsers.
- * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.
- */
-
-button,
-input,
-select,
-textarea {
-    font-family: inherit; /* 1 */
-    font-size: 100%; /* 2 */
-    margin: 0; /* 3 */
-}
-
-/**
- * Address Firefox 4+ setting `line-height` on `input` using `!important` in
- * the UA stylesheet.
- */
-
-button,
-input {
-    line-height: normal;
-}
-
-/**
- * Address inconsistent `text-transform` inheritance for `button` and `select`.
- * All other form control elements do not inherit `text-transform` values.
- * Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+.
- * Correct `select` style inheritance in Firefox 4+ and Opera.
- */
-
-button,
-select {
-    text-transform: none;
-}
-
-/**
- * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
- *    and `video` controls.
- * 2. Correct inability to style clickable `input` types in iOS.
- * 3. Improve usability and consistency of cursor style between image-type
- *    `input` and others.
- */
-
-button,
-html input[type="button"], /* 1 */
-input[type="reset"],
-input[type="submit"] {
-    -webkit-appearance: button; /* 2 */
-    cursor: pointer; /* 3 */
-}
-
-/**
- * Re-set default cursor for disabled elements.
- */
-
-button[disabled],
-html input[disabled] {
-    cursor: default;
-}
-
-/**
- * 1. Address box sizing set to `content-box` in IE 8/9/10.
- * 2. Remove excess padding in IE 8/9/10.
- */
-
-input[type="checkbox"],
-input[type="radio"] {
-    box-sizing: border-box; /* 1 */
-    padding: 0; /* 2 */
-}
-
-/**
- * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
- * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome.
- */
-
-input[type="search"] {
-    -webkit-appearance: textfield; /* 1 */
-    box-sizing: content-box; /* 2 */
-}
-
-/**
- * Remove inner padding and search cancel button in Safari 5 and Chrome
- * on OS X.
- */
-
-input[type="search"]::-webkit-search-cancel-button,
-input[type="search"]::-webkit-search-decoration {
-    -webkit-appearance: none;
-}
-
-/**
- * Remove inner padding and border in Firefox 4+.
- */
-
-button::-moz-focus-inner,
-input::-moz-focus-inner {
-    border: 0;
-    padding: 0;
-}
-
-/**
- * 1. Remove default vertical scrollbar in IE 8/9.
- * 2. Improve readability and alignment in all browsers.
- */
-
-textarea {
-    overflow: auto; /* 1 */
-    vertical-align: top; /* 2 */
-}
-
-/* ==========================================================================
-   Tables
-   ========================================================================== */
-
-/**
- * Remove most spacing between table cells.
- */
-
-table {
-    border-collapse: collapse;
-    border-spacing: 0;
-}
--- a/browser/base/content/moz.build
+++ b/browser/base/content/moz.build
@@ -2,19 +2,16 @@
 # vim: set filetype=python:
 # 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/.
 
 with Files("**"):
     BUG_COMPONENT = ("Firefox", "General")
 
-with Files("aboutaccounts/**"):
-    BUG_COMPONENT = ("Firefox", "Sync")
-
 with Files("abouthealthreport/**"):
     BUG_COMPONENT = ("Firefox Health Report", "Client: Desktop")
 
 with Files("defaultthemes/**"):
     BUG_COMPONENT = ("Firefox", "Theme")
 
 with Files("docs/**"):
     BUG_COMPONENT = ("Core", "Security")
--- a/browser/base/content/test/static/browser_parsable_css.js
+++ b/browser/base/content/test/static/browser_parsable_css.js
@@ -22,19 +22,16 @@ let whitelist = [
   // PDFjs is futureproofing its pseudoselectors, and those rules are dropped.
   {sourceName: /web\/viewer\.css$/i,
    errorMessage: /Unknown pseudo-class.*(fullscreen|selection)/i,
    isFromDevTools: false},
   // PDFjs rules needed for compat with other UAs.
   {sourceName: /web\/viewer\.css$/i,
    errorMessage: /Unknown property.*appearance/i,
    isFromDevTools: false},
-  // Tracked in bug 1004428.
-  {sourceName: /aboutaccounts\/(main|normalize)\.css$/i,
-   isFromDevTools: false},
   // Highlighter CSS uses a UA-only pseudo-class, see bug 985597.
   {sourceName: /highlighters\.css$/i,
    errorMessage: /Unknown pseudo-class.*moz-native-anonymous/i,
    isFromDevTools: true},
   // Responsive Design Mode CSS uses a UA-only pseudo-class, see Bug 1241714.
   {sourceName: /responsive-ua\.css$/i,
    errorMessage: /Unknown pseudo-class.*moz-dropdown-list/i,
    isFromDevTools: true},
--- a/browser/base/content/test/sync/browser.ini
+++ b/browser/base/content/test/sync/browser.ini
@@ -4,12 +4,8 @@ support-files =
 
 [browser_sync.js]
 [browser_contextmenu_sendtab.js]
 [browser_contextmenu_sendpage.js]
 [browser_fxa_web_channel.js]
 support-files=
   browser_fxa_web_channel.html
 [browser_fxa_badge.js]
-[browser_aboutAccounts.js]
-skip-if = os == "linux" # Bug 958026
-support-files =
-  content_aboutAccounts.js
deleted file mode 100644
--- a/browser/base/content/test/sync/browser_aboutAccounts.js
+++ /dev/null
@@ -1,481 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/
- */
-
-XPCOMUtils.defineLazyModuleGetter(this, "Promise",
-  "resource://gre/modules/Promise.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "fxAccounts",
-  "resource://gre/modules/FxAccounts.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "FileUtils",
-  "resource://gre/modules/FileUtils.jsm");
-
-const CHROME_BASE = "chrome://mochitests/content/browser/browser/base/content/test/sync/";
-// Preference helpers.
-var changedPrefs = new Set();
-
-function setPref(name, value) {
-  changedPrefs.add(name);
-  Services.prefs.setCharPref(name, value);
-}
-
-registerCleanupFunction(function() {
-  // Ensure we don't pollute prefs for next tests.
-  for (let name of changedPrefs) {
-    Services.prefs.clearUserPref(name);
-  }
-});
-
-var gTests = [
-{
-  desc: "Test action=signin - no user logged in",
-  teardown: () => gBrowser.removeCurrentTab(),
-  async run() {
-    // When this loads with no user logged-in, we expect the "normal" URL
-    const expected_url = "https://example.com/?is_sign_in";
-    setPref("identity.fxaccounts.remote.signin.uri", expected_url);
-    let [tab, url] = await promiseNewTabWithIframeLoadEvent("about:accounts?action=signin");
-    is(url, expected_url, "action=signin got the expected URL");
-    // we expect the remote iframe to be shown.
-    await checkVisibilities(tab, {
-      stage: false, // parent of 'manage' and 'intro'
-      manage: false,
-      intro: false, // this is  "get started"
-      remote: true,
-      networkError: false
-    });
-  }
-},
-{
-  desc: "Test action=signin - user logged in",
-  async teardown() {
-    gBrowser.removeCurrentTab();
-    await signOut();
-  },
-  async run() {
-    // When this loads with a user logged-in, we expect the normal URL to
-    // have been ignored and the "manage" page to be shown.
-    const expected_url = "https://example.com/?is_sign_in";
-    setPref("identity.fxaccounts.remote.signin.uri", expected_url);
-    await setSignedInUser();
-    let tab = await promiseNewTabLoadEvent("about:accounts?action=signin");
-    // about:accounts initializes after fetching the current user from Fxa -
-    // so we also request it - by the time we get it we know it should have
-    // done its thing.
-    await fxAccounts.getSignedInUser();
-    // we expect "manage" to be shown.
-    await checkVisibilities(tab, {
-      stage: true, // parent of 'manage' and 'intro'
-      manage: true,
-      intro: false, // this is  "get started"
-      remote: false,
-      networkError: false
-    });
-  }
-},
-{
-  desc: "Test action=signin - captive portal",
-  teardown: () => gBrowser.removeCurrentTab(),
-  async run() {
-    const signinUrl = "https://redirproxy.example.com/test";
-    setPref("identity.fxaccounts.remote.signin.uri", signinUrl);
-    let [tab, ] = await promiseNewTabWithIframeLoadEvent("about:accounts?action=signin");
-    await checkVisibilities(tab, {
-      stage: true, // parent of 'manage' and 'intro'
-      manage: false,
-      intro: false, // this is  "get started"
-      remote: false,
-      networkError: true
-    });
-  }
-},
-{
-  desc: "Test action=signin - offline",
-  teardown: () => {
-    gBrowser.removeCurrentTab();
-    BrowserOffline.toggleOfflineStatus();
-  },
-  async run() {
-    BrowserOffline.toggleOfflineStatus();
-    Services.cache2.clear();
-
-    const signinUrl = "https://unknowndomain.cow";
-    setPref("identity.fxaccounts.remote.signin.uri", signinUrl);
-    let [tab, ] = await promiseNewTabWithIframeLoadEvent("about:accounts?action=signin");
-    await checkVisibilities(tab, {
-      stage: true, // parent of 'manage' and 'intro'
-      manage: false,
-      intro: false, // this is  "get started"
-      remote: false,
-      networkError: true
-    });
-  }
-},
-{
-  desc: "Test action=signup - no user logged in",
-  teardown: () => gBrowser.removeCurrentTab(),
-  async run() {
-    const expected_url = "https://example.com/?is_sign_up";
-    setPref("identity.fxaccounts.remote.signup.uri", expected_url);
-    let [tab, url] = await promiseNewTabWithIframeLoadEvent("about:accounts?action=signup");
-    is(url, expected_url, "action=signup got the expected URL");
-    // we expect the remote iframe to be shown.
-    await checkVisibilities(tab, {
-      stage: false, // parent of 'manage' and 'intro'
-      manage: false,
-      intro: false, // this is  "get started"
-      remote: true,
-      networkError: false
-    });
-  },
-},
-{
-  desc: "Test action=signup - user logged in",
-  async teardown() {
-    gBrowser.removeCurrentTab();
-    await signOut();
-  },
-  async run() {
-    const expected_url = "https://example.com/?is_sign_up";
-    setPref("identity.fxaccounts.remote.signup.uri", expected_url);
-    await setSignedInUser();
-    let tab = await promiseNewTabLoadEvent("about:accounts?action=signup");
-    await fxAccounts.getSignedInUser();
-    // we expect "manage" to be shown.
-    await checkVisibilities(tab, {
-      stage: true, // parent of 'manage' and 'intro'
-      manage: true,
-      intro: false, // this is  "get started"
-      remote: false,
-      networkError: false
-    });
-  },
-},
-{
-  desc: "Test action=email - no user logged in",
-  teardown: () => gBrowser.removeCurrentTab(),
-  async run() {
-    const expected_url = "https://example.com/?is_email";
-    setPref("identity.fxaccounts.remote.email.uri", expected_url);
-    let [tab, url] = await promiseNewTabWithIframeLoadEvent("about:accounts?action=email");
-    is(url, expected_url, "action=email got the expected URL");
-    // we expect the remote iframe to be shown.
-    await checkVisibilities(tab, {
-      stage: false, // parent of 'manage' and 'intro'
-      manage: false,
-      intro: false, // this is  "get started"
-      remote: true,
-      networkError: false
-    });
-  },
-},
-{
-  desc: "Test action=email - user logged in",
-  teardown: () => gBrowser.removeCurrentTab(),
-  async run() {
-    const expected_url = "https://example.com/?is_email";
-    setPref("identity.fxaccounts.remote.email.uri", expected_url);
-    await setSignedInUser();
-    let tab = await promiseNewTabLoadEvent("about:accounts?action=email");
-    await fxAccounts.getSignedInUser();
-    // we expect "manage" to be shown.
-    await checkVisibilities(tab, {
-      stage: true, // parent of 'manage' and 'intro'
-      manage: true,
-      intro: false, // this is  "get started"
-      remote: false,
-      networkError: false
-    });
-  },
-},
-{
-  desc: "Test action=reauth",
-  async teardown() {
-    gBrowser.removeCurrentTab();
-    await signOut();
-  },
-  async run() {
-    const expected_url = "https://example.com/force_auth";
-    setPref("identity.fxaccounts.remote.force_auth.uri", expected_url);
-
-    await setSignedInUser();
-    let [, url] = await promiseNewTabWithIframeLoadEvent("about:accounts?action=reauth");
-    // The current user will be appended to the url
-    let expected = expected_url + "?uid=1234%40lcip.org&email=foo%40example.com";
-    is(url, expected, "action=reauth got the expected URL");
-  },
-},
-{
-  desc: "Test with migrateToDevEdition enabled (success)",
-  async teardown() {
-    gBrowser.removeCurrentTab();
-    await signOut();
-  },
-  async run() {
-    let fxAccountsCommon = {};
-    Cu.import("resource://gre/modules/FxAccountsCommon.js", fxAccountsCommon);
-    const pref = "identity.fxaccounts.migrateToDevEdition";
-    changedPrefs.add(pref);
-    Services.prefs.setBoolPref(pref, true);
-
-    // Create the signedInUser.json file that will be used as the source of
-    // migrated user data.
-    let signedInUser = {
-      version: 1,
-      accountData: {
-        email: "foo@example.com",
-        uid: "1234@lcip.org",
-        sessionToken: "dead",
-        verified: true
-      }
-    };
-    // We use a sub-dir of the real profile dir as the "pretend" profile dir
-    // for this test.
-    let profD = Services.dirsvc.get("ProfD", Ci.nsIFile);
-    let mockDir = profD.clone();
-    mockDir.append("about-accounts-mock-profd");
-    mockDir.createUnique(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY);
-    let fxAccountsStorage = OS.Path.join(mockDir.path, fxAccountsCommon.DEFAULT_STORAGE_FILENAME);
-    await OS.File.writeAtomic(fxAccountsStorage, JSON.stringify(signedInUser));
-    info("Wrote file " + fxAccountsStorage);
-
-    // this is a little subtle - we load about:robots so we get a non-remote
-    // tab, then we send a message which does both (a) load the URL we want and
-    // (b) mocks the default profile path used by about:accounts.
-    let tab = await promiseNewTabLoadEvent("about:robots");
-    let readyPromise = promiseOneMessage(tab, "test:load-with-mocked-profile-path-response");
-
-    let mm = tab.linkedBrowser.messageManager;
-    mm.sendAsyncMessage("test:load-with-mocked-profile-path", {
-      url: "about:accounts",
-      profilePath: mockDir.path,
-    });
-
-    let response = await readyPromise;
-    // We are expecting the iframe to be on the "force reauth" URL
-    let expected = await fxAccounts.promiseAccountsForceSigninURI();
-    is(response.data.url, expected);
-
-    let userData = await fxAccounts.getSignedInUser();
-    SimpleTest.isDeeply(userData, signedInUser.accountData, "All account data were migrated");
-    // The migration pref will have been switched off by now.
-    is(Services.prefs.getBoolPref(pref), false, pref + " got the expected value");
-
-    await OS.File.remove(fxAccountsStorage);
-    await OS.File.removeEmptyDir(mockDir.path);
-  },
-},
-{
-  desc: "Test with migrateToDevEdition enabled (no user to migrate)",
-  async teardown() {
-    gBrowser.removeCurrentTab();
-    await signOut();
-  },
-  async run() {
-    const pref = "identity.fxaccounts.migrateToDevEdition";
-    changedPrefs.add(pref);
-    Services.prefs.setBoolPref(pref, true);
-
-    let profD = Services.dirsvc.get("ProfD", Ci.nsIFile);
-    let mockDir = profD.clone();
-    mockDir.append("about-accounts-mock-profd");
-    mockDir.createUnique(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY);
-    // but leave it empty, so we don't think a user is logged in.
-
-    let tab = await promiseNewTabLoadEvent("about:robots");
-    let readyPromise = promiseOneMessage(tab, "test:load-with-mocked-profile-path-response");
-
-    let mm = tab.linkedBrowser.messageManager;
-    mm.sendAsyncMessage("test:load-with-mocked-profile-path", {
-      url: "about:accounts",
-      profilePath: mockDir.path,
-    });
-
-    let response = await readyPromise;
-    // We are expecting the iframe to be on the "signup" URL
-    let expected = await fxAccounts.promiseAccountsSignUpURI();
-    is(response.data.url, expected);
-
-    // and expect no signed in user.
-    let userData = await fxAccounts.getSignedInUser();
-    is(userData, null);
-    // The migration pref should have still been switched off.
-    is(Services.prefs.getBoolPref(pref), false, pref + " got the expected value");
-    await OS.File.removeEmptyDir(mockDir.path);
-  },
-},
-{
-  desc: "Test observers about:accounts",
-  teardown() {
-    gBrowser.removeCurrentTab();
-  },
-  async run() {
-    setPref("identity.fxaccounts.remote.signup.uri", "https://example.com/");
-    await setSignedInUser();
-    let tab = await promiseNewTabLoadEvent("about:accounts");
-    // sign the user out - the tab should have action=signin
-    let loadPromise = promiseOneMessage(tab, "test:document:load");
-    await signOut();
-    // wait for the new load.
-    await loadPromise;
-    is(tab.linkedBrowser.contentDocument.location.href, "about:accounts?action=signin");
-  }
-},
-{
-  desc: "Test entrypoint query string, no action, no user logged in",
-  teardown: () => gBrowser.removeCurrentTab(),
-  async run() {
-    // When this loads with no user logged-in, we expect the "normal" URL
-    setPref("identity.fxaccounts.remote.signup.uri", "https://example.com/");
-    let [, url] = await promiseNewTabWithIframeLoadEvent("about:accounts?entrypoint=abouthome");
-    is(url, "https://example.com/?entrypoint=abouthome", "entrypoint=abouthome got the expected URL");
-  },
-},
-{
-  desc: "Test entrypoint query string for signin",
-  teardown: () => gBrowser.removeCurrentTab(),
-  async run() {
-    // When this loads with no user logged-in, we expect the "normal" URL
-    const expected_url = "https://example.com/?is_sign_in";
-    setPref("identity.fxaccounts.remote.signin.uri", expected_url);
-    let [, url] = await promiseNewTabWithIframeLoadEvent("about:accounts?action=signin&entrypoint=abouthome");
-    is(url, expected_url + "&entrypoint=abouthome", "entrypoint=abouthome got the expected URL");
-  },
-},
-{
-  desc: "Test entrypoint query string for signup",
-  teardown: () => gBrowser.removeCurrentTab(),
-  async run() {
-    // When this loads with no user logged-in, we expect the "normal" URL
-    const sign_up_url = "https://example.com/?is_sign_up";
-    setPref("identity.fxaccounts.remote.signup.uri", sign_up_url);
-    let [, url] = await promiseNewTabWithIframeLoadEvent("about:accounts?entrypoint=abouthome&action=signup");
-    is(url, sign_up_url + "&entrypoint=abouthome", "entrypoint=abouthome got the expected URL");
-  },
-},
-{
-  desc: "about:accounts URL params should be copied to remote URL params " +
-        "when remote URL has no URL params, except for 'action'",
-  teardown() {
-    gBrowser.removeCurrentTab();
-  },
-  async run() {
-    let signupURL = "https://example.com/";
-    setPref("identity.fxaccounts.remote.signup.uri", signupURL);
-    let queryStr = "email=foo%40example.com&foo=bar&baz=quux";
-    let [, url] =
-      await promiseNewTabWithIframeLoadEvent("about:accounts?" + queryStr +
-                                             "&action=action");
-    is(url, signupURL + "?" + queryStr, "URL params are copied to signup URL");
-  },
-},
-{
-  desc: "about:accounts URL params should be copied to remote URL params " +
-        "when remote URL already has some URL params, except for 'action'",
-  teardown() {
-    gBrowser.removeCurrentTab();
-  },
-  async run() {
-    let signupURL = "https://example.com/?param";
-    setPref("identity.fxaccounts.remote.signup.uri", signupURL);
-    let queryStr = "email=foo%40example.com&foo=bar&baz=quux";
-    let [, url] =
-      await promiseNewTabWithIframeLoadEvent("about:accounts?" + queryStr +
-                                             "&action=action");
-    is(url, signupURL + "&" + queryStr, "URL params are copied to signup URL");
-  },
-},
-]; // gTests
-
-function test() {
-  waitForExplicitFinish();
-
-  (async function() {
-    for (let testCase of gTests) {
-      info(testCase.desc);
-      try {
-        await testCase.run();
-      } finally {
-        await testCase.teardown();
-      }
-    }
-
-    finish();
-  })();
-}
-
-function promiseOneMessage(tab, messageName) {
-  let mm = tab.linkedBrowser.messageManager;
-  return new Promise(resolve => {
-    mm.addMessageListener(messageName, function onmessage(message) {
-      mm.removeMessageListener(messageName, onmessage);
-      resolve(message);
-    });
-  });
-}
-
-function promiseNewTabLoadEvent(aUrl) {
-  let tab = gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, aUrl);
-  let browser = tab.linkedBrowser;
-  let mm = browser.messageManager;
-
-  // give it an e10s-friendly content script to help with our tests,
-  // and wait for it to tell us about the load.
-  let promise = promiseOneMessage(tab, "test:document:load");
-  mm.loadFrameScript(CHROME_BASE + "content_aboutAccounts.js", true);
-  return promise.then(() => tab);
-}
-
-// Returns a promise which is resolved with the iframe's URL after a new
-// tab is created and the iframe in that tab loads.
-function promiseNewTabWithIframeLoadEvent(aUrl) {
-  return new Promise(resolve => {
-    let tab = gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, aUrl);
-    let browser = tab.linkedBrowser;
-    let mm = browser.messageManager;
-
-    // give it an e10s-friendly content script to help with our tests,
-    // and wait for it to tell us about the iframe load.
-    mm.addMessageListener("test:iframe:load", function onFrameLoad(message) {
-      mm.removeMessageListener("test:iframe:load", onFrameLoad);
-      resolve([tab, message.data.url]);
-    });
-    mm.loadFrameScript(CHROME_BASE + "content_aboutAccounts.js", true);
-  });
-}
-
-function checkVisibilities(tab, data) {
-  let ids = Object.keys(data);
-  let mm = tab.linkedBrowser.messageManager;
-  return new Promise(resolve => {
-    mm.addMessageListener("test:check-visibilities-response", function onResponse(message) {
-      mm.removeMessageListener("test:check-visibilities-response", onResponse);
-      for (let id of ids) {
-        is(message.data[id], data[id], "Element '" + id + "' has correct visibility");
-      }
-      resolve();
-    });
-    mm.sendAsyncMessage("test:check-visibilities", {ids});
-  });
-}
-
-// watch out - these will fire observers which if you aren't careful, may
-// interfere with the tests.
-function setSignedInUser(data) {
-  if (!data) {
-    data = {
-      email: "foo@example.com",
-      uid: "1234@lcip.org",
-      assertion: "foobar",
-      sessionToken: "dead",
-      kA: "beef",
-      kB: "cafe",
-      verified: true
-    };
-  }
- return fxAccounts.setSignedInUser(data);
-}
-
-function signOut() {
-  // we always want a "localOnly" signout here...
-  return fxAccounts.signOut(true);
-}
deleted file mode 100644
--- a/browser/base/content/test/sync/content_aboutAccounts.js
+++ /dev/null
@@ -1,89 +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/. */
-
-// This file is loaded as a "content script" for browser_aboutAccounts tests
-"use strict";
-
-/* eslint-env mozilla/frame-script */
-
-var {interfaces: Ci, utils: Cu} = Components;
-
-addEventListener("load", function load(event) {
-  if (event.target != content.document) {
-    return;
-  }
-//  content.document.removeEventListener("load", load, true);
-  sendAsyncMessage("test:document:load");
-  // Opening Sync prefs in tests is a pain as leaks are reported due to the
-  // in-flight promises. For now we just mock the openPrefs() function and have
-  // it send a message back to the test so we know it was called.
-  content.openPrefs = function() {
-    sendAsyncMessage("test:openPrefsCalled");
-  };
-}, true);
-
-addEventListener("DOMContentLoaded", function domContentLoaded(event) {
-  removeEventListener("DOMContentLoaded", domContentLoaded, true);
-  let iframe = content.document.getElementById("remote");
-  if (!iframe) {
-    // at least one test initially loads about:blank - in that case, we are done.
-    return;
-  }
-  // We use DOMContentLoaded here as that fires for our iframe even when we've
-  // arranged for the URL in the iframe to cause an error.
-  addEventListener("DOMContentLoaded", function iframeLoaded(dclEvent) {
-    if (iframe.contentWindow.location.href == "about:blank" ||
-        dclEvent.target != iframe.contentDocument) {
-      return;
-    }
-    removeEventListener("DOMContentLoaded", iframeLoaded, true);
-    sendAsyncMessage("test:iframe:load", {url: iframe.contentDocument.location.href});
-    // And an event listener for the test responses, which we send to the test
-    // via a message.
-    iframe.contentWindow.addEventListener("FirefoxAccountsTestResponse", function(fxAccountsEvent) {
-      sendAsyncMessage("test:response", {data: fxAccountsEvent.detail.data});
-    }, true);
-  }, true);
-}, true);
-
-// Return the visibility state of a list of ids.
-addMessageListener("test:check-visibilities", function(message) {
-  let result = {};
-  for (let id of message.data.ids) {
-    let elt = content.document.getElementById(id);
-    if (elt) {
-      let displayStyle = content.window.getComputedStyle(elt).display;
-      if (displayStyle == "none") {
-        result[id] = false;
-      } else if (displayStyle == "block") {
-        result[id] = true;
-      } else {
-        result[id] = "strange: " + displayStyle; // tests should fail!
-      }
-    } else {
-      result[id] = "doesn't exist: " + id;
-    }
-  }
-  sendAsyncMessage("test:check-visibilities-response", result);
-});
-
-addMessageListener("test:load-with-mocked-profile-path", function(message) {
-  addEventListener("DOMContentLoaded", function domContentLoaded(event) {
-    removeEventListener("DOMContentLoaded", domContentLoaded, true);
-    content.getDefaultProfilePath = () => message.data.profilePath;
-    // now wait for the iframe to load.
-    let iframe = content.document.getElementById("remote");
-    iframe.addEventListener("load", function iframeLoaded(loadEvent) {
-      if (iframe.contentWindow.location.href == "about:blank" ||
-          loadEvent.target != iframe) {
-        return;
-      }
-      iframe.removeEventListener("load", iframeLoaded, true);
-      sendAsyncMessage("test:load-with-mocked-profile-path-response",
-                       {url: iframe.contentDocument.location.href});
-    }, true);
-  });
-  let webNav = docShell.QueryInterface(Ci.nsIWebNavigation);
-  webNav.loadURI(message.data.url, webNav.LOAD_FLAGS_NONE, null, null, null);
-}, true);
--- a/browser/base/jar.mn
+++ b/browser/base/jar.mn
@@ -43,22 +43,16 @@ browser.jar:
         content/browser/illustrations/error-malformed-url.svg (content/illustrations/error-malformed-url.svg)
         content/browser/aboutNetError.xhtml            (content/aboutNetError.xhtml)
 
 #ifdef MOZ_SERVICES_HEALTHREPORT
         content/browser/abouthealthreport/abouthealth.xhtml   (content/abouthealthreport/abouthealth.xhtml)
         content/browser/abouthealthreport/abouthealth.js      (content/abouthealthreport/abouthealth.js)
         content/browser/abouthealthreport/abouthealth.css     (content/abouthealthreport/abouthealth.css)
 #endif
-        content/browser/aboutaccounts/aboutaccounts.xhtml                     (content/aboutaccounts/aboutaccounts.xhtml)
-        content/browser/aboutaccounts/aboutaccounts.js                        (content/aboutaccounts/aboutaccounts.js)
-        content/browser/aboutaccounts/aboutaccounts.css                       (content/aboutaccounts/aboutaccounts.css)
-        content/browser/aboutaccounts/main.css                                (content/aboutaccounts/main.css)
-        content/browser/aboutaccounts/normalize.css                           (content/aboutaccounts/normalize.css)
-
 
         content/browser/aboutRobots-icon.png          (content/aboutRobots-icon.png)
         content/browser/aboutRobots-widget-left.png   (content/aboutRobots-widget-left.png)
         content/browser/aboutTabCrashed.css           (content/aboutTabCrashed.css)
         content/browser/aboutTabCrashed.js            (content/aboutTabCrashed.js)
         content/browser/aboutTabCrashed.xhtml         (content/aboutTabCrashed.xhtml)
 *       content/browser/browser.css                   (content/browser.css)
         content/browser/browser.js                    (content/browser.js)
--- a/browser/components/about/AboutRedirector.cpp
+++ b/browser/components/about/AboutRedirector.cpp
@@ -90,18 +90,16 @@ static const RedirEntry kRedirMap[] = {
   { "preferences", "chrome://browser/content/preferences/in-content/preferences.xul",
     nsIAboutModule::ALLOW_SCRIPT },
   { "downloads", "chrome://browser/content/downloads/contentAreaDownloadsView.xul",
     nsIAboutModule::ALLOW_SCRIPT },
 #ifdef MOZ_SERVICES_HEALTHREPORT
   { "healthreport", "chrome://browser/content/abouthealthreport/abouthealth.xhtml",
     nsIAboutModule::ALLOW_SCRIPT },
 #endif
-  { "accounts", "chrome://browser/content/aboutaccounts/aboutaccounts.xhtml",
-    nsIAboutModule::ALLOW_SCRIPT },
   { "reader", "chrome://global/content/reader/aboutReader.html",
     nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
     nsIAboutModule::ALLOW_SCRIPT |
     nsIAboutModule::URI_MUST_LOAD_IN_CHILD |
     nsIAboutModule::HIDE_FROM_ABOUTABOUT },
 };
 
 static nsAutoCString
--- a/browser/components/preferences/in-content/sync.js
+++ b/browser/components/preferences/in-content/sync.js
@@ -455,17 +455,16 @@ var gSyncPane = {
 
     fxAccounts.resendVerificationEmail()
       .then(fxAccounts.getSignedInUser, onError)
       .then(onSuccess, onError);
   },
 
   unlinkFirefoxAccount(confirm) {
     if (confirm) {
-      // We use a string bundle shared with aboutAccounts.
       let sb = Services.strings.createBundle("chrome://browser/locale/syncSetup.properties");
       let disconnectLabel = sb.GetStringFromName("disconnect.label");
       let title = sb.GetStringFromName("disconnect.verify.title");
       let body = sb.GetStringFromName("disconnect.verify.bodyHeading") +
         "\n\n" +
         sb.GetStringFromName("disconnect.verify.bodyText");
       let ps = Services.prompt;
       let buttonFlags = (ps.BUTTON_POS_0 * ps.BUTTON_TITLE_IS_STRING) +
--- a/browser/components/uitour/test/browser_fxa.js
+++ b/browser/components/uitour/test/browser_fxa.js
@@ -43,18 +43,17 @@ var tests = [
     await showHighlightPromise("accountStatus");
     let highlight = document.getElementById("UITourHighlightContainer");
     let expectedTarget = "appMenu-fxa-avatar";
     is(highlight.popupBoxObject.anchorNode.id, expectedTarget, "Anchored on avatar");
     is(highlight.getAttribute("targetName"), "accountStatus", "Correct highlight target");
   }),
 ];
 
-// Helpers copied from browser_aboutAccounts.js
-// watch out - these will fire observers which if you aren't careful, may
+// Watch out - these will fire observers which if you aren't careful, may
 // interfere with the tests.
 function setSignedInUser(data) {
   if (!data) {
     data = {
       email: "foo@example.com",
       uid: "1234@lcip.org",
       assertion: "foobar",
       sessionToken: "dead",
deleted file mode 100644
--- a/browser/locales/en-US/chrome/browser/aboutAccounts.dtd
+++ /dev/null
@@ -1,14 +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 aboutAccounts.welcome "Welcome to &syncBrand.shortName.label;">
-
-<!ENTITY aboutAccountsConfig.description "Sign in to sync your tabs, bookmarks, passwords &amp; more.">
-<!ENTITY aboutAccountsConfig.startButton.label "Get started">
-<!ENTITY aboutAccountsConfig.syncPreferences.label "Sync preferences">
-<!ENTITY aboutAccounts.noConnection.title "No connection">
-<!ENTITY aboutAccounts.noConnection.description "You must be connected to the Internet to sign in.">
-<!ENTITY aboutAccounts.noConnection.retry "Try again">
-<!ENTITY aboutAccounts.badConfig.title "Bad configuration">
-<!ENTITY aboutAccounts.badConfig.description "Unable to determine your Firefox Account server configuration. Please try again later.">
--- a/browser/locales/jar.mn
+++ b/browser/locales/jar.mn
@@ -5,17 +5,16 @@
 
 # Note: This file should only contain locale entries. All
 # override and resource entries should go to browser/base/jar.mn to avoid
 # having to create the same entry for each locale.
 
 @AB_CD@.jar:
 % locale browser @AB_CD@ %locale/browser/
 *   locale/browser/bookmarks.html                  (generic/profile/bookmarks.html.in)
-    locale/browser/aboutAccounts.dtd               (%chrome/browser/aboutAccounts.dtd)
     locale/browser/aboutDialog.dtd                 (%chrome/browser/aboutDialog.dtd)
     locale/browser/aboutPrivateBrowsing.dtd        (%chrome/browser/aboutPrivateBrowsing.dtd)
     locale/browser/aboutPrivateBrowsing.properties (%chrome/browser/aboutPrivateBrowsing.properties)
     locale/browser/aboutRobots.dtd                 (%chrome/browser/aboutRobots.dtd)
     locale/browser/aboutHome.dtd                   (%chrome/browser/aboutHome.dtd)
     locale/browser/accounts.properties             (%chrome/browser/accounts.properties)
 #ifdef MOZ_SERVICES_HEALTHREPORT
     locale/browser/aboutHealthReport.dtd           (%chrome/browser/aboutHealthReport.dtd)