merge mozilla-central to mozilla-inbound. r=merge a=merge
authorSebastian Hengst <archaeopteryx@coole-files.de>
Mon, 09 Oct 2017 23:58:00 +0200
changeset 385260 09d2360fff588ec7c6bb534d952db6c336b894da
parent 385259 6fe7c6bdbb5b4699d234d636ae502d70b4fa702a (current diff)
parent 385200 2ed5e7fbf39e949693d8a7455d6313b14a7aeaf6 (diff)
child 385261 9843839bf1df069f86acb555bbbe44af78b99e9c
push id32650
push userarchaeopteryx@coole-files.de
push dateTue, 10 Oct 2017 09:13:16 +0000
treeherdermozilla-central@77a4c52e9987 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge, merge
milestone58.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
merge mozilla-central to mozilla-inbound. r=merge a=merge
dom/gamepad/windows/WindowsGamepad.cpp
dom/media/platforms/wmf/WMFVideoMFTManager.cpp
dom/plugins/ipc/PluginModuleChild.cpp
gfx/webrender_bindings/RenderD3D11TextureHostOGL.cpp
media/webrtc/signaling/gtest/mediaconduit_unittests.cpp
testing/gtest/gtest/src/gtest.cc
widget/windows/PDFiumEngineShim.cpp
widget/windows/WindowsEMF.cpp
--- a/.eslintignore
+++ b/.eslintignore
@@ -114,16 +114,17 @@ devtools/client/shared/widgets/*.jsm
 devtools/client/storage/test/*.html
 !devtools/client/storage/test/storage-cookies.html
 !devtools/client/storage/test/storage-overflow.html
 !devtools/client/storage/test/storage-search.html
 !devtools/client/storage/test/storage-unsecured-iframe.html
 !devtools/client/storage/test/storage-unsecured-iframe-usercontextid.html
 devtools/client/webaudioeditor/**
 devtools/client/webconsole/net/**
+devtools/client/webconsole/new-console-output/test/mochitest/**
 devtools/client/webconsole/test/**
 devtools/client/webconsole/hudservice.js
 devtools/client/webconsole/webconsole-connection-proxy.js
 devtools/client/webconsole/webconsole.js
 devtools/client/webide/**
 !devtools/client/webide/components/webideCli.js
 devtools/server/tests/browser/storage-*.html
 !devtools/server/tests/browser/storage-unsecured-iframe.html
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -454,16 +454,17 @@ pref("browser.tabs.warnOnCloseOtherTabs"
 pref("browser.tabs.warnOnOpen", true);
 pref("browser.tabs.maxOpenBeforeWarn", 15);
 pref("browser.tabs.loadInBackground", true);
 pref("browser.tabs.opentabfor.middleclick", true);
 pref("browser.tabs.loadDivertedInBackground", false);
 pref("browser.tabs.loadBookmarksInBackground", false);
 pref("browser.tabs.loadBookmarksInTabs", false);
 pref("browser.tabs.tabClipWidth", 140);
+pref("browser.tabs.tabMinWidth", 76);
 #ifdef UNIX_BUT_NOT_MAC
 pref("browser.tabs.drawInTitlebar", false);
 #else
 pref("browser.tabs.drawInTitlebar", true);
 #endif
 
 // Offer additional drag space to the user. The drag space
 // will only be shown if browser.tabs.drawInTitlebar is true.
@@ -482,19 +483,16 @@ pref("browser.tabs.restorebutton", 0);
 // true   return to the tab that opened this tab (its owner)
 // false  return to the adjacent tab (old default)
 pref("browser.tabs.selectOwnerOnClose", true);
 
 pref("browser.tabs.showAudioPlayingIcon", true);
 // This should match Chromium's audio indicator delay.
 pref("browser.tabs.delayHidingAudioPlayingIconMS", 3000);
 
-// The minimum tab width in pixels
-pref("browser.tabs.tabMinWidth", 50);
-
 pref("browser.ctrlTab.previews", false);
 
 // By default, do not export HTML at shutdown.
 // If true, at shutdown the bookmarks in your menu and toolbar will
 // be exported as HTML to the bookmarks.html file.
 pref("browser.bookmarks.autoExportHTML",          false);
 
 // The maximum number of daily bookmark backups to
--- a/browser/base/content/browser-pageActions.js
+++ b/browser/base/content/browser-pageActions.js
@@ -714,16 +714,25 @@ var BrowserPageActions = {
     }
     if (panelAttrName) {
       let attrValue = this.panelNode.getAttribute(panelAttrName);
       if (attrValue) {
         node.setAttribute(attrName, attrValue);
       }
     }
   },
+
+  /**
+   * Call this on tab switch or when the current <browser>'s location changes.
+   */
+  onLocationChange() {
+    for (let action of PageActions.actions) {
+      action.onLocationChange(window);
+    }
+  },
 };
 
 var BrowserPageActionFeedback = {
   /**
    * The feedback page action panel DOM node (DOM node)
    */
   get panelNode() {
     delete this.panelNode;
--- a/browser/base/content/browser.css
+++ b/browser/base/content/browser.css
@@ -5,17 +5,16 @@
 @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
 @namespace html url("http://www.w3.org/1999/xhtml");
 
 :root {
   --panelui-subview-transition-duration: 150ms;
   --lwt-additional-images: none;
   --lwt-background-alignment: right top;
   --lwt-background-tiling: no-repeat;
-  --tab-min-width: 50px;
 }
 
 :root:-moz-lwtheme {
   color: var(--lwt-text-color) !important;
 }
 
 :root:-moz-lwtheme {
   background-color: var(--lwt-accent-color) !important;
@@ -134,16 +133,21 @@ tabbrowser {
   -moz-box-flex: 100;
   max-width: 225px;
   min-width: var(--tab-min-width);
   width: 0;
   transition: min-width 100ms ease-out,
               max-width 100ms ease-out;
 }
 
+:root[uidensity=touch] .tabbrowser-tab:not([pinned]) {
+  /* Touch mode needs additional space for the close button. */
+  min-width: calc(var(--tab-min-width) + 10px);
+}
+
 .tabbrowser-tab:not([pinned]):not([fadein]) {
   max-width: 0.1px;
   min-width: 0.1px;
   visibility: hidden;
 }
 
 .tab-close-button,
 .tab-background {
@@ -197,16 +201,17 @@ tabbrowser {
 }
 
 #TabsToolbar[movingtab] + #nav-bar {
   margin-top: -15px;
   pointer-events: none;
 }
 
 /* Allow dropping a tab on buttons with associated drop actions. */
+#TabsToolbar[movingtab] + #nav-bar > #nav-bar-customization-target > #personal-bookmarks,
 #TabsToolbar[movingtab] + #nav-bar > #nav-bar-customization-target > #home-button,
 #TabsToolbar[movingtab] + #nav-bar > #nav-bar-customization-target > #downloads-button,
 #TabsToolbar[movingtab] + #nav-bar > #nav-bar-customization-target > #bookmarks-menu-button {
   pointer-events: auto;
 }
 
 .new-tab-popup,
 #alltabs-popup {
@@ -367,22 +372,21 @@ toolbarpaletteitem > toolbaritem[sdkstyl
     list-style-image: var(--webextension-toolbar-image-dark, inherit);
   }
 
   .webextension-browser-action[cui-areatype="menu-panel"],
   toolbarpaletteitem[place="palette"] > .webextension-browser-action {
     list-style-image: var(--webextension-menupanel-image, inherit);
   }
 
-  .webextension-browser-action[cui-areatype="menu-panel"],
   toolbarpaletteitem[place="palette"] > .webextension-browser-action:-moz-lwtheme-brighttext {
     list-style-image: var(--webextension-menupanel-image-light, inherit);
   }
 
-  .webextension-browser-action[cui-areatype="menu-panel"],
+  .webextension-browser-action[cui-areatype="menu-panel"]:-moz-lwtheme-darktext,
   toolbarpaletteitem[place="palette"] > .webextension-browser-action:-moz-lwtheme-darktext {
     list-style-image: var(--webextension-menupanel-image-dark, inherit);
   }
 
   .webextension-page-action {
     list-style-image: var(--webextension-urlbar-image, inherit);
   }
 
@@ -404,22 +408,21 @@ toolbarpaletteitem > toolbaritem[sdkstyl
     list-style-image: var(--webextension-toolbar-image-2x-dark, inherit);
   }
 
   .webextension-browser-action[cui-areatype="menu-panel"],
   toolbarpaletteitem[place="palette"] > .webextension-browser-action {
     list-style-image: var(--webextension-menupanel-image-2x, inherit);
   }
 
-  .webextension-browser-action[cui-areatype="menu-panel"],
   toolbarpaletteitem[place="palette"] > .webextension-browser-action:-moz-lwtheme-brighttext {
     list-style-image: var(--webextension-menupanel-image-2x-light, inherit);
   }
 
-  .webextension-browser-action[cui-areatype="menu-panel"],
+  .webextension-browser-action[cui-areatype="menu-panel"]:-moz-lwtheme-darktext,
   toolbarpaletteitem[place="palette"] > .webextension-browser-action:-moz-lwtheme-darktext {
     list-style-image: var(--webextension-menupanel-image-2x-dark, inherit);
   }
 
   .webextension-page-action {
     list-style-image: var(--webextension-urlbar-image-2x, inherit);
   }
 
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -4688,16 +4688,18 @@ var XULBrowserWindow = {
       }
 
       URLBarSetURI(aLocationURI);
 
       BookmarkingUI.onLocationChange();
 
       gIdentityHandler.onLocationChange();
 
+      BrowserPageActions.onLocationChange();
+
       gTabletModePageCounter.inc();
 
       // Utility functions for disabling find
       var shouldDisableFind = function(aDocument) {
         let docElt = aDocument.documentElement;
         return docElt && docElt.getAttribute("disablefastfind") == "true";
       }
 
--- a/browser/base/content/test/general/browser_tabReorder.js
+++ b/browser/base/content/test/general/browser_tabReorder.js
@@ -13,21 +13,16 @@ add_task(async function() {
     }
   });
 
   is(gBrowser.tabs.length, initialTabsLength + 3, "new tabs are opened");
   is(gBrowser.tabs[initialTabsLength], newTab1, "newTab1 position is correct");
   is(gBrowser.tabs[initialTabsLength + 1], newTab2, "newTab2 position is correct");
   is(gBrowser.tabs[initialTabsLength + 2], newTab3, "newTab3 position is correct");
 
-  let scriptLoader = Cc["@mozilla.org/moz/jssubscript-loader;1"].
-                     getService(Ci.mozIJSSubScriptLoader);
-  let EventUtils = {};
-  scriptLoader.loadSubScript("chrome://mochikit/content/tests/SimpleTest/EventUtils.js", EventUtils);
-
   async function dragAndDrop(tab1, tab2, copy) {
     let rect = tab2.getBoundingClientRect();
     let event = {
       ctrlKey: copy,
       altKey: copy,
       clientX: rect.left + rect.width / 2 + 10,
       clientY: rect.top + rect.height / 2,
     };
--- a/browser/components/customizableui/PanelMultiView.jsm
+++ b/browser/components/customizableui/PanelMultiView.jsm
@@ -507,56 +507,56 @@ this.PanelMultiView = class {
       }
 
       let reverse = !!aPreviousView;
       let previousViewNode = aPreviousView || this._currentSubView;
       // If the panelview to show is the same as the previous one, the 'ViewShowing'
       // event has already been dispatched. Don't do it twice.
       let showingSameView = viewNode == previousViewNode;
       let playTransition = (!!previousViewNode && !showingSameView && this._panel.state == "open");
+      let isMainView = viewNode.id == this._mainViewId;
 
       let dwu, previousRect;
       if (playTransition || this.panelViews) {
         dwu = this._dwu;
         previousRect = previousViewNode.__lastKnownBoundingRect =
           dwu.getBoundsWithoutFlushing(previousViewNode);
         if (this.panelViews) {
-          // Here go the measures that have the same caching lifetime as the width
-          // of the main view, i.e. 'forever', during the instance lifetime.
+          // Cache the measures that have the same caching lifetime as the width
+          // or height of the main view, i.e. whilst the panel is shown and/ or
+          // visible.
           if (!this._mainViewWidth) {
             this._mainViewWidth = previousRect.width;
             let top = dwu.getBoundsWithoutFlushing(previousViewNode.firstChild || previousViewNode).top;
             let bottom = dwu.getBoundsWithoutFlushing(previousViewNode.lastChild || previousViewNode).bottom;
             this._viewVerticalPadding = previousRect.height - (bottom - top);
           }
-          // Here go the measures that have the same caching lifetime as the height
-          // of the main view, i.e. whilst the panel is shown and/ or visible.
           if (!this._mainViewHeight) {
             this._mainViewHeight = previousRect.height;
             this._viewContainer.style.minHeight = this._mainViewHeight + "px";
           }
         }
       }
 
       this._viewShowing = viewNode;
       // Because the 'mainview' attribute may be out-of-sync, due to view node
       // reparenting in combination with ephemeral PanelMultiView instances,
       // this is the best place to correct it (just before showing).
-      if (viewNode.id == this._mainViewId)
+      if (isMainView)
         viewNode.setAttribute("mainview", true);
       else
         viewNode.removeAttribute("mainview");
 
       // Make sure that new panels always have a title set.
       if (this.panelViews && aAnchor) {
         if (!viewNode.hasAttribute("title"))
           viewNode.setAttribute("title", aAnchor.getAttribute("label"));
         viewNode.classList.add("PanelUI-subView");
       }
-      if (this.panelViews && this._mainViewWidth)
+      if (this.panelViews && !isMainView && this._mainViewWidth)
         viewNode.style.maxWidth = viewNode.style.minWidth = this._mainViewWidth + "px";
 
       if (!showingSameView || !viewNode.hasAttribute("current")) {
         // Emit the ViewShowing event so that the widget definition has a chance
         // to lazily populate the subview with things or perhaps even cancel this
         // whole operation.
         let detail = {
           blockers: new Set(),
--- a/browser/components/extensions/test/browser/browser_ext_browserAction_theme_icons.js
+++ b/browser/components/extensions/test/browser/browser_ext_browserAction_theme_icons.js
@@ -41,17 +41,17 @@ async function testStaticTheme(options) 
     manifest.browser_action.default_icon = "default.png";
   }
 
   let extension = ExtensionTestUtils.loadExtension({manifest});
 
   await extension.startup();
 
   // Confirm that the browser action has the correct default icon before a theme is loaded.
-  let expectedDefaultIcon = withDefaultIcon ? "default.png" : "light.png";
+  let expectedDefaultIcon = withDefaultIcon ? "default.png" : "dark.png";
   await testBrowserAction(extension, expectedDefaultIcon);
 
   let theme = ExtensionTestUtils.loadExtension({
     manifest: {
       "theme": {
         "images": {
           "headerURL": "background.png",
         },
@@ -159,17 +159,17 @@ add_task(async function browseraction_th
 
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       "browser_action": {
         "default_icon": "default.png",
         "theme_icons": [{
           "light": "light.png",
           "dark": "dark.png",
-          "size": 19,
+          "size": 16,
         }],
       },
     },
   });
 
   await extension.startup();
 
   // Confirm that the browser action has the default icon before a theme is set.
--- a/browser/extensions/formautofill/test/browser/head.js
+++ b/browser/extensions/formautofill/test/browser/head.js
@@ -206,16 +206,17 @@ function getNotification(index = 0) {
  */
 async function clickDoorhangerButton(button, index) {
   let popuphidden = BrowserTestUtils.waitForEvent(PopupNotifications.panel, "popuphidden");
 
   if (button == MAIN_BUTTON || button == SECONDARY_BUTTON) {
     EventUtils.synthesizeMouseAtCenter(getNotification()[button], {});
   } else if (button == MENU_BUTTON) {
     // Click the dropmarker arrow and wait for the menu to show up.
+    await BrowserTestUtils.waitForCondition(() => getNotification().menubutton);
     await sleep(); // menubutton needs extra time for binding
     let notification = getNotification();
     ok(notification.menubutton, "notification menupopup displayed");
     let dropdownPromise =
       BrowserTestUtils.waitForEvent(notification.menupopup, "popupshown");
     await EventUtils.synthesizeMouseAtCenter(notification.menubutton, {});
     await dropdownPromise;
 
--- a/browser/extensions/pocket/bootstrap.js
+++ b/browser/extensions/pocket/bootstrap.js
@@ -154,35 +154,88 @@ var PocketPageAction = {
 
           BrowserUtils.setToolbarButtonHeightProperty(urlbarNode);
 
           PocketPageAction.urlbarNode = urlbarNode;
           PocketPageAction.urlbarNode.setAttribute("open", "true");
           if (Services.prefs.getBoolPref("toolkit.cosmeticAnimations.enabled")) {
             PocketPageAction.urlbarNode.setAttribute("animate", "true");
           }
-        },
-        onIframeHiding(iframe, panel) {
-          if (iframe.getAttribute("itemAdded") == "true") {
-            iframe.ownerGlobal.LibraryUI.triggerLibraryAnimation("pocket");
-          }
+
+          let browser = panel.ownerGlobal.gBrowser.selectedBrowser;
+          PocketPageAction.pocketedBrowser = browser;
+          PocketPageAction.pocketedBrowserInnerWindowID = browser.innerWindowID;
         },
         onIframeHidden(iframe, panel) {
           if (!PocketPageAction.urlbarNode) {
             return;
           }
           PocketPageAction.urlbarNode.removeAttribute("animate");
           PocketPageAction.urlbarNode.removeAttribute("open");
-          PocketPageAction.urlbarNode = null;
+          delete PocketPageAction.urlbarNode;
+
+          if (iframe.getAttribute("itemAdded") == "true") {
+            iframe.ownerGlobal.LibraryUI.triggerLibraryAnimation("pocket");
+            PocketPageAction.innerWindowIDsByBrowser.set(
+              PocketPageAction.pocketedBrowser,
+              PocketPageAction.pocketedBrowserInnerWindowID
+            );
+          } else {
+            PocketPageAction.innerWindowIDsByBrowser.delete(
+              PocketPageAction.pocketedBrowser
+            );
+          }
+          PocketPageAction.updateUrlbarNodeState(panel.ownerGlobal);
+          delete PocketPageAction.pocketedBrowser;
+          delete PocketPageAction.pocketedBrowserInnerWindowID;
+        },
+        onLocationChange(browserWindow) {
+          PocketPageAction.updateUrlbarNodeState(browserWindow);
         },
       }));
     }
     Pocket.pageAction = this.pageAction;
   },
 
+  // For pocketed inner windows, this maps their <browser>s to those inner
+  // window IDs.  If a browser's inner window changes, then the mapped ID will
+  // be out of date, meaning that the new inner window has not been pocketed.
+  // If a browser goes away, then it'll be gone from this map too since it's
+  // weak.  To tell whether a window has been pocketed then, look up its browser
+  // in this map and compare the mapped inner window ID to the ID of the current
+  // inner window.
+  get innerWindowIDsByBrowser() {
+    delete this.innerWindowIDsByBrowser;
+    return this.innerWindowIDsByBrowser = new WeakMap();
+  },
+
+  // Sets or removes the "pocketed" attribute on the Pocket urlbar button as
+  // necessary.
+  updateUrlbarNodeState(browserWindow) {
+    if (!this.pageAction) {
+      return;
+    }
+    let {BrowserPageActions} = browserWindow;
+    let urlbarNode = browserWindow.document.getElementById(
+      BrowserPageActions._urlbarButtonNodeIDForActionID(this.pageAction.id)
+    );
+    if (!urlbarNode) {
+      return;
+    }
+    let browser = browserWindow.gBrowser.selectedBrowser;
+    let pocketedInnerWindowID = this.innerWindowIDsByBrowser.get(browser);
+    if (pocketedInnerWindowID == browser.innerWindowID) {
+      // The current window in this browser is pocketed.
+      urlbarNode.setAttribute("pocketed", "true");
+    } else {
+      // The window isn't pocketed.
+      urlbarNode.removeAttribute("pocketed");
+    }
+  },
+
   shutdown() {
     if (!this.pageAction) {
       return;
     }
 
     for (let win of browserWindows()) {
       let doc = win.document;
       let pocketButtonBox = doc.getElementById("pocket-button-box");
--- a/browser/extensions/pocket/skin/shared/pocket.css
+++ b/browser/extensions/pocket/skin/shared/pocket.css
@@ -7,17 +7,18 @@
   list-style-image: url("chrome://pocket-shared/skin/pocket.svg");
 }
 
 #pocket-button-box[animate="true"] > #pocket-button,
 #pocket-button[open="true"][animationsenabled] > .toolbarbutton-icon {
   fill: transparent;
 }
 
-#pocket-button-box[open="true"] > #pocket-button {
+#pocket-button-box[open="true"] > #pocket-button,
+#pocket-button-box[pocketed="true"] > #pocket-button {
   fill: #ef4056;
   fill-opacity: 1;
 }
 
 @keyframes pocket-animation {
   from {
     transform: translateX(0);
   }
--- a/browser/extensions/screenshots/webextension/_locales/ach/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/ach/messages.json
@@ -71,16 +71,19 @@
     "message": "Woo! Firefox Screenshots opo oo."
   },
   "genericErrorDetails": {
     "message": "Pe wa ngeyo ngo ma otime kombedi. Iromo temo ne doki onyo mako cal pa potbuk mukene?"
   },
   "tourBodyIntro": {
     "message": "Maki, gwoki, ki nywak cal me wang kio labongo weko Firefox."
   },
+  "tourHeaderPageAction": {
+    "message": "Yoo manyen me gwoko"
+  },
   "tourHeaderClickAndDrag": {
     "message": "Mak ngo ma imito keken"
   },
   "tourBodyClickAndDrag": {
     "message": "Dii ka i ywar me mako cal pa but potbuk keken. Itwero bene wot iwiye me wero yer mamegi."
   },
   "tourHeaderFullPage": {
     "message": "Mak dirica onyo Potbuk weng"
--- a/browser/extensions/screenshots/webextension/_locales/be/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/be/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Спасылка на ваш здымак была скапіявана ў буфер абмену. Націсніце $META_KEY$-V для ўстаўкі.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Гэта выява была абрэзана да $PIXELS$пікселяў.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Адбылася памылка."
   },
   "requestErrorDetails": {
     "message": "Выбачайце! Нам не ўдалося захаваць ваш здымак. Паспрабуйце пазней."
   },
   "connectionErrorTitle": {
     "message": "Мы не можам атрымаць доступ да вашых скрыншотаў."
@@ -77,16 +85,22 @@
     "message": "Вой! З Firefox Screenshots нешта не так."
   },
   "genericErrorDetails": {
     "message": "Мы не ўпэўненыя, у чым праблема. Паспрабаваць яшчэ раз, ці зрабіць здымак іншай старонкі?"
   },
   "tourBodyIntro": {
     "message": "Рабіце здымкі экрана, захоўвайце і дзяліцеся імі не выходзячы з Firefox."
   },
+  "tourHeaderPageAction": {
+    "message": "Новы спосаб захаваць"
+  },
+  "tourBodyPageAction": {
+    "message": "Разгарніце меню Дзеянні старонкі ў адрасным радку, калі жадаеце зрабіць скрыншот."
+  },
   "tourHeaderClickAndDrag": {
     "message": "Рабіце скрыншоты чаго заўгодна"
   },
   "tourBodyClickAndDrag": {
     "message": "Пстрыкніце і пацягніце мышшу для захопу часткі старонкі. Вы таксама можаце навесці курсор мышы для падсвятлення абранай вобласці."
   },
   "tourHeaderFullPage": {
     "message": "Рабіце захоп вокнаў або цэлых старонак"
--- a/browser/extensions/screenshots/webextension/_locales/bg/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/bg/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Препратка към снимката е копирана в системния буфер. За да я поставите натиснете $META_KEY$-V.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Изображението е отрязано до $PIXELS$px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Повреда."
   },
   "requestErrorDetails": {
     "message": "Съжаляваме! Снимката не е запазена. Опитайте по-късно."
   },
   "connectionErrorTitle": {
     "message": "Няма връзка с вашите снимки."
@@ -77,16 +85,22 @@
     "message": "Леле! Нещо се обърка с Firefox Screenshots."
   },
   "genericErrorDetails": {
     "message": "Не сме сигурни какво точно се случи. Може да опитате отново, както и да снимате друга страница."
   },
   "tourBodyIntro": {
     "message": "Създавайте, запазвайте и споделяйте снимки на екрана без да напускате Firefox."
   },
+  "tourHeaderPageAction": {
+    "message": "Нов начин за запазване"
+  },
+  "tourBodyPageAction": {
+    "message": "Отворете менюто за действия със страницата, което се намира в адресната лента, когато желаете да направите снимка на екрана."
+  },
   "tourHeaderClickAndDrag": {
     "message": "Уловете само нужното"
   },
   "tourBodyClickAndDrag": {
     "message": "Щракнете с мишката или влачете, за да уловите части от страницата. А когато посочите елементи от страницата – те се осветяват."
   },
   "tourHeaderFullPage": {
     "message": "Улавяйте прозорци и цели страници"
--- a/browser/extensions/screenshots/webextension/_locales/bn_BD/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/bn_BD/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "আপার সট এর লিংক ক্লিপবোর্ডে কপি করা হয়েছে। পেস্ট করতে $META_KEY$-V চাপুন।",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "ইমেজটিকে $PIXELS$পিক্সেলে ক্রপ করা হয়েছে।",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "বিকল।"
   },
   "requestErrorDetails": {
     "message": "দুঃখিত! আমরা আপনার সট সংরক্ষণ করতে পারিনি। অনুগ্রহ পুনরায় চেষ্টা করুন।"
   },
   "connectionErrorTitle": {
     "message": "আমরা আপনার স্ক্রিটসটসমূহ সংযোগ করতে পারছি না।"
@@ -77,16 +85,22 @@
     "message": "আয় হায়! Firefox স্ক্রিনশট পাগল হয়ে গেছে।"
   },
   "genericErrorDetails": {
     "message": "এই মাত্র কি ঘটেছে আমরা নিশ্চিত নই। আপনি কি অনুগ্রহ করে পুরনায় সট নেবেন কিংবা ভিন্ন একটি পেজে চেষ্টা করবেন?"
   },
   "tourBodyIntro": {
     "message": "Firefox ত্যাগ করা ছাড়াই স্ক্রিনশট তোল, সংরক্ষণ কর এবং শেয়ার কর।"
   },
+  "tourHeaderPageAction": {
+    "message": "সংরক্ষণ করার এক নতুন পদ্ধতি"
+  },
+  "tourBodyPageAction": {
+    "message": "আপনি যখন কোন স্ক্রিনশট নিবেন, এড্রেস বার থেকে একশন মেনু খুলে নিন।"
+  },
   "tourHeaderClickAndDrag": {
     "message": "ক্যাপচার করুন আপনি যা চান"
   },
   "tourBodyClickAndDrag": {
     "message": "একটি পেজের কিয়দংশ ক্যাপচার করতে ক্লিক করে ড্রাগ করুন। অতঃপর আপনি মাউজ হোভার করে আপনার নির্বাচিত অংশ হাইলাইট করতে পারবেন।"
   },
   "tourHeaderFullPage": {
     "message": "উইন্ডো ক্যাপচার করুন অথবা পুরো পেজ"
--- a/browser/extensions/screenshots/webextension/_locales/ca/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/ca/messages.json
@@ -77,16 +77,22 @@
     "message": "El Firefox Screenshots ha tingut un problema."
   },
   "genericErrorDetails": {
     "message": "S'ha produït un error inesperat. Torneu-ho a provar o captureu una altra pàgina."
   },
   "tourBodyIntro": {
     "message": "Feu, deseu i compartiu captures de pantalla sense sortir del Firefox."
   },
+  "tourHeaderPageAction": {
+    "message": "Una forma nova de desar les captures"
+  },
+  "tourBodyPageAction": {
+    "message": "Amplieu el menú d'accions de la pàgina de la barra d'adreces quan vulgueu fer una captura de pantalla."
+  },
   "tourHeaderClickAndDrag": {
     "message": "Captureu tot allò que vulgueu"
   },
   "tourBodyClickAndDrag": {
     "message": "Feu clic i arrossegueu per capturar només una part de la pàgina. També podeu moure el ratolí per sobre per ressaltar la vostra selecció."
   },
   "tourHeaderFullPage": {
     "message": "Captureu la finestra o la pàgina sencera"
--- a/browser/extensions/screenshots/webextension/_locales/cak/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/cak/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Xwachib'ëx pa molwuj ri ruximonel awachib'al. Tapitz'a' $META_KEY$-V richin natz'äm.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Re wachib'äl re' xqupïx pa $PIXELS$px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Man nisamäj ta."
   },
   "requestErrorDetails": {
     "message": "¡Takuyu! Man yojtikïr ta niqayäk ri awachib'al. Tatojtob'ej jumej."
   },
   "connectionErrorTitle": {
     "message": "Man yojtikïr ta yojok pari taq chapoj awachib'al."
--- a/browser/extensions/screenshots/webextension/_locales/cs/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/cs/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Odkaz na váš snímek byl zkopírován do schránky. Pro vložení stiskněte $META_KEY$-V.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Tento obrázek byl oříznutý na $PIXELS$px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Mimo provoz."
   },
   "requestErrorDetails": {
     "message": "Je nám líto, ale nemohli jsme vás snímek uložit. Zkuste to prosím znovu později."
   },
   "connectionErrorTitle": {
     "message": "Nedaří se nám připojit k vašim snímkům."
--- a/browser/extensions/screenshots/webextension/_locales/cy/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/cy/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Mae'r ddolen i'ch llun wedi ei gopïo i'r clipfwrdd. Pwyswch $META_KEY$-V i'w ludo.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Mae'r ddelwedd wedi ei thocio i $PIXELS$px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Ddim yn gweithio."
   },
   "requestErrorDetails": {
     "message": "Ymddiheuriadau! Nid oedd modd cadw eich llun. Ceisiwch eto'n hwyrach."
   },
   "connectionErrorTitle": {
     "message": "Nid oes modd i ni gysylltu a'ch lluniau sgrin."
--- a/browser/extensions/screenshots/webextension/_locales/de/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/de/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Der Link zu Ihrem Bildschirmfoto wurde in die Zwischenablage kopiert. Drücken Sie $META_KEY$-V zum Einfügen.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Diese Grafik wurde auf $PIXELS$ px zugeschnitten.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Außer Betrieb."
   },
   "requestErrorDetails": {
     "message": "Wir konnten Ihr Bildschirmfoto leider nicht speichern. Bitte versuchen Sie es später erneut."
   },
   "connectionErrorTitle": {
     "message": "Es war keine Verbindung zu Ihren Bildschirmfotos möglich."
--- a/browser/extensions/screenshots/webextension/_locales/dsb/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/dsb/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Wótkaz k wašomu fotoju wobrazowki jo se do mjazywótkłada kopěrował. Tłocćo $META_KEY$-V, aby jen zasajźił.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Toś ten wobraz jo se na $PIXELS$px pśirězał.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Njeźěła."
   },
   "requestErrorDetails": {
     "message": "Bóžko njejsmy mógli wašo foto wobrazowki składowaś. Pšosym wopytajśo pózdźej hyšći raz."
   },
   "connectionErrorTitle": {
     "message": "Njamóžomy z wašymi fotami wobrazowki zwězaś."
--- a/browser/extensions/screenshots/webextension/_locales/el/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/el/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Ο σύνδεσμος προς την λήψη σας αντιγράφηκε στο πρόχειρο. Πατήστε $META_KEY$-V για επικόλληση.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Αυτή η εικόνα έχει περικοπεί σε $PIXELS$px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Εκτός λειτουργίας."
   },
   "requestErrorDetails": {
     "message": "Συγνώμη! Δεν μπορέσαμε να αποθηκεύουμε την λήψη σας. Προσπαθήστε ξανά αργότερα."
   },
   "connectionErrorTitle": {
     "message": "Δεν μπορούμε να συνδεθούμε στις λήψεις σας."
@@ -77,16 +85,19 @@
     "message": "Ωχ! Κάτι πήγε στραβά στην υπηρεσία Firefox Screenshots."
   },
   "genericErrorDetails": {
     "message": "Δεν είμαστε σίγουροι για το τι ακριβώς συνέβη. Προσπαθήστε ξανά ή κάντε λήψη σε μια άλλη σελίδα."
   },
   "tourBodyIntro": {
     "message": "Λήψη, αποθήκευση και διαμοιρασμός στιγμιοτύπων μέσα από το Firefox."
   },
+  "tourHeaderPageAction": {
+    "message": "Ένας νέος τρόπος αποθήκευσης"
+  },
   "tourHeaderClickAndDrag": {
     "message": "Καταγράψτε αυτό που εσείς επιθυμείτε"
   },
   "tourBodyClickAndDrag": {
     "message": "Κάντε κλικ και σύρετε για την καταγραφή ενός τμήματος της σελίδας. Μπορείτε να επισημάνετε την επιλογή σας μετακινώντας τον ποντίκι σας επάνω της."
   },
   "tourHeaderFullPage": {
     "message": "Λήψη παραθύρων ή ολόκληρων σελίδων"
--- a/browser/extensions/screenshots/webextension/_locales/eo/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/eo/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "La ligilo al via ekrankopio estis kopiita al la tondujo. Premu $META_KEY$-V por alglui.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Tiu ĉi bildo estis pritondita je $PIXELS$px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Ne funkcianta."
   },
   "requestErrorDetails": {
     "message": "Bedaŭrinde ni ne povis konservi vian ekrankopion. Bonvolu klopodi denove poste."
   },
   "connectionErrorTitle": {
     "message": "Ni ne povas konektiĝi al viaj ekrankopioj."
--- a/browser/extensions/screenshots/webextension/_locales/es_AR/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/es_AR/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "El enlace a la captura ha sido copiado al portapapeles. Presioná $META_KEY$-V para pegar.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Esta imagen ha sido recortada a $PIXELS$px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "No funciona."
   },
   "requestErrorDetails": {
     "message": "¡Perdón! No pudimos guardar la captura. Intentá más tarde."
   },
   "connectionErrorTitle": {
     "message": "No podemos conectar a las capturas de pantalla."
@@ -77,16 +85,22 @@
     "message": "¡Apa! Firefox Screenshots se volvió loco."
   },
   "genericErrorDetails": {
     "message": "No estamos seguros de lo que pasó. ¿Querés intenar de nuevo o tomar una captura de una página diferente?"
   },
   "tourBodyIntro": {
     "message": "Hacer, guardar y compartir capturas de pantalla sin dejar Firefox."
   },
+  "tourHeaderPageAction": {
+    "message": "Una nueva forma de guardar"
+  },
+  "tourBodyPageAction": {
+    "message": "Expandí el menú de acciones de página en la barra de direcciones cuando quieras tomar una captura."
+  },
   "tourHeaderClickAndDrag": {
     "message": "Capturar sólo lo que querés"
   },
   "tourBodyClickAndDrag": {
     "message": "Hacé clic y arrastrá para capturar una porción de la página. También podés pasar por encima para resaltar la selección."
   },
   "tourHeaderFullPage": {
     "message": "Capturar ventanas o páginas enteras"
--- a/browser/extensions/screenshots/webextension/_locales/es_CL/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/es_CL/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "El enlace a tu captura ha sido copiado al portapapeles. Presiona $META_KEY$-V para pegarla.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Esta imagen ha sido recortada a $PIXELS$px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Fuera de orden."
   },
   "requestErrorDetails": {
     "message": "¡Lo sentimos! No pudimos guardar tu captura. Por favor, vuelve a intentarlo más tarde."
   },
   "connectionErrorTitle": {
     "message": "No podemos conectar a tus capturas."
@@ -77,16 +85,22 @@
     "message": "¡Guau! Firefox Screenshots se copetió."
   },
   "genericErrorDetails": {
     "message": "No estamos seguros de lo que sucedió. ¿Te importaría volver a intentarlo o tomar una captura de una página diferente?"
   },
   "tourBodyIntro": {
     "message": "Toma, guarda y comparte capturas sin salir de Firefox."
   },
+  "tourHeaderPageAction": {
+    "message": "Una nueva forma de guardar"
+  },
+  "tourBodyPageAction": {
+    "message": "Expande el menú de acciones de página en la barra de direcciones en cualquier momento en que quieras tomar una captura."
+  },
   "tourHeaderClickAndDrag": {
     "message": "Captura lo que necesitas"
   },
   "tourBodyClickAndDrag": {
     "message": "Haz clic y arrastra para captura justo una parte de la página. También puedes colocarte sobre una parte para destacar tu selección."
   },
   "tourHeaderFullPage": {
     "message": "Captura ventanas o páginas completas"
--- a/browser/extensions/screenshots/webextension/_locales/es_ES/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/es_ES/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Se ha copiado el enlace a la captura en el portapapeles. Pulsa $META_KEY$-V para pegar.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Se recortó la imagen a $PIXELS$px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "No funciona."
   },
   "requestErrorDetails": {
     "message": "¡Lo sentimos! No hemos podido guardar tu captura. Inténtalo más tarde."
   },
   "connectionErrorTitle": {
     "message": "No podemos acceder a tus capturas de pantalla."
--- a/browser/extensions/screenshots/webextension/_locales/es_MX/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/es_MX/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "El enlace que has capturado ha sido copiado al portapapeles. Presiona $META_KEY$-V para pegar.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Esta imagen ha sido recortada a $PIXELS$px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Fuera de orden."
   },
   "requestErrorDetails": {
     "message": "¡Lo sentimos! No pudimos guardar tu captura. Por favor, intenta de nuevo más tarde."
   },
   "connectionErrorTitle": {
     "message": "No podemos conectar a tus capturas de pantalla."
@@ -77,16 +85,22 @@
     "message": "¡Oye! Las capturas de pantalla de Firefox salieron mal."
   },
   "genericErrorDetails": {
     "message": "No estamos seguros qué pasó. ¿Te importaría intentarlo de nuevo o tomar una captura de una página diferente?"
   },
   "tourBodyIntro": {
     "message": "Toma, guarda y comparte capturas de pantalla sin dejar Firefox."
   },
+  "tourHeaderPageAction": {
+    "message": "Una nueva forma de guardar"
+  },
+  "tourBodyPageAction": {
+    "message": "Expande el menú de acciones de la página en la barra de direcciones en cualquier momento que quieras tomar una captura de pantalla."
+  },
   "tourHeaderClickAndDrag": {
     "message": "Captura sólo lo que necesitas"
   },
   "tourBodyClickAndDrag": {
     "message": "Haz clic y arrastra para capturas sólo una parte de la página. También puedes desplazarte para resaltar tu selección."
   },
   "tourHeaderFullPage": {
     "message": "Captura ventanas o páginas enteras"
--- a/browser/extensions/screenshots/webextension/_locales/et/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/et/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Link sinu pildile kopeeriti lõikepuhvrisse. Asetamiseks vajuta $META_KEY$-V.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "See pilt on vähendatud $PIXELS$-le pikslile.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Tekkis viga."
   },
   "requestErrorDetails": {
     "message": "Vabandame! Me ei suutnud su pilti salvestada. Palun proovi hiljem uuesti."
   },
   "connectionErrorTitle": {
     "message": "Ühendumine sinu ekraanipiltidega ei õnnestunud."
@@ -77,16 +85,22 @@
     "message": "Oi-oi! Firefox Screenshots läks sassi."
   },
   "genericErrorDetails": {
     "message": "Me pole kindlad, mis just juhtus. Proovid ehk uuesti või teed ekraanipildi mõnest teisest lehest?"
   },
   "tourBodyIntro": {
     "message": "Tee, salvesta ja jaga ekraanipilte Firefoxist lahkumata."
   },
+  "tourHeaderPageAction": {
+    "message": "Uus viis salvestamiseks"
+  },
+  "tourBodyPageAction": {
+    "message": "Laienda lehe tegevuste menüüd aadressiribal, kui soovid ekraanipildi teha."
+  },
   "tourHeaderClickAndDrag": {
     "message": "Salvesta just seda, mida soovid"
   },
   "tourBodyClickAndDrag": {
     "message": "Klõpsa ja lohista lehe osa valimiseks. Samuti võid valiku esile toomiseks kursorit selle kohal hoida."
   },
   "tourHeaderFullPage": {
     "message": "Salvesta aknaid või terveid lehti"
--- a/browser/extensions/screenshots/webextension/_locales/fa/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/fa/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "لینک عکس شما در کلیپ‌بورد رونوشت شد. $META_KEY$-V را برای جای‌گذاری فشار دهید.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "این تصویر برید شده است به $PIXELS$ پیکسل.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "خارج از سرویس."
   },
   "requestErrorDetails": {
     "message": "متاسفم! نتوانستیم عکس شما را ذخیره کنیم. لطفاً بعدا دوباره تلاش کنید."
   },
   "connectionErrorTitle": {
     "message": "نمی‌توانیم به تصاویر صفحه شما متصل شویم."
@@ -77,16 +85,22 @@
     "message": "اوه! سرویس تصاویر صفحه فایرفاکس قاطی کرده."
   },
   "genericErrorDetails": {
     "message": "مطمئن نیستیم چه اتفاقی افتاده است. می‌خواهید دوباره امتحان کنید یا از یک صفحهٔ دیگر عکس بگیرید؟"
   },
   "tourBodyIntro": {
     "message": "بدون خارج شدن از فایرفاکس، عکس بگیرید، ذخیره کنید و به اشتراک بگذارید."
   },
+  "tourHeaderPageAction": {
+    "message": "روش جدیدی برای ذخیره کردن"
+  },
+  "tourBodyPageAction": {
+    "message": "بازکردن صفحه اقدامات فهرست در آدرس بار هر زمانی که شما تمایل داشته باشید از صفحه عکس بگیرید."
+  },
   "tourHeaderClickAndDrag": {
     "message": "ضبط آنچه شما می‌خواهید"
   },
   "tourBodyClickAndDrag": {
     "message": "کلیک کنید و بکشید تا فقط از قسمتی از صفحه عکس بگیرید. می‌توانید برای برجسته کردن روی ناحیه انتخاب شده حرکت کنید."
   },
   "tourHeaderFullPage": {
     "message": "ضبط پنجره یا کل صفحه‌ها"
--- a/browser/extensions/screenshots/webextension/_locales/fr/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/fr/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Le lien de votre capture a été copié dans le presse-papiers. Appuyez sur $META_KEY$-V pour le coller.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Cette image a été rognée à $PIXELS$ px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Impossible d’effectuer cette action."
   },
   "requestErrorDetails": {
     "message": "Votre capture d’écran n’a pas pu être enregistrée. Veuillez réessayer plus tard."
   },
   "connectionErrorTitle": {
     "message": "Nous ne pouvons pas nous connecter à vos captures d’écran."
--- a/browser/extensions/screenshots/webextension/_locales/fy_NL/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/fy_NL/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "De keppeling nei jo skermôfdruk is nei it klamboerd kopiearre. Brûk $META_KEY$-V om te plakken.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Dizze ôfbylding is ferlytse nei $PIXELS$px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Bûten tsjinst."
   },
   "requestErrorDetails": {
     "message": "Sorry! Wy koene jo skermôfdruk net bewarje. Probearje it letter nochris."
   },
   "connectionErrorTitle": {
     "message": "Wy kinne net ferbine nei jo skermôfdrukken."
--- a/browser/extensions/screenshots/webextension/_locales/he/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/he/messages.json
@@ -62,25 +62,34 @@
     "message": "דף זה אינו דף אינטרנט תקני, ולכן לא ניתן היה לצלם אותו."
   },
   "selfScreenshotErrorTitle": {
     "message": "לא ניתן לצלם את הדף של Firefox Screenshot עצמו!"
   },
   "emptySelectionErrorTitle": {
     "message": "הבחירה שלך קטנה מידי"
   },
+  "privateWindowErrorTitle": {
+    "message": "‏Screenshots מנוטרל במצב גלישה פרטית"
+  },
+  "privateWindowErrorDetails": {
+    "message": "מצטערים על אי הנוחות. אנחנו עובדים על תכונה זו בגרסאות עתידיות."
+  },
   "genericErrorTitle": {
     "message": "אויש! Firefox Screenshots ירד מהפסים."
   },
   "genericErrorDetails": {
     "message": "אנחנו לא בטוחים מה קרה פה הרגע. אכפת לך לנסות שוב או לצלם דף אחר?"
   },
   "tourBodyIntro": {
     "message": "צילום, שמירה ושיתוף של צילומי מסך מבלי לעזוב את Firefox."
   },
+  "tourHeaderPageAction": {
+    "message": "דרך חדשה לשמירה"
+  },
   "tourHeaderClickAndDrag": {
     "message": "לצלם רק את מה שנחוץ לך"
   },
   "tourBodyClickAndDrag": {
     "message": "ניתן ללחוץ ולגרור כדי לצלם רק מקטע מהעמוד. ניתן גם לרחף מעל כדי לסמן את הבחירה שלך."
   },
   "tourHeaderFullPage": {
     "message": "לצלם חלונות או דפים שלמים"
@@ -101,18 +110,29 @@
     "message": "השקופית הבאה"
   },
   "tourPrevious": {
     "message": "השקופית הקודמת"
   },
   "tourDone": {
     "message": "סיום"
   },
-  "termsAndPrivacyNoticeCloudServices": {
-    "message": "מעצם השימוש ב־Firefox Screenshots הכללים של שירותי הענן של Firefox‏ {termsAndPrivacyNoticeTermsLink} ו{termsAndPrivacyNoticePrivacyLink} מוסכמים עליך."
+  "termsAndPrivacyNotice2": {
+    "message": "השימוש ב־Firefox Screenshots מהווה הסכמה ל$TERMSANDPRIVACYNOTICETERMSLINK$ ול$TERMSANDPRIVACYNOTICEPRIVACYLINK$ שלנו.",
+    "placeholders": {
+      "termsandprivacynoticetermslink": {
+        "content": "$1"
+      },
+      "termsandprivacynoticeprivacylink": {
+        "content": "$2"
+      }
+    }
   },
   "termsAndPrivacyNoticeTermsLink": {
     "message": "תנאים"
   },
   "termsAndPrivacyNoticyPrivacyLink": {
     "message": "הצהרת פרטיות"
+  },
+  "libraryLabel": {
+    "message": "צילומי מסך"
   }
 }
\ No newline at end of file
--- a/browser/extensions/screenshots/webextension/_locales/hr/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/hr/messages.json
@@ -77,16 +77,22 @@
     "message": "Uf! Firefox Screenshots se zbrkao."
   },
   "genericErrorDetails": {
     "message": "Nismo sigurno što se upravo dogodilo. Možete li pokušati ponovno ili snimiti drukčiju stranicu?"
   },
   "tourBodyIntro": {
     "message": "Snimite, spremite i dijelite snimke bez da napuštate Firefox."
   },
+  "tourHeaderPageAction": {
+    "message": "Novi način za spremanje"
+  },
+  "tourBodyPageAction": {
+    "message": "Proširite izbornik radnji stranice u adresnoj traci svaki puta kada želite snimiti ekran."
+  },
   "tourHeaderClickAndDrag": {
     "message": "Snimite ono što želite"
   },
   "tourBodyClickAndDrag": {
     "message": "Kliknite i povucite ako želite snimiti samo dio stranice. Također možete označiti vaš odabir tako da preko njega stavite pokazivač miša."
   },
   "tourHeaderFullPage": {
     "message": "Baš kako vam se sviđa"
--- a/browser/extensions/screenshots/webextension/_locales/hsb/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/hsb/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Wotkaz k wašemu fotu wobrazowki je so do mjezyskłada kopěrował. Tłóčće $META_KEY$-V, zo byšće jón zasadźił.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Tutón wobraz je so na $PIXELS$px přitřihał.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Skóncowany."
   },
   "requestErrorDetails": {
     "message": "Bohužel njemóžachmy waše foto wobrazowki składować. Prošu spytajće pozdźišo hišće raz."
   },
   "connectionErrorTitle": {
     "message": "Njemóžemy z wašimi fotami wobrazowki zwjazać."
--- a/browser/extensions/screenshots/webextension/_locales/hu/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/hu/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "A képernyőképre mutató hivatkozás a vágólapra lett másolva. Nyomjon $META_KEY$-V-t a beillesztéshez.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "A kép $PIXELS$px méretűre lett vágva.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Nem működik."
   },
   "requestErrorDetails": {
     "message": "Bocsánat! Nem tudtuk menteni a képet. Próbálkozzon később."
   },
   "connectionErrorTitle": {
     "message": "Nem tudunk kapcsolódni a képernyőképekhez."
--- a/browser/extensions/screenshots/webextension/_locales/hy_AM/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/hy_AM/messages.json
@@ -1,17 +1,17 @@
 {
   "addonDescription": {
     "message": "Ստացեք հոլովակներ և էկրանի հանույթներ վեբից և պահպանեք դանք ժամանակավոր կամ մշտապես:"
   },
   "addonAuthorsList": {
     "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
-    "message": "Ստանալ էկրանի պատկերը"
+    "message": "Ստանալ էկրանի հանույթը"
   },
   "myShotsLink": {
     "message": "Իմ պատկերները"
   },
   "screenshotInstructions": {
     "message": "Քաշեք և սեղմեք էջի վրա՝ ընտրելու տարածքը: Սեղմեք ESC՝ չեղարկելու համար:"
   },
   "saveScreenshotSelectedArea": {
@@ -51,36 +51,48 @@
   },
   "connectionErrorDetails": {
     "message": "Խնդրում ենք ստուգել համացանցային կապակցումը: Եթե մուտք չունեք համացանց՝ հնարավոր է՝ դա Firefox Screenshots ծառայության հետ կապված ժամանակավոր խնդիր է:"
   },
   "loginErrorDetails": {
     "message": "Մենք չենք կարող պահպանել ձեր պատկերը, քանի որ խնդիր կա Firefox Screenshots ծառայության հետ: Փորձեք ավելի ուշ:"
   },
   "unshootablePageErrorTitle": {
-    "message": "Հնարավոր չէ ստանալ էկրանի պատկերը:"
+    "message": "Հնարավոր չէ ստանալ էկրանի հանույթը:"
   },
   "unshootablePageErrorDetails": {
-    "message": "Սա ստանդարտ վեբ էջ չէ, ուստի դուք չեք կարող ստանալ դրա պատկերը:"
+    "message": "Սա ստանդարտ վեբ էջ չէ, ուստի դուք չեք կարող ստանալ դրա հանույթը:"
   },
   "selfScreenshotErrorTitle": {
-    "message": "Դուք չեք կարող ստանալ Firefox Screenshots-ի էջի պատկերը:"
+    "message": "Դուք չեք կարող ստանալ Firefox Screenshots-ի էջի հանույթը:"
   },
   "emptySelectionErrorTitle": {
     "message": "Ընտրվածը քիչ է"
   },
+  "privateWindowErrorTitle": {
+    "message": "Էկրանի հանույթը անջատած է Գաղտնի Դիտարկման կերպում:"
+  },
+  "privateWindowErrorDetails": {
+    "message": "Ներողություն անհարմարության համար: Մենք աշխատում ենք այս յուրահատկության վրա:"
+  },
   "genericErrorTitle": {
     "message": "Firefox Screenshots-ը գնաց գլխիվայր:"
   },
   "genericErrorDetails": {
-    "message": "Մենք վստահ չենք, թե ինչ է տեղի ունեցնել: Կրկին փորձեք կամ փորձեք ստանալ մեկ այլ էջի պատկերը:"
+    "message": "Մենք վստահ չենք, թե ինչ է տեղի ունեցնել: Կրկին փորձեք կամ փորձեք ստանալ մեկ այլ էջի հանույթ:"
   },
   "tourBodyIntro": {
     "message": "Ստացեք, պահպանեք և համօգտագործեք էկրանի հանույթները՝ առանց Firefox-ը լքելու:"
   },
+  "tourHeaderPageAction": {
+    "message": "Պահպանելու նոր ճանապարհ"
+  },
+  "tourBodyPageAction": {
+    "message": "Ընդարձակել էջի գործույթների ցանկը հասցեի գոտիում՝ ցանկացած ժամանակ էկրանի հանույթը ստանալու համար:"
+  },
   "tourHeaderClickAndDrag": {
     "message": "Ստացեք միայն այն, ինչ Ձեզ պետք է:"
   },
   "tourBodyClickAndDrag": {
     "message": "Սեղմեք և քաշեք՝ ստանալու համար միայն էջի մի մասը: Նաև կարող եք վրայով անցկացնել՝ գունանշելու համար ընտրումը:"
   },
   "tourHeaderFullPage": {
     "message": "Ստանալ պատուհանը կամ ամբողջ էջեր"
@@ -117,10 +129,13 @@
       }
     }
   },
   "termsAndPrivacyNoticeTermsLink": {
     "message": "Պայմաններ"
   },
   "termsAndPrivacyNoticyPrivacyLink": {
     "message": "Գաղտնիության ծանուցում"
+  },
+  "libraryLabel": {
+    "message": "Էկրանի հանույթներ"
   }
 }
\ No newline at end of file
--- a/browser/extensions/screenshots/webextension/_locales/id/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/id/messages.json
@@ -1,20 +1,20 @@
 {
   "addonDescription": {
     "message": "Rekam klip dan tangkapan layar dari Web dan simpan untuk sementara atau secara permanen."
   },
   "addonAuthorsList": {
     "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
-    "message": "Buat Tangkapan layar"
+    "message": "Buat Tangkapan Layar"
   },
   "myShotsLink": {
-    "message": "Gambar Saya"
+    "message": "Tangkapan Saya"
   },
   "screenshotInstructions": {
     "message": "Seret atau klik pada laman untuk memilih area. Tekan ESC untuk membatalkan."
   },
   "saveScreenshotSelectedArea": {
     "message": "Simpan"
   },
   "saveScreenshotVisibleArea": {
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Tautan ke gambar Anda telah disalin ke papan klip. Tekan $META_KEY$-V untuk menempelkan.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Gambar ini telah dipotong menjadi $PIXELS$px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Tak dapat digunakan."
   },
   "requestErrorDetails": {
     "message": "Maaf! Kami tidak dapat menyimpan gambar Anda. Silakan coba lagi."
   },
   "connectionErrorTitle": {
     "message": "Kami tidak dapat terhubung dengan tangkapan layar Anda."
@@ -77,16 +85,22 @@
     "message": "Wah! Firefox Screenshots mendadak kacau."
   },
   "genericErrorDetails": {
     "message": "Kami tidak yakin akan apa yang terjadi. Ingin mencoba lagi atau merekam gambar dari laman yang berbeda?"
   },
   "tourBodyIntro": {
     "message": "Ambil, simpan, dan bagikan tangkapan layar tanpa meninggalkan Firefox."
   },
+  "tourHeaderPageAction": {
+    "message": "Cara baru untuk menyimpan"
+  },
+  "tourBodyPageAction": {
+    "message": "Bentangkan menu tindakan laman di bilah alamat setiap kali Anda ingin buat tangkapan layar."
+  },
   "tourHeaderClickAndDrag": {
     "message": "Rekam Bagian Yang Anda Inginkan"
   },
   "tourBodyClickAndDrag": {
     "message": "Klik dan seret untuk merekam sebagian area laman. Anda juga dapat menggeser kursor untuk menyoroti pilihan Anda."
   },
   "tourHeaderFullPage": {
     "message": "Rekam Jendela atau Seluruh Laman"
@@ -96,17 +110,17 @@
   },
   "tourHeaderDownloadUpload": {
     "message": "Sesuka Anda"
   },
   "tourBodyDownloadUpload": {
     "message": "Simpan potongan tangkapan Anda ke Web agar mudah dibagikan, atau unduh ke komputer. Anda pun dapat mengeklik pada tombol Gambar Saya untuk menemukan semua tangkapan yang pernah Anda rekam."
   },
   "tourSkip": {
-    "message": "Lewati"
+    "message": "LEWATI"
   },
   "tourNext": {
     "message": "Salindia Selanjutnya"
   },
   "tourPrevious": {
     "message": "Salindia Sebelumnya"
   },
   "tourDone": {
@@ -125,11 +139,11 @@
   },
   "termsAndPrivacyNoticeTermsLink": {
     "message": "Ketentuan"
   },
   "termsAndPrivacyNoticyPrivacyLink": {
     "message": "Kebijakan Privasi"
   },
   "libraryLabel": {
-    "message": "Tangkapan Layar"
+    "message": "Screenshots"
   }
 }
\ No newline at end of file
--- a/browser/extensions/screenshots/webextension/_locales/it/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/it/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Il link all’immagine è stato copiato negli appunti. Utilizza $META_KEY$-V per incollarlo.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Questa immagine è stata ritagliata a $PIXELS$ px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Fuori servizio"
   },
   "requestErrorDetails": {
     "message": "Siamo spiacenti, non è stato possibile salvare l’immagine. Riprova più tardi."
   },
   "connectionErrorTitle": {
     "message": "Non è possibile accedere agli screenshot salvati."
--- a/browser/extensions/screenshots/webextension/_locales/ja/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/ja/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "ショットへのリンクがクリップボードへコピーされました。$META_KEY$+V キーで貼り付けられます。",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "この画像は $PIXELS$px にトリミングされました。",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "問題が発生しました。"
   },
   "requestErrorDetails": {
     "message": "申し訳ありませんが、ショットを保存できませんでした。また後で試してください。"
   },
   "connectionErrorTitle": {
     "message": "Screenshots ライブラリへ接続できません。"
--- a/browser/extensions/screenshots/webextension/_locales/ka/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/ka/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "თქვენი სურათის ბმული დაკოპირებულია. ჩასმისთვის დააწექით $META_KEY$-V.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "სურათი მოიჭრა $PIXELS$ პიქსელამდე.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "გაფუჭებულია."
   },
   "requestErrorDetails": {
     "message": "ვწუხვარ! გადაღებული სურათის შენახვა ვერ ხერხდება. მოგვიანებით სცადეთ."
   },
   "connectionErrorTitle": {
     "message": "თქვენს გადაღებულ სურათებთან კავშირი ვერ ხერხდება."
@@ -77,16 +85,22 @@
     "message": "ვაი! Firefox Screenshots მწყობრიდან გამოვიდა."
   },
   "genericErrorDetails": {
     "message": "გაუგებარია რა მოხდა. ისევ ცდით ხელახლა თუ სხვა ვებ-გვერდს გადაუღებთ სურათს?"
   },
   "tourBodyIntro": {
     "message": "გადაიღეთ, შეინახეთ და გააზიარეთ ეკრანის სურათები Firefox-იდან გაუსვლელად."
   },
+  "tourHeaderPageAction": {
+    "message": "შენახვის ახალი ხერხი"
+  },
+  "tourBodyPageAction": {
+    "message": "როცა მოგესურვებათ ეკრანისთვის სურათის გადაღება, ჩამოშალეთ გვერდზე მოქმედებების მენიუ, რომელიც მდებარეობს მისამართების ველში."
+  },
   "tourHeaderClickAndDrag": {
     "message": "გადაუღეთ სურათი რასაც გინდათ"
   },
   "tourBodyClickAndDrag": {
     "message": "გადაადგილეთ ან დააწკაპეთ გვერდზე გადასაღები ნაწილის შესარჩევად. ასევე, კურსორის გადატარებით შეგიძლიათ მონიშნოთ სასურველი არეალი."
   },
   "tourHeaderFullPage": {
     "message": "გადაუღეთ სურათები ფანჯრებს ან მთლიან ვებ-გვერდებს"
--- a/browser/extensions/screenshots/webextension/_locales/kab/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/kab/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Aseγwen ar tuṭṭfa-ik yettwanγel yef afus. Senned yef $META_KEY$-V akken ad tsenṭḍeḍ.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Tugna-agi tettwaẓreg ɣer $PIXELS$ ipiksilen.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Yeffeγ i talast."
   },
   "requestErrorDetails": {
     "message": "Suref-aγ! Ur nezmir ara ad nsekles tuṭṭfa-ik. Ɛreḍ tikelt-nniḍen."
   },
   "connectionErrorTitle": {
     "message": "Ur nezmir ara ad neqqen ar tuṭṭfiwin-ik n ugdil."
--- a/browser/extensions/screenshots/webextension/_locales/kk/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/kk/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Сіздің скриншотыңызға сілтеме алмасу буферіне көшірілді. Кірістіру үшін $META_KEY$-V басыңыз.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Бұл сурет $PIXELS$ пиксельге дейін қиылды.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Жұмыс істемейді."
   },
   "requestErrorDetails": {
     "message": "Кешіріңіз! Сіздің скриншотыңызды сақтай алмадық. Кейінірек қайталап көріңіз."
   },
   "connectionErrorTitle": {
     "message": "Скриншоттарыңызға байланыса алмадық."
@@ -77,16 +85,22 @@
     "message": "Қап! Firefox скриншоттары жасамай қалған сияқты."
   },
   "genericErrorDetails": {
     "message": "Не болғанын білмейміз. Қайталап көресіз бе, немесе басқа парақтың скриншотын түсіріп көресіз бе?"
   },
   "tourBodyIntro": {
     "message": "Firefox ішінен скриншоттарды түсіру, сақтау және олармен бөлісу."
   },
+  "tourHeaderPageAction": {
+    "message": "Сақтаудың жаңа жолы"
+  },
+  "tourBodyPageAction": {
+    "message": "Скриншотты жасағыңыз келген уақытта адрестік жолақтың бет әрекеттері мәзірін ашыңыз."
+  },
   "tourHeaderClickAndDrag": {
     "message": "Тек керек нәрсені түсіріңіз"
   },
   "tourBodyClickAndDrag": {
     "message": "Беттің тек бір бөлігін түсіру үшін тышқанды шертіп, тартыңыз. Таңдауыңызды түспен ерекшелеу үшін үстінен өткізсеңіз болады."
   },
   "tourHeaderFullPage": {
     "message": "Терезелер немесе толық беттерді түсіріңіз"
--- a/browser/extensions/screenshots/webextension/_locales/lt/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/lt/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Jūsų nuotraukos saitas buvo nukopijuotas į iškarpinę. Spustelėkite „$META_KEY$-V“ norėdami įdėti.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Ši nuotrauka buvo apkirpta iki $PIXELS$ taškų.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Neveikia."
   },
   "requestErrorDetails": {
     "message": "Atsiprašome! Mums nepavyko įrašyti jūsų nuotraukos. Prašome pabandyti vėliau."
   },
   "connectionErrorTitle": {
     "message": "Mums nepavyko prisijungti prie jūsų ekrano nuotraukų."
@@ -77,16 +85,22 @@
     "message": "Vau! „Firefox Screenshots“ sugedo."
   },
   "genericErrorDetails": {
     "message": "Mes nesame tikri, kas ką tik nutiko. Norite pabandyti dar kartą arba nufotografuoti kitą tinklalapį?"
   },
   "tourBodyIntro": {
     "message": "Darykite, įrašykite ir dalinkitės ekrano nuotraukomis nepalikdami „Firefox“."
   },
+  "tourHeaderPageAction": {
+    "message": "Naujas būdas įrašyti"
+  },
+  "tourBodyPageAction": {
+    "message": "Išskleiskite tinklalapio veiksmų meniu, esantį adreso juostoje, bet kada, kai norite padaryti ekrano nuotrauką."
+  },
   "tourHeaderClickAndDrag": {
     "message": "Užfiksuokite būtent tai, ką norite"
   },
   "tourBodyClickAndDrag": {
     "message": "Spustelėkite ir tempkite, kad užfiksuotumėte tik dalį tinklalapio. Taip pat galite užvesti pelę, norėdami paryškinti savo pasirinkimą."
   },
   "tourHeaderFullPage": {
     "message": "Fiksuokite langus arba ištisus tinklalapius"
--- a/browser/extensions/screenshots/webextension/_locales/mk/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/mk/messages.json
@@ -1,17 +1,17 @@
 {
   "addonDescription": {
     "message": "Земете исечоци и слики од Интернет и зачувајте ги привремено или трајно."
   },
   "addonAuthorsList": {
     "message": "Mozilla <screenshots-feedback@mozilla.com>"
   },
   "contextMenuLabel": {
-    "message": "Фатете слика"
+    "message": "Фати слика"
   },
   "myShotsLink": {
     "message": "Мои слики"
   },
   "screenshotInstructions": {
     "message": "Влечете и кликнете на страницата за да означите регион. Притиснете ESC за да се откажете."
   },
   "saveScreenshotSelectedArea": {
@@ -28,37 +28,45 @@
   },
   "downloadScreenshot": {
     "message": "Преземи"
   },
   "notificationLinkCopiedTitle": {
     "message": "Врската е ископирана"
   },
   "notificationLinkCopiedDetails": {
-    "message": "Врската до Вашата слика е ископирана во меморија. Притиснете $META_KEY$-V за да ја вметнете.",
+    "message": "Врската до вашата слика е ископирана во меморија. Притиснете $META_KEY$-V за да ја вметнете.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Оваа слика е скратена до $PIXELS$px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Не работи."
   },
   "requestErrorDetails": {
-    "message": "Извинете! Не можевме да ја снимиме Вашата слика. Ве молиме обидете се повторно подоцна."
+    "message": "Извинете! Не можевме да ја снимиме вашата слика. Ве молиме обидете се повторно подоцна."
   },
   "connectionErrorTitle": {
-    "message": "Не можеме да пристапиме до Вашите слики од екран."
+    "message": "Не можеме да пристапиме до вашите слики од екран."
   },
   "connectionErrorDetails": {
-    "message": "Ве молиме проверете ја Вашата Интернет-врска. Ако можете да се поврзете на Интернет, тогаш можно е да има привремен проблем со сервисот Firefox Screenshots."
+    "message": "Ве молиме проверете ја вашата Интернет-врска. Ако можете да се поврзете на Интернет, тогаш можно е да има привремен проблем со сервисот Firefox Screenshots."
   },
   "loginErrorDetails": {
-    "message": "Не можевме да ја зачуваме Вашата слика бидејќи има проблем со сервисот Firefox Screenshots. Ве молиме обидете се повторно подоцна."
+    "message": "Не можевме да ја зачуваме вашата слика бидејќи има проблем со сервисот Firefox Screenshots. Ве молиме обидете се повторно подоцна."
   },
   "unshootablePageErrorTitle": {
     "message": "Не можеме да фатиме слика од оваа страница."
   },
   "unshootablePageErrorDetails": {
     "message": "Ова не е обична веб-страница, па не можете да фатите слика од неа."
   },
   "selfScreenshotErrorTitle": {
@@ -77,33 +85,39 @@
     "message": "Ајдее! Firefox Screenshots излезе од контрола."
   },
   "genericErrorDetails": {
     "message": "Не сме баш сигурни што се случи. Сакате да се обидете повторно или да направите слика од друга страница?"
   },
   "tourBodyIntro": {
     "message": "Фаќајте, снимајте и споделувајте слики од екран без да го напуштите Firefox."
   },
+  "tourHeaderPageAction": {
+    "message": "Нов начин за снимање"
+  },
+  "tourBodyPageAction": {
+    "message": "Отворете го менито со активности за страница во адресната лента кога и да сакате да фатите слика."
+  },
   "tourHeaderClickAndDrag": {
-    "message": "Фатете слика од тоа што сакате"
+    "message": "Фати слика од тоа што сакаш"
   },
   "tourBodyClickAndDrag": {
     "message": "Кликнете и влечете за да фатите само дел од страницата. Исто така можете да означите дел и со покажувачот."
   },
   "tourHeaderFullPage": {
-    "message": "Фатете слика од прозорци или цели страници"
+    "message": "Фати слики од прозорци или цели страници"
   },
   "tourBodyFullPage": {
     "message": "Кликнете на копчињата во горниот десен дел за да го снимите видливиот дел на прозорецот или пак, целата страница."
   },
   "tourHeaderDownloadUpload": {
     "message": "Како што Вие сакате"
   },
   "tourBodyDownloadUpload": {
-    "message": "Снимете ги Вашите исечоци на Интернет за полесно споделување или преземете ги на Вашиот компјутер. Исто така можете да кликнете на копчето Мои слики за да ги најдете сите слики што ги имате направено."
+    "message": "Снимете ги вашите исечоци на Интернет за полесно споделување или преземете ги на вашиот компјутер. Исто така можете да кликнете на копчето Мои слики за да ги најдете сите слики што ги имате направено."
   },
   "tourSkip": {
     "message": "ПРЕСКОКНИ"
   },
   "tourNext": {
     "message": "Следен слајд"
   },
   "tourPrevious": {
--- a/browser/extensions/screenshots/webextension/_locales/ms/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/ms/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Pautan ke syot anda telah disalin ke klipbod. Tekan $META_KEY$-V untuk tampal.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Imej ini akan dipangkas menjadi $PIXELS$px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Tidak berfungsi."
   },
   "requestErrorDetails": {
     "message": "Maaf! Kita tidak dapat menyimpan syot anda. Sila cuba lagi nanti."
   },
   "connectionErrorTitle": {
     "message": "Kami tidak dapat menyambungkan ke skrinsyot anda."
--- a/browser/extensions/screenshots/webextension/_locales/nb_NO/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/nb_NO/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Lenken til skjermbildet ditt er kopiert til utklippstavlen. Trykk på $META_KEY$-V for å lime inn.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Dette bildet har blitt beskåret til $PIXELS$px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "I ustand."
   },
   "requestErrorDetails": {
     "message": "Beklager! Vi klarte ikke å lagre skjermbildet ditt. Prøv igjen senere."
   },
   "connectionErrorTitle": {
     "message": "Vi kan ikke koble til dine skjermbilder."
--- a/browser/extensions/screenshots/webextension/_locales/nl/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/nl/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "De koppeling naar uw afbeelding is naar het klembord gekopieerd. Druk op $META_KEY$-V om te plakken.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Deze afbeelding is bijgesneden naar $PIXELS$px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Buiten werking."
   },
   "requestErrorDetails": {
     "message": "Sorry! Uw afbeelding kon niet worden opgeslagen. Probeer het later opnieuw."
   },
   "connectionErrorTitle": {
     "message": "We kunnen geen verbinding met uw schermafdrukken maken."
--- a/browser/extensions/screenshots/webextension/_locales/pa_IN/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/pa_IN/messages.json
@@ -27,16 +27,19 @@
     "message": "ਡਾਊਨਲੋਡ ਕਰੋ"
   },
   "notificationLinkCopiedTitle": {
     "message": "ਲਿੰਕ ਕਾਪੀ ਕੀਤਾ ਗਿਆ"
   },
   "requestErrorTitle": {
     "message": "ਖ਼ਰਾਬ ਹੈ।"
   },
+  "tourHeaderPageAction": {
+    "message": "ਸੰਭਾਲਣ ਦਾ ਨਵਾਂ ਢੰਗ"
+  },
   "tourSkip": {
     "message": "ਛੱਡੋ"
   },
   "tourNext": {
     "message": "ਅਗਲੀ ਸਲਾਈਡ"
   },
   "tourPrevious": {
     "message": "ਪਿਛਲੀ ਸਲਾਈਡ"
--- a/browser/extensions/screenshots/webextension/_locales/pl/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/pl/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Odnośnik do zrzutu został skopiowany do schowka. Naciśnij $META_KEY$-V, aby go wkleić.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Ten obraz został przycięty do $PIXELS$ px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Awaria."
   },
   "requestErrorDetails": {
     "message": "Nie można zapisać zrzutu. Spróbuj ponownie później."
   },
   "connectionErrorTitle": {
     "message": "Nie można połączyć się z zrzutami ekranu."
--- a/browser/extensions/screenshots/webextension/_locales/pt_BR/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/pt_BR/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "O link da sua captura foi copiado para a área de transferência. Pressione $META_KEY$-V para colar.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Esta imagem foi recortada para $PIXELS$px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Oops! Fora do ar."
   },
   "requestErrorDetails": {
     "message": "Desculpe! Não conseguimos salvar a sua captura de tela. Por favor, tente novamente mais tarde."
   },
   "connectionErrorTitle": {
     "message": "Não conseguimos nos conectar às suas capturas de tela."
@@ -77,16 +85,22 @@
     "message": "Uau! Algo correu mal com a capturas de tela do Firefox."
   },
   "genericErrorDetails": {
     "message": "Não temos certeza do que acabou de acontecer. Tentar novamente ou fazer uma captura de uma página diferente?"
   },
   "tourBodyIntro": {
     "message": "Capture, salve e compartilhe telas sem sair do Firefox."
   },
+  "tourHeaderPageAction": {
+    "message": "Um novo jeito de salvar"
+  },
+  "tourBodyPageAction": {
+    "message": "Expandir o menu de ações de página na barra de endereços sempre que você quiser fazer uma captura de tela."
+  },
   "tourHeaderClickAndDrag": {
     "message": "Capture apenas o que você quer"
   },
   "tourBodyClickAndDrag": {
     "message": "Clique e arraste para capturar apenas uma parte de uma página. Você também pode passar o mouse para realçar sua seleção."
   },
   "tourHeaderFullPage": {
     "message": "Capture janelas ou páginas inteiras"
--- a/browser/extensions/screenshots/webextension/_locales/pt_PT/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/pt_PT/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "A ligação para a sua captura foi copiada para a área de transferência. Pressione $META_KEY$-V para colar.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Esta imagem foi recortada para $PIXELS$px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Fora de serviço."
   },
   "requestErrorDetails": {
     "message": "Desculpe! Não conseguimos guardar a sua captura. Por favor tente novamente mais tarde."
   },
   "connectionErrorTitle": {
     "message": "Não conseguimos ligar às suas capturas de ecrã."
@@ -75,38 +83,38 @@
   },
   "genericErrorTitle": {
     "message": "Uau! Algo correu mal com o Firefox Screenshots."
   },
   "genericErrorDetails": {
     "message": "Não temos a certeza do que acabou de acontecer. Importa-se de tentar novamente ou tirar uma captura de uma página diferente?"
   },
   "tourBodyIntro": {
-    "message": "Tire, guarde, e partilhe capturas de ecrã sem sair do Firefox."
+    "message": "Tire, guarde e partilhe capturas de ecrã sem sair do Firefox."
   },
   "tourHeaderPageAction": {
     "message": "Uma nova maneira de guardar"
   },
   "tourBodyPageAction": {
     "message": "Expanda o menu de ações da página na barra de endereço sempre que quiser tirar uma captura de ecrã."
   },
   "tourHeaderClickAndDrag": {
-    "message": "Capture aquilo mesmo que pretende"
+    "message": "Capture exatamente o que quer"
   },
   "tourBodyClickAndDrag": {
-    "message": "Clique e arraste para capturar apenas uma porção de uma página. Pode também pairar para destacar a sua seleção."
+    "message": "Clique e arraste para capturar apenas uma parte de uma página. Pode também pairar para destacar a sua seleção."
   },
   "tourHeaderFullPage": {
     "message": "Capture janelas ou páginas inteiras"
   },
   "tourBodyFullPage": {
     "message": "Selecione os botões no canto superior direito para capturar a área visível na janela ou para capturar uma página inteira."
   },
   "tourHeaderDownloadUpload": {
-    "message": "Como você gostar"
+    "message": "Como você gosta"
   },
   "tourBodyDownloadUpload": {
     "message": "Guarde as suas capturas na Web para partilhar mais facilmente, ou descarregue-as para o seu computador. Pode também clicar no botão Minhas capturas para encontrar todas as capturas que tirou."
   },
   "tourSkip": {
     "message": "SALTAR"
   },
   "tourNext": {
--- a/browser/extensions/screenshots/webextension/_locales/ru/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/ru/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Ссылка на ваш снимок была скопирована в буфер обмена. Нажмите $META_KEY$-V для её вставки.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Это изображение было обрезано до $PIXELS$ пикселей.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Произошла ошибка."
   },
   "requestErrorDetails": {
     "message": "Извините! Мы не смогли сохранить ваш снимок. Пожалуйста, попробуйте позже."
   },
   "connectionErrorTitle": {
     "message": "Мы не смогли получить доступ к вашим скриншотам."
@@ -77,16 +85,22 @@
     "message": "Ого! Скриншоты Firefox вышли из строя."
   },
   "genericErrorDetails": {
     "message": "Мы не уверены, в чём проблема. Попробуете ещё раз или сделаете снимок другой страницы?"
   },
   "tourBodyIntro": {
     "message": "Делайте, сохраняйте и делитесь скриншотами прямо в Firefox."
   },
+  "tourHeaderPageAction": {
+    "message": "Новый способ сохранения"
+  },
+  "tourBodyPageAction": {
+    "message": "Раскройте меню действий на странице в адресной строке в любой момент, когда вы захотите сделать снимок экрана."
+  },
   "tourHeaderClickAndDrag": {
     "message": "Делайте снимки чего угодно"
   },
   "tourBodyClickAndDrag": {
     "message": "Щелкните и потяните мышью для захвата части страницы. Вы также можете навести курсор мыши для подсветки выбранной области."
   },
   "tourHeaderFullPage": {
     "message": "Захватывайте окна или целые страницы"
--- a/browser/extensions/screenshots/webextension/_locales/sk/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/sk/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Odkaz na vašu snímku bol skopírovaný do schránky. Stlačením $META_KEY$-V ho prilepíte.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Tento obrázok bol orezaný na $PIXELS$ px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Mimo prevádzky."
   },
   "requestErrorDetails": {
     "message": "Mrzí nás to, no nemôžeme uložiť vašu snímku. Skúste to, prosím, neskôr."
   },
   "connectionErrorTitle": {
     "message": "Nemôžeme sa spojiť s vašimi snímkami."
--- a/browser/extensions/screenshots/webextension/_locales/sl/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/sl/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Povezava do vašega posnetka zaslona je bila kopirana v odložišče. Pritisnite $META_KEY$-V, da jo prilepite.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Ta slika je bila obrezana na $PIXELS$ pikslov.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Ne dela."
   },
   "requestErrorDetails": {
     "message": "Vašega posnetka nismo uspeli shraniti. Poskusite znova kasneje."
   },
   "connectionErrorTitle": {
     "message": "Ne moremo vzpostaviti povezave do vaših posnetkov."
--- a/browser/extensions/screenshots/webextension/_locales/sr/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/sr/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Веза коју сте забележили је копирана у бележницу. Притисните $META_KEY$-V да налепите.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Слика је исечена на $PIXELS$px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Не ради."
   },
   "requestErrorDetails": {
     "message": "Жао нам је! Нисмо могли сачувати ваш снимак. Покушајте поново касније."
   },
   "connectionErrorTitle": {
     "message": "Не можемо се повезати на ваше снимке."
--- a/browser/extensions/screenshots/webextension/_locales/sv_SE/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/sv_SE/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Länken till din skärmbild har kopierats till urklipp. Tryck på $META_KEY$-V för att klistra in.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Den här bilden har beskurits till $PIXELS$px.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Ur funktion."
   },
   "requestErrorDetails": {
     "message": "Förlåt! Vi kunde inte spara din skärmbild. Försök igen senare."
   },
   "connectionErrorTitle": {
     "message": "Vi kan inte ansluta till dina skärmbilder."
--- a/browser/extensions/screenshots/webextension/_locales/tr/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/tr/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Ekran görüntünüzün bağlantısı panoya kopyalandı. Yapıştırmak için $META_KEY$-V tuşlarına basabilirsiniz.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Resim $PIXELS$ piksele kırpıldı.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Arıza var."
   },
   "requestErrorDetails": {
     "message": "Ekran görüntünüzü kaydedemedik. Lütfen daha sonra yeniden deneyin."
   },
   "connectionErrorTitle": {
     "message": "Ekran görüntülerinize bağlanamadık."
@@ -77,16 +85,22 @@
     "message": "Firefox Screenshosts kafayı yedi!"
   },
   "genericErrorDetails": {
     "message": "Ne olduğunu biz de anlamadık. Bir daha denemeye veya başka bir sayfanın ekran görüntüsünü almaya ne dersiniz?"
   },
   "tourBodyIntro": {
     "message": "Firefox'tan çıkmadan ekran görüntüleri alın, kaydedin ve paylaşın."
   },
+  "tourHeaderPageAction": {
+    "message": "Kaydetmenin yeni yolu"
+  },
+  "tourBodyPageAction": {
+    "message": "Ekran görüntüsü almak istediğiniz zaman adres çubuğundaki sayfa eylemleri menüsünü açabilirsiniz."
+  },
   "tourHeaderClickAndDrag": {
     "message": "İstediğini yakala"
   },
   "tourBodyClickAndDrag": {
     "message": "Sayfanın belli bir kısmını yakalamak için işaretçiyi tıklayıp sürükleyin. Seçiminizi vurgulamak için fareyle üzerine gelebilirsiniz."
   },
   "tourHeaderFullPage": {
     "message": "Pencereleri veya sayfaların tamamını yakala"
--- a/browser/extensions/screenshots/webextension/_locales/uk/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/uk/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "Посилання на ваш знімок було скопійоване до буфера обміну. Натисніть $META_KEY$-V для вставлення.",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "Зображення було обрізано до $PIXELS$ пікселів.",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "Сталася помилка."
   },
   "requestErrorDetails": {
     "message": "Вибачте! Нам не вдалося зберегти ваш знімок. Спробуйте знову пізніше."
   },
   "connectionErrorTitle": {
     "message": "Ми не можемо отримати доступ до ваших знімків."
@@ -77,16 +85,22 @@
     "message": "Оу! З Firefox Screenshots щось негаразд."
   },
   "genericErrorDetails": {
     "message": "Ми не впевнені, в чому проблема. Спробувати ще раз, або ж зробити знімок іншої сторінки?"
   },
   "tourBodyIntro": {
     "message": "Робіть знімки екрану, зберігайте та діліться ними прямо в Firefox."
   },
+  "tourHeaderPageAction": {
+    "message": "Новий спосіб збереження"
+  },
+  "tourBodyPageAction": {
+    "message": "Розгорніть меню дій для сторінки в панелі адреси, коли ви хочете зробити знімок екрану."
+  },
   "tourHeaderClickAndDrag": {
     "message": "Робіть знімки чого завгодно"
   },
   "tourBodyClickAndDrag": {
     "message": "Клацніть і потягніть мишею для захоплення частини сторінки. Ви також можете навести курсор миші для підсвічення вибраної області."
   },
   "tourHeaderFullPage": {
     "message": "Захоплюйте вікна або цілі сторінки"
--- a/browser/extensions/screenshots/webextension/_locales/zh_CN/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/zh_CN/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "您的截图的链接已复制到剪贴板。按 $META_KEY$-V 可粘贴。",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "此图片已裁剪为 $PIXELS$px。",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "出故障了。"
   },
   "requestErrorDetails": {
     "message": "很抱歉,我们无法为您保存截图。请稍后再试。"
   },
   "connectionErrorTitle": {
     "message": "我们无法连接到您的截图。"
@@ -77,16 +85,22 @@
     "message": "哎呀,Firefox Screenshots 遇到问题。"
   },
   "genericErrorDetails": {
     "message": "我们不确定发生了什么。您可以再试一次或者试试另一个页面。"
   },
   "tourBodyIntro": {
     "message": "截取、保存和分享屏幕截图,无需 Firefox 以外的工具。"
   },
+  "tourHeaderPageAction": {
+    "message": "新的保存方法"
+  },
+  "tourBodyPageAction": {
+    "message": "随时可以展开地址栏中的页面操作菜单来截图。"
+  },
   "tourHeaderClickAndDrag": {
     "message": "截取你所需"
   },
   "tourBodyClickAndDrag": {
     "message": "单击并拖动以截取页面某个区域。您也可以把光标移到你要的地方,高亮后单击即可截图。"
   },
   "tourHeaderFullPage": {
     "message": "截取窗口或整个页面"
--- a/browser/extensions/screenshots/webextension/_locales/zh_TW/messages.json
+++ b/browser/extensions/screenshots/webextension/_locales/zh_TW/messages.json
@@ -35,16 +35,24 @@
   "notificationLinkCopiedDetails": {
     "message": "已將您拍攝的圖片鏈結複製到剪貼簿,按下 $META_KEY$+V 即可貼上。",
     "placeholders": {
       "meta_key": {
         "content": "$1"
       }
     }
   },
+  "imageCroppedWarning": {
+    "message": "已將圖片裁切為 $PIXELS$px 大小。",
+    "placeholders": {
+      "pixels": {
+        "content": "$1"
+      }
+    }
+  },
   "requestErrorTitle": {
     "message": "系統維護中。"
   },
   "requestErrorDetails": {
     "message": "抱歉!無法儲存您拍攝的圖片,請稍候再試一次。"
   },
   "connectionErrorTitle": {
     "message": "無法連線至您的畫面擷圖。"
@@ -99,17 +107,17 @@
   },
   "tourBodyFullPage": {
     "message": "透過右上角的不同按鈕來選擇只拍攝視窗中的可見區域,或是整張網頁。"
   },
   "tourHeaderDownloadUpload": {
     "message": "用您想要的方式分享"
   },
   "tourBodyDownloadUpload": {
-    "message": "裁切過的擷圖,可直接傳到網路上方便分享,也能下載到電腦裡。您也可以點擊「我的擷圖」按鈕,尋找您拍過的所有擷圖。"
+    "message": "裁切過的擷圖,可直接傳到網路上方便分享,也能下載到電腦裡;也可以點擊「我的擷圖」按鈕,尋找拍過的所有擷圖。"
   },
   "tourSkip": {
     "message": "略過"
   },
   "tourNext": {
     "message": "下一頁"
   },
   "tourPrevious": {
--- a/browser/modules/PageActions.jsm
+++ b/browser/modules/PageActions.jsm
@@ -517,16 +517,22 @@ this.PageActions = {
  *                * parentPanelNode: The panel node in which the iframe is
  *                  shown.
  *         @param onIframeShown (function, optional)
  *                Called when the action's iframe is shown to the user:
  *                onIframeShown(iframeNode, parentPanelNode)
  *                * iframeNode: The iframe.
  *                * parentPanelNode: The panel node in which the iframe is
  *                  shown.
+ *         @param onLocationChange (function, optional)
+ *                Called after tab switch or when the current <browser>'s
+ *                location changes:
+ *                onLocationChange(browserWindow)
+ *                * browserWindow: The browser window containing the tab switch
+ *                  or changed <browser>.
  *         @param onPlacedInPanel (function, optional)
  *                Called when the action is added to the page action panel in
  *                a browser window:
  *                onPlacedInPanel(buttonNode)
  *                * buttonNode: The action's node in the page action panel.
  *         @param onPlacedInUrlbar (function, optional)
  *                Called when the action is added to the urlbar in a browser
  *                window:
@@ -561,16 +567,17 @@ function Action(options) {
     iconURL: false,
     labelForHistogram: false,
     nodeAttributes: false,
     onBeforePlacedInWindow: false,
     onCommand: false,
     onIframeHiding: false,
     onIframeHidden: false,
     onIframeShown: false,
+    onLocationChange: false,
     onPlacedInPanel: false,
     onPlacedInUrlbar: false,
     onShowingInPanel: false,
     shownInUrlbar: false,
     subview: false,
     tooltip: false,
     urlbarIDOverride: false,
     wantsIframe: false,
@@ -769,16 +776,28 @@ Action.prototype = {
    */
   onIframeShown(iframeNode, parentPanelNode) {
     if (this._onIframeShown) {
       this._onIframeShown(iframeNode, parentPanelNode);
     }
   },
 
   /**
+   * Call this on tab switch or when the current <browser>'s location changes.
+   *
+   * @param  browserWindow (DOM window, required)
+   *         The browser window containing the tab switch or changed <browser>.
+   */
+  onLocationChange(browserWindow) {
+    if (this._onLocationChange) {
+      this._onLocationChange(browserWindow);
+    }
+  },
+
+  /**
    * Call this when a DOM node for the action is added to the page action panel.
    *
    * @param  buttonNode (DOM node, required)
    *         The action's panel button node.
    */
   onPlacedInPanel(buttonNode) {
     if (this._onPlacedInPanel) {
       this._onPlacedInPanel(buttonNode);
--- a/browser/themes/osx/customizableui/panelUI.css
+++ b/browser/themes/osx/customizableui/panelUI.css
@@ -11,20 +11,25 @@
 .restoreallitem > .toolbarbutton-icon {
   display: none;
 }
 
 .subviewbutton {
   padding-inline-start: 18px;
 }
 
+.subviewbutton.download {
+  padding-inline-start: 14px;
+}
+
 photonpanelmultiview .toolbaritem-combined-buttons > label {
   padding-inline-start: 42px; /* 18px toolbarbutton padding + 16px icon + 8px label padding start */
 }
 
+#appMenu-addon-banners > .addon-banner-item,
 #appMenu-mainView > .panel-subview-body > .panel-banner-item {
   padding-inline-start: 18px;
 }
 
 #appMenu-fxa-container[fxastatus="signedin"] > #appMenu-fxa-status > #appMenu-fxa-label {
   /* 18px space before the avatar, then 16px for the avatar */
   padding-inline-start: 34px;
   margin-inline-start: -34px;
--- a/browser/themes/shared/customizableui/customizeMode.inc.css
+++ b/browser/themes/shared/customizableui/customizeMode.inc.css
@@ -52,16 +52,17 @@
 
 %if defined(XP_MACOSX) || defined(XP_WIN)
 %ifdef XP_WIN
 @media (-moz-windows-default-theme) {
 %endif
 
 .customizationmode-button {
   border: 1px solid #b1b1b1;
+  border-radius: 2px;
   background-color: #fcfcfd;
   -moz-appearance: none;
 }
 
 .customizationmode-checkbox,
 .customizationmode-button {
   margin: 6px 10px;
   padding: 2px 5px;
--- a/browser/themes/shared/customizableui/panelUI.inc.css
+++ b/browser/themes/shared/customizableui/panelUI.inc.css
@@ -411,19 +411,19 @@ photonpanelmultiview panelview {
 
 #customizationui-widget-multiview #appMenu-libraryView,
 #pageActionPanel panelview,
 #widget-overflow panelview {
   min-width: @wideMenuPanelWidth@;
   max-width: @wideMenuPanelWidth@;
 }
 
-/* Add 2 * 12px extra width for touch mode button padding. */
+/* Add 2 * 16px extra width for touch mode button padding. */
 #appMenu-popup[touchmode] panelview {
-  min-width: calc(@menuPanelWidth@ + 24px);
+  min-width: calc(@menuPanelWidth@ + 32px);
 }
 
 photonpanelmultiview .panel-subview-body {
   padding: 6px 0;
 }
 
 /* END photonpanelview adjustments */
 
@@ -468,16 +468,17 @@ photonpanelmultiview .panel-subview-body
   width: calc(@menuPanelButtonWidth@);
   height: calc(51px + 2.2em);
 }
 
 .animate-out {
   animation-name: widget-animate-out;
   animation-fill-mode: forwards;
   animation-duration: 500ms;
+  animation-timing-function: var(--animation-easing-function);
 }
 
 @keyframes widget-animate-out {
   0% {
     opacity: 1;
     transform: scale(1);
   }
   100% {
@@ -721,18 +722,18 @@ toolbaritem[cui-areatype="menu-panel"][s
   background-color: var(--appmenu-yellow-warning-hover-color);
 }
 
 .addon-banner-item:active {
   background-color: var(--appmenu-yellow-warning-active-color);
 }
 
 .addon-banner-item > .toolbarbutton-icon {
-  width: 14px;
-  height: 14px;
+  width: 16px;
+  height: 16px;
 }
 
 .addon-banner-item::after {
   background: #FFBF00 url(chrome://browser/skin/update-badge-failed.svg) no-repeat center;
 }
 
 #PanelUI-fxa-status {
   display: flex;
@@ -792,16 +793,20 @@ toolbaritem[cui-areatype="menu-panel"][s
 /* in Photon, we have a bottom border as well. Reconcile with the above rule
  * after photon launch. */
 #appMenu-mainView > .panel-subview-body > .panel-banner-item {
   border-bottom: 1px solid var(--panel-separator-color);
   margin-bottom: 3px;
   padding-inline-start: 12px;
 }
 
+#appMenu-addon-banners > .addon-banner-item {
+  padding-inline-start: 12px;
+}
+
 .panel-banner-item > .toolbarbutton-text {
   width: 0; /* Fancy cropping solution for flexbox. */
 }
 
 /* FxAccount indicator bits. */
 
 /* Add the .toolbaritem-combined-buttons class to increase the specificity so as
  * to override the end margin for .toolbaritem-combined-buttons items further down. */
@@ -896,16 +901,17 @@ toolbaritem[cui-areatype="menu-panel"][s
 }
 
 #PanelUI-help > .toolbarbutton-text,
 #PanelUI-quit > .toolbarbutton-text,
 #PanelUI-fxa-avatar > .toolbarbutton-text {
   display: none;
 }
 
+.addon-banner-item > .toolbarbutton-icon,
 .panel-banner-item > .toolbarbutton-icon,
 #PanelUI-fxa-label > .toolbarbutton-icon,
 #PanelUI-fxa-icon > .toolbarbutton-icon,
 #PanelUI-customize > .toolbarbutton-icon,
 #PanelUI-help > .toolbarbutton-icon,
 #PanelUI-quit > .toolbarbutton-icon {
   margin-inline-end: 0;
 }
@@ -1238,16 +1244,17 @@ panelview .toolbarbutton-1,
 .subviewbutton > .menu-right,
 .subviewbutton > .menu-accel-container > .menu-iconic-accel,
 .subviewbutton > .menu-iconic-left,
 .subviewbutton > .menu-iconic-text {
   padding-bottom: 0;
   padding-top: 0;
 }
 
+.addon-banner-item > .toolbarbutton-text,
 .subviewbutton-iconic > .toolbarbutton-text,
 .cui-withicon > .toolbarbutton-text,
 .subviewbutton[image] > .toolbarbutton-text,
 .subviewbutton[targetURI] > .toolbarbutton-text,
 .subviewbutton.restoreallitem > .toolbarbutton-text,
 .subviewbutton.bookmark-item > .toolbarbutton-text,
 .subviewbutton[checked="true"] > .toolbarbutton-text {
   padding-inline-start: 8px; /* See '.subviewbutton-iconic > .toolbarbutton-text' rule above. */
@@ -1292,16 +1299,17 @@ panelview .toolbarbutton-1,
 .subviewbutton > .menu-accel-container > .menu-iconic-accel,
 .subviewbutton > .menu-accel-container > .menu-accel {
   margin-inline-end: 0 !important; /* to override menu.css on Windows */
 }
 
 #widget-overflow-fixed-list .toolbarbutton-1 > .toolbarbutton-text,
 #widget-overflow-list .toolbarbutton-1 > .toolbarbutton-text,
 .subviewbutton:not(.panel-subview-footer) > .toolbarbutton-text,
+.addon-banner-item > .toolbarbutton-text,
 /* Bookmark items need a more specific selector. */
 .PanelUI-subView .subviewbutton:not(.panel-subview-footer) > .menu-text,
 .PanelUI-subView .subviewbutton:not(.panel-subview-footer) > .menu-iconic-text {
   font: menu;
 }
 
 .subviewbutton[shortcut]::after {
   content: attr(shortcut);
@@ -1421,16 +1429,17 @@ photonpanelmultiview .PanelUI-subView .t
   padding: 1px 8px;
 }
 
 photonpanelmultiview .toolbaritem-combined-buttons > .subviewbutton:not(.subviewbutton-iconic) > .toolbarbutton-text {
   font-size: 1em;
   padding-inline-start: 0;
 }
 
+photonpanelmultiview .addon-banner-item::after,
 photonpanelmultiview .panel-banner-item::after {
   margin-inline-end: 12px;
   margin-inline-start: 10px;
 }
 
 photonpanelmultiview .subview-subheader {
   color: GrayText;
 }
@@ -2114,23 +2123,29 @@ photonpanelmultiview .cui-widget-panelvi
 
 photonpanelmultiview #panelMenu_pocket {
   display: none;
 }
 
 .subviewbutton.download {
   -moz-box-align: start;
   min-height: 48px;
+  padding-inline-start: 8px;
 }
 
 .subviewbutton.download > .toolbarbutton-icon,
 .subviewbutton.download > .toolbarbutton-text > label {
   margin: 4px 0 0;
 }
 
+.subviewbutton.download > .toolbarbutton-icon {
+  width: 32px;
+  height: 32px;
+}
+
 .subviewbutton.download > .toolbarbutton-text > .status-text {
   color: GrayText;
   font-size: .9em;
 }
 
 .subviewbutton.download > .action-button {
   -moz-appearance: none; /* To avoid native Windows hover styling */
   -moz-context-properties: fill;
--- a/browser/themes/shared/tabs.inc.css
+++ b/browser/themes/shared/tabs.inc.css
@@ -5,16 +5,17 @@
 %endif
 %filter substitution
 %define horizontalTabPadding 9px
 
 :root {
   --tabs-top-border-width: 0px;
   --tab-toolbar-navbar-overlap: 1px;
   --tab-min-height: 33px;
+  --tab-min-width: 76px;
   --tab-loading-fill: #0A84FF;
 }
 
 :root[uidensity=compact] {
   --tab-min-height: 29px;
 }
 
 :root[uidensity=touch] {
@@ -47,19 +48,16 @@ tabbrowser {
 
 .tabbrowser-tab {
   -moz-appearance: none;
   background-color: transparent;
   border-radius: 0;
   border-width: 0;
   margin: 0;
   padding: 0;
-}
-
-.tabbrowser-tab {
   -moz-box-align: stretch;
 }
 
 /* The selected tab should appear above the border between the tabs toolbar and
    the navigation toolbar. */
 .tabbrowser-tab[visuallyselected=true] {
   position: relative;
   z-index: 2;
--- a/build/pgo/server-locations.txt
+++ b/build/pgo/server-locations.txt
@@ -280,8 +280,12 @@ https://sha256ee.example.com:443        
 # Hosts for ssl3/rc4 console warning tests
 https://ssl3.example.com:443        privileged,ssl3
 https://rc4.example.com:443         privileged,rc4
 https://ssl3rc4.example.com:443     privileged,ssl3,rc4
 https://tls1.example.com:443        privileged,tls1
 
 # Hosts for youtube rewrite tests
 https://mochitest.youtube.com:443
+
+# Hosts for stylo blocklist tests
+http://stylo-blocklist.com:80          privileged
+http://test.stylo-blocklist.com:80     privileged
copy from devtools/client/webconsole/test/.eslintrc.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/.eslintrc.js
--- a/devtools/client/webconsole/test/.eslintrc.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/.eslintrc.js
@@ -1,6 +1,6 @@
 "use strict";
 
 module.exports = {
   // Extend from the shared list of defined globals for mochitests.
-  "extends": "../../../.eslintrc.mochitests.js"
+  "extends": "../../../../../.eslintrc.mochitests.js"
 };
--- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini
@@ -5,72 +5,483 @@ support-files =
   code_bundle_invalidmap.js
   code_bundle_invalidmap.js.map
   code_bundle_nosource.js
   code_bundle_nosource.js.map
   head.js
   source-mapped.css
   source-mapped.css.map
   source-mapped.scss
+  test_bug_1010953_cspro.html
+  test_bug_1010953_cspro.html^headers^
+  test_bug_1247459_violation.html
+  test_bug_770099_violation.html
+  test_bug_770099_violation.html^headers^
+  test_bug1045902_console_csp_ignore_reflected_xss_message.html
+  test_bug1045902_console_csp_ignore_reflected_xss_message.html^headers^
+  test_bug1092055_shouldwarn.html
+  test_bug1092055_shouldwarn.js
+  test_bug1092055_shouldwarn.js^headers^
+  test_hpkp-invalid-headers.sjs
+  test_hsts-invalid-headers.sjs
+  test-autocomplete-in-stackframe.html
   test-batching.html
-  test-console.html
+  test-bug_1050691_click_function_to_source.html
+  test-bug_1050691_click_function_to_source.js
+  test-bug_923281_console_log_filter.html
+  test-bug_923281_test1.js
+  test-bug_923281_test2.js
+  test-bug_939783_console_trace_duplicates.html
+  test-bug-585956-console-trace.html
+  test-bug-593003-iframe-wrong-hud-iframe.html
+  test-bug-593003-iframe-wrong-hud.html
+  test-bug-595934-canvas-css.html
+  test-bug-595934-canvas-css.js
+  test-bug-595934-css-loader.css
+  test-bug-595934-css-loader.css^headers^
+  test-bug-595934-css-loader.html
+  test-bug-595934-css-parser.css
+  test-bug-595934-css-parser.html
+  test-bug-595934-empty-getelementbyid.html
+  test-bug-595934-empty-getelementbyid.js
+  test-bug-595934-html.html
+  test-bug-595934-image.html
+  test-bug-595934-image.jpg
+  test-bug-595934-imagemap.html
+  test-bug-595934-malformedxml-external.html
+  test-bug-595934-malformedxml-external.xml
+  test-bug-595934-malformedxml.xhtml
+  test-bug-595934-svg.xhtml
+  test-bug-595934-workers.html
+  test-bug-595934-workers.js
+  test-bug-597136-external-script-errors.html
+  test-bug-597136-external-script-errors.js
+  test-bug-597756-reopen-closed-tab.html
+  test-bug-599725-response-headers.sjs
+  test-bug-600183-charset.html
+  test-bug-600183-charset.html^headers^
+  test-bug-601177-log-levels.html
+  test-bug-601177-log-levels.js
+  test-bug-603750-websocket.html
+  test-bug-603750-websocket.js
+  test-bug-609872-cd-iframe-child.html
+  test-bug-609872-cd-iframe-parent.html
+  test-bug-613013-console-api-iframe.html
+  test-bug-618078-network-exceptions.html
+  test-bug-621644-jsterm-dollar.html
+  test-bug-630733-response-redirect-headers.sjs
+  test-bug-632275-getters.html
+  test-bug-632347-iterators-generators.html
+  test-bug-644419-log-limits.html
+  test-bug-646025-console-file-location.html
+  test-bug-658368-time-methods.html
+  test-bug-737873-mixedcontent.html
+  test-bug-752559-ineffective-iframe-sandbox-warning-inner.html
+  test-bug-752559-ineffective-iframe-sandbox-warning-nested1.html
+  test-bug-752559-ineffective-iframe-sandbox-warning-nested2.html
+  test-bug-752559-ineffective-iframe-sandbox-warning0.html
+  test-bug-752559-ineffective-iframe-sandbox-warning1.html
+  test-bug-752559-ineffective-iframe-sandbox-warning2.html
+  test-bug-752559-ineffective-iframe-sandbox-warning3.html
+  test-bug-752559-ineffective-iframe-sandbox-warning4.html
+  test-bug-752559-ineffective-iframe-sandbox-warning5.html
+  test-bug-762593-insecure-passwords-about-blank-web-console-warning.html
+  test-bug-762593-insecure-passwords-web-console-warning.html
+  test-bug-766001-console-log.js
+  test-bug-766001-js-console-links.html
+  test-bug-766001-js-errors.js
+  test-bug-782653-css-errors-1.css
+  test-bug-782653-css-errors-2.css
+  test-bug-782653-css-errors.html
+  test-bug-837351-security-errors.html
+  test-bug-859170-longstring-hang.html
+  test-bug-869003-iframe.html
+  test-bug-869003-top-window.html
+  test-bug-952277-highlight-nodes-in-vview.html
+  test-bug-989025-iframe-parent.html
+  test-certificate-messages.html
+  test-closure-optimized-out.html
+  test-closures.html
+  test-console-api-stackframe.html
+  test-console-assert.html
+  test-console-clear.html
+  test-console-column.html
+  test-console-count-external-file.js
+  test-console-count.html
+  test-console-extras.html
   test-console-filters.html
   test-console-group.html
+  test-console-output-02.html
+  test-console-output-03.html
+  test-console-output-04.html
+  test-console-output-dom-elements.html
+  test-console-output-events.html
+  test-console-replaced-api.html
+  test-console-server-logging-array.sjs
+  test-console-server-logging-backtrace.sjs
+  test-console-server-logging.sjs
   test-console-table.html
+  test-console-trace-async.html
+  test-console-workers.html
+  test-console.html
+  test-consoleiframes.html
+  test-cu-reporterror.js
+  test-data.json
+  test-data.json^headers^
+  test-duplicate-error.html
+  test-encoding-ISO-8859-1.html
+  test-error.html
+  test-eval-in-stackframe.html
+  test-exception-stackframe.html
+  test-file-location.js
+  test-filter.html
+  test-for-of.html
+  test-iframe-762593-insecure-form-action.html
+  test-iframe-762593-insecure-frame.html
+  test-iframe1.html
+  test-iframe2.html
+  test-iframe3.html
+  test-image.png
   test-location-debugger-link-console-log.js
   test-location-debugger-link-errors.js
   test-location-debugger-link.html
   test-location-styleeditor-link-1.css
   test-location-styleeditor-link-2.css
   test-location-styleeditor-link.html
+  test-mixedcontent-securityerrors.html
+  test-mutation.html
   test-network-request.html
+  test-network.html
+  test-observe-http-ajax.html
+  test-own-console.html
+  test-property-provider.html
+  test-repeated-messages.html
+  test-result-format-as-string.html
   test-sourcemap-error-01.html
+  test-sourcemap-error-01.js
   test-sourcemap-error-02.html
-  test-sourcemap-error-01.js
   test-sourcemap-error-02.js
   test-stacktrace-location-debugger-link.html
+  test-trackingprotection-securityerrors.html
+  test-webconsole-error-observer.html
+  testscript.js
+  !/devtools/client/netmonitor/test/sjs_cors-test-server.sjs
+  !/image/test/mochitest/blue.png
   !/devtools/client/framework/test/shared-head.js
 
+[browser_console.js]
+skip-if = true # Bug 1406060
+[browser_console_addonsdk_loader_exception.js]
+skip-if = true # Bug 1406060
+[browser_console_clear_method.js]
+skip-if = true # Bug 1406060
+[browser_console_consolejsm_output.js]
+skip-if = true # Bug 1406060
+[browser_console_dead_objects.js]
+skip-if = true # Bug 1406060
+[browser_console_error_source_click.js]
+skip-if = true # Bug 1406060
+[browser_console_filters.js]
+skip-if = true # Bug 1406060
+[browser_console_hide_jsterm_when_devtools_chrome_enabled_false.js]
+skip-if = true # Bug 1406060
+[browser_console_nsiconsolemessage.js]
+skip-if = true # Bug 1406060
+[browser_console_open_or_focus.js]
+skip-if = true # Bug 1406060
+[browser_console_restore.js]
+skip-if = true # Bug 1406060
+[browser_console_webconsole_ctrlw_close_tab.js]
+skip-if = true # Bug 1406060
+[browser_console_webconsole_iframe_messages.js]
+skip-if = true # Bug 1406060
+[browser_console_webconsole_private_browsing.js]
+skip-if = true #	Bug 1403188
+# old console skip-if = e10s # Bug 1042253 - webconsole e10s tests
+[browser_jsterm_copy_command.js]
+skip-if = true
+subsuite = clipboard
+# old console skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+[browser_jsterm_history_persist.js]
+skip-if = true # Bug 1401881
 [browser_jsterm_inspect.js]
+[browser_jsterm_no_autocompletion_on_defined_variables.js]
+skip-if = true # Bug 1401881
 [browser_netmonitor_shows_reqs_in_webconsole.js]
+[browser_webconsole.js]
+skip-if = true #	Bug 1404829
+[browser_webconsole_No_input_and_Tab_key_pressed.js]
+skip-if = true #	Bug 1403910
+[browser_webconsole_No_input_change_and_Tab_key_pressed.js]
+skip-if = true #	Bug 1404882
+[browser_webconsole_add_edited_input_to_history.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_allow_mixedcontent_securityerrors.js]
+tags = mcb
+skip-if = true #	Bug 1403452
+# old console skip-if = (os == 'win' && bits == 64) # Bug 1390001
+[browser_webconsole_assert.js]
+skip-if = true #	Bug 1403458
+[browser_webconsole_autocomplete-properties-with-non-alphanumeric-names.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_autocomplete_JSTerm_helpers.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_autocomplete_accessibility.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_autocomplete_and_selfxss.js]
+subsuite = clipboard
+skip-if = true #	Bug 1404850
+# old console skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+[browser_webconsole_autocomplete_crossdomain_iframe.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_autocomplete_in_debugger_stackframe.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_autocomplete_keys.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_autocomplete_popup.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_autocomplete_popup_close_on_tab_switch.js]
+skip-if = true # Bug 1401881
 [browser_webconsole_batching.js]
+[browser_webconsole_block_mixedcontent_securityerrors.js]
+tags = mcb
+skip-if = true #	Bug 1403899
+# old console skip-if = (os == 'win' && bits == 64) # Bug 1390001
+[browser_webconsole_cached_autocomplete.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_cached_messages.js]
+skip-if = true #	Bug 1406069
+[browser_webconsole_cd_iframe.js]
+skip-if = true #	Bug 1406030
+[browser_webconsole_certificate_messages.js]
+skip-if = true # Bug 1401881
+# old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
+[browser_webconsole_charset.js]
+skip-if = true #	Bug 1404400
+[browser_webconsole_chrome.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_click_function_to_source.js]
+skip-if = true #	Bug 1406038
 [browser_webconsole_clickable_urls.js]
+[browser_webconsole_closing_after_completion.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_closing_brackets.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_closure_inspection.js]
+skip-if = true #	Bug 1405250
+[browser_webconsole_completion.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_console_api_iframe.js]
+skip-if = true # Bug 1401881
 [browser_webconsole_console_dir.js]
+[browser_webconsole_console_dir_uninspectable.js]
+skip-if = true #	Bug 1403449
 [browser_webconsole_console_group.js]
+[browser_webconsole_console_logging_workers_api.js]
+skip-if = true # Bug 1405252
 [browser_webconsole_console_table.js]
 [browser_webconsole_context_menu_copy_entire_message.js]
 subsuite = clipboard
 skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
 [browser_webconsole_context_menu_copy_link_location.js]
 subsuite = clipboard
 skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
 [browser_webconsole_context_menu_copy_object.js]
 subsuite = clipboard
 [browser_webconsole_context_menu_open_url.js]
 [browser_webconsole_context_menu_store_as_global.js]
+[browser_webconsole_copy_entire_message_context_menu.js]
+subsuite = clipboard
+skip-if = true #	Bug 1401958
+# old console skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+[browser_webconsole_copy_link_location.js]
+skip-if = true #	Bug 1401944
+[browser_webconsole_csp_ignore_reflected_xss_message.js]
+skip-if = true # Bug 1401881
+# old console skip-if = (e10s && debug) || (e10s && os == 'win') # Bug 1221499 enabled these on windows
+[browser_webconsole_cspro.js]
+skip-if = true # Bug 1401881
+# old console skip-if = e10s && (os == 'win' || os == 'mac') # Bug 1243967
+[browser_webconsole_ctrl_key_nav.js]
+skip-if = true # Bug 1401881
+# old console skip-if = os != "mac"
+[browser_webconsole_deactivateHUDForContext_unfocused_window.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_document_body_autocomplete.js]
+skip-if = true #	Bug 1404851
+[browser_webconsole_document_focus.js]
+skip-if = true #	Bug 1404368
+[browser_webconsole_duplicate_errors.js]
+skip-if = true #	Bug 1403907
+[browser_webconsole_errors_after_page_reload.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_eval_in_debugger_stackframe.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_eval_in_debugger_stackframe2.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_execution_scope.js]
+skip-if = true #	Bug 1405333
+[browser_webconsole_external_script_errors.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_file_uri.js]
+skip-if = true #	Bug 1404382
+[browser_webconsole_filter_scroll.js]
+skip-if = true #	Bug 1404392
 [browser_webconsole_filters.js]
 [browser_webconsole_filters_persist.js]
+[browser_webconsole_highlighter_console_helper.js]
+skip-if = true #	Bug 1404853
+# old console skip-if = true # Requires direct access to content nodes
+[browser_webconsole_history.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_history_arrow_keys.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_history_nav.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_hpkp_invalid-headers.js]
+skip-if = true #	Bug 1405340
+# old console skip-if = (os == 'win' && bits == 64) # Bug 1390001
+[browser_webconsole_hsts_invalid-headers.js]
+skip-if = true #	Bug 1405341
+# old console skip-if = e10s # Bug 1042253 - webconsole e10s tests
+[browser_webconsole_iframe_wrong_hud.js]
+skip-if = true #	Bug 1404378
+[browser_webconsole_ineffective_iframe_sandbox_warning.js]
+skip-if = true #	Bug 1404883
+# old console skip-if = (os == 'win' && bits == 64) # Bug 1390001
 [browser_webconsole_init.js]
+[browser_webconsole_input_expansion.js]
+skip-if = true #	Bug 1404371
+[browser_webconsole_input_field_focus_on_panel_select.js]
+skip-if = true #	Bug 1405343
 [browser_webconsole_input_focus.js]
+[browser_webconsole_insecure_passwords_about_blank_web_console_warning.js]
+skip-if = true #	Bug 1404884
+[browser_webconsole_insecure_passwords_web_console_warning.js]
+skip-if = true #	Bug 1404888
+# old console skip-if = true # Bug 1110500 - mouse event failure in test
+[browser_webconsole_inspect_cross_domain_object.js]
+skip-if = true #	Bug 1401548
+[browser_webconsole_iterators_generators.js]
+skip-if = true #	Bug 1404849
+# old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
+[browser_webconsole_js_input_expansion.js]
+skip-if = true #	Bug 1405350
+[browser_webconsole_jsterm.js]
+skip-if = true #	Bug 1405352
+# old console skip-if = e10s # Bug 1042253 - webconsole e10s tests (Linux debug timeout)
+[browser_webconsole_jsterm_copy.js]
+subsuite = clipboard
+skip-if = true #	Bug 1404831
+# old console skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+[browser_webconsole_jsterm_dollar.js]
+skip-if = true #	Bug 1404843
 [browser_webconsole_keyboard_accessibility.js]
 [browser_webconsole_location_debugger_link.js]
 [browser_webconsole_location_scratchpad_link.js]
 [browser_webconsole_location_styleeditor_link.js]
 [browser_webconsole_logErrorInPage.js]
+[browser_webconsole_longstring_expand.js]
+skip-if = true #	Bug 1403448
+[browser_webconsole_longstring_hang.js]
+skip-if = true #	Bug 1403448
+[browser_webconsole_message_categories.js]
+skip-if = true #	Bug 1404384
+# old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
+[browser_webconsole_mixedcontent.js]
+tags = mcb
+skip-if = true #	Bug 1404886
+[browser_webconsole_multiline_input.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_multiple_windows_and_tabs.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_netlogging_reset_filter.js]
+skip-if = true #	Bug 1405636
+[browser_webconsole_network_exceptions.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_network_messages_expand.js]
 [browser_webconsole_network_messages_openinnet.js]
-[browser_webconsole_network_messages_expand.js]
+[browser_webconsole_network_requests_from_chrome.js]
+skip-if = true # Bug 1401881
 [browser_webconsole_nodes_highlight.js]
 [browser_webconsole_nodes_select.js]
+[browser_webconsole_notifications.js]
+skip-if = true #	Bug 1405637
+[browser_webconsole_object_inspector.js]
 [browser_webconsole_object_inspector_entries.js]
-[browser_webconsole_object_inspector.js]
 [browser_webconsole_observer_notifications.js]
+[browser_webconsole_optimized_out_vars.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_output_copy.js]
+subsuite = clipboard
+skip-if = true #	Bug 1404364
+# old console skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+[browser_webconsole_output_copy_newlines.js]
+subsuite = clipboard
+skip-if = true #	Bug 1405641
+# old console skip-if = (os == 'linux' && bits == 32 && debug) # bug 1328915, disable linux32 debug devtools for timeouts
+[browser_webconsole_output_order.js]
+skip-if = true # Bug 1401881
 [browser_webconsole_persist.js]
+[browser_webconsole_property_provider.js]
+skip-if = true # Bug 1406841
+#old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
+[browser_webconsole_prune_scroll.js]
+skip-if = true #	Bug 1404832
+[browser_webconsole_reflow.js]
+skip-if = true #	Bug 1406022
+[browser_webconsole_reopen_closed_tab.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_repeat_different_objects.js]
+skip-if = true #	Bug 1401953
+[browser_webconsole_repeated_messages_accuracy.js]
+skip-if = true #	Bug 1403450
+[browser_webconsole_sandbox_update_after_navigation.js]
+skip-if = true #	Bug 1401942
+[browser_webconsole_script_errordoc_urls.js]
+skip-if = true #	Bug 1403454
+# old console skip-if = e10s # Bug 1042253 - webconsole tests disabled with e10s
 [browser_webconsole_scroll.js]
+[browser_webconsole_select_all.js]
+skip-if = true #	Bug 1404359
+[browser_webconsole_show_subresource_security_errors.js]
+skip-if = true # Bug 1401881
+# old console skip-if = e10s && (os == 'win' || os == 'mac') # Bug 1243987
 [browser_webconsole_shows_reqs_in_netmonitor.js]
 [browser_webconsole_sourcemap_css.js]
 [browser_webconsole_sourcemap_error.js]
 [browser_webconsole_sourcemap_invalid.js]
 [browser_webconsole_sourcemap_nosource.js]
+[browser_webconsole_split.js]
+skip-if = true # Bug 1401881
+[browser_webconsole_split_escape_key.js]
+skip-if = true #	Bug 1405647
+[browser_webconsole_split_focus.js]
+skip-if = true #	Bug 1405648
+[browser_webconsole_split_persist.js]
+skip-if = true #	Bug 1405649
 [browser_webconsole_stacktrace_location_debugger_link.js]
 [browser_webconsole_stacktrace_location_scratchpad_link.js]
+[browser_webconsole_strict_mode_errors.js]
+skip-if = true #	Bug 1406039
 [browser_webconsole_string.js]
+[browser_webconsole_time_methods.js]
+skip-if = true #	Bug 1404877
 [browser_webconsole_timestamps.js]
+[browser_webconsole_trackingprotection_errors.js]
+tags = trackingprotection
+skip-if = true #	Bug 1405650
+# old console skip-if = (os == 'win' && bits == 64) # Bug 1390001
+[browser_webconsole_variables_view_dont_sort_non_sortable_classes_properties.js]
+skip-if = true #	Bug 1403196
+[browser_webconsole_variables_view_while_debugging.js]
+skip-if = true #	Bug 1403200
+[browser_webconsole_variables_view_while_debugging_and_inspecting.js]
+skip-if = true #	Bug 1403205
+[browser_webconsole_view_source.js]
+skip-if = true #	Bug 1405652
+# old console skip-if = (os == 'win' && bits == 64) # Bug 1390001
+[browser_webconsole_violation.js]
+skip-if = true #	Bug 1405245
+# old console skip-if = e10s && (os == 'win') # Bug 1264955
 [browser_webconsole_warn_about_replaced_api.js]
+[browser_webconsole_websocket.js]
+skip-if = true # Bug 1401881
\ No newline at end of file
copy from devtools/client/webconsole/test/browser_console.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_console.js
copy from devtools/client/webconsole/test/browser_console_addonsdk_loader_exception.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_console_addonsdk_loader_exception.js
copy from devtools/client/webconsole/test/browser_console_clear_method.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_console_clear_method.js
copy from devtools/client/webconsole/test/browser_console_consolejsm_output.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_console_consolejsm_output.js
copy from devtools/client/webconsole/test/browser_console_dead_objects.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_console_dead_objects.js
copy from devtools/client/webconsole/test/browser_console_error_source_click.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_console_error_source_click.js
copy from devtools/client/webconsole/test/browser_console_filters.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_console_filters.js
copy from devtools/client/webconsole/test/browser_console_hide_jsterm_when_devtools_chrome_enabled_false.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_console_hide_jsterm_when_devtools_chrome_enabled_false.js
copy from devtools/client/webconsole/test/browser_console_nsiconsolemessage.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_console_nsiconsolemessage.js
copy from devtools/client/webconsole/test/browser_console_open_or_focus.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_console_open_or_focus.js
copy from devtools/client/webconsole/test/browser_console_restore.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_console_restore.js
copy from devtools/client/webconsole/test/browser_bug_871156_ctrlw_close_tab.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_console_webconsole_ctrlw_close_tab.js
copy from devtools/client/webconsole/test/browser_console_iframe_messages.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_console_webconsole_iframe_messages.js
copy from devtools/client/webconsole/test/browser_console_private_browsing.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_console_webconsole_private_browsing.js
copy from devtools/client/webconsole/test/browser_console_copy_command.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_copy_command.js
copy from devtools/client/webconsole/test/browser_console_history_persist.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_history_persist.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_704295.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_jsterm_no_autocompletion_on_defined_variables.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_611795.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_611795.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 611795.
+
 const TEST_URI = 'data:text/html;charset=utf-8,<div style="-moz-opacity:0;">' +
                  'test repeated css warnings</div><p style="-moz-opacity:0">' +
                  "hi</p>";
 var hud;
 
 /**
  * Unit test for bug 611795:
  * Repeated CSS messages get collapsed into one.
copy from devtools/client/webconsole/test/browser_webconsole_bug_583816_No_input_and_Tab_key_pressed.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_No_input_and_Tab_key_pressed.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_583816_No_input_and_Tab_key_pressed.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_No_input_and_Tab_key_pressed.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 583816.
+
 const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
                  "test/browser/test-console.html";
 
 add_task(function* () {
   yield loadTab(TEST_URI);
 
   let hud = yield openConsole();
   testCompletion(hud);
copy from devtools/client/webconsole/test/browser_webconsole_bug_734061_No_input_change_and_Tab_key_pressed.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_No_input_change_and_Tab_key_pressed.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_734061_No_input_change_and_Tab_key_pressed.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_No_input_change_and_Tab_key_pressed.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 734061.
+
 const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
                  "test/browser/test-console.html";
 
 add_task(function* () {
   yield loadTab(TEST_URI);
 
   let hud = yield openConsole();
 
copy from devtools/client/webconsole/test/browser_webconsole_bug_817834_add_edited_input_to_history.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_add_edited_input_to_history.js
copy from devtools/client/webconsole/test/browser_webconsole_allow_mixedcontent_securityerrors.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_allow_mixedcontent_securityerrors.js
copy from devtools/client/webconsole/test/browser_webconsole_assert.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_assert.js
copy from devtools/client/webconsole/test/browser_webconsole_autocomplete-properties-with-non-alphanumeric-names.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete-properties-with-non-alphanumeric-names.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_686937_autocomplete_JSTerm_helpers.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_JSTerm_helpers.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_686937_autocomplete_JSTerm_helpers.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_JSTerm_helpers.js
@@ -2,16 +2,18 @@
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 // Tests that the autocompletion results contain the names of JSTerm helpers.
 
 "use strict";
 
+// See Bug 686937.
+
 const TEST_URI = "data:text/html;charset=utf8,<p>test JSTerm Helpers " +
                  "autocomplete";
 
 var jsterm;
 
 add_task(function* () {
   yield loadTab(TEST_URI);
 
copy from devtools/client/webconsole/test/browser_webconsole_autocomplete_accessibility.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_accessibility.js
copy from devtools/client/webconsole/test/browser_webconsole_autocomplete_and_selfxss.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_and_selfxss.js
copy from devtools/client/webconsole/test/browser_webconsole_autocomplete_crossdomain_iframe.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_crossdomain_iframe.js
copy from devtools/client/webconsole/test/browser_webconsole_autocomplete_in_debugger_stackframe.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_in_debugger_stackframe.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_585991_autocomplete_keys.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_keys.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_585991_autocomplete_keys.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_keys.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 585991.
+
 const TEST_URI = "data:text/html;charset=utf-8,<p>bug 585991 - autocomplete " +
                  "popup keyboard usage test";
 
 // We should turn off auto-multiline editing during these tests
 const PREF_AUTO_MULTILINE = "devtools.webconsole.autoMultiline";
 var HUD, popup, jsterm, inputNode, completeNode;
 
 add_task(function* () {
copy from devtools/client/webconsole/test/browser_webconsole_bug_585991_autocomplete_popup.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_popup.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_585991_autocomplete_popup.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_popup.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 585991.
+
 const TEST_URI = "data:text/html;charset=utf-8,<p>bug 585991 - autocomplete " +
                  "popup test";
 
 add_task(function* () {
   yield loadTab(TEST_URI);
   let hud = yield openConsole();
 
   yield consoleOpened(hud);
copy from devtools/client/webconsole/test/browser_webconsole_autocomplete_popup_close_on_tab_switch.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_popup_close_on_tab_switch.js
copy from devtools/client/webconsole/test/browser_webconsole_block_mixedcontent_securityerrors.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_block_mixedcontent_securityerrors.js
copy from devtools/client/webconsole/test/browser_webconsole_cached_autocomplete.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_cached_autocomplete.js
copy from devtools/client/webconsole/test/browser_cached_messages.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_cached_messages.js
copy from devtools/client/webconsole/test/browser_webconsole_cd_iframe.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_cd_iframe.js
copy from devtools/client/webconsole/test/browser_webconsole_certificate_messages.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_certificate_messages.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_600183_charset.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_charset.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_600183_charset.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_charset.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 600183.
+
 const INIT_URI = "data:text/html;charset=utf-8,Web Console - bug 600183 test";
 const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
                  "test/test-bug-600183-charset.html";
 
 function performTest(lastFinishedRequest, console) {
   let deferred = defer();
 
   ok(lastFinishedRequest, "charset test page was loaded and logged");
copy from devtools/client/webconsole/test/browser_webconsole_chrome.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_chrome.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_1050691_click_function_to_source.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_click_function_to_source.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_1050691_click_function_to_source.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_click_function_to_source.js
@@ -1,14 +1,14 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
-// Tests that clicking on a function displays its source in the debugger.
+// Tests that clicking on a function displays its source in the debugger. See Bug 1050691.
 
 "use strict";
 
 const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
                  "test/test-bug_1050691_click_function_to_source.html";
 
 // Force the old debugger UI since it's directly used (see Bug 1301705)
 Services.prefs.setBoolPref("devtools.debugger.new-debugger-frontend", false);
copy from devtools/client/webconsole/test/browser_webconsole_bug_580001_closing_after_completion.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_closing_after_completion.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_580001_closing_after_completion.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_closing_after_completion.js
@@ -1,15 +1,15 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 // Tests to ensure that errors don't appear when the console is closed while a
-// completion is being performed.
+// completion is being performed. See Bug 580001.
 
 "use strict";
 
 const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
                  "test/test-console.html";
 
 add_task(function* () {
   let { browser } = yield loadTab(TEST_URI);
copy from devtools/client/webconsole/test/browser_webconsole_bug_592442_closing_brackets.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_closing_brackets.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_592442_closing_brackets.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_closing_brackets.js
@@ -1,15 +1,15 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 // Tests that, when the user types an extraneous closing bracket, no error
-// appears.
+// appears. See Bug 592442.
 
 "use strict";
 
 const TEST_URI = "data:text/html;charset=utf-8,test for bug 592442";
 
 add_task(function* () {
   yield loadTab(TEST_URI);
   let hud = yield openConsole();
copy from devtools/client/webconsole/test/browser_webconsole_closure_inspection.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_closure_inspection.js
copy from devtools/client/webconsole/test/browser_webconsole_completion.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_completion.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_613013_console_api_iframe.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_api_iframe.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_613013_console_api_iframe.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_api_iframe.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 613013.
+
 const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
                  "test/test-bug-613013-console-api-iframe.html";
 
 add_task(function* () {
   yield loadTab(TEST_URI);
 
   let hud = yield openConsole();
 
copy from devtools/client/webconsole/test/browser_output_breaks_after_console_dir_uninspectable.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_dir_uninspectable.js
copy from devtools/client/webconsole/test/browser_webconsole_console_logging_workers_api.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_logging_workers_api.js
copy from devtools/client/webconsole/test/browser_console_copy_entire_message_context_menu.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_copy_entire_message_context_menu.js
copy from devtools/client/webconsole/test/browser_bug_638949_copy_link_location.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_copy_link_location.js
--- a/devtools/client/webconsole/test/browser_bug_638949_copy_link_location.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_copy_link_location.js
@@ -1,15 +1,15 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 // Test for the "Copy link location" context menu item shown when you right
-// click network requests in the output.
+// click network requests in the output. See Bug 638949.
 
 "use strict";
 
 add_task(function* () {
   const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
     "test/test-console.html?_date=" + Date.now();
   const COMMAND_NAME = "consoleCmd_copyURL";
   const CONTEXT_MENU_ID = "#menu_copyURL";
copy from devtools/client/webconsole/test/browser_bug1045902_console_csp_ignore_reflected_xss_message.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_csp_ignore_reflected_xss_message.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_1010953_cspro.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_cspro.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_1010953_cspro.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_cspro.js
@@ -7,16 +7,18 @@
 a script that is allowed by the CSP header but not by the CSPRO header
 an image which is allowed by the CSPRO header but not by the CSP header.
 
 So we expect a warning (image has been blocked) and a report
  (script should not load and was reported)
 
 The expected console messages in the constants CSP_VIOLATION_MSG and
 CSP_REPORT_MSG are confirmed to be found in the console messages.
+
+See Bug 1010953.
 */
 
 "use strict";
 
 const TEST_URI = "data:text/html;charset=utf8,Web Console CSP report only " +
                  "test (bug 1010953)";
 const TEST_VIOLATION = "http://example.com/browser/devtools/client/" +
                        "webconsole/test/test_bug_1010953_cspro.html";
copy from devtools/client/webconsole/test/browser_webconsole_bug_804845_ctrl_key_nav.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_ctrl_key_nav.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_597103_deactivateHUDForContext_unfocused_window.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_deactivateHUDForContext_unfocused_window.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_597103_deactivateHUDForContext_unfocused_window.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_deactivateHUDForContext_unfocused_window.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 597103.
+
 const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
                  "test/test-console.html";
 
 var tab1, tab2, win1, win2;
 var noErrors = true;
 
 function tab1Loaded() {
   win2 = OpenBrowserWindow();
copy from devtools/client/webconsole/test/browser_webconsole_bug_651501_document_body_autocomplete.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_document_body_autocomplete.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_651501_document_body_autocomplete.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_document_body_autocomplete.js
@@ -1,14 +1,14 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
-// Tests that document.body autocompletes in the web console.
+// Tests that document.body autocompletes in the web console. See Bug 651501.
 
 "use strict";
 
 const TEST_URI = "data:text/html;charset=utf-8,Web Console autocompletion " +
                  "bug in document.body";
 
 var gHUD;
 
copy from devtools/client/webconsole/test/browser_webconsole_bug_588342_document_focus.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_document_focus.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_588342_document_focus.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_document_focus.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 588342.
+
 const TEST_URI = "data:text/html;charset=utf-8,Web Console test for bug 588342";
 
 add_task(function* () {
   let { browser } = yield loadTab(TEST_URI);
   let hud = yield openConsole();
 
   yield checkConsoleFocus(hud);
 
copy from devtools/client/webconsole/test/browser_webconsole_bug_582201_duplicate_errors.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_duplicate_errors.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_582201_duplicate_errors.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_duplicate_errors.js
@@ -1,15 +1,15 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 // Tests that exceptions thrown by content don't show up twice in the Web
-// Console.
+// Console. See Bug 582201.
 
 "use strict";
 
 const INIT_URI = "data:text/html;charset=utf8,hello world";
 const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
                  "test/test-duplicate-error.html";
 
 add_task(function* () {
copy from devtools/client/webconsole/test/browser_webconsole_bug_580030_errors_after_page_reload.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_errors_after_page_reload.js
copy from devtools/client/webconsole/test/browser_eval_in_debugger_stackframe.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_eval_in_debugger_stackframe.js
copy from devtools/client/webconsole/test/browser_eval_in_debugger_stackframe2.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_eval_in_debugger_stackframe2.js
copy from devtools/client/webconsole/test/browser_webconsole_execution_scope.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_execution_scope.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_597136_external_script_errors.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_external_script_errors.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_597136_external_script_errors.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_external_script_errors.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 597136.
+
 const TEST_URI = "http://example.com/browser/devtools/client/" +
                  "webconsole/test/test-bug-597136-external-script-" +
                  "errors.html";
 
 function test() {
   Task.spawn(function* () {
     const {tab} = yield loadTab(TEST_URI);
     const hud = yield openConsole(tab);
copy from devtools/client/webconsole/test/browser_webconsole_bug_595223_file_uri.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_file_uri.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_595223_file_uri.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_file_uri.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 595223.
+
 const PREF = "devtools.webconsole.persistlog";
 const TEST_FILE = "test-network.html";
 
 var hud;
 
 add_task(function* () {
   Services.prefs.setBoolPref(PREF, true);
 
copy from devtools/client/webconsole/test/browser_webconsole_bug_597460_filter_scroll.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_filter_scroll.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_597460_filter_scroll.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_filter_scroll.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 597460.
+
 const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
                  "test/test-network.html";
 const PREF = "devtools.webconsole.persistlog";
 
 add_task(function* () {
   Services.prefs.setBoolPref(PREF, true);
 
   yield loadTab(TEST_URI);
copy from devtools/client/webconsole/test/browser_webconsole_bug_653531_highlighter_console_helper.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_highlighter_console_helper.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_653531_highlighter_console_helper.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_highlighter_console_helper.js
@@ -1,14 +1,14 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
-// Tests that the $0 console helper works as intended.
+// Tests that the $0 console helper works as intended. See Bug 653531.
 
 "use strict";
 
 var inspector, h1, outputNode;
 
 function createDocument() {
   let doc = content.document;
   let div = doc.createElement("div");
copy from devtools/client/webconsole/test/browser_webconsole_history.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_history.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_594497_history_arrow_keys.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_history_arrow_keys.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_594497_history_arrow_keys.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_history_arrow_keys.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bugs 594497 and 619598.
+
 var jsterm, inputNode, values;
 
 var TEST_URI = "data:text/html;charset=utf-8,Web Console test for " +
                "bug 594497 and bug 619598";
 
 add_task(function* () {
   yield loadTab(TEST_URI);
 
copy from devtools/client/webconsole/test/browser_webconsole_bug_660806_history_nav.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_history_nav.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_660806_history_nav.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_history_nav.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 660806.
+
 const TEST_URI = "data:text/html;charset=utf-8,<p>bug 660806 - history " +
                  "navigation must not show the autocomplete popup";
 
 add_task(function* () {
   yield loadTab(TEST_URI);
 
   let hud = yield openConsole();
 
copy from devtools/client/webconsole/test/browser_webconsole_hpkp_invalid-headers.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_hpkp_invalid-headers.js
copy from devtools/client/webconsole/test/browser_webconsole_hsts_invalid-headers.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_hsts_invalid-headers.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_593003_iframe_wrong_hud.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_iframe_wrong_hud.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_593003_iframe_wrong_hud.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_iframe_wrong_hud.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 593003.
+
 const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
                  "test/test-bug-593003-iframe-wrong-hud.html";
 
 const TEST_IFRAME_URI = "http://example.com/browser/devtools/client/" +
                         "webconsole/test/test-bug-593003-iframe-wrong-" +
                         "hud-iframe.html";
 
 const TEST_DUMMY_URI = "http://example.com/browser/devtools/client/" +
copy from devtools/client/webconsole/test/browser_webconsole_bug_752559_ineffective_iframe_sandbox_warning.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_ineffective_iframe_sandbox_warning.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_752559_ineffective_iframe_sandbox_warning.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_ineffective_iframe_sandbox_warning.js
@@ -1,15 +1,15 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 // Tests that warnings about ineffective iframe sandboxing are logged to the
-// web console when necessary (and not otherwise).
+// web console when necessary (and not otherwise). See Bug 752559.
 
 "use strict";
 
 requestLongerTimeout(2);
 
 const TEST_URI_WARNING = "http://example.com/browser/devtools/client/webconsole/test/test-bug-752559-ineffective-iframe-sandbox-warning0.html";
 const TEST_URI_NOWARNING = [
   "http://example.com/browser/devtools/client/webconsole/test/test-bug-752559-ineffective-iframe-sandbox-warning1.html",
copy from devtools/client/webconsole/test/browser_webconsole_bug_588967_input_expansion.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_input_expansion.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_588967_input_expansion.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_input_expansion.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 588967.
+
 const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
                  "test/test-console.html";
 
 add_task(function* () {
   yield loadTab(TEST_URI);
 
   let hud = yield openConsole();
 
copy from devtools/client/webconsole/test/browser_webconsole_input_field_focus_on_panel_select.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_input_field_focus_on_panel_select.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_762593_insecure_passwords_about_blank_web_console_warning.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_insecure_passwords_about_blank_web_console_warning.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_762593_insecure_passwords_about_blank_web_console_warning.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_insecure_passwords_about_blank_web_console_warning.js
@@ -1,14 +1,14 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
-// Tests that errors about insecure passwords are logged to the web console.
+// Tests that errors about insecure passwords are logged to the web console. See Bug 762593.
 
 "use strict";
 
 const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
                  "test/test-bug-762593-insecure-passwords-about-blank-web-console-warning.html";
 const INSECURE_PASSWORD_MSG = "Password fields present on an insecure " +
   "(http://) iframe. This is a security risk that allows user login " +
   "credentials to be stolen.";
copy from devtools/client/webconsole/test/browser_webconsole_bug_762593_insecure_passwords_web_console_warning.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_insecure_passwords_web_console_warning.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_762593_insecure_passwords_web_console_warning.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_insecure_passwords_web_console_warning.js
@@ -1,14 +1,15 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
  // Tests that errors about insecure passwords are logged to the web console.
+ // See Bug 762593.
 
 "use strict";
 
 const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
                  "test/test-bug-762593-insecure-passwords-web-" +
                  "console-warning.html";
 const INSECURE_PASSWORD_MSG = "Password fields present on an insecure " +
                  "(http://) page. This is a security risk that allows user " +
copy from devtools/client/webconsole/test/browser_bug_869003_inspect_cross_domain_object.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_inspect_cross_domain_object.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_632347_iterators_generators.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_iterators_generators.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_632347_iterators_generators.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_iterators_generators.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 632347.
+
 const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
                  "test/test-bug-632347-iterators-generators.html";
 
 function test() {
   requestLongerTimeout(6);
 
   loadTab(TEST_URI).then(() => {
     openConsole().then(consoleOpened);
copy from devtools/client/webconsole/test/browser_webconsole_js_input_expansion.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_js_input_expansion.js
copy from devtools/client/webconsole/test/browser_webconsole_jsterm.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_613280_jsterm_copy.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm_copy.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_613280_jsterm_copy.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm_copy.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 613280.
+
 const TEST_URI = "data:text/html;charset=utf-8,Web Console test for bug 613280";
 
 function test() {
   loadTab(TEST_URI).then(() => {
     openConsole().then((HUD) => {
       ContentTask.spawn(gBrowser.selectedBrowser, null, function*(){
         content.console.log("foobarBazBug613280");
       });
copy from devtools/client/webconsole/test/browser_webconsole_bug_621644_jsterm_dollar.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm_dollar.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_621644_jsterm_dollar.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_jsterm_dollar.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 621644.
+
 const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
                  "test/test-bug-621644-jsterm-dollar.html";
 
 add_task(function* () {
   yield loadTab(TEST_URI);
 
   let hud = yield openConsole();
 
copy from devtools/client/webconsole/test/browser_output_longstring_expand.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_longstring_expand.js
copy from devtools/client/webconsole/test/browser_longstring_hang.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_longstring_hang.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_595934_message_categories.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_message_categories.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_595934_message_categories.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_message_categories.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 595934.
+
 const TEST_URI = "data:text/html;charset=utf-8,Web Console test for " +
                  "bug 595934 - message categories coverage.";
 const TESTS_PATH = "http://example.com/browser/devtools/client/webconsole/" +
                    "test/";
 const TESTS = [
   {
     // #0
     file: "test-bug-595934-css-loader.html",
copy from devtools/client/webconsole/test/browser_webconsole_bug_737873_mixedcontent.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_mixedcontent.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_737873_mixedcontent.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_mixedcontent.js
@@ -1,14 +1,14 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
-// Tests that the Web Console Mixed Content messages are displayed
+// Tests that the Web Console Mixed Content messages are displayed. See Bug 737873.
 
 "use strict";
 
 const TEST_URI = "data:text/html;charset=utf8,Web Console mixed content test";
 const TEST_HTTPS_URI = "https://example.com/browser/devtools/client/" +
                        "webconsole/test/test-bug-737873-mixedcontent.html";
 const LEARN_MORE_URI = "https://developer.mozilla.org/docs/Web/Security/" +
                        "Mixed_content";
copy from devtools/client/webconsole/test/browser_webconsole_multiline_input.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_multiline_input.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_595350_multiple_windows_and_tabs.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_multiple_windows_and_tabs.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_595350_multiple_windows_and_tabs.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_multiple_windows_and_tabs.js
@@ -1,15 +1,15 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 // Tests that the Web Console doesn't leak when multiple tabs and windows are
-// opened and then closed.
+// opened and then closed. See Bug 595350.
 
 "use strict";
 
 const TEST_URI = "data:text/html;charset=utf-8,Web Console test for bug 595350";
 
 var win1 = window, win2;
 var openTabs = [];
 var loadedTabCount = 0;
copy from devtools/client/webconsole/test/browser_webconsole_netlogging_reset_filter.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_netlogging_reset_filter.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_618078_network_exceptions.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_exceptions.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_597136_network_requests_from_chrome.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_requests_from_chrome.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_597136_network_requests_from_chrome.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_network_requests_from_chrome.js
@@ -1,15 +1,15 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 // Tests that network requests from chrome don't cause the Web Console to
-// throw exceptions.
+// throw exceptions. See Bug 597136.
 
 "use strict";
 
 const TEST_URI = "http://example.com/";
 
 var good = true;
 var listener = {
   QueryInterface: XPCOMUtils.generateQI([ Ci.nsIObserver ]),
copy from devtools/client/webconsole/test/browser_webconsole_notifications.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_notifications.js
copy from devtools/client/webconsole/test/browser_console_optimized_out_vars.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_optimized_out_vars.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_587617_output_copy.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_output_copy.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_587617_output_copy.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_output_copy.js
@@ -1,16 +1,18 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 /* globals goUpdateCommand goDoCommand */
 
 "use strict";
 
+// See Bug 587617.
+
 const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
                  "test/test-console.html";
 
 var HUD, outputNode;
 
 add_task(function* () {
   yield loadTab(TEST_URI);
 
copy from devtools/client/webconsole/test/browser_webconsole_output_copy_newlines.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_output_copy_newlines.js
copy from devtools/client/webconsole/test/browser_webconsole_output_order.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_output_order.js
copy from devtools/client/webconsole/test/browser_webconsole_property_provider.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_property_provider.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_613642_prune_scroll.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_prune_scroll.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_613642_prune_scroll.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_prune_scroll.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 613642.
+
 const TEST_URI = "data:text/html;charset=utf-8,Web Console test for " +
                  "bug 613642: maintain scroll with pruning of old messages";
 
 var hud;
 
 add_task(function* () {
   yield loadTab(TEST_URI);
 
copy from devtools/client/webconsole/test/browser_webconsole_reflow.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_reflow.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_597756_reopen_closed_tab.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_reopen_closed_tab.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_597756_reopen_closed_tab.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_reopen_closed_tab.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 597756.
+
 const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
                  "test/test-bug-597756-reopen-closed-tab.html";
 
 var HUD;
 
 add_task(function* () {
   // On e10s, the exception is triggered in child process
   // and is ignored by test harness
copy from devtools/client/webconsole/test/browser_bug_865288_repeat_different_objects.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_repeat_different_objects.js
copy from devtools/client/webconsole/test/browser_repeated_messages_accuracy.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_repeated_messages_accuracy.js
copy from devtools/client/webconsole/test/browser_bug664688_sandbox_update_after_navigation.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_sandbox_update_after_navigation.js
--- a/devtools/client/webconsole/test/browser_bug664688_sandbox_update_after_navigation.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_sandbox_update_after_navigation.js
@@ -1,16 +1,16 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 // Tests if the JSTerm sandbox is updated when the user navigates from one
 // domain to another, in order to avoid permission denied errors with a sandbox
-// created for a different origin.
+// created for a different origin. See Bug 664688.
 
 "use strict";
 
 add_task(function* () {
   const TEST_URI1 = "http://example.com/browser/devtools/client/webconsole/" +
                     "test/test-console.html";
   const TEST_URI2 = "http://example.org/browser/devtools/client/webconsole/" +
                     "test/test-console.html";
copy from devtools/client/webconsole/test/browser_webconsole_script_errordoc_urls.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_script_errordoc_urls.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_586388_select_all.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_select_all.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_586388_select_all.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_select_all.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 586388.
+
 const TEST_URI = "http://example.com/";
 
 add_task(function* () {
   yield loadTab(TEST_URI);
 
   let hud = yield openConsole();
   yield testSelectionWhenMovingBetweenBoxes(hud);
   performTestsAfterOutput(hud);
copy from devtools/client/webconsole/test/browser_webconsole_show_subresource_security_errors.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_show_subresource_security_errors.js
copy from devtools/client/webconsole/test/browser_webconsole_split.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_split.js
copy from devtools/client/webconsole/test/browser_webconsole_split_escape_key.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_split_escape_key.js
copy from devtools/client/webconsole/test/browser_webconsole_split_focus.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_split_focus.js
copy from devtools/client/webconsole/test/browser_webconsole_split_persist.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_split_persist.js
copy from devtools/client/webconsole/test/browser_webconsole_strict_mode_errors.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_strict_mode_errors.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_658368_time_methods.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_time_methods.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_658368_time_methods.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_time_methods.js
@@ -1,14 +1,14 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
-// Tests that the Console API implements the time() and timeEnd() methods.
+// Tests that the Console API implements the time() and timeEnd() methods. See Bug 658368.
 
 "use strict";
 
 const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
                  "test/test-bug-658368-time-methods.html";
 
 const TEST_URI2 = "data:text/html;charset=utf-8,<script>" +
                   "console.timeEnd('bTimer');</script>";
copy from devtools/client/webconsole/test/browser_webconsole_trackingprotection_errors.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_trackingprotection_errors.js
copy from devtools/client/webconsole/test/browser_console_variables_view_dont_sort_non_sortable_classes_properties.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_variables_view_dont_sort_non_sortable_classes_properties.js
copy from devtools/client/webconsole/test/browser_console_variables_view_while_debugging.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_variables_view_while_debugging.js
copy from devtools/client/webconsole/test/browser_console_variables_view_while_debugging_and_inspecting.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_variables_view_while_debugging_and_inspecting.js
copy from devtools/client/webconsole/test/browser_webconsole_view_source.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_view_source.js
copy from devtools/client/webconsole/test/browser_webconsole_bug_1247459_violation.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_violation.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_1247459_violation.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_violation.js
@@ -1,15 +1,15 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 // Tests that the Web Console CSP messages for two META policies
-// are correctly displayed.
+// are correctly displayed. See Bug 1247459.
 
 "use strict";
 
 const TEST_URI = "data:text/html;charset=utf8,Web Console CSP violation test";
 const TEST_VIOLATION = "https://example.com/browser/devtools/client/" +
                        "webconsole/test/test_bug_1247459_violation.html";
 const CSP_VIOLATION_MSG = "Content Security Policy: The page\u2019s settings " +
                           "blocked the loading of a resource at " +
copy from devtools/client/webconsole/test/browser_webconsole_bug_603750_websocket.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_websocket.js
--- a/devtools/client/webconsole/test/browser_webconsole_bug_603750_websocket.js
+++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_websocket.js
@@ -1,15 +1,17 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+// See Bug 603750.
+
 const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" +
                  "test/test-bug-603750-websocket.html";
 const TEST_URI2 = "data:text/html;charset=utf-8,Web Console test for " +
                   "bug 603750: Web Socket errors";
 
 add_task(function* () {
   yield loadTab(TEST_URI2);
 
copy from devtools/client/webconsole/test/test-autocomplete-in-stackframe.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-autocomplete-in-stackframe.html
copy from devtools/client/webconsole/test/test-bug-585956-console-trace.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-585956-console-trace.html
copy from devtools/client/webconsole/test/test-bug-593003-iframe-wrong-hud-iframe.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-593003-iframe-wrong-hud-iframe.html
copy from devtools/client/webconsole/test/test-bug-593003-iframe-wrong-hud.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-593003-iframe-wrong-hud.html
copy from devtools/client/webconsole/test/test-bug-595934-canvas-css.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-canvas-css.html
copy from devtools/client/webconsole/test/test-bug-595934-canvas-css.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-canvas-css.js
copy from devtools/client/webconsole/test/test-bug-595934-css-loader.css
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-css-loader.css
copy from devtools/client/webconsole/test/test-bug-595934-css-loader.css^headers^
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-css-loader.css^headers^
copy from devtools/client/webconsole/test/test-bug-595934-css-loader.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-css-loader.html
copy from devtools/client/webconsole/test/test-bug-595934-css-parser.css
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-css-parser.css
copy from devtools/client/webconsole/test/test-bug-595934-css-parser.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-css-parser.html
copy from devtools/client/webconsole/test/test-bug-595934-empty-getelementbyid.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-empty-getelementbyid.html
copy from devtools/client/webconsole/test/test-bug-595934-empty-getelementbyid.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-empty-getelementbyid.js
copy from devtools/client/webconsole/test/test-bug-595934-html.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-html.html
copy from devtools/client/webconsole/test/test-bug-595934-image.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-image.html
copy from devtools/client/webconsole/test/test-bug-595934-image.jpg
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-image.jpg
copy from devtools/client/webconsole/test/test-bug-595934-imagemap.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-imagemap.html
copy from devtools/client/webconsole/test/test-bug-595934-malformedxml-external.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-malformedxml-external.html
copy from devtools/client/webconsole/test/test-bug-595934-malformedxml-external.xml
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-malformedxml-external.xml
copy from devtools/client/webconsole/test/test-bug-595934-malformedxml.xhtml
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-malformedxml.xhtml
copy from devtools/client/webconsole/test/test-bug-595934-svg.xhtml
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-svg.xhtml
copy from devtools/client/webconsole/test/test-bug-595934-workers.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-workers.html
copy from devtools/client/webconsole/test/test-bug-595934-workers.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-595934-workers.js
copy from devtools/client/webconsole/test/test-bug-597136-external-script-errors.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-597136-external-script-errors.html
copy from devtools/client/webconsole/test/test-bug-597136-external-script-errors.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-597136-external-script-errors.js
copy from devtools/client/webconsole/test/test-bug-597756-reopen-closed-tab.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-597756-reopen-closed-tab.html
copy from devtools/client/webconsole/test/test-bug-599725-response-headers.sjs
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-599725-response-headers.sjs
copy from devtools/client/webconsole/test/test-bug-600183-charset.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-600183-charset.html
copy from devtools/client/webconsole/test/test-bug-600183-charset.html^headers^
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-600183-charset.html^headers^
copy from devtools/client/webconsole/test/test-bug-601177-log-levels.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-601177-log-levels.html
copy from devtools/client/webconsole/test/test-bug-601177-log-levels.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-601177-log-levels.js
copy from devtools/client/webconsole/test/test-bug-603750-websocket.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-603750-websocket.html
copy from devtools/client/webconsole/test/test-bug-603750-websocket.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-603750-websocket.js
copy from devtools/client/webconsole/test/test-bug-609872-cd-iframe-child.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-609872-cd-iframe-child.html
copy from devtools/client/webconsole/test/test-bug-609872-cd-iframe-parent.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-609872-cd-iframe-parent.html
copy from devtools/client/webconsole/test/test-bug-613013-console-api-iframe.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-613013-console-api-iframe.html
copy from devtools/client/webconsole/test/test-bug-618078-network-exceptions.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-618078-network-exceptions.html
copy from devtools/client/webconsole/test/test-bug-621644-jsterm-dollar.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-621644-jsterm-dollar.html
copy from devtools/client/webconsole/test/test-bug-630733-response-redirect-headers.sjs
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-630733-response-redirect-headers.sjs
copy from devtools/client/webconsole/test/test-bug-632275-getters.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-632275-getters.html
copy from devtools/client/webconsole/test/test-bug-632347-iterators-generators.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-632347-iterators-generators.html
copy from devtools/client/webconsole/test/test-bug-644419-log-limits.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-644419-log-limits.html
copy from devtools/client/webconsole/test/test-bug-646025-console-file-location.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-646025-console-file-location.html
copy from devtools/client/webconsole/test/test-bug-658368-time-methods.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-658368-time-methods.html
copy from devtools/client/webconsole/test/test-bug-737873-mixedcontent.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-737873-mixedcontent.html
copy from devtools/client/webconsole/test/test-bug-752559-ineffective-iframe-sandbox-warning-inner.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning-inner.html
copy from devtools/client/webconsole/test/test-bug-752559-ineffective-iframe-sandbox-warning-nested1.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning-nested1.html
copy from devtools/client/webconsole/test/test-bug-752559-ineffective-iframe-sandbox-warning-nested2.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning-nested2.html
copy from devtools/client/webconsole/test/test-bug-752559-ineffective-iframe-sandbox-warning0.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning0.html
copy from devtools/client/webconsole/test/test-bug-752559-ineffective-iframe-sandbox-warning1.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning1.html
copy from devtools/client/webconsole/test/test-bug-752559-ineffective-iframe-sandbox-warning2.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning2.html
copy from devtools/client/webconsole/test/test-bug-752559-ineffective-iframe-sandbox-warning3.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning3.html
copy from devtools/client/webconsole/test/test-bug-752559-ineffective-iframe-sandbox-warning4.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning4.html
copy from devtools/client/webconsole/test/test-bug-752559-ineffective-iframe-sandbox-warning5.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-752559-ineffective-iframe-sandbox-warning5.html
copy from devtools/client/webconsole/test/test-bug-762593-insecure-passwords-about-blank-web-console-warning.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-762593-insecure-passwords-about-blank-web-console-warning.html
copy from devtools/client/webconsole/test/test-bug-762593-insecure-passwords-web-console-warning.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-762593-insecure-passwords-web-console-warning.html
copy from devtools/client/webconsole/test/test-bug-766001-console-log.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-766001-console-log.js
copy from devtools/client/webconsole/test/test-bug-766001-js-console-links.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-766001-js-console-links.html
copy from devtools/client/webconsole/test/test-bug-766001-js-errors.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-766001-js-errors.js
copy from devtools/client/webconsole/test/test-bug-782653-css-errors-1.css
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-782653-css-errors-1.css
copy from devtools/client/webconsole/test/test-bug-782653-css-errors-2.css
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-782653-css-errors-2.css
copy from devtools/client/webconsole/test/test-bug-782653-css-errors.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-782653-css-errors.html
copy from devtools/client/webconsole/test/test-bug-837351-security-errors.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-837351-security-errors.html
copy from devtools/client/webconsole/test/test-bug-859170-longstring-hang.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-859170-longstring-hang.html
copy from devtools/client/webconsole/test/test-bug-869003-iframe.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-869003-iframe.html
copy from devtools/client/webconsole/test/test-bug-869003-top-window.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-869003-top-window.html
copy from devtools/client/webconsole/test/test-bug-952277-highlight-nodes-in-vview.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-952277-highlight-nodes-in-vview.html
copy from devtools/client/webconsole/test/test-bug-989025-iframe-parent.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug-989025-iframe-parent.html
copy from devtools/client/webconsole/test/test-bug_1050691_click_function_to_source.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug_1050691_click_function_to_source.html
copy from devtools/client/webconsole/test/test-bug_1050691_click_function_to_source.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug_1050691_click_function_to_source.js
copy from devtools/client/webconsole/test/test-bug_923281_console_log_filter.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug_923281_console_log_filter.html
copy from devtools/client/webconsole/test/test-bug_923281_test1.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug_923281_test1.js
copy from devtools/client/webconsole/test/test-bug_923281_test2.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug_923281_test2.js
copy from devtools/client/webconsole/test/test-bug_939783_console_trace_duplicates.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-bug_939783_console_trace_duplicates.html
copy from devtools/client/webconsole/test/test-certificate-messages.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-certificate-messages.html
copy from devtools/client/webconsole/test/test-closure-optimized-out.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-closure-optimized-out.html
copy from devtools/client/webconsole/test/test-closures.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-closures.html
copy from devtools/client/webconsole/test/test-console-api-stackframe.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-console-api-stackframe.html
copy from devtools/client/webconsole/test/test-console-assert.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-console-assert.html
copy from devtools/client/webconsole/test/test-console-clear.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-console-clear.html
copy from devtools/client/webconsole/test/test-console-column.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-console-column.html
copy from devtools/client/webconsole/test/test-console-count-external-file.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-console-count-external-file.js
copy from devtools/client/webconsole/test/test-console-count.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-console-count.html
copy from devtools/client/webconsole/test/test-console-extras.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-console-extras.html
copy from devtools/client/webconsole/test/test-console-output-02.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-console-output-02.html
copy from devtools/client/webconsole/test/test-console-output-03.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-console-output-03.html
copy from devtools/client/webconsole/test/test-console-output-04.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-console-output-04.html
copy from devtools/client/webconsole/test/test-console-output-dom-elements.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-console-output-dom-elements.html
copy from devtools/client/webconsole/test/test-console-output-events.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-console-output-events.html
copy from devtools/client/webconsole/test/test-console-replaced-api.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-console-replaced-api.html
copy from devtools/client/webconsole/test/test-console-server-logging-array.sjs
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-console-server-logging-array.sjs
copy from devtools/client/webconsole/test/test-console-server-logging-backtrace.sjs
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-console-server-logging-backtrace.sjs
copy from devtools/client/webconsole/test/test-console-server-logging.sjs
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-console-server-logging.sjs
copy from devtools/client/webconsole/test/test-console-trace-async.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-console-trace-async.html
copy from devtools/client/webconsole/test/test-console-workers.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-console-workers.html
copy from devtools/client/webconsole/test/test-consoleiframes.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-consoleiframes.html
copy from devtools/client/webconsole/test/test-cu-reporterror.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-cu-reporterror.js
copy from devtools/client/webconsole/test/test-data.json
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-data.json
copy from devtools/client/webconsole/test/test-data.json^headers^
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-data.json^headers^
copy from devtools/client/webconsole/test/test-duplicate-error.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-duplicate-error.html
copy from devtools/client/webconsole/test/test-encoding-ISO-8859-1.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-encoding-ISO-8859-1.html
copy from devtools/client/webconsole/test/test-error.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-error.html
copy from devtools/client/webconsole/test/test-eval-in-stackframe.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-eval-in-stackframe.html
copy from devtools/client/webconsole/test/test-exception-stackframe.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-exception-stackframe.html
copy from devtools/client/webconsole/test/test-file-location.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-file-location.js
copy from devtools/client/webconsole/test/test-filter.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-filter.html
copy from devtools/client/webconsole/test/test-for-of.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-for-of.html
copy from devtools/client/webconsole/test/test-iframe-762593-insecure-form-action.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-762593-insecure-form-action.html
copy from devtools/client/webconsole/test/test-iframe-762593-insecure-frame.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-iframe-762593-insecure-frame.html
copy from devtools/client/webconsole/test/test-iframe1.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-iframe1.html
copy from devtools/client/webconsole/test/test-iframe2.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-iframe2.html
copy from devtools/client/webconsole/test/test-iframe3.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-iframe3.html
copy from devtools/client/webconsole/test/test-image.png
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-image.png
copy from devtools/client/webconsole/test/test-mixedcontent-securityerrors.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-mixedcontent-securityerrors.html
copy from devtools/client/webconsole/test/test-mutation.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-mutation.html
copy from devtools/client/webconsole/test/test-network.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-network.html
copy from devtools/client/webconsole/test/test-observe-http-ajax.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-observe-http-ajax.html
copy from devtools/client/webconsole/test/test-own-console.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-own-console.html
copy from devtools/client/webconsole/test/test-property-provider.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-property-provider.html
copy from devtools/client/webconsole/test/test-repeated-messages.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-repeated-messages.html
copy from devtools/client/webconsole/test/test-result-format-as-string.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-result-format-as-string.html
copy from devtools/client/webconsole/test/test-trackingprotection-securityerrors.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-trackingprotection-securityerrors.html
copy from devtools/client/webconsole/test/test-webconsole-error-observer.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test-webconsole-error-observer.html
copy from devtools/client/webconsole/test/test_bug1045902_console_csp_ignore_reflected_xss_message.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test_bug1045902_console_csp_ignore_reflected_xss_message.html
copy from devtools/client/webconsole/test/test_bug1045902_console_csp_ignore_reflected_xss_message.html^headers^
copy to devtools/client/webconsole/new-console-output/test/mochitest/test_bug1045902_console_csp_ignore_reflected_xss_message.html^headers^
copy from devtools/client/webconsole/test/test_bug1092055_shouldwarn.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test_bug1092055_shouldwarn.html
copy from devtools/client/webconsole/test/test_bug1092055_shouldwarn.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/test_bug1092055_shouldwarn.js
copy from devtools/client/webconsole/test/test_bug1092055_shouldwarn.js^headers^
copy to devtools/client/webconsole/new-console-output/test/mochitest/test_bug1092055_shouldwarn.js^headers^
copy from devtools/client/webconsole/test/test_bug_1010953_cspro.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test_bug_1010953_cspro.html
copy from devtools/client/webconsole/test/test_bug_1010953_cspro.html^headers^
copy to devtools/client/webconsole/new-console-output/test/mochitest/test_bug_1010953_cspro.html^headers^
copy from devtools/client/webconsole/test/test_bug_1247459_violation.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test_bug_1247459_violation.html
copy from devtools/client/webconsole/test/test_bug_770099_violation.html
copy to devtools/client/webconsole/new-console-output/test/mochitest/test_bug_770099_violation.html
copy from devtools/client/webconsole/test/test_bug_770099_violation.html^headers^
copy to devtools/client/webconsole/new-console-output/test/mochitest/test_bug_770099_violation.html^headers^
copy from devtools/client/webconsole/test/test_hpkp-invalid-headers.sjs
copy to devtools/client/webconsole/new-console-output/test/mochitest/test_hpkp-invalid-headers.sjs
copy from devtools/client/webconsole/test/test_hsts-invalid-headers.sjs
copy to devtools/client/webconsole/new-console-output/test/mochitest/test_hsts-invalid-headers.sjs
copy from devtools/client/webconsole/test/testscript.js
copy to devtools/client/webconsole/new-console-output/test/mochitest/testscript.js
--- a/devtools/server/actors/object.js
+++ b/devtools/server/actors/object.js
@@ -75,17 +75,17 @@ ObjectActor.prototype = {
   grip: function () {
     let g = {
       "type": "object",
       "actor": this.actorID
     };
 
     // Check if the object has a wrapper which denies access. It may be a CPOW or a
     // security wrapper. Change the class so that this will be visible in the UI.
-    let unwrapped = unwrap(this.obj);
+    let unwrapped = DevToolsUtils.unwrap(this.obj);
     if (!unwrapped) {
       if (DevToolsUtils.isCPOW(this.obj)) {
         g.class = "CPOW: " + g.class;
       } else {
         g.class = "Inaccessible";
       }
       return g;
     }
@@ -113,18 +113,17 @@ ObjectActor.prototype = {
     if (g.class == "Promise") {
       g.promiseState = this._createPromiseState();
     }
 
     // FF40+: Allow to know how many properties an object has to lazily display them
     // when there is a bunch.
     if (isTypedArray(g)) {
       // Bug 1348761: getOwnPropertyNames is unnecessary slow on TypedArrays
-      let length = DevToolsUtils.getProperty(this.obj, "length");
-      g.ownPropertyLength = length;
+      g.ownPropertyLength = getArrayLength(this.obj);
     } else if (g.class != "Proxy") {
       g.ownPropertyLength = this.obj.getOwnPropertyNames().length;
     }
 
     let raw = this.obj.unsafeDereference();
 
     // If Cu is not defined, we are running on a worker thread, where xrays
     // don't exist.
@@ -282,17 +281,17 @@ ObjectActor.prototype = {
    *          - {Object} safeGetterValues: an object that maps this.obj's property names
    *                     with safe getters descriptors.
    */
   onPrototypeAndProperties: function () {
     let ownProperties = Object.create(null);
     let ownSymbols = [];
 
     // Inaccessible, proxy and dead objects should not be accessed.
-    let unwrapped = unwrap(this.obj);
+    let unwrapped = DevToolsUtils.unwrap(this.obj);
     if (!unwrapped || unwrapped.isProxy || this.obj.class == "DeadObject") {
       return { from: this.actorID,
                prototype: this.hooks.createValueGrip(null),
                ownProperties,
                ownSymbols,
                safeGetterValues: Object.create(null) };
     }
 
@@ -331,33 +330,33 @@ ObjectActor.prototype = {
    *         defined by the remote debugging protocol.
    */
   _findSafeGetterValues: function (ownProperties, limit = 0) {
     let safeGetterValues = Object.create(null);
     let obj = this.obj;
     let level = 0, i = 0;
 
     // Do not search safe getters in inaccessible nor proxy objects.
-    let unwrapped = unwrap(obj);
+    let unwrapped = DevToolsUtils.unwrap(obj);
     if (!unwrapped || unwrapped.isProxy) {
       return safeGetterValues;
     }
 
     // Most objects don't have any safe getters but inherit some from their
     // prototype. Avoid calling getOwnPropertyNames on objects that may have
     // many properties like Array, strings or js objects. That to avoid
     // freezing firefox when doing so.
     if (isArray(this.obj) || ["Object", "String"].includes(this.obj.class)) {
       obj = obj.proto;
       level++;
     }
 
     while (obj) {
       // Stop iterating when an inaccessible or a proxy object is found.
-      unwrapped = unwrap(obj);
+      unwrapped = DevToolsUtils.unwrap(obj);
       if (!unwrapped || unwrapped.isProxy) {
         break;
       }
 
       let getters = this._findSafeGetters(obj);
       for (let name of getters) {
         // Avoid overwriting properties from prototypes closer to this.obj. Also
         // avoid providing safeGetterValues from prototypes if property |name|
@@ -865,31 +864,18 @@ PropertyIteratorActor.prototype = {
 
 PropertyIteratorActor.prototype.requestTypes = {
   "names": PropertyIteratorActor.prototype.names,
   "slice": PropertyIteratorActor.prototype.slice,
   "all": PropertyIteratorActor.prototype.all,
 };
 
 function enumArrayProperties(objectActor, options) {
-  let length = DevToolsUtils.getProperty(objectActor.obj, "length");
-  if (!isUint32(length)) {
-    // Pseudo arrays are flagged as ArrayLike if they have
-    // subsequent indexed properties without having any length attribute.
-    length = 0;
-    let names = objectActor.obj.getOwnPropertyNames();
-    for (let key of names) {
-      if (!isArrayIndex(key) || key != length++) {
-        break;
-      }
-    }
-  }
-
   return {
-    size: length,
+    size: getArrayLength(objectActor.obj),
     propertyName(index) {
       return index;
     },
     propertyDescription(index) {
       return objectActor._propertyDescriptor(index);
     }
   };
 }
@@ -1314,20 +1300,17 @@ DebuggerServer.ObjectActorPreviewers = {
 
     grip.preview = {
       timestamp: hooks.createValueGrip(time),
     };
     return true;
   }],
 
   Array: [function ({obj, hooks}, grip) {
-    let length = DevToolsUtils.getProperty(obj, "length");
-    if (typeof length != "number") {
-      return false;
-    }
+    let length = getArrayLength(obj);
 
     grip.preview = {
       kind: "ArrayLike",
       length: length,
     };
 
     if (hooks.getGripDepth() > 1) {
       return true;
@@ -1631,24 +1614,19 @@ function GenericObject(objectActor, grip
 
 // Preview functions that do not rely on the object class.
 DebuggerServer.ObjectActorPreviewers.Object = [
   function TypedArray({obj, hooks}, grip) {
     if (!isTypedArray(obj)) {
       return false;
     }
 
-    let length = DevToolsUtils.getProperty(obj, "length");
-    if (typeof length != "number") {
-      return false;
-    }
-
     grip.preview = {
       kind: "ArrayLike",
-      length: length,
+      length: getArrayLength(obj),
     };
 
     if (hooks.getGripDepth() > 1) {
       return true;
     }
 
     let raw = obj.unsafeDereference();
     let global = Cu.getGlobalForObject(DebuggerServer);
@@ -2470,46 +2448,16 @@ function arrayBufferGrip(buffer, pool) {
   }
 
   let actor = new ArrayBufferActor(buffer);
   pool.addActor(actor);
   pool.arrayBufferActors.set(buffer, actor);
   return actor.grip();
 }
 
-/**
- * Removes all the non-opaque security wrappers of a debuggee object.
- * Returns null if some wrapper can't be removed.
- *
- * @param obj Debugger.Object
- *        The debuggee object to be unwrapped.
- */
-function unwrap(obj) {
-  // Check if `obj` has an opaque wrapper.
-  if (obj.class === "Opaque") {
-    return obj;
-  }
-
-  // Attempt to unwrap. If this operation is not allowed, it may return null or throw.
-  let unwrapped;
-  try {
-    unwrapped = obj.unwrap();
-  } catch (err) {
-    unwrapped = null;
-  }
-
-  // Check if further unwrapping is not possible.
-  if (!unwrapped || unwrapped === obj) {
-    return unwrapped;
-  }
-
-  // Recursively remove additional security wrappers.
-  return unwrap(unwrapped);
-}
-
 const TYPED_ARRAY_CLASSES = ["Uint8Array", "Uint8ClampedArray", "Uint16Array",
                              "Uint32Array", "Int8Array", "Int16Array", "Int32Array",
                              "Float32Array", "Float64Array"];
 
 /**
  * Returns true if a debuggee object is a typed array.
  *
  * @param obj Debugger.Object
@@ -2527,16 +2475,42 @@ function isTypedArray(object) {
  *        The debuggee object to test.
  * @return Boolean
  */
 function isArray(object) {
   return isTypedArray(object) || object.class === "Array";
 }
 
 /**
+ * Returns the length of an array (or typed array).
+ *
+ * @param obj Debugger.Object
+ *        The debuggee object of the array.
+ * @return Number
+ * @throws if the object is not an array.
+ */
+function getArrayLength(object) {
+  if (!isArray(object)) {
+    throw new Error("Expected an array, got a " + object.class);
+  }
+
+  // Real arrays have a reliable `length` own property.
+  if (object.class === "Array") {
+    return DevToolsUtils.getProperty(object, "length");
+  }
+
+  // For typed arrays, `DevToolsUtils.getProperty` is not reliable because the `length`
+  // getter could be shadowed by an own property, and `getOwnPropertyNames` is
+  // unnecessarily slow. Obtain the `length` getter safely and call it manually.
+  let typedProto = Object.getPrototypeOf(Uint8Array.prototype);
+  let getter = Object.getOwnPropertyDescriptor(typedProto, "length").get;
+  return getter.call(object.unsafeDereference());
+}
+
+/**
  * Returns true if the parameter can be stored as a 32-bit unsigned integer.
  * If so, it will be suitable for use as the length of an array object.
  *
  * @param num Number
  *        The number to test.
  * @return Boolean
  */
 function isUint32(num) {
--- a/devtools/server/tests/unit/test_objectgrips-20.js
+++ b/devtools/server/tests/unit/test_objectgrips-20.js
@@ -148,16 +148,37 @@ async function run_test_with_server(serv
     expectedNonIndexedProperties: [
       ["foo", "bar"],
       ["bar", "foo"],
       ["length", 2],
       ["buffer", DO_NOT_CHECK_VALUE],
       ["byteLength", 2],
       ["byteOffset", 0],
     ],
+  }, {
+    evaledObject: `(() => {
+      x = new Int8Array([1, 2]);
+      Object.defineProperty(x, 'length', {value: 0});
+      return x;
+    })()`,
+    expectedIndexedProperties: [["0", 1], ["1", 2]],
+    expectedNonIndexedProperties: [
+      ["length", 0],
+      ["buffer", DO_NOT_CHECK_VALUE],
+      ["byteLength", 2],
+      ["byteOffset", 0],
+    ],
+  }, {
+    evaledObject: `(() => {
+      x = new Int32Array([1, 2]);
+      Object.setPrototypeOf(x, null);
+      return x;
+    })()`,
+    expectedIndexedProperties: [["0", 1], ["1", 2]],
+    expectedNonIndexedProperties: [],
   }].forEach(async (testData) => {
     await test_object_grip(debuggee, dbgClient, threadClient, testData);
   });
 
   await dbgClient.close();
 }
 
 async function test_object_grip(debuggee, dbgClient, threadClient, testData = {}) {
--- a/devtools/server/tests/unit/test_safe-getter.js
+++ b/devtools/server/tests/unit/test_safe-getter.js
@@ -18,9 +18,22 @@ function run_test() {
 
     // This is a CCW.
     XPCOMUtils.defineLazyGetter(this, "foo", function() { return "foo"; });
   `);
 
   // Neither scripted getter should be considered safe.
   assert(!DevToolsUtils.hasSafeGetter(gw.getOwnPropertyDescriptor("bar")));
   assert(!DevToolsUtils.hasSafeGetter(gw.getOwnPropertyDescriptor("foo")));
+
+  // Create an object in a less privileged sandbox.
+  let obj = gw.makeDebuggeeValue(Cu.waiveXrays(Cu.Sandbox(null).eval(`
+    Object.defineProperty({}, "bar", {
+      get: function() { return "bar"; },
+      configurable: true,
+      enumerable: true
+    });
+  `)));
+
+  // After waiving Xrays, the object has 2 wrappers. Both must be removed
+  // in order to detect that the getter is not safe.
+  assert(!DevToolsUtils.hasSafeGetter(obj.getOwnPropertyDescriptor("bar")));
 }
--- a/devtools/shared/DevToolsUtils.js
+++ b/devtools/shared/DevToolsUtils.js
@@ -199,33 +199,61 @@ exports.getProperty = function (object, 
   } catch (e) {
     // If anything goes wrong report the error and return undefined.
     exports.reportException("getProperty", e);
   }
   return undefined;
 };
 
 /**
+ * Removes all the non-opaque security wrappers of a debuggee object.
+ * Returns null if some wrapper can't be removed.
+ *
+ * @param obj Debugger.Object
+ *        The debuggee object to be unwrapped.
+ * @return Debugger.Object|null
+ *        The unwrapped object, or null if some wrapper couldn't be removed.
+ */
+exports.unwrap = function unwrap(obj) {
+  // Check if `obj` has an opaque wrapper.
+  if (obj.class === "Opaque") {
+    return obj;
+  }
+
+  // Attempt to unwrap. If this operation is not allowed, it may return null or throw.
+  let unwrapped;
+  try {
+    unwrapped = obj.unwrap();
+  } catch (err) {
+    unwrapped = null;
+  }
+
+  // Check if further unwrapping is not possible.
+  if (!unwrapped || unwrapped === obj) {
+    return unwrapped;
+  }
+
+  // Recursively remove additional security wrappers.
+  return unwrap(unwrapped);
+};
+
+/**
  * Determines if a descriptor has a getter which doesn't call into JavaScript.
  *
  * @param Object desc
  *        The descriptor to check for a safe getter.
  * @return Boolean
  *         Whether a safe getter was found.
  */
 exports.hasSafeGetter = function (desc) {
   // Scripted functions that are CCWs will not appear scripted until after
   // unwrapping.
-  try {
-    let fn = desc.get.unwrap();
-    return fn && fn.callable && fn.class == "Function" && fn.script === undefined;
-  } catch (e) {
-    // Avoid exception 'Object in compartment marked as invisible to Debugger'
-    return false;
-  }
+  let fn = desc.get;
+  fn = fn && exports.unwrap(fn);
+  return fn && fn.callable && fn.class == "Function" && fn.script === undefined;
 };
 
 /**
  * Check if it is safe to read properties and execute methods from the given JS
  * object. Safety is defined as being protected from unintended code execution
  * from content scripts (or cross-compartment code).
  *
  * See bugs 945920 and 946752 for discussion.
--- a/dom/base/nsDOMWindowUtils.cpp
+++ b/dom/base/nsDOMWindowUtils.cpp
@@ -4499,16 +4499,34 @@ nsDOMWindowUtils::EnsureDirtyRootFrame()
 NS_IMETHODIMP
 nsDOMWindowUtils::GetIsStyledByServo(bool* aStyledByServo)
 {
   nsIDocument* doc = GetDocument();
   *aStyledByServo = doc && doc->IsStyledByServo();
   return NS_OK;
 }
 
+NS_IMETHODIMP
+nsDOMWindowUtils::AddToStyloBlocklist(const nsACString& aBlockedDomain)
+{
+#ifdef MOZ_STYLO
+  nsLayoutUtils::AddToStyloBlocklist(aBlockedDomain);
+#endif
+  return NS_OK;
+}
+
+NS_IMETHODIMP
+nsDOMWindowUtils::RemoveFromStyloBlocklist(const nsACString& aBlockedDomain)
+{
+#ifdef MOZ_STYLO
+  nsLayoutUtils::RemoveFromStyloBlocklist(aBlockedDomain);
+#endif
+  return NS_OK;
+}
+
 NS_INTERFACE_MAP_BEGIN(nsTranslationNodeList)
   NS_INTERFACE_MAP_ENTRY(nsISupports)
   NS_INTERFACE_MAP_ENTRY(nsITranslationNodeList)
 NS_INTERFACE_MAP_END
 
 NS_IMPL_ADDREF(nsTranslationNodeList)
 NS_IMPL_RELEASE(nsTranslationNodeList)
 
--- a/dom/base/nsDocument.cpp
+++ b/dom/base/nsDocument.cpp
@@ -13680,17 +13680,18 @@ nsIDocument::UpdateStyleBackendType()
   if (nsLayoutUtils::StyloEnabled()) {
     // Disable stylo only for system principal. Other principals aren't
     // able to use XUL by default, and the back door to enable XUL is
     // mostly just for testing, which means they don't matter, and we
     // shouldn't respect them at the same time.
     // Note that, since tests can have XUL support, we still need to
     // explicitly exclude XUL documents here.
     if (!nsContentUtils::IsSystemPrincipal(NodePrincipal()) &&
-        !IsXULDocument() && !ShouldUseGeckoBackend(mDocumentURI)) {
+        !IsXULDocument() && !ShouldUseGeckoBackend(mDocumentURI) &&
+        !nsLayoutUtils::IsInStyloBlocklist(NodePrincipal())) {
       mStyleBackendType = StyleBackendType::Servo;
     }
   }
 #endif
 }
 
 /**
  * Retrieves the classification of the Flash plugins in the document based on
old mode 100644
new mode 100755
--- a/dom/gamepad/windows/WindowsGamepad.cpp
+++ b/dom/gamepad/windows/WindowsGamepad.cpp
@@ -134,38 +134,38 @@ public:
 
   // Used during rescan to find devices that were disconnected.
   bool present;
 
   Gamepad(uint32_t aNumAxes,
           uint32_t aNumButtons,
           bool aHasDpad,
           GamepadType aType) :
+    type(aType),
     numAxes(aNumAxes),
     numButtons(aNumButtons),
     hasDpad(aHasDpad),
-    type(aType),
     present(true)
   {
     buttons.SetLength(numButtons);
     axes.SetLength(numAxes);
   }
 private:
   Gamepad() {}
 };
 
 // Drop this in favor of decltype when we require a new enough SDK.
 typedef void (WINAPI *XInputEnable_func)(BOOL);
 
 // RAII class to wrap loading the XInput DLL
 class XInputLoader {
 public:
   XInputLoader() : module(nullptr),
-                   mXInputEnable(nullptr),
-                   mXInputGetState(nullptr) {
+                   mXInputGetState(nullptr),
+                   mXInputEnable(nullptr) {
     // xinput1_4.dll exists on Windows 8
     // xinput9_1_0.dll exists on Windows 7 and Vista
     // xinput1_3.dll shipped with the DirectX SDK
     const wchar_t* dlls[] = {L"xinput1_4.dll",
                              L"xinput9_1_0.dll",
                              L"xinput1_3.dll"};
     const size_t kNumDLLs = ArrayLength(dlls);
     for (size_t i = 0; i < kNumDLLs; ++i) {
@@ -275,24 +275,24 @@ SupportedUsage(USHORT page, USHORT usage
       return true;
     }
   }
   return false;
 }
 
 class HIDLoader {
 public:
-  HIDLoader() : mModule(LoadLibraryW(L"hid.dll")),
-                mHidD_GetProductString(nullptr),
+  HIDLoader() : mHidD_GetProductString(nullptr),
                 mHidP_GetCaps(nullptr),
                 mHidP_GetButtonCaps(nullptr),
                 mHidP_GetValueCaps(nullptr),
                 mHidP_GetUsages(nullptr),
                 mHidP_GetUsageValue(nullptr),
-                mHidP_GetScaledUsageValue(nullptr)
+                mHidP_GetScaledUsageValue(nullptr),
+                mModule(LoadLibraryW(L"hid.dll"))
   {
     if (mModule) {
       mHidD_GetProductString = reinterpret_cast<decltype(HidD_GetProductString)*>(GetProcAddress(mModule, "HidD_GetProductString"));
       mHidP_GetCaps = reinterpret_cast<decltype(HidP_GetCaps)*>(GetProcAddress(mModule, "HidP_GetCaps"));
       mHidP_GetButtonCaps = reinterpret_cast<decltype(HidP_GetButtonCaps)*>(GetProcAddress(mModule, "HidP_GetButtonCaps"));
       mHidP_GetValueCaps = reinterpret_cast<decltype(HidP_GetValueCaps)*>(GetProcAddress(mModule, "HidP_GetValueCaps"));
       mHidP_GetUsages = reinterpret_cast<decltype(HidP_GetUsages)*>(GetProcAddress(mModule, "HidP_GetUsages"));
       mHidP_GetUsageValue = reinterpret_cast<decltype(HidP_GetUsageValue)*>(GetProcAddress(mModule, "HidP_GetUsageValue"));
--- a/dom/interfaces/base/nsIDOMWindowUtils.idl
+++ b/dom/interfaces/base/nsIDOMWindowUtils.idl
@@ -2041,16 +2041,30 @@ interface nsIDOMWindowUtils : nsISupport
 
   /**
    * Whether the current document is styled by Servo's style engine.
    *
    * This calls nsIDocument::IsStyledByServo().
    */
   readonly attribute boolean isStyledByServo;
 
+  /**
+   * Add a domain to the existing stylo blocklist.
+   *
+   * This calls nsLayoutUtils::AddToStyloBlocklist().
+   */
+  void addToStyloBlocklist(in ACString aBlockedDomain);
+
+  /**
+   * Remove a domain from the existing stylo blocklist.
+   *
+   * This calls nsLayoutUtils::RemoveFromStyloBlocklist().
+   */
+  void removeFromStyloBlocklist(in ACString aBlockedDomain);
+
   // These consts are only for testing purposes.
   const long DEFAULT_MOUSE_POINTER_ID = 0;
   const long DEFAULT_PEN_POINTER_ID   = 1;
   const long DEFAULT_TOUCH_POINTER_ID = 2;
 
   // Match WidgetMouseEventBase::buttonType.
   const long MOUSE_BUTTON_LEFT_BUTTON   = 0;
   const long MOUSE_BUTTON_MIDDLE_BUTTON = 1;
--- a/dom/ipc/ContentPrefs.cpp
+++ b/dom/ipc/ContentPrefs.cpp
@@ -116,16 +116,20 @@ const char* mozilla::dom::ContentPrefs::
   "javascript.options.throw_on_asmjs_validation_failure",
   "javascript.options.throw_on_debuggee_would_run",
   "javascript.options.wasm",
   "javascript.options.wasm_baselinejit",
   "javascript.options.wasm_ionjit",
   "javascript.options.werror",
   "javascript.use_us_english_locale",
   "jsloader.shareGlobal",
+#ifdef MOZ_STYLO
+  "layout.css.stylo-blocklist.blocked_domains",
+  "layout.css.stylo-blocklist.enabled",
+#endif
   "layout.idle_period.required_quiescent_frames",
   "layout.idle_period.time_limit",
   "layout.interruptible-reflow.enabled",
   "mathml.disabled",
   "media.apple.forcevda",
   "media.clearkey.persistent-license.enabled",
   "media.cubeb.backend",
   "media.cubeb.sandbox",
--- a/dom/media/MediaCache.cpp
+++ b/dom/media/MediaCache.cpp
@@ -8,16 +8,17 @@
 
 #include "ChannelMediaResource.h"
 #include "FileBlockCache.h"
 #include "MediaBlockCacheBase.h"
 #include "MediaPrefs.h"
 #include "MediaResource.h"
 #include "MemoryBlockCache.h"
 #include "mozilla/Attributes.h"
+#include "mozilla/ClearOnShutdown.h"
 #include "mozilla/Logging.h"
 #include "mozilla/Preferences.h"
 #include "mozilla/ReentrantMonitor.h"
 #include "mozilla/Services.h"
 #include "mozilla/StaticPtr.h"
 #include "mozilla/SystemGroup.h"
 #include "mozilla/Telemetry.h"
 #include "nsContentUtils.h"
@@ -146,17 +147,17 @@ public:
 
   // Get an instance of a MediaCache (or nullptr if initialization failed).
   // aContentLength is the content length if known already, otherwise -1.
   // If the length is known and considered small enough, a discrete MediaCache
   // with memory backing will be given. Otherwise the one MediaCache with
   // file backing will be provided.
   static RefPtr<MediaCache> GetMediaCache(int64_t aContentLength);
 
-  nsIEventTarget* OwnerThread() const { return mThread; }
+  nsIEventTarget* OwnerThread() const { return sThread; }
 
   // Brutally flush the cache contents. Main thread only.
   void Flush();
 
   // Close all streams associated with private browsing windows. This will
   // also remove the blocks from the cache since we don't want to leave any
   // traces when PB is done.
   void CloseStreamsForPrivateBrowsing();
@@ -261,32 +262,49 @@ public:
       return nullptr;
     }
   private:
     MediaCache* mMediaCache;
     int64_t  mResourceID;
     uint32_t mNext;
   };
 
+  // Called during shutdown to clear sThread.
+  void operator=(std::nullptr_t)
+  {
+    nsCOMPtr<nsIThread> thread = sThread.forget();
+    if (thread) {
+      thread->Shutdown();
+    }
+  }
+
 protected:
   explicit MediaCache(MediaBlockCacheBase* aCache)
     : mNextResourceID(1)
     , mReentrantMonitor("MediaCache.mReentrantMonitor")
     , mBlockCache(aCache)
     , mUpdateQueued(false)
 #ifdef DEBUG
     , mInUpdate(false)
 #endif
   {
     NS_ASSERTION(NS_IsMainThread(), "Only construct MediaCache on main thread");
     MOZ_COUNT_CTOR(MediaCache);
     MediaCacheFlusher::RegisterMediaCache(this);
-    nsresult rv = NS_NewNamedThread("MediaCache", getter_AddRefs(mThread));
-    if (NS_FAILED(rv)) {
-      NS_WARNING("Failed to create a thread for MediaCache.");
+
+    if (!sThreadInit) {
+      sThreadInit = true;
+      nsCOMPtr<nsIThread> thread;
+      nsresult rv = NS_NewNamedThread("MediaCache", getter_AddRefs(thread));
+      if (NS_FAILED(rv)) {
+        NS_WARNING("Failed to create a thread for MediaCache.");
+        return;
+      }
+      sThread = thread.forget();
+      ClearOnShutdown(this, ShutdownPhase::ShutdownThreads);
     }
   }
 
   ~MediaCache()
   {
     NS_ASSERTION(NS_IsMainThread(), "Only destroy MediaCache on main thread");
     if (this == gMediaCache) {
       LOG("~MediaCache(Global file-backed MediaCache)");
@@ -309,21 +327,16 @@ protected:
     } else {
       LOG("~MediaCache(Memory-backed MediaCache %p)", this);
     }
     MediaCacheFlusher::UnregisterMediaCache(this);
     NS_ASSERTION(mStreams.IsEmpty(), "Stream(s) still open!");
     Truncate();
     NS_ASSERTION(mIndex.Length() == 0, "Blocks leaked?");
 
-    nsCOMPtr<nsIThread> thread = mThread.forget();
-    if (thread) {
-      thread->Shutdown();
-    }
-
     MOZ_COUNT_DTOR(MediaCache);
   }
 
   // Find a free or reusable block and return its index. If there are no
   // free blocks and no reusable blocks, add a new block to the cache
   // and return it. Can return -1 on OOM.
   int32_t FindBlockForIncomingData(TimeStamp aNow,
                                    MediaCacheStream* aStream,
@@ -443,23 +456,30 @@ protected:
   // True if an event to run Update() has been queued but not processed
   bool            mUpdateQueued;
 #ifdef DEBUG
   bool            mInUpdate;
 #endif
   // A list of resource IDs to notify about the change in suspended status.
   nsTArray<int64_t> mSuspendedStatusToNotify;
   // The thread on which we will run data callbacks from the channels.
-  // Could be null if failing to create the thread.
-  nsCOMPtr<nsIThread> mThread;
+  // Could be null if failing to create the thread. Note this thread is shared
+  // among all MediaCache instances.
+  static StaticRefPtr<nsIThread> sThread;
+  // True if we've tried to init sThread. Note we try once only so it is safe
+  // to access sThread on all threads.
+  static bool sThreadInit;
 };
 
 // Initialized to nullptr by non-local static initialization.
 /* static */ MediaCache* MediaCache::gMediaCache;
 
+/* static */ StaticRefPtr<nsIThread> MediaCache::sThread;
+/* static */ bool MediaCache::sThreadInit = false;
+
 NS_IMETHODIMP
 MediaCacheFlusher::Observe(nsISupports *aSubject, char const *aTopic, char16_t const *aData)
 {
   NS_ASSERTION(NS_IsMainThread(), "Only call on main thread");
 
   if (strcmp(aTopic, "last-pb-context-exited") == 0) {
     for (MediaCache* mc : mMediaCaches) {
       mc->CloseStreamsForPrivateBrowsing();
--- a/dom/media/MediaDecoder.cpp
+++ b/dom/media/MediaDecoder.cpp
@@ -369,17 +369,16 @@ MediaDecoder::MediaDecoder(MediaDecoderI
   , mFiredMetadataLoaded(false)
   , mIsDocumentVisible(false)
   , mElementVisibility(Visibility::UNTRACKED)
   , mIsElementInTree(false)
   , mForcedHidden(false)
   , mHasSuspendTaint(aInit.mHasSuspendTaint)
   , mPlaybackRate(aInit.mPlaybackRate)
   , INIT_MIRROR(mBuffered, TimeIntervals())
-  , INIT_MIRROR(mNextFrameStatus, MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE)
   , INIT_MIRROR(mCurrentPosition, TimeUnit::Zero())
   , INIT_MIRROR(mStateMachineDuration, NullableTimeUnit())
   , INIT_MIRROR(mPlaybackPosition, 0)
   , INIT_MIRROR(mIsAudioDataAudible, false)
   , INIT_CANONICAL(mVolume, aInit.mVolume)
   , INIT_CANONICAL(mPreservesPitch, aInit.mPreservesPitch)
   , INIT_CANONICAL(mLooping, aInit.mLooping)
   , INIT_CANONICAL(mPlayState, PLAY_STATE_LOADING)
@@ -399,17 +398,16 @@ MediaDecoder::MediaDecoder(MediaDecoderI
   // Initialize watchers.
   //
 
   // mDuration
   mWatchManager.Watch(mStateMachineDuration, &MediaDecoder::DurationChanged);
 
   // readyState
   mWatchManager.Watch(mPlayState, &MediaDecoder::UpdateReadyState);
-  mWatchManager.Watch(mNextFrameStatus, &MediaDecoder::UpdateReadyState);
   // ReadyState computation depends on MediaDecoder::CanPlayThrough, which
   // depends on the download rate.
   mWatchManager.Watch(mBuffered, &MediaDecoder::UpdateReadyState);
 
   // mLogicalPosition
   mWatchManager.Watch(mCurrentPosition, &MediaDecoder::UpdateLogicalPosition);
   mWatchManager.Watch(mPlayState, &MediaDecoder::UpdateLogicalPosition);
   mWatchManager.Watch(mLogicallySeeking, &MediaDecoder::UpdateLogicalPosition);
@@ -447,16 +445,17 @@ MediaDecoder::Shutdown()
     mFirstFrameLoadedListener.Disconnect();
     mOnPlaybackEvent.Disconnect();
     mOnPlaybackErrorEvent.Disconnect();
     mOnDecoderDoctorEvent.Disconnect();
     mOnMediaNotSeekable.Disconnect();
     mOnEncrypted.Disconnect();
     mOnWaitingForKey.Disconnect();
     mOnDecodeWarning.Disconnect();
+    mOnNextFrameStatus.Disconnect();
 
     mDecoderStateMachine->BeginShutdown()
       ->Then(mAbstractMainThread, __func__, this,
              &MediaDecoder::FinishShutdown,
              &MediaDecoder::FinishShutdown);
   } else {
     // Ensure we always unregister asynchronously in order not to disrupt
     // the hashtable iterating in MediaShutdownManager::Shutdown().
@@ -552,16 +551,46 @@ MediaDecoder::OnDecoderDoctorEvent(Decod
   nsIDocument* doc = GetOwner()->GetDocument();
   if (!doc) {
     return;
   }
   DecoderDoctorDiagnostics diags;
   diags.StoreEvent(doc, aEvent, __func__);
 }
 
+static const char*
+NextFrameStatusToStr(MediaDecoderOwner::NextFrameStatus aStatus)
+{
+  switch (aStatus) {
+    case MediaDecoderOwner::NEXT_FRAME_AVAILABLE:
+      return "NEXT_FRAME_AVAILABLE";
+    case MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE:
+      return "NEXT_FRAME_UNAVAILABLE";
+    case MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE_BUFFERING:
+      return "NEXT_FRAME_UNAVAILABLE_BUFFERING";
+    case MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE_SEEKING:
+      return "NEXT_FRAME_UNAVAILABLE_SEEKING";
+    case MediaDecoderOwner::NEXT_FRAME_UNINITIALIZED:
+      return "NEXT_FRAME_UNINITIALIZED";
+  }
+  return "UNKNOWN";
+}
+
+void
+MediaDecoder::OnNextFrameStatus(MediaDecoderOwner::NextFrameStatus aStatus)
+{
+  MOZ_ASSERT(NS_IsMainThread());
+  MOZ_DIAGNOSTIC_ASSERT(!IsShutdown());
+  if (mNextFrameStatus != aStatus) {
+    LOG("Changed mNextFrameStatus to %s", NextFrameStatusToStr(aStatus));
+    mNextFrameStatus = aStatus;
+    UpdateReadyState();
+  }
+}
+
 void
 MediaDecoder::FinishShutdown()
 {
   MOZ_ASSERT(NS_IsMainThread());
   SetStateMachine(nullptr);
   mVideoFrameContainer = nullptr;
   MediaShutdownManager::Instance().Unregister(this);
 }
@@ -601,16 +630,18 @@ MediaDecoder::SetStateMachineParameters(
   mOnPlaybackEvent = mDecoderStateMachine->OnPlaybackEvent().Connect(
     mAbstractMainThread, this, &MediaDecoder::OnPlaybackEvent);
   mOnPlaybackErrorEvent = mDecoderStateMachine->OnPlaybackErrorEvent().Connect(
     mAbstractMainThread, this, &MediaDecoder::OnPlaybackErrorEvent);
   mOnDecoderDoctorEvent = mDecoderStateMachine->OnDecoderDoctorEvent().Connect(
     mAbstractMainThread, this, &MediaDecoder::OnDecoderDoctorEvent);
   mOnMediaNotSeekable = mDecoderStateMachine->OnMediaNotSeekable().Connect(
     mAbstractMainThread, this, &MediaDecoder::OnMediaNotSeekable);
+  mOnNextFrameStatus = mDecoderStateMachine->OnNextFrameStatus().Connect(
+    mAbstractMainThread, this, &MediaDecoder::OnNextFrameStatus);
 
   mOnEncrypted = mReader->OnEncrypted().Connect(
     mAbstractMainThread, GetOwner(), &MediaDecoderOwner::DispatchEncrypted);
   mOnWaitingForKey = mReader->OnWaitingForKey().Connect(
     mAbstractMainThread, GetOwner(), &MediaDecoderOwner::NotifyWaitingForKey);
   mOnDecodeWarning = mReader->OnDecodeWarning().Connect(
     mAbstractMainThread, GetOwner(), &MediaDecoderOwner::DecodeWarning);
 }
@@ -1242,29 +1273,27 @@ MediaDecoder::SetLooping(bool aLooping)
 
 void
 MediaDecoder::ConnectMirrors(MediaDecoderStateMachine* aObject)
 {
   MOZ_ASSERT(NS_IsMainThread());
   MOZ_ASSERT(aObject);
   mStateMachineDuration.Connect(aObject->CanonicalDuration());
   mBuffered.Connect(aObject->CanonicalBuffered());
-  mNextFrameStatus.Connect(aObject->CanonicalNextFrameStatus());
   mCurrentPosition.Connect(aObject->CanonicalCurrentPosition());
   mPlaybackPosition.Connect(aObject->CanonicalPlaybackOffset());
   mIsAudioDataAudible.Connect(aObject->CanonicalIsAudioDataAudible());
 }
 
 void
 MediaDecoder::DisconnectMirrors()
 {
   MOZ_ASSERT(NS_IsMainThread());
   mStateMachineDuration.DisconnectIfConnected();
   mBuffered.DisconnectIfConnected();
-  mNextFrameStatus.DisconnectIfConnected();
   mCurrentPosition.DisconnectIfConnected();
   mPlaybackPosition.DisconnectIfConnected();
   mIsAudioDataAudible.DisconnectIfConnected();
 }
 
 void
 MediaDecoder::SetStateMachine(MediaDecoderStateMachine* aStateMachine)
 {
--- a/dom/media/MediaDecoder.h
+++ b/dom/media/MediaDecoder.h
@@ -377,19 +377,19 @@ private:
 
   void UpdateReadyState()
   {
     MOZ_ASSERT(NS_IsMainThread());
     MOZ_DIAGNOSTIC_ASSERT(!IsShutdown());
     GetOwner()->UpdateReadyState();
   }
 
-  virtual MediaDecoderOwner::NextFrameStatus NextFrameStatus()
+  MediaDecoderOwner::NextFrameStatus NextFrameStatus() const
   {
-    return !IsEnded() ? mNextFrameStatus : MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE;
+    return mNextFrameStatus;
   }
 
   virtual MediaDecoderOwner::NextFrameStatus NextFrameBufferedStatus();
 
   // Returns a string describing the state of the media player internal
   // data. Used for debugging purposes.
   virtual void GetMozDebugReaderData(nsACString& aString);
 
@@ -489,16 +489,18 @@ private:
 
   void OnDecoderDoctorEvent(DecoderDoctorEvent aEvent);
 
   void OnMediaNotSeekable()
   {
     mMediaSeekable = false;
   }
 
+  void OnNextFrameStatus(MediaDecoderOwner::NextFrameStatus);
+
   void FinishShutdown();
 
   void ConnectMirrors(MediaDecoderStateMachine* aObject);
   void DisconnectMirrors();
 
   virtual bool CanPlayThroughImpl() = 0;
   virtual bool IsLiveStream() = 0;
 
@@ -574,40 +576,41 @@ protected:
 
   // If true, forces the decoder to be considered hidden.
   bool mForcedHidden;
 
   // True if the decoder has a suspend taint - meaning suspend-video-decoder is
   // disabled.
   bool mHasSuspendTaint;
 
+  MediaDecoderOwner::NextFrameStatus mNextFrameStatus =
+    MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE;
+
   // A listener to receive metadata updates from MDSM.
   MediaEventListener mTimedMetadataListener;
 
   MediaEventListener mMetadataLoadedListener;
   MediaEventListener mFirstFrameLoadedListener;
 
   MediaEventListener mOnPlaybackEvent;
   MediaEventListener mOnPlaybackErrorEvent;
   MediaEventListener mOnDecoderDoctorEvent;
   MediaEventListener mOnMediaNotSeekable;
   MediaEventListener mOnEncrypted;
   MediaEventListener mOnWaitingForKey;
   MediaEventListener mOnDecodeWarning;
+  MediaEventListener mOnNextFrameStatus;
 
 protected:
   // PlaybackRate and pitch preservation status we should start at.
   double mPlaybackRate;
 
   // Buffered range, mirrored from the reader.
   Mirror<media::TimeIntervals> mBuffered;
 
-  // NextFrameStatus, mirrored from the state machine.
-  Mirror<MediaDecoderOwner::NextFrameStatus> mNextFrameStatus;
-
   // NB: Don't use mCurrentPosition directly, but rather CurrentPosition().
   Mirror<media::TimeUnit> mCurrentPosition;
 
   // Duration of the media resource according to the state machine.
   Mirror<media::NullableTimeUnit> mStateMachineDuration;
 
   // Current playback position in the stream. This is (approximately)
   // where we're up to playing back the stream. This is not adjusted
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -864,17 +864,17 @@ public:
     // request is from the user.
     if (mVisibility == EventVisibility::Observable) {
       // Don't stop playback for a video-only seek since we want to keep playing
       // audio and we don't need to stop playback while leaving dormant for the
       // playback should has been stopped.
       mMaster->StopPlayback();
       mMaster->UpdatePlaybackPositionInternal(mSeekJob.mTarget->GetTime());
       mMaster->mOnPlaybackEvent.Notify(MediaEventType::SeekStarted);
-      mMaster->UpdateNextFrameStatus(
+      mMaster->mOnNextFrameStatus.Notify(
         MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE_SEEKING);
     }
 
     RefPtr<MediaDecoder::SeekPromise> p = mSeekJob.mPromise.Ensure(__func__);
 
     DoSeek();
 
     return p;
@@ -1139,18 +1139,19 @@ protected:
     if (aReject.mError == NS_ERROR_DOM_MEDIA_WAITING_FOR_DATA) {
       SLOG("OnSeekRejected reason=WAITING_FOR_DATA type=%d", aReject.mType);
       MOZ_ASSERT_IF(aReject.mType == MediaData::AUDIO_DATA, !mMaster->IsRequestingAudioData());
       MOZ_ASSERT_IF(aReject.mType == MediaData::VIDEO_DATA, !mMaster->IsRequestingVideoData());
       MOZ_ASSERT_IF(aReject.mType == MediaData::AUDIO_DATA, !mMaster->IsWaitingAudioData());
       MOZ_ASSERT_IF(aReject.mType == MediaData::VIDEO_DATA, !mMaster->IsWaitingVideoData());
 
       // Fire 'waiting' to notify the player that we are waiting for data.
-      mMaster->UpdateNextFrameStatus(
+      mMaster->mOnNextFrameStatus.Notify(
         MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE_SEEKING);
+
       Reader()
         ->WaitForData(aReject.mType)
         ->Then(OwnerThread(), __func__,
                [this](MediaData::Type aType) {
                  SLOG("OnSeekRejected wait promise resolved");
                  mWaitRequest.Complete();
                  DemuxerSeek();
                },
@@ -1790,17 +1791,17 @@ public:
   void Enter()
   {
     if (mMaster->IsPlaying()) {
       mMaster->StopPlayback();
     }
 
     mBufferingStart = TimeStamp::Now();
     mMaster->ScheduleStateMachineIn(TimeUnit::FromMicroseconds(USECS_PER_S));
-    mMaster->UpdateNextFrameStatus(
+    mMaster->mOnNextFrameStatus.Notify(
       MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE_BUFFERING);
   }
 
   void Step() override;
 
   State GetState() const override { return DECODER_STATE_BUFFERING; }
 
   void HandleAudioDecoded(AudioData* aAudio) override
@@ -1896,17 +1897,17 @@ public:
       // We've decoded all samples.
       // We don't need decoders anymore if not looping.
       Reader()->ReleaseResources();
     }
 #endif
     bool hasNextFrame = (!mMaster->HasAudio() || !mMaster->mAudioCompleted) &&
                         (!mMaster->HasVideo() || !mMaster->mVideoCompleted);
 
-    mMaster->UpdateNextFrameStatus(
+    mMaster->mOnNextFrameStatus.Notify(
       hasNextFrame ? MediaDecoderOwner::NEXT_FRAME_AVAILABLE
                    : MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE);
 
     Step();
   }
 
   void Exit() override
   {
@@ -1941,16 +1942,20 @@ public:
       auto clockTime =
         std::max(mMaster->AudioEndTime(), mMaster->VideoEndTime());
       if (mMaster->mDuration.Ref()->IsInfinite()) {
         // We have a finite duration when playback reaches the end.
         mMaster->mDuration = Some(clockTime);
       }
       mMaster->UpdatePlaybackPosition(clockTime);
 
+      // Ensure readyState is updated before firing the 'ended' event.
+      mMaster->mOnNextFrameStatus.Notify(
+        MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE);
+
       mMaster->mOnPlaybackEvent.Notify(MediaEventType::PlaybackEnded);
 
       mSentPlaybackEndedEvent = true;
 
       // MediaSink::GetEndTime() must be called before stopping playback.
       mMaster->StopMediaSink();
     }
   }
@@ -2276,17 +2281,17 @@ DecodingState::Enter()
   });
   mOnVideoPopped = VideoQueue().PopEvent().Connect(
     OwnerThread(), [this] () {
     if (mMaster->IsVideoDecoding() && !mMaster->HaveEnoughDecodedVideo()) {
       EnsureVideoDecodeTaskQueued();
     }
   });
 
-  mMaster->UpdateNextFrameStatus(MediaDecoderOwner::NEXT_FRAME_AVAILABLE);
+  mMaster->mOnNextFrameStatus.Notify(MediaDecoderOwner::NEXT_FRAME_AVAILABLE);
 
   mDecodeStartTime = TimeStamp::Now();
 
   MaybeStopPrerolling();
 
   // Ensure that we've got tasks enqueued to decode data if we need to.
   DispatchDecodeTasksIfNeeded();
 
@@ -2568,17 +2573,16 @@ ShutdownState::Enter()
   master->mPlayState.DisconnectIfConnected();
   master->mVolume.DisconnectIfConnected();
   master->mPreservesPitch.DisconnectIfConnected();
   master->mLooping.DisconnectIfConnected();
   master->mSameOriginMedia.DisconnectIfConnected();
   master->mMediaPrincipalHandle.DisconnectIfConnected();
 
   master->mDuration.DisconnectAll();
-  master->mNextFrameStatus.DisconnectAll();
   master->mCurrentPosition.DisconnectAll();
   master->mPlaybackOffset.DisconnectAll();
   master->mIsAudioDataAudible.DisconnectAll();
 
   // Shut down the watch manager to stop further notifications.
   master->mWatchManager.Shutdown();
 
   return Reader()->Shutdown()->Then(
@@ -2621,17 +2625,16 @@ MediaDecoderStateMachine::MediaDecoderSt
   INIT_MIRROR(mBuffered, TimeIntervals()),
   INIT_MIRROR(mPlayState, MediaDecoder::PLAY_STATE_LOADING),
   INIT_MIRROR(mVolume, 1.0),
   INIT_MIRROR(mPreservesPitch, true),
   INIT_MIRROR(mLooping, false),
   INIT_MIRROR(mSameOriginMedia, false),
   INIT_MIRROR(mMediaPrincipalHandle, PRINCIPAL_HANDLE_NONE),
   INIT_CANONICAL(mDuration, NullableTimeUnit()),
-  INIT_CANONICAL(mNextFrameStatus, MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE),
   INIT_CANONICAL(mCurrentPosition, TimeUnit::Zero()),
   INIT_CANONICAL(mPlaybackOffset, 0),
   INIT_CANONICAL(mIsAudioDataAudible, false)
 #ifdef XP_WIN
   , mShouldUseHiResTimers(Preferences::GetBool("media.hi-res-timers.enabled", true))
 #endif
 {
   MOZ_COUNT_CTOR(MediaDecoderStateMachine);
@@ -3482,44 +3485,16 @@ MediaDecoderStateMachine::UpdatePlayback
   // Otherwise, MediaDecoder::AddOutputStream could kick in when we are outside
   // the monitor and get a staled value from GetCurrentTimeUs() which hits the
   // assertion in GetClock().
 
   int64_t delay = std::max<int64_t>(1, AUDIO_DURATION_USECS / mPlaybackRate);
   ScheduleStateMachineIn(TimeUnit::FromMicroseconds(delay));
 }
 
-/* static */ const char*
-MediaDecoderStateMachine::ToStr(NextFrameStatus aStatus)
-{
-  switch (aStatus) {
-    case MediaDecoderOwner::NEXT_FRAME_AVAILABLE:
-      return "NEXT_FRAME_AVAILABLE";
-    case MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE:
-      return "NEXT_FRAME_UNAVAILABLE";
-    case MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE_BUFFERING:
-      return "NEXT_FRAME_UNAVAILABLE_BUFFERING";
-    case MediaDecoderOwner::NEXT_FRAME_UNAVAILABLE_SEEKING:
-      return "NEXT_FRAME_UNAVAILABLE_SEEKING";
-    case MediaDecoderOwner::NEXT_FRAME_UNINITIALIZED:
-      return "NEXT_FRAME_UNINITIALIZED";
-  }
-  return "UNKNOWN";
-}
-
-void
-MediaDecoderStateMachine::UpdateNextFrameStatus(NextFrameStatus aStatus)
-{
-  MOZ_ASSERT(OnTaskQueue());
-  if (aStatus != mNextFrameStatus) {
-    LOG("Changed mNextFrameStatus to %s", ToStr(aStatus));
-    mNextFrameStatus = aStatus;
-  }
-}
-
 void
 MediaDecoderStateMachine::ScheduleStateMachine()
 {
   MOZ_ASSERT(OnTaskQueue());
   if (mDispatchedStateMachine) {
     return;
   }
   mDispatchedStateMachine = true;
--- a/dom/media/MediaDecoderStateMachine.h
+++ b/dom/media/MediaDecoderStateMachine.h
@@ -247,16 +247,19 @@ public:
   MediaEventSource<MediaEventType>&
   OnPlaybackEvent() { return mOnPlaybackEvent; }
   MediaEventSource<MediaResult>&
   OnPlaybackErrorEvent() { return mOnPlaybackErrorEvent; }
 
   MediaEventSource<DecoderDoctorEvent>&
   OnDecoderDoctorEvent() { return mOnDecoderDoctorEvent; }
 
+  MediaEventSource<NextFrameStatus>&
+  OnNextFrameStatus() { return mOnNextFrameStatus; }
+
   size_t SizeOfVideoQueue() const;
 
   size_t SizeOfAudioQueue() const;
 
   // Sets the video decode mode. Used by the suspend-video-decoder feature.
   void SetVideoDecodeMode(VideoDecodeMode aMode);
 
 private:
@@ -270,17 +273,16 @@ private:
   class NextFrameSeekingState;
   class NextFrameSeekingFromDormantState;
   class VideoOnlySeekingState;
   class BufferingState;
   class CompletedState;
   class ShutdownState;
 
   static const char* ToStateStr(State aState);
-  static const char* ToStr(NextFrameStatus aStatus);
   const char* ToStateStr();
 
   nsCString GetDebugInfo();
 
   // Functions used by assertions to ensure we're calling things
   // on the appropriate threads.
   bool OnTaskQueue() const;
 
@@ -378,18 +380,16 @@ protected:
 
 
   // Returns true if we're running low on buffered data.
   bool HasLowBufferedData();
 
   // Returns true if we have less than aThreshold of buffered data available.
   bool HasLowBufferedData(const media::TimeUnit& aThreshold);
 
-  void UpdateNextFrameStatus(NextFrameStatus aStatus);
-
   // Return the current time, either the audio clock if available (if the media
   // has audio, and the playback is possible), or a clock for the video.
   // Called on the state machine thread.
   // If aTimeStamp is non-null, set *aTimeStamp to the TimeStamp corresponding
   // to the returned stream time.
   media::TimeUnit GetClock(TimeStamp* aTimeStamp = nullptr) const;
 
   // Update only the state machine's current playback position (and duration,
@@ -656,16 +656,18 @@ private:
   MediaEventProducerExc<nsAutoPtr<MediaInfo>,
                         MediaDecoderEventVisibility> mFirstFrameLoadedEvent;
 
   MediaEventProducer<MediaEventType> mOnPlaybackEvent;
   MediaEventProducer<MediaResult> mOnPlaybackErrorEvent;
 
   MediaEventProducer<DecoderDoctorEvent> mOnDecoderDoctorEvent;
 
+  MediaEventProducer<NextFrameStatus> mOnNextFrameStatus;
+
   const bool mIsMSE;
 
 private:
   // The buffered range. Mirrored from the decoder thread.
   Mirror<media::TimeIntervals> mBuffered;
 
   // The current play state, mirrored from the main thread.
   Mirror<MediaDecoder::PlayState> mPlayState;
@@ -687,20 +689,16 @@ private:
   // An identifier for the principal of the media. Used to track when
   // main-thread induced principal changes get reflected on MSG thread.
   Mirror<PrincipalHandle> mMediaPrincipalHandle;
 
   // Duration of the media. This is guaranteed to be non-null after we finish
   // decoding the first frame.
   Canonical<media::NullableTimeUnit> mDuration;
 
-  // The status of our next frame. Mirrored on the main thread and used to
-  // compute ready state.
-  Canonical<NextFrameStatus> mNextFrameStatus;
-
   // The time of the current frame, corresponding to the "current
   // playback position" in HTML5. This is referenced from 0, which is the initial
   // playback position.
   Canonical<media::TimeUnit> mCurrentPosition;
 
   // Current playback position in the stream in bytes.
   Canonical<int64_t> mPlaybackOffset;
 
@@ -709,20 +707,16 @@ private:
 
 public:
   AbstractCanonical<media::TimeIntervals>* CanonicalBuffered() const;
 
   AbstractCanonical<media::NullableTimeUnit>* CanonicalDuration()
   {
     return &mDuration;
   }
-  AbstractCanonical<NextFrameStatus>* CanonicalNextFrameStatus()
-  {
-    return &mNextFrameStatus;
-  }
   AbstractCanonical<media::TimeUnit>* CanonicalCurrentPosition()
   {
     return &mCurrentPosition;
   }
   AbstractCanonical<int64_t>* CanonicalPlaybackOffset()
   {
     return &mPlaybackOffset;
   }
--- a/dom/media/platforms/wmf/WMFDecoderModule.cpp
+++ b/dom/media/platforms/wmf/WMFDecoderModule.cpp
@@ -210,16 +210,22 @@ WMFDecoderModule::Supports(const TrackIn
   if (MP4Decoder::IsH264(aTrackInfo.mMimeType) && WMFDecoderModule::HasH264()) {
     return true;
   }
   if (aTrackInfo.mMimeType.EqualsLiteral("audio/mpeg") &&
       CanCreateWMFDecoder<CLSID_CMP3DecMediaObject>()) {
     return true;
   }
   if (MediaPrefs::PDMWMFVP9DecoderEnabled()) {
+    static const uint32_t VP8_USABLE_BUILD = 16287;
+    if (VPXDecoder::IsVP8(aTrackInfo.mMimeType) &&
+        IsWindowsBuildOrLater(VP8_USABLE_BUILD) &&
+        CanCreateWMFDecoder<CLSID_WebmMfVpxDec>()) {
+      return true;
+    }
     if (VPXDecoder::IsVP9(aTrackInfo.mMimeType) &&
         ((gfxPrefs::PDMWMFAMDVP9DecoderEnabled() &&
           CanCreateWMFDecoder<CLSID_AMDWebmMfVp9Dec>()) ||
          CanCreateWMFDecoder<CLSID_WebmMfVpxDec>())) {
       return true;
     }
   }
 
old mode 100644
new mode 100755
--- a/dom/media/platforms/wmf/WMFVideoMFTManager.cpp
+++ b/dom/media/platforms/wmf/WMFVideoMFTManager.cpp
@@ -168,18 +168,18 @@ WMFVideoMFTManager::WMFVideoMFTManager(
   layers::KnowsCompositor* aKnowsCompositor,
   layers::ImageContainer* aImageContainer,
   float aFramerate,
   bool aDXVAEnabled)
   : mVideoInfo(aConfig)
   , mImageSize(aConfig.mImage)
   , mVideoStride(0)
   , mImageContainer(aImageContainer)
+  , mKnowsCompositor(aKnowsCompositor)
   , mDXVAEnabled(aDXVAEnabled)
-  , mKnowsCompositor(aKnowsCompositor)
   , mAMDVP9InUse(false)
   , mFramerate(aFramerate)
   // mVideoStride, mVideoWidth, mVideoHeight, mUseHwAccel are initialized in
   // Init().
 {
   MOZ_COUNT_CTOR(WMFVideoMFTManager);
 
   // Need additional checks/params to check vp8/vp9
old mode 100644
new mode 100755
--- a/dom/plugins/ipc/PluginModuleChild.cpp
+++ b/dom/plugins/ipc/PluginModuleChild.cpp
@@ -1970,19 +1970,19 @@ class GetKeyStateTask : public Runnable
 {
     SHORT* mKeyState;
     int mVirtKey;
     HANDLE mSemaphore;
 
 public:
     explicit GetKeyStateTask(int aVirtKey, HANDLE aSemaphore, SHORT* aKeyState) :
         Runnable("GetKeyStateTask"),
+        mKeyState(aKeyState),
         mVirtKey(aVirtKey),
-        mSemaphore(aSemaphore),
-        mKeyState(aKeyState)
+        mSemaphore(aSemaphore)
     {}
 
     NS_IMETHOD Run() override
     {
         PLUGIN_LOG_DEBUG_METHOD;
         AssertPluginThread();
         *mKeyState = PMCGetKeyState(mVirtKey);
         if (!ReleaseSemaphore(mSemaphore, 1, nullptr)) {
@@ -2044,18 +2044,20 @@ class PluginThreadTask : public Runnable
 {
     bool mSuccess;
     PluginThreadTaskData* mTaskData;
     HANDLE mSemaphore;
 
 public:
     explicit PluginThreadTask(PluginThreadTaskData* aTaskData,
                               HANDLE aSemaphore) :
-        Runnable("PluginThreadTask"), mTaskData(aTaskData),
-        mSemaphore(aSemaphore), mSuccess(false)
+        Runnable("PluginThreadTask"),
+        mSuccess(false),
+        mTaskData(aTaskData),
+        mSemaphore(aSemaphore)
     {}
 
     NS_IMETHOD Run() override
     {
         PLUGIN_LOG_DEBUG_METHOD;
         AssertPluginThread();
         mSuccess = mTaskData->RunTask();
         if (!ReleaseSemaphore(mSemaphore, 1, nullptr)) {
--- a/dom/plugins/ipc/PluginUtilsWin.cpp
+++ b/dom/plugins/ipc/PluginUtilsWin.cpp
@@ -44,18 +44,18 @@ protected:
   NPAudioDeviceChangeDetailsIPC mChangeDetails;
   const PluginModuleSet* mAudioNotificationSet;
 };
 
 class AudioNotification final : public IMMNotificationClient
 {
 public:
   AudioNotification() :
-      mRefCt(1)
-    , mIsRegistered(false)
+      mIsRegistered(false)
+    , mRefCt(1)
   {
     HRESULT hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),
                                   NULL, CLSCTX_INPROC_SERVER,
                                   IID_PPV_ARGS(&mDeviceEnum));
     if (FAILED(hr)) {
       mDeviceEnum = nullptr;
       return;
     }
old mode 100644
new mode 100755
--- a/gfx/webrender_bindings/RenderD3D11TextureHostOGL.cpp
+++ b/gfx/webrender_bindings/RenderD3D11TextureHostOGL.cpp
@@ -35,19 +35,19 @@ GetEGLTextureFormat(gfx::SurfaceFormat a
       return LOCAL_EGL_TEXTURE_RGBA;
   }
 }
 
 RenderDXGITextureHostOGL::RenderDXGITextureHostOGL(WindowsHandle aHandle,
                                                    gfx::SurfaceFormat aFormat,
                                                    gfx::IntSize aSize)
   : mHandle(aHandle)
-  , mTextureHandle{0}
   , mSurface(0)
   , mStream(0)
+  , mTextureHandle{0}
   , mFormat(aFormat)
   , mSize(aSize)
   , mLocked(false)
 {
   MOZ_COUNT_CTOR_INHERITED(RenderDXGITextureHostOGL, RenderTextureHostOGL);
   MOZ_ASSERT(mFormat != gfx::SurfaceFormat::NV12 ||
              (mSize.width % 2 == 0 && mSize.height % 2 == 0));
 }
--- a/layout/base/ServoRestyleManager.cpp
+++ b/layout/base/ServoRestyleManager.cpp
@@ -76,17 +76,20 @@ ExpectedOwnerForChild(const nsIFrame& aF
     // So we don't want to end up in the code below, which steps out of anon
     // boxes.  Just return the parent of the line frame, which is the block.
     return parent;
   }
 
   if (aFrame.IsLetterFrame()) {
     // Ditto for ::first-letter. A first-letter always arrives here via its
     // direct parent, except when it's parented to a ::first-line.
-    return parent->IsLineFrame() ? parent->GetParent() : parent;
+    if (parent->IsLineFrame()) {
+      parent = parent->GetParent();
+    }
+    return FirstContinuationOrPartOfIBSplit(parent);
   }
 
   if (parent->IsLetterFrame()) {
     // Things never have ::first-letter as their expected parent.  Go
     // on up to the ::first-letter's parent.
     parent = parent->GetParent();
   }
 
new file mode 100644
--- /dev/null
+++ b/layout/base/crashtests/1406562.html
@@ -0,0 +1,15 @@
+<style>
+.class5 { columns: 0px; }
+li::first-letter { color: red; }
+.class5 { list-style-position: inside; }
+</style>
+<script>
+function jsfuzzer() {
+  htmlvar00001.appendChild(htmlvar00027);
+}
+</script>
+<body onload=jsfuzzer()>
+<a id="htmlvar00001">
+<ul class="class5">
+<li>`</li>
+<li id="htmlvar00027">
--- a/layout/base/crashtests/crashtests.list
+++ b/layout/base/crashtests/crashtests.list
@@ -490,20 +490,21 @@ load 1308848-2.html
 load 1338772-1.html
 load 1343937.html
 asserts(0-1) load 1343606.html # bug 1343948
 load 1352380.html
 load 1362423-1.html
 load 1381323.html
 asserts-if(!stylo,1) load 1388625-1.html # bug 1389286
 load 1390389.html
+load 1391736.html
 load 1395591-1.html
 load 1395715-1.html
 load 1397398-1.html
 load 1397398-2.html
 load 1397398-3.html
 load 1398500.html
 load 1400438-1.html
 load 1400599-1.html
 load 1401739.html
 load 1401840.html
 load 1402476.html
-load 1391736.html
+load 1406562.html
--- a/layout/base/nsLayoutUtils.cpp
+++ b/layout/base/nsLayoutUtils.cpp
@@ -122,16 +122,17 @@
 #include "mozilla/StyleSetHandleInlines.h"
 #include "RegionBuilder.h"
 #include "SVGSVGElement.h"
 #include "DisplayItemClip.h"
 #include "mozilla/layers/WebRenderLayerManager.h"
 #include "prenv.h"
 #include "TextDrawTarget.h"
 #include "nsDeckFrame.h"
+#include "nsIEffectiveTLDService.h" // for IsInStyloBlocklist
 
 #ifdef MOZ_XUL
 #include "nsXULPopupManager.h"
 #endif
 
 #include "GeckoProfiler.h"
 #include "nsAnimationManager.h"
 #include "nsTransitionManager.h"
@@ -187,16 +188,18 @@ typedef nsStyleTransformMatrix::Transfor
 /* static */ uint32_t nsLayoutUtils::sZoomMaxPercent;
 /* static */ uint32_t nsLayoutUtils::sZoomMinPercent;
 /* static */ bool nsLayoutUtils::sInvalidationDebuggingIsEnabled;
 /* static */ bool nsLayoutUtils::sInterruptibleReflowEnabled;
 /* static */ bool nsLayoutUtils::sSVGTransformBoxEnabled;
 /* static */ bool nsLayoutUtils::sTextCombineUprightDigitsEnabled;
 #ifdef MOZ_STYLO
 /* static */ bool nsLayoutUtils::sStyloEnabled;
+/* static */ bool nsLayoutUtils::sStyloBlocklistEnabled;
+/* static */ nsTArray<nsCString>* nsLayoutUtils::sStyloBlocklist = nullptr;
 #endif
 /* static */ uint32_t nsLayoutUtils::sIdlePeriodDeadlineLimit;
 /* static */ uint32_t nsLayoutUtils::sQuiescentFramesBeforeIdlePeriod;
 
 static ViewID sScrollIdCounter = FrameMetrics::START_SCROLL_ID;
 
 typedef nsDataHashtable<nsUint64HashKey, nsIContent*> ContentMap;
 static ContentMap* sContentMap = nullptr;
@@ -7966,16 +7969,34 @@ nsLayoutUtils::Initialize()
   if (PR_GetEnv("STYLO_FORCE_ENABLED")) {
     sStyloEnabled = true;
   } else if (PR_GetEnv("STYLO_FORCE_DISABLED")) {
     sStyloEnabled = false;
   } else {
     Preferences::AddBoolVarCache(&sStyloEnabled,
                                  "layout.css.servo.enabled");
   }
+  // We should only create the blocklist ONCE, and ignore any blocklist
+  // reloads happen. Because otherwise we could have a top level page that
+  // uses Stylo (if its load happens before the blocklist reload) and a
+  // child iframe that uses Gecko (if its load happens after the blocklist
+  // reload). If some page contains both backends, and they try to move
+  // element across backend boundary, it could crash (see bug 1404020).
+  sStyloBlocklistEnabled =
+    Preferences::GetBool("layout.css.stylo-blocklist.enabled");
+  if (sStyloBlocklistEnabled && !sStyloBlocklist) {
+    nsAutoCString blocklist;
+    Preferences::GetCString("layout.css.stylo-blocklist.blocked_domains", blocklist);
+    if (!blocklist.IsEmpty()) {
+      sStyloBlocklist = new nsTArray<nsCString>;
+      for (const nsACString& domainString : blocklist.Split(',')) {
+        sStyloBlocklist->AppendElement(domainString);
+      }
+    }
+  }
 #endif
   Preferences::AddUintVarCache(&sIdlePeriodDeadlineLimit,
                                "layout.idle_period.time_limit",
                                DEFAULT_IDLE_PERIOD_TIME_LIMIT);
   Preferences::AddUintVarCache(&sQuiescentFramesBeforeIdlePeriod,
                                "layout.idle_period.required_quiescent_frames",
                                DEFAULT_QUIESCENT_FRAMES);
 
@@ -7988,26 +8009,91 @@ nsLayoutUtils::Initialize()
 /* static */
 void
 nsLayoutUtils::Shutdown()
 {
   if (sContentMap) {
     delete sContentMap;
     sContentMap = nullptr;
   }
-
+#ifdef MOZ_STYLO
+  if (sStyloBlocklist) {
+    sStyloBlocklist->Clear();
+    delete sStyloBlocklist;
+    sStyloBlocklist = nullptr;
+  }
+#endif
   for (auto& callback : kPrefCallbacks) {
     Preferences::UnregisterCallback(callback.func, callback.name);
   }
   nsComputedDOMStyle::UnregisterPrefChangeCallbacks();
 
   // so the cached initial quotes array doesn't appear to be a leak
   nsStyleList::Shutdown();
 }
 
+#ifdef MOZ_STYLO
+/* static */
+bool
+nsLayoutUtils::IsInStyloBlocklist(nsIPrincipal* aPrincipal)
+{
+  if (!sStyloBlocklist) {
+    return false;
+  }
+
+  // Note that a non-codebase principal (eg the system principal) will return
+  // a null URI.
+  nsCOMPtr<nsIURI> codebaseURI;
+  aPrincipal->GetURI(getter_AddRefs(codebaseURI));
+  if (!codebaseURI) {
+    return false;
+  }
+
+  nsCOMPtr<nsIEffectiveTLDService> tldService =
+    do_GetService(NS_EFFECTIVETLDSERVICE_CONTRACTID);
+  NS_ENSURE_TRUE(tldService, false);
+
+  // Check if a document's eTLD+1 domain belongs to one of the stylo blocklist.
+  nsAutoCString baseDomain;
+  NS_SUCCEEDED(tldService->GetBaseDomain(codebaseURI, 0, baseDomain));
+  for (const nsCString& domains : *sStyloBlocklist) {
+    if (baseDomain.Equals(domains)) {
+      return true;
+    }
+  }
+  return false;
+}
+
+/* static */
+void
+nsLayoutUtils::AddToStyloBlocklist(const nsACString& aBlockedDomain)
+{
+  if (!sStyloBlocklist) {
+    sStyloBlocklist = new nsTArray<nsCString>;
+  }
+  sStyloBlocklist->AppendElement(aBlockedDomain);
+}
+
+/* static */
+void
+nsLayoutUtils::RemoveFromStyloBlocklist(const nsACString& aBlockedDomain)
+{
+  if (!sStyloBlocklist) {
+    return;
+  }
+
+  sStyloBlocklist->RemoveElement(aBlockedDomain);
+
+  if (sStyloBlocklist->IsEmpty()) {
+    delete sStyloBlocklist;
+    sStyloBlocklist = nullptr;
+  }
+}
+#endif
+
 /* static */
 void
 nsLayoutUtils::RegisterImageRequest(nsPresContext* aPresContext,
                                     imgIRequest* aRequest,
                                     bool* aRequestRegistered)
 {
   if (!aPresContext) {
     return;
--- a/layout/base/nsLayoutUtils.h
+++ b/layout/base/nsLayoutUtils.h
@@ -2553,16 +2553,41 @@ public:
    */
   static bool InvalidationDebuggingIsEnabled() {
     return sInvalidationDebuggingIsEnabled || getenv("MOZ_DUMP_INVALIDATION") != 0;
   }
 
   static void Initialize();
   static void Shutdown();
 
+#ifdef MOZ_STYLO
+  /**
+   * Principal-based blocklist for stylo.
+   * Check if aPrincipal is blocked by stylo's blocklist and should fallback to
+   * use Gecko's style backend. Note that using a document's principal rather
+   * than the document URI will let us piggy-back off the existing principal
+   * relationships and symmetries.
+   */
+  static bool IsInStyloBlocklist(nsIPrincipal* aPrincipal);
+
+  /**
+   * Add aBlockedDomain to the existing stylo blocklist, i.e., sStyloBlocklist.
+   * This function is exposed to nsDOMWindowUtils and only for testing purpose.
+   * So, NEVER use this in any other cases.
+   */
+  static void AddToStyloBlocklist(const nsACString& aBlockedDomain);
+
+  /**
+   * Remove aBlockedDomain from the existing stylo blocklist, i.e., sStyloBlocklist.
+   * This function is exposed to nsDOMWindowUtils and only for testing purpose.
+   * So, NEVER use this in any other cases.
+   */
+  static void RemoveFromStyloBlocklist(const nsACString& aBlockedDomain);
+#endif
+
   /**
    * Register an imgIRequest object with a refresh driver.
    *
    * @param aPresContext The nsPresContext whose refresh driver we want to
    *        register with.
    * @param aRequest A pointer to the imgIRequest object which the client wants
    *        to register with the refresh driver.
    * @param aRequestRegistered A pointer to a boolean value which indicates
@@ -3020,16 +3045,18 @@ private:
   static uint32_t sZoomMaxPercent;
   static uint32_t sZoomMinPercent;
   static bool sInvalidationDebuggingIsEnabled;
   static bool sInterruptibleReflowEnabled;
   static bool sSVGTransformBoxEnabled;
   static bool sTextCombineUprightDigitsEnabled;
 #ifdef MOZ_STYLO
   static bool sStyloEnabled;
+  static bool sStyloBlocklistEnabled;
+  static nsTArray<nsCString>* sStyloBlocklist;
 #endif
   static uint32_t sIdlePeriodDeadlineLimit;
   static uint32_t sQuiescentFramesBeforeIdlePeriod;
 
   /**
    * Helper function for LogTestDataForPaint().
    */
   static void DoLogTestDataForPaint(mozilla::layers::LayerManager* aManager,
--- a/layout/style/test/mochitest.ini
+++ b/layout/style/test/mochitest.ini
@@ -288,16 +288,25 @@ skip-if = toolkit == 'android' #bug 7752
 [test_specified_value_serialization.html]
 [test_style_attr_listener.html]
 [test_style_attribute_quirks.html]
 [test_style_attribute_standards.html]
 [test_style_struct_copy_constructors.html]
 [test_stylesheet_additions.html]
 skip-if = !stylo
 [test_stylesheet_clone_font_face.html]
+[test_stylo_blocklist-01.html]
+support-files = stylo_blocked_domain_page.html
+skip-if = !stylo # no need to test blocklist for non-stylo platforms
+[test_stylo_blocklist-02.html]
+support-files = stylo_blocked_domain_page.html
+skip-if = !stylo # no need to test blocklist for non-stylo platforms
+[test_stylo_blocklist-03.html]
+support-files = stylo_non_blocked_domain_page.html
+skip-if = !stylo # no need to test blocklist for non-stylo platforms
 [test_supports_rules.html]
 [test_system_font_serialization.html]
 [test_text_decoration_shorthands.html]
 [test_transitions_and_reframes.html]
 [test_transitions_and_restyles.html]
 [test_transitions_and_zoom.html]
 [test_transitions_at_start.html]
 [test_transitions_cancel_near_end.html]
new file mode 100644
--- /dev/null
+++ b/layout/style/test/stylo_blocked_domain_page.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<head>
+  <title>Test page with a mock domain which is listed in the stylo blocklist</title>
+</head>
+<script>
+window.onload = function() {
+  if (SpecialPowers.getDOMWindowUtils(window).isStyledByServo == false) {
+    opener.postMessage("TEST-PASS", "*");
+  } else {
+    opener.postMessage("TEST-FAIL", "*");
+  }
+}
+</script>
new file mode 100644
--- /dev/null
+++ b/layout/style/test/stylo_non_blocked_domain_page.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<head>
+  <title>Test page with a mock domain which is NOT listed in the stylo blocklist</title>
+</head>
+<script>
+window.onload = function() {
+  if (SpecialPowers.getDOMWindowUtils(window).isStyledByServo == true) {
+    opener.postMessage("TEST-PASS", "*");
+  } else {
+    opener.postMessage("TEST-FAIL", "*");
+  }
+}
+</script>
new file mode 100644
--- /dev/null
+++ b/layout/style/test/test_stylo_blocklist-01.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Test the mechanism of stylo blocklist</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<script>
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.getDOMWindowUtils(window).addToStyloBlocklist("stylo-blocklist.com");
+let win =
+  window.open("http://stylo-blocklist.com/tests/layout/style/test/stylo_blocked_domain_page.html", "");
+window.onmessage = function (evt) {
+  is(evt.data, "TEST-PASS",
+     "Document with blocked domain should not use servo backend");
+  win.close();
+  SpecialPowers.getDOMWindowUtils(window).removeFromStyloBlocklist("stylo-blocklist.com");
+  SimpleTest.finish();
+}
+</script>
+</pre>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/style/test/test_stylo_blocklist-02.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Test the mechanism of stylo blocklist</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<script>
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.getDOMWindowUtils(window).addToStyloBlocklist("stylo-blocklist.com");
+let win =
+  window.open("http://test.stylo-blocklist.com/tests/layout/style/test/stylo_blocked_domain_page.html", "");
+window.onmessage = function (evt) {
+  is(evt.data, "TEST-PASS",
+     "Document with blocked sub-domain should not use servo backend");
+  win.close();
+  SpecialPowers.getDOMWindowUtils(window).removeFromStyloBlocklist("stylo-blocklist.com");
+  SimpleTest.finish();
+}
+</script>
+</pre>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/style/test/test_stylo_blocklist-03.html
@@ -0,0 +1,25 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <title>Test the mechanism of stylo blocklist</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<script>
+SimpleTest.waitForExplicitFinish();
+// "http://example.com" should not be in the blocklist by any chance. Adding this
+// line is just for safety, and it also makes this test more readable.
+SpecialPowers.getDOMWindowUtils(window).removeFromStyloBlocklist("example.com");
+let win =
+  window.open("http://example.com/tests/layout/style/test/stylo_non_blocked_domain_page.html", "");
+window.onmessage = function (evt) {
+  is(evt.data, "TEST-PASS",
+     "Document without blocked domain should use servo backend");
+  win.close();
+  SimpleTest.finish();
+}
+</script>
+</pre>
+</body>
+</html>
old mode 100644
new mode 100755
--- a/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp
+++ b/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp
@@ -305,16 +305,18 @@ PeerConnectionImpl::PeerConnectionImpl(c
   , mCertificate(nullptr)
   , mPrivacyRequested(false)
   , mSTSThread(nullptr)
   , mAllowIceLoopback(false)
   , mAllowIceLinkLocal(false)
   , mForceIceTcp(false)
   , mMedia(nullptr)
   , mUuidGen(MakeUnique<PCUuidGenerator>())
+  , mIceRestartCount(0)
+  , mIceRollbackCount(0)
   , mHaveConfiguredCodecs(false)
   , mHaveDataStream(false)
   , mAddCandidateErrorCount(0)
   , mTrickle(true) // TODO(ekr@rtfm.com): Use pref
   , mNegotiationNeeded(false)
   , mPrivateWindow(false)
   , mActiveOnWindow(false)
   , mPacketDumpEnabled(false)
@@ -1684,27 +1686,29 @@ PeerConnectionImpl::RollbackIceRestart()
   if (NS_FAILED(nrv)) {
     CSFLogError(logTag, "%s: Couldn't set ICE credentials, res=%u",
                          __FUNCTION__,
                          static_cast<unsigned>(nrv));
     return nrv;
   }
   mPreviousIceUfrag = "";
   mPreviousIcePwd = "";
+  ++mIceRollbackCount;
 
   return NS_OK;
 }
 
 void
 PeerConnectionImpl::FinalizeIceRestart()
 {
   mMedia->FinalizeIceRestart();
   // clear the previous ice creds since they are no longer needed
   mPreviousIceUfrag = "";
   mPreviousIcePwd = "";
+  ++mIceRestartCount;
 }
 
 NS_IMETHODIMP
 PeerConnectionImpl::SetLocalDescription(int32_t aAction, const char* aSDP)
 {
   PC_AUTO_ENTER_API_CALL(true);
 
   if (!aSDP) {
@@ -3673,16 +3677,18 @@ PeerConnectionImpl::BuildStatsQuery_m(
 
   // We do not use the pcHandle here, since that's risky to expose to content.
   query->report = new RTCStatsReportInternalConstruct(
       NS_ConvertASCIItoUTF16(mName.c_str()),
       query->now);
 
   query->iceStartTime = mIceStartTime;
   query->failed = isFailed(mIceConnectionState);
+  query->report->mIceRestarts.Construct(mIceRestartCount);
+  query->report->mIceRollbacks.Construct(mIceRollbackCount);
 
   // Populate SDP on main
   if (query->internalStats) {
     if (mJsepSession) {
       // TODO we probably should report Current and Pending SDPs here
       // separately. Plus the raw SDP we got from JS (mLocalRequestedSDP).
       // And if it's the offer or answer would also be nice.
       std::string localDescription = mJsepSession->GetLocalDescription(
--- a/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.h
+++ b/media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.h
@@ -792,16 +792,18 @@ private:
   bool mForceIceTcp;
   RefPtr<PeerConnectionMedia> mMedia;
 
   // The JSEP negotiation session.
   mozilla::UniquePtr<PCUuidGenerator> mUuidGen;
   mozilla::UniquePtr<mozilla::JsepSession> mJsepSession;
   std::string mPreviousIceUfrag; // used during rollback of ice restart
   std::string mPreviousIcePwd; // used during rollback of ice restart
+  unsigned long mIceRestartCount;
+  unsigned long mIceRollbackCount;
 
   // Start time of ICE, used for telemetry
   mozilla::TimeStamp mIceStartTime;
   // Start time of call used for Telemetry
   mozilla::TimeStamp mStartTime;
 
   bool mHaveConfiguredCodecs;
 
--- a/mobile/android/app/src/main/res/layout/bookmark_edit_with_full_page.xml
+++ b/mobile/android/app/src/main/res/layout/bookmark_edit_with_full_page.xml
@@ -62,17 +62,17 @@
 
             <EditText
                 android:id="@+id/edit_bookmark_location"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:ellipsize="end"
                 android:gravity="start"
                 android:hint="@string/bookmark_edit_location"
-                android:inputType="textNoSuggestions"
+                android:inputType="textUri"
                 android:maxLines="1"
                 android:singleLine="true"
                 android:textColor="@color/text_and_tabs_tray_grey"
                 android:textSize="18sp" />
         </android.support.design.widget.TextInputLayout>
 
         <android.support.design.widget.TextInputLayout
             android:layout_width="match_parent"
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -5791,16 +5791,18 @@ pref("dom.webkitBlink.dirPicker.enabled"
 pref("dom.webkitBlink.filesystem.enabled", true);
 #endif
 
 pref("media.block-autoplay-until-in-foreground", true);
 
 // Is Stylo CSS support built and enabled?
 // Only define this pref if Stylo support is actually built in.
 #ifdef MOZ_STYLO
+pref("layout.css.stylo-blocklist.enabled", true);
+pref("layout.css.stylo-blocklist.blocked_domains", "");
 #ifdef MOZ_STYLO_ENABLE
 pref("layout.css.servo.enabled", true);
 #else
 pref("layout.css.servo.enabled", false);
 #endif
 #endif
 
 // HSTS Priming
--- a/parser/html/nsHtml5String.cpp
+++ b/parser/html/nsHtml5String.cpp
@@ -47,19 +47,22 @@ nsHtml5String::EqualsASCII(const char* a
 
 bool
 nsHtml5String::LowerCaseStartsWithASCII(const char* aLowerCaseLiteral) const
 {
   const char* litPtr = aLowerCaseLiteral;
   const char16_t* strPtr = AsPtr();
   const char16_t* end = strPtr + Length();
   char16_t litChar;
-  while ((litChar = *litPtr) && (strPtr != end)) {
+  while ((litChar = *litPtr)) {
     MOZ_ASSERT(!(litChar >= 'A' && litChar <= 'Z'),
                "Literal isn't in lower case.");
+    if (strPtr == end) {
+      return false;
+    }
     char16_t strChar = *strPtr;
     if (strChar >= 'A' && strChar <= 'Z') {
       strChar += 0x20;
     }
     if (litChar != strChar) {
       return false;
     }
     ++litPtr;
--- a/security/manager/ssl/StaticHPKPins.h
+++ b/security/manager/ssl/StaticHPKPins.h
@@ -1135,9 +1135,9 @@ static const TransportSecurityPreload kP
   { "za.search.yahoo.com", false, true, false, -1, &kPinset_yahoo },
   { "zh.search.yahoo.com", false, true, false, -1, &kPinset_yahoo },
 };
 
 // Pinning Preload List Length = 479;
 
 static const int32_t kUnknownId = -1;
 
-static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1515995399924000);
+static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1516038167454000);
--- a/security/manager/ssl/nsSTSPreloadList.errors
+++ b/security/manager/ssl/nsSTSPreloadList.errors
@@ -4,238 +4,219 @@ 360live.fr: could not connect to host
 47tech.com: could not connect to host
 4loc.us: could not connect to host
 4x4.lk: could not connect to host
 724go.com: could not connect to host
 8560.be: could not connect to host
 8887999.com: could not connect to host
 91-freedom.com: could not connect to host
 aamwa.com: could not connect to host
-abcdef.be: could not connect to host
 abolition.co: could not connect to host
 acrossgw.com: could not connect to host
 aevpn.org: could not connect to host
 aivd.lol: could not connect to host
 akul.co.in: could not connect to host
+alexandros.io: could not connect to host
+alltubedownload.net: could not connect to host
 altestore.com: could not connect to host
 amua.fr: could not connect to host
 annetaan.fi: could not connect to host
 arent.kz: could not connect to host
 arox.eu: could not connect to host
 assdecoeur.org: could not connect to host
 astral.gq: could not connect to host
-avi9526.pp.ua: could not connect to host
 aviv.nyc: could not connect to host
 azabani.com: could not connect to host
 backschues.com: could not connect to host
 backschues.net: could not connect to host
 balonmano.co: could not connect to host
 bbdos.ru: could not connect to host
 beamitapp.com: could not connect to host
 berna.fr: could not connect to host
 bianinapiccanovias.com: could not connect to host
 bilder-designs.de: could not connect to host
-binsp.net: could not connect to host
 bip.gov.sa: could not connect to host
 black-khat.com: could not connect to host
 blumen-garage.de: could not connect to host
 brettabel.com: could not connect to host
-brooke-fan.com: could not connect to host
 buyshoe.org: could not connect to host
 by1898.com: could not connect to host
 cais.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 119"  data: no]
 cake-time.co.uk: could not connect to host
 capekeen.com: could not connect to host
-capellidipremoli.com: could not connect to host
 casperpanel.com: could not connect to host
-cbdev.de: could not connect to host
 chattergalerie.eu: could not connect to host
 chattergallery.com: could not connect to host
-chez-janine.de: could not connect to host
 chloehorler.com: could not connect to host
 chonghe.org: could not connect to host
 christina-quast.de: could not connect to host
 cielly.com: could not connect to host
-cigoteket.se: could not connect to host
 cirfi.com: could not connect to host
 clearviewwealthprojector.com.au: could not connect to host
 cloudbased.info: could not connect to host
 cloudbleed.info: could not connect to host
 cmpr.es: could not connect to host
 cnlic.com: could not connect to host
 colleencornez.com: could not connect to host
 cosirex.com: could not connect to host
 cpaneltips.com: could not connect to host
 csgo77.com: could not connect to host
-customerbox.ir: could not connect to host
 cyberxpert.nl: could not connect to host
 cypherpunk.ws: could not connect to host
 czlx.co: could not connect to host
-d-bood.site: could not connect to host
 dahlberg.cologne: could not connect to host
+danielalvarez.net: could not connect to host
+danonsecurity.com: could not connect to host
 datorb.com: could not connect to host
+dawnson.is: could not connect to host
 dcc.moe: could not connect to host
 de-servers.de: could not connect to host
 decoyrouting.com: could not connect to host
 derivativeshub.pro: could not connect to host
 deutschland-dsl.de: could not connect to host
 dev-talk.eu: could not connect to host
 digioccumss.ddns.net: could not connect to host
 dijks.com: could not connect to host
 dingcc.xyz: could not connect to host
 disco-crazy-world.de: could not connect to host
 dkravchenko.su: could not connect to host
 donotspellitgav.in: could not connect to host
-dopply.com: could not connect to host
 dreizwosechs.de: could not connect to host
 drkmtrx.xyz: could not connect to host
-drlazarina.net: could not connect to host
 duch.cloud: could not connect to host
+duelsow.eu: could not connect to host
 duo.money: could not connect to host
+dutchweballiance.nl: could not connect to host
 dyeager.org: could not connect to host
+economy.st: could not connect to host
 ectora.com: could not connect to host
 edit.yahoo.com: could not connect to host
 educatoys.com.br: could not connect to host
 ehuber.info: could not connect to host
 endlessdiy.ca: could not connect to host
 estan.cn: could not connect to host
 eurostrategy.vn.ua: could not connect to host
 evony.eu: could not connect to host
-faxite.com: could not connect to host
-fernangp.com: could not connect to host
 ficklenote.net: could not connect to host
 filhomes.ph: could not connect to host
 firebaseio.com: could not connect to host
 firexarxa.de: could not connect to host
 fixate.ru: could not connect to host
 fixmyglitch.com: could not connect to host
 fossewayflowers.co.uk: could not connect to host
 fossewayflowers.com: could not connect to host
 foxmay.co.uk: could not connect to host
-fuckav.ru: could not connect to host
 fukuko.biz: could not connect to host
-fukuoka-cityliner.jp: could not connect to host
+fukuko.xyz: could not connect to host
 fuliydys.com: could not connect to host
 funfunmstdn.tokyo: could not connect to host
 funideas.org: could not connect to host
 funksteckdosen24.de: could not connect to host
 fyol.pw: could not connect to host
 g4w.co: could not connect to host
 gam3rs.de: could not connect to host
 gdevpenze.ru: could not connect to host
-getcolq.com: could not connect to host
 getwarden.net: could not connect to host
 gevaulug.fr: could not connect to host
 gfoss.gr: could not connect to host
 globalgivingtime.com: could not connect to host
 gmantra.org: could not connect to host
-gongjuhao.com: could not connect to host
 google: could not connect to host
 gottfridsberg.org: could not connect to host
+gra2.com: could not connect to host
+gradsm-ci.net: could not connect to host
 gritte.net: could not connect to host
+gtdgo.com: could not connect to host
 gvt2.com: could not connect to host
 gvt3.com: could not connect to host
 happygadget.me: could not connect to host
 heijblok.com: could not connect to host
 here.ml: could not connect to host
 hg881.com: could not connect to host
 hoodoo.io: could not connect to host
 hoodoo.tech: could not connect to host
 hopesb.org: could not connect to host
 hostam.link: could not connect to host
 hukkatavara.com: could not connect to host
 ifxnet.com: could not connect to host
-im-design.com.ua: could not connect to host
+ikwilthepiratebay.org: could not connect to host
+imouyang.com: could not connect to host
 industreiler.com: could not connect to host
 industreiler.com.br: could not connect to host
 inexpensivecomputers.net: could not connect to host
-injust.me: could not connect to host
 ipv6.watch: could not connect to host
 iskai.net: could not connect to host
 islief.com: could not connect to host
 isoroc-nidzica.pl: could not connect to host
 jaredfraser.com: could not connect to host
 javascriptlab.fr: could not connect to host
 jeffreymagee.com: could not connect to host
 jhburton.co.uk: could not connect to host
 jie.dance: could not connect to host
-jimmynelson.com: could not connect to host
 johnblackbourn.com: could not connect to host
 just-pools.co.za: could not connect to host
 justmy.website: could not connect to host
+kabus.org: could not connect to host
 kamikaichimaru.com: could not connect to host
 kapo.info: could not connect to host
-kappit.dk: could not connect to host
 kenrogers.co: could not connect to host
-kevinmeijer.nl: could not connect to host
 kieranweightman.me: could not connect to host
 knapp.noip.me: could not connect to host
-knep.me: could not connect to host
 kostya.net: could not connect to host
 kousaku.jp: could not connect to host
 kozmik.co: could not connect to host
 kteen.info: could not connect to host
+kuoruan.com: could not connect to host
 lacasa.fr: could not connect to host
 lathamlabs.com: could not connect to host
 lathamlabs.net: could not connect to host
 lathamlabs.org: could not connect to host
 lcht.ch: could not connect to host
 legitaxi.com: could not connect to host
 leninalbertop.com.ve: could not connect to host
 lezdomsm.com: could not connect to host
 lheinrich.org: could not connect to host
 libscode.com: could not connect to host
 linksanitizer.com: could not connect to host
+lipex.com: could not connect to host
 littleservice.cn: could not connect to host
 livnev.me: could not connect to host
 logcat.info: could not connect to host
 logimagine.com: could not connect to host
 luav.org: could not connect to host
-lukas-oppermann.de: could not connect to host
-lukasoppermann.com: could not connect to host
-lukasoppermann.de: could not connect to host
 lunix.io: could not connect to host
-maartenterpstra.xyz: could not connect to host
 macedopesca.com.br: could not connect to host
-markprof.ru: could not connect to host
 martin-mattel.com: could not connect to host
 martinrogalla.com: could not connect to host
-mastodon.top: could not connect to host
 mattferderer.com: could not connect to host
 mc-team.org: could not connect to host
 mcdanieldevelopmentservices.com: could not connect to host
 mcea-hld.jp: could not connect to host
 mchopkins.net: could not connect to host
-mesvt.com: could not connect to host
 metachris.com: could not connect to host
 mingy.ddns.net: could not connect to host
 mmstick.tk: could not connect to host
 modded-minecraft-server-list.com: could not connect to host
-moderntld.net: could not connect to host
 montage-kaika.de: could not connect to host
 mosaique-lachenaie.fr: could not connect to host
-muahahahaha.co.uk: could not connect to host
-muga.space: could not connect to host
 muh.io: could not connect to host
 muj-svet.cz: could not connect to host
 multimedia-pool.com: could not connect to host
 munduch.cz: could not connect to host
-myday.eu.com: could not connect to host
 navdeep.ca: could not connect to host
-nba2k.cn: could not connect to host
-nba2k.com.cn: could not connect to host
-nbalive.cn: could not connect to host
 ncdesigns-studio.com: could not connect to host
 necesitodinero.org: could not connect to host
+nedcf.org.uk: could not connect to host
 negai.moe: could not connect to host
 nevolution.me: could not connect to host
 nginxyii.tk: could not connect to host
-nicic.gov: could not connect to host
 nikolasbradshaw.com: could not connect to host
+nnote.net: could not connect to host
 nostraspace.com: could not connect to host
+noxlogic.nl: could not connect to host
 nqesh.com: could not connect to host
 nsbfalconacademy.org: could not connect to host
 nup.pw: could not connect to host
 oliverspringer.eu: could not connect to host
 onewebdev.info: could not connect to host
 onstud.com: could not connect to host
 opengg.me: could not connect to host
 optimist.bg: could not connect to host
@@ -254,104 +235,100 @@ persjrp.ca: could not connect to host
 persoform.ch: could not connect to host
 picallo.es: could not connect to host
 pkov.cz: could not connect to host
 plaasprodukte.com: could not connect to host
 polit.im: could not connect to host
 poolinstallers.co.za: could not connect to host
 pouets.ovh: could not connect to host
 projectasterk.com: could not connect to host
-projectunity.io: could not connect to host
 proxydesk.eu: could not connect to host
+psylab.cc: could not connect to host
+psylab.vip: could not connect to host
+pythia.nz: could not connect to host
 qionouu.cn: could not connect to host
 qto.net: could not connect to host
 quantumfurball.net: could not connect to host
 rainbin.com: could not connect to host
 real-compare.com: could not connect to host
+refactor.zone: could not connect to host
 reignsphere.net: could not connect to host
 reinaertvandecruys.me: could not connect to host
-rezexpert.com: could not connect to host
-rfeif.org: could not connect to host
 rolodato.com: could not connect to host
 sallysubs.com: could not connect to host
 sanatrans.com: could not connect to host
-santojuken.co.jp: could not connect to host
 sarndipity.com: could not connect to host
 schlachter.ca: could not connect to host
 security201.co.uk: could not connect to host
 securitymap.wiki: could not connect to host
 semantheme.fr: could not connect to host
 shadowplus.net: could not connect to host
 shadowrocket.net: could not connect to host
+sharekey.com: could not connect to host
 sharevari.com: could not connect to host
 shavingks.com: could not connect to host
 shirakaba-cc.com: could not connect to host
 simbolo.co.uk: could not connect to host
 simonkjellberg.com: could not connect to host
-simphony.cz: could not connect to host
 simplerses.com: could not connect to host
 slaughterhouse.fr: could not connect to host
 socialworkout.com: could not connect to host
 socialworkout.net: could not connect to host
 socialworkout.org: could not connect to host
 socialworkout.tv: could not connect to host
-sotiran.com: could not connect to host
+sonic.sk: could not connect to host
 soubriquet.org: could not connect to host
 soulema.com: could not connect to host
 spicywombat.com: could not connect to host
 sputnik1net.org: could not connect to host
 sss3s.com: could not connect to host
+stadionmanager.com: could not connect to host
 stitthappens.com: could not connect to host
 stytt.com: could not connect to host
 surdam.casa: could not connect to host
 sviz.pro: could not connect to host
 taberu-fujitsubo.com: could not connect to host
 taidu.news: could not connect to host
 taskotron.stg.fedoraproject.org: could not connect to host
-tcpweb.net: could not connect to host
 tech-blog.fr: could not connect to host
+techademy.nl: could not connect to host
 tenispopular.com: could not connect to host
 terminalvelocity.co.nz: could not connect to host
 thesehighsandlows.com: could not connect to host
 thinkcash.nl: could not connect to host
 tiliaze.info: could not connect to host
 tiliaze.net: could not connect to host
 totch.de: could not connect to host
 totot.net: could not connect to host
 transcendmotor.sg: could not connect to host
-trekfriend.com: could not connect to host
 turn-sticks.com: could not connect to host
-underskatten.tk: could not connect to host
-unicorncloud.org: could not connect to host
-vea.re: could not connect to host
+uptimed.com: could not connect to host
 venmos.com: could not connect to host
 viditut.com: could not connect to host
 vilog.me: could not connect to host
 visionless.me: could not connect to host
 vitapingu.de: could not connect to host
 vmgirls.com: could not connect to host
-vocalviews.com: could not connect to host
 waffle.at: could not connect to host
-warlions.info: could not connect to host
+watchinventory.com: could not connect to host
 watchweasel.com: could not connect to host
 weareincognito.org: could not connect to host
-web-wave.jp: could not connect to host
 webart-factory.de: could not connect to host
 webduck.nl: could not connect to host
 weicn.org: could not connect to host
 welby.cat: could not connect to host
 werhatunsverraten.eu: could not connect to host
 whilsttraveling.com: could not connect to host
 wm-talk.net: could not connect to host
 wnnc.co.uk: could not connect to host
 wordpresspro.cl: could not connect to host
 www-8887999.com: could not connect to host
 www.simbolo.co.uk: could not connect to host
 xa1.uk: could not connect to host
-xs2a.no: could not connect to host
+xing.ml: could not connect to host
 xtremenutrition.com.br: could not connect to host
 xyfun.net: could not connect to host
 yoonas.com: could not connect to host
 zenfusion.fr: could not connect to host
 zenghx.tk: could not connect to host
 zmk.fr: could not connect to host
 zulu7.com: could not connect to host
 zuviel.space: could not connect to host
@@ -390,16 +367,17 @@ 123.gg: could not connect to host
 123share.org: could not connect to host
 123test.de: did not receive HSTS header
 123test.es: did not receive HSTS header
 123test.fr: did not receive HSTS header
 126ium.moe: could not connect to host
 127011-networks.ch: could not connect to host
 12vpn.org: could not connect to host
 12vpnchina.com: could not connect to host
+1359826938.rsc.cdn77.org: did not receive HSTS header
 13826145000.com: could not connect to host
 1391kj.com: did not receive HSTS header
 1396.net: could not connect to host
 1536.cf: could not connect to host
 163pwd.com: could not connect to host
 166166.com: could not connect to host
 16deza.com: did not receive HSTS header
 16packets.com: could not connect to host
@@ -475,17 +453,17 @@ 4cclothing.com: could not connect to hos
 4elements.com: did not receive HSTS header
 4eyes.ch: did not receive HSTS header
 4miners.net: could not connect to host
 4ourty2.org: did not receive HSTS header
 4sqsu.eu: could not connect to host
 4w-performers.link: could not connect to host
 50millionablaze.org: could not connect to host
 513vpn.net: did not receive HSTS header
-517vpn.cn: could not connect to host
+517vpn.cn: did not receive HSTS header
 540.co: did not receive HSTS header
 54bf.com: could not connect to host
 55558522.com: could not connect to host
 56ct.com: could not connect to host
 5piecesofadvice.com: could not connect to host
 5w5.la: could not connect to host
 60ych.net: did not receive HSTS header
 6120.eu: did not receive HSTS header
@@ -526,17 +504,16 @@ 8522v.com: could not connect to host
 8522w.com: could not connect to host
 8522x.com: could not connect to host
 8522y.com: could not connect to host
 8522z.com: could not connect to host
 88.to: could not connect to host
 8888av.co: did not receive HSTS header
 888lu.co: could not connect to host
 89955.com: could not connect to host
-8azino777.ru: did not receive HSTS header
 90smthng.com: could not connect to host
 9118b.com: could not connect to host
 911911.pw: could not connect to host
 922.be: could not connect to host
 960news.ca: could not connect to host
 9651678.ru: could not connect to host
 98laba.com: could not connect to host
 98laba.net: could not connect to host
@@ -675,16 +652,17 @@ agevio.com: could not connect to host
 agonswim.com: could not connect to host
 agrimap.com: did not receive HSTS header
 agrios.de: could not connect to host
 agro-id.gov.ua: did not receive HSTS header
 agtv.com.br: did not receive HSTS header
 ahabingo.com: did not receive HSTS header
 ahoynetwork.com: did not receive HSTS header
 ahri.ovh: could not connect to host
+ahwatukeefoothillsmontessori.com: did not receive HSTS header
 aicial.co.uk: could not connect to host
 aicial.com.au: could not connect to host
 aidanwoods.com: did not receive HSTS header
 aids.gov: did not receive HSTS header
 aifreeze.ru: could not connect to host
 aify.eu: could not connect to host
 ainrb.com: did not receive HSTS header
 aip-marine.com: could not connect to host
@@ -731,17 +709,16 @@ alessandro.pw: did not receive HSTS head
 alessandroz.pro: could not connect to host
 alethearose.com: did not receive HSTS header
 alexandre.sh: did not receive HSTS header
 alexbaker.org: did not receive HSTS header
 alexdodge.ca: could not connect to host
 alexvetter.de: could not connect to host
 alfa24.pro: could not connect to host
 alfredxing.com: did not receive HSTS header
-alilialili.ga: could not connect to host
 alittlebitcheeky.com: did not receive HSTS header
 aljmz.com: could not connect to host
 alkami.com: could not connect to host
 all-subtitles.com: could not connect to host
 all.tf: could not connect to host
 alldaymonitoring.com: could not connect to host
 allemobieleproviders.nl: did not receive HSTS header
 allinnote.com: could not connect to host
@@ -1107,17 +1084,16 @@ bangzafran.com: max-age too low: 36000
 banqingdiao.com: could not connect to host
 barely.sexy: did not receive HSTS header
 bariller.fr: could not connect to host
 barrelhead.org: could not connect to host
 barrut.me: did not receive HSTS header
 barshout.co.uk: could not connect to host
 barss.io: could not connect to host
 barunisystems.com: could not connect to host
-bashc.at: could not connect to host
 bashcode.ninja: could not connect to host
 basicsolutionsus.com: did not receive HSTS header
 basilisk.io: could not connect to host
 bassh.net: did not receive HSTS header
 baud.ninja: could not connect to host
 baum.ga: could not connect to host
 baumstark.ca: could not connect to host
 baysse.eu: could not connect to host
@@ -1395,17 +1371,16 @@ bratteng.xyz: could not connect to host
 bravz.de: could not connect to host
 bremensaki.com: max-age too low: 2592000
 brenden.net.au: did not receive HSTS header
 brfvh24.se: could not connect to host
 brickoo.com: could not connect to host
 brickyardbuffalo.com: did not receive HSTS header
 bridholm.se: could not connect to host
 brightstarkids.com.au: did not receive HSTS header
-brigidaarie.com: did not receive HSTS header
 brilliantbuilders.co.uk: did not receive HSTS header
 britzer-toner.de: did not receive HSTS header
 brix.ninja: did not receive HSTS header
 brks.xyz: could not connect to host
 broken-oak.com: could not connect to host
 brookechase.com: did not receive HSTS header
 browserid.org: could not connect to host
 brrd.io: could not connect to host
@@ -1457,17 +1432,16 @@ burian-server.cz: could not connect to h
 burningcrash.de: max-age too low: 600000
 burpsuite.site: could not connect to host
 burrow.ovh: could not connect to host
 burrowingsec.com: could not connect to host
 burtrum.me: could not connect to host
 burtrum.top: could not connect to host
 buryat-mongol.cf: could not connect to host
 business.lookout.com: could not connect to host
-businessadviceperth.com.au: did not receive HSTS header
 businesshosting.nl: did not receive HSTS header
 businessloanconnection.org: did not receive HSTS header
 busold.ws: could not connect to host
 bustimes.org: could not connect to host
 butchersworkshop.com: did not receive HSTS header
 butian518.com: did not receive HSTS header
 buttercoin.com: could not connect to host
 butterfieldstraining.com: did not receive HSTS header
@@ -1699,16 +1673,17 @@ chriskyrouac.com: could not connect to h
 chrisopperwall.com: did not receive HSTS header
 christiaandruif.nl: could not connect to host
 christianbro.gq: could not connect to host
 christophercolumbusfoundation.gov: could not connect to host
 christophersole.com: could not connect to host
 christophheich.me: could not connect to host
 chrisupjohn.com: could not connect to host
 chrisvicmall.com: did not receive HSTS header
+chromaryu.net: did not receive HSTS header
 chrome-devtools-frontend.appspot.com: did not receive HSTS header (error ignored - included regardless)
 chrome.google.com: did not receive HSTS header (error ignored - included regardless)
 chrst.ph: could not connect to host
 chua.cf: could not connect to host
 chulado.com: did not receive HSTS header
 churchux.co: did not receive HSTS header
 churrasqueirafacil.com.br: could not connect to host
 cidr.ml: could not connect to host
@@ -1733,17 +1708,16 @@ claimit.ml: could not connect to host
 clan-ww.com: did not receive HSTS header
 clara-baumert.de: could not connect to host
 claralabs.com: did not receive HSTS header
 classicday.nl: could not connect to host
 classicsandexotics.com: did not receive HSTS header
 classicshop.ua: did not receive HSTS header
 classicspublishing.com: could not connect to host
 classifiedssa.co.za: could not connect to host
-claudio4.com: did not receive HSTS header
 clcleaningco.com: could not connect to host
 cleanexperts.co.uk: could not connect to host
 cleaningsquad.ca: did not receive HSTS header
 cleanmta.com: could not connect to host
 clearc.tk: could not connect to host
 clearsky.me: did not receive HSTS header
 clerkendweller.uk: did not receive HSTS header
 clickandgo.com: did not receive HSTS header
@@ -1765,17 +1739,16 @@ cloudcert.org: did not receive HSTS head
 cloudcy.net: could not connect to host
 clouddesktop.co.nz: could not connect to host
 cloudey.net: did not receive HSTS header
 cloudflare.com: did not receive HSTS header
 cloudfren.com: did not receive HSTS header
 cloudimag.es: could not connect to host
 cloudlink.club: could not connect to host
 cloudns.com.au: could not connect to host
-cloudopt.net: max-age too low: 2592000
 clouds.webcam: could not connect to host
 cloudspotterapp.com: did not receive HSTS header
 cloudstoragemaus.com: could not connect to host
 cloudstorm.me: could not connect to host
 cloudstrike.co: could not connect to host
 cloudwalk.io: did not receive HSTS header
 clounix.online: could not connect to host
 clovissantos.com: could not connect to host
@@ -2072,16 +2045,18 @@ dancerdates.net: could not connect to ho
 dane-bre.net: did not receive HSTS header
 daniel-du.com: could not connect to host
 daniel-mosquera.com: could not connect to host
 daniel-steuer.de: could not connect to host
 danielcowie.me: could not connect to host
 danieldk.eu: did not receive HSTS header
 danielheal.net: could not connect to host
 danieliancu.com: could not connect to host
+danielmostertman.com: did not receive HSTS header
+danielmostertman.nl: did not receive HSTS header
 danielverlaan.nl: did not receive HSTS header
 danielworthy.com: did not receive HSTS header
 danijobs.com: could not connect to host
 danishenanigans.com: could not connect to host
 dankeblog.com: could not connect to host
 danmark.guide: did not receive HSTS header
 dannycrichton.com: did not receive HSTS header
 danrl.de: could not connect to host
@@ -2193,17 +2168,17 @@ derpumpkinfuhrer.com: could not connect 
 derwaldschrat.net: did not receive HSTS header
 derwolfe.net: did not receive HSTS header
 desiccantpackets.com: did not receive HSTS header
 designandmore.it: did not receive HSTS header
 designgears.com: did not receive HSTS header
 designthinking.or.jp: did not receive HSTS header
 desserteagleselvenar.tk: could not connect to host
 destinationbijoux.fr: could not connect to host
-destom.be: could not connect to host
+destom.be: did not receive HSTS header
 detalhecomercio.com.br: did not receive HSTS header
 detector.exposed: could not connect to host
 detest.org: could not connect to host
 detutorial.com: max-age too low: 0
 deuxvia.com: could not connect to host
 dev: could not connect to host
 dev-aegon.azurewebsites.net: did not receive HSTS header
 dev-bluep.pantheonsite.io: did not receive HSTS header
@@ -2211,18 +2186,16 @@ devafterdark.com: could not connect to h
 devct.cz: did not receive HSTS header
 devcu.com: could not connect to host
 devcu.net: could not connect to host
 develop.fitness: could not connect to host
 devh.net: could not connect to host
 deviltraxxx.de: could not connect to host
 devincrow.me: could not connect to host
 devisonline.ch: could not connect to host
-devkit.cc: could not connect to host
-devklog.net: could not connect to host
 devmsg.com: did not receive HSTS header
 devnsec.com: could not connect to host
 devnull.team: could not connect to host
 devopps.me: did not receive HSTS header
 devopsconnected.com: could not connect to host
 devpsy.info: could not connect to host
 devtub.com: did not receive HSTS header
 devuan.org: did not receive HSTS header
@@ -2405,17 +2378,17 @@ drycreekapiary.com: could not connect to
 ds-christiansen.de: could not connect to host
 dshiv.io: could not connect to host
 dtub.co: could not connect to host
 dualias.xyz: could not connect to host
 dubik.su: did not receive HSTS header
 duelysthub.com: could not connect to host
 duerls.de: did not receive HSTS header
 dukec.me: could not connect to host
-dullsir.com: could not connect to host
+dullsir.com: did not receive HSTS header
 dungi.org: could not connect to host
 duongpho.com: did not receive HSTS header
 duskopy.top: could not connect to host
 dutchessuganda.com: did not receive HSTS header
 dutchrank.com: did not receive HSTS header
 duuu.ch: could not connect to host
 dycontrol.de: could not connect to host
 dylanscott.com.au: did not receive HSTS header
@@ -2517,17 +2490,16 @@ ego-world.org: could not connect to host
 ehealthcounselor.com: could not connect to host
 ehipaadev.com: could not connect to host
 ehito.ovh: could not connect to host
 ehrenamt-skpfcw.de: could not connect to host
 eicfood.com: could not connect to host
 eidolonhost.com: did not receive HSTS header
 eigo.work: could not connect to host
 einhorn.space: could not connect to host
-einsteinathome.org: did not receive HSTS header
 ekbanden.nl: could not connect to host
 eksik.com: could not connect to host
 elaintehtaat.fi: did not receive HSTS header
 elan-organics.com: did not receive HSTS header
 elanguest.pl: could not connect to host
 elanguest.ro: could not connect to host
 elanguest.ru: could not connect to host
 elaon.de: did not receive HSTS header
@@ -2584,17 +2556,16 @@ encryptio.com: could not connect to host
 end.pp.ua: could not connect to host
 endlessdark.net: max-age too low: 600
 endlesshorizon.net: could not connect to host
 endlesstone.com: could not connect to host
 endohaus.ca: could not connect to host
 endohaus.com: could not connect to host
 endohaus.eu: could not connect to host
 enefan.jp: could not connect to host
-enfield-kitchens.co.uk: did not receive HSTS header
 engelwerbung.com: did not receive HSTS header
 enginsight.com: did not receive HSTS header
 englishyamal.ru: did not receive HSTS header
 enigmacpt.com: did not receive HSTS header
 enigmail.net: did not receive HSTS header
 enjen.net: did not receive HSTS header
 enjoymayfield.com: max-age too low: 0
 enskat.de: could not connect to host
@@ -2715,16 +2686,17 @@ evin.ml: could not connect to host
 evites.me: could not connect to host
 evomon.com: could not connect to host
 evossd.tk: could not connect to host
 evowl.com: could not connect to host
 ewallet-optimizer.com: did not receive HSTS header
 ewex.org: could not connect to host
 excelgum.ca: did not receive HSTS header
 exceptionalservers.com: could not connect to host
+exchangecoordinator.com: did not receive HSTS header
 exfiles.cz: did not receive HSTS header
 exgravitus.com: could not connect to host
 exno.co: could not connect to host
 exousiakaidunamis.xyz: could not connect to host
 expertmile.com: did not receive HSTS header
 expo-designers.com: did not receive HSTS header
 expoundite.net: could not connect to host
 express-vpn.com: did not receive HSTS header
@@ -2773,16 +2745,17 @@ fallenangelspirits.uk: could not connect
 fam-weyer.de: did not receive HSTS header
 fame-agency.net: could not connect to host
 familie-sprink.de: could not connect to host
 familie-zimmermann.at: could not connect to host
 famio.cn: could not connect to host
 fantasyfootballpundit.com: did not receive HSTS header
 fanyl.cn: could not connect to host
 farces.com: did not receive HSTS header
+farhadexchange.com: did not receive HSTS header
 fashion.net: did not receive HSTS header
 fashioncare.cz: did not receive HSTS header
 fashionholic.my: did not receive HSTS header
 fasset.jp: could not connect to host
 fastcomcorp.com: did not receive HSTS header
 fastcomcorp.net: did not receive HSTS header
 fastograph.com: could not connect to host
 fastopen.ml: could not connect to host
@@ -2880,17 +2853,17 @@ flags.ninja: could not connect to host
 flairbros.at: could not connect to host
 flamewall.net: could not connect to host
 flamingkeys.com.au: could not connect to host
 flareon.net: could not connect to host
 flatbellyreview.com: max-age too low: 2592000
 flawcheck.com: could not connect to host
 fliexer.com: could not connect to host
 flipkey.com: did not receive HSTS header
-flirchi.com: did not receive HSTS header
+flirchi.com: could not connect to host
 flixtor.net: could not connect to host
 floless.co.uk: did not receive HSTS header
 florafiora.com.br: did not receive HSTS header
 florian-lillpopp.de: max-age too low: 10
 florianlillpopp.de: max-age too low: 10
 floridaescapes.co.uk: did not receive HSTS header
 florispoort.nl: did not receive HSTS header
 flouartistique.ch: could not connect to host
@@ -3670,24 +3643,25 @@ icntorrent.download: could not connect t
 icq-project.net: could not connect to host
 icreative.nl: did not receive HSTS header
 id-co.in: could not connect to host
 id-conf.com: did not receive HSTS header
 idcrane.com: could not connect to host
 ideal-envelopes.co.uk: did not receive HSTS header
 idealmoto.com: did not receive HSTS header
 idealmykonos.com: did not receive HSTS header
-ideaman924.com: did not receive HSTS header
+ideaman924.com: could not connect to host
 ideaplus.me: could not connect to host
 ideasmeetingpoint.com: could not connect to host
 ideation-inc.co.jp: could not connect to host
 idecode.net: could not connect to host
 idedr.com: could not connect to host
 identitylabs.uk: could not connect to host
 idgsupply.com: did not receive HSTS header
+idinby.dk: did not receive HSTS header
 idisplay.es: did not receive HSTS header
 idlekernel.com: could not connect to host
 idontexist.me: did not receive HSTS header
 ie.search.yahoo.com: did not receive HSTS header
 ierna.com: did not receive HSTS header
 ies-italia.it: did not receive HSTS header
 ies.id.lv: could not connect to host
 ievgenialehner.com: did not receive HSTS header
@@ -3842,17 +3816,16 @@ iolife.dk: could not connect to host
 ionas-law.ro: did not receive HSTS header
 ionx.co.uk: did not receive HSTS header
 iop.intuit.com: max-age too low: 86400
 iora.fr: could not connect to host
 iosmods.com: did not receive HSTS header
 iostips.ru: could not connect to host
 ip6.im: did not receive HSTS header
 ipbill.org.uk: could not connect to host
-iplantom.com: did not receive HSTS header
 iplife.cn: could not connect to host
 ipmimagazine.com: did not receive HSTS header
 iprice.co.id: did not receive HSTS header
 iprice.hk: did not receive HSTS header
 iprice.my: did not receive HSTS header
 iprice.ph: did not receive HSTS header
 iprice.sg: did not receive HSTS header
 iprice.vn: did not receive HSTS header
@@ -4154,16 +4127,17 @@ kamikatse.net: could not connect to host
 kanada.guide: did not receive HSTS header
 kaneo-gmbh.de: could not connect to host
 kaniklani.co.za: could not connect to host
 kanscooking.org: did not receive HSTS header
 kany.me: did not receive HSTS header
 kanzlei-wirtschaftsrecht.berlin: did not receive HSTS header
 kaohub.com: could not connect to host
 kaplatz.is: could not connect to host
+kappit.dk: did not receive HSTS header
 kapucini.si: max-age too low: 0
 kaputt.com: could not connect to host
 kapverde.guide: did not receive HSTS header
 karaoketonight.com: could not connect to host
 karloskontana.tk: could not connect to host
 karpanhellas.com: did not receive HSTS header
 karting34.com: did not receive HSTS header
 kashdash.ca: could not connect to host
@@ -4329,17 +4303,16 @@ kroetenfuchs.de: could not connect to ho
 kroodle.nl: did not receive HSTS header
 kruegerrand-wert.de: did not receive HSTS header
 krunut.com: did not receive HSTS header
 krypteia.org: could not connect to host
 kryptomech.com: could not connect to host
 ksfh-mail.de: could not connect to host
 kstan.me: could not connect to host
 kswriter.com: could not connect to host
-kts-thueringen.de: did not receive HSTS header
 kuba.guide: did not receive HSTS header
 kucom.it: did not receive HSTS header
 kuechenplan.online: did not receive HSTS header
 kueulangtahunanak.net: could not connect to host
 kum.com: could not connect to host
 kummerlaender.eu: did not receive HSTS header
 kupelne-ptacek.sk: did not receive HSTS header
 kuppingercole.com: did not receive HSTS header
@@ -4579,16 +4552,17 @@ loafbox.com: could not connect to host
 loansonline.today: could not connect to host
 localchum.com: could not connect to host
 localdrive.me: could not connect to host
 localnetwork.nz: could not connect to host
 locktheirphone.com: could not connect to host
 locomotive.ca: did not receive HSTS header
 locvis.ru: could not connect to host
 loftboard.eu: could not connect to host
+log2n.uk: did not receive HSTS header
 logario.com.br: could not connect to host
 logicaladvertising.com: could not connect to host
 login.corp.google.com: max-age too low: 7776000 (error ignored - included regardless)
 login.persona.org: could not connect to host
 loginseite.com: could not connect to host
 logistify.com.mx: did not receive HSTS header
 lognot.net: could not connect to host
 logymedia.com: could not connect to host
@@ -4748,17 +4722,17 @@ mammut.space: could not connect to host
 manaboutahor.se: did not receive HSTS header
 manage.zenpayroll.com: did not receive HSTS header
 manage4all.com: could not connect to host
 manageall.de: could not connect to host
 manageforall.com: could not connect to host
 manageforall.de: could not connect to host
 managemynetsuite.com: did not receive HSTS header
 manageprojects.com: did not receive HSTS header
-manantial.mx: did not receive HSTS header
+manantial.mx: could not connect to host
 mandpress.com: did not receive HSTS header
 maniadeprazer.com.br: could not connect to host
 manifestbin.com: did not receive HSTS header
 manitasicily.com: did not receive HSTS header
 manningbrothers.com: did not receive HSTS header
 manshop24.com: could not connect to host
 mansion-note.com: did not receive HSTS header
 manududu.com.br: did not receive HSTS header
@@ -4855,24 +4829,23 @@ maxserver.com: did not receive HSTS head
 maya.mg: could not connect to host
 mazz-tech.com: could not connect to host
 mbconsultancy.nu: did not receive HSTS header
 mc81.com: could not connect to host
 mca2017.org: did not receive HSTS header
 mcard.vn: did not receive HSTS header
 mcc.re: could not connect to host
 mccarty.io: could not connect to host
-mcdonalds.ru: did not receive HSTS header
+mcdonalds.ru: could not connect to host
 mcga.media: could not connect to host
 mclab.su: could not connect to host
 mclist.it: could not connect to host
 mclyr.com: max-age too low: 7776000
 mcooperlaw.com: did not receive HSTS header
 mdfnet.se: did not receive HSTS header
-mdkr.nl: did not receive HSTS header
 mdscomp.net: did not receive HSTS header
 meadowfen.farm: could not connect to host
 meadowfenfarm.com: could not connect to host
 meamod.com: max-age too low: 0
 meat-education.com: could not connect to host
 mebio.us: did not receive HSTS header
 mecenat-cassous.com: did not receive HSTS header
 mechmk1.me: did not receive HSTS header
@@ -4953,17 +4926,17 @@ mhict.nl: could not connect to host
 mht-travel.com: could not connect to host
 mhx.pw: could not connect to host
 mi80.com: could not connect to host
 mia.to: could not connect to host
 mianfei-vpn.com: did not receive HSTS header
 michaeldemuth.com: could not connect to host
 michaelfitzpatrickruth.com: could not connect to host
 michaelmorpurgo.com: did not receive HSTS header
-michaeln.net: did not receive HSTS header
+michaeln.net: could not connect to host
 michaelscrivo.com: did not receive HSTS header
 michaelwaite.org: could not connect to host
 michal-kral.cz: could not connect to host
 michalborka.cz: could not connect to host
 miconware.de: could not connect to host
 micro-dv.ru: could not connect to host
 micro-rain-systems.com: did not receive HSTS header
 microme.ga: could not connect to host
@@ -5193,16 +5166,17 @@ musewearflipflops.com: could not connect
 mushroomandfern.com: could not connect to host
 musi.cx: could not connect to host
 musicalbim.com.br: could not connect to host
 musicchris.de: did not receive HSTS header
 musikkfondene.no: did not receive HSTS header
 mustardking.me: did not receive HSTS header
 mustika.cf: could not connect to host
 mutamatic.com: could not connect to host
+mutuals.cool: did not receive HSTS header
 mutuelle-obligatoire-pme.fr: did not receive HSTS header
 muzgra.in: did not receive HSTS header
 muzykaprzeszladoplay.pl: could not connect to host
 mvanmarketing.nl: did not receive HSTS header
 mvsecurity.nl: could not connect to host
 mw.search.yahoo.com: did not receive HSTS header
 mwohlfarth.de: did not receive HSTS header
 my-owncloud.com: could not connect to host
@@ -5288,17 +5262,17 @@ nandex.org: could not connect to host
 naniki.co.uk: did not receive HSTS header
 nanogeneinc.com: could not connect to host
 nanokamo.com: did not receive HSTS header
 nanrenba.net: could not connect to host
 nansay.cn: could not connect to host
 nanto.eu: could not connect to host
 narodniki.com: did not receive HSTS header
 nashira.cz: did not receive HSTS header
-nasralmabrooka.com: could not connect to host
+nasralmabrooka.com: did not receive HSTS header
 natalia-fadeeva.ru: could not connect to host
 natalia.io: could not connect to host
 natalieandjoshua.com: could not connect to host
 natalt.org: did not receive HSTS header
 nathanmfarrugia.com: did not receive HSTS header
 nationwidevehiclecontracts.co.uk: did not receive HSTS header
 natural-progesterone.net: could not connect to host
 naturecoaster.com: did not receive HSTS header
@@ -5400,16 +5374,17 @@ niconode.com: could not connect to host
 nidux.com: did not receive HSTS header
 niduxcomercial.com: could not connect to host
 nien.chat: could not connect to host
 nightsnack.cf: could not connect to host
 nightwinds.tk: could not connect to host
 niho.jp: did not receive HSTS header
 nikcub.com: could not connect to host
 niklaslindblad.se: did not receive HSTS header
+nikobradshaw.com: did not receive HSTS header
 niloxy.com: did not receive HSTS header
 ninchisho-online.com: did not receive HSTS header
 ninhs.org: could not connect to host
 ninjaspiders.com: did not receive HSTS header
 nippler.org: did not receive HSTS header
 nippombashi.net: did not receive HSTS header
 nipponcareers.com: did not receive HSTS header
 nitropanel.com: did not receive HSTS header
@@ -5434,16 +5409,17 @@ nodi.at: did not receive HSTS header
 noexpect.org: could not connect to host
 noima.com: did not receive HSTS header
 noisebridge.social: could not connect to host
 nolberg.net: did not receive HSTS header
 nolimitsbook.de: did not receive HSTS header
 nolte.work: could not connect to host
 nomorebytes.de: could not connect to host
 noodlesandwich.com: did not receive HSTS header
+nootropicsource.com: did not receive HSTS header
 nope.website: could not connect to host
 nopex.no: could not connect to host
 nopol.de: could not connect to host
 norandom.com: could not connect to host
 norb.at: could not connect to host
 nordlicht.photography: did not receive HSTS header
 norge.guide: did not receive HSTS header
 northcutt.com: did not receive HSTS header
@@ -5797,17 +5773,16 @@ payments-reference.org: could not connec
 payments.google.com: did not receive HSTS header (error ignored - included regardless)
 payroll.ch: could not connect to host
 paytwopay.com: could not connect to host
 pbapp.net: did not receive HSTS header
 pbbr.com: did not receive HSTS header
 pbprint.ru: did not receive HSTS header
 pc-nf.de: did not receive HSTS header
 pcat.io: could not connect to host
-pccentral.nl: did not receive HSTS header
 pcfun.net: could not connect to host
 pchax.net: could not connect to host
 pchospital.cc: did not receive HSTS header
 pdamsidoarjo.co.id: could not connect to host
 pdevio.com: could not connect to host
 pdf.yt: could not connect to host
 peaceandwool.com: did not receive HSTS header
 peakapp.nl: could not connect to host
@@ -6104,17 +6079,16 @@ providerlijst.nl: did not receive HSTS h
 prowhisky.de: did not receive HSTS header
 proximato.com: could not connect to host
 proxybay.al: could not connect to host
 proxybay.club: could not connect to host
 proxybay.info: did not receive HSTS header
 proxybay.top: did not receive HSTS header
 proxydesk.net: could not connect to host
 proxyowl.pw: could not connect to host
-proxyportal.org: did not receive HSTS header
 proxyrox.com: could not connect to host
 prxio.date: could not connect to host
 prxio.site: could not connect to host
 prytkov.com: did not receive HSTS header
 ps-provider.co.jp: could not connect to host
 ps4all.nl: could not connect to host
 pscleaningsolutions.co.uk: could not connect to host
 pseudo.coffee: could not connect to host
@@ -6280,17 +6254,16 @@ readr.pw: could not connect to host
 reagir43.fr: did not receive HSTS header
 realmic.net: could not connect to host
 realmofespionage.com: could not connect to host
 realraghavgupta.com: could not connect to host
 reaper.rip: could not connect to host
 reardenporn.com: could not connect to host
 rebekaesgabor.online: could not connect to host
 recommended.reviews: could not connect to host
-recyclingpromotions.us: did not receive HSTS header
 redar.xyz: could not connect to host
 reddit.com: did not receive HSTS header
 rede.ca: did not receive HSTS header
 redhorsemountainranch.com: did not receive HSTS header
 redicabo.de: could not connect to host
 redirectman.com: did not receive HSTS header
 redlatam.org: did not receive HSTS header
 redmbk.com: did not receive HSTS header
@@ -6463,17 +6436,16 @@ rozeapp.nl: could not connect to host
 rr.in.th: could not connect to host
 rrke.cc: did not receive HSTS header
 rsajeey.info: could not connect to host
 rsampaio.info: could not connect to host
 rsauget.fr: could not connect to host
 rsblake.net: could not connect to host
 rsf.io: could not connect to host
 rsmaps.org: could not connect to host
-rsttraining.co.uk: could not connect to host
 rubbereggs.ca: could not connect to host
 rubecodeberg.com: could not connect to host
 rubenschulz.nl: could not connect to host
 rubi-ka.net: max-age too low: 0
 ruborr.se: did not receive HSTS header
 rubysecurity.org: did not receive HSTS header
 rubyshop.nl: max-age too low: 604800
 rudeotter.com: did not receive HSTS header
@@ -6509,17 +6481,17 @@ saabwa.org: could not connect to host
 safelist.eu: did not receive HSTS header
 safematix.com: could not connect to host
 safemovescheme.co.uk: did not receive HSTS header
 safersurfing.eu: did not receive HSTS header
 safewings-nh.nl: could not connect to host
 sagarhandicraft.com: could not connect to host
 sageth.com: max-age too low: 0
 sah3.net: could not connect to host
-saharalondon.com: did not receive HSTS header
+saharalondon.com: max-age too low: 0
 saharmassachi.com: could not connect to host
 sail-nyc.com: did not receive HSTS header
 sairai.bid: did not receive HSTS header
 sakaki.anime.my: max-age too low: 5184000
 sakaserver.com: did not receive HSTS header
 sakib.ninja: did not receive HSTS header
 sakurabuff.com: could not connect to host
 salserocafe.com: did not receive HSTS header
@@ -6613,17 +6585,17 @@ scrambler.in: could not connect to host
 scrapings.net: could not connect to host
 screencaster.io: did not receive HSTS header
 screenresolution.space: could not connect to host
 screensaversplanet.com: did not receive HSTS header
 scribbleserver.com: could not connect to host
 scribe.systems: could not connect to host
 scrion.com: could not connect to host
 script.google.com: did not receive HSTS header (error ignored - included regardless)
-scriptenforcer.net: could not connect to host
+scriptenforcer.net: did not receive HSTS header
 scriptict.nl: could not connect to host
 scrollstory.com: did not receive HSTS header
 sdhmanagementgroup.com: could not connect to host
 sdia.ru: could not connect to host
 sdmoscow.ru: could not connect to host
 sdrobs.com: did not receive HSTS header
 sdsl-speedtest.de: could not connect to host
 seans.cc: did not receive HSTS header
@@ -6747,30 +6719,30 @@ shadowsocks.vc: did not receive HSTS hea
 shadowsocks.wiki: did not receive HSTS header
 shadowsoks.com: could not connect to host
 shakebox.de: could not connect to host
 shanekoster.net: could not connect to host
 shanesage.com: could not connect to host
 shaobin.wang: could not connect to host
 shapesedinburgh.co.uk: did not receive HSTS header
 shardsoft.com: could not connect to host
-shareeri.com: did not receive HSTS header
 shareimg.xyz: could not connect to host
 sharejoy.cn: did not receive HSTS header
 sharepass.pw: could not connect to host
 sharepic.xyz: could not connect to host
 sharezen.de: could not connect to host
 shauncrowley.co.uk: could not connect to host
 shaunwheelhou.se: could not connect to host
 shawnh.net: could not connect to host
 shellsec.pw: did not receive HSTS header
 shep.co.il: did not receive HSTS header
 shereallyheals.com: did not receive HSTS header
 shervik.ga: could not connect to host
 shg-pornographieabhaengigkeit.de: did not receive HSTS header
+shiatsu-institut.ch: did not receive HSTS header
 shibe.club: could not connect to host
 shiftins.com: could not connect to host
 shiftplanning.com: did not receive HSTS header
 shiinko.com: could not connect to host
 shindorei.fr: did not receive HSTS header
 shinebijoux.com.br: could not connect to host
 shinju.moe: could not connect to host
 shiona.xyz: could not connect to host
@@ -6830,17 +6802,17 @@ simon-pokorny.com: did not receive HSTS 
 simon.butcher.name: max-age too low: 2629743
 simongong.net: did not receive HSTS header
 simonsaxon.com: did not receive HSTS header
 simpan.id: did not receive HSTS header
 simpleai.net: max-age too low: 600
 simplelearner.com: could not connect to host
 simplepractice.com: did not receive HSTS header
 simplixos.org: could not connect to host
-simply-premium.com: did not receive HSTS header
+simply-premium.com: max-age too low: 0
 simplyenak.com: did not receive HSTS header
 sin30.net: could not connect to host
 sincai666.com: could not connect to host
 sincron.org: could not connect to host
 sinful.pw: could not connect to host
 singul4rity.com: could not connect to host
 sinneserweiterung.de: could not connect to host
 sinosky.org: did not receive HSTS header
@@ -6900,16 +6872,17 @@ smarterskies.gov: did not receive HSTS h
 smartfon4you.ru: did not receive HSTS header
 smarthomedna.com: did not receive HSTS header
 smartofficesandsmarthomes.com: did not receive HSTS header
 smartphone.continental.com: could not connect to host
 smartrak.co.nz: did not receive HSTS header
 smdev.fr: could not connect to host
 smet.us: could not connect to host
 smexpt.com: did not receive HSTS header
+smiledirectsales.com: did not receive HSTS header
 smimea.com: could not connect to host
 smirkingwhorefromhighgarden.pro: could not connect to host
 smittix.co.uk: did not receive HSTS header
 smkn1lengkong.sch.id: did not receive HSTS header
 smksi2.com: could not connect to host
 smksultanismail2.com: did not receive HSTS header
 smove.sg: did not receive HSTS header
 smplix.com: could not connect to host
@@ -7135,17 +7108,16 @@ streamingmagazin.de: could not connect t
 strictlysudo.com: could not connect to host
 strife.tk: could not connect to host
 strila.me: could not connect to host
 strivephysmed.com: did not receive HSTS header
 stroeercrm.de: could not connect to host
 strongest-privacy.com: could not connect to host
 stuartbaxter.co: could not connect to host
 student-scientist.org: did not receive HSTS header
-student.andover.edu: did not receive HSTS header
 studentrdh.com: did not receive HSTS header
 studentresearcher.org: did not receive HSTS header
 studentskydenik.cz: could not connect to host
 studenttravel.cz: did not receive HSTS header
 studinf.xyz: could not connect to host
 studio-panic.com: did not receive HSTS header
 studiozelden.com: did not receive HSTS header
 studybay.com: did not receive HSTS header
@@ -7255,24 +7227,22 @@ sytpartners.com: max-age too low: 0
 szaszm.tk: max-age too low: 0
 t-complex.space: could not connect to host
 t-ken.xyz: could not connect to host
 t-tz.com: could not connect to host
 t0dd.eu: could not connect to host
 t4c-rebirth.com: could not connect to host
 t4x.org: could not connect to host
 taabe.xyz: could not connect to host
-taartenfeesies.nl: did not receive HSTS header
 tabino.top: could not connect to host
 tacomafia.net: did not receive HSTS header
 tadigitalstore.com: could not connect to host
 tafoma.com: did not receive HSTS header
 tageau.com: could not connect to host
 taglondon.org: did not receive HSTS header
-tahakomat.cz: did not receive HSTS header
 tailify.com: did not receive HSTS header
 tails.com.ar: did not receive HSTS header
 talado.gr: could not connect to host
 tales-of-interia.de: could not connect to host
 talheim-records.ca: could not connect to host
 talk.google.com: did not receive HSTS header (error ignored - included regardless)
 talkitup.mx: could not connect to host
 talkitup.online: did not receive HSTS header
@@ -7303,16 +7273,17 @@ tasmansecurity.com: could not connect to
 tassup.com: could not connect to host
 tastyyy.co: could not connect to host
 tatilbus.com: did not receive HSTS header
 tatt.io: could not connect to host
 tauchkater.de: could not connect to host
 tavoittaja.fi: did not receive HSTS header
 tavopica.lt: did not receive HSTS header
 taxbench.com: could not connect to host
+taxi-24std.de: did not receive HSTS header
 taxiindenbosch.nl: did not receive HSTS header
 taxsnaps.co.nz: did not receive HSTS header
 tazz.in: could not connect to host
 tbspace.de: did not receive HSTS header
 tc-bonito.de: did not receive HSTS header
 tcao.info: could not connect to host
 tcby45.xyz: could not connect to host
 tcdw.net: could not connect to host
@@ -7525,17 +7496,17 @@ tierrarp.com: could not connect to host
 tightlineproductions.com: did not receive HSTS header
 tikutiku.pl: could not connect to host
 tildebot.com: could not connect to host
 tiliaze.be: could not connect to host
 tiliaze.biz: could not connect to host
 tiliaze.eu: did not receive HSTS header
 tilient.eu: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 119"  data: no]
 tilikum.io: did not receive HSTS header
-tilkah.com.au: did not receive HSTS header
+tilkah.com.au: could not connect to host
 tillcraft.com: could not connect to host
 timbeilby.com: could not connect to host
 timbuktutimber.com: did not receive HSTS header
 timcamara.com: could not connect to host
 time-river.xyz: could not connect to host
 timesavingplugins.com: could not connect to host
 timesavingplugins.net: could not connect to host
 timeserver0.de: could not connect to host
@@ -7563,16 +7534,17 @@ titouan.co: did not receive HSTS header
 tittarpuls.se: could not connect to host
 titties.ml: could not connect to host
 tjc.host: did not receive HSTS header
 tjc.wiki: could not connect to host
 tjeckien.guide: did not receive HSTS header
 tjullrich.de: could not connect to host
 tkappertjedemetamorfose.nl: could not connect to host
 tkonstantopoulos.tk: could not connect to host
+tlach.cz: did not receive HSTS header
 tlcdn.net: could not connect to host
 tlo.hosting: could not connect to host
 tlo.link: could not connect to host
 tlo.network: could not connect to host
 tls.li: could not connect to host
 tlsbv.nl: did not receive HSTS header
 tlshost.net: could not connect to host
 tm-solutions.eu: did not receive HSTS header
@@ -7670,16 +7642,17 @@ trance-heal.me: did not receive HSTS hea
 tranceheal.com: did not receive HSTS header
 tranceheal.de: did not receive HSTS header
 tranceheal.me: did not receive HSTS header
 transdirect.com.au: did not receive HSTS header
 transformify.org: did not receive HSTS header
 transl8.eu: did not receive HSTS header
 translate.googleapis.com: did not receive HSTS header (error ignored - included regardless)
 transportal.sk: did not receive HSTS header
+trashnothing.com: did not receive HSTS header
 travality.ru: could not connect to host
 travel-kuban.ru: did not receive HSTS header
 travelinsightswriter.com: could not connect to host
 travelinsurance.co.nz: did not receive HSTS header
 trazosdearte.com: did not receive HSTS header
 treatprostatewithhifu.com: could not connect to host
 treeby.net: could not connect to host
 treeremovaljohannesburg.co.za: could not connect to host
@@ -7869,17 +7842,16 @@ upboard.jp: could not connect to host
 upldr.pw: could not connect to host
 uporoops.com: could not connect to host
 uprotect.it: could not connect to host
 upstats.eu: could not connect to host
 ur-lauber.de: did not receive HSTS header
 urandom.eu.org: did not receive HSTS header
 urban-garden.lt: could not connect to host
 urban-garden.lv: could not connect to host
-urbanstylestaging.com: did not receive HSTS header
 urbpic.com: could not connect to host
 urlchomp.com: did not receive HSTS header
 urphp.com: could not connect to host
 us-immigration.com: did not receive HSTS header
 usaab.org: did not receive HSTS header
 usafuelservice.com: did not receive HSTS header
 usbirthcertificate.com: did not receive HSTS header
 usbtypeccompliant.com: could not connect to host
@@ -7891,34 +7863,35 @@ usercare.com: did not receive HSTS heade
 userify.com: max-age too low: 0
 uslab.io: could not connect to host
 usr.nz: did not receive HSTS header
 ustr.gov: max-age too low: 86400
 utilitronium-shockwave.com: could not connect to host
 utleieplassen.no: could not connect to host
 utopiagalaxy.space: could not connect to host
 utopian-surgery.com: could not connect to host
+utopianconcept.com: did not receive HSTS header
 utopianhomespa.com: did not receive HSTS header
 utopianrealms.org: did not receive HSTS header
-uttnetgroup.fr: could not connect to host
 utumno.ch: did not receive HSTS header
 utvbloggen.se: max-age too low: 604800
 uvarov.pw: could not connect to host
 uwstartups.com: could not connect to host
 uxux.pl: could not connect to host
 uy.search.yahoo.com: did not receive HSTS header
 uyym.com: could not connect to host
 uz.search.yahoo.com: did not receive HSTS header
 uzmandroid.com: did not receive HSTS header
 uzmandroid.net: could not connect to host
 uzmandroid.top: could not connect to host
 v0rtex.xyz: could not connect to host
 v0tti.com: could not connect to host
 v2.pw: did not receive HSTS header
 v2ex.us: did not receive HSTS header
+v4s.ro: did not receive HSTS header
 v4veedu.com: could not connect to host
 v7.cl: could not connect to host
 v789xl.com: did not receive HSTS header
 vaalmarketplace.co.za: did not receive HSTS header
 vacationality.com: could not connect to host
 vackerbetong.se: could not connect to host
 vaddder.com: could not connect to host
 vadodesign.nl: did not receive HSTS header
@@ -7934,17 +7907,16 @@ valleyridgepta.org: could not connect to
 vallis.net: could not connect to host
 valmagus.com: could not connect to host
 vamoaeturismo.com.br: could not connect to host
 vampirism.eu: could not connect to host
 vanacht.co.za: did not receive HSTS header
 vande-walle.eu: did not receive HSTS header
 vanderkley.it: could not connect to host
 vanderstraeten.dynv6.net: could not connect to host
-vanessabalibridal.com: did not receive HSTS header
 vanestack.com: could not connect to host
 vanetv.com: could not connect to host
 vanitas.xyz: could not connect to host
 vanitynailworkz.com: could not connect to host
 vansieleghem.com: could not connect to host
 vapordepot.jp: did not receive HSTS header
 vasanth.org: could not connect to host
 vbest.net: could not connect to host
@@ -8017,17 +7989,16 @@ vio.no: did not receive HSTS header
 violenceinterrupted.org: did not receive HSTS header
 viperdns.com: could not connect to host
 viphospitality.se: could not connect to host
 vipmusic.ga: could not connect to host
 vipnettikasinoklubi.com: could not connect to host
 viral8.jp: could not connect to host
 virginiacrimeanalysisnetwork.org: did not receive HSTS header
 virtualstrongbox.ca: did not receive HSTS header
-visalogy.com: could not connect to host
 visanhigia.com: did not receive HSTS header
 viserproject.com: could not connect to host
 vision-painting.com: did not receive HSTS header
 visitbroadstairs.com: could not connect to host
 vissanum.com: did not receive HSTS header
 vistarait.com: did not receive HSTS header
 visualvotes.co.uk: could not connect to host
 vitagenda.nl: could not connect to host
@@ -8089,16 +8060,17 @@ vyncke.org: max-age too low: 2678400
 vyvybean.cf: could not connect to host
 vyvygen.com: did not receive HSTS header
 vzk.io: could not connect to host
 w4a.fr: did not receive HSTS header
 w4xzr.top: could not connect to host
 w4xzr.xyz: could not connect to host
 waaw.tv: did not receive HSTS header
 wachtwoordencheck.nl: could not connect to host
+wafairhaven.com.au: did not receive HSTS header
 wahhoi.net: did not receive HSTS header
 wait.moe: could not connect to host
 waixingrenfuli7.vip: could not connect to host
 wakapp.de: could not connect to host
 wakened.net: did not receive HSTS header
 walkeryoung.ca: could not connect to host
 wallabag.it: did not receive HSTS header
 wallabag.org: did not receive HSTS header
@@ -8180,28 +8152,28 @@ webwork.pw: could not connect to host
 webypass.xyz: could not connect to host
 wecanfindit.co.za: could not connect to host
 weddingenvelopes.co.uk: did not receive HSTS header
 weddingibiza.nl: could not connect to host
 weekly.fyi: could not connect to host
 wegenaer.nl: could not connect to host
 weiji.ga: did not receive HSTS header
 welkers.org: could not connect to host
-wellastore.ru: could not connect to host
+wellastore.ru: did not receive HSTS header
 wellcomp.com.br: did not receive HSTS header
 wellies.com.au: max-age too low: 7776000
 wellness.so: could not connect to host
 welpy.com: could not connect to host
 weltentreff.com: could not connect to host
 weltmeisterschaft.net: could not connect to host
 wemakeonlinereviews.com: did not receive HSTS header
 weme.eu: could not connect to host
 wendalyncheng.com: did not receive HSTS header
 werdeeintimo.de: did not receive HSTS header
-werkenbijkfc.nl: did not receive HSTS header
+werkenbijkfc.nl: could not connect to host
 werkplaatsoost.nl: did not receive HSTS header
 werkruimtebottendaal.nl: did not receive HSTS header
 wesleyharris.ca: did not receive HSTS header
 westendzone.com: max-age too low: 0
 westerhoud.nl: did not receive HSTS header
 westlinwinds.com: did not receive HSTS header
 westsussexconnecttosupport.org: could not connect to host
 wetoxic.com: did not receive HSTS header
@@ -8253,17 +8225,16 @@ winecodeavocado.com: could not connect t
 winfield.me.uk: did not receive HSTS header
 winged.io: could not connect to host
 wingos.net: could not connect to host
 wingumd.net: could not connect to host
 winpack.cf: could not connect to host
 winpack.eu.org: could not connect to host
 winsec.nl: could not connect to host
 winshiplending.com: did not receive HSTS header
-wipc.net: could not connect to host
 wirc.gr: could not connect to host
 wiretrip.io: could not connect to host
 wiseloan.com: did not receive HSTS header
 wishcert.com: could not connect to host
 wispapp.com: did not receive HSTS header
 withgoogle.com: did not receive HSTS header (error ignored - included regardless)
 withmy.beer: could not connect to host
 withustrading.com: could not connect to host
@@ -8378,17 +8349,17 @@ x509.pub: could not connect to host
 x509.pw: could not connect to host
 xa.search.yahoo.com: did not receive HSTS header
 xandocs.com: could not connect to host
 xat.re: could not connect to host
 xavierbarroso.com: could not connect to host
 xbind.io: could not connect to host
 xcoop.me: could not connect to host
 xdd.io: could not connect to host
-xecure.zone: could not connect to host
+xecure.zone: did not receive HSTS header
 xehoivn.vn: did not receive HSTS header
 xellos.ga: could not connect to host
 xellos.ml: could not connect to host
 xenesisziarovky.sk: could not connect to host
 xett.com: did not receive HSTS header
 xf-liam.com: did not receive HSTS header
 xfd3.de: did not receive HSTS header
 xfive.de: could not connect to host
@@ -8559,17 +8530,18 @@ zahyantechnologies.com: could not connec
 zakoncontrol.com: did not receive HSTS header
 zamorano.edu: could not connect to host
 zamos.ru: max-age too low: 0
 zaneweb.org: could not connect to host
 zao.fi: did not receive HSTS header
 zaoshanghao-dajia.rhcloud.com: did not receive HSTS header
 zap.yt: did not receive HSTS header
 zarooba.com: could not connect to host
-zavca.com: did not receive HSTS header
+zary.me: did not receive HSTS header
+zavca.com: could not connect to host
 zbigniewgalucki.eu: did not receive HSTS header
 zcon.nl: could not connect to host
 zdravotnickasluzba.eu: could not connect to host
 zebrababy.cn: could not connect to host
 zebry.nl: could not connect to host
 zecrypto.com: could not connect to host
 zeedroom.be: did not receive HSTS header
 zefiris.org: did not receive HSTS header
@@ -8591,16 +8563,17 @@ zeroday.sk: did not receive HSTS header
 zerofox.gq: could not connect to host
 zeroml.ml: could not connect to host
 zerudi.com: did not receive HSTS header
 zett4.me: could not connect to host
 zeytin.pro: could not connect to host
 zh.search.yahoo.com: did not receive HSTS header
 zh1.li: could not connect to host
 zhang.wtf: could not connect to host
+zhangge.net: did not receive HSTS header
 zhangruilin.com: did not receive HSTS header
 zhaojin97.cn: could not connect to host
 zhendingresources.com: did not receive HSTS header
 zhh.in: could not connect to host
 zhihua-lai.com: did not receive HSTS header
 zhiin.net: could not connect to host
 zhiku8.com: could not connect to host
 zhuji.com.cn: could not connect to host
@@ -8624,17 +8597,16 @@ zk.gd: did not receive HSTS header
 zkillboard.com: did not receive HSTS header
 zking.ga: could not connect to host
 zmsastro.co.za: could not connect to host
 zmy.im: did not receive HSTS header
 zocken.com: did not receive HSTS header
 zockenbiszumumfallen.de: did not receive HSTS header
 zoe.vc: could not connect to host
 zohar.link: could not connect to host
-zolotoy-standart.com.ua: did not receive HSTS header
 zomiac.pp.ua: could not connect to host
 zoneminder.com: did not receive HSTS header
 zoners.si: did not receive HSTS header
 zonky.io: could not connect to host
 zoo24.de: did not receive HSTS header
 zoofaeth.de: did not receive HSTS header
 zoomingin.net: max-age too low: 5184000
 zoommailing.com: did not receive HSTS header
--- a/security/manager/ssl/nsSTSPreloadList.inc
+++ b/security/manager/ssl/nsSTSPreloadList.inc
@@ -3,17 +3,17 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 /*****************************************************************************/
 /* This is an automatically generated file. If you're not                    */
 /* nsSiteSecurityService.cpp, you shouldn't be #including it.     */
 /*****************************************************************************/
 
 #include <stdint.h>
-const PRTime gPreloadListExpirationTime = INT64_C(1518414589664000);
+const PRTime gPreloadListExpirationTime = INT64_C(1518457357921000);
 %%
 0.me.uk, 1
 00001.am, 1
 00002.am, 1
 0005pay.com, 1
 0010100.net, 1
 00220022.net, 1
 007-preisvergleich.de, 1
@@ -108,17 +108,16 @@ 123midterm.com, 1
 123plons.nl, 1
 123test.com, 1
 123test.nl, 1
 125m125.de, 1
 12vpn.net, 1
 130.ua, 1
 132kv.ch, 1
 13318522.com, 1
-1359826938.rsc.cdn77.org, 1
 1395kj.com, 1
 1396.cc, 1
 1453914078.rsc.cdn77.org, 1
 1464424382.rsc.cdn77.org, 1
 14it.de, 1
 14x3.de, 1
 15-10.com, 1
 1511774230.rsc.cdn77.org, 1
@@ -391,16 +390,17 @@ 888azino.com, 1
 888msc.vip, 1
 888sport.dk, 1
 888sport.it, 1
 88laohu.cc, 1
 88laohu.com, 1
 899699.com, 1
 8ack.de, 1
 8ackprotect.com, 1
+8azino777.ru, 1
 8mpay.com, 1
 8ox.ru, 0
 8pecxstudios.com, 1
 8svn.com, 1
 8t8.eu, 1
 8t88.biz, 1
 8thportsmouth.org.uk, 1
 8tuffbeers.com, 1
@@ -565,17 +565,17 @@ aceinstituteonline.com, 1
 acelpb.com, 1
 acemobileforce.com, 1
 acendealuz.com.br, 1
 acerislaw.com, 1
 acessoeducacao.com, 1
 acevik.de, 1
 acg.mn, 1
 acg.sb, 1
-acg18.us, 1
+acg18.us, 0
 acgaudio.com, 1
 achalay.org, 1
 acheconcursos.com.br, 1
 achenar.net, 1
 achow101.com, 1
 achromatisch.de, 1
 achterhoekseveiligheidsbeurs.nl, 1
 achterstieg.dedyn.io, 1
@@ -867,17 +867,16 @@ ahmedabadflowermall.com, 1
 ahmedcharles.com, 1
 ahmerjamilkhan.org, 1
 aholic.co, 1
 ahoy.travel, 1
 ahoyconference.com, 1
 ahrq.gov, 0
 ahughes03.com, 1
 ahwah.net, 1
-ahwatukeefoothillsmontessori.com, 1
 ahxxm.com, 1
 ai-english.jp, 1
 aia.de, 1
 aibenzi.com, 1
 aicial.com, 1
 aidanmontare.net, 1
 aide-valais.ch, 1
 aiden.link, 1
@@ -1062,16 +1061,17 @@ aliantsoft.pl, 1
 alibangash.com, 1
 alibip.de, 1
 alicestudio.it, 1
 alicetone.net, 1
 alicialab.org, 1
 alienation.biz, 1
 alienstat.com, 1
 alignrs.com, 1
+alilialili.ga, 1
 alinasmusicstudio.com, 1
 alinode.com, 1
 alisonisrealestate.com, 1
 alisonlitchfield.com, 1
 alistairpialek.com, 1
 alistairstowing.com, 1
 alisync.com, 1
 aliwebstore.com, 1
@@ -2387,16 +2387,17 @@ bascht.com, 1
 basculasconfiables.com, 1
 base-autonome-durable.com, 1
 baseballrampage.com, 1
 baseballsavings.com, 1
 baseballwarehouse.com, 1
 baselang.com, 1
 basementdoctor.com, 1
 basementdoctornorthwest.com, 1
+bashc.at, 1
 bashstreetband.co.uk, 1
 basilicaknights.org, 1
 basilm.co, 1
 baskettemple.com, 1
 basnieuwenhuizen.nl, 1
 basnoslovno.com.ua, 1
 basnoslovno.ru, 1
 bass-pro.ru, 1
@@ -3509,16 +3510,17 @@ bridgeout.com, 1
 brie.tech, 1
 briefhansa.de, 1
 brightfuturemadebyme.com, 1
 brightonbank.com, 1
 brightonchilli.org.uk, 1
 brightstarkids.co.uk, 0
 brightstarkids.net, 0
 brightstarkids.sg, 0
+brigidaarie.com, 1
 brilliantdecisionmaking.com, 1
 brinkhu.is, 1
 brinquedoseducativos.art.br, 1
 brio-shop.ch, 1
 brisbanelogistics.com.au, 1
 bristebein.com, 1
 britelocate.com, 1
 britishbeef.com, 1
@@ -3699,16 +3701,17 @@ burtrum.name, 1
 burtrum.org, 1
 burzmali.com, 1
 bush41.org, 1
 bushbaby.com, 1
 busindre.com, 1
 business-garden.com, 1
 business.facebook.com, 0
 business.medbank.com.mt, 1
+businessadviceperth.com.au, 0
 businessamongus.com, 1
 businesscentermarin.ch, 1
 businessesdirectory.eu, 1
 businessfurs.info, 1
 businesshub.cz, 1
 businessimmigration-eu.com, 1
 businessimmigration-eu.ru, 1
 businessmodeler.se, 1
@@ -4551,17 +4554,16 @@ christopherpritchard.co.uk, 1
 christophertruncer.com, 1
 christophkreileder.com, 1
 christophsackl.de, 1
 chrisu3050.at, 1
 chrisupjohn.xyz, 1
 chriswarrick.com, 1
 chriswbarry.com, 1
 chriswells.io, 1
-chromaryu.net, 0
 chromaxa.com, 1
 chrome-devtools-frontend.appspot.com, 1
 chrome.com, 0
 chrome.google.com, 1
 chromebookchart.com, 1
 chromebooksforwork.com, 1
 chromiumbugs.appspot.com, 1
 chromiumcodereview.appspot.com, 0
@@ -4694,16 +4696,17 @@ clapping-rhymes.com, 1
 clarkeaward.com, 1
 clashersrepublic.com, 1
 classdojo.com, 1
 classicalpilates.ca, 1
 classics.io, 1
 classpoint.cz, 1
 classteaching.com.au, 1
 claudia-urio.com, 1
+claudio4.com, 1
 clauseriksen.net, 1
 clawe.de, 1
 clayandcottonkirkwood.com, 1
 claytoncondon.com, 1
 cldly.com, 1
 clearblueday.co.uk, 1
 clearchatsandbox.com, 1
 clearkonjac.com, 1
@@ -4772,16 +4775,17 @@ cloudbasedsite.com, 1
 cloudbleed.info, 1
 cloudbolin.es, 1
 cloudcaprice.net, 1
 cloudflareonazure.com, 1
 cloudia.org, 1
 cloudily.com, 1
 cloudlight.biz, 1
 cloudmigrator365.com, 1
+cloudopt.net, 1
 cloudoptimizedsmb.com, 1
 cloudoptimus.com, 1
 cloudpagesforwork.com, 1
 cloudpebble.net, 1
 cloudpengu.in, 1
 cloudpipes.com, 1
 cloudsecurityalliance.org, 1
 cloudservice.io, 1
@@ -5814,18 +5818,16 @@ danielehniss.de, 1
 danielepestilli.com, 1
 danielhochleitner.de, 1
 danieljamesscott.org, 1
 danieljireh.com, 1
 danielkoster.nl, 1
 danielkratz.com, 1
 danielmarquard.com, 1
 danielmoch.com, 1
-danielmostertman.com, 1
-danielmostertman.nl, 1
 danielrozenberg.com, 1
 danielsblog.org, 1
 danielschreurs.com, 1
 danielstach.cz, 1
 danielthompson.info, 1
 danieltollot.de, 1
 danielvoogsgerd.nl, 1
 danielzuzevich.com, 1
@@ -6343,16 +6345,18 @@ deviant.email, 1
 devillers-occasions.be, 1
 devilshakerz.com, 1
 deviltracks.net, 1
 devinfo.net, 0
 devisnow.fr, 1
 devistravaux.org, 1
 devjack.de, 1
 devkid.net, 1
+devkit.cc, 1
+devklog.net, 1
 devlamvzw.org, 1
 devlatron.net, 1
 devlogr.com, 1
 devlux.ch, 1
 devolution.ws, 1
 devonsawatzky.ca, 1
 devops-survey.com, 1
 devops.moe, 1
@@ -7431,16 +7435,17 @@ einar.io, 1
 einaros.is, 1
 einfachbahn.de, 1
 einfachmaldiefressehalten.de, 1
 einheft.info, 1
 einheizpreis.de, 1
 einmonolog.de, 1
 einsatzstellenverwaltung.de, 1
 einsatzstiefel.info, 1
+einsteinathome.org, 1
 eintageinzug.de, 1
 eintragsservice24.de, 1
 eipione.com, 1
 eirastudios.co.uk, 0
 eisaev.ru, 1
 eisp.it, 0
 eit-web.de, 0
 eitler.cx, 1
@@ -7688,16 +7693,17 @@ energy.eu, 1
 energyatlas.com, 1
 energyaupair.se, 1
 energydrinkblog.de, 1
 energyelephant.com, 1
 energyled.com.br, 1
 enersec.co.uk, 1
 enet-navigator.de, 1
 enfantsdelarue.ch, 1
+enfield-kitchens.co.uk, 1
 enfoqueseguro.com, 1
 enfu.se, 1
 engarde.net, 1
 engaugetools.com, 1
 engelundlicht.ch, 1
 engg.ca, 1
 engineowning.com, 1
 enginepit.com, 1
@@ -8141,17 +8147,16 @@ exactphilosophy.net, 1
 examenpilotos.com, 0
 example.sc, 1
 example.wf, 1
 exampleessays.com, 1
 exaplac.com, 1
 exceed.global, 1
 exceltobarcode.com, 1
 excessamerica.com, 1
-exchangecoordinator.com, 1
 exchangeworks.co, 1
 exe-boss.tech, 1
 exehack.net, 1
 exeintel.com, 1
 exekutori.com, 1
 exembit.com, 1
 exemples-de-stands.com, 1
 exeria.de, 1
@@ -8371,17 +8376,16 @@ faq.ie, 1
 faq.lookout.com, 0
 fara.gov, 1
 faraslot8.com, 1
 faraslot8.net, 1
 faretravel.co.uk, 1
 farfallapets.com.br, 1
 farfetchos.com, 1
 fargtorget.se, 1
-farhadexchange.com, 1
 farhood.org, 1
 farkas.bz, 1
 farm24.co.uk, 1
 farmacia.pt, 1
 farmaciaformula.com.br, 1
 farmacialaboratorio.it, 1
 farmer.dating, 1
 farmkazuto.com, 1
@@ -11439,17 +11443,16 @@ idemo.in, 1
 idensys.nl, 1
 identifyme.net, 1
 identity-hash.online, 1
 identitytheft.gov, 1
 idexxpublicationportal.com, 1
 idgard.de, 1
 idhosts.co.id, 1
 idid.tk, 1
-idinby.dk, 1
 idiopolis.org, 1
 idiotentruppe.de, 1
 idmanagement.gov, 1
 idmobile.co.uk, 1
 idndx.com, 1
 idoc24.com, 1
 idol-bikes.ru, 1
 idolf.dk, 1
@@ -11996,16 +11999,17 @@ ipcareers.net, 1
 ipcfg.me, 1
 ipconsulting.se, 1
 ipfirebox.de, 1
 ipfp.pl, 1
 ipfs.ink, 1
 iphoneunlock.nu, 1
 ipintel.io, 1
 iplabs.de, 1
+iplantom.com, 1
 ipleak.net, 1
 ipledgeonline.org, 0
 iplog.info, 1
 ipmotion.ca, 1
 ipo-times.com, 1
 ipokabu.net, 1
 ipomue.com, 0
 ipop.gr, 1
@@ -13017,17 +13021,16 @@ kantankye.nl, 1
 kantanmt.com, 1
 kantorad.io, 1
 kantorosobisty.pl, 1
 kanuvu.de, 1
 kanzashi.com, 1
 kanzlei-sixt.de, 1
 kap-genial.de, 1
 kapo.info, 1
-kappit.dk, 1
 kapseli.net, 1
 kaptadata.com, 1
 kaptamedia.com, 1
 karabas.com, 1
 karabijnhaken.nl, 0
 karachi.dating, 1
 karamna.com, 1
 karamomo.net, 1
@@ -13686,16 +13689,17 @@ ks-watch.de, 1
 kschv-rdeck.de, 1
 ksero.center, 1
 kshlm.in, 1
 ksukelife.com, 1
 kswcosmetics.com, 1
 ktbnetbank.com, 1
 kteen.info, 1
 kthnxbai.xyz, 1
+kts-thueringen.de, 1
 ktsee.eu.org, 1
 ktube.yt, 1
 ku.io, 1
 kualo.co.uk, 1
 kualo.com, 1
 kualo.in, 1
 kuaza.com, 1
 kub.hr, 1
@@ -14598,17 +14602,16 @@ locksport.org.nz, 1
 lockyourcomputer.pw, 1
 locomore.com, 1
 lodash.com, 0
 lodgesdureynou.fr, 1
 loenshotel.de, 1
 loforo.com, 1
 lofttravel.com, 1
 log.my, 0
-log2n.uk, 1
 logaldeveloper.com, 1
 loganmarchione.com, 1
 loganparkneighborhood.org, 1
 logbook.ch, 1
 logcat.info, 1
 logement-saisonnier.com, 1
 logentries.com, 0
 logfile.at, 1
@@ -15551,16 +15554,17 @@ mcynews.com, 1
 mcyukon.com, 1
 md5file.com, 1
 md5hashing.net, 1
 mdcloudpracticesolutions.com, 1
 mdcloudps.com, 1
 mdek.at, 1
 mdewendt.de, 1
 mdf-bis.com, 1
+mdkr.nl, 1
 mdma.net, 1
 mdmed.clinic, 1
 mdosch.de, 1
 mdpraha.cz, 1
 mdsave.com, 1
 mdwftw.com, 1
 mdx.no, 1
 mdxn.org, 1
@@ -16592,17 +16596,16 @@ musmann.io, 1
 muspla.com, 1
 muspla.com.br, 1
 musselsblog.com, 1
 mustard.co.uk, 1
 musthavesforreal.com, 1
 mutantmonkey.in, 1
 mutantmonkey.info, 1
 mutantmonkey.sexy, 1
-mutuals.cool, 1
 mutuelle.fr, 1
 muusikoiden.net, 1
 muwatenraqamy.org, 1
 muzeumkomiksu.eu, 1
 muzi.cz, 1
 mv-wohnen.de, 1
 mvbits.com, 1
 mvnet.com.br, 1
@@ -17410,17 +17413,16 @@ nikandcara.com, 1
 nikao-tech.com, 1
 nikavandenbos.nl, 1
 nikimix.com, 1
 nikkila.me, 1
 nikklassen.ca, 1
 nikksno.io, 1
 niklas.pw, 1
 niklasbabel.com, 1
-nikobradshaw.com, 1
 nikolaichik.photo, 1
 nikolasbradshaw.com, 1
 nikolasgrottendieck.com, 1
 nikomo.fi, 0
 nikz.in, 1
 nil.gs, 1
 nilrem.org, 1
 nimeshjm.com, 1
@@ -17537,17 +17539,16 @@ noob-box.net, 1
 noobunbox.net, 1
 noodles.net.nz, 1
 noodplan.co.za, 1
 noodweer.be, 1
 noop.ch, 1
 noordsee.de, 1
 noorsolidarity.com, 1
 nootropic.com, 1
-nootropicsource.com, 1
 nopaste.xyz, 1
 nord-sud.be, 1
 nordakademie.de, 1
 nordic-survival.de, 1
 nordiccasinocommunity.com, 1
 nordinfo.fi, 1
 nordnetz-hamburg.de, 1
 nordor.homeip.net, 1
@@ -18639,16 +18640,17 @@ pbcknd.ml, 1
 pbosquet.com, 1
 pbraunschdash.com, 1
 pbreen.co.uk, 1
 pbrumby.com, 1
 pbscreens.com, 1
 pbytes.com, 1
 pc-rescue.me, 1
 pc-tweak.de, 1
+pccentral.nl, 1
 pcel.com, 1
 pcf92.fr, 1
 pcfeuerwehr.de, 1
 pcforum.sk, 1
 pcgamingfreaks.at, 1
 pchelpforum.net, 1
 pciconcursos.com.br, 1
 pcipac.com, 1
@@ -19688,16 +19690,17 @@ proweser.de, 1
 prowise.com, 1
 proxybay.co, 1
 proxybay.eu.org, 1
 proxybay.la, 1
 proxybay.one, 1
 proxybay.tv, 1
 proxydesk.eu, 1
 proxyportal.me, 1
+proxyportal.org, 1
 proxyweb.us, 1
 proymaganadera.com, 1
 prstatic.com, 1
 prt.in.th, 1
 prtimes.com, 1
 prtpe.com, 1
 pruikshop.nl, 1
 prvikvadrat.hr, 1
@@ -20250,16 +20253,17 @@ recordeuropa.com, 0
 recoveringspirit.com, 1
 recreation.gov, 1
 recreoviral.com, 1
 recruitsecuritytraining.co.uk, 1
 recruitsecuritytraining.com, 1
 rectoraudiparts.com, 1
 recuerdafilms.com, 1
 recurly.com, 1
+recyclingpromotions.us, 1
 red-t-shirt.ru, 1
 redable.hosting, 1
 redable.nl, 1
 redair.es, 1
 redb.cz, 1
 redballoonsecurity.com, 1
 redburn.com, 1
 redcomet.org, 1
@@ -20896,16 +20900,17 @@ rs-devdemo.host, 1
 rsgcard.com, 1
 rsi.im, 0
 rsingermd.com, 1
 rsm-liga.de, 1
 rss.sh, 0
 rssr.se, 1
 rstraining.co.uk, 1
 rstsecuritygroup.co.uk, 1
+rsttraining.co.uk, 1
 rsvaachen.de, 1
 rsync.eu, 0
 rtate.ca, 1
 rtate.se, 1
 rtc.fun, 1
 rtcx.net, 1
 rtd.uk.com, 1
 rte.eu, 1
@@ -21924,16 +21929,17 @@ shanewadleigh.com, 1
 shang-yu.cn, 1
 shannoneichorn.com, 1
 shansing.cn, 1
 shansing.com, 1
 shansing.net, 1
 shansing.space, 1
 sharanyamunsi.net, 1
 sharedhost.de, 1
+shareeri.com, 1
 sharekey.com, 1
 shareoffice.ch, 1
 shareoine.com, 1
 sharepointdrive.com, 1
 sharescope.co.uk, 0
 shareselecttools.com, 1
 sharesplitter.com, 1
 sharevari.com, 1
@@ -21972,17 +21978,16 @@ sheratan.web.id, 1
 sherbers.de, 1
 shethbox.com, 1
 shevronpatriot.ru, 1
 sheying.tm, 1
 shft.cl, 1
 shgt.jp, 1
 shh-listen.com, 1
 shh.sh, 1
-shiatsu-institut.ch, 1
 shiawasedo.co.jp, 1
 shibainu.com.br, 1
 shichibukai.net, 1
 shieldofachilles.in, 1
 shift-to.co.jp, 1
 shiftdevices.com, 1
 shiftj.is, 1
 shiftleft.org, 1
@@ -22527,17 +22532,16 @@ smatch.com, 1
 smb445.com, 1
 smdavis.us, 1
 smdcn.net, 1
 sme-gmbh.net, 1
 smeetsengraas.com, 1
 smiatek.name, 1
 smileandpay.com, 1
 smileawei.com, 1
-smiledirectsales.com, 1
 smime.io, 1
 smipty.cn, 1
 smipty.com, 1
 smit.com.ua, 1
 smith.is, 1
 smithandcanova.co.uk, 1
 smkw.com, 0
 sml.lc, 1
@@ -23352,16 +23356,17 @@ strutta.me, 1
 struxureon.com, 1
 strydom.me.uk, 1
 stt.wiki, 1
 stuartbell.co.uk, 1
 stuco.co, 1
 studenckiemetody.pl, 1
 student-eshop.cz, 1
 student-eshop.sk, 1
+student.andover.edu, 1
 studentforums.biz, 1
 studentite.bg, 0
 studentloans.gov, 1
 studentrightsadvocate.org, 1
 studentshare.net, 1
 studenttenant.com, 1
 studer.su, 1
 studienportal.eu, 1
@@ -23700,16 +23705,17 @@ t2000headphones.com, 1
 t2000laserpointers.com, 1
 t23m-navi.jp, 0
 t2i.nl, 1
 t3rror.net, 1
 t7e.de, 0
 ta-65.com, 1
 ta-sports.net, 1
 ta65.com, 1
+taartenfeesies.nl, 1
 tab.watch, 1
 tabelfirme.ro, 1
 tabernadovinho.com.br, 1
 taberu-fujitsubo.com, 1
 tabithawebb.co.uk, 1
 tabla-periodica.com, 1
 tablescraps.com, 1
 tablet.facebook.com, 0
@@ -23725,16 +23731,17 @@ tadcastercircuit.org.uk, 1
 tadtadya.com, 1
 tadu.de, 1
 tagdocumentary.com, 1
 tagesmutter-in-bilm.de, 1
 taggedpdf.com, 1
 taglioepiega.com, 1
 taglioepiega.eu, 1
 taglioepiega.it, 1
+tahakomat.cz, 1
 tahf.net, 1
 tahosa.co, 1
 tahosalodge.org, 1
 taidu.news, 1
 tailpuff.net, 1
 tails.boum.org, 1
 taim.io, 1
 taishon.nagoya, 1
@@ -23828,17 +23835,16 @@ tateesq.com, 1
 tatiloley.com, 1
 tatort-fanpage.de, 1
 tatsidou.gr, 1
 tattoo.dating, 1
 tattvaayoga.com, 1
 tavolaquadrada.com.br, 1
 tavsys.net, 1
 taxaroo.com, 1
-taxi-24std.de, 1
 taxi-chamonix.fr, 1
 taxi-collectif.ch, 1
 taxicollectif.ch, 1
 taxis-collectifs.ch, 1
 taxisafmatosinhos.pt, 1
 taxiscollectifs.ch, 1
 taxlab.co.nz, 1
 taxmadras.com, 1
@@ -24161,17 +24167,17 @@ thai.dating, 1
 thai.land, 0
 thaianthro.com, 1
 thaicyberpoint.com, 1
 thaiforest.ch, 1
 thaigirls.xyz, 1
 thaihomecooking.com, 1
 thailandpharmacy.net, 1
 thailandpropertylisting.com, 1
-thaimooc.org, 1
+thaimooc.org, 0
 thairehabassociation.com, 1
 thajskyraj.com, 1
 thalan.fr, 1
 thalgott.net, 1
 thalhammer.it, 1
 thalskarth.com, 1
 thamesfamilydentistry.com, 1
 thanatoid.net, 1
@@ -24627,17 +24633,16 @@ tjs.me, 1
 tkacz.pro, 1
 tkarstens.de, 0
 tkat.ch, 1
 tkgpm.com, 1
 tkjg.fi, 1
 tkn.tokyo, 1
 tkts.cl, 1
 tkusano.jp, 1
-tlach.cz, 1
 tlehseasyads.com, 1
 tlo.xyz, 1
 tloxygen.com, 1
 tls.builders, 1
 tls.care, 1
 tls1914.org, 1
 tlsrobot.se, 1
 tlthings.net, 1
@@ -25036,17 +25041,16 @@ translate.stg.fedoraproject.org, 1
 translateblender.ru, 1
 translatoruk.co.uk, 1
 transmisjeonline.pl, 1
 transmithe.net, 1
 transparentcorp.com, 1
 transport.eu, 1
 transsexualpantyhose.com, 1
 transverify.com, 1
-trashnothing.com, 1
 trask.no, 1
 trauertexte.info, 1
 traumhuetten.de, 1
 traut.cloud, 1
 travador.com, 1
 travaux-toiture-idf.fr, 1
 travel-dealz.de, 1
 travel-to-nature.ch, 1
@@ -25620,16 +25624,17 @@ urban-culture.fr, 1
 urban.melbourne, 1
 urbanesecurity.com, 1
 urbanfi.sh, 1
 urbanguerillas.de, 1
 urbanietz-immobilien.de, 1
 urbanmelbourne.info, 1
 urbannewsservice.com, 1
 urbansparrow.in, 1
+urbanstylestaging.com, 1
 urbanwildlifealliance.org, 1
 urbexdk.nl, 1
 urcentral.com, 1
 urcentral.org, 1
 ureka.org, 1
 urgences-valais.ch, 1
 uripura.de, 1
 urist1011.ru, 1
@@ -25688,33 +25693,32 @@ utilitarian.org, 1
 utilitarianism.com, 1
 utilitarianism.org, 1
 utilitarismo.com, 1
 utilitronium.com, 1
 utilityapi.com, 1
 utitreatment.com, 1
 utonia.ch, 1
 utopialgb.org.uk, 1
-utopianconcept.com, 1
 utopians.dk, 1
 utopicestudios.com, 1
 utox.io, 1
+uttnetgroup.fr, 0
 utugnn.ru, 1
 utw.me, 1
 uvocorp.com, 1
 uwesander.de, 1
 uwfreelanceopticien.nl, 1
 uwimonacs.org.jm, 1
 uygindir.ml, 1
 v-u-z.ru, 1
 v12.co.uk, 1
 v1sit0r.ru, 1
 v2bv.win, 1
 v2ex.com, 1
-v4s.ro, 1
 va-reitartikel.com, 1
 vaaddress.co, 1
 vacationscostarica.com, 1
 vaccines.gov, 1
 vaclavambroz.cz, 1
 vacuumpump.co.id, 1
 vacuumreviewcenter.com, 1
 vadennissanofhiltonheadparts.com, 1
@@ -25772,16 +25776,17 @@ vancouvercosmeticsurgery.ca, 1
 vandalfsen.me, 1
 vandam.io, 1
 vandenbroeck-usedcars.be, 1
 vandeput.be, 1
 vanderkrieken.org, 1
 vandermeer.frl, 1
 vanderrijt.nl, 1
 vanderziel.org, 1
+vanessabalibridal.com, 1
 vangeluwedeberlaere.be, 1
 vanhoudt-usedcars.be, 1
 vanhoutte.be, 0
 vanhove.biz, 1
 vanlaanen.com, 1
 vanmalland.com, 1
 vannaos.com, 1
 vannaos.net, 1
@@ -26061,16 +26066,17 @@ viridis-milites.cz, 1
 virtualdesignmedia.com, 0
 virtuallifestyle.nl, 1
 virtualsanity.com, 1
 virtualvaults.com, 1
 virtubox.net, 1
 virtusaero.com, 1
 visa-shinsei.com, 1
 visaexpert.co.za, 1
+visalogy.com, 1
 visaop.com, 1
 visapourailleurs.fr, 1
 visaya.com.co, 1
 viscoelastico.com.br, 1
 viscopic.com, 1
 vishwashantiyoga.com, 1
 visibox.nl, 1
 visikom.de, 1
@@ -26192,17 +26198,17 @@ vop.li, 1
 vorderklier.de, 1
 vorkbaard.nl, 1
 vorlicek.de, 1
 vorlif.org, 1
 vorm2.com, 1
 vorodevops.com, 1
 vos-fleurs.ch, 1
 vos-fleurs.com, 1
-voshod.org, 0
+voshod.org, 1
 vosky.fr, 1
 vostronet.com, 1
 voter-info.uk, 1
 voterstartingpoint.uk, 1
 votocek.cz, 1
 votockova.cz, 1
 votoot.com, 1
 votre-site-internet.ch, 1
@@ -26287,17 +26293,16 @@ wabatam.com, 1
 wabifoggynuts.com, 1
 wachter.biz, 1
 wadidi.com, 1
 wadsworth.gallery, 1
 wadvisor.com, 1
 waelisch.de, 1
 waelti.xxx, 1
 wafa4hw.com, 1
-wafairhaven.com.au, 1
 waffle.at, 1
 wafni.com, 1
 wahidhasan.com, 1
 wahlman.org, 1
 wahrnehmungswelt.de, 1
 wahrnehmungswelten.de, 1
 wai-in.com, 1
 waigel.org, 1
@@ -26861,16 +26866,17 @@ winter.engineering, 0
 winterbergwebcams.com, 1
 wintercircle.co, 1
 winterfeldt.de, 1
 winterhillbank.com, 1
 wintermeyer-consulting.de, 1
 wintermeyer.de, 1
 winterschoen.nl, 1
 wintodoor.com, 1
+wipc.net, 1
 wipply.com, 0
 wir-bewegen.sh, 1
 wirbatz.org, 1
 wircon-int.net, 1
 wiredcut.com, 1
 wireframesoftware.com, 1
 wireheading.com, 1
 wireless-emergency-stop.com, 1
@@ -27794,17 +27800,16 @@ zamis.net, 1
 zamocosmeticos.com.br, 1
 zamow.co, 1
 zandcell.com, 1
 zanthra.com, 1
 zapier.com, 1
 zappbuildapps.com, 1
 zaratan.fr, 1
 zarmarket.org, 1
-zary.me, 1
 zaufanatrzeciastrona.pl, 1
 zavetaji.lv, 1
 zawo-electric.de, 1
 zbasenem.pl, 1
 zbchen.com, 1
 zberger.com, 1
 zbetcheck.in, 1
 zbp.at, 0
@@ -27877,17 +27882,16 @@ zevelev.net, 1
 zewtie.com, 1
 zfast.com.br, 1
 zfly.me, 1
 zfo.gg, 1
 zfree.co.nz, 1
 zgrep.org, 1
 zhang-hao.com, 1
 zhangfangzhou.com, 1
-zhangge.net, 1
 zhanghao.me, 1
 zhangsidan.com, 1
 zhangsir.net, 1
 zhangyuhao.com, 1
 zhangzifan.com, 1
 zhaochen.xyz, 1
 zhaofeng.li, 1
 zhaoxixiangban.cc, 1
@@ -27942,16 +27946,17 @@ zobraz.cz, 1
 zoeller.me, 1
 zohar.shop, 1
 zohar.wang, 0
 zoigl.club, 1
 zojadravai.com, 1
 zoki.art, 1
 zokster.net, 1
 zolokar.xyz, 1
+zolotoy-standart.com.ua, 1
 zombiesecured.com, 1
 zomerschoen.nl, 1
 zone-produkte.de, 1
 zone39.com, 1
 zonecb.com, 1
 zonemaster.fr, 1
 zonemaster.net, 1
 zonesec.org, 1
--- a/security/sandbox/linux/broker/SandboxBrokerPolicyFactory.cpp
+++ b/security/sandbox/linux/broker/SandboxBrokerPolicyFactory.cpp
@@ -76,16 +76,17 @@ AddMesaSysfsPaths(SandboxBroker::Policy*
             if (realSysPath) {
               nsPrintfCString ueventPath("%s/uevent", realSysPath.get());
               aPolicy->AddPath(rdonly, ueventPath.get());
             }
           }
         }
       }
     }
+    closedir(dir);
   }
 }
 
 SandboxBrokerPolicyFactory::SandboxBrokerPolicyFactory()
 {
   // Policy entries that are the same in every process go here, and
   // are cached over the lifetime of the factory.
 #if defined(MOZ_CONTENT_SANDBOX)
--- a/services/sync/modules/engines.js
+++ b/services/sync/modules/engines.js
@@ -885,20 +885,22 @@ SyncEngine.prototype = {
   set toFetch(val) {
     // Coerce the array to a string for more efficient comparison.
     if (val + "" == this._toFetch) {
       return;
     }
     this._toFetch = val;
     CommonUtils.namedTimer(function() {
       try {
-        Async.promiseSpinningly(Utils.jsonSave("toFetch/" + this.name, this, val));
+        Async.promiseSpinningly(Utils.jsonSave("toFetch/" + this.name, this, this._toFetch));
       } catch (error) {
         this._log.error("Failed to read JSON records to fetch", error);
       }
+      // Notify our tests that we finished writing the file.
+      Observers.notify("sync-testing:file-saved:toFetch", null, this.name);
     }, 0, this, "_toFetchDelay");
   },
 
   async loadToFetch() {
     // Initialize to empty if there's no file.
     this._toFetch = [];
     let toFetch = await Utils.jsonLoad("toFetch/" + this.name, this);
     if (toFetch) {
@@ -911,21 +913,25 @@ SyncEngine.prototype = {
   },
   set previousFailed(val) {
     // Coerce the array to a string for more efficient comparison.
     if (val + "" == this._previousFailed) {
       return;
     }
     this._previousFailed = val;
     CommonUtils.namedTimer(function() {
-      Utils.jsonSave("failed/" + this.name, this, val).then(() => {
+      Utils.jsonSave("failed/" + this.name, this, this._previousFailed).then(() => {
         this._log.debug("Successfully wrote previousFailed.");
       })
       .catch((error) => {
         this._log.error("Failed to set previousFailed", error);
+      })
+      .then(() => {
+        // Notify our tests that we finished writing the file.
+        Observers.notify("sync-testing:file-saved:previousFailed", null, this.name);
       });
     }, 0, this, "_previousFailedDelay");
   },
 
   async loadPreviousFailed() {
     // Initialize to empty if there's no file
     this._previousFailed = [];
     let previousFailed = await Utils.jsonLoad("failed/" + this.name, this);
--- a/services/sync/tests/unit/test_syncengine.js
+++ b/services/sync/tests/unit/test_syncengine.js
@@ -88,23 +88,39 @@ add_task(async function test_toFetch() {
   const filename = "weave/toFetch/steam.json";
   let engine = await makeSteamEngine();
   try {
     // Ensure pristine environment
     do_check_eq(engine.toFetch.length, 0);
 
     // Write file to disk
     let toFetch = [Utils.makeGUID(), Utils.makeGUID(), Utils.makeGUID()];
+    let wrotePromise = promiseOneObserver("sync-testing:file-saved:toFetch");
     engine.toFetch = toFetch;
     do_check_eq(engine.toFetch, toFetch);
     // toFetch is written asynchronously
-    await Async.promiseYield();
+    await wrotePromise;
     let fakefile = syncTesting.fakeFilesystem.fakeContents[filename];
     do_check_eq(fakefile, JSON.stringify(toFetch));
 
+    // Make sure it work for consecutive writes before the callback is executed.
+    toFetch = [Utils.makeGUID(), Utils.makeGUID(), Utils.makeGUID(), Utils.makeGUID()];
+    let toFetch2 = [Utils.makeGUID(), Utils.makeGUID(), Utils.makeGUID(), Utils.makeGUID(), Utils.makeGUID()];
+    wrotePromise = promiseOneObserver("sync-testing:file-saved:toFetch");
+
+    engine.toFetch = toFetch;
+    do_check_eq(engine.toFetch, toFetch);
+
+    engine.toFetch = toFetch2;
+    do_check_eq(engine.toFetch, toFetch2);
+    // Note that do to the way CommonUtils.namedTimer works, we won't get a 2nd callback.
+    await wrotePromise;
+    fakefile = syncTesting.fakeFilesystem.fakeContents[filename];
+    do_check_eq(fakefile, JSON.stringify(toFetch2));
+
     // Read file from disk
     toFetch = [Utils.makeGUID(), Utils.makeGUID()];
     syncTesting.fakeFilesystem.fakeContents[filename] = JSON.stringify(toFetch);
     await engine.loadToFetch();
     do_check_eq(engine.toFetch.length, 2);
     do_check_eq(engine.toFetch[0], toFetch[0]);
     do_check_eq(engine.toFetch[1], toFetch[1]);
   } finally {
@@ -118,23 +134,39 @@ add_task(async function test_previousFai
   const filename = "weave/failed/steam.json";
   let engine = await makeSteamEngine();
   try {
     // Ensure pristine environment
     do_check_eq(engine.previousFailed.length, 0);
 
     // Write file to disk
     let previousFailed = [Utils.makeGUID(), Utils.makeGUID(), Utils.makeGUID()];
+    let wrotePromise = promiseOneObserver("sync-testing:file-saved:previousFailed");
     engine.previousFailed = previousFailed;
     do_check_eq(engine.previousFailed, previousFailed);
     // previousFailed is written asynchronously
-    await Async.promiseYield();
+    await wrotePromise;
     let fakefile = syncTesting.fakeFilesystem.fakeContents[filename];
     do_check_eq(fakefile, JSON.stringify(previousFailed));
 
+    // Make sure it work for consecutive writes before the callback is executed.
+    previousFailed = [Utils.makeGUID(), Utils.makeGUID(), Utils.makeGUID(), Utils.makeGUID()];
+    let previousFailed2 = [Utils.makeGUID(), Utils.makeGUID(), Utils.makeGUID(), Utils.makeGUID(), Utils.makeGUID()];
+    wrotePromise = promiseOneObserver("sync-testing:file-saved:previousFailed");
+
+    engine.previousFailed = previousFailed;
+    do_check_eq(engine.previousFailed, previousFailed);
+
+    engine.previousFailed = previousFailed2;
+    do_check_eq(engine.previousFailed, previousFailed2);
+    // Note that do to the way CommonUtils.namedTimer works, we're only notified once.
+    await wrotePromise;
+    fakefile = syncTesting.fakeFilesystem.fakeContents[filename];
+    do_check_eq(fakefile, JSON.stringify(previousFailed2));
+
     // Read file from disk
     previousFailed = [Utils.makeGUID(), Utils.makeGUID()];
     syncTesting.fakeFilesystem.fakeContents[filename] = JSON.stringify(previousFailed);
     await engine.loadPreviousFailed();
     do_check_eq(engine.previousFailed.length, 2);
     do_check_eq(engine.previousFailed[0], previousFailed[0]);
     do_check_eq(engine.previousFailed[1], previousFailed[1]);
   } finally {
--- a/servo/Cargo.lock
+++ b/servo/Cargo.lock
@@ -1118,17 +1118,17 @@ dependencies = [
  "style 0.0.1",
  "style_traits 0.0.1",
  "time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
  "truetype 0.26.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-bidi 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-script 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "webrender_api 0.52.0 (git+https://github.com/servo/webrender)",
  "xi-unicode 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "xml5ever 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "xml5ever 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "gfx_tests"
 version = "0.0.1"
 dependencies = [
  "cssparser 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "gfx 0.0.1",
@@ -1281,22 +1281,22 @@ source = "registry+https://github.com/ru
 dependencies = [
  "cmake 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)",
  "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "html5ever"
-version = "0.19.0"
+version = "0.20.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "markup5ever 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "markup5ever 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "httparse"
 version = "1.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1505,17 +1505,17 @@ dependencies = [
  "atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "canvas_traits 0.0.1",
  "euclid 0.15.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "gfx 0.0.1",
  "gfx_traits 0.0.1",
  "heapsize 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "html5ever 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "html5ever 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "ipc-channel 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "msg 0.0.1",
  "net_traits 0.0.1",
  "ordered-float 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "profile_traits 0.0.1",
@@ -1553,17 +1553,17 @@ version = "0.0.1"
 dependencies = [
  "app_units 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.15.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "gfx 0.0.1",
  "gfx_traits 0.0.1",
  "heapsize 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "html5ever 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "html5ever 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "ipc-channel 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "layout 0.0.1",
  "layout_traits 0.0.1",
  "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "metrics 0.0.1",
  "msg 0.0.1",
  "net_traits 0.0.1",
@@ -1748,17 +1748,17 @@ version = "0.0.1"
 dependencies = [
  "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
  "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
  "synstructure 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "markup5ever"
-version = "0.4.0"
+version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "heapsize 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
  "phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
  "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)",
  "string_cache 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2598,17 +2598,17 @@ dependencies = [
  "domobject_derive 0.0.1",
  "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.15.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "gleam 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "half 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "html5ever 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "html5ever 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)",
  "hyper_serde 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "image 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "ipc-channel 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "js 0.1.6 (git+https://github.com/servo/rust-mozjs)",
  "jstraceable_derive 0.0.1",
  "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2649,32 +2649,32 @@ dependencies = [
  "time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
  "tinyfiledialogs 2.5.9 (registry+https://github.com/rust-lang/crates.io-index)",
  "unicode-segmentation 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "url 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "utf-8 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "uuid 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "webrender_api 0.52.0 (git+https://github.com/servo/webrender)",
  "webvr_traits 0.0.1",
- "xml5ever 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "xml5ever 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "script_layout_interface"
 version = "0.0.1"
 dependencies = [
  "app_units 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "canvas_traits 0.0.1",
  "cssparser 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.15.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "gfx_traits 0.0.1",
  "heapsize 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "html5ever 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "html5ever 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "ipc-channel 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "metrics 0.0.1",
  "msg 0.0.1",
  "net_traits 0.0.1",
  "profile_traits 0.0.1",
  "range 0.0.1",
@@ -3145,17 +3145,17 @@ dependencies = [
  "cssparser 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.15.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "fallible 0.0.1",
  "fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "hashglobe 0.1.0",
  "heapsize 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
- "html5ever 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "html5ever 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)",
  "itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "lru_cache 0.0.1",
  "malloc_size_of 0.0.1",
  "malloc_size_of_derive 0.0.1",
@@ -3201,17 +3201,17 @@ dependencies = [
 [[package]]
 name = "style_tests"
 version = "0.0.1"
 dependencies = [
  "app_units 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "cssparser 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.15.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "html5ever 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "html5ever 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)",
  "selectors 0.19.0",
  "servo_arc 0.0.1",
  "servo_atoms 0.0.1",
  "servo_config 0.0.1",
  "servo_url 0.0.1",
@@ -3229,16 +3229,17 @@ dependencies = [
  "cssparser 0.21.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.15.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "malloc_size_of 0.0.1",
  "malloc_size_of_derive 0.0.1",
  "selectors 0.19.0",
  "serde 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)",
+ "servo_arc 0.0.1",
  "servo_atoms 0.0.1",
  "webrender_api 0.52.0 (git+https://github.com/servo/webrender)",
 ]
 
 [[package]]
 name = "stylo_tests"
 version = "0.0.1"
 dependencies = [
@@ -3763,22 +3764,22 @@ name = "xml-rs"
 version = "0.3.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "xml5ever"
-version = "0.9.0"
+version = "0.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
  "mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "markup5ever 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "markup5ever 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "time 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [metadata]
 "checksum adler32 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3ff33fe13a08dbce05bcefa2c68eea4844941437e33d6f808240b54d7157b9cd"
 "checksum aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "500909c4f87a9e52355b26626d890833e9e1d53ac566db76c36faa984b889699"
 "checksum alloc-no-stdlib 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b21f6ad9c9957eb5d70c3dee16d31c092b3cab339628f821766b05e6833d72b8"
 "checksum android_glue 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d8289e9637439939cc92b1995b0972117905be88bc28116c86b64d6e589bcd38"
@@ -3886,17 +3887,17 @@ dependencies = [
 "checksum glx 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b280007fa9c7442cfd1e0b1addb8d1a59240267110e8705f8f7e2c7bfb7e2f72"
 "checksum gvr-sys 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e84ba5e13cd925de87b669475525f956f8e936e67ddb24fbb1a077d96bbe174c"
 "checksum half 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "63d68db75012a85555434ee079e7e6337931f87a087ab2988becbadf64673a7f"
 "checksum harfbuzz-sys 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "a2caaa66078fdfacea32db1351223697a1167ad2d4bbee6b8d4ca220ce5b10b3"
 "checksum heapsize 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4c7593b1522161003928c959c20a2ca421c68e940d63d75573316a009e48a6d4"
 "checksum heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "46f96d52fb1564059fc97b85ef6165728cc30198ab60073bf114c66c4c89bb5d"
 "checksum heartbeats-simple 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9ad003ce233955e9d95f2c69cde84e68302ba9ba4a673d351c9bff93c738aadc"
 "checksum heartbeats-simple-sys 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e1a408c0011427cc0e0049f7861c70377819aedfc006e8c901b1c70fd98fb1a4"
-"checksum html5ever 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6ba0806f17ce2ea657c67cd28d03941166638c05153fb644aac6d5156b3033d0"
+"checksum html5ever 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5bfb46978eb757a603b7dfe2dafb1c62cb4dee3428d8ac1de734d83d6b022d06"
 "checksum httparse 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a6e7a63e511f9edffbab707141fbb8707d1a3098615fb2adbd5769cdfcc9b17d"
 "checksum hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)" = "368cb56b2740ebf4230520e2b90ebb0461e69034d85d1945febd9b3971426db2"
 "checksum hyper-openssl 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "85a372eb692590b3fe014c196c30f9f52d4c42f58cd49dd94caeee1593c9cc37"
 "checksum hyper_serde 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cbe43f514f80494e9329c9fc47d61b85b167d245685424637a0f4a409177e444"
 "checksum ident_case 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c9826188e666f2ed92071d2dadef6edc430b11b158b5b2b3f4babbcc891eaaa"
 "checksum idna 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2233d4940b1f19f0418c158509cd7396b8d70a5db5705ce410914dc8fa603b37"
 "checksum image 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d61d2b3f000fb41d268312b92d4dd5ee7823163ceee71a67c676271585dfe598"
 "checksum immeta 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0b9260463a221bfe3f02100c56e2d14c050d5ffe7e44a43d0a1b2b1f2b523502"
@@ -3919,17 +3920,17 @@ dependencies = [
 "checksum len-trait 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "723558ab8acaa07cb831b424cd164b587ddc1648b34748a30953c404e9a4a65b"
 "checksum libc 0.2.23 (registry+https://github.com/rust-lang/crates.io-index)" = "e7eb6b826bfc1fdea7935d46556250d1799b7fe2d9f7951071f4291710665e3e"
 "checksum libloading 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "be99f814beb3e9503a786a592c909692bb6d4fc5a695f6ed7987223acfbd5194"
 "checksum libz-sys 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)" = "3fdd64ef8ee652185674455c1d450b83cbc8ad895625d543b5324d923f82e4d8"
 "checksum log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "880f77541efa6e5cc74e76910c9884d9859683118839d6a1dc3b11e63512565b"
 "checksum lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d947cbb889ed21c2a84be6ffbaebf5b4e0f4340638cba0444907e38b56be084"
 "checksum mac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
 "checksum malloc_buf 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
-"checksum markup5ever 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8c787ec52b50a2ee0f15db7c18e628528964f71e113ceb864177abe866d169c9"
+"checksum markup5ever 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "047150a0e03b57e638fc45af33a0b63a0362305d5b9f92ecef81df472a4cceb0"
 "checksum matches 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "efd7622e3022e1a6eaa602c4cea8912254e5582c9c692e9167714182244801b1"
 "checksum memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1dbccc0e46f1ea47b9f17e6d67c5a96bd27030519c519c9c91327e31275a47b4"
 "checksum metadeps 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "829fffe7ea1d747e23f64be972991bc516b2f1ac2ae4a3b33d8bea150c410151"
 "checksum mime 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9d69889cdc6336ed56b174514ce876c4c3dc564cc23dd872e7bca589bb2a36c8"
 "checksum mime_guess 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "76da6df85047af8c0edfa53f48eb1073012ce1cc95c8fedc0a374f659a89dd65"
 "checksum miniz-sys 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "28eaee17666671fa872e567547e8428e83308ebe5808cdf6a0e28397dbe2c726"
 "checksum mio 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9e965267d4d58496fc4f740e9861118367f13570cadf66316ed2c3f2f14d87c7"
 "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
@@ -4076,9 +4077,9 @@ dependencies = [
 "checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
 "checksum x11 2.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "db27c597c187da52194a4b8232e7d869503911aab9ff726fefb76d7a830f78ed"
 "checksum x11-clipboard 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "731230b8edcbb9d99247105e4c9ec0a538594d50ad68d2afa8662195f9db2973"
 "checksum x11-dl 2.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "326c500cdc166fd7c70dd8c8a829cd5c0ce7be5a5d98c25817de2b9bdc67faf8"
 "checksum xcb 0.7.7 (registry+https://github.com/rust-lang/crates.io-index)" = "7cede38417fcdf2f0a9d8abf1cea1c1b066320a8a316e9583a0d717c334fafb2"
 "checksum xdg 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a66b7c2281ebde13cf4391d70d4c7e5946c3c25e72a7b859ca8f677dcd0b0c61"
 "checksum xi-unicode 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "12ea8eda4b1eb72f02d148402e23832d56a33f55d8c1b2d5bcdde91d79d47cb1"
 "checksum xml-rs 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7ec6c39eaa68382c8e31e35239402c0a9489d4141a8ceb0c716099a0b515b562"
-"checksum xml5ever 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05d24ca1124fc3e7112b10d1979b5054bf599fcd9327da36dace83f1652d110f"
+"checksum xml5ever 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "96c7cd8dc08b951f7b42d88c1b9e7aaedacddb82f815f83f554b9f354190e1f8"
--- a/servo/components/gfx/Cargo.toml
+++ b/servo/components/gfx/Cargo.toml
@@ -50,16 +50,16 @@ core-text = "7.0"
 
 [target.'cfg(any(target_os = "linux", target_os = "android"))'.dependencies]
 freetype = "0.3"
 
 [target.'cfg(target_os = "linux")'.dependencies]
 servo-fontconfig = "0.2.1"
 
 [target.'cfg(target_os = "android")'.dependencies]
-xml5ever = {version = "0.9"}
+xml5ever = {version = "0.10"}
 
 [target.'cfg(any(target_feature = "sse2", target_feature = "neon"))'.dependencies]
 simd = "0.2.0"
 
 [target.'cfg(target_os = "windows")'.dependencies]
 dwrote = "0.4"
 truetype = "0.26"
--- a/servo/components/hashglobe/src/table.rs
+++ b/servo/components/hashglobe/src/table.rs
@@ -38,17 +38,17 @@ const EMPTY: usize = 1;
 /// to expose a boolean tag.
 /// Note: when the pointer is initialized to EMPTY `.ptr()` will return
 /// null and the tag functions shouldn't be used.
 struct TaggedHashUintPtr(Unique<HashUint>);
 
 impl TaggedHashUintPtr {
     #[inline]
     unsafe fn new(ptr: *mut HashUint) -> Self {
-        debug_assert!(ptr as usize & 1 == 0 || ptr as usize == EMPTY as usize);
+        assert!(ptr as usize & 1 == 0 || ptr as usize == EMPTY as usize);
         TaggedHashUintPtr(Unique::new_unchecked(ptr))
     }
 
     #[inline]
     fn set_tag(&mut self, value: bool) {
         let mut usize_ptr = self.0.as_ptr() as usize;
         unsafe {
             if value {
@@ -112,16 +112,17 @@ impl TaggedHashUintPtr {
 ///
 /// The hashtable also exposes a special boolean tag. The tag defaults to false
 /// when the RawTable is created and is accessible with the `tag` and `set_tag`
 /// functions.
 pub struct RawTable<K, V> {
     capacity_mask: usize,
     size: usize,
     hashes: TaggedHashUintPtr,
+    bytes_allocated: usize,
 
     // Because K/V do not appear directly in any of the types in the struct,
     // inform rustc that in fact instances of K and V are reachable from here.
     marker: marker::PhantomData<(K, V)>,
 }
 
 unsafe impl<K: Send, V: Send> Send for RawTable<K, V> {}
 unsafe impl<K: Sync, V: Sync> Sync for RawTable<K, V> {}
@@ -240,16 +241,25 @@ impl<K, V> RawBucket<K, V> {
         self.hash_start.offset(self.idx as isize)
     }
     unsafe fn pair(&self) -> *mut (K, V) {
         self.pair_start.offset(self.idx as isize) as *mut (K, V)
     }
     unsafe fn hash_pair(&self) -> (*mut HashUint, *mut (K, V)) {
         (self.hash(), self.pair())
     }
+
+    fn assert_bounds(&self, bytes_allocated: usize) {
+        let base = self.hash_start as *mut u8;
+        let (h, p) = unsafe { self.hash_pair() };
+        assert!((h as *mut u8) < (p as *mut u8), "HashMap Corruption - hash offset not below pair offset");
+        let end = unsafe { p.offset(1) } as *mut u8;
+        assert!(end > base, "HashMap Corruption - end={:?}, base={:?}", end, base);
+        assert!(end <= unsafe { base.offset(bytes_allocated as isize) }, "HashMap Corruption - end={:?}, base={:?}", end, base);
+    }
 }
 
 // Buckets hold references to the table.
 impl<K, V, M> FullBucket<K, V, M> {
     /// Borrow a reference to the table.
     pub fn table(&self) -> &M {
         &self.table
     }
@@ -343,18 +353,17 @@ impl<K, V, M: Deref<Target = RawTable<K,
             raw: r,
             table: t,
         }
     }
 
     pub fn at_index(table: M, ib_index: usize) -> Bucket<K, V, M> {
         // if capacity is 0, then the RawBucket will be populated with bogus pointers.
         // This is an uncommon case though, so avoid it in release builds.
-        debug_assert!(table.capacity() > 0,
-                      "Table should have capacity at this point");
+        assert!(table.capacity() > 0, "HashMap Corruption - Table should have capacity at this point");
         let ib_index = ib_index & table.capacity_mask;
         Bucket {
             raw: table.raw_bucket_at(ib_index),
             table,
         }
     }
 
     pub fn first(table: M) -> Bucket<K, V, M> {
@@ -417,21 +426,23 @@ impl<K, V, M: Deref<Target = RawTable<K,
                 })
             }
         }
     }
 
     /// Modifies the bucket in place to make it point to the next slot.
     pub fn next(&mut self) {
         self.raw.idx = self.raw.idx.wrapping_add(1) & self.table.capacity_mask;
+        self.raw.assert_bounds(self.table.bytes_allocated);
     }
 
     /// Modifies the bucket in place to make it point to the previous slot.
     pub fn prev(&mut self) {
         self.raw.idx = self.raw.idx.wrapping_sub(1) & self.table.capacity_mask;
+        self.raw.assert_bounds(self.table.bytes_allocated);
     }
 }
 
 impl<K, V, M: Deref<Target = RawTable<K, V>>> EmptyBucket<K, V, M> {
     #[inline]
     pub fn next(self) -> Bucket<K, V, M> {
         let mut bucket = self.into_bucket();
         bucket.next();
@@ -544,17 +555,17 @@ impl<K, V, M: Deref<Target = RawTable<K,
 // implements `DerefMut` to prevent fn `take` from being called on `stash`ed
 // buckets.
 impl<'t, K, V> FullBucket<K, V, &'t mut RawTable<K, V>> {
     /// Removes this bucket's key and value from the hashtable.
     ///
     /// This works similarly to `put`, building an `EmptyBucket` out of the
     /// taken bucket.
     pub fn take(self) -> (EmptyBucket<K, V, &'t mut RawTable<K, V>>, K, V) {
-        self.table.size -= 1;
+        self.table.size = self.table.size.checked_sub(1).unwrap();
 
         unsafe {
             *self.raw.hash() = EMPTY_BUCKET;
             let (k, v) = ptr::read(self.raw.pair());
             (EmptyBucket {
                  raw: self.raw,
                  table: self.table,
              },
@@ -659,17 +670,17 @@ impl<K, V, M> GapThenFull<K, V, M>
 /// Rounds up to a multiple of a power of two. Returns the closest multiple
 /// of `target_alignment` that is higher or equal to `unrounded`.
 ///
 /// # Panics
 ///
 /// Panics if `target_alignment` is not a power of two.
 #[inline]
 fn round_up_to_next(unrounded: usize, target_alignment: usize) -> usize {
-    assert!(target_alignment.is_power_of_two());
+    assert!(target_alignment.is_power_of_two(), "HashMap Corruption - alignment not power of two");
     (unrounded + target_alignment - 1) & !(target_alignment - 1)
 }
 
 #[test]
 fn test_rounding() {
     assert_eq!(round_up_to_next(0, 4), 0);
     assert_eq!(round_up_to_next(1, 4), 4);
     assert_eq!(round_up_to_next(2, 4), 4);
@@ -729,19 +740,21 @@ impl<K, V> RawTable<K, V> {
     /// Does not initialize the buckets. The caller should ensure they,
     /// at the very least, set every hash to EMPTY_BUCKET.
     unsafe fn try_new_uninitialized(capacity: usize) -> Result<RawTable<K, V>, FailedAllocationError> {
         if capacity == 0 {
             return Ok(RawTable {
                 size: 0,
                 capacity_mask: capacity.wrapping_sub(1),
                 hashes: TaggedHashUintPtr::new(EMPTY as *mut HashUint),
+                bytes_allocated: 0,
                 marker: marker::PhantomData,
             });
         }
+        assert!(capacity.is_power_of_two(), "HashMap Corruption - capacity not power of two");
 
         // No need for `checked_mul` before a more restrictive check performed
         // later in this method.
         let hashes_size = capacity.wrapping_mul(size_of::<HashUint>());
         let pairs_size = capacity.wrapping_mul(size_of::<(K, V)>());
 
         // Allocating hashmaps is a little tricky. We need to allocate two
         // arrays, but since we know their sizes and alignments up front,
@@ -783,42 +796,50 @@ impl<K, V> RawTable<K, V> {
             
             return Err(FailedAllocationError { reason: "out of memory when allocating RawTable" });
         }
 
         // FORK NOTE: poison the entire buffer rather than leaving it uninitialized.
         ptr::write_bytes(buffer, 0xe7, size);
 
         let hashes = buffer.offset(hash_offset as isize) as *mut HashUint;
+        assert!(hashes as *mut u8 == buffer, "HashMap Corruption - Nonzero hash_offset");
 
         Ok(RawTable {
             capacity_mask: capacity.wrapping_sub(1),
             size: 0,
             hashes: TaggedHashUintPtr::new(hashes),
+            bytes_allocated: size,
             marker: marker::PhantomData,
         })
     }
 
     fn raw_bucket_at(&self, index: usize) -> RawBucket<K, V> {
         let hashes_size = self.capacity() * size_of::<HashUint>();
         let pairs_size = self.capacity() * size_of::<(K, V)>();
 
         let (pairs_offset, _, oflo) =
             calculate_offsets(hashes_size, pairs_size, align_of::<(K, V)>());
-        debug_assert!(!oflo, "capacity overflow");
+        assert!(!oflo, "HashMap Corruption - capacity overflow");
+        assert!(pairs_offset as isize > 0, "HashMap Corruption - pairs offset={}", pairs_offset);
+        assert!(index as isize >= 0, "HashMap Corruption - index={}", index);
+        assert!(index < self.capacity(), "HashMap Corruption - index={}", index);
 
         let buffer = self.hashes.ptr() as *mut u8;
-        unsafe {
+        let bucket = unsafe {
             RawBucket {
                 hash_start: buffer as *mut HashUint,
                 pair_start: buffer.offset(pairs_offset as isize) as *const (K, V),
                 idx: index,
                 _marker: marker::PhantomData,
             }
-        }
+        };
+
+        bucket.assert_bounds(self.bytes_allocated);
+        bucket
     }
 
     /// Returns a raw pointer to the table's buffer.
     #[inline]
     pub fn raw_buffer(&self) -> *const u8 {
         self.hashes.ptr() as *const u8
     }
 
@@ -840,18 +861,19 @@ impl<K, V> RawTable<K, V> {
     /// The number of elements ever `put` in the hashtable, minus the number
     /// of elements ever `take`n.
     pub fn size(&self) -> usize {
         self.size
     }
 
     fn raw_buckets(&self) -> RawBuckets<K, V> {
         RawBuckets {
-            raw: self.raw_bucket_at(0),
+            raw: if self.capacity() == 0 { None } else { Some(self.raw_bucket_at(0)) },
             elems_left: self.size,
+            bytes_allocated: self.bytes_allocated,
             marker: marker::PhantomData,
         }
     }
 
     pub fn iter(&self) -> Iter<K, V> {
         Iter {
             iter: self.raw_buckets(),
         }
@@ -860,57 +882,63 @@ impl<K, V> RawTable<K, V> {
     pub fn iter_mut(&mut self) -> IterMut<K, V> {
         IterMut {
             iter: self.raw_buckets(),
             _marker: marker::PhantomData,
         }
     }
 
     pub fn into_iter(self) -> IntoIter<K, V> {
-        let RawBuckets { raw, elems_left, .. } = self.raw_buckets();
+        let RawBuckets { raw, elems_left, bytes_allocated, .. } = self.raw_buckets();
         // Replace the marker regardless of lifetime bounds on parameters.
         IntoIter {
             iter: RawBuckets {
                 raw,
                 elems_left,
+                bytes_allocated,
                 marker: marker::PhantomData,
             },
             table: self,
         }
     }
 
     pub fn drain(&mut self) -> Drain<K, V> {
-        let RawBuckets { raw, elems_left, .. } = self.raw_buckets();
+        let RawBuckets { raw, elems_left, bytes_allocated, .. } = self.raw_buckets();
         // Replace the marker regardless of lifetime bounds on parameters.
         Drain {
             iter: RawBuckets {
                 raw,
                 elems_left,
+                bytes_allocated,
                 marker: marker::PhantomData,
             },
             table: Shared::from(self),
             marker: marker::PhantomData,
         }
     }
 
     /// Drops buckets in reverse order. It leaves the table in an inconsistent
     /// state and should only be used for dropping the table's remaining
     /// entries. It's used in the implementation of Drop.
     unsafe fn rev_drop_buckets(&mut self) {
-        // initialize the raw bucket past the end of the table
-        let mut raw = self.raw_bucket_at(self.capacity());
         let mut elems_left = self.size;
-
-        while elems_left != 0 {
-            raw.idx -= 1;
-
+        if elems_left == 0 {
+            return;
+        }
+        let mut raw = self.raw_bucket_at(self.capacity() - 1);
+        loop {
             if *raw.hash() != EMPTY_BUCKET {
-                elems_left -= 1;
                 ptr::drop_in_place(raw.pair());
+                elems_left = elems_left.checked_sub(1).unwrap();
+                if elems_left == 0 {
+                    return;
+                }
             }
+            raw.idx = raw.idx.checked_sub(1).unwrap();
+            raw.assert_bounds(self.bytes_allocated);
         }
     }
 
     /// Set the table tag
     pub fn set_tag(&mut self, value: bool) {
         self.hashes.set_tag(value)
     }
 
@@ -918,55 +946,64 @@ impl<K, V> RawTable<K, V> {
     pub fn tag(&self) -> bool {
         self.hashes.tag()
     }
 }
 
 /// A raw iterator. The basis for some other iterators in this module. Although
 /// this interface is safe, it's not used outside this module.
 struct RawBuckets<'a, K, V> {
-    raw: RawBucket<K, V>,
+    // We use an Option here to avoid ever constructing a RawBucket for
+    // invalid memory.
+    raw: Option<RawBucket<K, V>>,
     elems_left: usize,
+    bytes_allocated: usize,
 
     // Strictly speaking, this should be &'a (K,V), but that would
     // require that K:'a, and we often use RawBuckets<'static...> for
     // move iterations, so that messes up a lot of other things. So
     // just use `&'a (K,V)` as this is not a publicly exposed type
     // anyway.
     marker: marker::PhantomData<&'a ()>,
 }
 
 // FIXME(#19839) Remove in favor of `#[derive(Clone)]`
 impl<'a, K, V> Clone for RawBuckets<'a, K, V> {
     fn clone(&self) -> RawBuckets<'a, K, V> {
         RawBuckets {
             raw: self.raw,
             elems_left: self.elems_left,
+            bytes_allocated: self.bytes_allocated,
             marker: marker::PhantomData,
         }
     }
 }
 
 
 impl<'a, K, V> Iterator for RawBuckets<'a, K, V> {
     type Item = RawBucket<K, V>;
 
     fn next(&mut self) -> Option<RawBucket<K, V>> {
         if self.elems_left == 0 {
             return None;
         }
 
         loop {
             unsafe {
-                let item = self.raw;
-                self.raw.idx += 1;
+                let item = self.raw.unwrap();
                 if *item.hash() != EMPTY_BUCKET {
-                    self.elems_left -= 1;
+                    self.elems_left = self.elems_left.checked_sub(1).unwrap();
+                    if self.elems_left != 0 {
+                        self.raw.as_mut().unwrap().idx += 1;
+                        self.raw.as_ref().unwrap().assert_bounds(self.bytes_allocated);
+                    }
                     return Some(item);
                 }
+                self.raw.as_mut().unwrap().idx += 1;
+                self.raw.as_ref().unwrap().assert_bounds(self.bytes_allocated);
             }
         }
     }
 
     fn size_hint(&self) -> (usize, Option<usize>) {
         (self.elems_left, Some(self.elems_left))
     }
 }
@@ -1091,17 +1128,17 @@ impl<'a, K, V> ExactSizeIterator for Ite
     }
 }
 
 impl<K, V> Iterator for IntoIter<K, V> {
     type Item = (SafeHash, K, V);
 
     fn next(&mut self) -> Option<(SafeHash, K, V)> {
         self.iter.next().map(|raw| {
-            self.table.size -= 1;
+            self.table.size = self.table.size.checked_sub(1).unwrap();
             unsafe {
                 let (k, v) = ptr::read(raw.pair());
                 (SafeHash { hash: *raw.hash() }, k, v)
             }
         })
     }
 
     fn size_hint(&self) -> (usize, Option<usize>) {
@@ -1117,17 +1154,17 @@ impl<K, V> ExactSizeIterator for IntoIte
 
 impl<'a, K, V> Iterator for Drain<'a, K, V> {
     type Item = (SafeHash, K, V);
 
     #[inline]
     fn next(&mut self) -> Option<(SafeHash, K, V)> {
         self.iter.next().map(|raw| {
             unsafe {
-                self.table.as_mut().size -= 1;
+                self.table.as_mut().size = self.table.as_mut().size.checked_sub(1).unwrap();
                 let (k, v) = ptr::read(raw.pair());
                 (SafeHash { hash: ptr::replace(&mut *raw.hash(), EMPTY_BUCKET) }, k, v)
             }
         })
     }
 
     fn size_hint(&self) -> (usize, Option<usize>) {
         self.iter.size_hint()
@@ -1146,28 +1183,38 @@ impl<'a, K: 'static, V: 'static> Drop fo
     }
 }
 
 impl<K: Clone, V: Clone> Clone for RawTable<K, V> {
     fn clone(&self) -> RawTable<K, V> {
         unsafe {
             let cap = self.capacity();
             let mut new_ht = RawTable::new_uninitialized(cap);
+            if cap == 0 {
+                return new_ht;
+            }
 
             let mut new_buckets = new_ht.raw_bucket_at(0);
             let mut buckets = self.raw_bucket_at(0);
-            while buckets.idx < cap {
+            loop {
                 *new_buckets.hash() = *buckets.hash();
                 if *new_buckets.hash() != EMPTY_BUCKET {
                     let pair_ptr = buckets.pair();
                     let kv = ((*pair_ptr).0.clone(), (*pair_ptr).1.clone());
                     ptr::write(new_buckets.pair(), kv);
                 }
+
+                if buckets.idx == cap - 1 {
+                    break;
+                }
+
                 buckets.idx += 1;
+                buckets.assert_bounds(self.bytes_allocated);
                 new_buckets.idx += 1;
+                new_buckets.assert_bounds(new_ht.bytes_allocated);
             }
 
             new_ht.size = self.size();
 
             new_ht
         }
     }
 }
@@ -1196,17 +1243,17 @@ impl<K, V> Drop for RawTable<K, V> {
 
         let hashes_size = self.capacity() * size_of::<HashUint>();
         let pairs_size = self.capacity() * size_of::<(K, V)>();
         let (align, _, _, oflo) = calculate_allocation(hashes_size,
                                                           align_of::<HashUint>(),
                                                           pairs_size,
                                                           align_of::<(K, V)>());
 
-        debug_assert!(!oflo, "should be impossible");
+        assert!(!oflo, "HashMap Corruption - should be impossible");
 
         unsafe {
             dealloc(self.hashes.ptr() as *mut u8, align);
             // Remember how everything was allocated out of one buffer
             // during initialization? We only need one call to free here.
         }
     }
 }
--- a/servo/components/layout/Cargo.toml
+++ b/servo/components/layout/Cargo.toml
@@ -14,17 +14,17 @@ app_units = "0.5"
 atomic_refcell = "0.1"
 bitflags = "0.8"
 canvas_traits = {path = "../canvas_traits"}
 euclid = "0.15"
 fnv = "1.0"
 gfx = {path = "../gfx"}
 gfx_traits = {path = "../gfx_traits"}
 heapsize = "0.4"
-html5ever = "0.19"
+html5ever = "0.20.0"
 ipc-channel = "0.8"
 libc = "0.2"
 log = "0.3.5"
 msg = {path = "../msg"}
 net_traits = {path = "../net_traits"}
 ordered-float = "0.4"
 parking_lot = "0.4"
 profile_traits = {path = "../profile_traits"}
--- a/servo/components/layout_thread/Cargo.toml
+++ b/servo/components/layout_thread/Cargo.toml
@@ -12,17 +12,17 @@ path = "lib.rs"
 [dependencies]
 app_units = "0.5"
 atomic_refcell = "0.1"
 euclid = "0.15"
 fnv = "1.0"
 gfx = {path = "../gfx"}
 gfx_traits = {path = "../gfx_traits"}
 heapsize = "0.4"
-html5ever = &