Merge mozilla-central to mozilla-inbound. a=merge
authorCosmin Sabou <csabou@mozilla.com>
Tue, 16 Oct 2018 19:29:58 +0300
changeset 489805 1403652ca90125b844c037b1a1f172eed698a777
parent 489777 4e749aa17feec01a32a987c3621029c7b88154af (current diff)
parent 489804 31724aea10cae55f30b825ade226c4d25e11a899 (diff)
child 489806 45de3b6b39960fc7a02dc804915718c60ac52e13
push id247
push userfmarier@mozilla.com
push dateSat, 27 Oct 2018 01:06:44 +0000
reviewersmerge
milestone64.0a1
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