Merge mozilla-central to mozilla-inbound. a=merge
authorCosmin Sabou <csabou@mozilla.com>
Tue, 16 Oct 2018 19:29:58 +0300
changeset 499965 1403652ca90125b844c037b1a1f172eed698a777
parent 499964 4e749aa17feec01a32a987c3621029c7b88154af (current diff)
parent 499952 31724aea10cae55f30b825ade226c4d25e11a899 (diff)
child 499966 45de3b6b39960fc7a02dc804915718c60ac52e13
push id1864
push userffxbld-merge
push dateMon, 03 Dec 2018 15:51:40 +0000
treeherdermozilla-release@f040763d99ad [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone64.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge mozilla-central to mozilla-inbound. a=merge
browser/base/content/browser-feeds.js
browser/base/content/test/general/bug395533-data.txt
browser/base/content/test/general/feed_tab.html
browser/base/content/test/general/head_plain.js
browser/base/content/test/general/mochitest.ini
browser/base/content/test/general/offlineByDefault.js
browser/base/content/test/general/offlineChild.cacheManifest
browser/base/content/test/general/offlineChild.cacheManifest^headers^
browser/base/content/test/general/offlineChild.html
browser/base/content/test/general/offlineChild2.cacheManifest
browser/base/content/test/general/offlineChild2.cacheManifest^headers^
browser/base/content/test/general/offlineChild2.html
browser/base/content/test/general/offlineEvent.cacheManifest
browser/base/content/test/general/offlineEvent.cacheManifest^headers^
browser/base/content/test/general/offlineEvent.html
browser/base/content/test/general/test_bug395533.html
browser/components/feeds/FeedConverter.js
browser/components/feeds/FeedWriter.js
browser/components/feeds/content/subscribe.js
browser/components/feeds/content/subscribe.xhtml
browser/components/feeds/jar.mn
browser/components/feeds/nsFeedSniffer.cpp
browser/components/feeds/nsFeedSniffer.h
browser/components/feeds/nsIFeedResultService.idl
browser/components/feeds/test/bug364677-data.xml
browser/components/feeds/test/bug364677-data.xml^headers^
browser/components/feeds/test/bug368464-data.xml
browser/components/feeds/test/bug408328-data.xml
browser/components/feeds/test/bug436801-data.xml
browser/components/feeds/test/bug494328-data.xml
browser/components/feeds/test/chrome/.eslintrc.js
browser/components/feeds/test/chrome/chrome.ini
browser/components/feeds/test/chrome/sample_feed.atom
browser/components/feeds/test/chrome/test_bug368464.html
browser/components/feeds/test/chrome/test_bug408328.html
browser/components/feeds/test/chrome/test_maxSniffing.html
browser/components/feeds/test/test_bug364677.html
browser/components/feeds/test/test_bug436801.html
browser/components/feeds/test/test_bug494328.html
browser/components/feeds/test/valid-feed.xml
browser/components/feeds/test/valid-unsniffable-feed.xml
browser/locales/en-US/chrome/browser/feeds/subscribe.dtd
browser/themes/linux/feeds/feedIcon.png
browser/themes/linux/feeds/feedIcon16.png
browser/themes/linux/feeds/subscribe.css
browser/themes/linux/page-livemarks.png
browser/themes/osx/feeds/feedIcon.png
browser/themes/osx/feeds/feedIcon16.png
browser/themes/osx/feeds/subscribe.css
browser/themes/osx/page-livemarks.png
browser/themes/windows/feeds/feedIcon.png
browser/themes/windows/feeds/feedIcon16.png
browser/themes/windows/feeds/subscribe.css
devtools/client/aboutdebugging-new/src/components/sidebar/DeviceSidebarItemAction.css
devtools/client/aboutdebugging-new/src/components/sidebar/DeviceSidebarItemAction.js
devtools/shared/client/worker-client.js
dom/base/FeedWriterEnabled.h
dom/webidl/BrowserFeedWriter.webidl
testing/web-platform/meta/encoding/big5-encoder.html.ini
testing/web-platform/meta/encoding/gbk-encoder.html.ini
testing/web-platform/meta/encoding/iso-2022-jp-encoder.html.ini
testing/web-platform/meta/encoding/legacy-mb-japanese/euc-jp/eucjp-encode-href-errors-han.html.ini
testing/web-platform/meta/encoding/legacy-mb-japanese/euc-jp/eucjp-encode-href-errors-hangul.html.ini
testing/web-platform/meta/encoding/legacy-mb-japanese/euc-jp/eucjp-encode-href-errors-misc.html.ini
testing/web-platform/meta/encoding/legacy-mb-japanese/iso-2022-jp/iso2022jp-encode-href-errors-han.html.ini
testing/web-platform/meta/encoding/legacy-mb-japanese/iso-2022-jp/iso2022jp-encode-href-errors-hangul.html.ini
testing/web-platform/meta/encoding/legacy-mb-japanese/iso-2022-jp/iso2022jp-encode-href-errors-misc.html.ini
testing/web-platform/meta/encoding/legacy-mb-korean/euc-kr/euckr-decode-ksc_5601.html.ini
testing/web-platform/meta/encoding/legacy-mb-korean/euc-kr/euckr-encode-form-csksc56011987.html.ini
testing/web-platform/meta/encoding/legacy-mb-korean/euc-kr/euckr-encode-form-iso-ir-149.html.ini
testing/web-platform/meta/encoding/legacy-mb-korean/euc-kr/euckr-encode-form-korean.html.ini
testing/web-platform/meta/encoding/legacy-mb-korean/euc-kr/euckr-encode-form-ks_c_5601-1987.html.ini
testing/web-platform/meta/encoding/legacy-mb-korean/euc-kr/euckr-encode-form-ks_c_5601-1989.html.ini
testing/web-platform/meta/encoding/legacy-mb-korean/euc-kr/euckr-encode-form-ksc_5601.html.ini
testing/web-platform/meta/encoding/legacy-mb-korean/euc-kr/euckr-encode-href-errors-han.html.ini
testing/web-platform/meta/encoding/legacy-mb-korean/euc-kr/euckr-encode-href-errors-misc.html.ini
testing/web-platform/meta/encoding/legacy-mb-korean/euc-kr/euckr-encode-href.html.ini
testing/web-platform/meta/encoding/legacy-mb-tchinese/big5/big5-enc-ascii.html.ini
testing/web-platform/meta/encoding/legacy-mb-tchinese/big5/big5-encode-href-errors-han.html.ini
testing/web-platform/meta/encoding/legacy-mb-tchinese/big5/big5-encode-href-errors-misc.html.ini
testing/web-platform/meta/html/infrastructure/urls/resolving-urls/query-encoding/location.sub.html.ini
testing/web-platform/meta/xhr/open-url-encoding.htm.ini
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -737,20 +737,16 @@ pref("browser.backspace_action", 0);
 // editable elements in HTML
 // 0 = spellcheck nothing
 // 1 = check multi-line controls [default]
 // 2 = check multi/single line controls
 pref("layout.spellcheckDefault", 1);
 
 pref("browser.send_pings", false);
 
-pref("browser.feeds.handler", "ask");
-pref("browser.videoFeeds.handler", "ask");
-pref("browser.audioFeeds.handler", "ask");
-
 // At startup, if the handler service notices that the version number in the
 // region.properties file is newer than the version number in the handler
 // service datastore, it will add any new handlers it finds in the prefs (as
 // seeded by this file) to its datastore.
 pref("gecko.handlerService.defaultHandlersVersion", "chrome://browser-region/locale/region.properties");
 
 // The default set of web-based protocol handlers shown in the application
 // selection dialog for webcal: ; I've arbitrarily picked 4 default handlers
deleted file mode 100644
--- a/browser/base/content/browser-feeds.js
+++ /dev/null
@@ -1,409 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*-
- * 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/. */
-
-ChromeUtils.defineModuleGetter(this, "DeferredTask",
-                               "resource://gre/modules/DeferredTask.jsm");
-
-const TYPE_MAYBE_FEED = "application/vnd.mozilla.maybe.feed";
-const TYPE_MAYBE_AUDIO_FEED = "application/vnd.mozilla.maybe.audio.feed";
-const TYPE_MAYBE_VIDEO_FEED = "application/vnd.mozilla.maybe.video.feed";
-
-const PREF_SHOW_FIRST_RUN_UI = "browser.feeds.showFirstRunUI";
-
-const PREF_SELECTED_APP = "browser.feeds.handlers.application";
-const PREF_SELECTED_ACTION = "browser.feeds.handler";
-const PREF_SELECTED_READER = "browser.feeds.handler.default";
-
-const PREF_VIDEO_SELECTED_APP = "browser.videoFeeds.handlers.application";
-const PREF_VIDEO_SELECTED_ACTION = "browser.videoFeeds.handler";
-const PREF_VIDEO_SELECTED_READER = "browser.videoFeeds.handler.default";
-
-const PREF_AUDIO_SELECTED_APP = "browser.audioFeeds.handlers.application";
-const PREF_AUDIO_SELECTED_ACTION = "browser.audioFeeds.handler";
-const PREF_AUDIO_SELECTED_READER = "browser.audioFeeds.handler.default";
-
-const PREF_UPDATE_DELAY = 2000;
-
-const SETTABLE_PREFS = new Set([
-  PREF_VIDEO_SELECTED_ACTION,
-  PREF_AUDIO_SELECTED_ACTION,
-  PREF_SELECTED_ACTION,
-  PREF_VIDEO_SELECTED_READER,
-  PREF_AUDIO_SELECTED_READER,
-  PREF_SELECTED_READER,
-]);
-
-const EXECUTABLE_PREFS = new Set([
-  PREF_SELECTED_APP,
-  PREF_VIDEO_SELECTED_APP,
-  PREF_AUDIO_SELECTED_APP,
-]);
-
-const VALID_ACTIONS = new Set(["ask", "reader", "bookmarks"]);
-const VALID_READERS = new Set(["client", "default", "bookmarks"]);
-
-XPCOMUtils.defineLazyPreferenceGetter(this, "SHOULD_LOG",
-                                      "feeds.log", false);
-
-function LOG(str) {
-  if (SHOULD_LOG)
-    dump("*** Feeds: " + str + "\n");
-}
-
-function getPrefActionForType(t) {
-  switch (t) {
-    case Ci.nsIFeed.TYPE_VIDEO:
-      return PREF_VIDEO_SELECTED_ACTION;
-
-    case Ci.nsIFeed.TYPE_AUDIO:
-      return PREF_AUDIO_SELECTED_ACTION;
-
-    default:
-      return PREF_SELECTED_ACTION;
-  }
-}
-
-function getPrefReaderForType(t) {
-  switch (t) {
-    case Ci.nsIFeed.TYPE_VIDEO:
-      return PREF_VIDEO_SELECTED_READER;
-
-    case Ci.nsIFeed.TYPE_AUDIO:
-      return PREF_AUDIO_SELECTED_READER;
-
-    default:
-      return PREF_SELECTED_READER;
-  }
-}
-
-function getPrefAppForType(t) {
-  switch (t) {
-    case Ci.nsIFeed.TYPE_VIDEO:
-      return PREF_VIDEO_SELECTED_APP;
-
-    case Ci.nsIFeed.TYPE_AUDIO:
-      return PREF_AUDIO_SELECTED_APP;
-
-    default:
-      return PREF_SELECTED_APP;
-  }
-}
-
-/**
- * Maps a feed type to a maybe-feed mimetype.
- */
-function getMimeTypeForFeedType(aFeedType) {
-  switch (aFeedType) {
-    case Ci.nsIFeed.TYPE_VIDEO:
-      return TYPE_MAYBE_VIDEO_FEED;
-
-    case Ci.nsIFeed.TYPE_AUDIO:
-      return TYPE_MAYBE_AUDIO_FEED;
-
-    default:
-      return TYPE_MAYBE_FEED;
-  }
-}
-
-/**
- * The Feed Handler object manages discovery of RSS/ATOM feeds in web pages
- * and shows UI when they are discovered.
- */
-var FeedHandler = {
-  _prefChangeCallback: null,
-
-   /**
-   * Get the human-readable display name of a file. This could be the
-   * application name.
-   * @param   file
-   *          A nsIFile to look up the name of
-   * @return  The display name of the application represented by the file.
-   */
-  _getFileDisplayName(file) {
-    switch (AppConstants.platform) {
-      case "win":
-        if (file instanceof Ci.nsILocalFileWin) {
-          try {
-            return file.getVersionInfoField("FileDescription");
-          } catch (e) {}
-        }
-        break;
-      case "macosx":
-        if (file instanceof Ci.nsILocalFileMac) {
-          try {
-            return file.bundleDisplayName;
-          } catch (e) {}
-        }
-        break;
-    }
-
-    return file.leafName;
-  },
-
-  _chooseClientApp(aTitle, aTypeName, aBrowser) {
-    const prefName = getPrefAppForType(aTypeName);
-    let fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
-
-    fp.init(window, aTitle, Ci.nsIFilePicker.modeOpen);
-    fp.appendFilters(Ci.nsIFilePicker.filterApps);
-
-    fp.open((aResult) => {
-      if (aResult == Ci.nsIFilePicker.returnOK) {
-        let selectedApp = fp.file;
-        if (selectedApp) {
-          // XXXben - we need to compare this with the running instance
-          //          executable just don't know how to do that via script
-          // XXXmano TBD: can probably add this to nsIShellService
-          let appName = "";
-          switch (AppConstants.platform) {
-            case "win":
-              appName = AppConstants.MOZ_APP_NAME + ".exe";
-              break;
-            case "macosx":
-              appName = AppConstants.MOZ_MACBUNDLE_NAME;
-              break;
-            default:
-              appName = AppConstants.MOZ_APP_NAME + "-bin";
-              break;
-          }
-
-          if (fp.file.leafName != appName) {
-            Services.prefs.setComplexValue(prefName, Ci.nsIFile, selectedApp);
-            aBrowser.messageManager.sendAsyncMessage("FeedWriter:SetApplicationLauncherMenuItem",
-                                                    { name: this._getFileDisplayName(selectedApp),
-                                                      type: "SelectedAppMenuItem" });
-          }
-        }
-      }
-    });
-
-  },
-
-  executeClientApp(aSpec, aTitle, aSubtitle, aFeedHandler) {
-    // aFeedHandler is either "default", indicating the system default reader, or a pref-name containing
-    // an nsIFile pointing to the feed handler's executable.
-
-    let clientApp = null;
-    if (aFeedHandler == "default") {
-      clientApp = Cc["@mozilla.org/browser/shell-service;1"]
-                    .getService(Ci.nsIShellService)
-                    .defaultFeedReader;
-    } else {
-      clientApp = Services.prefs.getComplexValue(aFeedHandler, Ci.nsIFile);
-    }
-
-    // For the benefit of applications that might know how to deal with more
-    // URLs than just feeds, send feed: URLs in the following format:
-    //
-    // http urls: replace scheme with feed, e.g.
-    // http://foo.com/index.rdf -> feed://foo.com/index.rdf
-    // other urls: prepend feed: scheme, e.g.
-    // https://foo.com/index.rdf -> feed:https://foo.com/index.rdf
-    let feedURI = Services.io.newURI(aSpec);
-    if (feedURI.schemeIs("http")) {
-      feedURI = feedURI.mutate()
-                       .setScheme("feed")
-                       .finalize();
-      aSpec = feedURI.spec;
-    } else {
-      aSpec = "feed:" + aSpec;
-    }
-
-    // Retrieving the shell service might fail on some systems, most
-    // notably systems where GNOME is not installed.
-    try {
-      let ss = Cc["@mozilla.org/browser/shell-service;1"]
-                 .getService(Ci.nsIShellService);
-      ss.openApplicationWithURI(clientApp, aSpec);
-    } catch (e) {
-      // If we couldn't use the shell service, fallback to using a
-      // nsIProcess instance
-      let p = Cc["@mozilla.org/process/util;1"]
-                .createInstance(Ci.nsIProcess);
-      p.init(clientApp);
-      p.run(false, [aSpec], 1);
-    }
-  },
-
-  // nsISupports
-
-  QueryInterface: ChromeUtils.generateQI([Ci.nsIObserver,
-                                          Ci.nsISupportsWeakReference]),
-
-
-  init() {
-    window.messageManager.addMessageListener("FeedWriter:ChooseClientApp", this);
-    window.messageManager.addMessageListener("FeedWriter:GetSubscriptionUI", this);
-    window.messageManager.addMessageListener("FeedWriter:SetFeedPrefsAndSubscribe", this);
-    window.messageManager.addMessageListener("FeedWriter:ShownFirstRun", this);
-
-    Services.ppmm.addMessageListener("FeedConverter:ExecuteClientApp", this);
-
-    const prefs = Services.prefs;
-    prefs.addObserver(PREF_SELECTED_ACTION, this, true);
-    prefs.addObserver(PREF_SELECTED_READER, this, true);
-    prefs.addObserver(PREF_VIDEO_SELECTED_ACTION, this, true);
-    prefs.addObserver(PREF_VIDEO_SELECTED_READER, this, true);
-    prefs.addObserver(PREF_AUDIO_SELECTED_ACTION, this, true);
-    prefs.addObserver(PREF_AUDIO_SELECTED_READER, this, true);
-  },
-
-  uninit() {
-    Services.ppmm.removeMessageListener("FeedConverter:ExecuteClientApp", this);
-
-    this._prefChangeCallback = null;
-  },
-
-  // nsIObserver
-  observe(subject, topic, data) {
-    if (topic == "nsPref:changed") {
-      LOG(`Pref changed ${data}`);
-      if (this._prefChangeCallback) {
-        this._prefChangeCallback.disarm();
-      }
-      // Multiple prefs are set at the same time, debounce to reduce noise
-      // This can happen in one feed and we want to message all feed pages
-      this._prefChangeCallback = new DeferredTask(() => {
-        this._prefChanged(data);
-      }, PREF_UPDATE_DELAY);
-      this._prefChangeCallback.arm();
-    }
-  },
-
-  _prefChanged(prefName) {
-    // Don't observe for PREF_*SELECTED_APP as user likely just picked one
-    // That is also handled by SetApplicationLauncherMenuItem call
-    // Rather than the others which happen on subscription
-    switch (prefName) {
-      case PREF_SELECTED_READER:
-      case PREF_VIDEO_SELECTED_READER:
-      case PREF_AUDIO_SELECTED_READER:
-      case PREF_SELECTED_ACTION:
-      case PREF_VIDEO_SELECTED_ACTION:
-      case PREF_AUDIO_SELECTED_ACTION:
-        const response = {
-         default: this._getReaderForType(Ci.nsIFeed.TYPE_FEED),
-         [Ci.nsIFeed.TYPE_AUDIO]: this._getReaderForType(Ci.nsIFeed.TYPE_AUDIO),
-         [Ci.nsIFeed.TYPE_VIDEO]: this._getReaderForType(Ci.nsIFeed.TYPE_VIDEO),
-        };
-        Services.mm.broadcastAsyncMessage("FeedWriter:PreferenceUpdated",
-                                          response);
-        break;
-    }
-  },
-
-  _initSubscriptionUIResponse(feedType) {
-    let showFirstRunUI = Services.prefs.getBoolPref(PREF_SHOW_FIRST_RUN_UI, true);
-    const response = { showFirstRunUI };
-    let selectedClientApp;
-    const feedTypePref = getPrefAppForType(feedType);
-    try {
-      selectedClientApp = Services.prefs.getComplexValue(feedTypePref, Ci.nsIFile);
-    } catch (ex) {
-      // Just do nothing, then we won't bother populating
-    }
-
-    let defaultClientApp = null;
-    try {
-      // This can sometimes not exist
-      defaultClientApp = Cc["@mozilla.org/browser/shell-service;1"]
-                           .getService(Ci.nsIShellService)
-                           .defaultFeedReader;
-    } catch (ex) {
-      // Just do nothing, then we don't bother populating
-    }
-
-    if (selectedClientApp && selectedClientApp.exists()) {
-      if (defaultClientApp && selectedClientApp.path != defaultClientApp.path) {
-        // Only set the default menu item if it differs from the selected one
-        response.defaultMenuItem = this._getFileDisplayName(defaultClientApp);
-      }
-      response.selectedMenuItem = this._getFileDisplayName(selectedClientApp);
-    }
-    response.reader = this._getReaderForType(feedType);
-    return response;
-  },
-
-  _setPref(aPrefName, aPrefValue, aIsComplex = false) {
-    LOG(`FeedWriter._setPref ${aPrefName}`);
-    // Ensure we have a pref that is settable
-    if (aPrefName && SETTABLE_PREFS.has(aPrefName)) {
-      if (aIsComplex) {
-        Services.prefs.setStringPref(aPrefName, aPrefValue);
-      } else {
-        Services.prefs.setCharPref(aPrefName, aPrefValue);
-      }
-    } else {
-      LOG(`FeedWriter._setPref ${aPrefName} not allowed`);
-    }
-  },
-
-  _getReaderForType(feedType) {
-    let handler = Services.prefs.getCharPref(getPrefReaderForType(feedType), "bookmarks");
-    const alwaysUse = this._getAlwaysUseState(feedType);
-    const action = Services.prefs.getCharPref(getPrefActionForType(feedType));
-    return { handler, alwaysUse, action };
-  },
-
-  _getAlwaysUseState(feedType) {
-    try {
-      return Services.prefs.getCharPref(getPrefActionForType(feedType)) != "ask";
-    } catch (ex) { }
-    return false;
-  },
-
-  receiveMessage(msg) {
-    switch (msg.name) {
-      case "FeedWriter:GetSubscriptionUI":
-        const response = this._initSubscriptionUIResponse(msg.data.feedType);
-        msg.target.messageManager
-           .sendAsyncMessage("FeedWriter:GetSubscriptionUIResponse",
-                            response);
-        break;
-      case "FeedWriter:ChooseClientApp":
-        this._chooseClientApp(msg.data.title, msg.data.feedType, msg.target);
-        break;
-      case "FeedWriter:ShownFirstRun":
-        Services.prefs.setBoolPref(PREF_SHOW_FIRST_RUN_UI, false);
-        break;
-      case "FeedWriter:SetFeedPrefsAndSubscribe":
-        const settings = msg.data;
-        if (!settings.action || !VALID_ACTIONS.has(settings.action)) {
-          LOG(`Invalid action ${settings.action}`);
-          return;
-        }
-        if (!settings.reader || !VALID_READERS.has(settings.reader)) {
-          LOG(`Invalid reader ${settings.reader}`);
-          return;
-        }
-
-        Services.telemetry.scalarAdd("browser.feeds.feed_subscribed", 1);
-
-        const actionPref = getPrefActionForType(settings.feedType);
-        this._setPref(actionPref, settings.action);
-        const readerPref = getPrefReaderForType(settings.feedType);
-        this._setPref(readerPref, settings.reader);
-
-        const feedService = Cc["@mozilla.org/browser/feeds/result-service;1"].
-                            getService(Ci.nsIFeedResultService);
-
-        feedService.addToClientReader(settings.feedLocation,
-                                      settings.feedTitle,
-                                      settings.feedSubtitle,
-                                      settings.feedType,
-                                      settings.reader);
-        break;
-      case "FeedConverter:ExecuteClientApp":
-        // Always check feedHandler is from a set array of executable prefs
-        if (EXECUTABLE_PREFS.has(msg.data.feedHandler)) {
-          this.executeClientApp(msg.data.spec, msg.data.title,
-                                msg.data.subtitle, msg.data.feedHandler);
-        } else {
-          LOG(`FeedConverter:ExecuteClientApp - Will not exec ${msg.data.feedHandler}`);
-        }
-        break;
-    }
-  },
-};
--- a/browser/base/content/browser.css
+++ b/browser/base/content/browser.css
@@ -484,20 +484,16 @@ toolbar:not(#TabsToolbar) > #personal-bo
   opacity: 1 !important;
 }
 
 /* Ensure stop-button and reload-button are displayed correctly when in the overflow menu */
 .widget-overflow-list > #stop-reload-button > .toolbarbutton-1 {
   -moz-box-flex: 1;
 }
 
-#PanelUI-feeds > .feed-toolbarbutton:-moz-locale-dir(rtl) {
-  direction: rtl;
-}
-
 #appMenu_historyMenu > .bookmark-item,
 #appMenu-library-recentlyClosedTabs > .panel-subview-body > .bookmark-item,
 #appMenu-library-recentlyClosedWindows > .panel-subview-body > .bookmark-item,
 #appMenu-library-recentHighlights > .bookmark-item,
 #panelMenu_bookmarksMenu > .bookmark-item {
   max-width: none;
 }
 
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -1347,17 +1347,16 @@ var gBrowserInit = {
     // These routines add message listeners. They must run before
     // loading the frame script to ensure that we don't miss any
     // message sent between when the frame script is loaded and when
     // the listener is registered.
     DOMEventHandler.init();
     gPageStyleMenu.init();
     LanguageDetectionListener.init();
     BrowserOnClick.init();
-    FeedHandler.init();
     ContentBlocking.init();
     CaptivePortalWatcher.init();
     ZoomUI.init(window);
 
     let mm = window.getGroupMessageManager("browsers");
     mm.loadFrameScript("chrome://browser/content/tab-content.js", true, true);
     mm.loadFrameScript("chrome://browser/content/content.js", true, true);
     mm.loadFrameScript("chrome://global/content/content-HybridContentTelemetry.js", true);
@@ -1928,18 +1927,16 @@ var gBrowserInit = {
     BookmarkingUI.uninit();
 
     TabletModeUpdater.uninit();
 
     gTabletModePageCounter.finish();
 
     BrowserOnClick.uninit();
 
-    FeedHandler.uninit();
-
     ContentBlocking.uninit();
 
     CaptivePortalWatcher.uninit();
 
     SidebarUI.uninit();
 
     DownloadsButton.uninit();
 
--- a/browser/base/content/browser.xul
+++ b/browser/base/content/browser.xul
@@ -610,30 +610,30 @@ xmlns="http://www.w3.org/1999/xhtml"
                 oncommand="BrowserPageActions.openAboutAddonsForContextAction();"/>
     </menupopup>
 
 #include ../../components/places/content/bookmarksHistoryTooltip.inc.xul
 
     <tooltip id="tabbrowser-tab-tooltip" onpopupshowing="gBrowser.createTooltip(event);"/>
 
     <tooltip id="back-button-tooltip">
-      <label class="tooltip-label" value="&backButton.tooltip;"/>
+      <description class="tooltip-label" value="&backButton.tooltip;"/>
 #ifdef XP_MACOSX
-      <label class="tooltip-label" value="&backForwardButtonMenuMac.tooltip;"/>
+      <description class="tooltip-label" value="&backForwardButtonMenuMac.tooltip;"/>
 #else
-      <label class="tooltip-label" value="&backForwardButtonMenu.tooltip;"/>
+      <description class="tooltip-label" value="&backForwardButtonMenu.tooltip;"/>
 #endif
     </tooltip>
 
     <tooltip id="forward-button-tooltip">
-      <label class="tooltip-label" value="&forwardButton.tooltip;"/>
+      <description class="tooltip-label" value="&forwardButton.tooltip;"/>
 #ifdef XP_MACOSX
-      <label class="tooltip-label" value="&backForwardButtonMenuMac.tooltip;"/>
+      <description class="tooltip-label" value="&backForwardButtonMenuMac.tooltip;"/>
 #else
-      <label class="tooltip-label" value="&backForwardButtonMenu.tooltip;"/>
+      <description class="tooltip-label" value="&backForwardButtonMenu.tooltip;"/>
 #endif
     </tooltip>
 
 #include popup-notifications.inc
 
 #include ../../components/customizableui/content/panelUI.inc.xul
 #include ../../components/controlcenter/content/panel.inc.xul
 #include ../../components/downloads/content/downloadsPanel.inc.xul
--- a/browser/base/content/global-scripts.inc
+++ b/browser/base/content/global-scripts.inc
@@ -16,17 +16,16 @@ Components.utils.import("resource://gre/
 
 for (let script of [
   "chrome://browser/content/browser.js",
   "chrome://browser/content/search/searchbar.js",
 
   "chrome://browser/content/browser-captivePortal.js",
   "chrome://browser/content/browser-compacttheme.js",
   "chrome://browser/content/browser-contentblocking.js",
-  "chrome://browser/content/browser-feeds.js",
   "chrome://browser/content/browser-media.js",
   "chrome://browser/content/browser-pageActions.js",
   "chrome://browser/content/browser-places.js",
   "chrome://browser/content/browser-plugins.js",
   "chrome://browser/content/browser-sidebar.js",
   "chrome://browser/content/browser-siteIdentity.js",
   "chrome://browser/content/browser-tabsintitlebar.js",
 
--- a/browser/base/content/moz.build
+++ b/browser/base/content/moz.build
@@ -117,19 +117,16 @@ with Files("*menu*"):
     BUG_COMPONENT = ("Firefox", "Menus")
 
 with Files("browser-compacttheme.js"):
     BUG_COMPONENT = ("Firefox", "Themes")
 
 with Files("browser-customization.js"):
     BUG_COMPONENT = ("Firefox", "Toolbars and Customization")
 
-with Files("browser-feeds.js"):
-    BUG_COMPONENT = ("Firefox", "Toolbars and Customization")
-
 with Files("browser-fullZoom.js"):
     BUG_COMPONENT = ("Firefox", "Tabbed Browsing")
 
 with Files("browser-gestureSupport.js"):
     BUG_COMPONENT = ("Core", "Widget: Cocoa")
 
 with Files("browser-media.js"):
     BUG_COMPONENT = ("Core", "Audio/Video: Playback")
--- a/browser/base/content/test/general/browser_contentAreaClick.js
+++ b/browser/base/content/test/general/browser_contentAreaClick.js
@@ -32,18 +32,17 @@ var gTests = [
     clean() {},
     event: { ctrlKey: true,
              metaKey: true },
     targets: [ "commonlink", "mathxlink", "svgxlink", "maplink" ],
     expectedInvokedMethods: [ "urlSecurityCheck", "openLinkIn" ],
     preventDefault: true,
   },
 
-  // The next test was once handling feedService.forcePreview().  Now it should
-  // just be like Alt click.
+  // The next test should just be like Alt click.
   {
     desc: "Shift+Alt left click",
     setup() {
       Services.prefs.setBoolPref("browser.altClickSave", true);
     },
     clean() {
       Services.prefs.clearUserPref("browser.altClickSave");
     },
deleted file mode 100644
--- a/browser/base/content/test/general/bug395533-data.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-<rss version="2.0">
-  <channel>
-    <link>http://example.org/</link>
-    <title>t</title>
-  </channel>
-</rss>
deleted file mode 100644
--- a/browser/base/content/test/general/feed_tab.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id=458579
--->
-  <head>
-    <title>Test for page info feeds tab</title>
-
-    <!-- Straight up standard -->
-    <link rel="alternate" type="application/atom+xml" title="1" href="/1.atom" />
-    <link rel="alternate" type="application/rss+xml" title="2" href="/2.rss" />
-    <link rel="feed" title="3" href="/3.xml" />
-
-  </head>
-  <body>
-  </body>
-</html>
deleted file mode 100644
--- a/browser/base/content/test/general/head_plain.js
+++ /dev/null
@@ -1,27 +0,0 @@
-
-function getTestPlugin(pluginName) {
-  var ph = SpecialPowers.Cc["@mozilla.org/plugin/host;1"]
-                                 .getService(SpecialPowers.Ci.nsIPluginHost);
-  var tags = ph.getPluginTags();
-  var name = pluginName || "Test Plug-in";
-  for (var tag of tags) {
-    if (tag.name == name) {
-      return tag;
-    }
-  }
-
-  ok(false, "Could not find plugin tag with plugin name '" + name + "'");
-  return null;
-}
-
-// call this to set the test plugin(s) initially expected enabled state.
-// it will automatically be reset to it's previous value after the test
-// ends
-function setTestPluginEnabledState(newEnabledState, pluginName) {
-  var plugin = getTestPlugin(pluginName);
-  var oldEnabledState = plugin.enabledState;
-  plugin.enabledState = newEnabledState;
-  SimpleTest.registerCleanupFunction(function() {
-    getTestPlugin(pluginName).enabledState = oldEnabledState;
-  });
-}
deleted file mode 100644
--- a/browser/base/content/test/general/mochitest.ini
+++ /dev/null
@@ -1,22 +0,0 @@
-[DEFAULT]
-support-files =
-  audio.ogg
-  bug395533-data.txt
-  contextmenu_common.js
-  ctxmenu-image.png
-  head_plain.js
-  offlineByDefault.js
-  offlineChild.cacheManifest
-  offlineChild.cacheManifest^headers^
-  offlineChild.html
-  offlineChild2.cacheManifest
-  offlineChild2.cacheManifest^headers^
-  offlineChild2.html
-  offlineEvent.cacheManifest
-  offlineEvent.cacheManifest^headers^
-  offlineEvent.html
-  subtst_contextmenu.html
-  video.ogg
-  !/image/test/mochitest/blue.png
-
-[test_bug395533.html]
deleted file mode 100644
--- a/browser/base/content/test/general/offlineByDefault.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var offlineByDefault = {
-  defaultValue: false,
-  set(allow) {
-    this.defaultValue = SpecialPowers.Services.prefs.getBoolPref("offline-apps.allow_by_default", false);
-    SpecialPowers.Services.prefs.setBoolPref("offline-apps.allow_by_default", allow);
-  },
-  reset() {
-    SpecialPowers.Services.prefs.setBoolPref("offline-apps.allow_by_default", this.defaultValue);
-  },
-};
-
-offlineByDefault.set(false);
deleted file mode 100644
--- a/browser/base/content/test/general/offlineChild.cacheManifest
+++ /dev/null
@@ -1,2 +0,0 @@
-CACHE MANIFEST
-offlineChild.html
deleted file mode 100644
--- a/browser/base/content/test/general/offlineChild.cacheManifest^headers^
+++ /dev/null
@@ -1,1 +0,0 @@
-Content-Type: text/cache-manifest
deleted file mode 100644
--- a/browser/base/content/test/general/offlineChild.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<html manifest="offlineChild.cacheManifest">
-<head>
-<title></title>
-<script type="text/javascript">
-
-function finish(success) {
-  window.parent.postMessage(success ? "success" : "failure", "*");
-}
-
-applicationCache.oncached = function() { finish(true); };
-applicationCache.onnoupdate = function() { finish(true); };
-applicationCache.onerror = function() { finish(false); };
-
-</script>
-</head>
-
-<body>
-<h1>Child</h1>
-</body>
-</html>
deleted file mode 100644
--- a/browser/base/content/test/general/offlineChild2.cacheManifest
+++ /dev/null
@@ -1,2 +0,0 @@
-CACHE MANIFEST
-offlineChild2.html
deleted file mode 100644
--- a/browser/base/content/test/general/offlineChild2.cacheManifest^headers^
+++ /dev/null
@@ -1,1 +0,0 @@
-Content-Type: text/cache-manifest
deleted file mode 100644
--- a/browser/base/content/test/general/offlineChild2.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<html manifest="offlineChild2.cacheManifest">
-<head>
-<title></title>
-<script type="text/javascript">
-
-function finish(success) {
-  window.parent.postMessage(success ? "success" : "failure", "*");
-}
-
-applicationCache.oncached = function() { finish(true); };
-applicationCache.onnoupdate = function() { finish(true); };
-applicationCache.onerror = function() { finish(false); };
-
-</script>
-</head>
-
-<body>
-<h1>Child</h1>
-</body>
-</html>
deleted file mode 100644
--- a/browser/base/content/test/general/offlineEvent.cacheManifest
+++ /dev/null
@@ -1,2 +0,0 @@
-CACHE MANIFEST
-offlineChild.html
deleted file mode 100644
--- a/browser/base/content/test/general/offlineEvent.cacheManifest^headers^
+++ /dev/null
@@ -1,1 +0,0 @@
-Content-Type: text/cache-manifest
deleted file mode 100644
--- a/browser/base/content/test/general/offlineEvent.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<html manifest="offlineEvent.cacheManifest">
-<head>
-<title></title>
-</head>
-
-<body>
-<h1>Child</h1>
-</body>
-</html>
deleted file mode 100644
--- a/browser/base/content/test/general/test_bug395533.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id=395533
--->
-<head>
-  <title>Test for Bug 395533</title>
-  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
-</head>
-<body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=395533">Mozilla Bug 395533</a>
-<p id="display"><iframe id="testFrame" src="bug395533-data.txt"></iframe></p>
-<div id="content" style="display: none">
-  
-</div>
-<pre id="test">
-<script class="testbody" type="text/javascript">
-
-/** Test for Bug 395533 **/
-SimpleTest.waitForExplicitFinish();
-
-addLoadEvent(function() {
-  // Need privs because the feed seems to have an about:feeds principal or some
-  // such.  It's not same-origin with us in any case.
-  is(SpecialPowers.wrap($("testFrame")).contentDocument.documentElement.id, "",
-     "Text got sniffed as a feed?");
-});
-addLoadEvent(SimpleTest.finish);
-
-
-
-
-</script>
-</pre>
-</body>
-</html>
-
--- a/browser/base/jar.mn
+++ b/browser/base/jar.mn
@@ -39,17 +39,16 @@ browser.jar:
         content/browser/browser-ctrlTab.js            (content/browser-ctrlTab.js)
         content/browser/browser-customization.js      (content/browser-customization.js)
         content/browser/browser-data-submission-info-bar.js (content/browser-data-submission-info-bar.js)
         content/browser/browser-compacttheme.js       (content/browser-compacttheme.js)
         content/browser/browser-contentblocking.js    (content/browser-contentblocking.js)
 #ifndef MOZILLA_OFFICIAL
         content/browser/browser-development-helpers.js (content/browser-development-helpers.js)
 #endif
-        content/browser/browser-feeds.js              (content/browser-feeds.js)
         content/browser/browser-fullScreenAndPointerLock.js  (content/browser-fullScreenAndPointerLock.js)
         content/browser/browser-fullZoom.js           (content/browser-fullZoom.js)
         content/browser/browser-gestureSupport.js     (content/browser-gestureSupport.js)
         content/browser/browser-media.js              (content/browser-media.js)
         content/browser/browser-pageActions.js        (content/browser-pageActions.js)
         content/browser/browser-places.js             (content/browser-places.js)
         content/browser/browser-plugins.js            (content/browser-plugins.js)
         content/browser/browser-safebrowsing.js       (content/browser-safebrowsing.js)
--- a/browser/base/moz.build
+++ b/browser/base/moz.build
@@ -8,20 +8,16 @@ with Files("**"):
     BUG_COMPONENT = ("Firefox", "General")
 
 SPHINX_TREES['sslerrorreport'] = 'content/docs/sslerrorreport'
 SPHINX_TREES['tabbrowser'] = 'content/docs/tabbrowser'
 
 with Files('content/docs/sslerrorreport/**'):
     SCHEDULES.exclusive = ['docs']
 
-MOCHITEST_MANIFESTS += [
-    'content/test/general/mochitest.ini',
-]
-
 MOCHITEST_CHROME_MANIFESTS += [
     'content/test/chrome/chrome.ini',
 ]
 
 TESTING_JS_MODULES += [
     'content/test/sanitize/SiteDataTestUtils.jsm',
 ]
 
--- a/browser/components/about/AboutRedirector.cpp
+++ b/browser/components/about/AboutRedirector.cpp
@@ -55,20 +55,16 @@ static const RedirEntry kRedirMap[] = {
     nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
     nsIAboutModule::URI_CAN_LOAD_IN_CHILD |
     nsIAboutModule::ALLOW_SCRIPT |
     nsIAboutModule::HIDE_FROM_ABOUTABOUT },
   { "tabcrashed", "chrome://browser/content/aboutTabCrashed.xhtml",
     nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
     nsIAboutModule::ALLOW_SCRIPT |
     nsIAboutModule::HIDE_FROM_ABOUTABOUT },
-  { "feeds", "chrome://browser/content/feeds/subscribe.xhtml",
-    nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
-    nsIAboutModule::ALLOW_SCRIPT |
-    nsIAboutModule::HIDE_FROM_ABOUTABOUT },
   { "policies", "chrome://browser/content/policies/aboutPolicies.xhtml",
     nsIAboutModule::ALLOW_SCRIPT },
   { "privatebrowsing", "chrome://browser/content/aboutPrivateBrowsing.xhtml",
     nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
     nsIAboutModule::URI_MUST_LOAD_IN_CHILD |
     nsIAboutModule::ALLOW_SCRIPT },
   { "rights",
     "chrome://global/content/aboutRights.xhtml",
--- a/browser/components/build/moz.build
+++ b/browser/components/build/moz.build
@@ -16,13 +16,12 @@ SOURCES += [
 ]
 
 Library('browsercomps')
 FINAL_LIBRARY = 'xul'
 
 LOCAL_INCLUDES += [
     '../about',
     '../dirprovider',
-    '../feeds',
     '../migration',
     '../sessionstore',
     '../shell',
 ]
--- a/browser/components/build/nsBrowserCompsCID.h
+++ b/browser/components/build/nsBrowserCompsCID.h
@@ -16,25 +16,16 @@
 { 0x63c7b9f4, 0xcc8, 0x43f8, { 0xb6, 0x66, 0xa, 0x66, 0x16, 0x55, 0xcb, 0x73 } }
 
 #define NS_SHELLSERVICE_CONTRACTID \
   "@mozilla.org/browser/shell-service;1"
 
 #define NS_RDF_FORWARDPROXY_INFER_DATASOURCE_CID \
 { 0x7a024bcf, 0xedd5, 0x4d9a, { 0x86, 0x14, 0xd4, 0x4b, 0xe1, 0xda, 0xda, 0xd3 } }
 
-#define NS_FEEDSNIFFER_CID \
-{ 0x6893e69, 0x71d8, 0x4b23, { 0x81, 0xeb, 0x80, 0x31, 0x4d, 0xaf, 0x3e, 0x66 } }
-
-#define NS_FEEDSNIFFER_CONTRACTID \
-  "@mozilla.org/browser/feeds/sniffer;1"
-
-#define NS_ABOUTFEEDS_CID \
-{ 0x12ff56ec, 0x58be, 0x402c, { 0xb0, 0x57, 0x1, 0xf9, 0x61, 0xde, 0x96, 0x9b } }
-
 // 136e2c4d-c5a4-477c-b131-d93d7d704f64
 #define NS_PRIVATE_BROWSING_SERVICE_WRAPPER_CID \
 { 0x136e2c4d, 0xc5a4, 0x477c, { 0xb1, 0x31, 0xd9, 0x3d, 0x7d, 0x70, 0x4f, 0x64 } }
 
 // 7e4bb6ad-2fc4-4dc6-89ef-23e8e5ccf980
 #define NS_BROWSER_ABOUT_REDIRECTOR_CID \
 { 0x7e4bb6ad, 0x2fc4, 0x4dc6, { 0x89, 0xef, 0x23, 0xe8, 0xe5, 0xcc, 0xf9, 0x80 } }
 
--- a/browser/components/build/nsModule.cpp
+++ b/browser/components/build/nsModule.cpp
@@ -19,17 +19,16 @@
 #if defined(MOZ_WIDGET_COCOA)
 #include "nsMacAttribution.h"
 #endif
 
 #if defined(XP_WIN)
 #include "nsIEHistoryEnumerator.h"
 #endif
 
-#include "nsFeedSniffer.h"
 #include "AboutRedirector.h"
 #include "nsIAboutModule.h"
 
 #include "nsNetCID.h"
 
 using namespace mozilla::browser;
 
 /////////////////////////////////////////////////////////////////////////////
@@ -46,25 +45,22 @@ NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsGN
 #if defined(MOZ_WIDGET_COCOA)
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsMacAttributionService)
 #endif
 
 #if defined(XP_WIN)
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsIEHistoryEnumerator)
 #endif
 
-NS_GENERIC_FACTORY_CONSTRUCTOR(nsFeedSniffer)
-
 NS_DEFINE_NAMED_CID(NS_BROWSERDIRECTORYPROVIDER_CID);
 #if defined(XP_WIN)
 NS_DEFINE_NAMED_CID(NS_SHELLSERVICE_CID);
 #elif defined(MOZ_WIDGET_GTK)
 NS_DEFINE_NAMED_CID(NS_SHELLSERVICE_CID);
 #endif
-NS_DEFINE_NAMED_CID(NS_FEEDSNIFFER_CID);
 NS_DEFINE_NAMED_CID(NS_BROWSER_ABOUT_REDIRECTOR_CID);
 #if defined(XP_WIN)
 NS_DEFINE_NAMED_CID(NS_WINIEHISTORYENUMERATOR_CID);
 #elif defined(XP_MACOSX)
 NS_DEFINE_NAMED_CID(NS_SHELLSERVICE_CID);
 #endif
 #if defined(MOZ_WIDGET_COCOA)
 NS_DEFINE_NAMED_CID(NS_MACATTRIBUTIONSERVICE_CID);
@@ -73,17 +69,16 @@ NS_DEFINE_NAMED_CID(NS_MACATTRIBUTIONSER
 static const mozilla::Module::CIDEntry kBrowserCIDs[] = {
     // clang-format off
     { &kNS_BROWSERDIRECTORYPROVIDER_CID, false, nullptr, DirectoryProviderConstructor },
 #if defined(XP_WIN)
     { &kNS_SHELLSERVICE_CID, false, nullptr, nsWindowsShellServiceConstructor },
 #elif defined(MOZ_WIDGET_GTK)
     { &kNS_SHELLSERVICE_CID, false, nullptr, nsGNOMEShellServiceConstructor },
 #endif
-    { &kNS_FEEDSNIFFER_CID, false, nullptr, nsFeedSnifferConstructor },
     { &kNS_BROWSER_ABOUT_REDIRECTOR_CID, false, nullptr, AboutRedirector::Create },
 #if defined(XP_WIN)
     { &kNS_WINIEHISTORYENUMERATOR_CID, false, nullptr, nsIEHistoryEnumeratorConstructor },
 #elif defined(XP_MACOSX)
     { &kNS_SHELLSERVICE_CID, false, nullptr, nsMacShellServiceConstructor },
 #endif
 #if defined(MOZ_WIDGET_COCOA)
     { &kNS_MACATTRIBUTIONSERVICE_CID, false, nullptr, nsMacAttributionServiceConstructor },
@@ -95,21 +90,19 @@ static const mozilla::Module::CIDEntry k
 static const mozilla::Module::ContractIDEntry kBrowserContracts[] = {
     // clang-format off
     { NS_BROWSERDIRECTORYPROVIDER_CONTRACTID, &kNS_BROWSERDIRECTORYPROVIDER_CID },
 #if defined(XP_WIN)
     { NS_SHELLSERVICE_CONTRACTID, &kNS_SHELLSERVICE_CID },
 #elif defined(MOZ_WIDGET_GTK)
     { NS_SHELLSERVICE_CONTRACTID, &kNS_SHELLSERVICE_CID },
 #endif
-    { NS_FEEDSNIFFER_CONTRACTID, &kNS_FEEDSNIFFER_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "blocked", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "certerror", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "tabcrashed", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
-    { NS_ABOUT_MODULE_CONTRACTID_PREFIX "feeds", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "privatebrowsing", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "rights", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "robots", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "searchreset", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "sessionrestore", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "welcomeback", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "home", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
     { NS_ABOUT_MODULE_CONTRACTID_PREFIX "newtab", &kNS_BROWSER_ABOUT_REDIRECTOR_CID },
@@ -129,17 +122,16 @@ static const mozilla::Module::ContractID
     { NS_MACATTRIBUTIONSERVICE_CONTRACTID, &kNS_MACATTRIBUTIONSERVICE_CID },
 #endif
     { nullptr }
     // clang-format on
 };
 
 static const mozilla::Module::CategoryEntry kBrowserCategories[] = {
     { XPCOM_DIRECTORY_PROVIDER_CATEGORY, "browser-directory-provider", NS_BROWSERDIRECTORYPROVIDER_CONTRACTID },
-    { NS_CONTENT_SNIFFER_CATEGORY, "Feed Sniffer", NS_FEEDSNIFFER_CONTRACTID },
     { nullptr }
 };
 
 static const mozilla::Module kBrowserModule = {
     mozilla::Module::kVersion,
     kBrowserCIDs,
     kBrowserContracts,
     kBrowserCategories
--- a/browser/components/controlcenter/content/panel.inc.xul
+++ b/browser/components/controlcenter/content/panel.inc.xul
@@ -84,34 +84,34 @@
           <description id="identity-popup-content-blocking-not-detected"
                        crop="end">&contentBlocking.notDetected;</description>
 
           <vbox id="identity-popup-content-blocking-category-list">
             <hbox id="identity-popup-content-blocking-category-fastblock"
                   class="identity-popup-content-blocking-category" align="center" role="group">
               <image class="identity-popup-content-blocking-category-icon fastblock-icon"/>
               <label flex="1" class="identity-popup-content-blocking-category-label">&contentBlocking.fastBlock.label;</label>
-              <label flex="1" class="identity-popup-content-blocking-category-state-label">&contentBlocking.fastBlock.blocked.label;</label>
+              <label flex="1" class="identity-popup-content-blocking-category-state-label">&contentBlocking.fastBlock.blocking.label;</label>
               <label flex="1" class="identity-popup-content-blocking-category-add-blocking text-link"
                      onclick="ContentBlocking.openPreferences('identityPopup-CB-fastblock'); gIdentityHandler.recordClick('fb_add_blocking');">&contentBlocking.fastBlock.add.label;</label>
             </hbox>
             <hbox id="identity-popup-content-blocking-category-tracking-protection"
                   class="identity-popup-content-blocking-category" align="center" role="group">
               <image class="identity-popup-content-blocking-category-icon tracking-protection-icon"/>
               <label flex="1" class="identity-popup-content-blocking-category-label">&contentBlocking.trackingProtection3.label;</label>
-              <label flex="1" class="identity-popup-content-blocking-category-state-label">&contentBlocking.trackingProtection.blocked.label;</label>
+              <label flex="1" class="identity-popup-content-blocking-category-state-label">&contentBlocking.trackingProtection.blocking.label;</label>
               <label flex="1" class="identity-popup-content-blocking-category-add-blocking text-link"
                      id="identity-popup-tracking-protection-add-blocking"
                      onclick="ContentBlocking.openPreferences('identityPopup-CB-tracking-protection'); gIdentityHandler.recordClick('tp_add_blocking');">&contentBlocking.trackingProtection.add.label;</label>
             </hbox>
             <hbox id="identity-popup-content-blocking-category-3rdpartycookies"
                   class="identity-popup-content-blocking-category" align="center" role="group">
               <image class="identity-popup-content-blocking-category-icon thirdpartycookies-icon"/>
               <label flex="1" class="identity-popup-content-blocking-category-label">&contentBlocking.3rdPartyCookies.label;</label>
-              <label flex="1" class="identity-popup-content-blocking-category-state-label">&contentBlocking.3rdPartyCookies.blocked.label;</label>
+              <label flex="1" class="identity-popup-content-blocking-category-state-label">&contentBlocking.3rdPartyCookies.blocking.label;</label>
               <label flex="1" class="identity-popup-content-blocking-category-add-blocking text-link"
                      id="identity-popup-3rdpartycookies-add-blocking"
                      onclick="ContentBlocking.openPreferences('identityPopup-CB-3rdpartycookies'); gIdentityHandler.recordClick('cookies_add_blocking');">&contentBlocking.3rdPartyCookies.add.label;</label>
             </hbox>
           </vbox>
 
           <button id="tracking-action-unblock"
                   class="tracking-protection-button"
--- a/browser/components/customizableui/content/panelUI.inc.xul
+++ b/browser/components/customizableui/content/panelUI.inc.xul
@@ -566,19 +566,16 @@
       </vbox>
       <toolbarbutton id="panelMenu_showAllBookmarks"
                      label="&showAllBookmarks2.label;"
                      class="subviewbutton panel-subview-footer"
                      command="Browser:ShowAllBookmarks"
                      onclick="PanelUI.hide();"/>
     </panelview>
 
-    <panelview id="PanelUI-feeds" flex="1" oncommand="FeedHandler.subscribeToFeed(null, event);">
-    </panelview>
-
     <panelview id="PanelUI-containers" flex="1">
       <vbox id="PanelUI-containersItems"/>
     </panelview>
 
     <panelview id="PanelUI-helpView" flex="1" class="PanelUI-subView">
       <vbox id="PanelUI-helpItems" class="panel-subview-body"/>
     </panelview>
 
--- a/browser/components/feeds/BrowserFeeds.manifest
+++ b/browser/components/feeds/BrowserFeeds.manifest
@@ -1,10 +1,2 @@
-component {229fa115-9412-4d32-baf3-2fc407f76fb1} FeedConverter.js
-contract @mozilla.org/streamconv;1?from=application/vnd.mozilla.maybe.feed&to=*/* {229fa115-9412-4d32-baf3-2fc407f76fb1}
-contract @mozilla.org/streamconv;1?from=application/vnd.mozilla.maybe.video.feed&to=*/* {229fa115-9412-4d32-baf3-2fc407f76fb1}
-contract @mozilla.org/streamconv;1?from=application/vnd.mozilla.maybe.audio.feed&to=*/* {229fa115-9412-4d32-baf3-2fc407f76fb1}
-component {2376201c-bbc6-472f-9b62-7548040a61c6} FeedConverter.js
-contract @mozilla.org/browser/feeds/result-service;1 {2376201c-bbc6-472f-9b62-7548040a61c6}
-component {49bb6593-3aff-4eb3-a068-2712c28bd58e} FeedWriter.js
-contract @mozilla.org/browser/feeds/result-writer;1 {49bb6593-3aff-4eb3-a068-2712c28bd58e}
 component {792a7e82-06a0-437c-af63-b2d12e808acc} WebContentConverter.js
 contract @mozilla.org/embeddor.implemented/web-content-handler-registrar;1 {792a7e82-06a0-437c-af63-b2d12e808acc}
deleted file mode 100644
--- a/browser/components/feeds/FeedConverter.js
+++ /dev/null
@@ -1,415 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* 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/. */
-
-ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
-ChromeUtils.import("resource://gre/modules/Services.jsm");
-
-function LOG(str) {
-  dump("*** " + str + "\n");
-}
-
-const FS_CONTRACTID = "@mozilla.org/browser/feeds/result-service;1";
-const FPH_CONTRACTID = "@mozilla.org/network/protocol;1?name=feed";
-const PCPH_CONTRACTID = "@mozilla.org/network/protocol;1?name=pcast";
-
-const TYPE_MAYBE_FEED = "application/vnd.mozilla.maybe.feed";
-const TYPE_MAYBE_VIDEO_FEED = "application/vnd.mozilla.maybe.video.feed";
-const TYPE_MAYBE_AUDIO_FEED = "application/vnd.mozilla.maybe.audio.feed";
-const TYPE_ANY = "*/*";
-
-const PREF_SELECTED_APP = "browser.feeds.handlers.application";
-const PREF_SELECTED_ACTION = "browser.feeds.handler";
-const PREF_SELECTED_READER = "browser.feeds.handler.default";
-
-const PREF_VIDEO_SELECTED_APP = "browser.videoFeeds.handlers.application";
-const PREF_VIDEO_SELECTED_ACTION = "browser.videoFeeds.handler";
-const PREF_VIDEO_SELECTED_READER = "browser.videoFeeds.handler.default";
-
-const PREF_AUDIO_SELECTED_APP = "browser.audioFeeds.handlers.application";
-const PREF_AUDIO_SELECTED_ACTION = "browser.audioFeeds.handler";
-const PREF_AUDIO_SELECTED_READER = "browser.audioFeeds.handler.default";
-
-function getPrefAppForType(t) {
-  switch (t) {
-    case Ci.nsIFeed.TYPE_VIDEO:
-      return PREF_VIDEO_SELECTED_APP;
-
-    case Ci.nsIFeed.TYPE_AUDIO:
-      return PREF_AUDIO_SELECTED_APP;
-
-    default:
-      return PREF_SELECTED_APP;
-  }
-}
-
-function getPrefActionForType(t) {
-  switch (t) {
-    case Ci.nsIFeed.TYPE_VIDEO:
-      return PREF_VIDEO_SELECTED_ACTION;
-
-    case Ci.nsIFeed.TYPE_AUDIO:
-      return PREF_AUDIO_SELECTED_ACTION;
-
-    default:
-      return PREF_SELECTED_ACTION;
-  }
-}
-
-function getPrefReaderForType(t) {
-  switch (t) {
-    case Ci.nsIFeed.TYPE_VIDEO:
-      return PREF_VIDEO_SELECTED_READER;
-
-    case Ci.nsIFeed.TYPE_AUDIO:
-      return PREF_AUDIO_SELECTED_READER;
-
-    default:
-      return PREF_SELECTED_READER;
-  }
-}
-
-XPCOMUtils.defineLazyPreferenceGetter(this, "gCanFrameFeeds",
-  "browser.feeds.unsafelyFrameFeeds", false);
-
-
-function FeedConverter() {
-}
-FeedConverter.prototype = {
-  classID: Components.ID("{229fa115-9412-4d32-baf3-2fc407f76fb1}"),
-
-  /**
-   * This is the downloaded text data for the feed.
-   */
-  _data: null,
-
-  /**
-   * This is the object listening to the conversion, which is ultimately the
-   * docshell for the load.
-   */
-  _listener: null,
-
-  /**
-   * Records if the feed was sniffed
-   */
-  _sniffed: false,
-
-  /**
-   * See nsIStreamConverter.idl
-   */
-  convert(sourceStream, sourceType, destinationType,
-          context) {
-    throw Cr.NS_ERROR_NOT_IMPLEMENTED;
-  },
-
-  /**
-   * See nsIStreamConverter.idl
-   */
-  asyncConvertData(sourceType, destinationType,
-                   listener, context) {
-    this._listener = listener;
-  },
-
-  /**
-   * Whether or not the preview page is being forced.
-   */
-  _forcePreviewPage: false,
-
-  /**
-   * Release our references to various things once we're done using them.
-   */
-  _releaseHandles() {
-    this._listener = null;
-    this._request = null;
-    this._processor = null;
-  },
-
-  /**
-   * See nsIFeedResultListener.idl
-   */
-  handleResult(result) {
-    // Feeds come in various content types, which our feed sniffer coerces to
-    // the maybe.feed type. However, feeds are used as a transport for
-    // different data types, e.g. news/blogs (traditional feed), video/audio
-    // (podcasts) and photos (photocasts, photostreams). Each of these is
-    // different in that there's a different class of application suitable for
-    // handling feeds of that type, but without a content-type differentiation
-    // it is difficult for us to disambiguate.
-    //
-    // The other problem is that if the user specifies an auto-action handler
-    // for one feed application, the fact that the content type is shared means
-    // that all other applications will auto-load with that handler too,
-    // regardless of the content-type.
-    //
-    // This means that content-type alone is not enough to determine whether
-    // or not a feed should be auto-handled. This means that for feeds we need
-    // to always use this stream converter, even when an auto-action is
-    // specified, not the basic one provided by WebContentConverter. This
-    // converter needs to consume all of the data and parse it, and based on
-    // that determination make a judgment about type.
-    //
-    // Since there are no content types for this content, and I'm not going to
-    // invent any, the upshot is that while a user can set an auto-handler for
-    // generic feed content, the system will prevent them from setting an auto-
-    // handler for other stream types. In those cases, the user will always see
-    // the preview page and have to select a handler. We can guess and show
-    // a client handler.
-    //
-    // If this is just a feed, not some kind of specialized application, then
-    // auto-handlers can be set and we should obey them.
-    try {
-      let feedService =
-          Cc["@mozilla.org/browser/feeds/result-service;1"].
-          getService(Ci.nsIFeedResultService);
-      if (!this._forcePreviewPage && result.doc) {
-        let feed = result.doc.QueryInterface(Ci.nsIFeed);
-        let handler = Services.prefs.getCharPref(getPrefActionForType(feed.type), "ask");
-
-        if (handler != "ask") {
-          if (handler == "reader")
-            handler = Services.prefs.getCharPref(getPrefReaderForType(feed.type), "bookmarks");
-          try {
-            let title = feed.title ? feed.title.plainText() : "";
-            let desc = feed.subtitle ? feed.subtitle.plainText() : "";
-            feedService.addToClientReader(result.uri.spec, title, desc, feed.type, handler);
-            return;
-          } catch (ex) { /* fallback to preview mode */ }
-        }
-      }
-
-      let chromeChannel;
-
-      // handling a redirect, hence forwarding the loadInfo from the old channel
-      // to the newchannel.
-      let oldChannel = this._request.QueryInterface(Ci.nsIChannel);
-      let loadInfo = oldChannel.loadInfo;
-
-      // If there was no automatic handler, or this was a podcast,
-      // photostream or some other kind of application, show the preview page
-      // if the parser returned a document.
-      if (result.doc) {
-
-        // Store the result in the result service so that the display
-        // page can access it.
-        feedService.addFeedResult(result);
-
-        // Now load the actual XUL document.
-        let aboutFeedsURI = Services.io.newURI("about:feeds");
-        chromeChannel = Services.io.newChannelFromURIWithLoadInfo(aboutFeedsURI, loadInfo);
-        chromeChannel.originalURI = result.uri;
-
-        // carry the origin attributes from the channel that loaded the feed.
-        chromeChannel.owner =
-          Services.scriptSecurityManager.createCodebasePrincipal(aboutFeedsURI,
-                                                                 loadInfo.originAttributes);
-      } else {
-        chromeChannel = Services.io.newChannelFromURIWithLoadInfo(result.uri, loadInfo);
-      }
-
-      chromeChannel.loadGroup = this._request.loadGroup;
-      chromeChannel.asyncOpen2(this._listener);
-    } finally {
-      this._releaseHandles();
-    }
-  },
-
-  /**
-   * See nsIStreamListener.idl
-   */
-  onDataAvailable(request, context, inputStream,
-                  sourceOffset, count) {
-    if (this._processor)
-      this._processor.onDataAvailable(request, context, inputStream,
-                                      sourceOffset, count);
-  },
-
-  /**
-   * See nsIRequestObserver.idl
-   */
-  onStartRequest(request, context) {
-    let channel = request.QueryInterface(Ci.nsIChannel);
-
-    let {loadInfo} = channel;
-    if ((loadInfo.frameOuterWindowID || loadInfo.outerWindowID) != loadInfo.topOuterWindowID &&
-        !gCanFrameFeeds) {
-      // We don't care about frame loads:
-      return;
-    }
-
-    // Check for a header that tells us there was no sniffing
-    // The value doesn't matter.
-    try {
-      let httpChannel = channel.QueryInterface(Ci.nsIHttpChannel);
-      // Make sure to check requestSucceeded before the potentially-throwing
-      // getResponseHeader.
-      if (!httpChannel.requestSucceeded) {
-        // Just give up, but don't forget to cancel the channel first!
-        request.cancel(Cr.NS_BINDING_ABORTED);
-        return;
-      }
-
-      // Note: this throws if the header is not set.
-      httpChannel.getResponseHeader("X-Moz-Is-Feed");
-    } catch (ex) {
-      this._sniffed = true;
-    }
-
-    this._request = request;
-
-    // Save and reset the forced state bit early, in case there's some kind of
-    // error.
-    let feedService =
-        Cc["@mozilla.org/browser/feeds/result-service;1"].
-        getService(Ci.nsIFeedResultService);
-    this._forcePreviewPage = feedService.forcePreviewPage;
-    feedService.forcePreviewPage = false;
-
-    // Parse feed data as it comes in
-    this._processor =
-        Cc["@mozilla.org/feed-processor;1"].
-        createInstance(Ci.nsIFeedProcessor);
-    this._processor.listener = this;
-    this._processor.parseAsync(null, channel.URI);
-
-    this._processor.onStartRequest(request, context);
-  },
-
-  /**
-   * See nsIRequestObserver.idl
-   */
-  onStopRequest(request, context, status) {
-    if (this._processor)
-      this._processor.onStopRequest(request, context, status);
-  },
-
-  /**
-   * See nsISupports.idl
-   */
-  QueryInterface: ChromeUtils.generateQI(["nsIFeedResultListener",
-                                          "nsIStreamConverter",
-                                          "nsIStreamListener",
-                                          "nsIRequestObserver"]),
-};
-
-/**
- * Keeps parsed FeedResults around for use elsewhere in the UI after the stream
- * converter completes.
- */
-function FeedResultService() {
-}
-
-FeedResultService.prototype = {
-  classID: Components.ID("{2376201c-bbc6-472f-9b62-7548040a61c6}"),
-
-  /**
-   * A URI spec -> [nsIFeedResult] hash. We have to keep a list as the
-   * value in case the same URI is requested concurrently.
-   */
-  _results: { },
-
-  /**
-   * See nsIFeedResultService.idl
-   */
-  forcePreviewPage: false,
-
-  /**
-   * See nsIFeedResultService.idl
-   */
-  addToClientReader(spec, title, subtitle, feedType, feedReader) {
-    if (!feedReader) {
-      feedReader = "default";
-    }
-
-    let handler = Services.prefs.getCharPref(getPrefActionForType(feedType), "bookmarks");
-    if (handler == "ask" || handler == "reader")
-      handler = feedReader;
-
-    switch (handler) {
-    case "client":
-      Services.cpmm.sendAsyncMessage("FeedConverter:ExecuteClientApp",
-                                     { spec,
-                                       title,
-                                       subtitle,
-                                       feedHandler: getPrefAppForType(feedType) });
-      break;
-    case "default":
-      // Default system feed reader
-      Services.cpmm.sendAsyncMessage("FeedConverter:ExecuteClientApp",
-                                     { spec,
-                                       title,
-                                       subtitle,
-                                       feedHandler: "default" });
-      break;
-    }
-  },
-
-  /**
-   * See nsIFeedResultService.idl
-   */
-  addFeedResult(feedResult) {
-    if (feedResult.uri == null)
-      throw new Error("null URI!");
-    if (feedResult.uri == null)
-      throw new Error("null feedResult!");
-    let spec = feedResult.uri.spec;
-    if (!this._results[spec])
-      this._results[spec] = [];
-    this._results[spec].push(feedResult);
-  },
-
-  /**
-   * See nsIFeedResultService.idl
-   */
-  getFeedResult(uri) {
-    if (uri == null)
-      throw new Error("null URI!");
-    let resultList = this._results[uri.spec];
-    for (let result of resultList) {
-      if (result.uri == uri)
-        return result;
-    }
-    return null;
-  },
-
-  /**
-   * See nsIFeedResultService.idl
-   */
-  removeFeedResult(uri) {
-    if (uri == null)
-      throw new Error("null URI!");
-    let resultList = this._results[uri.spec];
-    if (!resultList)
-      return;
-    let deletions = 0;
-    for (let i = 0; i < resultList.length; ++i) {
-      if (resultList[i].uri == uri) {
-        delete resultList[i];
-        ++deletions;
-      }
-    }
-
-    // send the holes to the end
-    resultList.sort();
-    // and trim the list
-    resultList.splice(resultList.length - deletions, deletions);
-    if (resultList.length == 0)
-      delete this._results[uri.spec];
-  },
-
-  createInstance(outer, iid) {
-    if (outer != null)
-      throw Cr.NS_ERROR_NO_AGGREGATION;
-    return this.QueryInterface(iid);
-  },
-
-  QueryInterface: ChromeUtils.generateQI(["nsIFeedResultService",
-                                          "nsIFactory"]),
-};
-
-
-var components = [FeedConverter,
-                  FeedResultService];
-
-
-this.NSGetFactory = XPCOMUtils.generateNSGetFactory(components);
deleted file mode 100644
--- a/browser/components/feeds/FeedWriter.js
+++ /dev/null
@@ -1,528 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* 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";
-
-ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
-ChromeUtils.import("resource://gre/modules/Services.jsm");
-ChromeUtils.import("resource://gre/modules/NetUtil.jsm");
-
-const FEEDWRITER_CID = Components.ID("{49bb6593-3aff-4eb3-a068-2712c28bd58e}");
-const FEEDWRITER_CONTRACTID = "@mozilla.org/browser/feeds/result-writer;1";
-
-function LOG(str) {
-  let shouldLog = Services.prefs.getBoolPref("feeds.log", false);
-
-  if (shouldLog)
-    dump("*** Feeds: " + str + "\n");
-}
-
-/**
- * Wrapper function for nsIIOService::newURI.
- * @param aURLSpec
- *        The URL string from which to create an nsIURI.
- * @returns an nsIURI object, or null if the creation of the URI failed.
- */
-function makeURI(aURLSpec, aCharset) {
-  try {
-    return Services.io.newURI(aURLSpec, aCharset);
-  } catch (ex) { }
-
-  return null;
-}
-
-const XML_NS = "http://www.w3.org/XML/1998/namespace";
-const HTML_NS = "http://www.w3.org/1999/xhtml";
-const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
-const URI_BUNDLE = "chrome://browser/locale/feeds/subscribe.properties";
-
-const TITLE_ID = "feedTitleText";
-const SUBTITLE_ID = "feedSubtitleText";
-
-/**
- * Converts a number of bytes to the appropriate unit that results in a
- * number that needs fewer than 4 digits
- *
- * @return a pair: [new value with 3 sig. figs., its unit]
-  */
-function convertByteUnits(aBytes) {
-  let units = ["bytes", "kilobyte", "megabyte", "gigabyte"];
-  let unitIndex = 0;
-
-  // convert to next unit if it needs 4 digits (after rounding), but only if
-  // we know the name of the next unit
-  while ((aBytes >= 999.5) && (unitIndex < units.length - 1)) {
-    aBytes /= 1024;
-    unitIndex++;
-  }
-
-  // Get rid of insignificant bits by truncating to 1 or 0 decimal points
-  // 0 -> 0; 1.2 -> 1.2; 12.3 -> 12.3; 123.4 -> 123; 234.5 -> 235
-  aBytes = aBytes.toFixed((aBytes > 0) && (aBytes < 100) ? 1 : 0);
-
-  return [aBytes, units[unitIndex]];
-}
-
-XPCOMUtils.defineLazyPreferenceGetter(this, "gCanFrameFeeds",
-  "browser.feeds.unsafelyFrameFeeds", false);
-
-function FeedWriter() {
-  Services.telemetry.scalarAdd("browser.feeds.preview_loaded", 1);
-}
-
-FeedWriter.prototype = {
-  _getPropertyAsBag(container, property) {
-    return container.fields.getProperty(property).
-                     QueryInterface(Ci.nsIPropertyBag2);
-  },
-
-  _getPropertyAsString(container, property) {
-    try {
-      return container.fields.getPropertyAsAString(property);
-    } catch (e) {
-    }
-    return "";
-  },
-
-  _setContentText(id, text) {
-    let element = this._document.getElementById(id);
-    let textNode = text.createDocumentFragment(element);
-    while (element.hasChildNodes())
-      element.firstChild.remove();
-    element.appendChild(textNode);
-    if (text.base) {
-      element.setAttributeNS(XML_NS, "base", text.base.spec);
-    }
-  },
-
-  /**
-   * Safely sets the href attribute on an anchor tag, providing the URI
-   * specified can be loaded according to rules.
-   * @param   element
-   *          The element to set a URI attribute on
-   * @param   attribute
-   *          The attribute of the element to set the URI to, e.g. href or src
-   * @param   uri
-   *          The URI spec to set as the href
-   */
-  _safeSetURIAttribute(element, attribute, uri) {
-    const flags = Ci.nsIScriptSecurityManager.DISALLOW_INHERIT_PRINCIPAL;
-    try {
-      // TODO Is this necessary?
-      Services.scriptSecurityManager.checkLoadURIStrWithPrincipal(this._feedPrincipal, uri, flags);
-      // checkLoadURIStrWithPrincipal will throw if the link URI should not be
-      // loaded, either because our feedURI isn't allowed to load it or per
-      // the rules specified in |flags|, so we'll never "linkify" the link...
-    } catch (e) {
-      // Not allowed to load this link because secman.checkLoadURIStr threw
-      return;
-    }
-
-    element.setAttribute(attribute, uri);
-  },
-
-  __bundle: null,
-  get _bundle() {
-    if (!this.__bundle) {
-      this.__bundle = Services.strings.createBundle(URI_BUNDLE);
-    }
-    return this.__bundle;
-  },
-
-  _getFormattedString(key, params) {
-    return this._bundle.formatStringFromName(key, params, params.length);
-  },
-
-  _getString(key) {
-    return this._bundle.GetStringFromName(key);
-  },
-
-   /**
-   * Returns a date suitable for displaying in the feed preview.
-   * If the date cannot be parsed, the return value is "false".
-   * @param   dateString
-   *          A date as extracted from a feed entry. (entry.updated)
-   */
-  _parseDate(dateString) {
-    // Convert the date into the user's local time zone
-    let dateObj = new Date(dateString);
-
-    // Make sure the date we're given is valid.
-    if (!dateObj.getTime())
-      return false;
-
-    return this._dateFormatter.format(dateObj);
-  },
-
-  __dateFormatter: null,
-  get _dateFormatter() {
-    if (!this.__dateFormatter) {
-      const dtOptions = {
-        timeStyle: "short",
-        dateStyle: "long",
-      };
-      this.__dateFormatter = new Services.intl.DateTimeFormat(undefined, dtOptions);
-    }
-    return this.__dateFormatter;
-  },
-
-  /**
-   * Writes the feed title into the preview document.
-   * @param   container
-   *          The feed container
-   */
-  _setTitleText(container) {
-    if (container.title) {
-      let title = container.title.plainText();
-      this._setContentText(TITLE_ID, container.title);
-      this._document.title = title;
-    }
-
-    let feed = container.QueryInterface(Ci.nsIFeed);
-    if (feed && feed.subtitle)
-      this._setContentText(SUBTITLE_ID, container.subtitle);
-  },
-
-  /**
-   * Writes the title image into the preview document if one is present.
-   * @param   container
-   *          The feed container
-   */
-  _setTitleImage(container) {
-    try {
-      let parts = container.image;
-
-      // Set up the title image (supplied by the feed)
-      let feedTitleImage = this._document.getElementById("feedTitleImage");
-      this._safeSetURIAttribute(feedTitleImage, "src",
-                                parts.getPropertyAsAString("url"));
-
-      // Set up the title image link
-      let feedTitleLink = this._document.getElementById("feedTitleLink");
-
-      let titleText = this._getFormattedString("linkTitleTextFormat",
-                                               [parts.getPropertyAsAString("title")]);
-      let feedTitleText = this._document.getElementById("feedTitleText");
-      let titleImageWidth = parseInt(parts.getPropertyAsAString("width")) + 15;
-
-      // Fix the margin on the main title, so that the image doesn't run over
-      // the underline
-      feedTitleLink.setAttribute("title", titleText);
-      feedTitleText.style.marginRight = titleImageWidth + "px";
-
-      this._safeSetURIAttribute(feedTitleLink, "href",
-                                parts.getPropertyAsAString("link"));
-    } catch (e) {
-      LOG("Failed to set Title Image (this is benign): " + e);
-    }
-  },
-
-  /**
-   * Writes all entries contained in the feed.
-   * @param   container
-   *          The container of entries in the feed
-   */
-  _writeFeedContent(container) {
-    // Build the actual feed content
-    let feed = container.QueryInterface(Ci.nsIFeed);
-    if (feed.items.length == 0)
-      return;
-
-    let feedContent = this._document.getElementById("feedContent");
-
-    for (let i = 0; i < feed.items.length; ++i) {
-      let entry = feed.items.queryElementAt(i, Ci.nsIFeedEntry);
-      entry.QueryInterface(Ci.nsIFeedContainer);
-
-      let entryContainer = this._document.createElementNS(HTML_NS, "div");
-      entryContainer.className = "entry";
-
-      // If the entry has a title, make it a link
-      if (entry.title) {
-        let a = this._document.createElementNS(HTML_NS, "a");
-        let span = this._document.createElementNS(HTML_NS, "span");
-        a.appendChild(span);
-        if (entry.title.base)
-          span.setAttributeNS(XML_NS, "base", entry.title.base.spec);
-        span.appendChild(entry.title.createDocumentFragment(a));
-
-        // Entries are not required to have links, so entry.link can be null.
-        if (entry.link)
-          this._safeSetURIAttribute(a, "href", entry.link.spec);
-
-        let title = this._document.createElementNS(HTML_NS, "h3");
-        title.appendChild(a);
-
-        let lastUpdated = this._parseDate(entry.updated);
-        if (lastUpdated) {
-          let dateDiv = this._document.createElementNS(HTML_NS, "div");
-          dateDiv.className = "lastUpdated";
-          dateDiv.textContent = lastUpdated;
-          title.appendChild(dateDiv);
-        }
-
-        entryContainer.appendChild(title);
-      }
-
-      let body = this._document.createElementNS(HTML_NS, "div");
-      let summary = entry.summary || entry.content;
-      let docFragment = null;
-      if (summary) {
-        if (summary.base)
-          body.setAttributeNS(XML_NS, "base", summary.base.spec);
-        else
-          LOG("no base?");
-        docFragment = summary.createDocumentFragment(body);
-        if (docFragment)
-          body.appendChild(docFragment);
-
-        // If the entry doesn't have a title, append a # permalink
-        // See http://scripting.com/rss.xml for an example
-        if (!entry.title && entry.link) {
-          let a = this._document.createElementNS(HTML_NS, "a");
-          a.appendChild(this._document.createTextNode("#"));
-          this._safeSetURIAttribute(a, "href", entry.link.spec);
-          body.appendChild(this._document.createTextNode(" "));
-          body.appendChild(a);
-        }
-
-      }
-      body.className = "feedEntryContent";
-      entryContainer.appendChild(body);
-
-      if (entry.enclosures && entry.enclosures.length > 0) {
-        let enclosuresDiv = this._buildEnclosureDiv(entry);
-        entryContainer.appendChild(enclosuresDiv);
-      }
-
-      let clearDiv = this._document.createElementNS(HTML_NS, "div");
-      clearDiv.style.clear = "both";
-
-      feedContent.appendChild(entryContainer);
-      feedContent.appendChild(clearDiv);
-    }
-  },
-
-  /**
-   * Takes a url to a media item and returns the best name it can come up with.
-   * Frequently this is the filename portion (e.g. passing in
-   * http://example.com/foo.mpeg would return "foo.mpeg"), but in more complex
-   * cases, this will return the entire url (e.g. passing in
-   * http://example.com/somedirectory/ would return
-   * http://example.com/somedirectory/).
-   * @param aURL
-   *        The URL string from which to create a display name
-   * @returns a string
-   */
-  _getURLDisplayName(aURL) {
-    let url = makeURI(aURL);
-    url.QueryInterface(Ci.nsIURL);
-    if (url == null || url.fileName.length == 0)
-      return decodeURIComponent(aURL);
-
-    return decodeURIComponent(url.fileName);
-  },
-
-  /**
-   * Takes a FeedEntry with enclosures, generates the HTML code to represent
-   * them, and returns that.
-   * @param   entry
-   *          FeedEntry with enclosures
-   * @returns element
-   */
-  _buildEnclosureDiv(entry) {
-    let enclosuresDiv = this._document.createElementNS(HTML_NS, "div");
-    enclosuresDiv.className = "enclosures";
-
-    enclosuresDiv.appendChild(this._document.createTextNode(this._getString("mediaLabel")));
-
-    for (let i_enc = 0; i_enc < entry.enclosures.length; ++i_enc) {
-      let enc = entry.enclosures.queryElementAt(i_enc, Ci.nsIWritablePropertyBag2);
-
-      if (!(enc.hasKey("url")))
-        continue;
-
-      let enclosureDiv = this._document.createElementNS(HTML_NS, "div");
-      enclosureDiv.setAttribute("class", "enclosure");
-
-      let mozicon = "moz-icon://.txt?size=16";
-      let type_text = null;
-      let size_text = null;
-
-      if (enc.hasKey("type")) {
-        type_text = enc.get("type");
-        if (enc.hasKey("typeDesc"))
-          type_text = enc.get("typeDesc");
-
-        if (type_text && type_text.length > 0)
-          mozicon = "moz-icon://goat?size=16&contentType=" + enc.get("type");
-      }
-
-      if (enc.hasKey("length") && /^[0-9]+$/.test(enc.get("length"))) {
-        let enc_size = convertByteUnits(parseInt(enc.get("length")));
-
-        size_text = this._getFormattedString("enclosureSizeText",
-                                             [enc_size[0],
-                                             this._getString(enc_size[1])]);
-      }
-
-      let iconimg = this._document.createElementNS(HTML_NS, "img");
-      iconimg.setAttribute("src", mozicon);
-      iconimg.setAttribute("class", "type-icon");
-      enclosureDiv.appendChild(iconimg);
-
-      enclosureDiv.appendChild(this._document.createTextNode( " " ));
-
-      let enc_href = this._document.createElementNS(HTML_NS, "a");
-      enc_href.appendChild(this._document.createTextNode(this._getURLDisplayName(enc.get("url"))));
-      this._safeSetURIAttribute(enc_href, "href", enc.get("url"));
-      enclosureDiv.appendChild(enc_href);
-
-      if (type_text && size_text)
-        enclosureDiv.appendChild(this._document.createTextNode( " (" + type_text + ", " + size_text + ")"));
-
-      else if (type_text)
-        enclosureDiv.appendChild(this._document.createTextNode( " (" + type_text + ")"));
-
-      else if (size_text)
-        enclosureDiv.appendChild(this._document.createTextNode( " (" + size_text + ")"));
-
-      enclosuresDiv.appendChild(enclosureDiv);
-    }
-
-    return enclosuresDiv;
-  },
-
-  /**
-   * Gets a valid nsIFeedContainer object from the parsed nsIFeedResult.
-   * Displays error information if there was one.
-   * @returns A valid nsIFeedContainer object containing the contents of
-   *          the feed.
-   */
-  _getContainer() {
-    let feedService =
-        Cc["@mozilla.org/browser/feeds/result-service;1"].
-        getService(Ci.nsIFeedResultService);
-
-    let result;
-    try {
-      result =
-        feedService.getFeedResult(this._getOriginalURI(this._window));
-    } catch (e) {
-      LOG("Subscribe Preview: feed not available?!");
-    }
-
-    if (result.bozo) {
-      LOG("Subscribe Preview: feed result is bozo?!");
-    }
-
-    let container;
-    try {
-      container = result.doc;
-    } catch (e) {
-      LOG("Subscribe Preview: no result.doc? Why didn't the original reload?");
-      return null;
-    }
-    return container;
-  },
-
-  /**
-   * Returns the original URI object of the feed and ensures that this
-   * component is only ever invoked from the preview document.
-   * @param aWindow
-   *        The window of the document invoking the BrowserFeedWriter
-   */
-  _getOriginalURI(aWindow) {
-    let docShell = aWindow.docShell;
-    let chan = docShell.currentDocumentChannel;
-
-    // We probably need to call Inherit() for this, but right now we can't call
-    // it from JS.
-    let attrs = docShell.getOriginAttributes();
-    let ssm = Services.scriptSecurityManager;
-    let nullPrincipal = ssm.createNullPrincipal(attrs);
-
-    // this channel is not going to be openend, use a nullPrincipal
-    // and the most restrctive securityFlag.
-    let resolvedURI = NetUtil.newChannel({
-      uri: "about:feeds",
-      loadingPrincipal: nullPrincipal,
-      securityFlags: Ci.nsILoadInfo.SEC_REQUIRE_SAME_ORIGIN_DATA_IS_BLOCKED,
-      contentPolicyType: Ci.nsIContentPolicy.TYPE_OTHER,
-    }).URI;
-
-    if (resolvedURI.equals(chan.URI))
-      return chan.originalURI;
-
-    return null;
-  },
-
-  _window: null,
-  _document: null,
-  _feedURI: null,
-  _feedPrincipal: null,
-
-  // BrowserFeedWriter WebIDL methods
-  init(aWindow) {
-    let window = aWindow;
-    if (window != window.top && !gCanFrameFeeds) {
-      return;
-    }
-    this._feedURI = this._getOriginalURI(window);
-    if (!this._feedURI)
-      return;
-
-    this._window = window;
-    this._document = window.document;
-
-    this._feedPrincipal = Services.scriptSecurityManager.createCodebasePrincipal(this._feedURI, {});
-
-    LOG("Subscribe Preview: feed uri = " + this._window.location.href);
-  },
-
-  writeContent() {
-    if (!this._window)
-      return;
-
-    try {
-      // Set up the feed content
-      let container = this._getContainer();
-      if (!container)
-        return;
-
-      this._setTitleText(container);
-      this._setTitleImage(container);
-      this._writeFeedContent(container);
-    } finally {
-      this._removeFeedFromCache();
-    }
-  },
-
-  close() {
-    if (!this._window) {
-      return;
-    }
-    this._document = null;
-    this._window = null;
-
-    this._removeFeedFromCache();
-    this.__bundle = null;
-    this._feedURI = null;
-  },
-
-  _removeFeedFromCache() {
-    if (this._window && this._feedURI) {
-      let feedService = Cc["@mozilla.org/browser/feeds/result-service;1"].
-                        getService(Ci.nsIFeedResultService);
-      feedService.removeFeedResult(this._feedURI);
-      this._feedURI = null;
-    }
-  },
-
-  classID: FEEDWRITER_CID,
-  QueryInterface: ChromeUtils.generateQI([Ci.nsIObserver,
-                                          Ci.nsIDOMGlobalPropertyInitializer]),
-};
-
-this.NSGetFactory = XPCOMUtils.generateNSGetFactory([FeedWriter]);
deleted file mode 100644
--- a/browser/components/feeds/content/subscribe.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* 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/. */
-
-var SubscribeHandler = {
-  /**
-   * The nsIFeedWriter object that produces the UI
-   */
-  _feedWriter: null,
-
-  init: function SH_init() {
-    this._feedWriter = new BrowserFeedWriter();
-  },
-
-  writeContent: function SH_writeContent() {
-    this._feedWriter.writeContent();
-  },
-
-  uninit: function SH_uninit() {
-    this._feedWriter.close();
-  },
-};
-
-SubscribeHandler.init();
-
-window.onload = function() {
-  SubscribeHandler.writeContent();
-};
-
-window.onunload = function() {
-  SubscribeHandler.uninit();
-};
deleted file mode 100644
--- a/browser/components/feeds/content/subscribe.xhtml
+++ /dev/null
@@ -1,56 +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 % feedDTD
-    SYSTEM "chrome://browser/locale/feeds/subscribe.dtd">
-  %feedDTD;
-]>
-
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-
-<html id="feedHandler"
-      xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Security-Policy" content="default-src chrome:; img-src *; media-src *" />
-    <title>&feedPage.title;</title>
-    <link rel="stylesheet"
-          href="chrome://browser/skin/feeds/subscribe.css"
-          type="text/css"
-          media="all"/>
-  </head>
-  <body>
-    <div id="feedHeaderContainer">
-      <div id="feedHeader" dir="&locale.dir;">
-        <div id="feedIntroText">
-          <p id="feedSubscriptionInfo1" />
-          <p id="feedSubscriptionInfo2" />
-        </div>
-      </div>
-      <div id="feedHeaderContainerSpacer"/>
-    </div>
-    <div id="feedBody">
-      <div id="feedTitle">
-        <a id="feedTitleLink">
-          <img id="feedTitleImage"/>
-        </a>
-        <div id="feedTitleContainer">
-          <h1 id="feedTitleText"/>
-          <h2 id="feedSubtitleText"/>
-        </div>
-      </div>
-      <div id="feedContent"/>
-    </div>
-  </body>
-  <script type="application/javascript" src="chrome://browser/content/feeds/subscribe.js"/>
-</html>
deleted file mode 100644
--- a/browser/components/feeds/jar.mn
+++ /dev/null
@@ -1,7 +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/.
-
-browser.jar:
-    content/browser/feeds/subscribe.xhtml               (content/subscribe.xhtml) 
-    content/browser/feeds/subscribe.js                  (content/subscribe.js)
--- a/browser/components/feeds/moz.build
+++ b/browser/components/feeds/moz.build
@@ -1,40 +1,16 @@
 # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
 # 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/.
 
-MOCHITEST_CHROME_MANIFESTS += ['test/chrome/chrome.ini']
 MOCHITEST_MANIFESTS += ['test/mochitest.ini']
 BROWSER_CHROME_MANIFESTS += ['test/browser/browser.ini']
 
-JAR_MANIFESTS += ['jar.mn']
-
-XPIDL_SOURCES += [
-    'nsIFeedResultService.idl',
-]
-
-XPIDL_MODULE = 'browser-feeds'
-
-SOURCES += [
-    'nsFeedSniffer.cpp',
-]
-
 EXTRA_COMPONENTS += [
     'BrowserFeeds.manifest',
-    'FeedConverter.js',
-    'FeedWriter.js',
     'WebContentConverter.js',
 ]
 
-FINAL_LIBRARY = 'browsercomps'
-
-for var in ('MOZ_APP_NAME', 'MOZ_MACBUNDLE_NAME'):
-    DEFINES[var] = CONFIG[var]
-
-LOCAL_INCLUDES += [
-    '../build',
-]
-
 with Files('**'):
     BUG_COMPONENT = ('Firefox', 'RSS Discovery and Preview')
deleted file mode 100644
--- a/browser/components/feeds/nsFeedSniffer.cpp
+++ /dev/null
@@ -1,391 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* 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/. */
-
-#include "nsFeedSniffer.h"
-
-#include "mozilla/Preferences.h"
-#include "mozilla/Unused.h"
-
-#include "nsNetCID.h"
-#include "nsXPCOM.h"
-#include "nsCOMPtr.h"
-#include "nsStringStream.h"
-
-#include "nsBrowserCompsCID.h"
-
-#include "nsICategoryManager.h"
-#include "nsIServiceManager.h"
-#include "nsComponentManagerUtils.h"
-#include "nsServiceManagerUtils.h"
-
-#include "nsIStreamConverterService.h"
-#include "nsIStreamConverter.h"
-
-#include "nsIStreamListener.h"
-
-#include "nsIHttpChannel.h"
-#include "nsIMIMEHeaderParam.h"
-
-#include "nsMimeTypes.h"
-#include "nsIURI.h"
-#include <algorithm>
-
-#define TYPE_ATOM "application/atom+xml"
-#define TYPE_RSS "application/rss+xml"
-#define TYPE_MAYBE_FEED "application/vnd.mozilla.maybe.feed"
-
-#define NS_RDF "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-#define NS_RSS "http://purl.org/rss/1.0/"
-
-#define MAX_BYTES 512u
-
-static bool sFramePrefCached = false;
-static bool sFramingAllowed = false;
-
-using namespace mozilla;
-
-NS_IMPL_ISUPPORTS(nsFeedSniffer,
-                  nsIContentSniffer,
-                  nsIStreamListener,
-                  nsIRequestObserver)
-
-nsresult
-nsFeedSniffer::ConvertEncodedData(nsIRequest* request,
-                                  const uint8_t* data,
-                                  uint32_t length)
-{
-  nsresult rv = NS_OK;
-
- mDecodedData = "";
- nsCOMPtr<nsIHttpChannel> httpChannel(do_QueryInterface(request));
-  if (!httpChannel)
-    return NS_ERROR_NO_INTERFACE;
-
-  nsAutoCString contentEncoding;
-  mozilla::Unused << httpChannel->GetResponseHeader(NS_LITERAL_CSTRING("Content-Encoding"),
-                                                    contentEncoding);
-  if (!contentEncoding.IsEmpty()) {
-    nsCOMPtr<nsIStreamConverterService> converterService(do_GetService(NS_STREAMCONVERTERSERVICE_CONTRACTID));
-    if (converterService) {
-      ToLowerCase(contentEncoding);
-
-      nsCOMPtr<nsIStreamListener> converter;
-      rv = converterService->AsyncConvertData(contentEncoding.get(),
-                                              "uncompressed", this, nullptr,
-                                              getter_AddRefs(converter));
-      NS_ENSURE_SUCCESS(rv, rv);
-
-      converter->OnStartRequest(request, nullptr);
-
-      nsCOMPtr<nsIStringInputStream> rawStream =
-        do_CreateInstance(NS_STRINGINPUTSTREAM_CONTRACTID);
-      if (!rawStream)
-        return NS_ERROR_FAILURE;
-
-      rv = rawStream->SetData((const char*)data, length);
-      NS_ENSURE_SUCCESS(rv, rv);
-
-      rv = converter->OnDataAvailable(request, nullptr, rawStream, 0, length);
-      NS_ENSURE_SUCCESS(rv, rv);
-
-      converter->OnStopRequest(request, nullptr, NS_OK);
-    }
-  }
-  return rv;
-}
-
-template<int N>
-static bool
-StringBeginsWithLowercaseLiteral(nsAString& aString,
-                                 const char (&aSubstring)[N])
-{
-  return StringHead(aString, N).LowerCaseEqualsLiteral(aSubstring);
-}
-
-bool
-HasAttachmentDisposition(nsIHttpChannel* httpChannel)
-{
-  if (!httpChannel)
-    return false;
-
-  uint32_t disp;
-  nsresult rv = httpChannel->GetContentDisposition(&disp);
-
-  if (NS_SUCCEEDED(rv) && disp == nsIChannel::DISPOSITION_ATTACHMENT)
-    return true;
-
-  return false;
-}
-
-/**
- * @return the first occurrence of a character within a string buffer,
- *         or nullptr if not found
- */
-static const char*
-FindChar(char c, const char *begin, const char *end)
-{
-  for (; begin < end; ++begin) {
-    if (*begin == c)
-      return begin;
-  }
-  return nullptr;
-}
-
-/**
- *
- * Determine if a substring is the "documentElement" in the document.
- *
- * All of our sniffed substrings: <rss, <feed, <rdf:RDF must be the "document"
- * element within the XML DOM, i.e. the root container element. Otherwise,
- * it's possible that someone embedded one of these tags inside a document of
- * another type, e.g. a HTML document, and we don't want to show the preview
- * page if the document isn't actually a feed.
- *
- * @param   start
- *          The beginning of the data being sniffed
- * @param   end
- *          The end of the data being sniffed, right before the substring that
- *          was found.
- * @returns true if the found substring is the documentElement, false
- *          otherwise.
- */
-static bool
-IsDocumentElement(const char *start, const char* end)
-{
-  // For every tag in the buffer, check to see if it's a PI, Doctype or
-  // comment, our desired substring or something invalid.
-  while ( (start = FindChar('<', start, end)) ) {
-    ++start;
-    if (start >= end)
-      return false;
-
-    // Check to see if the character following the '<' is either '?' or '!'
-    // (processing instruction or doctype or comment)... these are valid nodes
-    // to have in the prologue.
-    if (*start != '?' && *start != '!')
-      return false;
-
-    // Now advance the iterator until the '>' (We do this because we don't want
-    // to sniff indicator substrings that are embedded within other nodes, e.g.
-    // comments: <!-- <rdf:RDF .. > -->
-    start = FindChar('>', start, end);
-    if (!start)
-      return false;
-
-    ++start;
-  }
-  return true;
-}
-
-/**
- * Determines whether or not a string exists as the root element in an XML data
- * string buffer.
- * @param   dataString
- *          The data being sniffed
- * @param   substring
- *          The substring being tested for existence and root-ness.
- * @returns true if the substring exists and is the documentElement, false
- *          otherwise.
- */
-static bool
-ContainsTopLevelSubstring(nsACString& dataString, const char *substring)
-{
-  nsACString::const_iterator start, end;
-  dataString.BeginReading(start);
-  dataString.EndReading(end);
-
-  if (!FindInReadable(nsCString(substring), start, end)){
-    return false;
-  }
-
-  auto offset = start.get() - dataString.Data();
-
-  const char *begin = dataString.BeginReading();
-
-  // Only do the validation when we find the substring.
-  return IsDocumentElement(begin, begin + offset);
-}
-
-NS_IMETHODIMP
-nsFeedSniffer::GetMIMETypeFromContent(nsIRequest* request,
-                                      const uint8_t* data,
-                                      uint32_t length,
-                                      nsACString& sniffedType)
-{
-  nsCOMPtr<nsIHttpChannel> channel(do_QueryInterface(request));
-  if (!channel)
-    return NS_ERROR_NO_INTERFACE;
-
-  // Check that this is a GET request, since you can't subscribe to a POST...
-  nsAutoCString method;
-  mozilla::Unused << channel->GetRequestMethod(method);
-  if (!method.EqualsLiteral("GET")) {
-    sniffedType.Truncate();
-    return NS_OK;
-  }
-
-  if (!sFramePrefCached) {
-    sFramePrefCached = true;
-    Preferences::AddBoolVarCache(&sFramingAllowed,
-                                 "browser.feeds.unsafelyFrameFeeds");
-  }
-
-  if (!sFramingAllowed) {
-    // Check that we're the toplevel frame:
-    nsCOMPtr<nsILoadInfo> loadInfo = channel->GetLoadInfo();
-    if (!loadInfo) {
-      sniffedType.Truncate();
-      return NS_OK;
-    }
-    auto frameID = loadInfo->GetFrameOuterWindowID();
-    if (!frameID) {
-      frameID = loadInfo->GetOuterWindowID();
-    }
-    if (loadInfo->GetTopOuterWindowID() != frameID) {
-      sniffedType.Truncate();
-      return NS_OK;
-    }
-  }
-
-  // We need to find out if this is a load of a view-source document. In this
-  // case we do not want to override the content type, since the source display
-  // does not need to be converted from feed format to XUL. More importantly,
-  // we don't want to change the content type from something
-  // nsContentDLF::CreateInstance knows about (e.g. application/xml, text/html
-  // etc) to something that only the application fe knows about (maybe.feed)
-  // thus deactivating syntax highlighting.
-  nsCOMPtr<nsIURI> originalURI;
-  channel->GetOriginalURI(getter_AddRefs(originalURI));
-
-  nsAutoCString scheme;
-  originalURI->GetScheme(scheme);
-  if (scheme.EqualsLiteral("view-source")) {
-    sniffedType.Truncate();
-    return NS_OK;
-  }
-
-  // Check the Content-Type to see if it is set correctly. If it is set to
-  // something specific that we think is a reliable indication of a feed, don't
-  // bother sniffing since we assume the site maintainer knows what they're
-  // doing.
-  nsAutoCString contentType;
-  channel->GetContentType(contentType);
-  bool noSniff = contentType.EqualsLiteral(TYPE_RSS) ||
-                   contentType.EqualsLiteral(TYPE_ATOM);
-
-  if (noSniff) {
-    // check for an attachment after we have a likely feed.
-    if(HasAttachmentDisposition(channel)) {
-      sniffedType.Truncate();
-      return NS_OK;
-    }
-
-    // set the feed header as a response header, since we have good metadata
-    // telling us that the feed is supposed to be RSS or Atom
-    mozilla::DebugOnly<nsresult> rv =
-      channel->SetResponseHeader(NS_LITERAL_CSTRING("X-Moz-Is-Feed"),
-                                 NS_LITERAL_CSTRING("1"), false);
-    MOZ_ASSERT(NS_SUCCEEDED(rv));
-    sniffedType.AssignLiteral(TYPE_MAYBE_FEED);
-    return NS_OK;
-  }
-
-  // Don't sniff arbitrary types.  Limit sniffing to situations that
-  // we think can reasonably arise.
-  if (!contentType.EqualsLiteral(TEXT_HTML) &&
-      !contentType.EqualsLiteral(APPLICATION_OCTET_STREAM) &&
-      // Same criterion as XMLHttpRequest.  Should we be checking for "+xml"
-      // and check for text/xml and application/xml by hand instead?
-      contentType.Find("xml") == -1) {
-    sniffedType.Truncate();
-    return NS_OK;
-  }
-
-  // Now we need to potentially decompress data served with
-  // Content-Encoding: gzip
-  nsresult rv = ConvertEncodedData(request, data, length);
-  if (NS_FAILED(rv))
-    return rv;
-
-  // We cap the number of bytes to scan at MAX_BYTES to prevent picking up
-  // false positives by accidentally reading document content, e.g. a "how to
-  // make a feed" page.
-  const char* testData;
-  if (mDecodedData.IsEmpty()) {
-    testData = (const char*)data;
-    length = std::min(length, MAX_BYTES);
-  } else {
-    testData = mDecodedData.get();
-    length = std::min(mDecodedData.Length(), MAX_BYTES);
-  }
-
-  // The strategy here is based on that described in:
-  // http://blogs.msdn.com/rssteam/articles/PublishersGuide.aspx
-  // for interoperarbility purposes.
-
-  // Thus begins the actual sniffing.
-  nsDependentCSubstring dataString((const char*)testData, length);
-
-  bool isFeed = false;
-
-  // RSS 0.91/0.92/2.0
-  isFeed = ContainsTopLevelSubstring(dataString, "<rss");
-
-  // Atom 1.0
-  if (!isFeed)
-    isFeed = ContainsTopLevelSubstring(dataString, "<feed");
-
-  // RSS 1.0
-  if (!isFeed) {
-    bool foundNS_RDF = FindInReadable(NS_LITERAL_CSTRING(NS_RDF), dataString);
-    bool foundNS_RSS = FindInReadable(NS_LITERAL_CSTRING(NS_RSS), dataString);
-    isFeed = ContainsTopLevelSubstring(dataString, "<rdf:RDF") &&
-      foundNS_RDF && foundNS_RSS;
-  }
-
-  // If we sniffed a feed, coerce our internal type
-  if (isFeed && !HasAttachmentDisposition(channel))
-    sniffedType.AssignLiteral(TYPE_MAYBE_FEED);
-  else
-    sniffedType.Truncate();
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-nsFeedSniffer::OnStartRequest(nsIRequest* request, nsISupports* context)
-{
-  return NS_OK;
-}
-
-nsresult
-nsFeedSniffer::AppendSegmentToString(nsIInputStream* inputStream,
-                                     void* closure,
-                                     const char* rawSegment,
-                                     uint32_t toOffset,
-                                     uint32_t count,
-                                     uint32_t* writeCount)
-{
-  nsCString* decodedData = static_cast<nsCString*>(closure);
-  decodedData->Append(rawSegment, count);
-  *writeCount = count;
-  return NS_OK;
-}
-
-NS_IMETHODIMP
-nsFeedSniffer::OnDataAvailable(nsIRequest* request, nsISupports* context,
-                               nsIInputStream* stream, uint64_t offset,
-                               uint32_t count)
-{
-  uint32_t read;
-  return stream->ReadSegments(AppendSegmentToString, &mDecodedData, count,
-                              &read);
-}
-
-NS_IMETHODIMP
-nsFeedSniffer::OnStopRequest(nsIRequest* request, nsISupports* context,
-                             nsresult status)
-{
-  return NS_OK;
-}
deleted file mode 100644
--- a/browser/components/feeds/nsFeedSniffer.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* 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/. */
-
-
-#include "nsIContentSniffer.h"
-#include "nsIStreamListener.h"
-#include "nsString.h"
-#include "mozilla/Attributes.h"
-
-class nsFeedSniffer final : public nsIContentSniffer,
-                                   nsIStreamListener
-{
-public:
-  NS_DECL_ISUPPORTS
-  NS_DECL_NSICONTENTSNIFFER
-  NS_DECL_NSIREQUESTOBSERVER
-  NS_DECL_NSISTREAMLISTENER
-
-  static nsresult AppendSegmentToString(nsIInputStream* inputStream,
-                                        void* closure,
-                                        const char* rawSegment,
-                                        uint32_t toOffset,
-                                        uint32_t count,
-                                        uint32_t* writeCount);
-
-protected:
-  ~nsFeedSniffer() {}
-
-  nsresult ConvertEncodedData(nsIRequest* request, const uint8_t* data,
-                              uint32_t length);
-
-private:
-  nsCString mDecodedData;
-};
-
deleted file mode 100644
--- a/browser/components/feeds/nsIFeedResultService.idl
+++ /dev/null
@@ -1,70 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* 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/. */
-
-#include "nsISupports.idl"
-interface nsIURI;
-interface nsIRequest;
-interface nsIFeedResult;
-
-/**
- * nsIFeedResultService provides a globally-accessible object for retrieving
- * the results of feed processing.
- */
-[scriptable, uuid(95309fd2-7b3a-47fb-97f3-5c460d9473cd)]
-interface nsIFeedResultService : nsISupports
-{
-  /**
-   * When set to true, forces the preview page to be displayed, regardless
-   * of the user's preferences.
-   */
-  attribute boolean forcePreviewPage;
-
-  /**
-   * Adds a URI to the user's specified external feed handler, or live
-   * bookmarks.
-   * @param   uri
-   *          The uri of the feed to add.
-   * @param   title
-   *          The title of the feed to add.
-   * @param   subtitle
-   *          The subtitle of the feed to add.
-   * @param   feedType
-   *          The nsIFeed type of the feed.  See nsIFeed.idl
-   * @param   feedReader
-   *          The type of feed reader we're using (client, bookmarks, default)
-   *          If this parameter is null, the type is set to default
-   */
-  void addToClientReader(in AUTF8String uri,
-                         in AString title,
-                         in AString subtitle,
-                         in unsigned long feedType,
-                         [optional] in AString feedReader);
-
-  /**
-   * Registers a Feed Result object with a globally accessible service
-   * so that it can be accessed by a singleton method outside the usual
-   * flow of control in document loading.
-   *
-   * @param   feedResult
-   *          An object implementing nsIFeedResult representing the feed.
-   */
-  void addFeedResult(in nsIFeedResult feedResult);
-
-  /**
-   * Gets a Feed Handler object registered using addFeedResult.
-   *
-   * @param   uri
-   *          The URI of the feed a handler is being requested for
-   */
-  nsIFeedResult getFeedResult(in nsIURI uri);
-
-  /**
-   * Unregisters a Feed Handler object registered using addFeedResult.
-   * @param   uri
-   *          The feed URI the handler was registered under. This must be
-   *          the same *instance* the feed was registered under.
-   */
-  void removeFeedResult(in nsIURI uri);
-};
deleted file mode 100644
--- a/browser/components/feeds/test/bug364677-data.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<rss version="2.0">
-  <channel>
-    <title>t</title>
-  </channel>
-</rss>
deleted file mode 100644
--- a/browser/components/feeds/test/bug364677-data.xml^headers^
+++ /dev/null
@@ -1,1 +0,0 @@
-Content-Type: text/xml
deleted file mode 100644
--- a/browser/components/feeds/test/bug368464-data.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0"?>
-                 <rdf:RDF 
-               xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-               xmlns="http://my.netscape.com/rdf/simple/0.9/">
-               <channel>
-               <title>Tinderbox - Firefox</title>
-               <description>Build bustages for Firefox</description>
-               <link>http://tinderbox.mozilla.org/showbuilds.cgi?tree=Firefox</link>
-               </channel>
-               <image>
-               <title>Bad</title>
-               <url>http://tinderbox.mozilla.org/channelflames.gif</url>
-               <link>http://tinderbox.mozilla.org/showbuilds.cgi?tree=Firefox</link>
-               </image>
-           <item><title>The tree is currently closed</title><link>http://tinderbox.mozilla.org/showbuilds.cgi?tree=Firefox</link></item>
-
-<item><title>MacOSX Darwin 8.8.4 qm-xserve01 dep unit test is in flames</title><link>http://tinderbox.mozilla.org/showbuilds.cgi?tree=Firefox</link></item>
-</rdf:RDF>
deleted file mode 100644
--- a/browser/components/feeds/test/bug408328-data.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<feed xmlns="http://www.w3.org/2005/Atom">
-
-  <title>Example Feed</title> 
-  <link href="http://example.org/"/>
-  <updated>2003-12-13T18:30:02Z</updated>
-
-  <author> 
-    <name>John Doe</name>
-  </author> 
-  <id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id>
-
-  <entry>
-
-    <title>Good item</title>
-    <link href="http://example.org/first"/>
-    <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
-    <updated>2003-12-13T18:30:02Z</updated>
-
-    <summary>Some text.</summary>
-  </entry>
-
-  <entry>
-
-    <title>data: link</title>
-    <link href="data:text/plain,Hi"/>
-    <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6b</id>
-    <updated>2003-12-13T18:30:03Z</updated>
-
-    <summary>Some text.</summary>
-  </entry>
-  
-  <entry>
-
-    <title>javascript: link</title>
-    <link href="javascript:alert('Hi')"/>
-    <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6c</id>
-    <updated>2003-12-13T18:30:04Z</updated>
-
-    <summary>Some text.</summary>
-  </entry>
-  
-  <entry>
-
-    <title>file: link</title>
-    <link href="file:///var/"/>
-    <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6d</id>
-    <updated>2003-12-13T18:30:05Z</updated>
-
-    <summary>Some text.</summary>
-  </entry>
-
-  <entry>
-
-    <title>chrome: link</title>
-    <link href="chrome://browser/content/browser.js"/>
-    <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6e</id>
-    <updated>2003-12-13T18:30:06Z</updated>
-
-    <summary>Some text.</summary>
-  </entry>
-
-</feed>
deleted file mode 100644
--- a/browser/components/feeds/test/bug436801-data.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<feed xmlns="http://www.w3.org/2005/Atom" xml:base="http://www.example.com/">
-
-  <title type="xhtml" xml:base="/foo/bar/">
-    <div xmlns="http://www.w3.org/1999/xhtml">Example of a <em>special</em> feed (<img height="20px" src="baz.png" alt="base test sprite"/>)</div>
-  </title>
-
-  <subtitle type="html" xml:base="/foo/bar/">
-    <![CDATA[
-      With a <em>special</em> subtitle (<img height="20px" src="baz.png" alt="base test sprite"/>)
-    ]]>
-  </subtitle>
-
-  <link href="http://example.org/"/>
-
-  <updated>2010-09-02T18:30:02Z</updated>
-
-  <author>
-    <name>John Doe</name>
-  </author>
-
-  <id>urn:uuid:22906062-ecbd-46e2-b6a7-3039506a398f</id>
-
-  <entry>
-    <title type="xhtml" xml:base="/foo/bar/">
-      <div xmlns="http://www.w3.org/1999/xhtml">Some <abbr title="Extensible Hyper-text Mark-up Language">XHTML</abbr> examples (<img height="20px" src="baz.png" alt="base test sprite"/>)</div>
-    </title>
-    <id>urn:uuid:b48083a7-71a7-4c9c-8515-b7c0d22955e7</id>
-    <updated>2010-09-02T18:30:02Z</updated>
-    <summary>Some text.</summary>
-  </entry>
-
-  <entry>
-    <title type="html" xml:base="/foo/bar/">
-      <![CDATA[
-        Some <abbr title="Hyper-text Mark-up Language">HTML</abbr> examples (<img height="20px" src="baz.png" alt="base test sprite"/>)
-      ]]>
-    </title>
-    <id>urn:uuid:1424967a-280a-414d-b0ab-8b11c4ac1bb7</id>
-    <updated>2010-09-02T18:30:02Z</updated>
-    <summary>Some text.</summary>
-  </entry>
-
-</feed>
deleted file mode 100644
--- a/browser/components/feeds/test/bug494328-data.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<rss version="2.0">
-  <channel>
-    <title>Channel title</title>
-    <description>Channel description</description>
-    <link>Channel link</link>
-    <item>
-      <title>Episode 1</title>
-      <enclosure url="http://www.example.com/podcasts/Episode%201" length="0" type="audio/x-m4a" />
-    </item>
-    <item>
-      <title>Episode 2</title>
-      <enclosure url="http://www.example.com/podcasts/Episode%20%232" length="0" type="audio/x-m4a" />
-    </item>
-    <item>
-      <title>Episode 3</title>
-      <enclosure url="http://www.example.com/podcasts/Episode%20%233/" length="0" type="audio/x-m4a" />
-    </item>
-    <item>
-      <title>Episode 4</title>
-      <enclosure url="http://www.example.com/podcasts/Is%20This%20Episode%20%234%3F" length="0" type="audio/x-m4a" />
-    </item>
-  </channel>
-</rss>
deleted file mode 100644
--- a/browser/components/feeds/test/chrome/.eslintrc.js
+++ /dev/null
@@ -1,7 +0,0 @@
-"use strict";
-
-module.exports = {
-  "extends": [
-    "plugin:mozilla/chrome-test"
-  ]
-};
deleted file mode 100644
--- a/browser/components/feeds/test/chrome/chrome.ini
+++ /dev/null
@@ -1,12 +0,0 @@
-[DEFAULT]
-prefs =
-  browser.feeds.unsafelyFrameFeeds=true
-
-support-files = sample_feed.atom
-  !/browser/components/feeds/test/bug408328-data.xml
-  !/browser/components/feeds/test/valid-feed.xml
-  !/browser/components/feeds/test/valid-unsniffable-feed.xml
-
-[test_bug368464.html]
-[test_bug408328.html]
-[test_maxSniffing.html]
deleted file mode 100644
--- a/browser/components/feeds/test/chrome/sample_feed.atom
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<feed xmlns="http://www.w3.org/2005/Atom">
-
-  <title>Example Feed</title> 
-  <link href="http://example.org/"/>
-  <updated>2003-12-13T18:30:02Z</updated>
-
-  <author> 
-    <name>John Doe</name>
-  </author> 
-  <id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id>
-
-  <entry>
-
-    <title>Atom-Powered Robots Run Amok</title>
-    <link href="http://example.org/2003/12/13/atom03"/>
-    <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
-    <updated>2003-12-13T18:30:02Z</updated>
-
-    <summary>Some text.</summary>
-  </entry>
-
-</feed>
deleted file mode 100644
--- a/browser/components/feeds/test/chrome/test_bug368464.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id=368464
--->
-<head>
-  <title>Test that RSS 0.90 isn't sniffed</title>
-  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
-  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
-</head>
-<body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=368464">Mozilla Bug 368464</a>
-<p id="display"><iframe id="testFrame" src="http://mochi.test:8888/tests/browser/components/feeds/test/bug368464-data.xml"></iframe></p>
-<div id="content" style="display: none">
-
-</div>
-<pre id="test">
-<script class="testbody" type="text/javascript">
-
-/** Test for Bug 368464 **/
-SimpleTest.waitForExplicitFinish();
-
-addLoadEvent(function() {
-  ok($("testFrame").contentDocument.documentElement.id != "feedHandler",
-     "RSS 0.90 shouldn't be sniffed as a feed");
-});
-addLoadEvent(SimpleTest.finish);
-
-</script>
-</pre>
-</body>
-</html>
deleted file mode 100644
--- a/browser/components/feeds/test/chrome/test_bug408328.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id=408328
--->
-<head>
-  <title>Test feed preview safe-linkification</title>
-  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
-  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
-</head>
-<body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=408328">Mozilla Bug 408328</a>
-<p id="display"><iframe id="testFrame" src="http://mochi.test:8888/tests/browser/components/feeds/test/bug408328-data.xml"></iframe></p>
-<div id="content" style="display: none">
-  
-</div>
-<pre id="test">
-<script class="testbody" type="text/javascript">
-
-/** Test for Bug 408328 **/
-SimpleTest.waitForExplicitFinish();
-
-addLoadEvent(function() {
-  var links = $("testFrame").contentDocument.getElementById("feedContent").getElementsByTagName("a");
-  is(links.length, 5, "wrong number of linked items in feed preview");
-  for (var i = 0; i < links.length; i++) {
-    if (links[i].href)
-      is(links[i].href, "http://example.org/first", "bad linkified item");
-  }
-});
-addLoadEvent(SimpleTest.finish);
-
-</script>
-</pre>
-</body>
-</html>
-
deleted file mode 100644
--- a/browser/components/feeds/test/chrome/test_maxSniffing.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id=739040
--->
-<head>
-  <title>Test that we only sniff 512 bytes</title>
-  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
-  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
-</head>
-<body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=739040">Mozilla Bug 739040</a>
-<p id="display">
-  <iframe id="validTestFrame" src="http://mochi.test:8888/tests/browser/components/feeds/test/valid-feed.xml"></iframe>
-  <iframe id="unsniffableTestFrame" src="http://mochi.test:8888/tests/browser/components/feeds/test/valid-unsniffable-feed.xml"></iframe>
-</p>
-<div id="content" style="display: none">
-
-</div>
-<pre id="test">
-<script class="testbody" type="text/javascript">
-
-/** Test for Bug 739040 **/
-SimpleTest.waitForExplicitFinish();
-
-addLoadEvent(function() {
-  is($("validTestFrame").contentDocument.documentElement.id, "feedHandler",
-     "valid feed should be sniffed");
-  isnot($("unsniffableTestFrame").contentDocument.documentElement.id, "feedHandler",
-        "unsniffable feed should not be sniffed");
-});
-addLoadEvent(SimpleTest.finish);
-
-</script>
-</pre>
-</body>
-</html>
--- a/browser/components/feeds/test/mochitest.ini
+++ b/browser/components/feeds/test/mochitest.ini
@@ -1,20 +1,2 @@
-[DEFAULT]
-prefs =
-  browser.feeds.unsafelyFrameFeeds=true
-
-support-files =
-  bug368464-data.xml
-  bug408328-data.xml
-  bug436801-data.xml
-  bug494328-data.xml
-  valid-feed.xml
-  valid-unsniffable-feed.xml
-
-[test_bug364677.html]
-support-files =
-  bug364677-data.xml
-  bug364677-data.xml^headers^
-[test_bug436801.html]
-[test_bug494328.html]
 [test_registerHandler.html]
 [test_registerHandler_disabled.html]
deleted file mode 100644
--- a/browser/components/feeds/test/test_bug364677.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id=364677
--->
-<head>
-  <title>Test for Bug 364677</title>
-  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
-</head>
-<body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=364677">Mozilla Bug 364677</a>
-<p id="display"><iframe id="testFrame" src="bug364677-data.xml"></iframe></p>
-<div id="content" style="display: none">
-
-</div>
-<pre id="test">
-<script class="testbody" type="text/javascript">
-
-/** Test for Bug 364677 **/
-SimpleTest.waitForExplicitFinish();
-
-addLoadEvent(function() {
-  is(SpecialPowers.wrap($("testFrame")).contentDocument.documentElement.id, "feedHandler",
-     "Feed served as text/xml without a channel/link should have been sniffed");
-});
-addLoadEvent(SimpleTest.finish);
-</script>
-</pre>
-</body>
-</html>
-
deleted file mode 100644
--- a/browser/components/feeds/test/test_bug436801.html
+++ /dev/null
@@ -1,117 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id=436801
--->
-<head>
-  <title>Test feed preview subscribe UI</title>
-  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
-</head>
-<body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=436801">Mozilla Bug 436801</a>
-<p id="display"><iframe id="testFrame" src="bug436801-data.xml"></iframe></p>
-<div id="content" style="display: none">
-</div>
-<pre id="test">
-<script class="testbody" type="text/javascript">
-
-SimpleTest.waitForExplicitFinish();
-
-addLoadEvent(function() {
-  var doc = SpecialPowers.wrap($("testFrame")).contentDocument;
-
-  checkNode(doc.getElementById("feedTitleText"), [
-    "ELEMENT", "h1", [
-      ["TEXT", "Example of a "],
-      ["ELEMENT", "em", [
-        ["TEXT", "special"],
-      ]],
-      ["TEXT", " feed ("],
-      ["ELEMENT", "img", { "src": "baz.png" }],
-      ["TEXT", ")"],
-    ],
-  ]);
-
-  checkNode(doc.getElementById("feedSubtitleText"), [
-    "ELEMENT", "h2", [
-      ["TEXT", "With a "],
-      ["ELEMENT", "em", [
-        ["TEXT", "special"],
-      ]],
-      ["TEXT", " subtitle ("],
-      ["ELEMENT", "img", { "src": "baz.png" }],
-      ["TEXT", ")"],
-    ],
-  ]);
-
-  checkNode(doc.querySelector(".entry").firstChild.firstChild.firstChild, [
-    "ELEMENT", "span", [
-      ["TEXT", "Some "],
-      ["ELEMENT", "abbr", { title: "Extensible Hyper-text Mark-up Language" }, [
-        ["TEXT", "XHTML"],
-      ]],
-      ["TEXT", " examples ("],
-      ["ELEMENT", "img", { "src": "baz.png" }],
-      ["TEXT", ")"],
-    ],
-  ]);
-
-  checkNode(doc.querySelectorAll(".entry")[1].firstChild.firstChild.firstChild, [
-    "ELEMENT", "span", [
-      ["TEXT", "Some "],
-      ["ELEMENT", "abbr", { title: "Hyper-text Mark-up Language" }, [
-        ["TEXT", "HTML"],
-      ]],
-      ["TEXT", " examples ("],
-      ["ELEMENT", "img", { "src": "baz.png" }],
-      ["TEXT", ")"],
-    ],
-  ]);
-});
-
-addLoadEvent(SimpleTest.finish);
-
-function checkNode(node, schema) {
-  var typeName = schema.shift() + "_NODE";
-  var type = Node[typeName];
-  is(node.nodeType, type, "Node should be expected type " + typeName);
-  if (type == Node.TEXT_NODE) {
-    var text = schema.shift();
-    is(node.data, text, "Text should match");
-    return;
-  }
-  // type == Node.ELEMENT_NODE
-  var tag = schema.shift();
-  is(node.localName, tag, "Element should have expected tag");
-  while (schema.length) {
-    let val = schema.shift();
-    if (Array.isArray(val))
-      var childSchema = val;
-    else
-      var attrSchema = val;
-  }
-  if (attrSchema) {
-    var nsTable = {
-      xml: "http://www.w3.org/XML/1998/namespace",
-    };
-    for (var name in attrSchema) {
-      var [ns, nsName] = name.split(":");
-      let val = nsName ? node.getAttributeNS(nsTable[ns], nsName) :
-                node.getAttribute(name);
-      is(val, attrSchema[name], "Attribute " + name + " should match");
-    }
-  }
-  if (childSchema) {
-    var numChildren = node.childNodes.length;
-    is(childSchema.length, numChildren,
-       "Element should have expected number of children");
-    for (var i = 0; i < numChildren; i++)
-      checkNode(node.childNodes[i], childSchema[i]);
-  }
-}
-
-</script>
-</pre>
-</body>
-</html>
deleted file mode 100644
--- a/browser/components/feeds/test/test_bug494328.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id=494328
--->
-<head>
-  <title>Test for bug 494328</title>
-  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
-</head>
-<body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=494328">Mozilla Bug 494328</a>
-<p id="display"><iframe id="testFrame" src="bug494328-data.xml"></iframe></p>
-<div id="content" style="display: none">
-  
-</div>
-<pre id="test">
-<script class="testbody" type="text/javascript">
-
-/** Test for Bug 494328 **/
-SimpleTest.waitForExplicitFinish();
-
-addLoadEvent(function() {
-  var links = SpecialPowers.wrap($("testFrame")).contentDocument.getElementById("feedContent").querySelectorAll("div.enclosure > a");
-  is(links[0].textContent, "Episode 1", "filename decoded incorrectly");
-  is(links[1].textContent, "Episode #2", "filename decoded incorrectly");
-  is(links[2].textContent, "http://www.example.com/podcasts/Episode #3/", "filename decoded incorrectly");
-  is(links[3].textContent, "Is This Episode #4?", "filename decoded incorrectly");
-});
-addLoadEvent(SimpleTest.finish);
-
-</script>
-</pre>
-</body>
-</html>
-
deleted file mode 100644
--- a/browser/components/feeds/test/valid-feed.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<feed xmlns="http://www.w3.org/2005/Atom">
-
-  <title>Example Feed</title>
-  <link href="http://example.org/"/>
-  <updated>2010-08-22T18:30:02Z</updated>
-
-  <author>
-    <name>John Doe</name>
-  </author>
-  <id>urn:uuid:e2df8375-99be-4848-b05e-b9d407555267</id>
-
-  <entry>
-
-    <title>Item</title>
-    <link href="http://example.org/first"/>
-    <id>urn:uuid:9e0f4bed-33d3-4a9d-97ab-ecaa31b3f14a</id>
-    <updated>2010-08-22T18:30:02Z</updated>
-
-    <summary>Some text.</summary>
-  </entry>
-
-</feed>
deleted file mode 100644
--- a/browser/components/feeds/test/valid-unsniffable-feed.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 512 bytes!
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-  -->
-<feed xmlns="http://www.w3.org/2005/Atom">
-
-  <title>Example Feed</title>
-  <link href="http://example.org/"/>
-  <updated>2010-08-22T18:30:02Z</updated>
-
-  <author>
-    <name>John Doe</name>
-  </author>
-  <id>urn:uuid:e2df8375-99be-4848-b05e-b9d407555267</id>
-
-  <entry>
-
-    <title>Item</title>
-    <link href="http://example.org/first"/>
-    <id>urn:uuid:9e0f4bed-33d3-4a9d-97ab-ecaa31b3f14a</id>
-    <updated>2010-08-22T18:30:02Z</updated>
-
-    <summary>Some text.</summary>
-  </entry>
-
-</feed>
--- a/browser/components/nsBrowserGlue.js
+++ b/browser/components/nsBrowserGlue.js
@@ -495,17 +495,16 @@ const listeners = {
     "ContentPrefs:RemoveObserverForName": ["ContentPrefServiceParent"],
     // PLEASE KEEP THIS LIST IN SYNC WITH THE LISTENERS ADDED IN ContentPrefServiceParent.init
 
     // PLEASE KEEP THIS LIST IN SYNC WITH THE LISTENERS ADDED IN AsyncPrefs.init
     "AsyncPrefs:SetPref": ["AsyncPrefs"],
     "AsyncPrefs:ResetPref": ["AsyncPrefs"],
     // PLEASE KEEP THIS LIST IN SYNC WITH THE LISTENERS ADDED IN AsyncPrefs.init
 
-    "FeedConverter:addLiveBookmark": ["Feeds"],
     "webrtc:UpdateGlobalIndicators": ["webrtcUI"],
     "webrtc:UpdatingIndicators": ["webrtcUI"],
   },
 
   mm: {
     "Content:Click": ["ContentClick"],
     "ContentSearch": ["ContentSearch"],
     "FormValidation:ShowPopup": ["FormValidationHandler"],
--- a/browser/components/places/content/bookmarksHistoryTooltip.inc.xul
+++ b/browser/components/places/content/bookmarksHistoryTooltip.inc.xul
@@ -1,8 +1,8 @@
 <!-- Bookmarks and history tooltip -->
 <tooltip id="bhTooltip" noautohide="true"
          onpopupshowing="return window.top.BookmarksEventHandler.fillInBHTooltip(document, event)">
   <vbox id="bhTooltipTextBox" flex="1">
-    <label id="bhtTitleText" class="tooltip-label" />
-    <label id="bhtUrlText" crop="center" class="tooltip-label uri-element" />
+    <description id="bhtTitleText" class="tooltip-label" />
+    <description id="bhtUrlText" crop="center" class="tooltip-label uri-element" />
   </vbox>
 </tooltip>
--- a/browser/components/preferences/applicationManager.js
+++ b/browser/components/preferences/applicationManager.js
@@ -12,19 +12,17 @@ var gAppManagerDialog = {
   },
 
   async init() {
     this.handlerInfo = window.arguments[0];
     Services.scriptloader.loadSubScript("chrome://browser/content/preferences/in-content/main.js",
       window);
 
     const appDescElem = document.getElementById("appDescription");
-    if (this.handlerInfo.type == TYPE_MAYBE_FEED) {
-      document.l10n.setAttributes(appDescElem, "app-manager-handle-webfeeds");
-    } else if (this.handlerInfo.wrappedHandlerInfo instanceof Ci.nsIMIMEInfo) {
+    if (this.handlerInfo.wrappedHandlerInfo instanceof Ci.nsIMIMEInfo) {
       document.l10n.setAttributes(appDescElem, "app-manager-handle-file", {
         type: this.handlerInfo.typeDescription,
       });
     } else {
       document.l10n.setAttributes(appDescElem, "app-manager-handle-protocol", {
         type: this.handlerInfo.typeDescription,
       });
     }
--- a/browser/components/preferences/in-content/main.js
+++ b/browser/components/preferences/in-content/main.js
@@ -20,19 +20,16 @@ ChromeUtils.defineModuleGetter(this, "Cl
   "resource://gre/modules/CloudStorage.jsm");
 
 XPCOMUtils.defineLazyServiceGetters(this, {
   gHandlerService: ["@mozilla.org/uriloader/handler-service;1", "nsIHandlerService"],
   gMIMEService: ["@mozilla.org/mime;1", "nsIMIMEService"],
 });
 
 // Constants & Enumeration Values
-const TYPE_MAYBE_FEED = "application/vnd.mozilla.maybe.feed";
-const TYPE_MAYBE_VIDEO_FEED = "application/vnd.mozilla.maybe.video.feed";
-const TYPE_MAYBE_AUDIO_FEED = "application/vnd.mozilla.maybe.audio.feed";
 const TYPE_PDF = "application/pdf";
 
 const PREF_PDFJS_DISABLED = "pdfjs.disabled";
 const TOPIC_PDFJS_HANDLER_CHANGED = "pdfjs:handlerChanged";
 
 const PREF_DISABLED_PLUGIN_TYPES = "plugin.disable_full_page_plugin_for_types";
 
 // Pref for when containers is being controlled
@@ -41,59 +38,27 @@ const PREF_CONTAINERS_EXTENSION = "priva
 // Preferences that affect which entries to show in the list.
 const PREF_SHOW_PLUGINS_IN_LIST = "browser.download.show_plugins_in_list";
 const PREF_HIDE_PLUGINS_WITHOUT_EXTENSIONS =
   "browser.download.hide_plugins_without_extensions";
 
 // Strings to identify ExtensionSettingsStore overrides
 const CONTAINERS_KEY = "privacy.containers";
 
-/*
- * Preferences where we store handling information about the feed type.
- *
- * browser.feeds.handler
- * - "bookmarks", "reader" (clarified further using the .default preference),
- *   or "ask" -- indicates the default handler being used to process feeds;
- *   "bookmarks" is obsolete; to specify that the handler is bookmarks,
- *   set browser.feeds.handler.default to "bookmarks";
- *
- * browser.feeds.handler.default
- * - "bookmarks" or "client" -- indicates the chosen feed reader used
- *   to display feeds, either transiently (i.e., when the "use as default"
- *   checkbox is unchecked, corresponds to when browser.feeds.handler=="ask")
- *   or more permanently (i.e., the item displayed in the dropdown in Feeds
- *   preferences)
- *
- * browser.feeds.handlers.application
- * - nsIFile, stores the current client-side feed reading app if one has
- *   been chosen
- */
-const PREF_FEED_SELECTED_APP = "browser.feeds.handlers.application";
-const PREF_FEED_SELECTED_ACTION = "browser.feeds.handler";
-const PREF_FEED_SELECTED_READER = "browser.feeds.handler.default";
-
-const PREF_VIDEO_FEED_SELECTED_APP = "browser.videoFeeds.handlers.application";
-const PREF_VIDEO_FEED_SELECTED_ACTION = "browser.videoFeeds.handler";
-const PREF_VIDEO_FEED_SELECTED_READER = "browser.videoFeeds.handler.default";
-
-const PREF_AUDIO_FEED_SELECTED_APP = "browser.audioFeeds.handlers.application";
-const PREF_AUDIO_FEED_SELECTED_ACTION = "browser.audioFeeds.handler";
-const PREF_AUDIO_FEED_SELECTED_READER = "browser.audioFeeds.handler.default";
-
 // The nsHandlerInfoAction enumeration values in nsIHandlerInfo identify
 // the actions the application can take with content of various types.
 // But since nsIHandlerInfo doesn't support plugins, there's no value
 // identifying the "use plugin" action, so we use this constant instead.
 const kActionUsePlugin = 5;
 
 const ICON_URL_APP = AppConstants.platform == "linux" ?
   "moz-icon://dummy.exe?size=16" :
   "chrome://browser/skin/preferences/application.png";
 
-// For CSS. Can be one of "ask", "save", "plugin" or "feed". If absent, the icon URL
+// For CSS. Can be one of "ask", "save" or "plugin". If absent, the icon URL
 // was set by us to a custom handler icon and CSS should not try to override it.
 const APP_ICON_ATTR_NAME = "appHandlerIcon";
 
 ChromeUtils.defineModuleGetter(this, "OS",
   "resource://gre/modules/osfile.jsm");
 
 if (AppConstants.MOZ_DEV_EDITION) {
   ChromeUtils.defineModuleGetter(this, "fxAccounts",
@@ -174,28 +139,16 @@ Preferences.addAll([
   { id: "layout.spellcheckDefault", type: "int" },
 
   { id: "browser.preferences.defaultPerformanceSettings.enabled", type: "bool" },
   { id: "dom.ipc.processCount", type: "int" },
   { id: "dom.ipc.processCount.web", type: "int" },
   { id: "layers.acceleration.disabled", type: "bool", inverted: true },
 
   // Files and Applications
-  { id: "browser.feeds.handler", type: "string" },
-  { id: "browser.feeds.handler.default", type: "string" },
-  { id: "browser.feeds.handlers.application", type: "file" },
-
-  { id: "browser.videoFeeds.handler", type: "string" },
-  { id: "browser.videoFeeds.handler.default", type: "string" },
-  { id: "browser.videoFeeds.handlers.application", type: "file" },
-
-  { id: "browser.audioFeeds.handler", type: "string" },
-  { id: "browser.audioFeeds.handler.default", type: "string" },
-  { id: "browser.audioFeeds.handlers.application", type: "file" },
-
   { id: "pref.downloads.disable_button.edit_actions", type: "bool" },
 
   // DRM content
   { id: "media.eme.enabled", type: "bool" },
 
   // Update
   { id: "browser.preferences.advanced.selectedTabIndex", type: "int" },
   { id: "browser.search.update", type: "bool" },
@@ -544,27 +497,16 @@ var gMainPane = {
     }
 
     // Initilize Application section.
 
     // Observe preferences that influence what we display so we can rebuild
     // the view when they change.
     Services.prefs.addObserver(PREF_SHOW_PLUGINS_IN_LIST, this);
     Services.prefs.addObserver(PREF_HIDE_PLUGINS_WITHOUT_EXTENSIONS, this);
-    Services.prefs.addObserver(PREF_FEED_SELECTED_APP, this);
-    Services.prefs.addObserver(PREF_FEED_SELECTED_ACTION, this);
-    Services.prefs.addObserver(PREF_FEED_SELECTED_READER, this);
-
-    Services.prefs.addObserver(PREF_VIDEO_FEED_SELECTED_APP, this);
-    Services.prefs.addObserver(PREF_VIDEO_FEED_SELECTED_ACTION, this);
-    Services.prefs.addObserver(PREF_VIDEO_FEED_SELECTED_READER, this);
-
-    Services.prefs.addObserver(PREF_AUDIO_FEED_SELECTED_APP, this);
-    Services.prefs.addObserver(PREF_AUDIO_FEED_SELECTED_ACTION, this);
-    Services.prefs.addObserver(PREF_AUDIO_FEED_SELECTED_READER, this);
 
     setEventListener("filter", "command", gMainPane.filter);
     setEventListener("typeColumn", "click", gMainPane.sort);
     setEventListener("actionColumn", "click", gMainPane.sort);
     setEventListener("chooseFolder", "command", gMainPane.chooseFolder);
     setEventListener("saveWhere", "command", gMainPane.handleSaveToCommand);
     Preferences.get("browser.download.folderList").on("change",
       gMainPane.displayDownloadDirPref.bind(gMainPane));
@@ -1328,27 +1270,16 @@ var gMainPane = {
   showUpdates() {
     gSubDialog.open("chrome://mozapps/content/update/history.xul");
   },
 
   destroy() {
     window.removeEventListener("unload", this);
     Services.prefs.removeObserver(PREF_SHOW_PLUGINS_IN_LIST, this);
     Services.prefs.removeObserver(PREF_HIDE_PLUGINS_WITHOUT_EXTENSIONS, this);
-    Services.prefs.removeObserver(PREF_FEED_SELECTED_APP, this);
-    Services.prefs.removeObserver(PREF_FEED_SELECTED_ACTION, this);
-    Services.prefs.removeObserver(PREF_FEED_SELECTED_READER, this);
-
-    Services.prefs.removeObserver(PREF_VIDEO_FEED_SELECTED_APP, this);
-    Services.prefs.removeObserver(PREF_VIDEO_FEED_SELECTED_ACTION, this);
-    Services.prefs.removeObserver(PREF_VIDEO_FEED_SELECTED_READER, this);
-
-    Services.prefs.removeObserver(PREF_AUDIO_FEED_SELECTED_APP, this);
-    Services.prefs.removeObserver(PREF_AUDIO_FEED_SELECTED_ACTION, this);
-    Services.prefs.removeObserver(PREF_AUDIO_FEED_SELECTED_READER, this);
 
     Services.prefs.removeObserver(PREF_CONTAINERS_EXTENSION, this);
   },
 
 
   // nsISupports
 
   QueryInterface: ChromeUtils.generateQI([Ci.nsIObserver]),
@@ -1387,33 +1318,21 @@ var gMainPane = {
       this.destroy();
     }
   },
 
 
   // Composed Model Construction
 
   _loadData() {
-    this._loadFeedHandler();
     this._loadInternalHandlers();
     this._loadPluginHandlers();
     this._loadApplicationHandlers();
   },
 
-  _loadFeedHandler() {
-    this._handledTypes[TYPE_MAYBE_FEED] = feedHandlerInfo;
-    feedHandlerInfo.handledOnlyByPlugin = false;
-
-    this._handledTypes[TYPE_MAYBE_VIDEO_FEED] = videoFeedHandlerInfo;
-    videoFeedHandlerInfo.handledOnlyByPlugin = false;
-
-    this._handledTypes[TYPE_MAYBE_AUDIO_FEED] = audioFeedHandlerInfo;
-    audioFeedHandlerInfo.handledOnlyByPlugin = false;
-  },
-
   /**
    * Load higher level internal handlers so they can be turned on/off in the
    * applications menu.
    */
   _loadInternalHandlers() {
     var internalHandlers = [new PDFHandlerInfoWrapper()];
     for (let internalHandler of internalHandlers) {
       if (internalHandler.enabled) {
@@ -1670,55 +1589,36 @@ var gMainPane = {
       internalMenuItem.setAttribute("tooltiptext", label);
       internalMenuItem.setAttribute(APP_ICON_ATTR_NAME, "ask");
       menuPopup.appendChild(internalMenuItem);
     }
 
     {
       var askMenuItem = document.createXULElement("menuitem");
       askMenuItem.setAttribute("action", Ci.nsIHandlerInfo.alwaysAsk);
-      let label;
-      if (isFeedType(handlerInfo.type))
-        label = gMainPane._prefsBundle.getFormattedString("previewInApp",
-          [this._brandShortName]);
-      else
-        label = gMainPane._prefsBundle.getString("alwaysAsk");
+      let label = gMainPane._prefsBundle.getString("alwaysAsk");
       askMenuItem.setAttribute("label", label);
       askMenuItem.setAttribute("tooltiptext", label);
       askMenuItem.setAttribute(APP_ICON_ATTR_NAME, "ask");
       menuPopup.appendChild(askMenuItem);
     }
 
     // Create a menu item for saving to disk.
     // Note: this option isn't available to protocol types, since we don't know
-    // what it means to save a URL having a certain scheme to disk, nor is it
-    // available to feeds, since the feed code doesn't implement the capability.
-    if ((handlerInfo.wrappedHandlerInfo instanceof Ci.nsIMIMEInfo) &&
-      !isFeedType(handlerInfo.type)) {
+    // what it means to save a URL having a certain scheme to disk.
+    if ((handlerInfo.wrappedHandlerInfo instanceof Ci.nsIMIMEInfo)) {
       var saveMenuItem = document.createXULElement("menuitem");
       saveMenuItem.setAttribute("action", Ci.nsIHandlerInfo.saveToDisk);
       let label = gMainPane._prefsBundle.getString("saveFile");
       saveMenuItem.setAttribute("label", label);
       saveMenuItem.setAttribute("tooltiptext", label);
       saveMenuItem.setAttribute(APP_ICON_ATTR_NAME, "save");
       menuPopup.appendChild(saveMenuItem);
     }
 
-    // If this is the feed type, add a Live Bookmarks item.
-    if (isFeedType(handlerInfo.type)) {
-      internalMenuItem = document.createXULElement("menuitem");
-      internalMenuItem.setAttribute("action", Ci.nsIHandlerInfo.handleInternally);
-      let label = gMainPane._prefsBundle.getFormattedString("addLiveBookmarksInApp",
-        [this._brandShortName]);
-      internalMenuItem.setAttribute("label", label);
-      internalMenuItem.setAttribute("tooltiptext", label);
-      internalMenuItem.setAttribute(APP_ICON_ATTR_NAME, "feed");
-      menuPopup.appendChild(internalMenuItem);
-    }
-
     // Add a separator to distinguish these items from the helper app items
     // that follow them.
     let menuseparator = document.createXULElement("menuseparator");
     menuPopup.appendChild(menuseparator);
 
     // Create a menu item for the OS default application, if any.
     if (handlerInfo.hasDefaultHandler) {
       var defaultMenuItem = document.createXULElement("menuitem");
@@ -1945,20 +1845,21 @@ var gMainPane = {
     this._filter.select();
   },
 
 
   // Changes
 
   // Whether or not we are currently storing the action selected by the user.
   // We use this to suppress notification-triggered updates to the list when
-  // we make changes that may spawn such updates, specifically when we change
-  // the action for the feed type, which results in feed preference updates,
-  // which spawn "pref changed" notifications that would otherwise cause us
-  // to rebuild the view unnecessarily.
+  // we make changes that may spawn such updates.
+  // XXXgijs: this was definitely necessary when we changed feed preferences
+  // from within _storeAction and its calltree. Now, it may still be
+  // necessary, either to avoid calling _rebuildView or to avoid the plugin-
+  // related prefs change code. bug 1499350 has more details.
   _storingAction: false,
 
   onSelectAction(aActionItem) {
     this._storingAction = true;
 
     try {
       this._storeAction(aActionItem);
     } finally {
@@ -2053,24 +1954,17 @@ var gMainPane = {
         }
       }
     };
 
     if (AppConstants.platform == "win") {
       var params = {};
       var handlerInfo = this.selectedHandlerListItem.handlerInfoWrapper;
 
-      if (isFeedType(handlerInfo.type)) {
-        // MIME info will be null, create a temp object.
-        params.mimeInfo = gMIMEService.getFromTypeAndExtension(handlerInfo.type,
-          handlerInfo.primaryExtension);
-      } else {
-        params.mimeInfo = handlerInfo.wrappedHandlerInfo;
-      }
-
+      params.mimeInfo = handlerInfo.wrappedHandlerInfo;
       params.title = gMainPane._prefsBundle.getString("fpTitleChooseApp");
       params.description = handlerInfo.description;
       params.filename = null;
       params.handlerApp = null;
 
       let onAppSelected = () => {
         if (this.isValidHandlerApp(params.handlerApp)) {
           handlerApp = params.handlerApp;
@@ -2449,20 +2343,16 @@ function getLocalHandlerApp(aFile) {
   var localHandlerApp = Cc["@mozilla.org/uriloader/local-handler-app;1"].
     createInstance(Ci.nsILocalHandlerApp);
   localHandlerApp.name = getFileDisplayName(aFile);
   localHandlerApp.executable = aFile;
 
   return localHandlerApp;
 }
 
-function isFeedType(t) {
-  return t == TYPE_MAYBE_FEED || t == TYPE_MAYBE_VIDEO_FEED || t == TYPE_MAYBE_AUDIO_FEED;
-}
-
 // eslint-disable-next-line no-undef
 let gHandlerListItemFragment = MozXULElement.parseXULToFragment(`
   <richlistitem>
     <hbox flex="1" equalsize="always">
       <hbox class="typeContainer" flex="1" align="center">
         <image class="typeIcon" width="16" height="16"
                src="moz-icon://goat?size=16"/>
         <label class="typeDescription" flex="1" crop="end"/>
@@ -2613,22 +2503,18 @@ class HandlerInfoWrapper {
   }
 
   /**
    * Describe, in a human-readable fashion, the preferred action to take on
    * the type represented by the given handler info object.
    */
   get actionDescription() {
     // alwaysAskBeforeHandling overrides the preferred action, so if that flag
-    // is set, then describe that behavior instead.  For most types, this is
-    // the "alwaysAsk" string, but for the feed type we show something special.
+    // is set, then describe that behavior instead.
     if (this.alwaysAskBeforeHandling) {
-      if (isFeedType(this.type))
-        return gMainPane._prefsBundle.getFormattedString("previewInApp",
-          [gMainPane._brandShortName]);
       return gMainPane._prefsBundle.getString("alwaysAsk");
     }
 
     switch (this.preferredAction) {
       case Ci.nsIHandlerInfo.saveToDisk:
         return gMainPane._prefsBundle.getString("saveFile");
 
       case Ci.nsIHandlerInfo.useHelperApp:
@@ -2636,22 +2522,16 @@ class HandlerInfoWrapper {
         var name;
         if (preferredApp instanceof Ci.nsILocalHandlerApp)
           name = getFileDisplayName(preferredApp.executable);
         else
           name = preferredApp.name;
         return gMainPane._prefsBundle.getFormattedString("useApp", [name]);
 
       case Ci.nsIHandlerInfo.handleInternally:
-        // For the feed type, handleInternally means live bookmarks.
-        if (isFeedType(this.type)) {
-          return gMainPane._prefsBundle.getFormattedString("addLiveBookmarksInApp",
-            [gMainPane._brandShortName]);
-        }
-
         if (this instanceof InternalHandlerInfoWrapper) {
           return gMainPane._prefsBundle.getFormattedString("previewInApp",
             [gMainPane._brandShortName]);
         }
 
         // For other types, handleInternally looks like either useHelperApp
         // or useSystemDefault depending on whether or not there's a preferred
         // handler app.
@@ -2683,19 +2563,17 @@ class HandlerInfoWrapper {
       return "ask";
     }
 
     switch (this.preferredAction) {
       case Ci.nsIHandlerInfo.saveToDisk:
         return "save";
 
       case Ci.nsIHandlerInfo.handleInternally:
-        if (isFeedType(this.type)) {
-          return "feed";
-        } else if (this instanceof InternalHandlerInfoWrapper) {
+        if (this instanceof InternalHandlerInfoWrapper) {
           return "ask";
         }
 
       case kActionUsePlugin:
         return "plugin";
     }
 
     return "";
@@ -2940,279 +2818,16 @@ class HandlerInfoWrapper {
 
     // FIXME: consider returning some generic icon when we can't get a URL for
     // one (for example in the case of protocol schemes).  Filed as bug 395141.
     return null;
   }
 }
 
 /**
- * This object implements nsIHandlerInfo for the feed types.  It's a separate
- * object because we currently store handling information for the feed type
- * in a set of preferences rather than the nsIHandlerService-managed datastore.
- *
- * This object inherits from HandlerInfoWrapper in order to get functionality
- * that isn't special to the feed type.
- */
-class FeedHandlerInfo extends HandlerInfoWrapper {
-  constructor(aMIMEType, properties) {
-    super(aMIMEType, null);
-    Object.assign(this, properties);
-  }
-
-  get description() {
-    return gMainPane._prefsBundle.getString(this._appPrefLabel);
-  }
-
-  get preferredApplicationHandler() {
-    switch (Preferences.get(this._prefSelectedReader).value) {
-      case "client":
-        var file = Preferences.get(this._prefSelectedApp).value;
-        if (file)
-          return getLocalHandlerApp(file);
-
-        return null;
-
-      case "bookmarks":
-      default:
-        // When the pref is set to bookmarks, we handle feeds internally,
-        // we don't forward them to a local or web handler app, so there is
-        // no preferred handler.
-        return null;
-    }
-  }
-
-  set preferredApplicationHandler(aNewValue) {
-    if (aNewValue instanceof Ci.nsILocalHandlerApp) {
-      Preferences.get(this._prefSelectedApp).value = aNewValue.executable;
-      Preferences.get(this._prefSelectedReader).value = "client";
-    }
-  }
-
-  get possibleApplicationHandlers() {
-    if (this._possibleApplicationHandlers)
-      return this._possibleApplicationHandlers;
-
-    // A minimal implementation of nsIMutableArray.  It only supports the two
-    // methods its callers invoke, namely appendElement and nsIArray::enumerate.
-    this._possibleApplicationHandlers = {
-      _inner: [],
-      _removed: [],
-
-      QueryInterface: ChromeUtils.generateQI(["nsIMutableArray", "nsIArray"]),
-
-      get length() {
-        return this._inner.length;
-      },
-
-      enumerate() {
-        return this._inner.values();
-      },
-
-      appendElement(aHandlerApp, aWeak) {
-        this._inner.push(aHandlerApp);
-      },
-
-      removeElementAt(aIndex) {
-        this._removed.push(this._inner[aIndex]);
-        this._inner.splice(aIndex, 1);
-      },
-
-      queryElementAt(aIndex, aInterface) {
-        return this._inner[aIndex].QueryInterface(aInterface);
-      },
-    };
-
-    // Add the selected local app if it's different from the OS default handler.
-    // Unlike for other types, we can store only one local app at a time for the
-    // feed type, since we store it in a preference that historically stores
-    // only a single path.  But we display all the local apps the user chooses
-    // while the prefpane is open, only dropping the list when the user closes
-    // the prefpane, for maximum usability and consistency with other types.
-    var preferredAppFile = Preferences.get(this._prefSelectedApp).value;
-    if (preferredAppFile) {
-      let preferredApp = getLocalHandlerApp(preferredAppFile);
-      let defaultApp = this._defaultApplicationHandler;
-      if (!defaultApp || !defaultApp.equals(preferredApp))
-        this._possibleApplicationHandlers.appendElement(preferredApp);
-    }
-
-    return this._possibleApplicationHandlers;
-  }
-
-  get _defaultApplicationHandler() {
-    if (typeof this.__defaultApplicationHandler != "undefined")
-      return this.__defaultApplicationHandler;
-
-    var defaultFeedReader = null;
-    if (AppConstants.HAVE_SHELL_SERVICE) {
-      try {
-        defaultFeedReader = getShellService().defaultFeedReader;
-      } catch (ex) {
-        // no default reader or getShellService() is null
-      }
-    }
-
-    if (defaultFeedReader) {
-      let handlerApp = Cc["@mozilla.org/uriloader/local-handler-app;1"].
-        createInstance(Ci.nsIHandlerApp);
-      handlerApp.name = getFileDisplayName(defaultFeedReader);
-      handlerApp.QueryInterface(Ci.nsILocalHandlerApp);
-      handlerApp.executable = defaultFeedReader;
-
-      this.__defaultApplicationHandler = handlerApp;
-    } else {
-      this.__defaultApplicationHandler = null;
-    }
-
-    return this.__defaultApplicationHandler;
-  }
-
-  get hasDefaultHandler() {
-    if (AppConstants.HAVE_SHELL_SERVICE) {
-      try {
-        if (getShellService().defaultFeedReader)
-          return true;
-      } catch (ex) {
-        // no default reader or getShellService() is null
-      }
-    }
-
-    return false;
-  }
-
-  get defaultDescription() {
-    if (this.hasDefaultHandler)
-      return this._defaultApplicationHandler.name;
-
-    // Should we instead return null?
-    return "";
-  }
-
-  // What to do with content of this type.
-  get preferredAction() {
-    switch (Preferences.get(this._prefSelectedAction).value) {
-
-      case "bookmarks":
-        return Ci.nsIHandlerInfo.handleInternally;
-
-      case "reader": {
-        let preferredApp = this.preferredApplicationHandler;
-        let defaultApp = this._defaultApplicationHandler;
-
-        // If we have a valid preferred app, return useSystemDefault if it's
-        // the default app; otherwise return useHelperApp.
-        if (gMainPane.isValidHandlerApp(preferredApp)) {
-          if (defaultApp && defaultApp.equals(preferredApp))
-            return Ci.nsIHandlerInfo.useSystemDefault;
-
-          return Ci.nsIHandlerInfo.useHelperApp;
-        }
-
-        // The pref is set to "reader", but we don't have a valid preferred app.
-        // What do we do now?  Not sure this is the best option (perhaps we
-        // should direct the user to the default app, if any), but for now let's
-        // direct the user to live bookmarks.
-        return Ci.nsIHandlerInfo.handleInternally;
-      }
-
-      // If the action is "ask", then alwaysAskBeforeHandling will override
-      // the action, so it doesn't matter what we say it is, it just has to be
-      // something that doesn't cause the controller to hide the type.
-      case "ask":
-      default:
-        return Ci.nsIHandlerInfo.handleInternally;
-    }
-  }
-
-  set preferredAction(aNewValue) {
-    switch (aNewValue) {
-
-      case Ci.nsIHandlerInfo.handleInternally:
-        Preferences.get(this._prefSelectedReader).value = "bookmarks";
-        break;
-
-      case Ci.nsIHandlerInfo.useHelperApp:
-        Preferences.get(this._prefSelectedAction).value = "reader";
-        // The controller has already set preferredApplicationHandler
-        // to the new helper app.
-        break;
-
-      case Ci.nsIHandlerInfo.useSystemDefault:
-        Preferences.get(this._prefSelectedAction).value = "reader";
-        this.preferredApplicationHandler = this._defaultApplicationHandler;
-        break;
-    }
-  }
-
-  get alwaysAskBeforeHandling() {
-    return Preferences.get(this._prefSelectedAction).value == "ask";
-  }
-
-  set alwaysAskBeforeHandling(aNewValue) {
-    if (aNewValue)
-      Preferences.get(this._prefSelectedAction).value = "ask";
-    else
-      Preferences.get(this._prefSelectedAction).value = "reader";
-  }
-
-  get primaryExtension() {
-    return "xml";
-  }
-
-  // Changes to the preferred action and handler take effect immediately
-  // (we write them out to the preferences right as they happen),
-  // so we when the controller calls store() after modifying the handlers,
-  // the only thing we need to store is the removal of possible handlers
-  // XXX Should we hold off on making the changes until this method gets called?
-  store() {
-    for (let app of this._possibleApplicationHandlers._removed) {
-      if (app instanceof Ci.nsILocalHandlerApp) {
-        let pref = Preferences.get(PREF_FEED_SELECTED_APP);
-        var preferredAppFile = pref.value;
-        if (preferredAppFile) {
-          let preferredApp = getLocalHandlerApp(preferredAppFile);
-          if (app.equals(preferredApp))
-            pref.reset();
-        }
-      }
-    }
-    this._possibleApplicationHandlers._removed = [];
-  }
-
-  get smallIcon() {
-    return this._smallIcon;
-  }
-}
-
-var feedHandlerInfo = new FeedHandlerInfo(TYPE_MAYBE_FEED, {
-  _prefSelectedApp: PREF_FEED_SELECTED_APP,
-  _prefSelectedAction: PREF_FEED_SELECTED_ACTION,
-  _prefSelectedReader: PREF_FEED_SELECTED_READER,
-  _smallIcon: "chrome://browser/skin/feeds/feedIcon16.png",
-  _appPrefLabel: "webFeed",
-});
-
-var videoFeedHandlerInfo = new FeedHandlerInfo(TYPE_MAYBE_VIDEO_FEED, {
-  _prefSelectedApp: PREF_VIDEO_FEED_SELECTED_APP,
-  _prefSelectedAction: PREF_VIDEO_FEED_SELECTED_ACTION,
-  _prefSelectedReader: PREF_VIDEO_FEED_SELECTED_READER,
-  _smallIcon: "chrome://browser/skin/feeds/videoFeedIcon16.png",
-  _appPrefLabel: "videoPodcastFeed",
-});
-
-var audioFeedHandlerInfo = new FeedHandlerInfo(TYPE_MAYBE_AUDIO_FEED, {
-  _prefSelectedApp: PREF_AUDIO_FEED_SELECTED_APP,
-  _prefSelectedAction: PREF_AUDIO_FEED_SELECTED_ACTION,
-  _prefSelectedReader: PREF_AUDIO_FEED_SELECTED_READER,
-  _smallIcon: "chrome://browser/skin/feeds/audioFeedIcon16.png",
-  _appPrefLabel: "audioPodcastFeed",
-});
-
-/**
  * InternalHandlerInfoWrapper provides a basic mechanism to create an internal
  * mime type handler that can be enabled/disabled in the applications preference
  * menu.
  */
 class InternalHandlerInfoWrapper extends HandlerInfoWrapper {
   constructor(mimeType) {
     super(mimeType, gMIMEService.getFromTypeAndExtension(mimeType, null));
   }
--- a/browser/components/shell/nsGNOMEShellService.cpp
+++ b/browser/components/shell/nsGNOMEShellService.cpp
@@ -679,14 +679,8 @@ nsGNOMEShellService::OpenApplicationWith
   rv = process->Init(aApplication);
   if (NS_FAILED(rv))
     return rv;
 
   const nsCString spec(aURI);
   const char* specStr = spec.get();
   return process->Run(false, &specStr, 1);
 }
-
-NS_IMETHODIMP
-nsGNOMEShellService::GetDefaultFeedReader(nsIFile** _retval)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
--- a/browser/components/shell/nsIShellService.idl
+++ b/browser/components/shell/nsIShellService.idl
@@ -87,14 +87,9 @@ interface nsIShellService : nsISupports
   /**
    * Opens an application with a specific URI to load.
    * @param   application
    *          The application file (or bundle directory, on OS X)
    * @param   uri
    *          The uri to be loaded by the application
    */
   void openApplicationWithURI(in nsIFile aApplication, in ACString aURI);
-
-  /**
-   * The default system handler for web feeds
-   */
-  readonly attribute nsIFile defaultFeedReader;
 };
--- a/browser/components/shell/nsMacShellService.cpp
+++ b/browser/components/shell/nsMacShellService.cpp
@@ -378,47 +378,8 @@ nsMacShellService::OpenApplicationWithUR
 
   OSErr err = ::LSOpenFromURLSpec(&launchSpec, nullptr);
 
   ::CFRelease(uris);
   ::CFRelease(uri);
 
   return err != noErr ? NS_ERROR_FAILURE : NS_OK;
 }
-
-NS_IMETHODIMP
-nsMacShellService::GetDefaultFeedReader(nsIFile** _retval)
-{
-  nsresult rv = NS_ERROR_FAILURE;
-  *_retval = nullptr;
-
-  CFStringRef defaultHandlerID = ::LSCopyDefaultHandlerForURLScheme(CFSTR("feed"));
-  if (!defaultHandlerID) {
-    defaultHandlerID = ::CFStringCreateWithCString(kCFAllocatorDefault,
-                                                   SAFARI_BUNDLE_IDENTIFIER,
-                                                   kCFStringEncodingASCII);
-  }
-
-  CFURLRef defaultHandlerURL = nullptr;
-  OSStatus status = ::LSFindApplicationForInfo(kLSUnknownCreator,
-                                               defaultHandlerID,
-                                               nullptr, // inName
-                                               nullptr, // outAppRef
-                                               &defaultHandlerURL);
-
-  if (status == noErr && defaultHandlerURL) {
-    nsCOMPtr<nsILocalFileMac> defaultReader =
-      do_CreateInstance("@mozilla.org/file/local;1", &rv);
-    if (NS_SUCCEEDED(rv)) {
-      rv = defaultReader->InitWithCFURL(defaultHandlerURL);
-      if (NS_SUCCEEDED(rv)) {
-        NS_ADDREF(*_retval = defaultReader);
-        rv = NS_OK;
-      }
-    }
-
-    ::CFRelease(defaultHandlerURL);
-  }
-
-  ::CFRelease(defaultHandlerID);
-
-  return rv;
-}
--- a/browser/components/shell/nsWindowsShellService.cpp
+++ b/browser/components/shell/nsWindowsShellService.cpp
@@ -755,55 +755,8 @@ nsWindowsShellService::OpenApplicationWi
   rv = process->Init(aApplication);
   if (NS_FAILED(rv))
     return rv;
 
   const nsCString spec(aURI);
   const char* specStr = spec.get();
   return process->Run(false, &specStr, 1);
 }
-
-NS_IMETHODIMP
-nsWindowsShellService::GetDefaultFeedReader(nsIFile** _retval)
-{
-  *_retval = nullptr;
-
-  nsresult rv;
-  nsCOMPtr<nsIWindowsRegKey> regKey =
-    do_CreateInstance("@mozilla.org/windows-registry-key;1", &rv);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  rv = regKey->Open(nsIWindowsRegKey::ROOT_KEY_CLASSES_ROOT,
-                    NS_LITERAL_STRING("feed\\shell\\open\\command"),
-                    nsIWindowsRegKey::ACCESS_READ);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  nsAutoString path;
-  rv = regKey->ReadStringValue(EmptyString(), path);
-  NS_ENSURE_SUCCESS(rv, rv);
-  if (path.IsEmpty())
-    return NS_ERROR_FAILURE;
-
-  if (path.First() == '"') {
-    // Everything inside the quotes
-    path = Substring(path, 1, path.FindChar('"', 1) - 1);
-  }
-  else {
-    // Everything up to the first space
-    path = Substring(path, 0, path.FindChar(' '));
-  }
-
-  nsCOMPtr<nsIFile> defaultReader =
-    do_CreateInstance("@mozilla.org/file/local;1", &rv);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  rv = defaultReader->InitWithPath(path);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  bool exists;
-  rv = defaultReader->Exists(&exists);
-  NS_ENSURE_SUCCESS(rv, rv);
-  if (!exists)
-    return NS_ERROR_FAILURE;
-
-  NS_ADDREF(*_retval = defaultReader);
-  return NS_OK;
-}
--- a/browser/components/uitour/test/browser_UITour_defaultBrowser.js
+++ b/browser/components/uitour/test/browser_UITour_defaultBrowser.js
@@ -23,17 +23,16 @@ MockShellService.prototype = {
   BACKGROUND_FILL: 4,
   BACKGROUND_FIT: 5,
   setDesktopBackground(aElement, aPosition) {},
   APPLICATION_MAIL: 0,
   APPLICATION_NEWS: 1,
   openApplication(aApplication) {},
   desktopBackgroundColor: 0,
   openApplicationWithURI(aApplication, aURI) {},
-  defaultFeedReader: 0,
 };
 
 var mockShellService = new MockObjectRegisterer("@mozilla.org/browser/shell-service;1",
                                                 MockShellService);
 
 // Temporarily disabled, see note at test_setDefaultBrowser.
 // mockShellService.register();
 
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -171,18 +171,16 @@
 @RESPATH@/components/WellKnownOpportunisticUtils.js
 @RESPATH@/components/WellKnownOpportunisticUtils.manifest
 #ifndef XP_MACOSX
 ; OSX uses native platform impl.  Windows, Linux, and Android uses fallback JS impl.
 @BINPATH@/components/nsDNSServiceDiscovery.manifest
 @BINPATH@/components/nsDNSServiceDiscovery.js
 #endif
 @RESPATH@/browser/components/BrowserFeeds.manifest
-@RESPATH@/browser/components/FeedConverter.js
-@RESPATH@/browser/components/FeedWriter.js
 @RESPATH@/browser/components/WebContentConverter.js
 @RESPATH@/browser/components/BrowserComponents.manifest
 @RESPATH@/browser/components/nsBrowserContentHandler.js
 @RESPATH@/browser/components/nsBrowserGlue.js
 @RESPATH@/browser/components/devtools-startup.manifest
 @RESPATH@/browser/components/devtools-startup.js
 @RESPATH@/browser/components/aboutdebugging-registration.js
 @RESPATH@/browser/components/aboutdebugging.manifest
--- a/browser/locales/en-US/browser/preferences/applicationManager.ftl
+++ b/browser/locales/en-US/browser/preferences/applicationManager.ftl
@@ -5,18 +5,16 @@
 app-manager-window =
     .title = Application details
     .style = width: 30em; min-height: 20em;
 
 app-manager-remove =
     .label = Remove
     .accesskey = R
 
-app-manager-handle-webfeeds = The following applications can be used to handle Web Feeds.
-
 # Variables:
 #   $type (String) - the URI scheme of the link (e.g. mailto:)
 app-manager-handle-protocol = The following applications can be used to handle { $type } links.
 
 # Variables:
 #   $type (String) - the MIME type (e.g. application/binary)
 app-manager-handle-file = The following applications can be used to handle { $type } content.
 
--- a/browser/locales/en-US/chrome/browser/browser.dtd
+++ b/browser/locales/en-US/chrome/browser/browser.dtd
@@ -964,43 +964,58 @@ you can use these alternative items. Oth
 
 <!ENTITY contentBlocking.fastBlock.label "Slow-Loading Trackers">
 <!-- LOCALIZATION NOTE (contentBlocking.fastBlock.blocked.label):
      This label signals that this type of content blocking is turned
      ON and is successfully blocking malicious/slow content, so this is
      a positive thing. It forms the end of the (imaginary) sentence
      "Slow-Loading Trackers [are] Blocked"-->
 <!ENTITY contentBlocking.fastBlock.blocked.label "Blocked">
+<!-- LOCALIZATION NOTE (contentBlocking.fastBlock.blocking.label):
+     This label signals that this type of content blocking is turned
+     ON, so this is a positive thing. It forms the verb in (imaginary) sentence
+     "Firefox is blocking Slow-Loading Trackers"-->
+<!ENTITY contentBlocking.fastBlock.blocking.label "Blocking">
 <!-- LOCALIZATION NOTE (contentBlocking.fastBlock.add.label):
      This is displayed as a link to preferences, where the user can add
      this specific type of content blocking. When this text is shown
      the type of content blocking is currently not enabled. -->
 <!ENTITY contentBlocking.fastBlock.add.label "Add Blocking…">
 
 <!ENTITY contentBlocking.trackingProtection2.label "All Detected Trackers">
 <!ENTITY contentBlocking.trackingProtection3.label "Trackers">
 <!-- LOCALIZATION NOTE (contentBlocking.trackingProtection.blocked.label):
      This label signals that this type of content blocking is turned
      ON and is successfully blocking tracker content, so this is
      a positive thing. It forms the end of the (imaginary) sentence
      "Trackers [are] Blocked"-->
 <!ENTITY contentBlocking.trackingProtection.blocked.label "Blocked">
+<!-- LOCALIZATION NOTE (contentBlocking.tranckingProtection.blocking.label):
+     This label signals that this type of content blocking is turned
+     ON, so this is a positive thing. It forms the verb in the (imaginary) sentence
+     "Firefox is blocking Trackers"-->
+<!ENTITY contentBlocking.trackingProtection.blocking.label "Blocking">
 <!-- LOCALIZATION NOTE (contentBlocking.trackingProtection.add.label):
      This is displayed as a link to preferences, where the user can add
      this specific type of content blocking. When this text is shown
      the type of content blocking is currently not enabled. -->
 <!ENTITY contentBlocking.trackingProtection.add.label "Add Blocking…">
 
 <!ENTITY contentBlocking.3rdPartyCookies.label "Third-Party Cookies">
 <!-- LOCALIZATION NOTE (contentBlocking.3rdPartyCookies.blocked.label):
      This label signals that this type of content blocking is turned
      ON and is successfully blocking third-party cookies, so this is
      a positive thing. It forms the end of the (imaginary) sentence
      "Third-Party Cookies [are] Blocked"-->
 <!ENTITY contentBlocking.3rdPartyCookies.blocked.label "Blocked">
+<!-- LOCALIZATION NOTE (contentBlocking.tranckingProtection.blocking.label):
+     This label signals that this type of content blocking is turned
+     ON, so this is a positive thing. It forms the verb in the (imaginary) sentence
+     "Firefox is blocking Third-Party Cookies"-->
+<!ENTITY contentBlocking.3rdPartyCookies.blocking.label "Blocking">
 <!-- LOCALIZATION NOTE (contentBlocking.3rdPartyCookies.add.label):
      This is displayed as a link to preferences, where the user can add
      this specific type of content blocking. When this text is shown
      the type of content blocking is currently not enabled. -->
 <!ENTITY contentBlocking.3rdPartyCookies.add.label "Add Blocking…">
 
 <!ENTITY contentBlocking.openBreakageReportView2.label "Report a problem">
 <!ENTITY contentBlocking.breakageReportView.label "Report Problems">
deleted file mode 100644
--- a/browser/locales/en-US/chrome/browser/feeds/subscribe.dtd
+++ /dev/null
@@ -1,10 +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 feedPage.title
-  "Viewing Feed">
-<!ENTITY feedSubscribeNow
-  "Subscribe Now">
-<!ENTITY feedLiveBookmarks
-  "Live Bookmarks">
--- a/browser/locales/en-US/chrome/browser/feeds/subscribe.properties
+++ b/browser/locales/en-US/chrome/browser/feeds/subscribe.properties
@@ -1,53 +1,10 @@
 # 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/.
 
-linkTitleTextFormat=Go to %S
-addHandler=Add “%S” (%S) as a Feed Reader?
-addHandlerAddButton=Add Feed Reader
-addHandlerAddButtonAccesskey=A
-handlerRegistered=“%S” is already registered as a Feed Reader
-liveBookmarks=Live Bookmarks
-subscribeNow=Subscribe Now
-chooseApplicationMenuItem=Choose Application…
-chooseApplicationDialogTitle=Choose Application
-alwaysUse=Always use %S to subscribe to feeds
-mediaLabel=Media files
-
-# LOCALIZATION NOTE: The next string is for the size of the enclosed media.
-#   e.g. enclosureSizeText : "50.23 MB"
-#   %1$S = size (in bytes or megabytes, ...)
-#   %2$S = unit of measure (bytes, KB, MB, ...)
-enclosureSizeText=%1$S %2$S
-
-bytes=bytes
-kilobyte=KB
-megabyte=MB
-gigabyte=GB
-
-# LOCALIZATION NOTE: The next three strings explains to the user what they're
-# doing.
-#   e.g. alwaysUseForVideoPodcasts : "Always use Miro to subscribe to video podcasts."
-#   %S = application to use (Miro, iTunes, ...)
-alwaysUseForFeeds=Always use %S to subscribe to feeds.
-alwaysUseForAudioPodcasts=Always use %S to subscribe to podcasts.
-alwaysUseForVideoPodcasts=Always use %S to subscribe to video podcasts.
-
-subscribeFeedUsing=Subscribe to this feed using 
-subscribeAudioPodcastUsing=Subscribe to this podcast using 
-subscribeVideoPodcastUsing=Subscribe to this video podcast using 
-
-feedSubscriptionFeed1=This is a “feed” of frequently changing content on this site.
-feedSubscriptionAudioPodcast1=This is a “podcast” of frequently changing content on this site.
-feedSubscriptionVideoPodcast1=This is a “video podcast” of frequently changing content on this site.
-
-feedSubscriptionFeed2=You can subscribe to this feed to receive updates when this content changes.
-feedSubscriptionAudioPodcast2=You can subscribe to this podcast to receive updates when this content changes.
-feedSubscriptionVideoPodcast2=You can subscribe to this video podcast to receive updates when this content changes.
-
 # LOCALIZATION NOTE (addProtocolHandlerMessage):
 # Message displayed when adding a protocol handler:
 # %1$S is the application's domain, %2$S is the type of protocol
 addProtocolHandlerMessage=Add “%1$S” as an application for %2$S links?
 addProtocolHandlerAddButton=Add Application
 addProtocolHandlerAddButtonAccesskey=A
--- a/browser/locales/filter.py
+++ b/browser/locales/filter.py
@@ -28,14 +28,13 @@ def test(mod, path, entity=None):
         # l10n ships en-US dictionary or something, do compare
         return "error"
     if path == "defines.inc":
         return "ignore" if entity == "MOZ_LANGPACK_CONTRIBUTORS" else "error"
 
     if mod == "browser" and path == "chrome/browser-region/region.properties":
         # only region.properties exceptions remain, compare all others
         return ("ignore"
-                if (re.match(r"browser\.search\.order\.[1-9]", entity) or
-                    re.match(r"browser\.contentHandlers\.types\.[0-5]", entity) or
+                if (re.match(r"browser\.contentHandlers\.types\.[0-5]", entity) or
                     re.match(r"gecko\.handlerService\.schemes\.", entity) or
                     re.match(r"gecko\.handlerService\.defaultHandlersVersion", entity))
                 else "error")
     return "error"
--- a/browser/locales/jar.mn
+++ b/browser/locales/jar.mn
@@ -45,17 +45,16 @@
     locale/browser/downloads/downloads.properties  (%chrome/browser/downloads/downloads.properties)
     locale/browser/places/places.dtd               (%chrome/browser/places/places.dtd)
     locale/browser/places/places.properties        (%chrome/browser/places/places.properties)
     locale/browser/places/editBookmarkOverlay.dtd  (%chrome/browser/places/editBookmarkOverlay.dtd)
     locale/browser/places/bookmarkProperties.properties (%chrome/browser/places/bookmarkProperties.properties)
     locale/browser/safebrowsing/phishing-afterload-warning-message.dtd (%chrome/browser/safebrowsing/phishing-afterload-warning-message.dtd)
     locale/browser/safebrowsing/report-phishing.dtd                    (%chrome/browser/safebrowsing/report-phishing.dtd)
     locale/browser/safebrowsing/safebrowsing.properties   (%chrome/browser/safebrowsing/safebrowsing.properties)
-    locale/browser/feeds/subscribe.dtd              (%chrome/browser/feeds/subscribe.dtd)
     locale/browser/feeds/subscribe.properties       (%chrome/browser/feeds/subscribe.properties)
     locale/browser/migration/migration.dtd         (%chrome/browser/migration/migration.dtd)
     locale/browser/migration/migration.properties  (%chrome/browser/migration/migration.properties)
     locale/browser/preferences/preferences.properties     (%chrome/browser/preferences/preferences.properties)
     locale/browser/preferences/security.dtd           (%chrome/browser/preferences/security.dtd)
     locale/browser/syncBrand.dtd                (%chrome/browser/syncBrand.dtd)
     locale/browser/syncSetup.properties         (%chrome/browser/syncSetup.properties)
 % locale browser-region @AB_CD@ %locale/browser-region/
--- a/browser/locales/l10n.toml
+++ b/browser/locales/l10n.toml
@@ -174,14 +174,13 @@ locales = [
         "{l}browser/defines.inc",
         "{l}browser/firefox-l10n.js",
     ]
     action = "ignore"
 
 [[filters]]
     path = "{l}browser/chrome/browser-region/region.properties"
     key = [
-        "re:^browser\\.search\\.order\\.[1-9]$",
         "re:^browser\\.contentHandlers\\.types\\.[0-5]\\..*$",
         "re:^gecko\\.handlerService\\.schemes\\..*$",
         "re:^gecko\\.handlerService\\.defaultHandlersVersion$"
     ]
     action = "ignore"
deleted file mode 100644
index 22f181884cb2461cc21d42e412e54892cd46ee25..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index a683ec79bdc3f564a4f1ad2093a582901264c848..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/browser/themes/linux/feeds/subscribe.css
+++ /dev/null
@@ -1,185 +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/. */
-
-html {
-  background: -moz-Dialog;
-  font: 3mm tahoma,arial,helvetica,sans-serif;
-}
-
-#subscribeUsingDescription,
-#subscribeButton {
-  display: block;
-}
-
-#subscribeUsingDescription {
-  margin-bottom: 0.5em;
-}
-
-#subscribeButton {
-  margin-top: 0.5em;
-  margin-inline-start: auto;
-}
-
-#feedBody {
-  border: 1px solid THreeDShadow;
-  padding: 3em;
-  padding-inline-start: 30px;
-  margin: 2em auto;
-  background: -moz-Field;
-}
-
-#feedHeaderContainer {
-  border: 1px solid ThreeDShadow;
-  border-radius: 10px;
-  margin: -4em auto 0 auto;
-  background-color: InfoBackground;
-  -moz-appearance: -moz-gtk-info-bar;
-  display: flex;
-}
-
-#feedHeaderContainerSpacer {
-  flex-grow: 1;
-}
-
-#feedHeader {
-  margin-top: 4.9em;
-  margin-bottom: 1em;
-  margin-inline-start: 1.4em;
-  margin-inline-end: 1em;
-  padding-inline-start: 2.9em;
-  font-size: 110%;
-  color: -moz-gtk-info-bar-text;
-}
-
-.feedBackground {
-  background: url("chrome://browser/skin/feeds/feedIcon.png") 0% 10% no-repeat;
-}
-
-.videoPodcastBackground {
-  background: url("chrome://browser/skin/feeds/videoFeedIcon.png") 0% 10% no-repeat;
-}
-
-.audioPodcastBackground {
-  background: url("chrome://browser/skin/feeds/audioFeedIcon.png") 0% 10% no-repeat;
-}
-
-#feedHeader[dir="rtl"] {
-  background-position: 100% 10%;
-}
-
-#feedIntroText {
-  display: none;
-}
-
-#feedHeader[firstrun="true"] #feedIntroText {
-  padding-top: 0.1em;
-  padding-inline-start: 0.6em;
-  display: block;
-}
-
-#feedHeader[firstrun="true"] > #feedSubscribeLine {
-  padding-inline-start: 1.8em;
-}
-
-#feedSubscribeLine {
-  padding-top: 0.2em;
-  padding-inline-start: 0.5em;
-}
-
-/* Don't print subscription UI */
-@media print {
-  #feedHeaderContainer {
-    display: none;
-  }
-}
-
-body {
-  margin: 0;
-  padding: 0 3em;
-  color: -moz-fieldText;
-  font: message-box;
-}
-
-h1 {
-  font-size: 160%;
-  border-bottom: 2px solid ThreeDLightShadow;
-  margin: 0 0 .2em 0;
-}
-
-h2 {
-  color: GrayText;
-  font-size: 110%;
-  font-weight: normal;
-  margin: 0 0 .6em 0;
-}
-
-#feedTitleLink {
-  float: right;
-  margin-inline-start: .6em;
-  margin-inline-end: 0;
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-a[href] img {
-  border: none;
-}
-
-#feedTitleContainer {
-  margin-inline-start: 0;
-  margin-inline-end: .6em;
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-#feedTitleImage {
-  margin-inline-start: .6em;
-  margin-inline-end: 0;
-  margin-top: 0;
-  margin-bottom: 0;
-  max-width: 300px;
-  max-height: 150px;
-}
-
-.feedEntryContent {
-  font-size: 110%;
-}
- 
-.link {
-  color: #0000FF;
-  text-decoration: underline;
-  cursor: pointer;
-}
-
-.link:hover:active {
-  color: #FF0000;
-}
-
-.lastUpdated {
-  font-size: 85%;
-  font-weight: normal;
-}
-
-.type-icon {
-  vertical-align: bottom;
-  height: 16px;
-  width: 16px;
-}
-
-.enclosures {
-  border: 1px solid THreeDShadow;
-  padding: 1em;
-  margin: 1em auto;
-  background: -moz-Dialog;
-}
-
-.enclosure {
-  vertical-align: middle;
-  margin-left: 2px;
-}
-
-.handlersMenuList > .menulist-label-box > .menulist-icon {
-  max-width: 16px;
-  max-height: 16px;
-}
--- a/browser/themes/linux/jar.mn
+++ b/browser/themes/linux/jar.mn
@@ -8,28 +8,24 @@ browser.jar:
   skin/classic/browser/sanitizeDialog.css
 * skin/classic/browser/syncedtabs/sidebar.css     (syncedtabs/sidebar.css)
 * skin/classic/browser/browser.css
 * skin/classic/browser/compacttheme.css
   skin/classic/browser/monitor.png
   skin/classic/browser/monitor_16-10.png
 * skin/classic/browser/pageInfo.css
   skin/classic/browser/pageInfo.png
-  skin/classic/browser/page-livemarks.png
 * skin/classic/browser/searchbar.css
   skin/classic/browser/setDesktopBackground.css
   skin/classic/browser/slowStartup-16.png
   skin/classic/browser/webRTC-indicator.css  (../shared/webRTC-indicator.css)
 * skin/classic/browser/controlcenter/panel.css        (controlcenter/panel.css)
 * skin/classic/browser/customizableui/panelUI.css (customizableui/panelUI.css)
 * skin/classic/browser/downloads/allDownloadsView.css   (downloads/allDownloadsView.css)
 * skin/classic/browser/downloads/downloads.css        (downloads/downloads.css)
-  skin/classic/browser/feeds/feedIcon.png             (feeds/feedIcon.png)
-  skin/classic/browser/feeds/feedIcon16.png           (feeds/feedIcon16.png)
-  skin/classic/browser/feeds/subscribe.css            (feeds/subscribe.css)
   skin/classic/browser/notification-icons/geo-blocked.svg  (notification-icons/geo-blocked.svg)
   skin/classic/browser/notification-icons/geo-detailed.svg (notification-icons/geo-detailed.svg)
   skin/classic/browser/notification-icons/geo.svg          (notification-icons/geo.svg)
   skin/classic/browser/places/allBookmarks.png        (places/allBookmarks.png)
   skin/classic/browser/places/editBookmark.css        (places/editBookmark.css)
   skin/classic/browser/places/livemark-item.png       (places/livemark-item.png)
 * skin/classic/browser/places/sidebar.css             (places/sidebar.css)
   skin/classic/browser/places/organizer.css           (places/organizer.css)
@@ -41,13 +37,8 @@ browser.jar:
 * skin/classic/browser/preferences/in-content/dialog.css      (preferences/in-content/dialog.css)
   skin/classic/browser/preferences/applications.css   (preferences/applications.css)
   skin/classic/browser/tabbrowser/tabDragIndicator.png      (tabbrowser/tabDragIndicator.png)
   skin/classic/browser/window-controls/close.svg                 (window-controls/close.svg)
   skin/classic/browser/window-controls/minimize.svg              (window-controls/minimize.svg)
   skin/classic/browser/window-controls/restore.svg               (window-controls/restore.svg)
 
   skin/classic/browser/e10s-64@2x.png (../shared/e10s-64@2x.png)
-
-% override chrome://browser/skin/feeds/audioFeedIcon.png              chrome://browser/skin/feeds/feedIcon.png
-% override chrome://browser/skin/feeds/audioFeedIcon16.png            chrome://browser/skin/feeds/feedIcon16.png
-% override chrome://browser/skin/feeds/videoFeedIcon.png              chrome://browser/skin/feeds/feedIcon.png
-% override chrome://browser/skin/feeds/videoFeedIcon16.png            chrome://browser/skin/feeds/feedIcon16.png
deleted file mode 100644
index 9a40b5e376ab2983eaa9f34f2a2d54b909cc4c2e..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/themes/linux/pageInfo.css
+++ b/browser/themes/linux/pageInfo.css
@@ -35,20 +35,16 @@
 #generalTab {
   -moz-image-region: rect(0px, 32px, 32px, 0px)
 }
 
 #mediaTab {
   -moz-image-region: rect(0px, 64px, 32px, 32px)
 }
 
-#feedTab {
-  -moz-image-region: rect(0px, 96px, 32px, 64px)
-}
-
 #permTab {
   -moz-image-region: rect(0px, 128px, 32px, 96px)
 }
 
 #securityTab {
   -moz-image-region: rect(0px, 160px, 32px, 128px)
 }
 
@@ -131,49 +127,16 @@ textbox[disabled] {
   margin: 1em;
 }
 
 treechildren::-moz-tree-cell-text(broken) {
   font-style: italic;
   color: graytext;
 }
 
-/* Feeds Tab */
-#feedPanel {
-  margin-left: 2px;
-  margin-right: 2px;
-}
-
-#feedtree {
-  margin-bottom: 0px;
-}
-
-#feedListbox richlistitem {
-  padding-top: 6px;
-  padding-bottom: 6px;
-  padding-inline-start: 7px;
-  padding-inline-end: 7px;
-  min-height: 25px;
-  border-bottom: 1px dotted ThreeDShadow;
-  color: -moz-FieldText;
-}
-
-#feedListbox richlistitem[selected="true"] {
-  background-color: -moz-Dialog;
-  color: -moz-DialogText;
-}
-
-#feedListbox {
-  margin-bottom: 0;
-}
-
-.feedTitle {
-  font-weight: bold;
-}
-
 /* Permissions Tab */
 
 #permList {
   -moz-appearance: listbox;
   margin: .5em;
   overflow: auto;
   color: -moz-FieldText;
 }
--- a/browser/themes/linux/preferences/applications.css
+++ b/browser/themes/linux/preferences/applications.css
@@ -35,21 +35,16 @@ menuitem[appHandlerIcon="ask"] {
   list-style-image: url("chrome://browser/skin/preferences/alwaysAsk.png");
 }
 
 richlistitem[appHandlerIcon="save"],
 menuitem[appHandlerIcon="save"] {
   list-style-image: url("moz-icon://stock/gtk-save?size=menu");
 }
 
-richlistitem[appHandlerIcon="feed"],
-menuitem[appHandlerIcon="feed"] {
-  list-style-image: url("chrome://browser/skin/page-livemarks.png");
-}
-
 richlistitem[appHandlerIcon="plugin"],
 menuitem[appHandlerIcon="plugin"] {
   list-style-image: url("chrome://mozapps/skin/plugins/pluginGeneric.svg");
 }
 
 .actionsMenu .menulist-icon {
   margin-inline-end: 1px;
   height: 16px;
deleted file mode 100644
index 7dcafeb8f985a09edd0e110b44331bef9cab776e..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 3a7d4616a8f1de8c27966d48371e36f2186fbf3a..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/browser/themes/osx/feeds/subscribe.css
+++ /dev/null
@@ -1,178 +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/. */
-
-html {
-  background: -moz-Dialog;
-  font: 3mm tahoma,arial,helvetica,sans-serif;
-}
-
-#subscribeUsingDescription,
-#subscribeButton {
-  display: block;
-}
-
-#subscribeUsingDescription {
-  margin-bottom: 0.5em;
-}
-
-#subscribeButton {
-  margin-top: 0.5em;
-  margin-inline-start: auto;
-}
-
-#feedBody {
-  border: 1px solid THreeDShadow;
-  padding: 3em;
-  padding-inline-start: 30px;
-  margin: 2em auto;
-  background: -moz-Field;
-}
-
-#feedHeaderContainer {
-  display: flex;
-}
-
-#feedHeaderContainerSpacer {
-  flex-grow: 1;
-}
-
-#feedHeader {
-  border: 1px solid ThreeDShadow;
-  border-radius: 10px;
-  padding-top: 4em;
-  padding-bottom: .3em;
-  padding-inline-start: .3em;
-  padding-inline-end: .3em;
-  margin: -4em auto 0 auto;
-  font-size: 110%;
-  color: InfoText;
-  padding: 5em 3em 0 3em;
-}
-
-.feedBackground {
-  background: url("chrome://browser/skin/feeds/feedIcon.png") 1.4em 5.9em no-repeat rgb(255,255,225);
-}
-
-.videoPodcastBackground {
-  background: url("chrome://browser/skin/feeds/videoFeedIcon.png") 1.4em 5.9em no-repeat rgb(255,255,225);
-}
-
-.audioPodcastBackground {
-  background: url("chrome://browser/skin/feeds/audioFeedIcon.png") 1.4em 5.9em no-repeat rgb(255,255,225);
-}
-
-#feedHeader[firstrun="true"] #feedIntroText {
-  display: block;
-}
-
-#feedIntroText {
-  display: none;
-  margin-inline-start: 2em;
-}
-
-#feedSubscribeLine {
-  padding: 0 1em 1em 2em;
-}
-
-#feedHeader[firstrun="true"] #feedSubscribeLine {
-  padding-left: 3.7em;
-}
-
-/* Don't print subscription UI */
-@media print {
-  #feedHeaderContainer {
-    display: none;
-  }
-}
-
-body {
-  margin: 0;
-  padding: 0 3em;
-  color: -moz-fieldText;
-  font: message-box;
-}
-
-h1 {
-  font-size: 160%;
-  border-bottom: 2px solid ThreeDLightShadow;
-  margin: 0 0 .2em 0;
-}
-
-h2 {
-  color: #C0C0C0;
-  font-size: 110%;
-  font-weight: normal;
-  margin: 0 0 .6em 0;
-}
-
-#feedTitleLink {
-  float: right;
-  margin-inline-start: .6em;
-  margin-inline-end: 0;
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-a[href] img {
-  border: none;
-}
-
-#feedTitleContainer {
-  margin-inline-start: 0;
-  margin-inline-end: .6em;
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-#feedTitleImage {
-  margin-inline-start: .6em;
-  margin-inline-end: 0;
-  margin-top: 0;
-  margin-bottom: 0;
-  max-width: 300px;
-  max-height: 150px;
-}
-
-.feedEntryContent {
-  font-size: 110%;
-}
-
-.link {
-  color: #0000FF;
-  text-decoration: underline;
-  cursor: pointer;
-  margin-top: -2px;
-}
-
-.link:hover:active {
-  color: #FF0000;
-}
-
-.lastUpdated {
-  font-size: 85%;
-  font-weight: normal;
-}
-
-.type-icon {
-  vertical-align: bottom;
-  height: 16px;
-  width: 16px;
-}
-
-.enclosures {
-  border: 1px solid THreeDShadow;
-  padding: 1em;
-  margin: 1em auto;
-  background: -moz-Dialog;
-}
-
-.enclosure {
-  vertical-align: middle;
-  margin-left: 2px;
-}
-
-.handlersMenuList > .menulist-label-box > .menulist-icon {
-  max-width: 16px;
-  max-height: 16px;
-}
--- a/browser/themes/osx/jar.mn
+++ b/browser/themes/osx/jar.mn
@@ -9,30 +9,26 @@ browser.jar:
 * skin/classic/browser/syncedtabs/sidebar.css          (syncedtabs/sidebar.css)
 * skin/classic/browser/browser.css
 * skin/classic/browser/compacttheme.css
   skin/classic/browser/panel-expander-closed.png
   skin/classic/browser/panel-expander-closed@2x.png
   skin/classic/browser/panel-expander-open.png
   skin/classic/browser/panel-expander-open@2x.png
   skin/classic/browser/panel-plus-sign.png
-  skin/classic/browser/page-livemarks.png
 * skin/classic/browser/pageInfo.css
 * skin/classic/browser/searchbar.css
   skin/classic/browser/slowStartup-16.png
   skin/classic/browser/toolbarbutton-dropmarker.png
   skin/classic/browser/toolbarbutton-dropmarker@2x.png
   skin/classic/browser/webRTC-indicator.css
 * skin/classic/browser/controlcenter/panel.css        (controlcenter/panel.css)
 * skin/classic/browser/customizableui/panelUI.css    (customizableui/panelUI.css)
 * skin/classic/browser/downloads/allDownloadsView.css (downloads/allDownloadsView.css)
 * skin/classic/browser/downloads/downloads.css              (downloads/downloads.css)
-  skin/classic/browser/feeds/subscribe.css                  (feeds/subscribe.css)
-  skin/classic/browser/feeds/feedIcon.png                   (feeds/feedIcon.png)
-  skin/classic/browser/feeds/feedIcon16.png                 (feeds/feedIcon16.png)
   skin/classic/browser/setDesktopBackground.css
   skin/classic/browser/monitor.png
   skin/classic/browser/monitor_16-10.png
   skin/classic/browser/notification-icons/geo-blocked.svg  (notification-icons/geo-blocked.svg)
   skin/classic/browser/notification-icons/geo.svg          (notification-icons/geo.svg)
   skin/classic/browser/places/allBookmarks.png              (places/allBookmarks.png)
 * skin/classic/browser/places/sidebar.css                   (places/sidebar.css)
   skin/classic/browser/places/organizer.css                 (places/organizer.css)
@@ -47,13 +43,9 @@ browser.jar:
 * skin/classic/browser/preferences/in-content/preferences.css (preferences/in-content/preferences.css)
 * skin/classic/browser/preferences/in-content/dialog.css      (preferences/in-content/dialog.css)
   skin/classic/browser/preferences/applications.css         (preferences/applications.css)
   skin/classic/browser/share.svg                            (share.svg)
   skin/classic/browser/tabbrowser/tabDragIndicator.png                   (tabbrowser/tabDragIndicator.png)
   skin/classic/browser/tabbrowser/tabDragIndicator@2x.png                (tabbrowser/tabDragIndicator@2x.png)
   skin/classic/browser/e10s-64@2x.png                                  (../shared/e10s-64@2x.png)
 
-% override chrome://browser/skin/feeds/audioFeedIcon.png                   chrome://browser/skin/feeds/feedIcon.png
-% override chrome://browser/skin/feeds/audioFeedIcon16.png                 chrome://browser/skin/feeds/feedIcon16.png
-% override chrome://browser/skin/feeds/videoFeedIcon.png                   chrome://browser/skin/feeds/feedIcon.png
-% override chrome://browser/skin/feeds/videoFeedIcon16.png                 chrome://browser/skin/feeds/feedIcon16.png
 % override chrome://browser/skin/notification-icons/geo-detailed.svg       chrome://browser/skin/notification-icons/geo.svg
deleted file mode 100644
index 0f792e9e6317ff92d75092940529f6047f4ebb94..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/themes/osx/pageInfo.css
+++ b/browser/themes/osx/pageInfo.css
@@ -104,39 +104,16 @@ textbox[disabled] {
   margin: 1em;
 }
 
 treechildren::-moz-tree-cell-text(broken) {
   font-style: italic;
   color: graytext;
 }
 
-/* Feeds Tab */
-#feedtree {
-  margin-bottom: 0px;
-}
-
-#feedListbox richlistitem {
-  padding-top: 6px;
-  padding-bottom: 6px;
-  padding-inline-start: 7px;
-  padding-inline-end: 7px;
-  min-height: 25px;
-  border-bottom: 1px dotted ThreeDShadow;
-}
-
-#feedListbox richlistitem[selected="true"] {
-  background-color: -moz-Dialog;
-  color: -moz-DialogText;
-}
-
-.feedTitle {
-  font-weight: bold;
-}
-
 /* Permissions Tab */
 #permList {
   margin: .5em;
   overflow: auto;
   -moz-appearance: listbox;
   color: -moz-fieldtext;
 }
 
--- a/browser/themes/osx/preferences/applications.css
+++ b/browser/themes/osx/preferences/applications.css
@@ -46,21 +46,16 @@ menuitem[appHandlerIcon="ask"] {
   list-style-image: url("chrome://browser/skin/preferences/alwaysAsk.png");
 }
 
 richlistitem[appHandlerIcon="save"],
 menuitem[appHandlerIcon="save"] {
   list-style-image: url("chrome://browser/skin/preferences/saveFile.png");
 }
 
-richlistitem[appHandlerIcon="feed"],
-menuitem[appHandlerIcon="feed"] {
-  list-style-image: url("chrome://browser/skin/page-livemarks.png");
-}
-
 richlistitem[appHandlerIcon="plugin"],
 menuitem[appHandlerIcon="plugin"] {
   list-style-image: url("chrome://mozapps/skin/plugins/pluginGeneric.svg");
 }
 
 /* Repeat what menu.css does for .menuitem-iconic */
 menuitem[appHandlerIcon] {
   padding-top: 1px;
--- a/browser/themes/windows/browser.css
+++ b/browser/themes/windows/browser.css
@@ -881,21 +881,16 @@ notification[value="translation"] {
   }
 }
 
 .translation-menupopup {
   -moz-appearance: none;
 }
 
 /* Bookmarks roots menu-items */
-#subscribeToPageMenuitem:not([disabled]),
-#subscribeToPageMenupopup {
-  list-style-image: url("chrome://browser/skin/feeds/feedIcon16.png");
-}
-
 #bookmarksToolbarFolderMenu,
 #BMB_bookmarksToolbar,
 #panelMenu_bookmarksToolbar {
   list-style-image: url("chrome://browser/skin/places/bookmarksToolbar.svg");
   -moz-image-region: auto;
 }
 
 #menu_unsortedBookmarks,
deleted file mode 100644
index c930a099e5fe3734e7c5f86c762d0ee4abf536c4..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 58bab3228e0ba9ebec5ad68ce6dbbbc1af47d34f..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/browser/themes/windows/feeds/subscribe.css
+++ /dev/null
@@ -1,184 +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/. */
-
-html {
-  background: -moz-Dialog;
-  font: 3mm tahoma,arial,helvetica,sans-serif;
-}
-
-#subscribeUsingDescription,
-#subscribeButton {
-  display: block;
-}
-
-#subscribeUsingDescription {
-  margin-bottom: 0.5em;
-}
-
-#subscribeButton {
-  margin-top: 0.5em;
-  margin-inline-start: auto;
-}
-
-#feedBody {
-  border: 1px solid THreeDShadow;
-  padding: 3em;
-  padding-inline-start: 30px;
-  margin: 2em auto;
-  background: -moz-Field;
-}
-
-#feedHeaderContainer {
-  border: 1px solid ThreeDShadow;
-  border-radius: 10px;
-  margin: -4em auto 0 auto;
-  background-color: InfoBackground;
-  display: flex;
-}
-
-#feedHeaderContainerSpacer {
-  flex-grow: 1;
-}
-
-#feedHeader {
-  margin-top: 4.9em;
-  margin-bottom: 1em;
-  margin-inline-start: 1.4em;
-  margin-inline-end: 1em;
-  padding-inline-start: 2.9em;
-  font-size: 110%;
-  color: InfoText;
-}
-
-#feedIntroText {
-  display: none;
-}
-
-.feedBackground {
-  background: url("chrome://browser/skin/feeds/feedIcon.png") 0% 10% no-repeat InfoBackground;
-}
-
-.videoPodcastBackground {
-  background: url("chrome://browser/skin/feeds/videoFeedIcon.png") 0% 10% no-repeat InfoBackground;
-}
-
-.audioPodcastBackground {
-  background: url("chrome://browser/skin/feeds/audioFeedIcon.png") 0% 10% no-repeat InfoBackground;
-}
-
-#feedHeader[dir="rtl"] {
-  background-position: 100% 10%;
-}
-
-#feedHeader[firstrun="true"] #feedIntroText {
-  padding-top: 0.1em;
-  padding-inline-start: 0.6em;
-  display: block;
-}
-
-#feedHeader[firstrun="true"] > #feedSubscribeLine {
-  padding-inline-start: 1.8em;
-}
-
-#feedSubscribeLine {
-  padding-top: 0.2em;
-  padding-inline-start: 0.5em;
-}
-
-/* Don't print subscription UI */
-@media print {
-  #feedHeaderContainer {
-    display: none;
-  }
-}
-
-body {
-  margin: 0;
-  padding: 0 3em;
-  color: -moz-fieldText;
-  font: message-box;
-}
-
-h1 {
-  font-size: 160%;
-  border-bottom: 2px solid ThreeDLightShadow;
-  margin: 0 0 .2em 0;
-}
-
-h2 {
-  color: GrayText;
-  font-size: 110%;
-  font-weight: normal;
-  margin: 0 0 .6em 0;
-}
-
-#feedTitleLink {
-  float: right;
-  margin-inline-start: .6em;
-  margin-inline-end: 0;
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-a[href] img {
-  border: none;
-}
-
-#feedTitleContainer {
-  margin-inline-start: 0;
-  margin-inline-end: .6em;
-  margin-top: 0;
-  margin-bottom: 0;
-}
-
-#feedTitleImage {
-  margin-inline-start: .6em;
-  margin-inline-end: 0;
-  margin-top: 0;
-  margin-bottom: 0;
-  max-width: 300px;
-  max-height: 150px;
-}
-
-.feedEntryContent {
-  font-size: 110%;
-}
- 
-.link {
-  color: #0000FF;
-  text-decoration: underline;
-  cursor: pointer;
-}
-
-.link:hover:active {
-  color: #FF0000;
-}
-
-.lastUpdated {
-  font-size: 85%;
-  font-weight: normal;
-}
-
-.type-icon {
-  vertical-align: bottom;
-  height: 16px;
-  width: 16px;
-}
-
-.enclosures {
-  border: 1px solid THreeDShadow;
-  padding: 1em;
-  margin: 1em auto;
-  background: -moz-Dialog;
-}
-
-.enclosure {
-  vertical-align: middle;
-  margin-left: 2px;
-}
-
-.handlersMenuList > .menulist-label-box > .menulist-icon {
-  max-width: 16px;
-  max-height: 16px;
-}
--- a/browser/themes/windows/jar.mn
+++ b/browser/themes/windows/jar.mn
@@ -16,19 +16,16 @@ browser.jar:
 * skin/classic/browser/searchbar.css
   skin/classic/browser/setDesktopBackground.css
   skin/classic/browser/slowStartup-16.png
   skin/classic/browser/webRTC-indicator.css  (../shared/webRTC-indicator.css)
 * skin/classic/browser/controlcenter/panel.css                 (controlcenter/panel.css)
 * skin/classic/browser/customizableui/panelUI.css       (customizableui/panelUI.css)
 * skin/classic/browser/downloads/allDownloadsView.css   (downloads/allDownloadsView.css)
 * skin/classic/browser/downloads/downloads.css                 (downloads/downloads.css)
-  skin/classic/browser/feeds/feedIcon.png                      (feeds/feedIcon.png)
-  skin/classic/browser/feeds/feedIcon16.png                    (feeds/feedIcon16.png)
-  skin/classic/browser/feeds/subscribe.css                     (feeds/subscribe.css)
   skin/classic/browser/notification-icons/geo-blocked.svg      (notification-icons/geo-blocked.svg)
   skin/classic/browser/notification-icons/geo-detailed.svg     (notification-icons/geo-detailed.svg)
   skin/classic/browser/notification-icons/geo.svg              (notification-icons/geo.svg)
 * skin/classic/browser/places/sidebar.css                      (places/sidebar.css)
 * skin/classic/browser/places/organizer.css                    (places/organizer.css)
   skin/classic/browser/places/toolbarDropMarker.png            (places/toolbarDropMarker.png)
   skin/classic/browser/places/editBookmark.css                 (places/editBookmark.css)
   skin/classic/browser/places/libraryToolbar.png               (places/libraryToolbar.png)
@@ -51,14 +48,8 @@ browser.jar:
   skin/classic/browser/window-controls/maximize-themes.svg       (window-controls/maximize-themes.svg)
   skin/classic/browser/window-controls/minimize.svg              (window-controls/minimize.svg)
   skin/classic/browser/window-controls/minimize-highcontrast.svg (window-controls/minimize-highcontrast.svg)
   skin/classic/browser/window-controls/minimize-themes.svg       (window-controls/minimize-themes.svg)
   skin/classic/browser/window-controls/restore.svg               (window-controls/restore.svg)
   skin/classic/browser/window-controls/restore-highcontrast.svg  (window-controls/restore-highcontrast.svg)
   skin/classic/browser/window-controls/restore-themes.svg        (window-controls/restore-themes.svg)
   skin/classic/browser/e10s-64@2x.png                            (../shared/e10s-64@2x.png)
-
-% override chrome://browser/skin/page-livemarks.png                   chrome://browser/skin/feeds/feedIcon16.png
-% override chrome://browser/skin/feeds/audioFeedIcon.png              chrome://browser/skin/feeds/feedIcon.png
-% override chrome://browser/skin/feeds/audioFeedIcon16.png            chrome://browser/skin/feeds/feedIcon16.png
-% override chrome://browser/skin/feeds/videoFeedIcon.png              chrome://browser/skin/feeds/feedIcon.png
-% override chrome://browser/skin/feeds/videoFeedIcon16.png            chrome://browser/skin/feeds/feedIcon16.png
--- a/browser/themes/windows/pageInfo.css
+++ b/browser/themes/windows/pageInfo.css
@@ -53,25 +53,16 @@
   -moz-image-region: rect(0px, 64px, 32px, 32px)
 }
 
 #mediaTab:hover,
 #mediaTab[selected="true"] {
   -moz-image-region: rect(32px, 64px, 64px, 32px)
 }
 
-#feedTab {
-  -moz-image-region: rect(0px, 96px, 32px, 64px)
-}
-
-#feedTab:hover,
-#feedTab[selected="true"] {
-  -moz-image-region: rect(32px, 96px, 64px, 64px)
-}
-
 #permTab {
   -moz-image-region: rect(0px, 128px, 32px, 96px)
 }
 
 #permTab:hover,
 #permTab[selected="true"] {
   -moz-image-region: rect(32px, 128px, 64px, 96px)
 }
@@ -156,39 +147,16 @@ textbox[disabled] {
   margin: 1em;
 }
 
 treechildren::-moz-tree-cell-text(broken) {
   font-style: italic;
   color: graytext;
 }
 
-/* Feeds Tab */
-#feedtree {
-  margin-bottom: 0px;
-}
-
-#feedListbox richlistitem {
-  padding-top: 6px;
-  padding-bottom: 6px;
-  padding-inline-start: 7px;
-  padding-inline-end: 7px;
-  min-height: 25px;
-  border-bottom: 1px dotted ThreeDShadow;
-}
-
-#feedListbox richlistitem[selected="true"] {
-  background-color: -moz-Dialog;
-  color: -moz-DialogText;
-}
-
-.feedTitle {
-  font-weight: bold;
-}
-
 /* Permissions Tab */
 #permList {
   margin: .5em;
   overflow: auto;
   -moz-appearance: listbox;
   color: -moz-fieldtext;
 }
 
--- a/browser/themes/windows/preferences/applications.css
+++ b/browser/themes/windows/preferences/applications.css
@@ -35,21 +35,16 @@ menuitem[appHandlerIcon="ask"] {
   list-style-image: url("chrome://browser/skin/preferences/alwaysAsk.png");
 }
 
 richlistitem[appHandlerIcon="save"],
 menuitem[appHandlerIcon="save"] {
   list-style-image: url("chrome://browser/skin/preferences/saveFile.png");
 }
 
-richlistitem[appHandlerIcon="feed"],
-menuitem[appHandlerIcon="feed"] {
-  list-style-image: url("chrome://browser/skin/page-livemarks.png");
-}
-
 richlistitem[appHandlerIcon="plugin"],
 menuitem[appHandlerIcon="plugin"] {
   list-style-image: url("chrome://mozapps/skin/plugins/pluginGeneric.svg");
 }
 
 .actionsMenu .menulist-icon {
   margin-inline-end: 3px;
 }
--- a/devtools/client/aboutdebugging-new/aboutdebugging.css
+++ b/devtools/client/aboutdebugging-new/aboutdebugging.css
@@ -9,19 +9,20 @@
 @import "resource://devtools/client/aboutdebugging-new/src/components/connect/ConnectSteps.css";
 @import "resource://devtools/client/aboutdebugging-new/src/components/connect/NetworkLocationsForm.css";
 @import "resource://devtools/client/aboutdebugging-new/src/components/connect/NetworkLocationsList.css";
 @import "resource://devtools/client/aboutdebugging-new/src/components/debugtarget/DebugTargetItem.css";
 @import "resource://devtools/client/aboutdebugging-new/src/components/debugtarget/DebugTargetList.css";
 @import "resource://devtools/client/aboutdebugging-new/src/components/debugtarget/DebugTargetPane.css";
 @import "resource://devtools/client/aboutdebugging-new/src/components/debugtarget/ExtensionDetail.css";
 @import "resource://devtools/client/aboutdebugging-new/src/components/debugtarget/WorkerDetail.css";
-@import "resource://devtools/client/aboutdebugging-new/src/components/sidebar/DeviceSidebarItemAction.css";
 @import "resource://devtools/client/aboutdebugging-new/src/components/sidebar/Sidebar.css";
+@import "resource://devtools/client/aboutdebugging-new/src/components/sidebar/SidebarFixedItem.css";
 @import "resource://devtools/client/aboutdebugging-new/src/components/sidebar/SidebarItem.css";
+@import "resource://devtools/client/aboutdebugging-new/src/components/sidebar/SidebarRuntimeItem.css";
 
 :root {
   /* Import css variables from common.css */
   --text-color: var(--in-content-page-color);
 
   /* */
   /* Variables with values from common.css, which are hardcoded there */
   /* */
--- a/devtools/client/aboutdebugging-new/src/actions/runtimes.js
+++ b/devtools/client/aboutdebugging-new/src/actions/runtimes.js
@@ -50,43 +50,43 @@ async function createNetworkClient(host,
 }
 
 async function createUSBClient(socketPath) {
   const port = await ADB.prepareTCPConnection(socketPath);
   return createNetworkClient("localhost", port);
 }
 
 async function createClientForRuntime(runtime) {
-  const { connectionParameters, type } = runtime;
+  const { extra, type } = runtime;
 
   if (type === RUNTIMES.THIS_FIREFOX) {
     return createLocalClient();
   } else if (type === RUNTIMES.NETWORK) {
-    const { host, port } = connectionParameters;
+    const { host, port } = extra.connectionParameters;
     return createNetworkClient(host, port);
   } else if (type === RUNTIMES.USB) {
-    const { socketPath } = connectionParameters;
+    const { socketPath } = extra.connectionParameters;
     return createUSBClient(socketPath);
   }
 
   return null;
 }
 
 async function getRuntimeInfo(runtime, client) {
-  const { model, type } = runtime;
+  const { extra, type } = runtime;
   const deviceFront = await client.mainRoot.getFront("device");
   const { brandName: name, channel, version } = await deviceFront.getDescription();
   const icon =
     (channel === "release" || channel === "beta" || channel === "aurora")
       ? `chrome://devtools/skin/images/aboutdebugging-firefox-${ channel }.svg`
       : "chrome://devtools/skin/images/aboutdebugging-firefox-nightly.svg";
 
   return {
     icon,
-    model,
+    deviceName: extra ? extra.deviceName : undefined,
     name,
     type,
     version,
   };
 }
 
 function connectRuntime(id) {
   return async (dispatch, getState) => {
--- a/devtools/client/aboutdebugging-new/src/components/RuntimeInfo.js
+++ b/devtools/client/aboutdebugging-new/src/components/RuntimeInfo.js
@@ -13,42 +13,42 @@ const Localized = createFactory(FluentRe
 
 /**
  * This component displays runtime information.
  */
 class RuntimeInfo extends PureComponent {
   static get propTypes() {
     return {
       icon: PropTypes.string.isRequired,
-      model: PropTypes.string,
+      deviceName: PropTypes.string,
       name: PropTypes.string.isRequired,
       version: PropTypes.string.isRequired,
     };
   }
 
   render() {
-    const { icon, model, name, version } = this.props;
+    const { icon, deviceName, name, version } = this.props;
 
     return dom.h1(
       {
         className: "runtime-info",
       },
       dom.img(
         {
           className: "runtime-info__icon",
           src: icon,
         }
       ),
       Localized(
         {
-          id: model ? "about-debugging-runtime-info-with-model"
-                    : "about-debugging-runtime-info",
+          id: deviceName ? "about-debugging-runtime-info-with-model"
+                          : "about-debugging-runtime-info",
           $name: name,
-          $model: model,
+          $deviceName: deviceName,
           $version: version,
         },
-        dom.label({}, `${ name } on ${ model } (${ version })`)
+        dom.label({}, `${ name } on ${ deviceName } (${ version })`)
       )
     );
   }
 }
 
 module.exports = RuntimeInfo;
deleted file mode 100644
--- a/devtools/client/aboutdebugging-new/src/components/sidebar/DeviceSidebarItemAction.css
+++ /dev/null
@@ -1,7 +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/. */
-
-.sidebar-item__connect-button {
-  font-size: 0.8em;
-}
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/aboutdebugging-new/src/components/sidebar/DeviceSidebarItemAction.js
+++ /dev/null
@@ -1,57 +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";
-
-const { createFactory, PureComponent } = require("devtools/client/shared/vendor/react");
-const dom = require("devtools/client/shared/vendor/react-dom-factories");
-const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
-
-const FluentReact = require("devtools/client/shared/vendor/fluent-react");
-const Localized = createFactory(FluentReact.Localized);
-
-const Actions = require("../../actions/index");
-
-/**
- * This component displays actions for sidebar items representing a device.
- */
-class DeviceSidebarItemAction extends PureComponent {
-  static get propTypes() {
-    return {
-      connected: PropTypes.bool.isRequired,
-      dispatch: PropTypes.func.isRequired,
-      runtimeId: PropTypes.string.isRequired,
-    };
-  }
-
-  render() {
-    const { connected } = this.props;
-    if (connected) {
-      return Localized(
-        {
-          id: "about-debugging-sidebar-item-connected-label"
-        },
-        dom.span({}, "Connected")
-      );
-    }
-
-    return Localized(
-      {
-        id: "about-debugging-sidebar-item-connect-button"
-      },
-      dom.button(
-        {
-          className: "sidebar-item__connect-button",
-          onClick: () => {
-            const { dispatch, runtimeId } = this.props;
-            dispatch(Actions.connectRuntime(runtimeId));
-          }
-        },
-        "Connect"
-      )
-    );
-  }
-}
-
-module.exports = DeviceSidebarItemAction;
--- a/devtools/client/aboutdebugging-new/src/components/sidebar/Sidebar.js
+++ b/devtools/client/aboutdebugging-new/src/components/sidebar/Sidebar.js
@@ -8,18 +8,18 @@ const { createFactory, PureComponent } =
 const dom = require("devtools/client/shared/vendor/react-dom-factories");
 const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
 
 const FluentReact = require("devtools/client/shared/vendor/fluent-react");
 const Localized = createFactory(FluentReact.Localized);
 
 const { PAGES, RUNTIMES } = require("../../constants");
 
-const DeviceSidebarItemAction = createFactory(require("./DeviceSidebarItemAction"));
-const SidebarItem = createFactory(require("./SidebarItem"));
+const SidebarFixedItem = createFactory(require("./SidebarFixedItem"));
+const SidebarRuntimeItem = createFactory(require("./SidebarRuntimeItem"));
 const FIREFOX_ICON = "chrome://devtools/skin/images/aboutdebugging-firefox-logo.svg";
 const CONNECT_ICON = "chrome://devtools/skin/images/aboutdebugging-connect-icon.svg";
 const GLOBE_ICON = "chrome://devtools/skin/images/aboutdebugging-globe-icon.svg";
 const USB_ICON = "chrome://devtools/skin/images/aboutdebugging-connect-icon.svg";
 
 class Sidebar extends PureComponent {
   static get propTypes() {
     return {
@@ -53,66 +53,58 @@ class Sidebar extends PureComponent {
 
   renderSidebarItems(icon, runtimes) {
     const { dispatch, selectedPage } = this.props;
 
     return runtimes.map(runtime => {
       const pageId = runtime.type + "-" + runtime.id;
       const runtimeHasConnection = !!runtime.connection;
 
-      const connectComponent = DeviceSidebarItemAction({
-        connected: runtimeHasConnection,
-        dispatch,
-        runtimeId: runtime.id,
-      });
-
-      return SidebarItem({
-        connectComponent,
+      return SidebarRuntimeItem({
         id: pageId,
+        deviceName: runtime.extra.deviceName,
         dispatch,
         icon,
+        isConnected: runtimeHasConnection,
         isSelected: selectedPage === pageId,
         key: pageId,
         name: runtime.name,
         runtimeId: runtime.id,
-        selectable: runtimeHasConnection,
       });
     });
   }
 
   render() {
     const { dispatch, selectedPage } = this.props;
 
     return dom.aside(
       {
         className: `sidebar ${this.props.className || ""}`,
       },
       dom.ul(
         {},
         Localized(
           { id: "about-debugging-sidebar-this-firefox", attrs: { name: true } },
-          SidebarItem({
+          SidebarFixedItem({
             id: PAGES.THIS_FIREFOX,
             dispatch,
             icon: FIREFOX_ICON,
             isSelected: PAGES.THIS_FIREFOX === selectedPage,
             name: "This Firefox",
             runtimeId: RUNTIMES.THIS_FIREFOX,
-            selectable: true,
           })
         ),
         Localized(
           { id: "about-debugging-sidebar-connect", attrs: { name: true } },
-          SidebarItem({
+          SidebarFixedItem({
             id: PAGES.CONNECT,
             dispatch,
             icon: CONNECT_ICON,
             isSelected: PAGES.CONNECT === selectedPage,
             name: "Connect",
-            selectable: true,
           })
         ),
         dom.hr(),
         this.renderDevices()
       )
     );
   }
 }
new file mode 100644
--- /dev/null
+++ b/devtools/client/aboutdebugging-new/src/components/sidebar/SidebarFixedItem.css
@@ -0,0 +1,31 @@
+/* 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/. */
+
+/*
+ * Layout of a fixed sidebar item
+ *
+ *  +--------+----------------+
+ *  | Icon   | Name           |
+ *  +--------+----------------+
+ */
+
+.sidebar-fixed-item {
+  align-items: center;
+  border-radius: 2px;
+  display: grid;
+  grid-template-columns: 34px 1fr;
+  font-size: 16px;
+  height: 48px;
+  padding-inline-end: 10px;
+  padding-inline-start: 10px;
+}
+
+.sidebar-fixed-item__icon {
+  fill: currentColor;
+  height: 24px;
+  margin-inline-end: 9px;
+  width: 24px;
+  -moz-context-properties: fill;
+}
+
new file mode 100644
--- /dev/null
+++ b/devtools/client/aboutdebugging-new/src/components/sidebar/SidebarFixedItem.js
@@ -0,0 +1,66 @@
+/* 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";
+
+const { PureComponent, createFactory } = require("devtools/client/shared/vendor/react");
+const dom = require("devtools/client/shared/vendor/react-dom-factories");
+const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
+
+const SidebarItem = createFactory(require("./SidebarItem"));
+
+const Actions = require("../../actions/index");
+
+/**
+ * This component displays a fixed item in the Sidebar component.
+ */
+class SidebarFixedItem extends PureComponent {
+  static get propTypes() {
+    return {
+      dispatch: PropTypes.func.isRequired,
+      icon: PropTypes.string.isRequired,
+      id: PropTypes.string.isRequired,
+      isSelected: PropTypes.bool.isRequired,
+      name: PropTypes.string.isRequired,
+      runtimeId: PropTypes.string,
+    };
+  }
+
+  render() {
+    const {
+      dispatch,
+      id,
+      icon,
+      isSelected,
+      name,
+      runtimeId,
+    } = this.props;
+
+    return SidebarItem(
+      {
+        isSelected,
+        selectable: true,
+        className: "sidebar-fixed-item",
+        onSelect: () => {
+          dispatch(Actions.selectPage(id, runtimeId));
+        }
+      },
+      dom.img(
+        {
+          className: "sidebar-fixed-item__icon",
+          src: icon,
+        }
+      ),
+      dom.span(
+        {
+          className: "ellipsis-text",
+          title: name,
+        },
+        name
+      )
+    );
+  }
+}
+
+module.exports = SidebarFixedItem;
--- a/devtools/client/aboutdebugging-new/src/components/sidebar/SidebarItem.css
+++ b/devtools/client/aboutdebugging-new/src/components/sidebar/SidebarItem.css
@@ -4,48 +4,28 @@
 
 .sidebar-item {
   /* Import css variables from common.css */
   --sidebar-text-color: var(--in-content-category-text);
   --sidebar-selected-color: var(--in-content-category-text-selected);
   --sidebar-background-hover: var(--in-content-category-background-hover);
 }
 
-/*
- * Layout of a sidebar item
- *
- *  +--------+----------------+---------------------------+
- *  | Icon   | Name           | Connect button (optional) |
- *  +--------+----------------+---------------------------+
- */
 .sidebar-item {
-  align-items: center;
+  color: var(--sidebar-text-color);
   border-radius: 2px;
-  color: var(--sidebar-text-color);
-  display: grid;
-  grid-template-columns: 34px auto max-content;
-  font-size: 16px;
-  height: 48px;
   padding-inline-end: 10px;
   padding-inline-start: 10px;
   transition: background-color 150ms;
   -moz-user-select: none;
 }
 
 .sidebar-item:not(.sidebar-item--selectable) {
   opacity: 0.5;
 }
 
 .sidebar-item--selectable:hover {
   background-color: var(--sidebar-background-hover);
 }
 
-.sidebar-item__icon {
-  fill: currentColor;
-  height: 24px;
-  margin-inline-end: 9px;
-  width: 24px;
-  -moz-context-properties: fill;
-}
-
 .sidebar-item--selected {
   color: var(--sidebar-selected-color);
 }
--- a/devtools/client/aboutdebugging-new/src/components/sidebar/SidebarItem.js
+++ b/devtools/client/aboutdebugging-new/src/components/sidebar/SidebarItem.js
@@ -3,61 +3,46 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
 const { PureComponent } = require("devtools/client/shared/vendor/react");
 const dom = require("devtools/client/shared/vendor/react-dom-factories");
 const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
 
-const Actions = require("../../actions/index");
-
 /**
- * This component displays an item of the Sidebar component.
+ * This component is used as a wrapper by items in the sidebar.
  */
 class SidebarItem extends PureComponent {
   static get propTypes() {
     return {
-      connectComponent: PropTypes.any,
-      dispatch: PropTypes.func.isRequired,
-      icon: PropTypes.string.isRequired,
-      id: PropTypes.string.isRequired,
+      children: PropTypes.arrayOf(PropTypes.element).isRequired,
+      className: PropTypes.string,
       isSelected: PropTypes.bool.isRequired,
-      name: PropTypes.string.isRequired,
-      runtimeId: PropTypes.string,
       selectable: PropTypes.bool.isRequired,
+      onSelect: PropTypes.func.isRequired,
     };
   }
 
   onItemClick() {
-    const { id, dispatch, runtimeId } = this.props;
-    dispatch(Actions.selectPage(id, runtimeId));
+    this.props.onSelect();
   }
 
   render() {
-    const { connectComponent, icon, isSelected, name, selectable } = this.props;
+    const {children, className, isSelected, selectable } = this.props;
 
     return dom.li(
       {
         className: "sidebar-item js-sidebar-item" +
+                   (className ? ` ${className}` : "") +
                    (isSelected ?
                       " sidebar-item--selected js-sidebar-item-selected" :
                       ""
                    ) +
                    (selectable ? " sidebar-item--selectable" : ""),
         onClick: selectable ? () => this.onItemClick() : null
       },
-      dom.img({
-        className: "sidebar-item__icon",
-        src: icon,
-      }),
-      dom.span(
-        {
-          className: "ellipsis-text",
-          title: name,
-        },
-        name),
-      connectComponent ? connectComponent : null
+      children
     );
   }
 }
 
 module.exports = SidebarItem;
new file mode 100644
--- /dev/null
+++ b/devtools/client/aboutdebugging-new/src/components/sidebar/SidebarRuntimeItem.css
@@ -0,0 +1,25 @@
+/* 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/. */
+
+/*
+ * Layout of a runtime sidebar item
+ *
+ *  +--------+----------------+---------------------------+
+ *  | Icon   | Runtime name   | Connect button            |
+ *  +--------+----------------+---------------------------+
+ */
+
+.sidebar-runtime-item {
+  font-size: 0.8em;
+  align-items: center;
+  display: grid;
+  grid-column-gap: var(--base-distance);
+  grid-template-columns: 20px 1fr auto;
+}
+
+.sidebar-runtime-item__icon {
+  fill: currentColor;
+  -moz-context-properties: fill;
+  margin-inline-end: var(--base-distance);
+}
new file mode 100644
--- /dev/null
+++ b/devtools/client/aboutdebugging-new/src/components/sidebar/SidebarRuntimeItem.js
@@ -0,0 +1,117 @@
+/* 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";
+
+const { createFactory, PureComponent } = require("devtools/client/shared/vendor/react");
+const dom = require("devtools/client/shared/vendor/react-dom-factories");
+const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
+
+const FluentReact = require("devtools/client/shared/vendor/fluent-react");
+const Localized = createFactory(FluentReact.Localized);
+
+const SidebarItem = createFactory(require("./SidebarItem"));
+const Actions = require("../../actions/index");
+
+/**
+ * This component displays a runtime item of the Sidebar component.
+ */
+class SidebarRuntimeItem extends PureComponent {
+  static get propTypes() {
+    return {
+      id: PropTypes.string.isRequired,
+      deviceName: PropTypes.string,
+      dispatch: PropTypes.func.isRequired,
+      // Provided by wrapping the component with FluentReact.withLocalization.
+      getString: PropTypes.func.isRequired,
+      icon: PropTypes.string.isRequired,
+      isConnected: PropTypes.bool.isRequired,
+      isSelected: PropTypes.bool.isRequired,
+      name: PropTypes.string.isRequired,
+      runtimeId: PropTypes.string.isRequired,
+    };
+  }
+
+  renderConnectButton() {
+    return Localized(
+      {
+        id: "about-debugging-sidebar-item-connect-button"
+      },
+      dom.button(
+        {
+          className: "sidebar-item__connect-button",
+          onClick: () => {
+            const { dispatch, runtimeId } = this.props;
+            dispatch(Actions.connectRuntime(runtimeId));
+          }
+        },
+        "Connect"
+      )
+    );
+  }
+
+  renderNameWithDevice(name, device) {
+    return dom.span(
+      {
+        className: "ellipsis-text",
+        title: `${name} (${device})`
+      },
+      `${name}`,
+      dom.br({}),
+      device
+    );
+  }
+
+  renderName(name) {
+    return dom.span(
+      {
+        className: "ellipsis-text",
+        title: name
+      },
+      `${name}`
+    );
+  }
+
+  render() {
+    const {
+      deviceName,
+      dispatch,
+      getString,
+      icon,
+      id,
+      isConnected,
+      isSelected,
+      name,
+      runtimeId,
+    } = this.props;
+
+    const connectionStatus = isConnected ?
+      getString("aboutdebugging-sidebar-runtime-connection-status-connected") :
+      getString("aboutdebugging-sidebar-runtime-connection-status-disconnected");
+
+    return SidebarItem(
+      {
+        isSelected,
+        selectable: isConnected,
+        className: "sidebar-runtime-item",
+        onSelect: () => {
+          dispatch(Actions.selectPage(id, runtimeId));
+        }
+      },
+      dom.img(
+        {
+          className: "sidebar-runtime-item__icon " +
+            `${isConnected ? "sidebar-runtime-item__icon--connected" : "" }`,
+          src: icon,
+          alt: connectionStatus,
+          title: connectionStatus
+        }
+      ),
+      deviceName ? this.renderNameWithDevice(name, deviceName) : this.renderName(name),
+      !isConnected ? this.renderConnectButton() : null
+    );
+  }
+}
+
+module.exports = FluentReact.withLocalization(SidebarRuntimeItem);
--- a/devtools/client/aboutdebugging-new/src/components/sidebar/moz.build
+++ b/devtools/client/aboutdebugging-new/src/components/sidebar/moz.build
@@ -1,12 +1,14 @@
 # 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/.
 
 DevToolsModules(
-    'DeviceSidebarItemAction.css',
-    'DeviceSidebarItemAction.js',
     'Sidebar.css',
     'Sidebar.js',
+    'SidebarFixedItem.css',
+    'SidebarFixedItem.js',
     'SidebarItem.css',
     'SidebarItem.js',
+    'SidebarRuntimeItem.css',
+    'SidebarRuntimeItem.js',
 )
--- a/devtools/client/aboutdebugging-new/src/reducers/runtimes-state.js
+++ b/devtools/client/aboutdebugging-new/src/reducers/runtimes-state.js
@@ -77,37 +77,41 @@ function runtimesReducer(state = Runtime
       return _updateRuntimeById(id, { connection: null }, state);
     }
 
     case NETWORK_LOCATIONS_UPDATED: {
       const { locations } = action;
       const networkRuntimes = locations.map(location => {
         const [ host, port ] = location.split(":");
         return {
-          connectionParameters: { host, port },
           id: location,
+          extra: {
+            connectionParameters: { host, port },
+          },
           name: location,
           type: RUNTIMES.NETWORK,
         };
       });
       return Object.assign({}, state, { networkRuntimes });
     }
 
     case UNWATCH_RUNTIME_SUCCESS: {
       return Object.assign({}, state, { selectedRuntimeId: null });
     }
 
     case USB_RUNTIMES_UPDATED: {
       const { runtimes } = action;
       const usbRuntimes = runtimes.map(runtime => {
         return {
-          connectionParameters: { socketPath: runtime._socketPath },
           id: runtime.id,
-          model: runtime._model,
-          name: runtime.name,
+          extra: {
+            connectionParameters: { socketPath: runtime._socketPath },
+            deviceName: runtime.deviceName,
+          },
+          name: runtime.shortName,
           type: RUNTIMES.USB,
         };
       });
       return Object.assign({}, state, { usbRuntimes });
     }
 
     case WATCH_RUNTIME_SUCCESS: {
       const { id } = action.runtime;
--- a/devtools/client/aboutdebugging-new/tmp-locale/en-US/aboutdebugging.notftl
+++ b/devtools/client/aboutdebugging-new/tmp-locale/en-US/aboutdebugging.notftl
@@ -8,16 +8,21 @@
 # Sidebar heading for selecting the currently running instance of Firefox
 about-debugging-sidebar-this-firefox =
   .name = This Firefox
 
 # Sidebar heading for connecting to some remote source
 about-debugging-sidebar-connect =
   .name = Connect
 
+# Connection status (connected) for runtime items in the sidebar
+aboutdebugging-sidebar-runtime-connection-status-connected = Connected
+# Connection status (disconnected) for runtime items in the sidebar
+aboutdebugging-sidebar-runtime-connection-status-disconnected = Disconnected
+
 # Text displayed in the about:debugging sidebar when no device was found.
 about-debugging-sidebar-no-devices = No devices discovered
 
 # Text displayed in buttons found in sidebar items representing remote runtimes.
 # Clicking on the button will attempt to connect to the runtime.
 about-debugging-sidebar-item-connect-button = Connect
 
 # Temporary text displayed in sidebar items representing remote runtimes after
@@ -168,13 +173,13 @@ about-debugging-worker-status-stopped = 
 # about:debugging, so such service workers are considered as registering.
 about-debugging-worker-status-registering = Registering
 
 # Displayed for runtime info in runtime pages.
 # { $name } is brand name such as "Firefox Nightly"
 # { $version } is version such as "64.0a1"
 about-debugging-runtime-info = { $name } ({ $version })
 
-# Displayed for runtime info in runtime page when we display the model as well.
+# Displayed for runtime info in runtime page when we display the device model as well.
 # { $name } is brand name such as "Firefox Nightly"
 # { $version } is version such as "64.0a1"
-# { $model } is model name of device
-about-debugging-runtime-info-with-model = { $name } on { $model } ({ $version })
+# { $deviceName } is model name of device
+about-debugging-runtime-info-with-model = { $name } on { $deviceName } ({ $version })
--- a/devtools/client/debugger/test/mochitest/head.js
+++ b/devtools/client/debugger/test/mochitest/head.js
@@ -1114,24 +1114,20 @@ function waitForWorkerListChanged(target
   return targetFront.once("workerListChanged");
 }
 
 function attachThread(workerClient, options) {
   info("Attaching to thread.");
   return workerClient.attachThread(options);
 }
 
-function waitForWorkerClose(workerClient) {
+async function waitForWorkerClose(workerClient) {
   info("Waiting for worker to close.");
-  return new Promise(function (resolve) {
-    workerClient.addOneTimeListener("close", function () {
-      info("Worker did close.");
-      resolve();
-    });
-  });
+  await workerClient.once("close");
+  info("Worker did close.");
 }
 
 function resume(threadClient) {
   info("Resuming thread.");
   return threadClient.resume();
 }
 
 function findSource(sources, url) {
--- a/devtools/client/jar.mn
+++ b/devtools/client/jar.mn
@@ -260,16 +260,18 @@ devtools.jar:
     skin/tooltip/arrow-horizontal-dark@2x.png (themes/tooltip/arrow-horizontal-dark@2x.png)
     skin/tooltip/arrow-vertical-dark.png (themes/tooltip/arrow-vertical-dark.png)
     skin/tooltip/arrow-vertical-dark@2x.png (themes/tooltip/arrow-vertical-dark@2x.png)
     skin/tooltip/arrow-horizontal-light.png (themes/tooltip/arrow-horizontal-light.png)
     skin/tooltip/arrow-horizontal-light@2x.png (themes/tooltip/arrow-horizontal-light@2x.png)
     skin/tooltip/arrow-vertical-light.png (themes/tooltip/arrow-vertical-light.png)
     skin/tooltip/arrow-vertical-light@2x.png (themes/tooltip/arrow-vertical-light@2x.png)
     skin/images/reload.svg (themes/images/reload.svg)
+    skin/images/file-type-general.svg (netmonitor/src/assets/icons/file-type-general.svg)
+    skin/images/file-type-image.svg (netmonitor/src/assets/icons/file-type-image.svg)
     skin/images/security-state-broken.svg (themes/images/security-state-broken.svg)
     skin/images/security-state-insecure.svg (themes/images/security-state-insecure.svg)
     skin/images/security-state-secure.svg (themes/images/security-state-secure.svg)
     skin/images/security-state-weak.svg (themes/images/security-state-weak.svg)
     skin/images/diff.svg (themes/images/diff.svg)
     skin/images/import.svg (themes/images/import.svg)
     skin/images/pane-collapse.svg (themes/images/pane-collapse.svg)
     skin/images/pane-expand.svg (themes/images/pane-expand.svg)
new file mode 100644
--- /dev/null
+++ b/devtools/client/netmonitor/src/assets/icons/file-type-general.svg
@@ -0,0 +1,7 @@
+<!-- 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/. -->
+<svg width="16" height="16" fill="#0B0B0B" fill-rule="evenodd" xmlns="http://www.w3.org/2000/svg">
+  <path d="M3 14.001L2.996 14h9.008l-.004.002V6l.293.707-4-4L9 3H3.003L3 2.999V14zm-1 0V3C2 2.447 2.449 2 3.003 2H9l4 4v8.002a.996.996 0 0 1-.996.998H2.996A.996.996 0 0 1 2 14.001z"/>
+  <path d="M4.5 9H11V8H4v1h.5zM4.5 11H11v-1H4v1h.5zM4.5 13H11v-1H4v1h.5zM4.5 5H7V4H4v1h.5zM4.5 7H7V6H4v1h.5zM8 7h5V6H9V2H8v5z"/>
+</svg>
new file mode 100644
--- /dev/null
+++ b/devtools/client/netmonitor/src/assets/icons/file-type-image.svg
@@ -0,0 +1,7 @@
+<!-- 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/. -->
+<svg width="16" height="16" fill="#0B0B0B" fill-rule="evenodd" xmlns="http://www.w3.org/2000/svg">
+  <path d="M3 14.001L2.996 14h9.008l-.004.002V6l.293.707-4-4L9 3H3.003L3 2.999V14zm-1 0V3C2 2.447 2.449 2 3.003 2H9l4 4v8.002a.996.996 0 0 1-.996.998H2.996A.996.996 0 0 1 2 14.001z"/>
+  <path d="M8 7h5V6H9V2H8v5z"/>
+</svg>
--- a/devtools/client/netmonitor/src/assets/styles/RequestList.css
+++ b/devtools/client/netmonitor/src/assets/styles/RequestList.css
@@ -278,16 +278,36 @@
 .requests-list-file {
   width: 40%;
 }
 
 .requests-list-file.requests-list-column {
   text-align: start;
 }
 
+.requests-file-type-icon {
+  display: inline-block;
+  width: 16px;
+  height: 16px;
+  margin: 0 4px;
+  vertical-align: text-bottom;
+}
+
+.request-list-item.selected .requests-file-type-icon {
+  filter: brightness(1.3);
+}
+
+.file-type-general {
+  background-image: url(chrome://devtools/skin/images/file-type-general.svg);
+}
+
+.file-type-image {
+  background-image: url(chrome://devtools/skin/images/file-type-image.svg);
+}
+
 /* Protocol column */
 
 .requests-list-protocol {
   width: 8%;
 }
 
 /* Cookies column */
 
--- a/devtools/client/netmonitor/src/components/RequestListColumnFile.js
+++ b/devtools/client/netmonitor/src/components/RequestListColumnFile.js
@@ -2,17 +2,17 @@
  * 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";
 
 const { Component } = require("devtools/client/shared/vendor/react");
 const dom = require("devtools/client/shared/vendor/react-dom-factories");
 const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
-const { propertiesEqual } = require("../utils/request-utils");
+const { propertiesEqual, getFileName } = require("../utils/request-utils");
 
 const { div } = dom;
 
 const UPDATED_FILE_PROPS = [
   "urlDetails",
 ];
 
 class RequestListColumnFile extends Component {
@@ -23,23 +23,34 @@ class RequestListColumnFile extends Comp
   }
 
   shouldComponentUpdate(nextProps) {
     return !propertiesEqual(UPDATED_FILE_PROPS, this.props.item, nextProps.item);
   }
 
   render() {
     const {
-      item: { urlDetails },
+      item: { urlDetails, cause },
     } = this.props;
+    const iconClassList = ["requests-file-type-icon"];
+
+    if (cause && cause.type == "img") {
+      iconClassList.push("file-type-image");
+    } else {
+      iconClassList.push("file-type-general");
+    }
 
     return (
       div({
         className: "requests-list-column requests-list-file",
-        title: urlDetails.unicodeUrl,
+        title: urlDetails.unicodeUrl
       },
+        div({
+          className: iconClassList.join(" "),
+          title: getFileName(urlDetails.baseNameWithQuery) || urlDetails.unicodeUrl,
+        }),
         urlDetails.baseNameWithQuery
       )
     );
   }
 }
 
 module.exports = RequestListColumnFile;
--- a/devtools/client/netmonitor/src/utils/request-utils.js
+++ b/devtools/client/netmonitor/src/utils/request-utils.js
@@ -148,16 +148,27 @@ function getAbbreviatedMimeType(mimeType
   if (!mimeType) {
     return "";
   }
   const abbrevType = (mimeType.split(";")[0].split("/")[1] || "").split("+")[0];
   return CONTENT_MIME_TYPE_ABBREVIATIONS[abbrevType] || abbrevType;
 }
 
 /**
+ * Helpers for getting a filename from a mime type.
+ *
+ * @param {string} baseNameWithQuery - unicode basename and query of a url
+ * @return {string} unicode filename portion of a url
+ */
+function getFileName(baseNameWithQuery) {
+  const basename = baseNameWithQuery && baseNameWithQuery.split("?")[0];
+  return basename && basename.includes(".") ? basename : null;
+}
+
+/**
  * Helpers for retrieving a URL object from a string
  *
  * @param {string} url - unvalidated url string
  * @return {URL} The URL object
  */
 function getUrl(url) {
   try {
     return new URL(url);
@@ -519,16 +530,17 @@ function processNetworkUpdates(update, r
 module.exports = {
   decodeUnicodeBase64,
   getFormDataSections,
   fetchHeaders,
   fetchNetworkUpdatePacket,
   formDataURI,
   writeHeaderText,
   getAbbreviatedMimeType,
+  getFileName,
   getEndTime,
   getFormattedProtocol,
   getResponseHeader,
   getResponseTime,
   getStartTime,
   getUrlBaseName,
   getUrlBaseNameWithQuery,
   getUrlDetails,
--- a/devtools/client/shared/components/menu/MenuButton.js
+++ b/devtools/client/shared/components/menu/MenuButton.js
@@ -10,16 +10,18 @@
 const Services = require("Services");
 const flags = require("devtools/shared/flags");
 const { createRef, PureComponent } = require("devtools/client/shared/vendor/react");
 const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
 const dom = require("devtools/client/shared/vendor/react-dom-factories");
 const { button } = dom;
 const { HTMLTooltip } = require("devtools/client/shared/widgets/tooltip/HTMLTooltip");
 
+const isMacOS = Services.appinfo.OS === "Darwin";
+
 loader.lazyRequireGetter(this, "createPortal", "devtools/client/shared/vendor/react-dom", true);
 
 // Return a copy of |obj| minus |fields|.
 const omit = (obj, fields) => {
   const objCopy = { ...obj };
   for (const field of fields) {
     delete objCopy[field];
   }
@@ -341,16 +343,26 @@ class MenuButton extends PureComponent {
 
       case "ArrowUp":
         if (isButtonFocussed && this.tooltip) {
           if (this.tooltip.focusEnd()) {
             e.preventDefault();
           }
         }
         break;
+      case "t":
+        if (isMacOS && e.metaKey || !isMacOS && e.ctrlKey) {
+          // Close the menu if the user opens a new tab while it is still open.
+          //
+          // Bug 1499271: Once toolbox has been converted to XUL we should watch
+          // for the 'visibilitychange' event instead of explicitly looking for
+          // Ctrl+T.
+          this.hideMenu();
+        }
+        break;
     }
   }
 
   render() {
     const buttonProps = {
       // Pass through any props set on the button, except the ones we handle
       // here.
       ...omit(this.props, Object.keys(MenuButton.propTypes)),
--- a/devtools/client/shared/test/browser.ini
+++ b/devtools/client/shared/test/browser.ini
@@ -49,16 +49,18 @@ support-files =
   leakhunt.js
   shared-head.js
   shared-redux-head.js
   telemetry-test-helpers.js
   test-actor-registry.js
   test-actor.js
   testactors.js
   !/devtools/client/responsive.html/test/browser/devices.json
+  !/devtools/client/debugger/new/test/mochitest/helpers.js
+  !/devtools/client/debugger/new/test/mochitest/helpers/context.js
 
 [browser_autocomplete_popup.js]
 [browser_css_angle.js]
 [browser_css_color.js]
 [browser_cubic-bezier-01.js]
 [browser_cubic-bezier-02.js]
 [browser_cubic-bezier-03.js]
 [browser_cubic-bezier-04.js]
@@ -238,9 +240,9 @@ skip-if = e10s && debug
 skip-if = true # bug 1368569
 [browser_dbg_worker-console-02.js]
 skip-if = e10s && debug
 [browser_dbg_worker-console-03.js]
 skip-if = debug # bug 1334683
 [browser_dbg_worker-console-04.js]
 skip-if = e10s && debug
 [browser_dbg_WorkerTargetActor.attach.js]
-skip-if = e10s && debug
\ No newline at end of file
+skip-if = e10s && debug
--- a/devtools/client/shared/test/helper_workers.js
+++ b/devtools/client/shared/test/helper_workers.js
@@ -118,24 +118,20 @@ function attachWorker(tabClient, worker)
   return tabClient.attachWorker(worker.actor);
 }
 
 function attachThread(workerClient, options) {
   info("Attaching to thread.");
   return workerClient.attachThread(options);
 }
 
-function waitForWorkerClose(workerClient) {
+async function waitForWorkerClose(workerClient) {
   info("Waiting for worker to close.");
-  return new Promise(function(resolve) {
-    workerClient.addOneTimeListener("close", function() {
-      info("Worker did close.");
-      resolve();
-    });
-  });
+  await workerClient.once("close");
+  info("Worker did close.");
 }
 
 // Return a promise with a reference to jsterm, opening the split
 // console if necessary.  This cleans up the split console pref so
 // it won't pollute other tests.
 function getSplitConsole(toolbox, win) {
   if (!win) {
     win = toolbox.win;
--- a/devtools/client/shared/widgets/tooltip/HTMLTooltip.js
+++ b/devtools/client/shared/widgets/tooltip/HTMLTooltip.js
@@ -484,17 +484,17 @@ HTMLTooltip.prototype = {
 
   _updateContainerBounds(anchor, {position, x = 0, y = 0} = {}) {
     // Get anchor geometry
     let anchorRect = getRelativeRect(anchor, this.doc);
     if (this.useXulWrapper) {
       anchorRect = this._convertToScreenRect(anchorRect);
     }
 
-    const { viewportRect, windowRect } = this._getBoundingRects();
+    const { viewportRect, windowRect } = this._getBoundingRects(anchorRect);
 
     // Calculate the horizonal position and width
     let preferredWidth;
     // Record the height too since it might save us from having to look it up
     // later.
     let measuredHeight;
     if (this.preferredWidth === "auto") {
       // Reset any styles that constrain the dimensions we want to calculate.
@@ -608,25 +608,31 @@ HTMLTooltip.prototype = {
    * - Window rect: This is the bounds of the view in which the tooltip is
    *   presented. It is reported in the same coordinates as the viewport
    *   rect and is used for determining in which direction a doorhanger-type
    *   tooltip should "hang".
    *   When using the XUL panel wrapper this will be the dimensions of the
    *   window in screen coordinates. Otherwise it will be the same as the
    *   viewport rect.
    *
+   * @param {Object} anchorRect
+   *        DOMRect-like object of the target anchor element.
+   *        We need to pass this to detect the case when the anchor is not in
+   *        the current window (because, the center of the window is in
+   *        a different window to the anchor).
+   *
    * @return {Object} An object with the following properties
    *         viewportRect {Object} DOMRect-like object with the Number
    *                      properties: top, right, bottom, left, width, height
    *                      representing the viewport rect.
    *         windowRect   {Object} DOMRect-like object with the Number
    *                      properties: top, right, bottom, left, width, height
-   *                      representing the viewport rect.
+   *                      representing the window rect.
    */
-  _getBoundingRects: function() {
+  _getBoundingRects: function(anchorRect) {
     let viewportRect;
     let windowRect;
 
     if (this.useXulWrapper) {
       // availLeft/Top are the coordinates first pixel available on the screen
       // for applications (excluding space dedicated for OS toolbars, menus
       // etc...)
       // availWidth/Height are the dimensions available to applications
@@ -655,16 +661,35 @@ HTMLTooltip.prototype = {
       windowRect = {
         top: screenY,
         right: screenX + outerWidth,
         bottom: screenY + outerHeight,
         left: screenX,
         width: outerWidth,
         height: outerHeight,
       };
+
+      // If the anchor is outside the viewport, it possibly means we have a
+      // multi-monitor environment where the anchor is displayed on a different
+      // monitor to the "current" screen (as determined by the center of the
+      // window). This can happen when, for example, the screen is spread across
+      // two monitors.
+      //
+      // In this case we simply expand viewport in the direction of the anchor
+      // so that we can still calculate the popup position correctly.
+      if (anchorRect.left > viewportRect.right) {
+        const diffWidth = windowRect.right - viewportRect.right;
+        viewportRect.right += diffWidth;
+        viewportRect.width += diffWidth;
+      }
+      if (anchorRect.right < viewportRect.left) {
+        const diffWidth = viewportRect.left - windowRect.left;
+        viewportRect.left -= diffWidth;
+        viewportRect.width += diffWidth;
+      }
     } else {
       viewportRect = windowRect =
         this.doc.documentElement.getBoundingClientRect();
     }
 
     return { viewportRect, windowRect };
   },
 
--- a/devtools/shared/adb/adb-scanner.js
+++ b/devtools/shared/adb/adb-scanner.js
@@ -139,43 +139,57 @@ FirefoxOnAndroidRuntime.detect = async f
     dumpn("Found " + runtime.name);
     runtimes.push(runtime);
   }
   return runtimes;
 };
 
 FirefoxOnAndroidRuntime.prototype = Object.create(Runtime.prototype);
 
+FirefoxOnAndroidRuntime.prototype._channel = function() {
+  const packageName = this._packageName();
+
+  switch (packageName) {
+    case "org.mozilla.firefox":
+      return "";
+    case "org.mozilla.firefox_beta":
+      return "Beta";
+    case "org.mozilla.fennec":
+    case "org.mozilla.fennec_aurora":
+      // This package name is now the one for Firefox Nightly distributed
+      // through the Google Play Store since "dawn project"
+      // cf. https://bugzilla.mozilla.org/show_bug.cgi?id=1357351#c8
+      return "Nightly";
+    default:
+      return "Custom";
+  }
+};
+
+FirefoxOnAndroidRuntime.prototype._packageName = function() {
+  // If using abstract socket address, it is "@org.mozilla.firefox/..."
+  // If using path base socket, it is "/data/data/<package>...""
+  // Until Fennec 62 only supports path based UNIX domain socket, but
+  // Fennec 63+ supports both path based and abstract socket.
+  return this._socketPath.startsWith("@") ?
+    this._socketPath.substr(1).split("/")[0] :
+    this._socketPath.split("/")[3];
+};
+
+Object.defineProperty(FirefoxOnAndroidRuntime.prototype, "shortName", {
+  get() {
+    return `Firefox ${this._channel()}`;
+  }
+});
+
+Object.defineProperty(FirefoxOnAndroidRuntime.prototype, "deviceName", {
+  get() {
+    return this._model || this.device.id;
+  }
+});
+
 Object.defineProperty(FirefoxOnAndroidRuntime.prototype, "name", {
   get() {
-    // If using abstract socket address, it is "@org.mozilla.firefox/..."
-    // If using path base socket, it is "/data/data/<package>...""
-    // Until Fennec 62 only supports path based UNIX domain socket, but
-    // Fennec 63+ supports both path based and abstract socket.
-    const packageName = this._socketPath.startsWith("@") ?
-                        this._socketPath.substr(1).split("/")[0] :
-                        this._socketPath.split("/")[3];
-    let channel;
-    switch (packageName) {
-      case "org.mozilla.firefox":
-        channel = "";
-        break;
-      case "org.mozilla.firefox_beta":
-        channel = " Beta";
-        break;
-      case "org.mozilla.fennec_aurora":
-        // This package name is now the one for Firefox Nightly distributed
-        // through the Google Play Store since "dawn project"
-        // cf. https://bugzilla.mozilla.org/show_bug.cgi?id=1357351#c8
-        channel = " Nightly";
-        break;
-      case "org.mozilla.fennec":
-        channel = " Nightly";
-        break;
-      default:
-        channel = " Custom";
-    }
-    return "Firefox" + channel + " on Android (" +
-           (this._model || this.device.id) + ")";
+    const channel = this._channel();
+    return "Firefox " + channel + " on Android (" + this.deviceName + ")";
   }
 });
 
 exports.ADBScanner = ADBScanner;
--- a/devtools/shared/client/debugger-client.js
+++ b/devtools/shared/client/debugger-client.js
@@ -20,18 +20,18 @@ const {
 loader.lazyRequireGetter(this, "Authentication", "devtools/shared/security/auth");
 loader.lazyRequireGetter(this, "DebuggerSocket", "devtools/shared/security/socket", true);
 loader.lazyRequireGetter(this, "EventEmitter", "devtools/shared/event-emitter");
 
 loader.lazyRequireGetter(this, "WebConsoleClient", "devtools/shared/webconsole/client", true);
 loader.lazyRequireGetter(this, "AddonClient", "devtools/shared/client/addon-client");
 loader.lazyRequireGetter(this, "RootClient", "devtools/shared/client/root-client");
 loader.lazyRequireGetter(this, "BrowsingContextFront", "devtools/shared/fronts/targets/browsing-context", true);
+loader.lazyRequireGetter(this, "WorkerTargetFront", "devtools/shared/fronts/targets/worker", true);
 loader.lazyRequireGetter(this, "ThreadClient", "devtools/shared/client/thread-client");
-loader.lazyRequireGetter(this, "WorkerClient", "devtools/shared/client/worker-client");
 loader.lazyRequireGetter(this, "ObjectClient", "devtools/shared/client/object-client");
 loader.lazyRequireGetter(this, "Pool", "devtools/shared/protocol", true);
 loader.lazyRequireGetter(this, "Front", "devtools/shared/protocol", true);
 
 // Retrieve the major platform version, i.e. if we are on Firefox 64.0a1, it will be 64.
 const PLATFORM_MAJOR_VERSION = AppConstants.MOZ_APP_VERSION.match(/\d+/)[0];
 
 // Define the minimum officially supported version of Firefox when connecting to a remote
@@ -375,32 +375,25 @@ DebuggerClient.prototype = {
       front = new BrowsingContextFront(this, { actor: targetActor });
       this._frontPool.manage(front);
     }
 
     const response = await front.attach();
     return [response, front];
   },
 
-  attachWorker: function(workerTargetActor) {
-    let workerClient = this._clients.get(workerTargetActor);
-    if (workerClient !== undefined) {
-      const response = {
-        from: workerClient.actor,
-        type: "attached",
-        url: workerClient.url
-      };
-      return promise.resolve([response, workerClient]);
+  attachWorker: async function(workerTargetActor) {
+    let front = this._frontPool.actor(workerTargetActor);
+    if (!front) {
+      front = new WorkerTargetFront(this, { actor: workerTargetActor });
+      this._frontPool.manage(front);
     }
 
-    return this.request({ to: workerTargetActor, type: "attach" }).then(response => {
-      workerClient = new WorkerClient(this, response);
-      this.registerClient(workerClient);
-      return [response, workerClient];
-    });
+    const response = await front.attach();
+    return [response, front];
   },
 
   /**
    * Attach to an addon target actor.
    *
    * @param string addonTargetActor
    *        The actor ID for the addon to attach.
    */
--- a/devtools/shared/client/moz.build
+++ b/devtools/shared/client/moz.build
@@ -15,10 +15,9 @@ DevToolsModules(
     'event-source.js',
     'long-string-client.js',
     'object-client.js',
     'property-iterator-client.js',
     'root-client.js',
     'source-client.js',
     'symbol-iterator-client.js',
     'thread-client.js',
-    'worker-client.js',
 )
deleted file mode 100644
--- a/devtools/shared/client/worker-client.js
+++ /dev/null
@@ -1,104 +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";
-
-const {DebuggerClient} = require("devtools/shared/client/debugger-client");
-const eventSource = require("devtools/shared/client/event-source");
-loader.lazyRequireGetter(this, "ThreadClient", "devtools/shared/client/thread-client");
-
-function WorkerClient(client, form) {
-  this.client = client;
-  this._actor = form.from;
-  this._isClosed = false;
-  this._url = form.url;
-
-  this._onClose = this._onClose.bind(this);
-
-  this.addListener("close", this._onClose);
-
-  this.traits = {};
-}
-
-WorkerClient.prototype = {
-  get _transport() {
-    return this.client._transport;
-  },
-
-  get request() {
-    return this.client.request;
-  },
-
-  get actor() {
-    return this._actor;
-  },
-
-  get url() {
-    return this._url;
-  },
-
-  get isClosed() {
-    return this._isClosed;
-  },
-
-  detach: DebuggerClient.requester({ type: "detach" }, {
-    after: function(response) {
-      if (this.thread) {
-        this.client.unregisterClient(this.thread);
-      }
-      this.client.unregisterClient(this);
-      return response;
-    },
-  }),
-
-  attachThread: function(options = {}) {
-    if (this.thread) {
-      const response = [{
-        type: "connected",
-        threadActor: this.thread._actor,
-        consoleActor: this.consoleActor,
-      }, this.thread];
-      return response;
-    }
-
-    // The connect call on server doesn't attach the thread as of version 44.
-    return this.request({
-      to: this._actor,
-      type: "connect",
-      options,
-    }).then(connectResponse => {
-      return this.request({
-        to: connectResponse.threadActor,
-        type: "attach",
-        options,
-      }).then(attachResponse => {
-        this.thread = new ThreadClient(this, connectResponse.threadActor);
-        this.consoleActor = connectResponse.consoleActor;
-        this.client.registerClient(this.thread);
-
-        return [connectResponse, this.thread];
-      });
-    });
-  },
-
-  _onClose: function() {
-    this.removeListener("close", this._onClose);
-
-    if (this.thread) {
-      this.client.unregisterClient(this.thread);
-    }
-    this.client.unregisterClient(this);
-    this._isClosed = true;
-  },
-
-  reconfigure: function() {
-    return Promise.resolve();
-  },
-
-  events: ["close"]
-};
-
-eventSource(WorkerClient.prototype);
-
-module.exports = WorkerClient;
--- a/devtools/shared/fronts/targets/moz.build
+++ b/devtools/shared/fronts/targets/moz.build
@@ -1,9 +1,10 @@
 # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
 # 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/.
 
 DevToolsModules(
     'browsing-context.js',
+    'worker.js',
 )
new file mode 100644
--- /dev/null
+++ b/devtools/shared/fronts/targets/worker.js
@@ -0,0 +1,100 @@
+/* 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";
+
+const {workerTargetSpec} = require("devtools/shared/specs/targets/worker");
+const protocol = require("devtools/shared/protocol");
+const {custom} = protocol;
+
+loader.lazyRequireGetter(this, "ThreadClient", "devtools/shared/client/thread-client");
+
+const WorkerTargetFront = protocol.FrontClassWithSpec(workerTargetSpec, {
+  initialize: function(client, form) {
+    protocol.Front.prototype.initialize.call(this, client, form);
+
+    this.thread = null;
+    this.traits = {};
+
+    // TODO: remove once ThreadClient becomes a front
+    this.client = client;
+
+    this._isClosed = false;
+
+    this.destroy = this.destroy.bind(this);
+    this.on("close", this.destroy);
+  },
+
+  get isClosed() {
+    return this._isClosed;
+  },
+
+  destroy: function() {
+    this.off("close", this.destroy);
+    this._isClosed = true;
+
+    if (this.thread) {
+      this.client.unregisterClient(this.thread);
+    }
+
+    this.unmanage(this);
+
+    protocol.Front.prototype.destroy.call(this);
+  },
+
+  attach: custom(async function() {
+    const response = await this._attach();
+
+    this.url = response.url;
+
+    return response;
+  }, {
+    impl: "_attach"
+  }),
+
+  detach: custom(async function() {
+    let response;
+    try {
+      response = await this._detach();
+    } catch (e) {
+      console.warn(`Error while detaching the worker target front: ${e.message}`);
+    }
+    this.destroy();
+    return response;
+  }, {
+    impl: "_detach"
+  }),
+
+  reconfigure: function() {
+    // Toolbox and options panel are calling this method but Worker Target can't be
+    // reconfigured. So we ignore this call here.
+    return Promise.resolve();
+  },
+
+  attachThread: async function(options = {}) {
+    if (this.thread) {
+      const response = [{
+        type: "connected",
+        threadActor: this.thread._actor,
+        consoleActor: this.consoleActor,
+      }, this.thread];
+      return response;
+    }
+
+    // The connect call on server doesn't attach the thread as of version 44.
+    const connectResponse = await this.connect(options);
+    await this.client.request({
+      to: connectResponse.threadActor,
+      type: "attach",
+      options,
+    });
+    this.thread = new ThreadClient(this, connectResponse.threadActor);
+    this.consoleActor = connectResponse.consoleActor;
+    this.client.registerClient(this.thread);
+
+    return [connectResponse, this.thread];
+  },
+
+});
+
+exports.WorkerTargetFront = WorkerTargetFront;
--- a/devtools/shared/specs/targets/worker.js
+++ b/devtools/shared/specs/targets/worker.js
@@ -23,11 +23,24 @@ const workerTargetSpec = generateActorSp
       },
       response: RetVal("json")
     },
     push: {
       request: {},
       response: RetVal("json")
     },
   },
+
+  events: {
+    // WorkerTargetActor still uses old sendActorEvent function,
+    // but it should use emit instead.
+    close: {
+      type: "close",
+    },
+    // newSource is being sent by ThreadActor in the name of its parent,
+    // i.e. WorkerTargetActor
+    newSource: {
+      type: "newSource",
+    }
+  }
 });
 
 exports.workerTargetSpec = workerTargetSpec;
deleted file mode 100644
--- a/dom/base/FeedWriterEnabled.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-/* 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/. */
-
-#include "js/TypeDecls.h"
-#include "nsContentUtils.h"
-
-namespace mozilla {
-
-struct FeedWriterEnabled {
-  static bool IsEnabled(JSContext* cx, JSObject* aGlobal)
-  {
-    return nsContentUtils::IsSpecificAboutPage(aGlobal, "about:feeds");
-  }
-};
-
-}
--- a/dom/base/moz.build
+++ b/dom/base/moz.build
@@ -124,17 +124,16 @@ EXPORTS += [
 if CONFIG['MOZ_WEBRTC']:
     EXPORTS += [
         'nsDOMDataChannel.h',
         'nsDOMDataChannelDeclarations.h',
     ]
 
 EXPORTS.mozilla += [
     'CORSMode.h',
-    'FeedWriterEnabled.h',
     'FlushType.h',
     'FullscreenChange.h',
     'RangeBoundary.h',
     'SelectionChangeEventDispatcher.h',
     'TextInputProcessor.h',
     'UseCounter.h',
 ]
 
deleted file mode 100644
--- a/dom/webidl/BrowserFeedWriter.webidl
+++ /dev/null
@@ -1,20 +0,0 @@
-/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* 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/.
- */
-
-[JSImplementation="@mozilla.org/browser/feeds/result-writer;1",
- Func="mozilla::FeedWriterEnabled::IsEnabled",
- Constructor]
-interface BrowserFeedWriter {
-  /**
-   * Writes the feed content, assumes that the feed writer is initialized.
-   */
-  void writeContent();
-
-  /**
-   * Uninitialize the feed writer.
-   */
-  void close();
-};
--- a/dom/webidl/moz.build
+++ b/dom/webidl/moz.build
@@ -1086,21 +1086,16 @@ if CONFIG['MOZ_WEBRTC']:
 
 if CONFIG['MOZ_WEBSPEECH']:
     GENERATED_EVENTS_WEBIDL_FILES += [
         'SpeechRecognitionEvent.webidl',
         'SpeechSynthesisErrorEvent.webidl',
         'SpeechSynthesisEvent.webidl',
     ]
 
-if CONFIG['MOZ_BUILD_APP'] in ['browser', 'xulrunner'] or CONFIG['MOZ_SUITE']:
-    WEBIDL_FILES += [
-        'BrowserFeedWriter.webidl',
-    ]
-
 if CONFIG['MOZ_BUILD_APP'] in ['browser', 'mobile/android', 'xulrunner']:
     WEBIDL_FILES += [
         'External.webidl',
     ]
 
 if CONFIG['ACCESSIBILITY']:
     WEBIDL_FILES += [
         'AccessibleNode.webidl',
--- a/dom/xul/XULTooltipElement.cpp
+++ b/dom/xul/XULTooltipElement.cpp
@@ -22,55 +22,55 @@ NS_NewXULTooltipElement(already_AddRefed
 }
 
 nsresult
 XULTooltipElement::Init()
 {
   // Create the default child label node that will contain the text of the
   // tooltip.
   RefPtr<mozilla::dom::NodeInfo> nodeInfo;
-  nodeInfo = mNodeInfo->NodeInfoManager()->GetNodeInfo(nsGkAtoms::label,
+  nodeInfo = mNodeInfo->NodeInfoManager()->GetNodeInfo(nsGkAtoms::description,
                                                        nullptr,
                                                        kNameSpaceID_XUL,
                                                        nsINode::ELEMENT_NODE);
-  nsCOMPtr<Element> label;
-  nsresult rv = NS_NewXULElement(getter_AddRefs(label),
+  nsCOMPtr<Element> description;
+  nsresult rv = NS_NewXULElement(getter_AddRefs(description),
                                  nodeInfo.forget(), dom::NOT_FROM_PARSER);
   NS_ENSURE_SUCCESS(rv, rv);
-  label->SetAttr(kNameSpaceID_None, nsGkAtoms::_class,
+  description->SetAttr(kNameSpaceID_None, nsGkAtoms::_class,
                  NS_LITERAL_STRING("tooltip-label"), false);
-  label->SetAttr(kNameSpaceID_None, nsGkAtoms::flex,
+  description->SetAttr(kNameSpaceID_None, nsGkAtoms::flex,
                  NS_LITERAL_STRING("true"), false);
   ErrorResult error;
-  AppendChild(*label, error);
+  AppendChild(*description, error);
 
   return error.StealNSResult();
 }
 
 nsresult
 XULTooltipElement::AfterSetAttr(int32_t aNameSpaceID, nsAtom* aName,
                                 const nsAttrValue* aValue,
                                 const nsAttrValue* aOldValue,
                                 nsIPrincipal* aSubjectPrincipal,
                                 bool aNotify)
 {
   if (aNameSpaceID == kNameSpaceID_None && aName == nsGkAtoms::label) {
     // When the label attribute of this node changes propagate the text down
-    // into child label element.
-    nsCOMPtr<nsIContent> label = GetFirstChild();
-    if (label && label->IsXULElement(nsGkAtoms::label)) {
+    // into child description element.
+    nsCOMPtr<nsIContent> description = GetFirstChild();
+    if (description && description->IsXULElement(nsGkAtoms::description)) {
       nsAutoString value;
       if (aValue) {
         aValue->ToString(value);
       }
       nsContentUtils::AddScriptRunner(NS_NewRunnableFunction(
         "XULTooltipElement::AfterSetAttr",
-        [label, value]() {
-          Element* labelElement = label->AsElement();
-          labelElement->SetTextContent(value, IgnoreErrors());
+        [description, value]() {
+          Element* descriptionElement = description->AsElement();
+          descriptionElement->SetTextContent(value, IgnoreErrors());
         })
       );
     }
   }
   return nsXULElement::AfterSetAttr(aNameSpaceID, aName, aValue, aOldValue,
                                     aSubjectPrincipal, aNotify);
 }
 
--- a/gfx/layers/ipc/CompositorBridgeParent.h
+++ b/gfx/layers/ipc/CompositorBridgeParent.h
@@ -476,17 +476,17 @@ public:
 #endif
   RefPtr<APZSampler> GetAPZSampler();
   RefPtr<APZUpdater> GetAPZUpdater();
 
   CompositorOptions GetOptions() const {
     return mOptions;
   }
 
-  TimeDuration GetVsyncInterval() const {
+  TimeDuration GetVsyncInterval() const override {
     // the variable is called "rate" but really it's an interval
     return mVsyncRate;
   }
 
   PWebRenderBridgeParent* AllocPWebRenderBridgeParent(const wr::PipelineId& aPipelineId,
                                                       const LayoutDeviceIntSize& aSize) override;
   bool DeallocPWebRenderBridgeParent(PWebRenderBridgeParent* aActor) override;
   RefPtr<WebRenderBridgeParent> GetWebRenderBridgeParent() const;
--- a/gfx/layers/ipc/CompositorVsyncScheduler.cpp
+++ b/gfx/layers/ipc/CompositorVsyncScheduler.cpp
@@ -71,17 +71,16 @@ CompositorVsyncScheduler::Observer::Dest
   mOwner = nullptr;
 }
 
 CompositorVsyncScheduler::CompositorVsyncScheduler(CompositorVsyncSchedulerOwner* aVsyncSchedulerOwner,
                                                    widget::CompositorWidget* aWidget)
   : mVsyncSchedulerOwner(aVsyncSchedulerOwner)
   , mLastCompose(TimeStamp::Now())
   , mIsObservingVsync(false)
-  , mNeedsComposite(0)
   , mVsyncNotificationsSkipped(0)
   , mWidget(aWidget)
   , mCurrentCompositeTaskMonitor("CurrentCompositeTaskMonitor")
   , mCurrentCompositeTask(nullptr)
   , mCurrentVRTaskMonitor("CurrentVRTaskMonitor")
   , mCurrentVRTask(nullptr)
 {
   mVsyncObserver = new Observer(this);
@@ -109,17 +108,17 @@ CompositorVsyncScheduler::Destroy()
   if (!mVsyncObserver) {
     // Destroy was already called on this object.
     return;
   }
   UnobserveVsync();
   mVsyncObserver->Destroy();
   mVsyncObserver = nullptr;
 
-  mNeedsComposite = 0;
+  mCompositeRequestedAt = TimeStamp();
   CancelCurrentCompositeTask();
 }
 
 void
 CompositorVsyncScheduler::PostCompositeTask(TimeStamp aCompositeTimestamp)
 {
   MonitorAutoLock lock(mCurrentCompositeTaskMonitor);
   if (mCurrentCompositeTask == nullptr && CompositorThreadHolder::Loop()) {
@@ -157,28 +156,31 @@ CompositorVsyncScheduler::ScheduleCompos
     return;
   }
 
   if (mAsapScheduling) {
     // Used only for performance testing purposes, and when recording/replaying
     // to ensure that graphics are up to date.
     PostCompositeTask(TimeStamp::Now());
 #ifdef MOZ_WIDGET_ANDROID
-  } else if (mNeedsComposite >= 2 && mIsObservingVsync) {
-    // uh-oh, we already requested a composite at least twice so far, and a
+  } else if (mIsObservingVsync && mCompositeRequestedAt &&
+      (TimeStamp::Now() - mCompositeRequestedAt) >= mVsyncSchedulerOwner->GetVsyncInterval() * 2) {
+    // uh-oh, we already requested a composite at least two vsyncs ago, and a
     // composite hasn't happened yet. It is possible that the vsync observation
     // is blocked on the main thread, so let's just composite ASAP and not
     // wait for the vsync. Note that this should only ever happen on Fennec
     // because there content runs in the same process as the compositor, and so
     // content can actually block the main thread in this process.
     PostCompositeTask(TimeStamp::Now());
 #endif
   } else {
-    mNeedsComposite++;
-    if (!mIsObservingVsync && mNeedsComposite) {
+    if (!mCompositeRequestedAt) {
+      mCompositeRequestedAt = TimeStamp::Now();
+    }
+    if (!mIsObservingVsync && mCompositeRequestedAt) {
       ObserveVsync();
       // Starting to observe vsync is an async operation that goes
       // through the main thread of the UI process. It's possible that
       // we're blocking there waiting on a composite, so schedule an initial
       // one now to get things started.
       PostCompositeTask(TimeStamp::Now());
     }
   }
@@ -231,18 +233,18 @@ CompositorVsyncScheduler::Composite(Time
     if (mVsyncSchedulerOwner->IsPendingComposite()) {
       // If previous composite is still on going, finish it and wait for the
       // next vsync.
       mVsyncSchedulerOwner->FinishPendingComposite();
       return;
     }
   }
 
-  if (mNeedsComposite || mAsapScheduling) {
-    mNeedsComposite = 0;
+  if (mCompositeRequestedAt || mAsapScheduling) {
+    mCompositeRequestedAt = TimeStamp();
     mLastCompose = aVsyncTimestamp;
 
     // Tell the owner to do a composite
     mVsyncSchedulerOwner->CompositeToTarget(nullptr, nullptr);
 
     mVsyncNotificationsSkipped = 0;
 
     TimeDuration compositeFrameTotal = TimeStamp::Now() - aVsyncTimestamp;
@@ -257,17 +259,17 @@ void
 CompositorVsyncScheduler::ForceComposeToTarget(gfx::DrawTarget* aTarget, const IntRect* aRect)
 {
   MOZ_ASSERT(CompositorThreadHolder::IsInCompositorThread());
 
   /**
    * bug 1138502 - There are cases such as during long-running window resizing
    * events where we receive many force-composites. We also continue to get
    * vsync notifications. Because the force-composites trigger compositing and
-   * clear the mNeedsComposite counter, the vsync notifications will not need
+   * clear the mCompositeRequestedAt timestamp, the vsync notifications will not need
    * to do anything and so will increment the mVsyncNotificationsSkipped counter
    * to indicate the vsync was ignored. If this happens enough times, we will
    * disable listening for vsync entirely. On the next force-composite we will
    * enable listening for vsync again, and continued force-composites and vsyncs
    * will cause oscillation between observing vsync and not.
    * On some platforms, enabling/disabling vsync is not free and this
    * oscillating behavior causes a performance hit. In order to avoid this
    * problem, we reset the mVsyncNotificationsSkipped counter to keep vsync
@@ -279,24 +281,24 @@ CompositorVsyncScheduler::ForceComposeTo
   MOZ_ASSERT(mVsyncSchedulerOwner);
   mVsyncSchedulerOwner->CompositeToTarget(aTarget, aRect);
 }
 
 bool
 CompositorVsyncScheduler::NeedsComposite()
 {
   MOZ_ASSERT(CompositorThreadHolder::IsInCompositorThread());
-  return mNeedsComposite;
+  return (bool)mCompositeRequestedAt;
 }
 
 bool
 CompositorVsyncScheduler::FlushPendingComposite()
 {
   MOZ_ASSERT(CompositorThreadHolder::IsInCompositorThread());
-  if (mNeedsComposite) {
+  if (mCompositeRequestedAt) {
     CancelCurrentCompositeTask();
     ForceComposeToTarget(nullptr, nullptr);
     return true;
   }
   return false;
 }
 
 void
--- a/gfx/layers/ipc/CompositorVsyncScheduler.h
+++ b/gfx/layers/ipc/CompositorVsyncScheduler.h
@@ -136,17 +136,17 @@ private:
     CompositorVsyncScheduler* mOwner;
   };
 
   CompositorVsyncSchedulerOwner* mVsyncSchedulerOwner;
   TimeStamp mLastCompose;
 
   bool mAsapScheduling;
   bool mIsObservingVsync;
-  uint32_t mNeedsComposite;
+  TimeStamp mCompositeRequestedAt;
   int32_t mVsyncNotificationsSkipped;
   widget::CompositorWidget* mWidget;
   RefPtr<CompositorVsyncScheduler::Observer> mVsyncObserver;
 
   mozilla::Monitor mCurrentCompositeTaskMonitor;
   RefPtr<CancelableRunnable> mCurrentCompositeTask;
 
   mozilla::Monitor mCurrentVRTaskMonitor;
--- a/gfx/layers/ipc/CompositorVsyncSchedulerOwner.h
+++ b/gfx/layers/ipc/CompositorVsyncSchedulerOwner.h
@@ -16,14 +16,15 @@ class DrawTarget;
 namespace layers {
 
 class CompositorVsyncSchedulerOwner
 {
 public:
   virtual bool IsPendingComposite() = 0;
   virtual void FinishPendingComposite() = 0;
   virtual void CompositeToTarget(gfx::DrawTarget* aTarget, const gfx::IntRect* aRect = nullptr) = 0;
+  virtual TimeDuration GetVsyncInterval() const = 0;
 };
 
 } // namespace layers
 } // namespace mozilla
 
 #endif // mozilla_layers_CompositorVsyncSchedulerOwner_h
--- a/gfx/layers/wr/WebRenderBridgeParent.cpp
+++ b/gfx/layers/wr/WebRenderBridgeParent.cpp
@@ -1602,16 +1602,27 @@ WebRenderBridgeParent::CompositeToTarget
     // Render thread is busy, try next time.
     mCompositorScheduler->ScheduleComposition();
     mPreviousFrameTimeStamp = TimeStamp();
     return;
   }
   MaybeGenerateFrame(/* aForceGenerateFrame */ false);
 }
 
+TimeDuration
+WebRenderBridgeParent::GetVsyncInterval() const
+{
+  // This function should only get called in the root WRBP
+  MOZ_ASSERT(IsRootWebRenderBridgeParent());
+  if (CompositorBridgeParent* cbp = GetRootCompositorBridgeParent()) {
+    return cbp->GetVsyncInterval();
+  }
+  return TimeDuration();
+}
+
 void
 WebRenderBridgeParent::MaybeGenerateFrame(bool aForceGenerateFrame)
 {
   // This function should only get called in the root WRBP
   MOZ_ASSERT(IsRootWebRenderBridgeParent());
 
   TimeStamp start = TimeStamp::Now();
   mAsyncImageManager->SetCompositionTime(start);
--- a/gfx/layers/wr/WebRenderBridgeParent.h
+++ b/gfx/layers/wr/WebRenderBridgeParent.h
@@ -138,16 +138,17 @@ public:
   bool Resume();
 
   void Destroy();
 
   // CompositorVsyncSchedulerOwner
   bool IsPendingComposite() override { return false; }
   void FinishPendingComposite() override { }
   void CompositeToTarget(gfx::DrawTarget* aTarget, const gfx::IntRect* aRect = nullptr) override;
+  TimeDuration GetVsyncInterval() const override;
 
   // CompositableParentManager
   bool IsSameProcess() const override;
   base::ProcessId GetChildProcessId() override;
   void NotifyNotUsed(PTextureParent* aTexture, uint64_t aTransactionId) override;
   void SendAsyncMessage(const InfallibleTArray<AsyncParentMessageData>& aMessage) override;
   void SendPendingAsyncMessages() override;
   void SetAboutToSendAsyncMessages() override;
--- a/js/src/jit/MacroAssembler-inl.h
+++ b/js/src/jit/MacroAssembler-inl.h
@@ -28,16 +28,17 @@
 # error "Unknown architecture!"
 #endif
 
 #include "wasm/WasmBuiltins.h"
 
 namespace js {
 namespace jit {
 
+// clang-format off
 //{{{ check_macroassembler_style
 // ===============================================================
 // Stack manipulation functions.
 
 CodeOffset
 MacroAssembler::PushWithPatch(ImmWord word)
 {
     framePushed_ += sizeof(word.value);
@@ -794,16 +795,17 @@ MacroAssembler::storeFloat32(FloatRegist
     canonicalizeFloatIfDeterministic(src);
     storeUncanonicalizedFloat32(src, dest);
 }
 
 template void MacroAssembler::storeFloat32(FloatRegister src, const Address& dest);
 template void MacroAssembler::storeFloat32(FloatRegister src, const BaseIndex& dest);
 
 //}}} check_macroassembler_style
+// clang-format on
 // ===============================================================
 
 #ifndef JS_CODEGEN_ARM64
 
 template <typename T>
 void
 MacroAssembler::branchTestStackPtr(Condition cond, T t, Label* label)
 {
--- a/js/src/jit/MacroAssembler.cpp
+++ b/js/src/jit/MacroAssembler.cpp
@@ -2968,16 +2968,17 @@ MacroAssembler::icBuildOOLFakeExitFrame(
 #ifndef JS_CODEGEN_ARM64
 void
 MacroAssembler::subFromStackPtr(Register reg)
 {
     subPtr(reg, getStackPointer());
 }
 #endif // JS_CODEGEN_ARM64
 
+// clang-format off
 //{{{ check_macroassembler_style
 // ===============================================================
 // Stack manipulation functions.
 
 void
 MacroAssembler::PushRegsInMask(LiveGeneralRegisterSet set)
 {
     PushRegsInMask(LiveRegisterSet(set.set(), FloatRegisterSet()));
@@ -3811,16 +3812,17 @@ MacroAssembler::boundsCheck32PowerOfTwo(
     // Note: it's fine to clobber the input register, as this is a no-op: it
     // only affects speculative execution.
     if (JitOptions.spectreIndexMasking) {
         and32(Imm32(length - 1), index);
     }
 }
 
 //}}} check_macroassembler_style
+// clang-format on
 
 void
 MacroAssembler::memoryBarrierBefore(const Synchronization& sync) {
     memoryBarrier(sync.barrierBefore);
 }
 
 void
 MacroAssembler::memoryBarrierAfter(const Synchronization& sync) {
--- a/js/src/jit/MacroAssembler.h
+++ b/js/src/jit/MacroAssembler.h
@@ -345,16 +345,17 @@ class MacroAssembler : public MacroAssem
     size_t instructionsSize() const {
         return size();
     }
 
 #ifdef JS_HAS_HIDDEN_SP
     void Push(RegisterOrSP reg);
 #endif
 
+    // clang-format off
     //{{{ check_macroassembler_decl_style
   public:
     // ===============================================================
     // MacroAssembler high-level usage.
 
     // Flushes the assembly buffer, on platforms that need it.
     void flush() PER_SHARED_ARCH;
 
@@ -2051,16 +2052,17 @@ class MacroAssembler : public MacroAssem
 
     // The length must be a power of two. Performs a bounds check and Spectre index
     // masking.
     void boundsCheck32PowerOfTwo(Register index, uint32_t length, Label* failure);
 
     void speculationBarrier() PER_SHARED_ARCH;
 
     //}}} check_macroassembler_decl_style
+    // clang-format on
   public:
 
     // Emits a test of a value against all types in a TypeSet. A scratch
     // register is required.
     template <typename Source>
     void guardTypeSet(const Source& address, const TypeSet* types, BarrierKind kind,
                       Register unboxScratch, Register objScratch, Register spectreRegToZero,
                       Label* miss);
@@ -2814,16 +2816,17 @@ class IonHeapMacroAssembler : public Mac
   public:
     IonHeapMacroAssembler()
       : MacroAssembler()
     {
         MOZ_ASSERT(CurrentThreadIsIonCompiling());
     }
 };
 
+// clang-format off
 //{{{ check_macroassembler_style
 inline uint32_t
 MacroAssembler::framePushed() const
 {
     return framePushed_;
 }
 
 inline void
@@ -2842,16 +2845,17 @@ MacroAssembler::adjustFrame(int32_t valu
 inline void
 MacroAssembler::implicitPop(uint32_t bytes)
 {
     MOZ_ASSERT(bytes % sizeof(intptr_t) == 0);
     MOZ_ASSERT(bytes <= INT32_MAX);
     adjustFrame(-int32_t(bytes));
 }
 //}}} check_macroassembler_style
+// clang-format on
 
 static inline Assembler::DoubleCondition
 JSOpToDoubleCondition(JSOp op)
 {
     switch (op) {
       case JSOP_EQ:
       case JSOP_STRICTEQ:
         return Assembler::DoubleEqual;
--- a/js/src/jit/arm/MacroAssembler-arm-inl.h
+++ b/js/src/jit/arm/MacroAssembler-arm-inl.h
@@ -7,16 +7,17 @@
 #ifndef jit_arm_MacroAssembler_arm_inl_h
 #define jit_arm_MacroAssembler_arm_inl_h
 
 #include "jit/arm/MacroAssembler-arm.h"
 
 namespace js {
 namespace jit {
 
+// clang-format off
 //{{{ check_macroassembler_style
 
 void
 MacroAssembler::move64(Register64 src, Register64 dest)
 {
     move32(src.low, dest.low);
     move32(src.high, dest.high);
 }
@@ -2329,16 +2330,17 @@ MacroAssembler::clampIntToUint8(Register
     // <0, then we want to clamp to 0, otherwise, we wish to clamp to 255
     ScratchRegisterScope scratch(*this);
     as_mov(scratch, asr(reg, 8), SetCC);
     ma_mov(Imm32(0xff), reg, NotEqual);
     ma_mov(Imm32(0), reg, Signed);
 }
 
 //}}} check_macroassembler_style
+// clang-format on
 // ===============================================================
 
 void
 MacroAssemblerARMCompat::incrementInt32Value(const Address& addr)
 {
     asMasm().add32(Imm32(1), ToPayload(addr));
 }
 
--- a/js/src/jit/arm/MacroAssembler-arm.cpp
+++ b/js/src/jit/arm/MacroAssembler-arm.cpp
@@ -4357,16 +4357,17 @@ void
 MacroAssembler::subFromStackPtr(Imm32 imm32)
 {
     ScratchRegisterScope scratch(*this);
     if (imm32.value) {
         ma_sub(imm32, sp, scratch);
     }
 }
 
+// clang-format off
 //{{{ check_macroassembler_style
 // ===============================================================
 // MacroAssembler high-level usage.
 
 void
 MacroAssembler::flush()
 {
     Assembler::flush();
@@ -6170,16 +6171,17 @@ void
 MacroAssembler::speculationBarrier()
 {
     // Spectre mitigation recommended by ARM for cases where csel/cmov cannot be
     // used.
     as_csdb();
 }
 
 //}}} check_macroassembler_style
+// clang-format on
 
 void
 MacroAssemblerARM::wasmTruncateToInt32(FloatRegister input, Register output, MIRType fromType,
                                        bool isUnsigned, bool isSaturating, Label* oolEntry)
 {
     ScratchDoubleScope scratchScope(asMasm());
     ScratchRegisterScope scratchReg(asMasm());
     FloatRegister scratch = scratchScope.uintOverlay();
--- a/js/src/jit/arm64/MacroAssembler-arm64-inl.h
+++ b/js/src/jit/arm64/MacroAssembler-arm64-inl.h
@@ -7,16 +7,17 @@
 #ifndef jit_arm64_MacroAssembler_arm64_inl_h
 #define jit_arm64_MacroAssembler_arm64_inl_h
 
 #include "jit/arm64/MacroAssembler-arm64.h"
 
 namespace js {
 namespace jit {
 
+// clang-format off
 //{{{ check_macroassembler_style
 
 void
 MacroAssembler::move64(Register64 src, Register64 dest)
 {
     Mov(ARMRegister(dest.reg, 64), ARMRegister(src.reg, 64));
 }
 
@@ -1976,16 +1977,17 @@ MacroAssembler::clampIntToUint8(Register
 
     Cmp(reg32, Operand(reg32, vixl::UXTB));
     Csel(reg32, reg32, vixl::wzr, Assembler::GreaterThanOrEqual);
     Mov(scratch32, Operand(0xff));
     Csel(reg32, reg32, scratch32, Assembler::LessThanOrEqual);
 }
 
 //}}} check_macroassembler_style
+// clang-format on
 // ===============================================================
 
 void
 MacroAssemblerCompat::addToStackPtr(Register src)
 {
     Add(GetStackPointer64(), GetStackPointer64(), ARMRegister(src, 64));
 }
 
--- a/js/src/jit/arm64/MacroAssembler-arm64.cpp
+++ b/js/src/jit/arm64/MacroAssembler-arm64.cpp
@@ -408,16 +408,17 @@ MacroAssembler::Push(RegisterOrSP reg)
     if (IsHiddenSP(reg)) {
         push(sp);
     } else {
         push(AsRegister(reg));
     }
     adjustFrame(sizeof(intptr_t));
 }
 
+// clang-format off
 //{{{ check_macroassembler_style
 // ===============================================================
 // MacroAssembler high-level usage.
 
 void
 MacroAssembler::flush()
 {
     Assembler::flush();
@@ -2019,11 +2020,12 @@ MacroAssembler::flexibleDivMod32(Registe
 void
 MacroAssembler::speculationBarrier()
 {
     // Conditional speculation barrier.
     csdb();
 }
 
 //}}} check_macroassembler_style
+// clang-format off
 
 } // namespace jit
 } // namespace js
--- a/js/src/jit/mips-shared/MacroAssembler-mips-shared-inl.h
+++ b/js/src/jit/mips-shared/MacroAssembler-mips-shared-inl.h
@@ -7,16 +7,17 @@
 #ifndef jit_mips_shared_MacroAssembler_mips_shared_inl_h
 #define jit_mips_shared_MacroAssembler_mips_shared_inl_h
 
 #include "jit/mips-shared/MacroAssembler-mips-shared.h"
 
 namespace js {
 namespace jit {
 
+// clang-format off
 //{{{ check_macroassembler_style
 
 void
 MacroAssembler::moveFloat32ToGPR(FloatRegister src, Register dest)
 {
     moveFromFloat32(src, dest);
 }
 
@@ -1105,14 +1106,15 @@ MacroAssembler::clampIntToUint8(Register
 
     // If reg is >= 255, then we want to clamp to 255.
     ma_li(SecondScratchReg, Imm32(255));
     as_slti(ScratchRegister, reg, 255);
     as_movz(reg, SecondScratchReg, ScratchRegister);
 }
 
 //}}} check_macroassembler_style
+// clang-format on
 // ===============================================================
 
 } // namespace jit
 } // namespace js
 
 #endif /* jit_mips_shared_MacroAssembler_mips_shared_inl_h */
--- a/js/src/jit/mips-shared/MacroAssembler-mips-shared.cpp
+++ b/js/src/jit/mips-shared/MacroAssembler-mips-shared.cpp
@@ -1434,16 +1434,17 @@ MacroAssemblerMIPSShared::asMasm()
 }
 
 const MacroAssembler&
 MacroAssemblerMIPSShared::asMasm() const
 {
     return *static_cast<const MacroAssembler*>(this);
 }
 
+// clang-format off
 //{{{ check_macroassembler_style
 // ===============================================================
 // MacroAssembler high-level usage.
 
 void
 MacroAssembler::flush()
 {
 }
@@ -2922,8 +2923,10 @@ MacroAssembler::flexibleDivMod32(Registe
 // ========================================================================
 // Spectre Mitigations.
 
 void
 MacroAssembler::speculationBarrier()
 {
     MOZ_CRASH();
 }
+//}}} check_macroassembler_style
+// clang-format on
--- a/js/src/jit/mips32/MacroAssembler-mips32-inl.h
+++ b/js/src/jit/mips32/MacroAssembler-mips32-inl.h
@@ -9,16 +9,17 @@
 
 #include "jit/mips32/MacroAssembler-mips32.h"
 
 #include "jit/mips-shared/MacroAssembler-mips-shared-inl.h"
 
 namespace js {
 namespace jit {
 
+// clang-format off
 //{{{ check_macroassembler_style
 
 void
 MacroAssembler::move64(Register64 src, Register64 dest)
 {
     move32(src.low, dest.low);
     move32(src.high, dest.high);
 }
@@ -1006,16 +1007,17 @@ MacroAssembler::branchTruncateFloat32May
     as_truncws(ScratchFloat32Reg, src);
     as_cfc1(ScratchRegister, Assembler::FCSR);
     moveFromFloat32(ScratchFloat32Reg, dest);
     ma_ext(ScratchRegister, ScratchRegister, Assembler::CauseV, 1);
     ma_b(ScratchRegister, Imm32(0), fail, Assembler::NotEqual);
 }
 
 //}}} check_macroassembler_style
+// clang-format on
 // ===============================================================
 
 void
 MacroAssemblerMIPSCompat::incrementInt32Value(const Address& addr)
 {
     asMasm().add32(Imm32(1), ToPayload(addr));
 }
 
--- a/js/src/jit/mips32/MacroAssembler-mips32.cpp
+++ b/js/src/jit/mips32/MacroAssembler-mips32.cpp
@@ -2104,16 +2104,17 @@ MacroAssemblerMIPSCompat::profilerExitFr
 void
 MacroAssembler::subFromStackPtr(Imm32 imm32)
 {
     if (imm32.value) {
         asMasm().subPtr(imm32, StackPointer);
     }
 }
 
+// clang-format on
 //{{{ check_macroassembler_style
 // ===============================================================
 // Stack manipulation functions.
 
 void
 MacroAssembler::PushRegsInMask(LiveRegisterSet set)
 {
     int32_t diffF = set.fpus().getPushSizeInBytes();
@@ -2962,8 +2963,9 @@ MacroAssembler::convertUInt64ToDouble(Re
     convertUInt32ToDouble(src.high, dest);
     loadConstantDouble(TO_DOUBLE_HIGH_SCALE, ScratchDoubleReg);
     mulDouble(ScratchDoubleReg, dest);
     convertUInt32ToDouble(src.low, ScratchDoubleReg);
     addDouble(ScratchDoubleReg, dest);
 }
 
 //}}} check_macroassembler_style
+// clang-format on
--- a/js/src/jit/mips64/MacroAssembler-mips64-inl.h
+++ b/js/src/jit/mips64/MacroAssembler-mips64-inl.h
@@ -9,16 +9,17 @@
 
 #include "jit/mips64/MacroAssembler-mips64.h"
 
 #include "jit/mips-shared/MacroAssembler-mips-shared-inl.h"
 
 namespace js {
 namespace jit {
 
+// clang-format off
 //{{{ check_macroassembler_style
 
 void
 MacroAssembler::move64(Register64 src, Register64 dest)
 {
     movePtr(src.reg, dest.reg);
 }
 
@@ -753,16 +754,17 @@ MacroAssembler::branchTruncateFloat32May
     moveFromDouble(ScratchDoubleReg, dest);
     ma_ext(ScratchRegister, ScratchRegister, Assembler::CauseV, 1);
     ma_b(ScratchRegister, Imm32(0), fail, Assembler::NotEqual);
 
     as_sll(dest, dest, 0);
 }
 
 //}}} check_macroassembler_style
+// clang-format on
 // ===============================================================
 
 // The specializations for cmpPtrSet are outside the braces because check_macroassembler_style can't yet
 // deal with specializations.
 
 template<>
 inline void
 MacroAssembler::cmpPtrSet(Assembler::Condition cond, Address lhs, ImmPtr rhs,
--- a/js/src/jit/mips64/MacroAssembler-mips64.cpp
+++ b/js/src/jit/mips64/MacroAssembler-mips64.cpp
@@ -1943,16 +1943,17 @@ MacroAssemblerMIPS64Compat::profilerExit
 void
 MacroAssembler::subFromStackPtr(Imm32 imm32)
 {
     if (imm32.value) {
         asMasm().subPtr(imm32, StackPointer);
     }
 }
 
+// clang-format off
 //{{{ check_macroassembler_style
 // ===============================================================
 // Stack manipulation functions.
 
 void
 MacroAssembler::PushRegsInMask(LiveRegisterSet set)
 {
     int32_t diff = set.gprs().size() * sizeof(intptr_t) +
@@ -2754,8 +2755,9 @@ MacroAssembler::convertUInt64ToFloat32(R
     bind(&positive);
     as_dmtc1(src, dest);
     as_cvtsl(dest, dest);
 
     bind(&done);
 }
 
 //}}} check_macroassembler_style
+// clang-format on
--- a/js/src/jit/x64/MacroAssembler-x64-inl.h
+++ b/js/src/jit/x64/MacroAssembler-x64-inl.h
@@ -9,16 +9,17 @@
 
 #include "jit/x64/MacroAssembler-x64.h"
 
 #include "jit/x86-shared/MacroAssembler-x86-shared-inl.h"
 
 namespace js {
 namespace jit {
 
+// clang-format off
 //{{{ check_macroassembler_style
 // ===============================================================
 
 void
 MacroAssembler::move64(Imm64 imm, Register64 dest)
 {
     movq(ImmWord(imm.value), dest.reg);
 }
@@ -959,16 +960,17 @@ MacroAssembler::truncateDoubleToUInt64(A
     loadPtr(dest, temp);
     or64(Imm64(0x8000000000000000), Register64(temp));
     storePtr(temp, dest);
 
     bind(&done);
 }
 
 //}}} check_macroassembler_style
+// clang-format on
 // ===============================================================
 
 void
 MacroAssemblerX64::incrementInt32Value(const Address& addr)
 {
     asMasm().addPtr(Imm32(1), addr);
 }
 
--- a/js/src/jit/x64/MacroAssembler-x64.cpp
+++ b/js/src/jit/x64/MacroAssembler-x64.cpp
@@ -298,16 +298,17 @@ MacroAssembler::subFromStackPtr(Imm32 im
             amountLeft -= fullPages * 4096;
             if (amountLeft) {
                 subq(Imm32(amountLeft), StackPointer);
             }
         }
     }
 }
 
+// clang-format off
 //{{{ check_macroassembler_style
 // ===============================================================
 // ABI function calls.
 
 void
 MacroAssembler::setupUnalignedABICall(Register scratch)
 {
     MOZ_ASSERT(!IsCompilingWasm(), "wasm should only use aligned ABI calls");
@@ -1033,8 +1034,9 @@ MacroAssembler::wasmAtomicEffectOp64(con
       case AtomicFetchAndOp: lock_andq(value.reg, Operand(mem)); break;
       case AtomicFetchOrOp:  lock_orq(value.reg, Operand(mem)); break;
       case AtomicFetchXorOp: lock_xorq(value.reg, Operand(mem)); break;
       default:               MOZ_CRASH();
     }
 }
 
 //}}} check_macroassembler_style
+// clang-format on
--- a/js/src/jit/x86-shared/MacroAssembler-x86-shared-inl.h
+++ b/js/src/jit/x86-shared/MacroAssembler-x86-shared-inl.h
@@ -7,16 +7,17 @@
 #ifndef jit_x86_shared_MacroAssembler_x86_shared_inl_h
 #define jit_x86_shared_MacroAssembler_x86_shared_inl_h
 
 #include "jit/x86-shared/MacroAssembler-x86-shared.h"
 
 namespace js {
 namespace jit {
 
+// clang-format off
 //{{{ check_macroassembler_style
 // ===============================================================
 // Move instructions
 
 void
 MacroAssembler::moveFloat32ToGPR(FloatRegister src, Register dest)
 {
     vmovd(src, dest);
@@ -1326,14 +1327,15 @@ MacroAssembler::clampIntToUint8(Register
         sarl(Imm32(31), reg);
         notl(reg);
         andl(Imm32(255), reg);
     }
     bind(&inRange);
 }
 
 //}}} check_macroassembler_style
+// clang-format on
 // ===============================================================
 
 } // namespace jit
 } // namespace js
 
 #endif /* jit_x86_shared_MacroAssembler_x86_shared_inl_h */
--- a/js/src/jit/x86-shared/MacroAssembler-x86-shared.cpp
+++ b/js/src/jit/x86-shared/MacroAssembler-x86-shared.cpp
@@ -265,16 +265,17 @@ MacroAssemblerX86Shared::minMaxFloat32(F
         vmaxss(second, first, first);
     } else {
         vminss(second, first, first);
     }
 
     bind(&done);
 }
 
+// clang-format off
 //{{{ check_macroassembler_style
 // ===============================================================
 // MacroAssembler high-level usage.
 
 void
 MacroAssembler::flush()
 {
 }
@@ -1668,8 +1669,9 @@ MacroAssembler::speculationBarrier()
 {
     // Spectre mitigation recommended by Intel and AMD suggest to use lfence as
     // a way to force all speculative execution of instructions to end.
     MOZ_ASSERT(HasSSE2());
     masm.lfence();
 }
 
 //}}} check_macroassembler_style
+// clang-format on
--- a/js/src/jit/x86/MacroAssembler-x86-inl.h
+++ b/js/src/jit/x86/MacroAssembler-x86-inl.h
@@ -9,16 +9,17 @@
 
 #include "jit/x86/MacroAssembler-x86.h"
 
 #include "jit/x86-shared/MacroAssembler-x86-shared-inl.h"
 
 namespace js {
 namespace jit {
 
+// clang-format off
 //{{{ check_macroassembler_style
 
 void
 MacroAssembler::move64(Imm64 imm, Register64 dest)
 {
     movl(Imm32(imm.value & 0xFFFFFFFFL), dest.low);
     movl(Imm32((imm.value >> 32) & 0xFFFFFFFFL), dest.high);
 }
@@ -1177,16 +1178,17 @@ MacroAssembler::truncateDoubleToUInt64(A
     load32(HighWord(dest), temp);
     orl(Imm32(0x80000000), temp);
     store32(temp, HighWord(dest));
 
     bind(&done);
 }
 
 //}}} check_macroassembler_style
+// clang-format on
 // ===============================================================
 
 // Note: this function clobbers the source register.
 void
 MacroAssemblerX86::convertUInt32ToDouble(Register src, FloatRegister dest)
 {
     // src is [0, 2^32-1]
     subl(Imm32(0x80000000), src);
--- a/js/src/jit/x86/MacroAssembler-x86.cpp
+++ b/js/src/jit/x86/MacroAssembler-x86.cpp
@@ -297,16 +297,17 @@ MacroAssembler::subFromStackPtr(Imm32 im
             }
 
             // Restore scratch register.
             movl(Operand(StackPointer, uint32_t(imm32.value) - 4), eax);
         }
     }
 }
 
+// clang-format off
 //{{{ check_macroassembler_style
 // ===============================================================
 // ABI function calls.
 
 void
 MacroAssembler::setupUnalignedABICall(Register scratch)
 {
     MOZ_ASSERT(!IsCompilingWasm(), "wasm should only use aligned ABI calls");
@@ -1269,9 +1270,10 @@ MacroAssembler::convertInt64ToFloat32(Re
     fild(Operand(esp, 0));
 
     fstp32(Operand(esp, 0));
     vmovss(Address(esp, 0), output);
     freeStack(2 * sizeof(intptr_t));
 }
 
 //}}} check_macroassembler_style
+// clang-format on
 
--- a/mobile/android/locales/filter.py
+++ b/mobile/android/locales/filter.py
@@ -63,17 +63,15 @@ def test(mod, path, entity=None):
         if path == "defines.inc":
             if entity == "MOZ_LANGPACK_CONTRIBUTORS":
                 return "ignore"
         return "error"
 
     # we're in mod == "mobile"
     if path == "chrome/region.properties":
         # only region.properties exceptions remain
-        if (re.match(r"browser\.search\.order\.[1-9]", entity) or
-            re.match(r"browser\.search\.[a-zA-Z]+\.US", entity) or
-            re.match(r"browser\.contentHandlers\.types\.[0-5]", entity) or
+        if (re.match(r"browser\.contentHandlers\.types\.[0-5]", entity) or
             re.match(r"gecko\.handlerService\.schemes\.", entity) or
             re.match(r"gecko\.handlerService\.defaultHandlersVersion", entity) or
             re.match(r"browser\.suggestedsites\.", entity)):
             return "ignore"
 
     return "error"
--- a/mobile/android/locales/l10n.toml
+++ b/mobile/android/locales/l10n.toml
@@ -244,16 +244,14 @@ exclude-multi-locale = [
 [[filters]]
     path = "{l}mobile/android/defines.inc"
     key = "MOZ_LANGPACK_CONTRIBUTORS"
     action = "ignore"
 
 [[filters]]
     path = "{l}mobile/chrome/region.properties"
     key = [
-        "re:^browser\\.search\\.order\\.[1-9]$",
-        "re:^browser\\.search\\.[a-zA-Z]+\\.US",
         "re:^browser\\.contentHandlers\\.types\\.[0-5]\\..*$",
         "re:^gecko\\.handlerService\\.schemes\\..+$",
         "re:^gecko\\.handlerService\\.defaultHandlersVersion$",
         "re:^browser\\.suggestedsites\\..+$",
     ]
     action = "ignore"
--- a/mobile/locales/filter.py
+++ b/mobile/locales/filter.py
@@ -64,17 +64,15 @@ def test(mod, path, entity=None):
         if path == "defines.inc":
             if entity == "MOZ_LANGPACK_CONTRIBUTORS":
                 return "ignore"
         return "error"
 
     # we're in mod == "mobile"
     if path == "chrome/region.properties":
         # only region.properties exceptions remain
-        if (re.match(r"browser\.search\.order\.[1-9]", entity) or
-            re.match(r"browser\.search\.[a-zA-Z]+\.US", entity) or
-            re.match(r"browser\.contentHandlers\.types\.[0-5]", entity) or
+        if (re.match(r"browser\.contentHandlers\.types\.[0-5]", entity) or
             re.match(r"gecko\.handlerService\.schemes\.", entity) or
             re.match(r"gecko\.handlerService\.defaultHandlersVersion", entity) or
             re.match(r"browser\.suggestedsites\.", entity)):
             return "ignore"
 
     return "error"
--- a/netwerk/base/nsStandardURL.cpp
+++ b/netwerk/base/nsStandardURL.cpp
@@ -86,67 +86,103 @@ nsStandardURL::nsSegmentEncoder::nsSegme
   : mEncoding(encoding)
 {
   if (mEncoding == UTF_8_ENCODING) {
     mEncoding = nullptr;
   }
 }
 
 int32_t nsStandardURL::
-nsSegmentEncoder::EncodeSegmentCount(const char *str,
-                                     const URLSegment &seg,
-                                     int16_t mask,
-                                     nsCString& result,
-                                     bool &appended,
-                                     uint32_t extraLen)
+nsSegmentEncoder::EncodeSegmentCount(const char *aStr,
+                                     const URLSegment& aSeg,
+                                     int16_t aMask,
+                                     nsCString& aOut,
+                                     bool &aAppended,
+                                     uint32_t aExtraLen)
 {
-    // extraLen is characters outside the segment that will be
+    // aExtraLen is characters outside the segment that will be
     // added when the segment is not empty (like the @ following
     // a username).
-    appended = false;
-    if (!str)
+    if (!aStr || aSeg.mLen <= 0) {
+        // Empty segment, so aExtraLen not added per above.
+        aAppended = false;
         return 0;
-    int32_t len = 0;
-    if (seg.mLen > 0) {
-        uint32_t pos = seg.mPos;
-        len = seg.mLen;
-
-        // first honor the origin charset if appropriate. as an optimization,
-        // only do this if the segment is non-ASCII.  Further, if mEncoding is
-        // null, then the origin charset is UTF-8 and there is nothing to do.
-        nsAutoCString encBuf;
-        if (mEncoding && !nsCRT::IsAscii(str + pos, len)) {
-          // we have to encode this segment
-          nsresult rv;
-          const Encoding* ignored;
-          Tie(rv, ignored) =
-            mEncoding->Encode(Substring(str + pos, str + pos + len), encBuf);
-          if (NS_SUCCEEDED(rv)) {
-            str = encBuf.get();
-            pos = 0;
-            len = encBuf.Length();
-          }
-          // else some failure occurred... assume UTF-8 is ok.
+    }
+
+    uint32_t origLen = aOut.Length();
+
+    Span<const char> span = MakeSpan(aStr + aSeg.mPos, aSeg.mLen);
+
+    // first honor the origin charset if appropriate. as an optimization,
+    // only do this if the segment is non-ASCII.  Further, if mEncoding is
+    // null, then the origin charset is UTF-8 and there is nothing to do.
+    if (mEncoding) {
+        size_t upTo = Encoding::ASCIIValidUpTo(AsBytes(span));
+        if (upTo != span.Length()) {
+            // we have to encode this segment
+            char bufferArr[512];
+            Span<char> buffer = MakeSpan(bufferArr);
+
+            auto encoder = mEncoding->NewEncoder();
+
+            nsAutoCString valid; // has to be declared in this scope
+            if (MOZ_UNLIKELY(!IsUTF8(span.From(upTo)))) {
+                MOZ_ASSERT_UNREACHABLE("Invalid UTF-8 passed to nsStandardURL.");
+                // It's UB to pass invalid UTF-8 to
+                // EncodeFromUTF8WithoutReplacement(), so let's make our input valid
+                // UTF-8 by replacing invalid sequences with the REPLACEMENT
+                // CHARACTER.
+                UTF_8_ENCODING->Decode(
+                    nsDependentCSubstring(span.Elements(), span.Length()), valid);
+                // This assigment is OK. `span` can't be used after `valid` has
+                // been destroyed because the only way out of the scope that `valid`
+                // was declared in is via return inside the loop below. Specifically,
+                // the return is the only way out of the loop.
+                span = valid;
+            }
+
+            size_t totalRead = 0;
+            for (;;) {
+                uint32_t encoderResult;
+                size_t read;
+                size_t written;
+                Tie(encoderResult, read, written) =
+                    encoder->EncodeFromUTF8WithoutReplacement(
+                        AsBytes(span.From(totalRead)), AsWritableBytes(buffer), true);
+                totalRead += read;
+                auto bufferWritten = buffer.To(written);
+                if (!NS_EscapeURLSpan(bufferWritten, aMask, aOut)) {
+                    aOut.Append(bufferWritten);
+                }
+                if (encoderResult == kInputEmpty) {
+                    aAppended = true;
+                    // Difference between original and current output
+                    // string lengths plus extra length
+                    return aOut.Length() - origLen + aExtraLen;
+                }
+                if (encoderResult == kOutputFull) {
+                    continue;
+                }
+                aOut.AppendLiteral("%26%23");
+                aOut.AppendInt(encoderResult);
+                aOut.AppendLiteral("%3B");
+            }
+            MOZ_RELEASE_ASSERT(false, "There's supposed to be no way out of the above loop except return.");
         }
-
-        uint32_t initLen = result.Length();
-
-        // now perform any required escaping
-        if (NS_EscapeURL(str + pos, len, mask, result)) {
-            len = result.Length() - initLen;
-            appended = true;
-        }
-        else if (str == encBuf.get()) {
-            result += encBuf; // append only!!
-            len = encBuf.Length();
-            appended = true;
-        }
-        len += extraLen;
     }
-    return len;
+
+    if (NS_EscapeURLSpan(span, aMask, aOut)) {
+        aAppended = true;
+        // Difference between original and current output
+        // string lengths plus extra length
+        return aOut.Length() - origLen + aExtraLen;
+    }
+    aAppended = false;
+    // Original segment length plus extra length
+    return span.Length() + aExtraLen;
 }
 
 const nsACString &nsStandardURL::
 nsSegmentEncoder::EncodeSegment(const nsACString& str,
                                 int16_t mask,
                                 nsCString& result)
 {
     const char *text;
@@ -917,17 +953,17 @@ nsStandardURL::BuildNormalizedSpec(const
         netCoalesceFlags coalesceFlag = NET_COALESCE_NORMAL;
         if (SegmentIs(buf,mScheme,"ftp")) {
             coalesceFlag = (netCoalesceFlags) (coalesceFlag
                                         | NET_COALESCE_ALLOW_RELATIVE_ROOT
                                         | NET_COALESCE_DOUBLE_SLASH_IS_ROOT);
         }
         CoalescePath(coalesceFlag, buf + mDirectory.mPos);
     }
-    mSpec.SetLength(strlen(buf));
+    mSpec.Truncate(strlen(buf));
     NS_ASSERTION(mSpec.Length() <= approxLen, "We've overflowed the mSpec buffer!");
     MOZ_ASSERT(mSpec.Length() <= (uint32_t) net_GetURLMaxLength(),
                "The spec should never be this long, we missed a check.");
 
     return NS_OK;
 }
 
 bool
--- a/testing/raptor/raptor/output.py
+++ b/testing/raptor/raptor/output.py
@@ -329,25 +329,17 @@ class Output(object):
                     # subtest not added yet, first pagecycle, so add new one
                     _subtests[sub] = {'unit': test.subtest_unit,
                                       'alertThreshold': float(test.alert_threshold),
                                       'lowerIsBetter': test.subtest_lower_is_better,
                                       'name': sub,
                                       'replicates': []}
                 _subtests[sub]['replicates'].extend([round(x, 3) for x in replicates])
 
-        total_subtest = {
-            'unit': test.subtest_unit,
-            'alertThreshold': float(test.alert_threshold),
-            'lowerIsBetter': test.subtest_lower_is_better,
-            'replicates': [],
-            'name': 'benchmark_score',
-            'value': 0
-        }
-        subtests = [total_subtest]
+        subtests = []
         vals = []
 
         names = _subtests.keys()
         names.sort(reverse=True)
         for name in names:
             _subtests[name]['value'] = filter.mean(_subtests[name]['replicates'])
             subtests.append(_subtests[name])
 
--- a/testing/talos/talos/tests/devtools/addon/install.rdf
+++ b/testing/talos/talos/tests/devtools/addon/install.rdf
@@ -1,15 +1,16 @@
 <?xml version="1.0"?><RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"     xmlns:em="http://www.mozilla.org/2004/em-rdf#"><Description about="urn:mozilla:install-manifest">
 
 <!-- Required Items -->
 <em:id>bug1150215@mozilla.org</em:id>
 <em:name>DAMP - Devtools At Maximum Performance</em:name>
 <em:version>0.0.16</em:version>
 <em:bootstrap>true</em:bootstrap>
+<em:multiprocessCompatible>true</em:multiprocessCompatible>
 
 <em:targetApplication>
     <Description>
         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
         <em:minVersion>44.0</em:minVersion>
         <em:maxVersion>*</em:maxVersion>
     </Description>
 </em:targetApplication>
deleted file mode 100644
--- a/testing/web-platform/meta/encoding/big5-encoder.html.ini
+++ /dev/null
@@ -1,13 +0,0 @@
-[big5-encoder.html]
-  [big5 encoder: Highest-pointer BMP character excluded from encoder]
-    expected: FAIL
-
-  [big5 encoder: Highest-pointer character excluded from encoder]
-    expected: FAIL
-
-  [big5 encoder: The canonical BMP test character that is not in the index]
-    expected: FAIL
-
-  [big5 encoder: The canonical astral test character that is not in the index]
-    expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/encoding/gbk-encoder.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[gbk-encoder.html]
-  [gbk encoder: poo]
-    expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/encoding/iso-2022-jp-encoder.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[iso-2022-jp-encoder.html]
-  [iso-2022-jp encoder: U+FFFD]
-    expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/encoding/legacy-mb-japanese/euc-jp/eucjp-encode-href-errors-han.html.ini
+++ /dev/null
@@ -1,127662 +0,0 @@
-[eucjp-encode-href-errors-han.html]
-  [cjk  U+4E02 丂 %26%2319970%3B]
-    expected: FAIL
-
-  [cjk  U+4E04 丄 %26%2319972%3B]
-    expected: FAIL
-
-  [cjk  U+4E05 丅 %26%2319973%3B]
-    expected: FAIL
-
-  [cjk  U+4E06 丆 %26%2319974%3B]
-    expected: FAIL
-
-  [cjk  U+4E0C 丌 %26%2319980%3B]
-    expected: FAIL
-
-  [cjk  U+4E0F 丏 %26%2319983%3B]
-    expected: FAIL
-
-  [cjk  U+4E12 丒 %26%2319986%3B]
-    expected: FAIL
-
-  [cjk  U+4E13 专 %26%2319987%3B]
-    expected: FAIL
-
-  [cjk  U+4E1A 业 %26%2319994%3B]
-    expected: FAIL
-
-  [cjk  U+4E1B 丛 %26%2319995%3B]
-    expected: FAIL
-
-  [cjk  U+4E1C 东 %26%2319996%3B]
-    expected: FAIL
-
-  [cjk  U+4E1D 丝 %26%2319997%3B]
-    expected: FAIL
-
-  [cjk  U+4E1F 丟 %26%2319999%3B]
-    expected: FAIL
-
-  [cjk  U+4E20 丠 %26%2320000%3B]
-    expected: FAIL
-
-  [cjk  U+4E22 丢 %26%2320002%3B]
-    expected: FAIL
-
-  [cjk  U+4E23 丣 %26%2320003%3B]
-    expected: FAIL
-
-  [cjk  U+4E24 两 %26%2320004%3B]
-    expected: FAIL
-
-  [cjk  U+4E25 严 %26%2320005%3B]
-    expected: FAIL
-
-  [cjk  U+4E27 丧 %26%2320007%3B]
-    expected: FAIL
-
-  [cjk  U+4E29 丩 %26%2320009%3B]
-    expected: FAIL
-
-  [cjk  U+4E2B 丫 %26%2320011%3B]
-    expected: FAIL
-
-  [cjk  U+4E2C 丬 %26%2320012%3B]
-    expected: FAIL
-
-  [cjk  U+4E2E 丮 %26%2320014%3B]
-    expected: FAIL
-
-  [cjk  U+4E2F 丯 %26%2320015%3B]
-    expected: FAIL
-
-  [cjk  U+4E30 丰 %26%2320016%3B]
-    expected: FAIL
-
-  [cjk  U+4E33 丳 %26%2320019%3B]
-    expected: FAIL
-
-  [cjk  U+4E34 临 %26%2320020%3B]
-    expected: FAIL
-
-  [cjk  U+4E35 丵 %26%2320021%3B]
-    expected: FAIL
-
-  [cjk  U+4E37 丷 %26%2320023%3B]
-    expected: FAIL
-
-  [cjk  U+4E3A 为 %26%2320026%3B]
-    expected: FAIL
-
-  [cjk  U+4E3D 丽 %26%2320029%3B]
-    expected: FAIL
-
-  [cjk  U+4E3E 举 %26%2320030%3B]
-    expected: FAIL
-
-  [cjk  U+4E40 乀 %26%2320032%3B]
-    expected: FAIL
-
-  [cjk  U+4E41 乁 %26%2320033%3B]
-    expected: FAIL
-
-  [cjk  U+4E44 乄 %26%2320036%3B]
-    expected: FAIL
-
-  [cjk  U+4E46 乆 %26%2320038%3B]
-    expected: FAIL
-
-  [cjk  U+4E47 乇 %26%2320039%3B]
-    expected: FAIL
-
-  [cjk  U+4E48 么 %26%2320040%3B]
-    expected: FAIL
-
-  [cjk  U+4E49 义 %26%2320041%3B]
-    expected: FAIL
-
-  [cjk  U+4E4A 乊 %26%2320042%3B]
-    expected: FAIL
-
-  [cjk  U+4E4C 乌 %26%2320044%3B]
-    expected: FAIL
-
-  [cjk  U+4E50 乐 %26%2320048%3B]
-    expected: FAIL
-
-  [cjk  U+4E51 乑 %26%2320049%3B]
-    expected: FAIL
-
-  [cjk  U+4E52 乒 %26%2320050%3B]
-    expected: FAIL
-
-  [cjk  U+4E53 乓 %26%2320051%3B]
-    expected: FAIL
-
-  [cjk  U+4E54 乔 %26%2320052%3B]
-    expected: FAIL
-
-  [cjk  U+4E5A 乚 %26%2320058%3B]
-    expected: FAIL
-
-  [cjk  U+4E5B 乛 %26%2320059%3B]
-    expected: FAIL
-
-  [cjk  U+4E5C 乜 %26%2320060%3B]
-    expected: FAIL
-
-  [cjk  U+4E60 习 %26%2320064%3B]
-    expected: FAIL
-
-  [cjk  U+4E61 乡 %26%2320065%3B]
-    expected: FAIL
-
-  [cjk  U+4E63 乣 %26%2320067%3B]
-    expected: FAIL
-
-  [cjk  U+4E64 乤 %26%2320068%3B]
-    expected: FAIL
-
-  [cjk  U+4E65 乥 %26%2320069%3B]
-    expected: FAIL
-
-  [cjk  U+4E66 书 %26%2320070%3B]
-    expected: FAIL
-
-  [cjk  U+4E67 乧 %26%2320071%3B]
-    expected: FAIL
-
-  [cjk  U+4E68 乨 %26%2320072%3B]
-    expected: FAIL
-
-  [cjk  U+4E69 乩 %26%2320073%3B]
-    expected: FAIL
-
-  [cjk  U+4E6A 乪 %26%2320074%3B]
-    expected: FAIL
-
-  [cjk  U+4E6B 乫 %26%2320075%3B]
-    expected: FAIL
-
-  [cjk  U+4E6C 乬 %26%2320076%3B]
-    expected: FAIL
-
-  [cjk  U+4E6D 乭 %26%2320077%3B]
-    expected: FAIL
-
-  [cjk  U+4E6E 乮 %26%2320078%3B]
-    expected: FAIL
-
-  [cjk  U+4E6F 乯 %26%2320079%3B]
-    expected: FAIL
-
-  [cjk  U+4E70 买 %26%2320080%3B]
-    expected: FAIL
-
-  [cjk  U+4E72 乲 %26%2320082%3B]
-    expected: FAIL
-
-  [cjk  U+4E74 乴 %26%2320084%3B]
-    expected: FAIL
-
-  [cjk  U+4E75 乵 %26%2320085%3B]
-    expected: FAIL
-
-  [cjk  U+4E76 乶 %26%2320086%3B]
-    expected: FAIL
-
-  [cjk  U+4E77 乷 %26%2320087%3B]
-    expected: FAIL
-
-  [cjk  U+4E78 乸 %26%2320088%3B]
-    expected: FAIL
-
-  [cjk  U+4E79 乹 %26%2320089%3B]
-    expected: FAIL
-
-  [cjk  U+4E7A 乺 %26%2320090%3B]
-    expected: FAIL
-
-  [cjk  U+4E7B 乻 %26%2320091%3B]
-    expected: FAIL
-
-  [cjk  U+4E7C 乼 %26%2320092%3B]
-    expected: FAIL
-
-  [cjk  U+4E7D 乽 %26%2320093%3B]
-    expected: FAIL
-
-  [cjk  U+4E7F 乿 %26%2320095%3B]
-    expected: FAIL
-
-  [cjk  U+4E81 亁 %26%2320097%3B]
-    expected: FAIL
-
-  [cjk  U+4E83 亃 %26%2320099%3B]
-    expected: FAIL
-
-  [cjk  U+4E84 亄 %26%2320100%3B]
-    expected: FAIL
-
-  [cjk  U+4E87 亇 %26%2320103%3B]
-    expected: FAIL
-
-  [cjk  U+4E8D 亍 %26%2320109%3B]
-    expected: FAIL
-
-  [cjk  U+4E8F 亏 %26%2320111%3B]
-    expected: FAIL
-
-  [cjk  U+4E90 亐 %26%2320112%3B]
-    expected: FAIL
-
-  [cjk  U+4E93 亓 %26%2320115%3B]
-    expected: FAIL
-
-  [cjk  U+4E96 亖 %26%2320118%3B]
-    expected: FAIL
-
-  [cjk  U+4E97 亗 %26%2320119%3B]
-    expected: FAIL
-
-  [cjk  U+4E9A 亚 %26%2320122%3B]
-    expected: FAIL
-
-  [cjk  U+4E9D 亝 %26%2320125%3B]
-    expected: FAIL
-
-  [cjk  U+4EA3 亣 %26%2320131%3B]
-    expected: FAIL
-
-  [cjk  U+4EA7 产 %26%2320135%3B]
-    expected: FAIL
-
-  [cjk  U+4EA9 亩 %26%2320137%3B]
-    expected: FAIL
-
-  [cjk  U+4EAA 亪 %26%2320138%3B]
-    expected: FAIL
-
-  [cjk  U+4EAF 亯 %26%2320143%3B]
-    expected: FAIL
-
-  [cjk  U+4EB1 亱 %26%2320145%3B]
-    expected: FAIL
-
-  [cjk  U+4EB2 亲 %26%2320146%3B]
-    expected: FAIL
-
-  [cjk  U+4EB4 亴 %26%2320148%3B]
-    expected: FAIL
-
-  [cjk  U+4EB5 亵 %26%2320149%3B]
-    expected: FAIL
-
-  [cjk  U+4EB7 亷 %26%2320151%3B]
-    expected: FAIL
-
-  [cjk  U+4EB8 亸 %26%2320152%3B]
-    expected: FAIL
-
-  [cjk  U+4EB9 亹 %26%2320153%3B]
-    expected: FAIL
-
-  [cjk  U+4EBB 亻 %26%2320155%3B]
-    expected: FAIL
-
-  [cjk  U+4EBC 亼 %26%2320156%3B]
-    expected: FAIL
-
-  [cjk  U+4EBD 亽 %26%2320157%3B]
-    expected: FAIL
-
-  [cjk  U+4EBE 亾 %26%2320158%3B]
-    expected: FAIL
-
-  [cjk  U+4EBF 亿 %26%2320159%3B]
-    expected: FAIL
-
-  [cjk  U+4EC3 仃 %26%2320163%3B]
-    expected: FAIL
-
-  [cjk  U+4EC5 仅 %26%2320165%3B]
-    expected: FAIL
-
-  [cjk  U+4EC8 仈 %26%2320168%3B]
-    expected: FAIL
-
-  [cjk  U+4EC9 仉 %26%2320169%3B]
-    expected: FAIL
-
-  [cjk  U+4ECC 仌 %26%2320172%3B]
-    expected: FAIL
-
-  [cjk  U+4ED0 仐 %26%2320176%3B]
-    expected: FAIL
-
-  [cjk  U+4ED1 仑 %26%2320177%3B]
-    expected: FAIL
-
-  [cjk  U+4ED2 仒 %26%2320178%3B]
-    expected: FAIL
-
-  [cjk  U+4ED3 仓 %26%2320179%3B]
-    expected: FAIL
-
-  [cjk  U+4EDA 仚 %26%2320186%3B]
-    expected: FAIL
-
-  [cjk  U+4EDB 仛 %26%2320187%3B]
-    expected: FAIL
-
-  [cjk  U+4EDC 仜 %26%2320188%3B]
-    expected: FAIL
-
-  [cjk  U+4EE0 仠 %26%2320192%3B]
-    expected: FAIL
-
-  [cjk  U+4EE2 仢 %26%2320194%3B]
-    expected: FAIL
-
-  [cjk  U+4EE6 仦 %26%2320198%3B]
-    expected: FAIL
-
-  [cjk  U+4EE7 仧 %26%2320199%3B]
-    expected: FAIL
-
-  [cjk  U+4EE8 仨 %26%2320200%3B]
-    expected: FAIL
-
-  [cjk  U+4EE9 仩 %26%2320201%3B]
-    expected: FAIL
-
-  [cjk  U+4EEA 仪 %26%2320202%3B]
-    expected: FAIL
-
-  [cjk  U+4EEB 仫 %26%2320203%3B]
-    expected: FAIL
-
-  [cjk  U+4EEC 们 %26%2320204%3B]
-    expected: FAIL
-
-  [cjk  U+4EEF 仯 %26%2320207%3B]
-    expected: FAIL
-
-  [cjk  U+4EF1 仱 %26%2320209%3B]
-    expected: FAIL
-
-  [cjk  U+4EF3 仳 %26%2320211%3B]
-    expected: FAIL
-
-  [cjk  U+4EF4 仴 %26%2320212%3B]
-    expected: FAIL
-
-  [cjk  U+4EF5 仵 %26%2320213%3B]
-    expected: FAIL
-
-  [cjk  U+4EF8 仸 %26%2320216%3B]
-    expected: FAIL
-
-  [cjk  U+4EF9 仹 %26%2320217%3B]
-    expected: FAIL
-
-  [cjk  U+4EFA 仺 %26%2320218%3B]
-    expected: FAIL
-
-  [cjk  U+4EFD 份 %26%2320221%3B]
-    expected: FAIL
-
-  [cjk  U+4EFE 仾 %26%2320222%3B]
-    expected: FAIL
-
-  [cjk  U+4EFF 仿 %26%2320223%3B]
-    expected: FAIL
-
-  [cjk  U+4F02 伂 %26%2320226%3B]
-    expected: FAIL
-
-  [cjk  U+4F04 伄 %26%2320228%3B]
-    expected: FAIL
-
-  [cjk  U+4F05 伅 %26%2320229%3B]
-    expected: FAIL
-
-  [cjk  U+4F06 伆 %26%2320230%3B]
-    expected: FAIL
-
-  [cjk  U+4F07 伇 %26%2320231%3B]
-    expected: FAIL
-
-  [cjk  U+4F08 伈 %26%2320232%3B]
-    expected: FAIL
-
-  [cjk  U+4F0B 伋 %26%2320235%3B]
-    expected: FAIL
-
-  [cjk  U+4F0C 伌 %26%2320236%3B]
-    expected: FAIL
-
-  [cjk  U+4F12 伒 %26%2320242%3B]
-    expected: FAIL
-
-  [cjk  U+4F13 伓 %26%2320243%3B]
-    expected: FAIL
-
-  [cjk  U+4F14 伔 %26%2320244%3B]
-    expected: FAIL
-
-  [cjk  U+4F15 伕 %26%2320245%3B]
-    expected: FAIL
-
-  [cjk  U+4F16 伖 %26%2320246%3B]
-    expected: FAIL
-
-  [cjk  U+4F17 众 %26%2320247%3B]
-    expected: FAIL
-
-  [cjk  U+4F18 优 %26%2320248%3B]
-    expected: FAIL
-
-  [cjk  U+4F19 伙 %26%2320249%3B]
-    expected: FAIL
-
-  [cjk  U+4F1B 伛 %26%2320251%3B]
-    expected: FAIL
-
-  [cjk  U+4F1E 伞 %26%2320254%3B]
-    expected: FAIL
-
-  [cjk  U+4F1F 伟 %26%2320255%3B]
-    expected: FAIL
-
-  [cjk  U+4F20 传 %26%2320256%3B]
-    expected: FAIL
-
-  [cjk  U+4F21 伡 %26%2320257%3B]
-    expected: FAIL
-
-  [cjk  U+4F22 伢 %26%2320258%3B]
-    expected: FAIL
-
-  [cjk  U+4F23 伣 %26%2320259%3B]
-    expected: FAIL
-
-  [cjk  U+4F24 伤 %26%2320260%3B]
-    expected: FAIL
-
-  [cjk  U+4F25 伥 %26%2320261%3B]
-    expected: FAIL
-
-  [cjk  U+4F26 伦 %26%2320262%3B]
-    expected: FAIL
-
-  [cjk  U+4F27 伧 %26%2320263%3B]
-    expected: FAIL
-
-  [cjk  U+4F28 伨 %26%2320264%3B]
-    expected: FAIL
-
-  [cjk  U+4F29 伩 %26%2320265%3B]
-    expected: FAIL
-
-  [cjk  U+4F2A 伪 %26%2320266%3B]
-    expected: FAIL
-
-  [cjk  U+4F2B 伫 %26%2320267%3B]
-    expected: FAIL
-
-  [cjk  U+4F2C 伬 %26%2320268%3B]
-    expected: FAIL
-
-  [cjk  U+4F2D 伭 %26%2320269%3B]
-    expected: FAIL
-
-  [cjk  U+4F2E 伮 %26%2320270%3B]
-    expected: FAIL
-
-  [cjk  U+4F31 伱 %26%2320273%3B]
-    expected: FAIL
-
-  [cjk  U+4F32 伲 %26%2320274%3B]
-    expected: FAIL
-
-  [cjk  U+4F33 伳 %26%2320275%3B]
-    expected: FAIL
-
-  [cjk  U+4F35 伵 %26%2320277%3B]
-    expected: FAIL
-
-  [cjk  U+4F37 伷 %26%2320279%3B]
-    expected: FAIL
-
-  [cjk  U+4F3B 伻 %26%2320283%3B]
-    expected: FAIL
-
-  [cjk  U+4F3E 伾 %26%2320286%3B]
-    expected: FAIL
-
-  [cjk  U+4F3F 伿 %26%2320287%3B]
-    expected: FAIL
-
-  [cjk  U+4F40 佀 %26%2320288%3B]
-    expected: FAIL
-
-  [cjk  U+4F41 佁 %26%2320289%3B]
-    expected: FAIL
-
-  [cjk  U+4F42 佂 %26%2320290%3B]
-    expected: FAIL
-
-  [cjk  U+4F44 佄 %26%2320292%3B]
-    expected: FAIL
-
-  [cjk  U+4F45 佅 %26%2320293%3B]
-    expected: FAIL
-
-  [cjk  U+4F48 佈 %26%2320296%3B]
-    expected: FAIL
-
-  [cjk  U+4F49 佉 %26%2320297%3B]
-    expected: FAIL
-
-  [cjk  U+4F4A 佊 %26%2320298%3B]
-    expected: FAIL
-
-  [cjk  U+4F4B 佋 %26%2320299%3B]
-    expected: FAIL
-
-  [cjk  U+4F4C 佌 %26%2320300%3B]
-    expected: FAIL
-
-  [cjk  U+4F52 佒 %26%2320306%3B]
-    expected: FAIL
-
-  [cjk  U+4F54 佔 %26%2320308%3B]
-    expected: FAIL
-
-  [cjk  U+4F58 佘 %26%2320312%3B]
-    expected: FAIL
-
-  [cjk  U+4F5F 佟 %26%2320319%3B]
-    expected: FAIL
-
-  [cjk  U+4F60 你 %26%2320320%3B]
-    expected: FAIL
-
-  [cjk  U+4F61 佡 %26%2320321%3B]
-    expected: FAIL
-
-  [cjk  U+4F62 佢 %26%2320322%3B]
-    expected: FAIL
-
-  [cjk  U+4F63 佣 %26%2320323%3B]
-    expected: FAIL
-
-  [cjk  U+4F64 佤 %26%2320324%3B]
-    expected: FAIL
-
-  [cjk  U+4F65 佥 %26%2320325%3B]
-    expected: FAIL
-
-  [cjk  U+4F66 佦 %26%2320326%3B]
-    expected: FAIL
-
-  [cjk  U+4F67 佧 %26%2320327%3B]
-    expected: FAIL
-
-  [cjk  U+4F68 佨 %26%2320328%3B]
-    expected: FAIL
-
-  [cjk  U+4F6A 佪 %26%2320330%3B]
-    expected: FAIL
-
-  [cjk  U+4F6B 佫 %26%2320331%3B]
-    expected: FAIL
-
-  [cjk  U+4F6C 佬 %26%2320332%3B]
-    expected: FAIL
-
-  [cjk  U+4F6D 佭 %26%2320333%3B]
-    expected: FAIL
-
-  [cjk  U+4F6E 佮 %26%2320334%3B]
-    expected: FAIL
-
-  [cjk  U+4F71 佱 %26%2320337%3B]
-    expected: FAIL
-
-  [cjk  U+4F72 佲 %26%2320338%3B]
-    expected: FAIL
-
-  [cjk  U+4F74 佴 %26%2320340%3B]
-    expected: FAIL
-
-  [cjk  U+4F77 佷 %26%2320343%3B]
-    expected: FAIL
-
-  [cjk  U+4F78 佸 %26%2320344%3B]
-    expected: FAIL
-
-  [cjk  U+4F79 佹 %26%2320345%3B]
-    expected: FAIL
-
-  [cjk  U+4F7A 佺 %26%2320346%3B]
-    expected: FAIL
-
-  [cjk  U+4F7D 佽 %26%2320349%3B]
-    expected: FAIL
-
-  [cjk  U+4F7E 佾 %26%2320350%3B]
-    expected: FAIL
-
-  [cjk  U+4F80 侀 %26%2320352%3B]
-    expected: FAIL
-
-  [cjk  U+4F81 侁 %26%2320353%3B]
-    expected: FAIL
-
-  [cjk  U+4F82 侂 %26%2320354%3B]
-    expected: FAIL
-
-  [cjk  U+4F84 侄 %26%2320356%3B]
-    expected: FAIL
-
-  [cjk  U+4F85 侅 %26%2320357%3B]
-    expected: FAIL
-
-  [cjk  U+4F87 侇 %26%2320359%3B]
-    expected: FAIL
-
-  [cjk  U+4F89 侉 %26%2320361%3B]
-    expected: FAIL
-
-  [cjk  U+4F8C 侌 %26%2320364%3B]
-    expected: FAIL
-
-  [cjk  U+4F8E 侎 %26%2320366%3B]
-    expected: FAIL
-
-  [cjk  U+4F90 侐 %26%2320368%3B]
-    expected: FAIL
-
-  [cjk  U+4F93 侓 %26%2320371%3B]
-    expected: FAIL
-
-  [cjk  U+4F95 侕 %26%2320373%3B]
-    expected: FAIL
-
-  [cjk  U+4F97 侗 %26%2320375%3B]
-    expected: FAIL
-
-  [cjk  U+4F99 侙 %26%2320377%3B]
-    expected: FAIL
-
-  [cjk  U+4F9C 侜 %26%2320380%3B]
-    expected: FAIL
-
-  [cjk  U+4F9E 侞 %26%2320382%3B]
-    expected: FAIL
-
-  [cjk  U+4F9F 侟 %26%2320383%3B]
-    expected: FAIL
-
-  [cjk  U+4FA2 侢 %26%2320386%3B]
-    expected: FAIL
-
-  [cjk  U+4FA3 侣 %26%2320387%3B]
-    expected: FAIL
-
-  [cjk  U+4FA4 侤 %26%2320388%3B]
-    expected: FAIL
-
-  [cjk  U+4FA5 侥 %26%2320389%3B]
-    expected: FAIL
-
-  [cjk  U+4FA6 侦 %26%2320390%3B]
-    expected: FAIL
-
-  [cjk  U+4FA7 侧 %26%2320391%3B]
-    expected: FAIL
-
-  [cjk  U+4FA8 侨 %26%2320392%3B]
-    expected: FAIL
-
-  [cjk  U+4FA9 侩 %26%2320393%3B]
-    expected: FAIL
-
-  [cjk  U+4FAA 侪 %26%2320394%3B]
-    expected: FAIL
-
-  [cjk  U+4FAC 侬 %26%2320396%3B]
-    expected: FAIL
-
-  [cjk  U+4FB0 侰 %26%2320400%3B]
-    expected: FAIL
-
-  [cjk  U+4FB1 侱 %26%2320401%3B]
-    expected: FAIL
-
-  [cjk  U+4FB2 侲 %26%2320402%3B]
-    expected: FAIL
-
-  [cjk  U+4FB3 侳 %26%2320403%3B]
-    expected: FAIL
-
-  [cjk  U+4FB4 侴 %26%2320404%3B]
-    expected: FAIL
-
-  [cjk  U+4FB7 侷 %26%2320407%3B]
-    expected: FAIL
-
-  [cjk  U+4FB8 侸 %26%2320408%3B]
-    expected: FAIL
-
-  [cjk  U+4FB9 侹 %26%2320409%3B]
-    expected: FAIL
-
-  [cjk  U+4FBA 侺 %26%2320410%3B]
-    expected: FAIL
-
-  [cjk  U+4FBB 侻 %26%2320411%3B]
-    expected: FAIL
-
-  [cjk  U+4FBC 侼 %26%2320412%3B]
-    expected: FAIL
-
-  [cjk  U+4FBD 侽 %26%2320413%3B]
-    expected: FAIL
-
-  [cjk  U+4FBE 侾 %26%2320414%3B]
-    expected: FAIL
-
-  [cjk  U+4FC0 俀 %26%2320416%3B]
-    expected: FAIL
-
-  [cjk  U+4FC1 俁 %26%2320417%3B]
-    expected: FAIL
-
-  [cjk  U+4FC5 俅 %26%2320421%3B]
-    expected: FAIL
-
-  [cjk  U+4FC6 俆 %26%2320422%3B]
-    expected: FAIL
-
-  [cjk  U+4FC7 俇 %26%2320423%3B]
-    expected: FAIL
-
-  [cjk  U+4FC8 俈 %26%2320424%3B]
-    expected: FAIL
-
-  [cjk  U+4FCB 俋 %26%2320427%3B]
-    expected: FAIL
-
-  [cjk  U+4FCC 俌 %26%2320428%3B]
-    expected: FAIL
-
-  [cjk  U+4FCF 俏 %26%2320431%3B]
-    expected: FAIL
-
-  [cjk  U+4FD2 俒 %26%2320434%3B]
-    expected: FAIL
-
-  [cjk  U+4FD3 俓 %26%2320435%3B]
-    expected: FAIL
-
-  [cjk  U+4FD5 俕 %26%2320437%3B]
-    expected: FAIL
-
-  [cjk  U+4FD6 俖 %26%2320438%3B]
-    expected: FAIL
-
-  [cjk  U+4FD9 俙 %26%2320441%3B]
-    expected: FAIL
-
-  [cjk  U+4FDC 俜 %26%2320444%3B]
-    expected: FAIL
-
-  [cjk  U+4FDE 俞 %26%2320446%3B]
-    expected: FAIL
-
-  [cjk  U+4FE0 俠 %26%2320448%3B]
-    expected: FAIL
-
-  [cjk  U+4FE2 俢 %26%2320450%3B]
-    expected: FAIL
-
-  [cjk  U+4FE6 俦 %26%2320454%3B]
-    expected: FAIL
-
-  [cjk  U+4FE7 俧 %26%2320455%3B]
-    expected: FAIL
-
-  [cjk  U+4FE8 俨 %26%2320456%3B]
-    expected: FAIL
-
-  [cjk  U+4FE9 俩 %26%2320457%3B]
-    expected: FAIL
-
-  [cjk  U+4FEA 俪 %26%2320458%3B]
-    expected: FAIL
-
-  [cjk  U+4FEB 俫 %26%2320459%3B]
-    expected: FAIL
-
-  [cjk  U+4FEC 俬 %26%2320460%3B]
-    expected: FAIL
-
-  [cjk  U+4FED 俭 %26%2320461%3B]
-    expected: FAIL
-
-  [cjk  U+4FF0 俰 %26%2320464%3B]
-    expected: FAIL
-
-  [cjk  U+4FF1 俱 %26%2320465%3B]
-    expected: FAIL
-
-  [cjk  U+4FF2 俲 %26%2320466%3B]
-    expected: FAIL
-
-  [cjk  U+4FF4 俴 %26%2320468%3B]
-    expected: FAIL
-
-  [cjk  U+4FF7 俷 %26%2320471%3B]
-    expected: FAIL
-
-  [cjk  U+4FF9 俹 %26%2320473%3B]
-    expected: FAIL
-
-  [cjk  U+4FFB 俻 %26%2320475%3B]
-    expected: FAIL
-
-  [cjk  U+4FFC 俼 %26%2320476%3B]
-    expected: FAIL
-
-  [cjk  U+4FFD 俽 %26%2320477%3B]
-    expected: FAIL
-
-  [cjk  U+5000 倀 %26%2320480%3B]
-    expected: FAIL
-
-  [cjk  U+5001 倁 %26%2320481%3B]
-    expected: FAIL
-
-  [cjk  U+5002 倂 %26%2320482%3B]
-    expected: FAIL
-
-  [cjk  U+5003 倃 %26%2320483%3B]
-    expected: FAIL
-
-  [cjk  U+5004 倄 %26%2320484%3B]
-    expected: FAIL
-
-  [cjk  U+5007 倇 %26%2320487%3B]
-    expected: FAIL
-
-  [cjk  U+5008 倈 %26%2320488%3B]
-    expected: FAIL
-
-  [cjk  U+500A 倊 %26%2320490%3B]
-    expected: FAIL
-
-  [cjk  U+500C 倌 %26%2320492%3B]
-    expected: FAIL
-
-  [cjk  U+500E 倎 %26%2320494%3B]
-    expected: FAIL
-
-  [cjk  U+5010 倐 %26%2320496%3B]
-    expected: FAIL
-
-  [cjk  U+5013 倓 %26%2320499%3B]
-    expected: FAIL
-
-  [cjk  U+5015 倕 %26%2320501%3B]
-    expected: FAIL
-
-  [cjk  U+5017 倗 %26%2320503%3B]
-    expected: FAIL
-
-  [cjk  U+5018 倘 %26%2320504%3B]
-    expected: FAIL
-
-  [cjk  U+501B 倛 %26%2320507%3B]
-    expected: FAIL
-
-  [cjk  U+501C 倜 %26%2320508%3B]
-    expected: FAIL
-
-  [cjk  U+501D 倝 %26%2320509%3B]
-    expected: FAIL
-
-  [cjk  U+5020 倠 %26%2320512%3B]
-    expected: FAIL
-
-  [cjk  U+5027 倧 %26%2320519%3B]
-    expected: FAIL
-
-  [cjk  U+502E 倮 %26%2320526%3B]
-    expected: FAIL
-
-  [cjk  U+502F 倯 %26%2320527%3B]
-    expected: FAIL
-
-  [cjk  U+5030 倰 %26%2320528%3B]
-    expected: FAIL
-
-  [cjk  U+5031 倱 %26%2320529%3B]
-    expected: FAIL
-
-  [cjk  U+5032 倲 %26%2320530%3B]
-    expected: FAIL
-
-  [cjk  U+5033 倳 %26%2320531%3B]
-    expected: FAIL
-
-  [cjk  U+5034 倴 %26%2320532%3B]
-    expected: FAIL
-
-  [cjk  U+5035 倵 %26%2320533%3B]
-    expected: FAIL
-
-  [cjk  U+5037 倷 %26%2320535%3B]
-    expected: FAIL
-
-  [cjk  U+5038 倸 %26%2320536%3B]
-    expected: FAIL
-
-  [cjk  U+503A 债 %26%2320538%3B]
-    expected: FAIL
-
-  [cjk  U+503B 倻 %26%2320539%3B]
-    expected: FAIL
-
-  [cjk  U+503C 值 %26%2320540%3B]
-    expected: FAIL
-
-  [cjk  U+503D 倽 %26%2320541%3B]
-    expected: FAIL
-
-  [cjk  U+503E 倾 %26%2320542%3B]
-    expected: FAIL
-
-  [cjk  U+503F 倿 %26%2320543%3B]
-    expected: FAIL
-
-  [cjk  U+5041 偁 %26%2320545%3B]
-    expected: FAIL
-
-  [cjk  U+5044 偄 %26%2320548%3B]
-    expected: FAIL
-
-  [cjk  U+5045 偅 %26%2320549%3B]
-    expected: FAIL
-
-  [cjk  U+504A 偊 %26%2320554%3B]
-    expected: FAIL
-
-  [cjk  U+504B 偋 %26%2320555%3B]
-    expected: FAIL
-
-  [cjk  U+504C 偌 %26%2320556%3B]
-    expected: FAIL
-
-  [cjk  U+504D 偍 %26%2320557%3B]
-    expected: FAIL
-
-  [cjk  U+504E 偎 %26%2320558%3B]
-    expected: FAIL
-
-  [cjk  U+5051 偑 %26%2320561%3B]
-    expected: FAIL
-
-  [cjk  U+5052 偒 %26%2320562%3B]
-    expected: FAIL
-
-  [cjk  U+5053 偓 %26%2320563%3B]
-    expected: FAIL
-
-  [cjk  U+5054 偔 %26%2320564%3B]
-    expected: FAIL
-
-  [cjk  U+5057 偗 %26%2320567%3B]
-    expected: FAIL
-
-  [cjk  U+5058 偘 %26%2320568%3B]
-    expected: FAIL
-
-  [cjk  U+5059 偙 %26%2320569%3B]
-    expected: FAIL
-
-  [cjk  U+505B 偛 %26%2320571%3B]
-    expected: FAIL
-
-  [cjk  U+505D 偝 %26%2320573%3B]
-    expected: FAIL
-
-  [cjk  U+505E 偞 %26%2320574%3B]
-    expected: FAIL
-
-  [cjk  U+505F 偟 %26%2320575%3B]
-    expected: FAIL
-
-  [cjk  U+5060 偠 %26%2320576%3B]
-    expected: FAIL
-
-  [cjk  U+5061 偡 %26%2320577%3B]
-    expected: FAIL
-
-  [cjk  U+5062 偢 %26%2320578%3B]
-    expected: FAIL
-
-  [cjk  U+5063 偣 %26%2320579%3B]
-    expected: FAIL
-
-  [cjk  U+5064 偤 %26%2320580%3B]
-    expected: FAIL
-
-  [cjk  U+5066 偦 %26%2320582%3B]
-    expected: FAIL
-
-  [cjk  U+5067 偧 %26%2320583%3B]
-    expected: FAIL
-
-  [cjk  U+5068 偨 %26%2320584%3B]
-    expected: FAIL
-
-  [cjk  U+5069 偩 %26%2320585%3B]
-    expected: FAIL
-
-  [cjk  U+506A 偪 %26%2320586%3B]
-    expected: FAIL
-
-  [cjk  U+506B 偫 %26%2320587%3B]
-    expected: FAIL
-
-  [cjk  U+506D 偭 %26%2320589%3B]
-    expected: FAIL
-
-  [cjk  U+506E 偮 %26%2320590%3B]
-    expected: FAIL
-
-  [cjk  U+506F 偯 %26%2320591%3B]
-    expected: FAIL
-
-  [cjk  U+5071 偱 %26%2320593%3B]
-    expected: FAIL
-
-  [cjk  U+5073 偳 %26%2320595%3B]
-    expected: FAIL
-
-  [cjk  U+5077 偷 %26%2320599%3B]
-    expected: FAIL
-
-  [cjk  U+5079 偹 %26%2320601%3B]
-    expected: FAIL
-
-  [cjk  U+507A 偺 %26%2320602%3B]
-    expected: FAIL
-
-  [cjk  U+507B 偻 %26%2320603%3B]
-    expected: FAIL
-
-  [cjk  U+507C 偼 %26%2320604%3B]
-    expected: FAIL
-
-  [cjk  U+507E 偾 %26%2320606%3B]
-    expected: FAIL
-
-  [cjk  U+507F 偿 %26%2320607%3B]
-    expected: FAIL
-
-  [cjk  U+5081 傁 %26%2320609%3B]
-    expected: FAIL
-
-  [cjk  U+5082 傂 %26%2320610%3B]
-    expected: FAIL
-
-  [cjk  U+5083 傃 %26%2320611%3B]
-    expected: FAIL
-
-  [cjk  U+5084 傄 %26%2320612%3B]
-    expected: FAIL
-
-  [cjk  U+5086 傆 %26%2320614%3B]
-    expected: FAIL
-
-  [cjk  U+5087 傇 %26%2320615%3B]
-    expected: FAIL
-
-  [cjk  U+5088 傈 %26%2320616%3B]
-    expected: FAIL
-
-  [cjk  U+5089 傉 %26%2320617%3B]
-    expected: FAIL
-
-  [cjk  U+508A 傊 %26%2320618%3B]
-    expected: FAIL
-
-  [cjk  U+508B 傋 %26%2320619%3B]
-    expected: FAIL
-
-  [cjk  U+508C 傌 %26%2320620%3B]
-    expected: FAIL
-
-  [cjk  U+508E 傎 %26%2320622%3B]
-    expected: FAIL
-
-  [cjk  U+508F 傏 %26%2320623%3B]
-    expected: FAIL
-
-  [cjk  U+5090 傐 %26%2320624%3B]
-    expected: FAIL
-
-  [cjk  U+5092 傒 %26%2320626%3B]
-    expected: FAIL
-
-  [cjk  U+5093 傓 %26%2320627%3B]
-    expected: FAIL
-
-  [cjk  U+5095 傕 %26%2320629%3B]
-    expected: FAIL
-
-  [cjk  U+5096 傖 %26%2320630%3B]
-    expected: FAIL
-
-  [cjk  U+5097 傗 %26%2320631%3B]
-    expected: FAIL
-
-  [cjk  U+509B 傛 %26%2320635%3B]
-    expected: FAIL
-
-  [cjk  U+509C 傜 %26%2320636%3B]
-    expected: FAIL
-
-  [cjk  U+509D 傝 %26%2320637%3B]
-    expected: FAIL
-
-  [cjk  U+509E 傞 %26%2320638%3B]
-    expected: FAIL
-
-  [cjk  U+509F 傟 %26%2320639%3B]
-    expected: FAIL
-
-  [cjk  U+50A0 傠 %26%2320640%3B]
-    expected: FAIL
-
-  [cjk  U+50A1 傡 %26%2320641%3B]
-    expected: FAIL
-
-  [cjk  U+50A2 傢 %26%2320642%3B]
-    expected: FAIL
-
-  [cjk  U+50A3 傣 %26%2320643%3B]
-    expected: FAIL
-
-  [cjk  U+50A4 傤 %26%2320644%3B]
-    expected: FAIL
-
-  [cjk  U+50A5 傥 %26%2320645%3B]
-    expected: FAIL
-
-  [cjk  U+50A6 傦 %26%2320646%3B]
-    expected: FAIL
-
-  [cjk  U+50A7 傧 %26%2320647%3B]
-    expected: FAIL
-
-  [cjk  U+50A8 储 %26%2320648%3B]
-    expected: FAIL
-
-  [cjk  U+50A9 傩 %26%2320649%3B]
-    expected: FAIL
-
-  [cjk  U+50AA 傪 %26%2320650%3B]
-    expected: FAIL
-
-  [cjk  U+50AB 傫 %26%2320651%3B]
-    expected: FAIL
-
-  [cjk  U+50AE 傮 %26%2320654%3B]
-    expected: FAIL
-
-  [cjk  U+50AF 傯 %26%2320655%3B]
-    expected: FAIL
-
-  [cjk  U+50B0 傰 %26%2320656%3B]
-    expected: FAIL
-
-  [cjk  U+50B1 傱 %26%2320657%3B]
-    expected: FAIL
-
-  [cjk  U+50B6 傶 %26%2320662%3B]
-    expected: FAIL
-
-  [cjk  U+50B8 傸 %26%2320664%3B]
-    expected: FAIL
-
-  [cjk  U+50B9 傹 %26%2320665%3B]
-    expected: FAIL
-
-  [cjk  U+50BA 傺 %26%2320666%3B]
-    expected: FAIL
-
-  [cjk  U+50BB 傻 %26%2320667%3B]
-    expected: FAIL
-
-  [cjk  U+50BC 傼 %26%2320668%3B]
-    expected: FAIL
-
-  [cjk  U+50BD 傽 %26%2320669%3B]
-    expected: FAIL
-
-  [cjk  U+50BF 傿 %26%2320671%3B]
-    expected: FAIL
-
-  [cjk  U+50C0 僀 %26%2320672%3B]
-    expected: FAIL
-
-  [cjk  U+50C1 僁 %26%2320673%3B]
-    expected: FAIL
-
-  [cjk  U+50C3 僃 %26%2320675%3B]
-    expected: FAIL
-
-  [cjk  U+50C4 僄 %26%2320676%3B]
-    expected: FAIL
-
-  [cjk  U+50C6 僆 %26%2320678%3B]
-    expected: FAIL
-
-  [cjk  U+50C7 僇 %26%2320679%3B]
-    expected: FAIL
-
-  [cjk  U+50C8 僈 %26%2320680%3B]
-    expected: FAIL
-
-  [cjk  U+50CB 僋 %26%2320683%3B]
<