Merge mozilla-central to mozilla-inbound. CLOSED TREE
authorCsoregi Natalia <ncsoregi@mozilla.com>
Sat, 02 Feb 2019 00:14:12 +0200
changeset 456529 a36422c1abbc543755c84500e530433dc3b9e242
parent 456528 51d12094d825c4c4467cb132d03d4f3cad4b1b82 (current diff)
parent 456463 024bef408a8896f365789759f6a3b6e00daf5aca (diff)
child 456530 365e026a163adcc3a86b7ce4e1da477af78ae822
push id35488
push userdvarga@mozilla.com
push dateSat, 02 Feb 2019 09:44:51 +0000
treeherdermozilla-central@d8cebb3b46cf [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone67.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. CLOSED TREE
browser/base/content/browser.css
browser/components/urlbar/tests/legacy/browser_action_searchengine.js
browser/components/urlbar/tests/legacy/browser_action_searchengine_alias.js
browser/components/urlbar/tests/legacy/browser_autocomplete_edit_completed.js
browser/components/urlbar/tests/legacy/browser_new_tab_urlbar_reset.js
browser/components/urlbar/tests/legacy/browser_urlbar_remove_match.js
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -477,16 +477,19 @@ pref("browser.tabs.extraDragSpace", fals
 // 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);
 
+// New, experimental, tab open/close animations.
+pref("browser.tabs.newanimations", false);
+
 // Pref to control whether we use separate privileged content processes.
 #if defined(NIGHTLY_BUILD) && !defined(MOZ_ASAN)
 pref("browser.tabs.remote.separatePrivilegedContentProcess", true);
 #endif
 
 pref("browser.ctrlTab.recentlyUsedOrder", true);
 
 // By default, do not export HTML at shutdown.
--- a/browser/base/content/browser.css
+++ b/browser/base/content/browser.css
@@ -171,16 +171,34 @@ panelview[mainview] > .panel-header {
               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);
 }
 
+@supports -moz-bool-pref("browser.tabs.newanimations") {
+
+.tabbrowser-tab:not([pinned]):not([tabdrop-samewindow]) {
+  transition: transform 100ms ease-in-out;
+}
+
+#tabbrowser-tabs[movingtab] > .tabbrowser-tab[selected] {
+  transition: none;
+}
+
+.tabbrowser-tab:not([pinned]):not([fadein]) {
+  transform: translateY(var(--tab-min-height));
+}
+
+} /* end @supports -moz-bool-pref("browser.tabs.newanimations") */
+
+@supports not -moz-bool-pref("browser.tabs.newanimations") {
+
 .tabbrowser-tab:not([pinned]):not([fadein]) {
   max-width: 0.1px;
   min-width: 0.1px;
   visibility: hidden;
 }
 
 .tab-icon-image[fadein],
 .tab-close-button[fadein],
@@ -198,16 +216,18 @@ panelview[mainview] > .panel-header {
   visibility: hidden;
 }
 
 .tab-label:not([fadein]),
 .tab-throbber:not([fadein]) {
   display: none;
 }
 
+} /* end @supports not -moz-bool-pref("browser.tabs.newanimations") */
+
 %ifdef NIGHTLY_BUILD
 @supports -moz-bool-pref("browser.tabs.hideThrobber") {
   .tab-throbber {
     display: none !important;
   }
 }
 %endif
 
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -1229,31 +1229,42 @@
 
       <handler event="TabShow"><![CDATA[
         if (event.target.soundPlaying) {
           this._hiddenSoundPlayingStatusChanged(event.target);
         }
       ]]></handler>
 
       <handler event="transitionend"><![CDATA[
-        if (event.propertyName != "max-width") {
+        if (event.propertyName != "max-width" &&
+            event.propertyName != "transform") {
           return;
         }
 
-        var tab = event.target;
+        if (gBrowser.tabAnimationsInProgress == 0) {
+          return;
+        }
+
+        let tab = event.originalTarget;
+        if (tab.nodeName != "tab") {
+          return;
+        }
 
         if (tab.getAttribute("fadein") == "true") {
           if (tab._fullyOpen) {
             this._updateCloseButtons();
           } else {
             this._handleNewTab(tab);
           }
         } else if (tab.closing) {
           gBrowser._endRemoveTab(tab);
         }
+
+        let evt = new CustomEvent("TabAnimationEnd", { bubbles: true });
+        tab.dispatchEvent(evt);
       ]]></handler>
 
       <handler event="dblclick"><![CDATA[
         // When the tabbar has an unified appearance with the titlebar
         // and menubar, a double-click in it should have the same behavior
         // as double-clicking the titlebar
         if (TabsInTitlebar.enabled)
           return;
--- a/browser/base/content/test/general/browser_bug585785.js
+++ b/browser/base/content/test/general/browser_bug585785.js
@@ -18,18 +18,15 @@ function checkAnimationState() {
   if (!tab.parentNode) {
     ok(true, "tab removed synchronously since the opening animation hasn't moved yet");
     finish();
     return;
   }
 
   info("tab didn't close immediately, so the tab opening animation must have started moving");
   info("waiting for the tab to close asynchronously");
-  tab.addEventListener("transitionend", function listener(event) {
-    if (event.propertyName == "max-width") {
-      tab.removeEventListener("transitionend", listener);
-      executeSoon(function() {
-        ok(!tab.parentNode, "tab removed asynchronously");
-        finish();
-      });
-    }
-  });
+  tab.addEventListener("TabAnimationEnd", function listener() {
+    executeSoon(function() {
+      ok(!tab.parentNode, "tab removed asynchronously");
+      finish();
+    });
+  }, {once: true});
 }
--- a/browser/base/content/test/performance/browser_tabclose.js
+++ b/browser/base/content/test/performance/browser_tabclose.js
@@ -31,18 +31,17 @@ add_task(async function() {
                                             "anonid", "tabs-newtab-button")
             .getBoundingClientRect();
   let inRange = (val, min, max) => min <= val && val <= max;
 
   // Add a reflow observer and open a new tab.
   await withPerfObserver(async function() {
     let switchDone = BrowserTestUtils.waitForEvent(window, "TabSwitchDone");
     gBrowser.removeTab(tab, { animate: true });
-    await BrowserTestUtils.waitForEvent(tab, "transitionend",
-        false, e => e.propertyName === "max-width");
+    await BrowserTestUtils.waitForEvent(tab, "TabAnimationEnd");
     await switchDone;
   }, {expectedReflows: EXPECTED_REFLOWS,
       frames: {
         filter: rects => rects.filter(r => !(
           // We expect all changes to be within the tab strip.
           r.y1 >= tabStripRect.top && r.y2 <= tabStripRect.bottom &&
           r.x1 >= tabStripRect.left && r.x2 <= tabStripRect.right && (
           // The closed tab should disappear at the same time as the previous
--- a/browser/base/content/test/performance/browser_tabclose_grow.js
+++ b/browser/base/content/test/performance/browser_tabclose_grow.js
@@ -40,18 +40,17 @@ add_task(async function() {
   await BrowserTestUtils.switchTab(gBrowser, lastTab);
 
   let tabStripRect = gBrowser.tabContainer.arrowScrollbox.getBoundingClientRect();
 
   await withPerfObserver(async function() {
     let switchDone = BrowserTestUtils.waitForEvent(window, "TabSwitchDone");
     let tab = gBrowser.tabs[gBrowser.tabs.length - 1];
     gBrowser.removeTab(tab, { animate: true, byMouse: true });
-    await BrowserTestUtils.waitForEvent(tab, "transitionend",
-      false, e => e.propertyName === "max-width");
+    await BrowserTestUtils.waitForEvent(tab, "TabAnimationEnd");
     await switchDone;
   }, {expectedReflows: EXPECTED_REFLOWS,
       frames: {
         filter: rects => rects.filter(r => !(
           // We expect plenty of changed rects within the tab strip.
           r.y1 >= tabStripRect.top && r.y2 <= tabStripRect.bottom &&
           r.x1 >= tabStripRect.left && r.x2 <= tabStripRect.right &&
           // It would make sense for each rect to have a width smaller than
--- a/browser/base/content/test/performance/browser_tabopen.js
+++ b/browser/base/content/test/performance/browser_tabopen.js
@@ -37,18 +37,17 @@ add_task(async function() {
   let textBoxRect = document.getAnonymousElementByAttribute(gURLBar,
     "anonid", "moz-input-box").getBoundingClientRect();
   let inRange = (val, min, max) => min <= val && val <= max;
 
   // Add a reflow observer and open a new tab.
   await withPerfObserver(async function() {
     let switchDone = BrowserTestUtils.waitForEvent(window, "TabSwitchDone");
     BrowserOpenTab();
-    await BrowserTestUtils.waitForEvent(gBrowser.selectedTab, "transitionend",
-                                        false, e => e.propertyName === "max-width");
+    await BrowserTestUtils.waitForEvent(gBrowser.selectedTab, "TabAnimationEnd");
     await switchDone;
   }, {expectedReflows: EXPECTED_REFLOWS,
       frames: {
         filter: rects => rects.filter(r => !(
           // We expect all changes to be within the tab strip.
           r.y1 >= tabStripRect.top && r.y2 <= tabStripRect.bottom &&
           r.x1 >= tabStripRect.left && r.x2 <= tabStripRect.right && (
           // The first tab should get deselected at the same time as the next
--- a/browser/base/content/test/performance/browser_tabopen_squeeze.js
+++ b/browser/base/content/test/performance/browser_tabopen_squeeze.js
@@ -35,18 +35,17 @@ add_task(async function() {
 
   let tabStripRect = gBrowser.tabContainer.arrowScrollbox.getBoundingClientRect();
   let textBoxRect = document.getAnonymousElementByAttribute(gURLBar,
     "anonid", "moz-input-box").getBoundingClientRect();
 
   await withPerfObserver(async function() {
     let switchDone = BrowserTestUtils.waitForEvent(window, "TabSwitchDone");
     BrowserOpenTab();
-    await BrowserTestUtils.waitForEvent(gBrowser.selectedTab, "transitionend",
-      false, e => e.propertyName === "max-width");
+    await BrowserTestUtils.waitForEvent(gBrowser.selectedTab, "TabAnimationEnd");
     await switchDone;
   }, {expectedReflows: EXPECTED_REFLOWS,
       frames: {
         filter: rects => rects.filter(r => !(
           // We expect plenty of changed rects within the tab strip.
           r.y1 >= tabStripRect.top && r.y2 <= tabStripRect.bottom &&
           r.x1 >= tabStripRect.left && r.x2 <= tabStripRect.right &&
           // It would make sense for each rect to have a width smaller than
--- a/browser/base/content/test/performance/browser_tabstrip_overflow_underflow.js
+++ b/browser/base/content/test/performance/browser_tabstrip_overflow_underflow.js
@@ -70,18 +70,17 @@ add_task(async function() {
          r.y2 <= urlbarDropmarkerRect.bottom,
       },
     ],
   };
 
   await withPerfObserver(async function() {
     let switchDone = BrowserTestUtils.waitForEvent(window, "TabSwitchDone");
     BrowserOpenTab();
-    await BrowserTestUtils.waitForEvent(gBrowser.selectedTab, "transitionend",
-        false, e => e.propertyName === "max-width");
+    await BrowserTestUtils.waitForEvent(gBrowser.selectedTab, "TabAnimationEnd");
     await switchDone;
     await BrowserTestUtils.waitForCondition(() => {
       return gBrowser.tabContainer.arrowScrollbox.hasAttribute("scrolledtoend");
     });
   }, {expectedReflows: EXPECTED_OVERFLOW_REFLOWS, frames: ignoreTabstripRects});
 
   Assert.ok(gBrowser.tabContainer.hasAttribute("overflow"),
             "Tabs should now be overflowed.");
--- a/browser/components/urlbar/UrlbarInput.jsm
+++ b/browser/components/urlbar/UrlbarInput.jsm
@@ -367,20 +367,20 @@ class UrlbarInput {
    */
   setValueFromResult(result) {
     let val;
 
     switch (result.type) {
       case UrlbarUtils.RESULT_TYPE.SEARCH:
         val = result.payload.suggestion || result.payload.query;
         break;
+      case UrlbarUtils.RESULT_TYPE.OMNIBOX:
+        val = result.payload.content;
+        break;
       default: {
-        // FIXME: This is wrong, not all the other matches have a url. For example
-        // extension matches will call into the extension code rather than loading
-        // a url. That means we likely can't use the url as our value.
         val = result.payload.url;
         let uri;
         try {
           uri = Services.io.newURI(val);
         } catch (ex) {}
         if (uri) {
           val = this.window.losslessDecodeURI(uri);
         }
--- a/browser/components/urlbar/UrlbarUtils.jsm
+++ b/browser/components/urlbar/UrlbarUtils.jsm
@@ -96,16 +96,22 @@ var UrlbarUtils = {
     BOOKMARKS: 1,
     HISTORY: 2,
     SEARCH: 3,
     TABS: 4,
     OTHER_LOCAL: 5,
     OTHER_NETWORK: 6,
   },
 
+  // This defines icon locations that are common used in the UI.
+  ICON: {
+    DEFAULT: Ci.nsIFaviconService.FAVICON_DEFAULT_URL,
+    SEARCH_GLASS: "chrome://browser/skin/search-glass.svg",
+  },
+
   /**
    * Adds a url to history as long as it isn't in a private browsing window,
    * and it is valid.
    *
    * @param {string} url The url to add to history.
    * @param {nsIDomWindow} window The window from where the url is being added.
    */
   addToUrlbarHistory(url, window) {
--- a/browser/components/urlbar/UrlbarView.jsm
+++ b/browser/components/urlbar/UrlbarView.jsm
@@ -114,25 +114,25 @@ class UrlbarView {
    * Closes the autocomplete results popup.
    */
   close() {
     this.panel.hidePopup();
   }
 
   // UrlbarController listener methods.
   onQueryStarted(queryContext) {
-    this._rows.textContent = "";
+    this._rows.style.minHeight = this._getBoundsWithoutFlushing(this._rows).height + "px";
   }
 
   onQueryCancelled(queryContext) {
     // Nothing.
   }
 
   onQueryFinished(queryContext) {
-    // Nothing.
+    this._rows.style.minHeight = "";
   }
 
   onQueryResults(queryContext) {
     this._queryContext = queryContext;
 
     let fragment = this.document.createDocumentFragment();
     for (let resultIndex in queryContext.results) {
       fragment.appendChild(this._createRow(resultIndex));
@@ -281,19 +281,19 @@ class UrlbarView {
     let typeIcon = this._createElement("span");
     typeIcon.className = "urlbarView-type-icon";
     content.appendChild(typeIcon);
 
     let favicon = this._createElement("img");
     favicon.className = "urlbarView-favicon";
     if (result.type == UrlbarUtils.RESULT_TYPE.SEARCH ||
         result.type == UrlbarUtils.RESULT_TYPE.KEYWORD) {
-      favicon.src = "chrome://browser/skin/search-glass.svg";
+      favicon.src = UrlbarUtils.ICON.SEARCH_GLASS;
     } else {
-      favicon.src = result.payload.icon || "chrome://mozapps/skin/places/defaultFavicon.svg";
+      favicon.src = result.payload.icon || UrlbarUtils.ICON.DEFAULT;
     }
     content.appendChild(favicon);
 
     let title = this._createElement("span");
     title.className = "urlbarView-title";
     this._addTextContentWithHighlights(
       title, result.title, result.titleHighlights);
     content.appendChild(title);
--- a/browser/components/urlbar/tests/UrlbarTestUtils.jsm
+++ b/browser/components/urlbar/tests/UrlbarTestUtils.jsm
@@ -30,23 +30,23 @@ var UrlbarTestUtils = {
       if (typeof restoreAnimations == "function") {
         restoreAnimationsFn();
       }
     });
   },
 
   /**
    * Starts a search for a given string and waits for the search to be complete.
+   * @param {object} win The window containing the urlbar
    * @param {string} inputText the search string
-   * @param {object} win The window containing the urlbar
    * @param {function} waitForFocus The Simpletest function
    * @param {boolean} fireInputEvent whether an input event should be used when
    *        starting the query (necessary to set userTypedValued)
    */
-  async promiseAutocompleteResultPopup(inputText, win, waitForFocus, fireInputEvent = false) {
+  async promiseAutocompleteResultPopup(win, inputText, waitForFocus, fireInputEvent = false) {
     let urlbar = getUrlbarAbstraction(win);
     let restoreAnimationsFn = urlbar.disableAnimations();
     await new Promise(resolve => waitForFocus(resolve, win));
     urlbar.focus();
     urlbar.value = inputText;
     if (fireInputEvent) {
       // This is necessary to get the urlbar to set gBrowser.userTypedValue.
       urlbar.fireInputEvent();
@@ -87,16 +87,26 @@ var UrlbarTestUtils = {
    * @returns {HtmlElement|XulElement} the selected element.
    */
   getSelectedElement(win) {
     let urlbar = getUrlbarAbstraction(win);
     return urlbar.getSelectedElement();
   },
 
   /**
+   * Gets the index of the currently selected item.
+   * @param {object} win The window containing the urlbar.
+   * @returns {number} The selected index.
+   */
+  getSelectedIndex(win) {
+    let urlbar = getUrlbarAbstraction(win);
+    return urlbar.getSelectedIndex();
+  },
+
+  /**
    * Gets the number of results.
    * You must wait for the query to be complete before using this.
    * @param {object} win The window containing the urlbar
    * @returns {number} the number of results.
    */
   getResultCount(win) {
     let urlbar = getUrlbarAbstraction(win);
     return urlbar.getResultCount();
@@ -122,16 +132,28 @@ var UrlbarTestUtils = {
     if (!httpserver) {
       throw new Error("Must provide an http server");
     }
     return BrowserTestUtils.waitForCondition(
       () => httpserver.connectionNumber == count,
       "Waiting for speculative connection setup"
     );
   },
+
+  /**
+   * Waits for the popup to be hidden.
+   * @param {object} win The window containing the urlbar
+   * @param {function} [closeFn] Function to be used to close the popup, if not
+   *        supplied it will default to a closing the popup directly.
+   * @returns {Promise} resolved once the popup is closed
+   */
+  promisePopupClose(win, closeFn = null) {
+    let urlbar = getUrlbarAbstraction(win);
+    return urlbar.promisePopupClose(closeFn);
+  },
 };
 
 /**
  * Maps windows to urlbar abstractions.
  */
 var gUrlbarAbstractions = new WeakMap();
 
 function getUrlbarAbstraction(win) {
@@ -247,23 +269,31 @@ class UrlbarAbstraction {
   getSelectedElement() {
     if (this.quantumbar) {
       return this.urlbar.view._selected || null;
     }
     return this.panel.selectedIndex >= 0 ?
       this.panel.richlistbox.itemChildren[this.panel.selectedIndex] : null;
   }
 
+  getSelectedIndex() {
+    if (!this.quantumbar) {
+      return this.panel.selectedIndex;
+    }
+
+    return parseInt(this.urlbar.view._selected.getAttribute("resultIndex"));
+  }
+
   getResultCount() {
     return this.quantumbar ? this.urlbar.view._rows.children.length
                            : this.urlbar.controller.matchCount;
   }
 
   async getDetailsOfResultAt(index) {
-    await this.promiseResultAt(index);
+    let element = await this.promiseResultAt(index);
     function getType(style, action) {
       if (style.includes("searchengine") || style.includes("suggestions")) {
         return UrlbarUtils.RESULT_TYPE.SEARCH;
       } else if (style.includes("extension")) {
         return UrlbarUtils.RESULT_TYPE.OMNIBOX;
       } else if (action && action.type == "keyword") {
         return UrlbarUtils.RESULT_TYPE.KEYWORD;
       } else if (action && action.type == "remotetab") {
@@ -274,22 +304,40 @@ class UrlbarAbstraction {
       return UrlbarUtils.RESULT_TYPE.URL;
     }
     let details = {};
     if (this.quantumbar) {
       let context = await this.urlbar.lastQueryContextPromise;
       details.url = (UrlbarUtils.getUrlFromResult(context.results[index])).url;
       details.type = context.results[index].type;
       details.autofill = index == 0 && context.autofillValue;
+      details.image = element.getElementsByClassName("urlbarView-favicon")[0].src;
+      if (details.type == UrlbarUtils.RESULT_TYPE.SEARCH) {
+        details.searchParams = {
+          engine: context.results[index].payload.engine,
+          query: context.results[index].payload.query,
+          suggestion: context.results[index].payload.suggestion,
+        };
+      }
     } else {
       details.url = this.urlbar.controller.getFinalCompleteValueAt(index);
       let style = this.urlbar.controller.getStyleAt(index);
       let action = PlacesUtils.parseActionUrl(this.urlbar.controller.getValueAt(index));
       details.type = getType(style, action);
       details.autofill = style.includes("autofill");
+      details.image = element.getAttribute("image");
+      if (details.type == UrlbarUtils.RESULT_TYPE.SEARCH) {
+        details.searchParams = {
+          engine: action.params.engineName,
+          query: action.params.input,
+          suggestion: action.params.input == action.params.searchQuery ?
+                      undefined :
+                      action.params.searchQuery,
+        };
+      }
     }
     return details;
   }
 
   async promiseSearchSuggestions() {
     if (!this.quantumbar) {
       return TestUtils.waitForCondition(() => {
         let controller = this.urlbar.controller;
@@ -312,9 +360,29 @@ class UrlbarAbstraction {
     return this.promiseSearchComplete().then(context => {
       // Look for search suggestions.
       if (!context.results.some(r => r.type == UrlbarUtils.RESULT_TYPE.SEARCH &&
                                 r.payload.suggestion)) {
         throw new Error("Cannot find a search suggestion");
       }
     });
   }
+
+  closePopup() {
+    if (this.quantumbar) {
+      this.urlbar.view.close();
+    } else {
+      this.urlbar.popup.hidePopup();
+    }
+  }
+
+  promisePopupClose(closeFn) {
+    if (closeFn) {
+      closeFn();
+    } else {
+      this.closePopup();
+    }
+    if (!this.quantumbar) {
+      return BrowserTestUtils.waitForPopupEvent(this.urlbar.popup, "hidden");
+    }
+    return BrowserTestUtils.waitForPopupEvent(this.urlbar.view.panel, "hidden");
+  }
 }
--- a/browser/components/urlbar/tests/browser/browser.ini
+++ b/browser/components/urlbar/tests/browser/browser.ini
@@ -5,33 +5,38 @@
 [DEFAULT]
 prefs=browser.urlbar.quantumbar=true
 tags=quantumbar
 support-files =
   dummy_page.html
   head.js
   head-common.js
 
+[browser_action_searchengine.js]
+[browser_action_searchengine_alias.js]
+[browser_autocomplete_edit_completed.js]
 [browser_canonizeURL.js]
 [browser_locationBarCommand.js]
 [browser_locationBarExternalLoad.js]
 [browser_moz_action_link.js]
+[browser_new_tab_urlbar_reset.js]
 [browser_populateAfterPushState.js]
 [browser_redirect_error.js]
 support-files = redirect_error.sjs
 [browser_switchToTabHavingURI_aOpenParams.js]
 [browser_urlbar_blanking.js]
 support-files =
   file_blank_but_not_blank.html
 [browser_urlbar_content_opener.js]
 [browser_urlbar_locationchange_urlbar_edit_dos.js]
 support-files =
   file_urlbar_edit_dos.html
 [browser_urlbar_remoteness_switch.js]
 run-if = e10s
+[browser_urlbar_remove_match.js]
 [browser_urlbar_searchsettings.js]
 [browser_urlbar_speculative_connect.js]
 support-files =
   searchSuggestionEngine2.xml
   searchSuggestionEngine.sjs
 [browser_urlbar_speculative_connect_not_with_client_cert.js]
 [browser_urlbar_whereToOpen.js]
 [browser_urlbarAboutHomeLoading.js]
rename from browser/components/urlbar/tests/legacy/browser_action_searchengine.js
rename to browser/components/urlbar/tests/browser/browser_action_searchengine.js
--- a/browser/components/urlbar/tests/legacy/browser_action_searchengine.js
+++ b/browser/components/urlbar/tests/browser/browser_action_searchengine.js
@@ -1,11 +1,16 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
+/**
+ * Tests that a search result has the correct attributes and visits the
+ * expected URL for the engine.
+ */
+
 add_task(async function() {
   Services.search.addEngineWithDetails("MozSearch", "", "", "", "GET",
                                        "http://example.com/?q={searchTerms}");
   let engine = Services.search.getEngineByName("MozSearch");
   let originalEngine = Services.search.defaultEngine;
   Services.search.defaultEngine = engine;
 
   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, "about:mozilla");
@@ -15,33 +20,35 @@ add_task(async function() {
     Services.search.removeEngine(engine);
     try {
       BrowserTestUtils.removeTab(tab);
     } catch (ex) { /* tab may have already been closed in case of failure */ }
     await PlacesUtils.history.clear();
   });
 
   await promiseAutocompleteResultPopup("open a search");
-  let result = await waitForAutocompleteResultAt(0);
-  isnot(result, null, "Should have a result");
-  Assert.deepEqual(
-    PlacesUtils.parseActionUrl(result.getAttribute("url")),
-    {
-      type: "searchengine",
-      params: {
-        engineName: "MozSearch",
-        input: "open a search",
-        searchQuery: "open a search",
-      },
-    },
-    "Result should be a moz-action: for the correct search engine"
-  );
-  is(result.hasAttribute("image"), false, "Result shouldn't have an image attribute");
+  let result = await UrlbarTestUtils.getDetailsOfResultAt(window, 0);
+
+  Assert.equal(result.type, UrlbarUtils.RESULT_TYPE.SEARCH,
+    "Should have type search");
+  Assert.deepEqual(result.searchParams, {
+      engine: "MozSearch",
+      query: "open a search",
+      suggestion: undefined,
+  }, "Should have the correct result parameters.");
+
+  if (UrlbarPrefs.get("quantumbar")) {
+    Assert.equal(result.image, UrlbarUtils.ICON.SEARCH_GLASS,
+      "Should have the search icon image");
+  } else {
+    Assert.equal(result.image, "", "Should not have an image defined");
+  }
 
   let tabPromise = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
-  result.click();
+  let element = await UrlbarTestUtils.waitForAutocompleteResultAt(window, 0);
+  EventUtils.synthesizeMouseAtCenter(element, {}, window);
   await tabPromise;
 
-  is(gBrowser.selectedBrowser.currentURI.spec, "http://example.com/?q=open+a+search", "Correct URL should be loaded");
+  Assert.equal(gBrowser.selectedBrowser.currentURI.spec,
+    "http://example.com/?q=open+a+search", "Should have loaded the correct page");
 
-  gURLBar.popup.hidePopup();
-  await promisePopupHidden(gURLBar.popup);
+  await UrlbarTestUtils.promisePopupClose(window);
 });
rename from browser/components/urlbar/tests/legacy/browser_action_searchengine_alias.js
rename to browser/components/urlbar/tests/browser/browser_action_searchengine_alias.js
--- a/browser/components/urlbar/tests/legacy/browser_action_searchengine_alias.js
+++ b/browser/components/urlbar/tests/browser/browser_action_searchengine_alias.js
@@ -1,14 +1,19 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
+/**
+ * Tests that search result obtained using a search keyword gives an entry with
+ * the correct attributes and visits the expected URL for the engine.
+ */
+
 add_task(async function() {
-  let iconURI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABGklEQVQoz2NgGB6AnZ1dUlJSXl4eSDIyMhLW4Ovr%2B%2Fr168uXL69Zs4YoG%2BLi4i5dusTExMTGxsbNzd3f37937976%2BnpmZmagbHR09J49e5YvX66kpATVEBYW9ubNm2nTphkbG7e2tp44cQLIuHfvXm5urpaWFlDKysqqu7v73LlzECMYIiIiHj58mJCQoKKicvXq1bS0NKBgW1vbjh074uPjgeqAXE1NzSdPnvDz84M0AEUvXLgAsW379u1z5swBen3jxo2zZ892cHB4%2BvQp0KlAfwI1cHJyghQFBwfv2rULokFXV%2FfixYu7d%2B8GGqGgoMDKyrpu3br9%2B%2FcDuXl5eVA%2FAEWBfoWHAdAYoNuAYQ0XAeoUERFhGDYAAPoUaT2dfWJuAAAAAElFTkSuQmCC";
-  Services.search.addEngineWithDetails("MozSearch", iconURI, "moz", "", "GET",
+  const ICON_URI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABGklEQVQoz2NgGB6AnZ1dUlJSXl4eSDIyMhLW4Ovr%2B%2Fr168uXL69Zs4YoG%2BLi4i5dusTExMTGxsbNzd3f37937976%2BnpmZmagbHR09J49e5YvX66kpATVEBYW9ubNm2nTphkbG7e2tp44cQLIuHfvXm5urpaWFlDKysqqu7v73LlzECMYIiIiHj58mJCQoKKicvXq1bS0NKBgW1vbjh074uPjgeqAXE1NzSdPnvDz84M0AEUvXLgAsW379u1z5swBen3jxo2zZ892cHB4%2BvQp0KlAfwI1cHJyghQFBwfv2rULokFXV%2FfixYu7d%2B8GGqGgoMDKyrpu3br9%2B%2FcDuXl5eVA%2FAEWBfoWHAdAYoNuAYQ0XAeoUERFhGDYAAPoUaT2dfWJuAAAAAElFTkSuQmCC";
+  Services.search.addEngineWithDetails("MozSearch", ICON_URI, "moz", "", "GET",
                                        "http://example.com/?q={searchTerms}");
   let engine = Services.search.getEngineByName("MozSearch");
   let originalEngine = Services.search.defaultEngine;
   Services.search.defaultEngine = engine;
 
   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, "about:mozilla");
 
   registerCleanupFunction(async function() {
@@ -16,22 +21,25 @@ add_task(async function() {
     Services.search.removeEngine(engine);
     try {
       BrowserTestUtils.removeTab(tab);
     } catch (ex) { /* tab may have already been closed in case of failure */ }
     await PlacesUtils.history.clear();
   });
 
   await promiseAutocompleteResultPopup("moz open a search");
-  let result = await waitForAutocompleteResultAt(0);
-  ok(result.hasAttribute("image"), "Result should have an image attribute");
-  ok(result.getAttribute("image") === engine.iconURI.spec,
-     "Image attribute should have the search engine's icon");
+  let result = await UrlbarTestUtils.getDetailsOfResultAt(window, 0);
+  if (UrlbarPrefs.get("quantumbar")) {
+    Assert.equal(result.image, UrlbarUtils.ICON.SEARCH_GLASS,
+      "Should have the search icon image");
+  } else {
+    Assert.equal(result.image, ICON_URI, "Should have the correct image");
+  }
 
   let tabPromise = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
   EventUtils.synthesizeKey("KEY_Enter");
   await tabPromise;
 
-  is(gBrowser.selectedBrowser.currentURI.spec, "http://example.com/?q=open+a+search");
+  Assert.equal(gBrowser.selectedBrowser.currentURI.spec,
+    "http://example.com/?q=open+a+search", "Should have loaded the correct page");
 
-  gURLBar.popup.hidePopup();
-  await promisePopupHidden(gURLBar.popup);
+  await UrlbarTestUtils.promisePopupClose(window);
 });
rename from browser/components/urlbar/tests/legacy/browser_autocomplete_edit_completed.js
rename to browser/components/urlbar/tests/browser/browser_autocomplete_edit_completed.js
--- a/browser/components/urlbar/tests/legacy/browser_autocomplete_edit_completed.js
+++ b/browser/components/urlbar/tests/browser/browser_autocomplete_edit_completed.js
@@ -1,47 +1,55 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/**
+ * Tests selecting a result, and editing the value of that autocompleted result.
+ */
+
 add_task(async function() {
   await PlacesUtils.history.clear();
 
   await PlacesTestUtils.addVisits([
     { uri: makeURI("http://example.com/foo") },
     { uri: makeURI("http://example.com/foo/bar") },
   ]);
 
   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, "about:blank");
   registerCleanupFunction(async function() {
     BrowserTestUtils.removeTab(tab);
     await PlacesUtils.history.clear();
   });
 
   await promiseAutocompleteResultPopup("http://example.com");
-  await waitForAutocompleteResultAt(1);
 
-  let popup = gURLBar.popup;
-  let list = popup.richlistbox;
-  let initialIndex = list.selectedIndex;
+  const initialIndex = UrlbarTestUtils.getSelectedIndex(window);
 
   info("Key Down to select the next item.");
   EventUtils.synthesizeKey("KEY_ArrowDown");
 
   let nextIndex = initialIndex + 1;
-  let nextValue = gURLBar.controller.getFinalCompleteValueAt(nextIndex);
-  is(list.selectedIndex, nextIndex, "The next item is selected.");
-  is(gURLBar.value, nextValue, "The selected URL is completed.");
+  let nextResult = await UrlbarTestUtils.getDetailsOfResultAt(window, nextIndex);
+  Assert.equal(UrlbarTestUtils.getSelectedIndex(window), nextIndex,
+    "Should have selected the next item");
+  Assert.equal(gURLBar.value, nextResult.url,
+    "Should have completed the URL");
 
   info("Press backspace");
   EventUtils.synthesizeKey("KEY_Backspace");
   await promiseSearchComplete();
 
   let editedValue = gURLBar.textValue;
-  is(list.selectedIndex, initialIndex, "The initial index is selected again.");
-  isnot(editedValue, nextValue, "The URL has changed.");
+  Assert.equal(UrlbarTestUtils.getSelectedIndex(window), initialIndex,
+    "Should have selected the initialIndex again");
+  Assert.notEqual(editedValue, nextResult.url, "The URL has changed.");
 
   let docLoad = BrowserTestUtils.waitForDocLoadAndStopIt("http://" + editedValue,
     gBrowser.selectedBrowser);
 
   info("Press return to load edited URL.");
-  EventUtils.synthesizeKey("KEY_Enter");
-  await Promise.all([
-    promisePopupHidden(gURLBar.popup),
-    docLoad,
-  ]);
+
+  await UrlbarTestUtils.promisePopupClose(window, () => {
+    EventUtils.synthesizeKey("KEY_Enter");
+  });
+
+  await docLoad;
 });
rename from browser/components/urlbar/tests/legacy/browser_new_tab_urlbar_reset.js
rename to browser/components/urlbar/tests/browser/browser_new_tab_urlbar_reset.js
--- a/browser/components/urlbar/tests/legacy/browser_new_tab_urlbar_reset.js
+++ b/browser/components/urlbar/tests/browser/browser_new_tab_urlbar_reset.js
@@ -1,16 +1,31 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
 "use strict";
 
 /**
- * Verify that urlbar state is reset when openig a new tab, so searching for the
+ * Verify that urlbar state is reset when opening a new tab, so searching for the
  * same text will reopen the results popup.
  */
 add_task(async function() {
   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, "about:blank", false);
   await promiseAutocompleteResultPopup("m");
-  ok(gURLBar.popupOpen, "The popup is open");
+  assertOpen();
+
   let tab2 = await BrowserTestUtils.openNewForegroundTab(gBrowser, "about:blank", false);
   await promiseAutocompleteResultPopup("m");
-  ok(gURLBar.popupOpen, "The popup is open");
+  assertOpen();
+
   BrowserTestUtils.removeTab(tab);
   BrowserTestUtils.removeTab(tab2);
 });
+
+function assertOpen() {
+  if (UrlbarPrefs.get("quantumbar")) {
+    Assert.equal(gURLBar.view.panel.state, "open",
+      "Should be showing the popup");
+  } else {
+    Assert.ok(gURLBar.popupOpen,
+      "Should be showing the popup");
+  }
+}
rename from browser/components/urlbar/tests/legacy/browser_urlbar_remove_match.js
rename to browser/components/urlbar/tests/browser/browser_urlbar_remove_match.js
--- a/browser/components/urlbar/tests/legacy/browser_urlbar_remove_match.js
+++ b/browser/components/urlbar/tests/browser/browser_urlbar_remove_match.js
@@ -8,57 +8,64 @@ add_task(async function test_remove_hist
   registerCleanupFunction(async function() {
     await PlacesUtils.history.clear();
   });
 
   let promiseVisitRemoved = PlacesTestUtils.waitForNotification(
     "onDeleteURI", uri => uri.spec == TEST_URL, "history");
 
   await promiseAutocompleteResultPopup("from_urlbar");
-  let result = await waitForAutocompleteResultAt(1);
-  Assert.equal(result.getAttribute("ac-value"), TEST_URL, "Found the expected result");
+
+  let result = await UrlbarTestUtils.getDetailsOfResultAt(window, 1);
+  Assert.equal(result.url, TEST_URL, "Found the expected result");
+
+  let expectedResultCount = UrlbarTestUtils.getResultCount(window) - 1;
 
   EventUtils.synthesizeKey("KEY_ArrowDown");
-  Assert.equal(gURLBar.popup.richlistbox.selectedIndex, 1);
+  Assert.equal(UrlbarTestUtils.getSelectedIndex(window), 1);
   let options = AppConstants.platform == "macosx" ? { shiftKey: true } : {};
   EventUtils.synthesizeKey("KEY_Delete", options);
   await promiseVisitRemoved;
-  await BrowserTestUtils.waitForCondition(
-    () => !gURLBar.popup.richlistbox.itemChildren.some(c => !c.collapsed && c.getAttribute("ac-value") == TEST_URL),
+  await TestUtils.waitForCondition(
+    () => UrlbarTestUtils.getResultCount(window) == expectedResultCount,
     "Waiting for the result to disappear");
 
-  gURLBar.popup.hidePopup();
-  await promisePopupHidden(gURLBar.popup);
+  for (let i = 0; i < expectedResultCount; i++) {
+    let details = await UrlbarTestUtils.getDetailsOfResultAt(window, i);
+    Assert.notEqual(details.url, TEST_URL,
+      "Should not find the test URL in the remaining results");
+  }
+
+  await UrlbarTestUtils.promisePopupClose(window);
 });
 
 // We shouldn't be able to remove a bookmark item.
 add_task(async function test_remove_bookmark_doesnt() {
   const TEST_URL = "http://dont.remove.me/from_urlbar/";
   await PlacesUtils.bookmarks.insert({
     parentGuid: PlacesUtils.bookmarks.unfiledGuid,
     title: "test",
     url: TEST_URL,
   });
 
   registerCleanupFunction(async function() {
     await PlacesUtils.bookmarks.eraseEverything();
   });
 
   await promiseAutocompleteResultPopup("from_urlbar");
-  let result = await waitForAutocompleteResultAt(1);
-  Assert.equal(result.getAttribute("ac-value"), TEST_URL, "Found the expected result");
+  let result = await UrlbarTestUtils.getDetailsOfResultAt(window, 1);
+  Assert.equal(result.url, TEST_URL, "Found the expected result");
 
   EventUtils.synthesizeKey("KEY_ArrowDown");
-  Assert.equal(gURLBar.popup.richlistbox.selectedIndex, 1);
+  Assert.equal(UrlbarTestUtils.getSelectedIndex(window), 1);
   let options = AppConstants.platform == "macosx" ? { shiftKey: true } : {};
   EventUtils.synthesizeKey("KEY_Delete", options);
 
   // We don't have an easy way of determining if the event was process or not,
   // so let any event queues clear before testing.
   await new Promise(resolve => setTimeout(resolve, 0));
   await PlacesTestUtils.promiseAsyncUpdates();
 
-  gURLBar.popup.hidePopup();
-  await promisePopupHidden(gURLBar.popup);
+  await UrlbarTestUtils.promisePopupClose(window);
 
   Assert.ok(await PlacesUtils.bookmarks.fetch({url: TEST_URL}),
     "Should still have the URL bookmarked.");
 });
--- a/browser/components/urlbar/tests/browser/head-common.js
+++ b/browser/components/urlbar/tests/browser/head-common.js
@@ -67,18 +67,18 @@ function promisePopupHidden(popup) {
 
 function promiseSearchComplete(win = window, dontAnimate = false) {
   return UrlbarTestUtils.promiseSearchComplete(win, dontAnimate);
 }
 
 function promiseAutocompleteResultPopup(inputText,
                                         win = window,
                                         fireInputEvent = false) {
-  return UrlbarTestUtils.promiseAutocompleteResultPopup(inputText,
-    win, waitForFocus, fireInputEvent);
+  return UrlbarTestUtils.promiseAutocompleteResultPopup(win, inputText,
+    waitForFocus, fireInputEvent);
 }
 
 async function waitForAutocompleteResultAt(index) {
   return UrlbarTestUtils.waitForAutocompleteResultAt(window, index);
 }
 
 function promiseSuggestionsPresent(msg = "") {
   return UrlbarTestUtils.promiseSuggestionsPresent(window, msg);
--- a/browser/components/urlbar/tests/legacy/browser.ini
+++ b/browser/components/urlbar/tests/legacy/browser.ini
@@ -12,32 +12,28 @@ support-files =
 # If you port a test, please move it to the section below to make it clearer
 # to identify the remaining tests.
 
 [browser_action_keyword.js]
 skip-if = os == "linux" # Bug 1188154
 support-files =
   ../browser/print_postdata.sjs
 [browser_action_keyword_override.js]
-[browser_action_searchengine.js]
-[browser_action_searchengine_alias.js]
 [browser_autocomplete_a11y_label.js]
 skip-if = (verify && !debug && (os == 'win'))
 [browser_autocomplete_autoselect.js]
 [browser_autocomplete_cursor.js]
 skip-if = verify
-[browser_autocomplete_edit_completed.js]
 [browser_autocomplete_enter_race.js]
 [browser_autocomplete_no_title.js]
 [browser_autocomplete_readline_navigation.js]
 skip-if = os != "mac" # Mac only feature
 [browser_autocomplete_tag_star_visibility.js]
 [browser_dragdropURL.js]
 [browser_keyword_select_and_type.js]
-[browser_new_tab_urlbar_reset.js]
 [browser_pasteAndGo.js]
 subsuite = clipboard
 [browser_remotetab.js]
 [browser_removeUnsafeProtocolsFromURLBarPaste.js]
 subsuite = clipboard
 [browser_search_favicon.js]
 [browser_switchtab_copy.js]
 subsuite = clipboard
@@ -89,37 +85,40 @@ support-files =
   ../browser/searchSuggestionEngine.sjs
 [browser_urlbarSearchTelemetry.js]
 support-files =
   ../browser/searchSuggestionEngine.xml
   ../browser/searchSuggestionEngine.sjs
 [browser_urlbarTokenAlias.js]
 [browser_urlbar_autoFill_backspaced.js]
 [browser_urlbar_canonize_on_autofill.js]
-[browser_urlbar_remove_match.js]
 [browser_urlbar_stop_pending.js]
 support-files =
   ../browser/slow-page.sjs
 [browser_urlbarStopSearchOnSelection.js]
 support-files =
   ../browser/searchSuggestionEngineSlow.xml
   ../browser/searchSuggestionEngine.sjs
 [browser_urlbarValueOnTabSwitch.js]
 
 
 # These are tests that are already running with QuantumBar, but we want to run them
 # against both the legacy urlbar and the new QuantumBar. The references in this
 # directory will run them against the old urlbar as per the pref above.
 
+[../browser/browser_action_searchengine.js]
+[../browser/browser_action_searchengine_alias.js]
+[../browser/browser_autocomplete_edit_completed.js]
 [../browser/browser_canonizeURL.js]
 [../browser/browser_URLBarSetURI.js]
 skip-if = (os == "linux" || os == "mac") && debug # bug 970052, bug 970053
 [../browser/browser_locationBarCommand.js]
 [../browser/browser_locationBarExternalLoad.js]
 [../browser/browser_moz_action_link.js]
+[../browser/browser_new_tab_urlbar_reset.js]
 [../browser/browser_populateAfterPushState.js]
 [../browser/browser_redirect_error.js]
 support-files = ../browser/redirect_error.sjs
 [../browser/browser_switchToTabHavingURI_aOpenParams.js]
 [../browser/browser_urlbarAboutHomeLoading.js]
 [../browser/browser_urlbarCopying.js]
 subsuite = clipboard
 support-files =
@@ -147,14 +146,15 @@ support-files =
 [../browser/browser_urlbar_searchsettings.js]
 [../browser/browser_urlbar_speculative_connect.js]
 support-files =
   ../browser/searchSuggestionEngine2.xml
   ../browser/searchSuggestionEngine.sjs
 [../browser/browser_urlbar_speculative_connect_not_with_client_cert.js]
 [../browser/browser_urlbar_remoteness_switch.js]
 run-if = e10s
+[../browser/browser_urlbar_remove_match.js]
 [../browser/browser_userTypedValue.js]
 support-files = ../browser/file_userTypedValue.html
 [../browser/browser_wyciwyg_urlbarCopying.js]
 subsuite = clipboard
 support-files =
   ../browser/test_wyciwyg_copying.html
--- a/browser/components/urlbar/tests/legacy/browser_autocomplete_a11y_label.js
+++ b/browser/components/urlbar/tests/legacy/browser_autocomplete_a11y_label.js
@@ -1,25 +1,34 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
+/**
+ * This test ensures that we produce good labels for a11y purposes.
+ */
+
 const SUGGEST_ALL_PREF = "browser.search.suggest.enabled";
 const SUGGEST_URLBAR_PREF = "browser.urlbar.suggest.searches";
 const TEST_ENGINE_BASENAME = "searchSuggestionEngine.xml";
 
 add_task(async function switchToTab() {
   let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, "about:about");
 
   await promiseAutocompleteResultPopup("% about");
-  let result = await waitForAutocompleteResultAt(1);
-  is(result.getAttribute("type"), "switchtab", "Expect right type attribute");
-  is(result.label, "about:about about:about Tab", "Result a11y label should be: <title> <url> Tab");
+  let result = await UrlbarTestUtils.getDetailsOfResultAt(window, 1);
+  Assert.equal(result.type, UrlbarUtils.RESULT_TYPE.TAB_SWITCH,
+    "Should have a switch tab result");
 
-  gURLBar.popup.hidePopup();
-  await promisePopupHidden(gURLBar.popup);
+  // XXX Bug 1524539. This fails on QuantumBar because we're producing different
+  // outputs. Once we confirm accessibilty is ok with the new format, we
+  // should update and have this test running on QuantumBar.
+  let element = await UrlbarTestUtils.waitForAutocompleteResultAt(window, 1);
+  is(element.label, "about:about about:about Tab", "Result a11y label should be: <title> <url> Tab");
+
+  await UrlbarTestUtils.promisePopupClose(window);
   gBrowser.removeTab(tab);
 });
 
 add_task(async function searchSuggestions() {
   let engine = await SearchTestUtils.promiseNewSearchEngine(
     getRootDirectory(gTestPath) + TEST_ENGINE_BASENAME);
   let oldCurrentEngine = Services.search.defaultEngine;
   Services.search.defaultEngine = engine;
@@ -28,32 +37,38 @@ add_task(async function searchSuggestion
   Services.prefs.setBoolPref(SUGGEST_URLBAR_PREF, true);
   registerCleanupFunction(function() {
     Services.search.defaultEngine = oldCurrentEngine;
     Services.prefs.clearUserPref(SUGGEST_ALL_PREF);
     Services.prefs.setBoolPref(SUGGEST_URLBAR_PREF, suggestionsEnabled);
   });
 
   await promiseAutocompleteResultPopup("foo");
-  await waitForAutocompleteResultAt(2);
+  let length = await UrlbarTestUtils.getResultCount(window);
   // Don't assume that the search doesn't match history or bookmarks left around
   // by earlier tests.
-  Assert.ok(gURLBar.popup.richlistbox.itemChildren.length >= 3,
-            "Should get at least heuristic result + two search suggestions");
+  Assert.greaterOrEqual(length, 3,
+    "Should get at least heuristic result + two search suggestions");
   // The first expected search is the search term itself since the heuristic
   // result will come before the search suggestions.
   let expectedSearches = [
     "foo",
     "foofoo",
     "foobar",
   ];
-  for (let child of gURLBar.popup.richlistbox.itemChildren) {
-    if (child.getAttribute("type").split(/\s+/).includes("searchengine")) {
-      Assert.ok(expectedSearches.length > 0);
+  for (let i = 0; i < length; i++) {
+    let result = await UrlbarTestUtils.getDetailsOfResultAt(window, i);
+    if (result.type === UrlbarUtils.RESULT_TYPE.SEARCH) {
+      Assert.greaterOrEqual(expectedSearches.length, 0,
+        "Should still have expected searches remaining");
       let suggestion = expectedSearches.shift();
-      Assert.equal(child.label, suggestion + " browser_searchSuggestionEngine searchSuggestionEngine.xml Search",
-                   "Result label should be: <search term> <engine name> Search");
+      // XXX Bug 1524539. This fails on QuantumBar because we're producing different
+      // outputs. Once we confirm accessibilty is ok with the new format, we
+      // should update and have this test running on QuantumBar.
+      let element = await UrlbarTestUtils.waitForAutocompleteResultAt(window, i);
+      Assert.equal(element.label,
+        suggestion + " browser_searchSuggestionEngine searchSuggestionEngine.xml Search",
+        "Result label should be: <search term> <engine name> Search");
     }
   }
   Assert.ok(expectedSearches.length == 0);
-  gURLBar.popup.hidePopup();
-  await promisePopupHidden(gURLBar.popup);
+  await UrlbarTestUtils.promisePopupClose(window);
 });
--- a/browser/components/urlbar/tests/legacy/browser_autocomplete_autoselect.js
+++ b/browser/components/urlbar/tests/legacy/browser_autocomplete_autoselect.js
@@ -1,33 +1,40 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
+/**
+ * Tests that the first item is correctly autoselected and some navigation
+ * around the results list.
+ */
+
 const ONEOFF_URLBAR_PREF = "browser.urlbar.oneOffSearches";
 
 function repeat(limit, func) {
   for (let i = 0; i < limit; i++) {
     func(i);
   }
 }
 
-function is_selected(index) {
-  is(gURLBar.popup.richlistbox.selectedIndex, index, `Item ${index + 1} should be selected`);
+function assertSelected(index) {
+  Assert.equal(UrlbarTestUtils.getSelectedIndex(window),
+    index, "Should have selected the correct item");
   // Also check the "selected" attribute, to ensure it is not a "fake" selection
   // due to binding misbehaviors.
-  ok(gURLBar.popup.richlistbox.selectedItem.hasAttribute("selected"),
-     `Item ${index + 1} should have the "selected" attribute`);
+  let element = UrlbarTestUtils.getSelectedElement(window);
+  Assert.ok(element.hasAttribute("selected"),
+    "Should have the selected attribute on the row element");
 
   // This is true because although both the listbox and the one-offs can have
   // selections, the test doesn't check that.
   is(gURLBar.popup.oneOffSearchButtons.selectedButton, null,
      "A result is selected, so the one-offs should not have a selection");
 }
 
-function is_selected_one_off(index) {
+function assertSelected_one_off(index) {
   is(gURLBar.popup.oneOffSearchButtons.selectedButtonIndex, index,
      "Expected one-off button should be selected");
 
   // This is true because although both the listbox and the one-offs can have
   // selections, the test doesn't check that.
   is(gURLBar.popup.richlistbox.selectedIndex, -1,
      "A one-off is selected, so the listbox should not have a selection");
 }
@@ -46,54 +53,54 @@ add_task(async function() {
   repeat(maxResults, i => {
     visits.push({
       uri: makeURI("http://example.com/autocomplete/?" + i),
     });
   });
   await PlacesTestUtils.addVisits(visits);
 
   await promiseAutocompleteResultPopup("example.com/autocomplete");
-  await waitForAutocompleteResultAt(maxResults - 1);
+
+  let resultCount = await UrlbarTestUtils.getResultCount(window);
 
-  let popup = gURLBar.popup;
-  let results = popup.richlistbox.itemChildren;
-  is(results.length, maxResults,
-     "Should get maxResults=" + maxResults + " results");
-  is_selected(0);
+  Assert.equal(resultCount, maxResults,
+    "Should get the expected amount of results");
+  assertSelected(0);
 
   info("Key Down to select the next item");
   EventUtils.synthesizeKey("KEY_ArrowDown");
-  is_selected(1);
+  assertSelected(1);
 
   info("Key Down maxResults-1 times should select the first one-off");
   repeat(maxResults - 1, () => EventUtils.synthesizeKey("KEY_ArrowDown"));
-  is_selected_one_off(0);
+  assertSelected_one_off(0);
 
   info("Key Down numButtons-1 should select the last one-off");
   let numButtons =
     gURLBar.popup.oneOffSearchButtons.getSelectableButtons(true).length;
   repeat(numButtons - 1, () => EventUtils.synthesizeKey("KEY_ArrowDown"));
-  is_selected_one_off(numButtons - 1);
+  assertSelected_one_off(numButtons - 1);
 
   info("Key Down twice more should select the second result");
   repeat(2, () => EventUtils.synthesizeKey("KEY_ArrowDown"));
-  is_selected(1);
+  assertSelected(1);
 
   info("Key Down maxResults + numButtons times should wrap around");
   repeat(maxResults + numButtons,
          () => EventUtils.synthesizeKey("KEY_ArrowDown"));
-  is_selected(1);
+  assertSelected(1);
 
   info("Key Up maxResults + numButtons times should wrap around the other way");
   repeat(maxResults + numButtons, () => EventUtils.synthesizeKey("KEY_ArrowUp"));
-  is_selected(1);
+  assertSelected(1);
 
   info("Page Up will go up the list, but not wrap");
   EventUtils.synthesizeKey("KEY_PageUp");
-  is_selected(0);
+  assertSelected(0);
 
   info("Page Up again will wrap around to the end of the list");
   EventUtils.synthesizeKey("KEY_PageUp");
-  is_selected(maxResults - 1);
+  assertSelected(maxResults - 1);
 
-  EventUtils.synthesizeKey("KEY_Escape");
-  await promisePopupHidden(gURLBar.popup);
+  await UrlbarTestUtils.promisePopupClose(window, () => {
+    EventUtils.synthesizeKey("KEY_Escape");
+  });
 });
--- a/browser/themes/shared/urlbar-autocomplete.inc.css
+++ b/browser/themes/shared/urlbar-autocomplete.inc.css
@@ -35,16 +35,17 @@
   font: menu;
 }
 
 .urlbarView-body-inner {
   box-sizing: border-box;
 }
 
 .urlbarView-results {
+  box-sizing: border-box;
   padding: @urlbarViewPadding@;
   white-space: nowrap;
 }
 
 .urlbarView-row {
   border-radius: 2px;
   padding: 7px;
   padding-inline-start: calc(var(--item-padding-start, calc(7px + @urlbarViewFaviconOffset@)) - @urlbarViewFaviconOffset@);
--- a/devtools/client/webconsole/test/mochitest/browser.ini
+++ b/devtools/client/webconsole/test/mochitest/browser.ini
@@ -210,16 +210,17 @@ skip-if = verify
 [browser_jsterm_autocomplete_native_getters.js]
 [browser_jsterm_autocomplete_nav_and_tab_key.js]
 [browser_jsterm_autocomplete_paste_undo.js]
 [browser_jsterm_autocomplete_return_key_no_selection.js]
 [browser_jsterm_autocomplete_return_key.js]
 [browser_jsterm_autocomplete_width.js]
 [browser_jsterm_autocomplete_will_navigate.js]
 [browser_jsterm_autocomplete-properties-with-non-alphanumeric-names.js]
+[browser_jsterm_await_assignments.js]
 [browser_jsterm_await_concurrent.js]
 [browser_jsterm_await_error.js]
 [browser_jsterm_await_helper_dollar_underscore.js]
 [browser_jsterm_await_paused.js]
 [browser_jsterm_await.js]
 [browser_jsterm_completion_bracket_cached_results.js]
 [browser_jsterm_completion_bracket.js]
 [browser_jsterm_completion_case_sensitivity.js]
new file mode 100644
--- /dev/null
+++ b/devtools/client/webconsole/test/mochitest/browser_jsterm_await_assignments.js
@@ -0,0 +1,75 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+// Test that top-level await expressions work as expected.
+
+"use strict";
+
+const TEST_URI = "data:text/html;charset=utf-8,Web Console test top-level await bindings";
+
+add_task(async function() {
+  // Enable await mapping.
+  await pushPref("devtools.debugger.features.map-await-expression", true);
+
+  // Run test with legacy JsTerm
+  await pushPref("devtools.webconsole.jsterm.codeMirror", false);
+  await performTests();
+  // And then run it with the CodeMirror-powered one.
+  await pushPref("devtools.webconsole.jsterm.codeMirror", true);
+  await performTests();
+});
+
+async function performTests() {
+  const hud = await openNewTabAndConsole(TEST_URI);
+
+  info("Check that declaring a let variable does not create a global property");
+  await hud.jsterm.execute(
+    `let bazA = await new Promise(r => setTimeout(() => r("local-bazA"), 10))`);
+  await checkVariable(hud, "bazA");
+
+  info("Check that declaring a const variable does not create a global property");
+  await hud.jsterm.execute(
+    `const bazB = await new Promise(r => setTimeout(() => r("local-bazB"), 10))`);
+  await checkVariable(hud, "bazB");
+
+  info("Check that complex variable declarations work as expected");
+  await hud.jsterm.execute(`
+    let bazC = "local-bazC", bazD, bazE = "local-bazE";
+    bazD = await new Promise(r => setTimeout(() => r("local-bazD"), 10));
+    let {
+      a: bazF,
+      b: {
+        c: {
+          bazG = "local-bazG",
+          d: bazH,
+          e: [bazI, bazJ = "local-bazJ"]
+        },
+        d: bazK = "local-bazK"
+      }
+    } = await ({
+      a: "local-bazF",
+      b: {
+        c: {
+          d: "local-bazH",
+          e: ["local-bazI"]
+        }
+      }
+    });`);
+  await checkVariable(hud, "bazC");
+  await checkVariable(hud, "bazD");
+  await checkVariable(hud, "bazE");
+  await checkVariable(hud, "bazF");
+  await checkVariable(hud, "bazG");
+  await checkVariable(hud, "bazH");
+  await checkVariable(hud, "bazI");
+  await checkVariable(hud, "bazJ");
+  await checkVariable(hud, "bazK");
+}
+
+async function checkVariable(hud, varName) {
+  await executeAndWaitForMessage(hud, `window.${varName}`, `undefined`);
+  ok(true, `The ${varName} assignment did not create a global variable`);
+  await executeAndWaitForMessage(hud, varName, `"local-${varName}"`);
+  ok(true, `"${varName}" has the expected value`);
+}
+
--- a/devtools/client/webconsole/webconsole.js
+++ b/devtools/client/webconsole/webconsole.js
@@ -248,17 +248,21 @@ WebConsole.prototype = {
     // substitution for sourcemapped script (i.e. evaluated `myVar.trim()` might need to
     // be transformed into `a.trim()`).
     const panel = toolbox && toolbox.getPanel("jsdebugger");
     if (panel) {
       return panel.getMappedExpression(expression);
     }
 
     if (this.parserService && expression.includes("await ")) {
-      return this.parserService.mapExpression(expression);
+      const shouldMapBindings = false;
+      const shouldMapAwait = true;
+      const res = this.parserService.mapExpression(
+        expression, null, null, shouldMapBindings, shouldMapAwait);
+      return res;
     }
 
     return null;
   },
 
   /**
    * A common access point for the client-side parser service that any panel can use.
    */
--- a/devtools/server/actors/inspector/node.js
+++ b/devtools/server/actors/inspector/node.js
@@ -288,17 +288,20 @@ const NodeActor = protocol.ActorClassWit
    * uses all parsers registered via event-parsers.js.registerEventParser() to
    * check if there are any event listeners.
    */
   get _hasEventListeners() {
     return this._eventCollector.hasEventListeners(this.rawNode);
   },
 
   writeAttrs: function() {
-    if (!this.rawNode.attributes) {
+    // If the node has no attributes or this.rawNode is the document node and a
+    // node with `name="attributes"` exists in the DOM we need to bail.
+    if (!this.rawNode.attributes ||
+        !(this.rawNode.attributes instanceof NamedNodeMap)) {
       return undefined;
     }
 
     return [...this.rawNode.attributes].map(attr => {
       return {namespace: attr.namespace, name: attr.name, value: attr.value };
     });
   },
 
--- a/devtools/shared/builtin-modules.js
+++ b/devtools/shared/builtin-modules.js
@@ -19,16 +19,17 @@ const jsmScope = require("resource://dev
 const { Services } = require("resource://gre/modules/Services.jsm");
 // Steal various globals only available in JSM scope (and not Sandbox one)
 const {
   console,
   DOMPoint,
   DOMQuad,
   DOMRect,
   HeapSnapshot,
+  NamedNodeMap,
   NodeFilter,
   StructuredCloneHolder,
   TelemetryStopwatch,
 } = Cu.getGlobalForObject(jsmScope);
 
 // Create a single Sandbox to access global properties needed in this module.
 // Sandbox are memory expensive, so we should create as little as possible.
 const {
@@ -286,16 +287,17 @@ exports.globals = {
   // Bug 1248830 will work out a better plan here for our content module
   // loading needs, especially as we head towards devtools.html.
   define(factory) {
     factory(this.require, this.exports, this.module);
   },
   DOMParser,
   DOMPoint,
   DOMQuad,
+  NamedNodeMap,
   NodeFilter,
   DOMRect,
   Element,
   Event,
   FileReader,
   FormData,
   isWorker: false,
   loader: {
--- a/dom/html/HTMLSourceElement.cpp
+++ b/dom/html/HTMLSourceElement.cpp
@@ -81,35 +81,34 @@ nsresult HTMLSourceElement::AfterSetAttr
   }
   // If we are associated with a <picture> with a valid <img>, notify it of
   // responsive parameter changes
   Element* parent = nsINode::GetParentElement();
   if (aNameSpaceID == kNameSpaceID_None &&
       (aName == nsGkAtoms::srcset || aName == nsGkAtoms::sizes ||
        aName == nsGkAtoms::media || aName == nsGkAtoms::type) &&
       parent && parent->IsHTMLElement(nsGkAtoms::picture)) {
+    if (aName == nsGkAtoms::media) {
+      UpdateMediaList(aValue);
+    }
+
     nsString strVal = aValue ? aValue->GetStringValue() : EmptyString();
     // Find all img siblings after this <source> and notify them of the change
     nsCOMPtr<nsIContent> sibling = AsContent();
     while ((sibling = sibling->GetNextSibling())) {
-      if (sibling->IsHTMLElement(nsGkAtoms::img)) {
-        HTMLImageElement* img = static_cast<HTMLImageElement*>(sibling.get());
+      if (auto* img = HTMLImageElement::FromNode(sibling)) {
         if (aName == nsGkAtoms::srcset) {
-          img->PictureSourceSrcsetChanged(AsContent(), strVal, aNotify);
+          img->PictureSourceSrcsetChanged(this, strVal, aNotify);
         } else if (aName == nsGkAtoms::sizes) {
-          img->PictureSourceSizesChanged(AsContent(), strVal, aNotify);
-        } else if (aName == nsGkAtoms::media) {
-          UpdateMediaList(aValue);
-          img->PictureSourceMediaOrTypeChanged(AsContent(), aNotify);
-        } else if (aName == nsGkAtoms::type) {
-          img->PictureSourceMediaOrTypeChanged(AsContent(), aNotify);
+          img->PictureSourceSizesChanged(this, strVal, aNotify);
+        } else if (aName == nsGkAtoms::media || aName == nsGkAtoms::type) {
+          img->PictureSourceMediaOrTypeChanged(this, aNotify);
         }
       }
     }
-
   } else if (aNameSpaceID == kNameSpaceID_None && aName == nsGkAtoms::media) {
     UpdateMediaList(aValue);
   } else if (aNameSpaceID == kNameSpaceID_None && aName == nsGkAtoms::src) {
     mSrcTriggeringPrincipal = nsContentUtils::GetAttrTriggeringPrincipal(
         this, aValue ? aValue->GetStringValue() : EmptyString(),
         aMaybeScriptedPrincipal);
     mSrcMediaSource = nullptr;
     if (aValue) {
--- a/dom/media/MediaStreamGraph.cpp
+++ b/dom/media/MediaStreamGraph.cpp
@@ -2548,20 +2548,27 @@ bool SourceMediaStream::PullNewData(Grap
       streamPullingEnabled = true;
       break;
     }
   }
   // Compute how much stream time we'll need assuming we don't block
   // the stream at all.
   StreamTime t = GraphTimeToStreamTime(aDesiredUpToTime);
   for (const TrackData& track : mUpdateTracks) {
-    if (track.mCommands & TrackEventCommand::TRACK_EVENT_ENDED) {
+    if (track.mCommands & TRACK_END) {
       continue;
     }
-    StreamTime current = track.mEndOfFlushedData + track.mData->GetDuration();
+    StreamTime current;
+    if (track.mCommands & TRACK_CREATE) {
+      // This track hasn't been created yet. Use the stream's current time
+      // (which the track will get as its start time later).
+      current = GraphTimeToStreamTime(GraphImpl()->mStateComputedTime);
+    } else {
+      current = track.mEndOfFlushedData + track.mData->GetDuration();
+    }
     if (t <= current) {
       continue;
     }
     if (!track.mPullingEnabled) {
       if (streamPullingEnabled) {
         LOG(LogLevel::Verbose,
             ("%p: Pulling disabled for track but enabled for stream, append "
              "null data; stream=%p track=%d t=%f current end=%f",
@@ -2612,18 +2619,18 @@ void SourceMediaStream::ExtractPendingIn
     if (data->mCommands & SourceMediaStream::TRACK_CREATE) {
       MediaSegment* segment = data->mData.forget();
       LOG(LogLevel::Debug,
           ("%p: SourceMediaStream %p creating track %d, start %" PRId64
            ", initial end %" PRId64,
            GraphImpl(), this, data->mID, int64_t(streamCurrentTime),
            int64_t(segment->GetDuration())));
 
+      segment->InsertNullDataAtStart(streamCurrentTime);
       data->mEndOfFlushedData += segment->GetDuration();
-      segment->InsertNullDataAtStart(streamCurrentTime);
       mTracks.AddTrack(data->mID, streamCurrentTime, segment);
       // The track has taken ownership of data->mData, so let's replace
       // data->mData with an empty clone.
       data->mData = segment->CreateEmptyClone();
       data->mCommands &= ~SourceMediaStream::TRACK_CREATE;
     } else if (data->mData->GetDuration() > 0) {
       MediaSegment* dest = mTracks.FindTrack(data->mID)->GetSegment();
       LOG(LogLevel::Verbose,
--- a/js/src/vm/ObjectGroup.cpp
+++ b/js/src/vm/ObjectGroup.cpp
@@ -197,54 +197,50 @@ void ObjectGroup::setAddendum(AddendumKi
     }
   }
   return false;
 }
 
 /* static */ bool ObjectGroup::useSingletonForAllocationSite(JSScript* script,
                                                              jsbytecode* pc,
                                                              JSProtoKey key) {
-  // The return value of this method can either be tested like a boolean or
-  // passed to a NewObject method.
-  JS_STATIC_ASSERT(GenericObject == 0);
-
   /*
    * Objects created outside loops in global and eval scripts should have
    * singleton types. For now this is only done for plain objects, but not
    * typed arrays or normal arrays.
    */
 
   if (script->functionNonDelazifying() && !script->treatAsRunOnce()) {
-    return GenericObject;
+    return false;
   }
 
   if (key != JSProto_Object) {
-    return GenericObject;
+    return false;
   }
 
   // All loops in the script will have a try note indicating their boundary.
 
   if (!script->hasTrynotes()) {
-    return SingletonObject;
+    return true;
   }
 
   uint32_t offset = script->pcToOffset(pc);
 
   for (const JSTryNote& tn : script->trynotes()) {
     if (tn.kind != JSTRY_FOR_IN && tn.kind != JSTRY_FOR_OF &&
         tn.kind != JSTRY_LOOP) {
       continue;
     }
 
     if (tn.start <= offset && offset < tn.start + tn.length) {
-      return GenericObject;
+      return false;
     }
   }
 
-  return SingletonObject;
+  return true;
 }
 
 /////////////////////////////////////////////////////////////////////
 // JSObject
 /////////////////////////////////////////////////////////////////////
 
 bool GlobalObject::shouldSplicePrototype() {
   // During bootstrapping, we need to make sure not to splice a new prototype in
--- a/layout/base/PresShell.cpp
+++ b/layout/base/PresShell.cpp
@@ -7173,48 +7173,56 @@ bool PresShell::EventHandler::GetRetarge
 }
 
 nsIFrame* PresShell::EventHandler::GetFrameForHandlingEventWith(
     WidgetGUIEvent* aGUIEvent, Document* aRetargetDocument,
     nsIFrame* aFrameForPresShell) {
   MOZ_ASSERT(aGUIEvent);
   MOZ_ASSERT(aRetargetDocument);
 
-  nsCOMPtr<nsIPresShell> presShell = aRetargetDocument->GetShell();
+  nsCOMPtr<nsIPresShell> retargetPresShell = aRetargetDocument->GetShell();
   // Even if the document doesn't have PresShell, i.e., it's invisible, we
   // need to dispatch only KeyboardEvent in its nearest visible document
   // because key focus shouldn't be caught by invisible document.
-  if (!presShell) {
+  if (!retargetPresShell) {
     if (!aGUIEvent->HasKeyEventMessage()) {
       return nullptr;
     }
     Document* retargetEventDoc = aRetargetDocument;
-    while (!presShell) {
+    while (!retargetPresShell) {
       retargetEventDoc = retargetEventDoc->GetParentDocument();
       if (!retargetEventDoc) {
         return nullptr;
       }
-      presShell = retargetEventDoc->GetShell();
-    }
-  }
-
-  if (presShell != mPresShell) {
-    nsIFrame* frame = presShell->GetRootFrame();
-    if (!frame) {
-      if (aGUIEvent->mMessage == eQueryTextContent ||
-          aGUIEvent->IsContentCommandEvent()) {
-        return nullptr;
-      }
-
-      frame = GetNearestFrameContainingPresShell(presShell);
-    }
-
-    return frame;
-  }
-  return aFrameForPresShell;
+      retargetPresShell = retargetEventDoc->GetShell();
+    }
+  }
+
+  // If the found PresShell is this instance, caller needs to keep handling
+  // aGUIEvent by itself.  Therefore, return the given frame which was set
+  // to aFrame of HandleEvent().
+  if (retargetPresShell == mPresShell) {
+    return aFrameForPresShell;
+  }
+
+  // Use root frame of the new PresShell if there is.
+  nsIFrame* rootFrame = retargetPresShell->GetRootFrame();
+  if (rootFrame) {
+    return rootFrame;
+  }
+
+  // Otherwise, and if aGUIEvent requires content of PresShell, caller should
+  // stop handling the event.
+  if (aGUIEvent->mMessage == eQueryTextContent ||
+      aGUIEvent->IsContentCommandEvent()) {
+    return nullptr;
+  }
+
+  // Otherwise, use nearest ancestor frame which includes the PresShell.
+  return GetNearestFrameContainingPresShell(retargetPresShell);
 }
 
 Document* PresShell::GetPrimaryContentDocument() {
   nsPresContext* context = GetPresContext();
   if (!context || !context->IsRoot()) {
     return nullptr;
   }
 
--- a/media/webrtc/signaling/gtest/audioconduit_unittests.cpp
+++ b/media/webrtc/signaling/gtest/audioconduit_unittests.cpp
@@ -84,16 +84,27 @@ class AudioConduitTest : public ::testin
 
 TEST_F(AudioConduitTest, TestConfigureSendMediaCodec) {
   MediaConduitErrorCode ec;
 
   // defaults
   AudioCodecConfig codecConfig(114, "opus", 48000, 2, false);
   ec = mAudioConduit->ConfigureSendMediaCodec(&codecConfig);
   ASSERT_EQ(ec, kMediaConduitNoError);
+  {
+    const webrtc::SdpAudioFormat& f =
+        mCall->mAudioSendConfig.send_codec_spec->format;
+    ASSERT_EQ(f.name, "opus");
+    ASSERT_EQ(f.clockrate_hz, 48000);
+    ASSERT_EQ(f.num_channels, 2UL);
+    ASSERT_NE(f.parameters.find("stereo"), f.parameters.end());
+    ASSERT_EQ(f.parameters.at("stereo"), "1");
+    ASSERT_EQ(f.parameters.find("maxplaybackrate"), f.parameters.end());
+    ASSERT_EQ(f.parameters.find("useinbandfec"), f.parameters.end());
+  }
 
   // null codec
   ec = mAudioConduit->ConfigureSendMediaCodec(nullptr);
   ASSERT_EQ(ec, kMediaConduitMalformedArgument);
 
   // empty codec name
   codecConfig = AudioCodecConfig(114, "", 48000, 2, false);
   ec = mAudioConduit->ConfigureSendMediaCodec(&codecConfig);
@@ -105,33 +116,96 @@ TEST_F(AudioConduitTest, TestConfigureSe
   memset(longName, 'A', longNameLength - 2);
   longName[longNameLength - 1] = 0;
   codecConfig = AudioCodecConfig(114, longName, 48000, 2, false);
   ec = mAudioConduit->ConfigureSendMediaCodec(&codecConfig);
   ASSERT_EQ(ec, kMediaConduitMalformedArgument);
   delete[] longName;
 }
 
+TEST_F(AudioConduitTest, TestConfigureSendOpusMono) {
+  MediaConduitErrorCode ec;
+
+  // opus mono
+  AudioCodecConfig codecConfig = AudioCodecConfig(114, "opus", 48000, 1, false);
+  ec = mAudioConduit->ConfigureSendMediaCodec(&codecConfig);
+  ASSERT_EQ(ec, kMediaConduitNoError);
+  {
+    const webrtc::SdpAudioFormat& f =
+        mCall->mAudioSendConfig.send_codec_spec->format;
+    ASSERT_EQ(f.name, "opus");
+    ASSERT_EQ(f.clockrate_hz, 48000);
+    ASSERT_EQ(f.num_channels, 1UL);
+    ASSERT_EQ(f.parameters.find("stereo"), f.parameters.end());
+    ASSERT_EQ(f.parameters.find("maxplaybackrate"), f.parameters.end());
+    ASSERT_EQ(f.parameters.find("useinbandfec"), f.parameters.end());
+  }
+}
+
+TEST_F(AudioConduitTest, TestConfigureSendOpusFEC) {
+  MediaConduitErrorCode ec;
+
+  // opus with inband Forward Error Correction
+  AudioCodecConfig codecConfig = AudioCodecConfig(114, "opus", 48000, 2, true);
+  ec = mAudioConduit->ConfigureSendMediaCodec(&codecConfig);
+  ASSERT_EQ(ec, kMediaConduitNoError);
+  {
+    const webrtc::SdpAudioFormat& f =
+        mCall->mAudioSendConfig.send_codec_spec->format;
+    ASSERT_EQ(f.name, "opus");
+    ASSERT_EQ(f.clockrate_hz, 48000);
+    ASSERT_EQ(f.num_channels, 2UL);
+    ASSERT_NE(f.parameters.find("stereo"), f.parameters.end());
+    ASSERT_EQ(f.parameters.at("stereo"), "1");
+    ASSERT_NE(f.parameters.find("useinbandfec"), f.parameters.end());
+    ASSERT_EQ(f.parameters.at("useinbandfec"), "1");
+    ASSERT_EQ(f.parameters.find("maxplaybackrate"), f.parameters.end());
+  }
+}
+
+TEST_F(AudioConduitTest, TestConfigureSendMaxPlaybackRate) {
+  MediaConduitErrorCode ec;
+
+  AudioCodecConfig codecConfig = AudioCodecConfig(114, "opus", 48000, 2, false);
+  codecConfig.mMaxPlaybackRate = 1234;
+  ec = mAudioConduit->ConfigureSendMediaCodec(&codecConfig);
+  ASSERT_EQ(ec, kMediaConduitNoError);
+  {
+    const webrtc::SdpAudioFormat& f =
+        mCall->mAudioSendConfig.send_codec_spec->format;
+    ASSERT_EQ(f.name, "opus");
+    ASSERT_EQ(f.clockrate_hz, 48000);
+    ASSERT_EQ(f.num_channels, 2UL);
+    ASSERT_NE(f.parameters.find("stereo"), f.parameters.end());
+    ASSERT_EQ(f.parameters.at("stereo"), "1");
+    ASSERT_EQ(f.parameters.find("useinbandfec"), f.parameters.end());
+    ASSERT_NE(f.parameters.find("maxplaybackrate"), f.parameters.end());
+    ASSERT_EQ(f.parameters.at("maxplaybackrate"), "1234");
+  }
+}
+
 TEST_F(AudioConduitTest, TestConfigureReceiveMediaCodecs) {
   MediaConduitErrorCode ec;
 
-  // just opus
+  // just default opus stereo
   std::vector<UniquePtr<mozilla::AudioCodecConfig>> codecs;
   codecs.emplace_back(new AudioCodecConfig(114, "opus", 48000, 2, false));
   ec = mAudioConduit->ConfigureRecvMediaCodecs(codecs);
   ASSERT_EQ(ec, kMediaConduitNoError);
   ASSERT_EQ(mCall->mAudioReceiveConfig.sync_group, "");
   ASSERT_EQ(mCall->mAudioReceiveConfig.decoder_map.size(), 1U);
   {
     const webrtc::SdpAudioFormat& f =
         mCall->mAudioReceiveConfig.decoder_map.at(114);
     ASSERT_EQ(f.name, "opus");
     ASSERT_EQ(f.clockrate_hz, 48000);
     ASSERT_EQ(f.num_channels, 2UL);
     ASSERT_EQ(f.parameters.at("stereo"), "1");
+    ASSERT_EQ(f.parameters.find("maxplaybackrate"), f.parameters.end());
+    ASSERT_EQ(f.parameters.find("useinbandfec"), f.parameters.end());
   }
 
   // multiple codecs
   codecs.clear();
   codecs.emplace_back(new AudioCodecConfig(9, "g722", 16000, 2, false));
   codecs.emplace_back(new AudioCodecConfig(114, "opus", 48000, 2, false));
   ec = mAudioConduit->ConfigureRecvMediaCodecs(codecs);
   ASSERT_EQ(ec, kMediaConduitNoError);
@@ -184,17 +258,63 @@ TEST_F(AudioConduitTest, TestConfigureRe
   memset(longName, 'A', longNameLength - 2);
   longName[longNameLength - 1] = 0;
   codecs.emplace_back(new AudioCodecConfig(100, longName, 48000, 42, false));
   ec = mAudioConduit->ConfigureRecvMediaCodecs(codecs);
   ASSERT_EQ(ec, kMediaConduitMalformedArgument);
   delete[] longName;
 }
 
-TEST_F(AudioConduitTest, TestConfigureMaxPlaybackRate) {
+TEST_F(AudioConduitTest, TestConfigureReceiveOpusMono) {
+  MediaConduitErrorCode ec;
+
+  // opus mono
+  std::vector<UniquePtr<mozilla::AudioCodecConfig>> codecs;
+  codecs.emplace_back(new AudioCodecConfig(114, "opus", 48000, 1, false));
+  ec = mAudioConduit->ConfigureRecvMediaCodecs(codecs);
+  ASSERT_EQ(ec, kMediaConduitNoError);
+  ASSERT_EQ(mCall->mAudioReceiveConfig.sync_group, "");
+  ASSERT_EQ(mCall->mAudioReceiveConfig.decoder_map.size(), 1U);
+  {
+    const webrtc::SdpAudioFormat& f =
+        mCall->mAudioReceiveConfig.decoder_map.at(114);
+    ASSERT_EQ(f.name, "opus");
+    ASSERT_EQ(f.clockrate_hz, 48000);
+    ASSERT_EQ(f.num_channels, 1UL);
+    ASSERT_EQ(f.parameters.find("stereo"), f.parameters.end());
+    ASSERT_EQ(f.parameters.find("maxplaybackrate"), f.parameters.end());
+    ASSERT_EQ(f.parameters.find("useinbandfec"), f.parameters.end());
+  }
+}
+
+TEST_F(AudioConduitTest, TestConfigureReceiveOpusFEC) {
+  MediaConduitErrorCode ec;
+
+  // opus with inband Forward Error Correction
+  std::vector<UniquePtr<mozilla::AudioCodecConfig>> codecs;
+  codecs.emplace_back(new AudioCodecConfig(114, "opus", 48000, 2, true));
+  ec = mAudioConduit->ConfigureRecvMediaCodecs(codecs);
+  ASSERT_EQ(ec, kMediaConduitNoError);
+  ASSERT_EQ(mCall->mAudioReceiveConfig.sync_group, "");
+  ASSERT_EQ(mCall->mAudioReceiveConfig.decoder_map.size(), 1U);
+  {
+    const webrtc::SdpAudioFormat& f =
+        mCall->mAudioReceiveConfig.decoder_map.at(114);
+    ASSERT_EQ(f.name, "opus");
+    ASSERT_EQ(f.clockrate_hz, 48000);
+    ASSERT_EQ(f.num_channels, 2UL);
+    ASSERT_NE(f.parameters.find("stereo"), f.parameters.end());
+    ASSERT_EQ(f.parameters.at("stereo"), "1");
+    ASSERT_NE(f.parameters.find("useinbandfec"), f.parameters.end());
+    ASSERT_EQ(f.parameters.at("useinbandfec"), "1");
+    ASSERT_EQ(f.parameters.find("maxplaybackrate"), f.parameters.end());
+  }
+}
+
+TEST_F(AudioConduitTest, TestConfigureReceiveMaxPlaybackRate) {
   MediaConduitErrorCode ec;
 
   std::vector<UniquePtr<mozilla::AudioCodecConfig>> codecs;
   codecs.emplace_back(new AudioCodecConfig(114, "opus", 48000, 2, false));
 
   codecs[0]->mMaxPlaybackRate = 0;
   ec = mAudioConduit->ConfigureRecvMediaCodecs(codecs);
   ASSERT_EQ(ec, kMediaConduitNoError);
--- a/media/webrtc/signaling/src/media-conduit/AudioConduit.cpp
+++ b/media/webrtc/signaling/src/media-conduit/AudioConduit.cpp
@@ -407,18 +407,22 @@ MediaConduitErrorCode WebrtcAudioConduit
     // if the codec param is invalid or diplicate, return error
     if ((condError = ValidateCodecConfig(codec.get(), false)) !=
         kMediaConduitNoError) {
       return condError;
     }
 
     webrtc::SdpAudioFormat::Parameters parameters;
     if (codec->mName == "opus") {
-      parameters = {{"stereo", "1"}};
-
+      if (codec->mChannels == 2) {
+        parameters = {{"stereo", "1"}};
+      }
+      if (codec->mFECEnabled) {
+        parameters["useinbandfec"] = "1";
+      }
       if (codec->mMaxPlaybackRate) {
         std::ostringstream o;
         o << codec->mMaxPlaybackRate;
         parameters["maxplaybackrate"] = o.str();
       }
     }
 
     webrtc::SdpAudioFormat format(codec->mName, codec->mFreq, codec->mChannels,
@@ -848,24 +852,28 @@ bool WebrtcAudioConduit::SendRtcp(const 
  */
 
 bool WebrtcAudioConduit::CodecConfigToWebRTCCodec(
     const AudioCodecConfig* codecInfo,
     webrtc::AudioSendStream::Config& config) {
   config.encoder_factory = webrtc::CreateBuiltinAudioEncoderFactory();
 
   webrtc::SdpAudioFormat::Parameters parameters;
-  if (codecInfo->mFECEnabled) {
-    parameters["useinbandfec"] = "1";
-  }
-
-  if (codecInfo->mName == "opus" && codecInfo->mMaxPlaybackRate) {
-    std::ostringstream o;
-    o << codecInfo->mMaxPlaybackRate;
-    parameters["maxplaybackrate"] = o.str();
+  if (codecInfo->mName == "opus") {
+    if (codecInfo->mChannels == 2) {
+      parameters["stereo"] = "1";
+    }
+    if (codecInfo->mFECEnabled) {
+      parameters["useinbandfec"] = "1";
+    }
+    if (codecInfo->mMaxPlaybackRate) {
+      std::ostringstream o;
+      o << codecInfo->mMaxPlaybackRate;
+      parameters["maxplaybackrate"] = o.str();
+    }
   }
 
   webrtc::SdpAudioFormat format(codecInfo->mName, codecInfo->mFreq,
                                 codecInfo->mChannels, parameters);
   webrtc::AudioSendStream::Config::SendCodecSpec spec(codecInfo->mType, format);
   config.send_codec_spec = spec;
 
   return true;
--- a/mobile/android/base/java/org/mozilla/gecko/media/GeckoMediaControlAgent.java
+++ b/mobile/android/base/java/org/mozilla/gecko/media/GeckoMediaControlAgent.java
@@ -95,34 +95,37 @@ public class GeckoMediaControlAgent {
         PLAYING,
         PAUSED,
         STOPPED
     }
 
     @RobocopTarget
     public static GeckoMediaControlAgent getInstance() {
         if (instance == null) {
+            Log.d(LOGTAG, "getInstance");
             instance = new GeckoMediaControlAgent();
         }
 
         return instance;
     }
 
     private GeckoMediaControlAgent() {}
 
     public void attachToContext(Context context) {
         if (isAttachedToContext()) {
             return;
         }
 
-        mContext = context;
+        Log.d(LOGTAG, "attachToContext");
+        mContext = context.getApplicationContext();
         initialize();
     }
 
-    private boolean isAttachedToContext() {
+    public boolean isAttachedToContext() {
+        Log.d(LOGTAG, "isAttachedToContext - context = " + mContext);
         return (mContext != null);
     }
 
     private void initialize() {
         // Need to make sure the receiver is registered and mInitialized has it's value set
         // serially, on the main thread.
         ThreadUtils.assertOnUiThread();
 
@@ -292,22 +295,17 @@ public class GeckoMediaControlAgent {
         }
 
         final Tab tab = AudioFocusAgent.getInstance().getActiveMediaTab();
 
         if (tab == null || tab.isPrivate()) {
             return;
         }
 
-        ThreadUtils.postToBackgroundThread(new Runnable() {
-            @Override
-            public void run() {
-                updateNotification(tab);
-            }
-        });
+        ThreadUtils.postToBackgroundThread(() -> updateNotification(tab));
     }
 
     /* package */ static boolean isMediaPlaying() {
         return sMediaState.equals(State.PLAYING);
     }
 
     public void handleAction(String action) {
         if (action == null) {
@@ -317,17 +315,17 @@ public class GeckoMediaControlAgent {
         if (!mInitialized && action.equals(ACTION_TAB_STATE_PLAYING)) {
             initialize();
         }
 
         if (!mInitialized) {
             return;
         }
 
-        Log.d(LOGTAG, "HandleAction, action = " + action + ", mediaState = " + sMediaState);
+        Log.d(LOGTAG, "handleAction, action = " + action + ", mediaState = " + sMediaState);
         switch (action) {
             case ACTION_RESUME :
                 mController.getTransportControls().play();
                 break;
             case ACTION_PAUSE :
                 mController.getTransportControls().pause();
                 break;
             case ACTION_STOP :
@@ -397,16 +395,17 @@ public class GeckoMediaControlAgent {
             updateMediaNotification(true, mediaNotification);
         } else {
             updateMediaNotification(false, mediaNotification);
         }
     }
 
     @SuppressLint("NewApi")
     /* package */ Notification createNotification(@NonNull MediaNotification mediaNotification) {
+        Log.d(LOGTAG, "createNotification - " + mediaNotification.toString());
         final Notification.MediaStyle style = new Notification.MediaStyle();
         style.setShowActionsInCompactView(0);
 
         final Notification.Builder notificationBuilder = new Notification.Builder(mContext)
                 .setSmallIcon(R.drawable.ic_status_logo)
                 .setLargeIcon(BitmapFactory.decodeByteArray(mediaNotification.getBitmapBytes(),
                         0, mediaNotification.getBitmapBytes().length))
                 .setContentTitle(mediaNotification.getTitle())
@@ -495,25 +494,27 @@ public class GeckoMediaControlAgent {
                 new Rect(left, top, right, bottom),
                 paint);
 
         coverArt.compress(Bitmap.CompressFormat.PNG, 100, stream);
         return stream.toByteArray();
     }
 
     private void updateMediaNotification(boolean startForeground, MediaNotification mediaNotification) {
+        Log.d(LOGTAG, "updateMediaNotification - startForeground " + startForeground + ", " + mediaNotification.toString());
         final Intent intent = new Intent(mContext, MediaControlService.class);
         if (!startForeground) {
             intent.setAction(ACTION_STOP_FOREGROUND);
         }
         intent.putExtra(GeckoMediaControlAgent.EXTRA_NOTIFICATION_DATA, mediaNotification);
         notifyForegroundService(intent);
     }
 
     private void shutdownForegroundService() {
+        Log.d(LOGTAG, "shutdownForegroundService");
         final Intent intent = new Intent(mContext, MediaControlService.class);
         intent.setAction(GeckoMediaControlAgent.ACTION_SHUTDOWN);
         notifyForegroundService(intent);
     }
 
     @SuppressLint("NewApi")
     private void notifyForegroundService(Intent intent) {
         if (AppConstants.Versions.preO) {
--- a/mobile/android/base/java/org/mozilla/gecko/media/MediaControlService.java
+++ b/mobile/android/base/java/org/mozilla/gecko/media/MediaControlService.java
@@ -34,30 +34,38 @@ public class MediaControlService extends
         }
     }
 
     @Override
     public int onStartCommand(Intent intent, int flags, int startId) {
         Log.d(LOGTAG, "onStartCommand");
 
         if (intent.hasExtra(GeckoMediaControlAgent.EXTRA_NOTIFICATION_DATA)) {
-            currentNotification = GeckoMediaControlAgent.getInstance().createNotification(
-                    (MediaNotification) intent.getParcelableExtra(GeckoMediaControlAgent.EXTRA_NOTIFICATION_DATA));
+            if (GeckoMediaControlAgent.getInstance().isAttachedToContext() ||
+                    /* bug 1516665 - If we are not attached to context but the build is not release or beta continue
+                    in order to gather more information */
+                    !AppConstants.RELEASE_OR_BETA) {
+                    currentNotification = GeckoMediaControlAgent.getInstance().createNotification(
+                            (MediaNotification) intent.getParcelableExtra(GeckoMediaControlAgent.EXTRA_NOTIFICATION_DATA));
+            } else {
+                intent.setAction(GeckoMediaControlAgent.ACTION_SHUTDOWN);
+            }
         }
 
         startForeground(R.id.mediaControlNotification, currentNotification);
 
         handleAction(intent, startId);
 
         return START_NOT_STICKY;
     }
 
     private void handleAction(Intent intent, int startId) {
-        if (intent.getAction() != null) {
-            final String action = intent.getAction();
+        final String action = intent.getAction();
+        Log.d(LOGTAG, "handleAction, action = " + action);
+        if (action != null) {
 
             switch (action) {
                 case GeckoMediaControlAgent.ACTION_SHUTDOWN:
                     stopForeground(true);
                     stopSelfResult(startId);
                     break;
 
                 case GeckoMediaControlAgent.ACTION_STOP_FOREGROUND:
--- a/mobile/android/base/java/org/mozilla/gecko/media/MediaNotification.java
+++ b/mobile/android/base/java/org/mozilla/gecko/media/MediaNotification.java
@@ -72,9 +72,16 @@ public final class MediaNotification imp
             return new MediaNotification(visibility, tabId, title, text, bitmapBytes);
         }
 
         @Override
         public MediaNotification[] newArray(int size) {
             return new MediaNotification[size];
         }
     };
+
+    @Override
+    public String toString() {
+        return "MediaNotification(" + visibility
+                + ", " + tabId
+                + ")";
+    }
 }
--- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java
@@ -2298,17 +2298,17 @@ public class GeckoSession implements Par
                 } else {
                     callback.sendError("Invalid mode");
                     return;
                 }
 
                 GeckoBundle[] choiceBundles = message.getBundleArray("choices");
                 PromptDelegate.Choice choices[];
                 if (choiceBundles == null || choiceBundles.length == 0) {
-                    choices = null;
+                    choices = new PromptDelegate.Choice[0];
                 } else {
                     choices = new PromptDelegate.Choice[choiceBundles.length];
                     for (int i = 0; i < choiceBundles.length; i++) {
                         choices[i] = new PromptDelegate.Choice(choiceBundles[i]);
                     }
                 }
                 delegate.onChoicePrompt(session, title, msg, intMode,
                                          choices, cb);
--- a/security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp
+++ b/security/sandbox/win/src/sandboxbroker/sandboxBroker.cpp
@@ -875,16 +875,18 @@ bool SandboxBroker::SetSecurityLevelForP
     AddCachedDirRule(mPolicy, sandbox::TargetPolicy::FILES_ALLOW_ANY,
                      sRoamingAppDataDir,
                      NS_LITERAL_STRING("\\Adobe\\Flash Player\\*"));
 
     // Access also has to be given to create the parent directories as they may
     // not exist.
     AddCachedDirRule(mPolicy, sandbox::TargetPolicy::FILES_ALLOW_DIR_ANY,
                      sRoamingAppDataDir, NS_LITERAL_STRING("\\Macromedia"));
+    AddCachedDirRule(mPolicy, sandbox::TargetPolicy::FILES_ALLOW_QUERY,
+                     sRoamingAppDataDir, NS_LITERAL_STRING("\\Macromedia\\"));
     AddCachedDirRule(mPolicy, sandbox::TargetPolicy::FILES_ALLOW_DIR_ANY,
                      sRoamingAppDataDir,
                      NS_LITERAL_STRING("\\Macromedia\\Flash Player"));
     AddCachedDirRule(mPolicy, sandbox::TargetPolicy::FILES_ALLOW_DIR_ANY,
                      sLocalAppDataDir, NS_LITERAL_STRING("\\Macromedia"));
     AddCachedDirRule(mPolicy, sandbox::TargetPolicy::FILES_ALLOW_DIR_ANY,
                      sLocalAppDataDir,
                      NS_LITERAL_STRING("\\Macromedia\\Flash Player"));
--- a/taskcluster/ci/test/test-platforms.yml
+++ b/taskcluster/ci/test/test-platforms.yml
@@ -248,24 +248,26 @@ windows10-64-asan/opt:
     test-sets:
         - common-tests
 
 # QR builds just run a subset right now.
 windows10-64-qr/debug:
     build-platform: win64/debug
     test-sets:
         - windows-qr-tests
+        - web-platform-tests
 
 windows10-64-qr/opt:
     build-platform: win64/opt
     test-sets:
         - awsy
         - windows-qr-tests
         - windows-talos
         - raptor-firefox
+        - web-platform-tests
 
 ##
 # MacOS X platforms (matching /macosx.*/)
 
 macosx64/debug:
     build-platform: macosx64/debug
     test-sets:
         - macosx64-tests
--- a/taskcluster/ci/test/test-sets.yml
+++ b/taskcluster/ci/test/test-sets.yml
@@ -199,17 +199,16 @@ windows-qr-tests:
     - mochitest
     - mochitest-gpu
     - mochitest-media
     - mochitest-webgl1-core
     - mochitest-webgl1-ext
     - mochitest-webgl2-core
     - mochitest-webgl2-ext
     - reftest
-    - web-platform-tests-reftests
 
 ccov-code-coverage-tests:
     - test-coverage
     - test-coverage-wpt
 
 windows-reftest-gpu:
     - reftest-gpu
 
--- a/taskcluster/ci/test/web-platform.yml
+++ b/taskcluster/ci/test/web-platform.yml
@@ -44,23 +44,23 @@ web-platform-tests:
             default: 7200
     e10s:
         by-test-platform:
             linux32/debug: both
             default: true
     run-on-projects:
         by-test-platform:
             android.*: ['mozilla-central', 'try']
-            linux64-qr/.*: ['release', 'try']  # skip on integration branches due to high load
+            .*-qr/.*: ['release', 'try']  # skip on integration branches due to high load
             default: built-projects
     tier:
         by-test-platform:
             android.*: 2
             linux64-asan/opt: 2
-            linux64-qr/.*: 2  # can't be tier-1 if it's not running on integration branches
+            .*-qr/.*: 2  # can't be tier-1 if it's not running on integration branches
             default: default
     mozharness:
         chunked: true
         extra-options:
             - --test-type=testharness
 
 web-platform-tests-headless:
     description: "Web platform test headless run"
@@ -147,23 +147,23 @@ web-platform-tests-wdspec:
             windows10-64-ccov/debug: 4
             default: 2
     mozharness:
         extra-options:
             - --test-type=wdspec
     run-on-projects:
         by-test-platform:
             android.*: ['mozilla-central', 'try']
-            linux64-qr/.*: ['release', 'try']  # skip on integration branches due to high load
+            .*-qr/.*: ['release', 'try']  # skip on integration branches due to high load
             default: built-projects
     tier:
         by-test-platform:
             android.*: 3
             linux64-asan/opt: 2
-            linux64-qr/.*: 2  # can't be tier-1 if it's not running on integration branches
+            .*-qr/.*: 2  # can't be tier-1 if it's not running on integration branches
             default: default
 
 web-platform-tests-wdspec-headless:
     description: "Web platform webdriver-spec headless run"
     suite: web-platform-tests-wdspec
     treeherder-symbol: W(WdH)
     run-on-projects: []  # disabled pending releng approval
     mozharness:
--- a/testing/mozbase/mozlog/mozlog/formatters/html/html.py
+++ b/testing/mozbase/mozlog/mozlog/formatters/html/html.py
@@ -156,18 +156,21 @@ class HTMLFormatter(base.BaseFormatter):
                     if not content.startswith('data:image/png;base64,'):
                         href = 'data:image/png;base64,%s' % content
                     else:
                         href = content
                 else:
                     # Encode base64 to avoid that some browsers (such as Firefox, Opera)
                     # treats '#' as the start of another link if it is contained in the data URL.
                     # Use 'charset=utf-8' to show special characters like Chinese.
-                    utf_encoded = six.text_type(content).encode('utf-8', 'xmlcharrefreplace')
-                    href = 'data:text/html;charset=utf-8;base64,%s' % base64.b64encode(utf_encoded)
+                    utf8_encoded_bytes = six.text_type(content).encode('utf-8',
+                                                                       'xmlcharrefreplace')
+                    b64_encoded_bytes = base64.b64encode(utf8_encoded_bytes)
+                    b64_encoded_str = b64_encoded_bytes.decode()
+                    href = "data:text/html;charset=utf-8;base64,{0}".format(b64_encoded_str)
 
                 links_html.append(html.a(
                     name.title(),
                     class_=name,
                     href=href,
                     target='_blank'))
                 links_html.append(' ')
 
--- a/testing/mozbase/mozlog/mozlog/formatters/machformatter.py
+++ b/testing/mozbase/mozlog/mozlog/formatters/machformatter.py
@@ -117,17 +117,17 @@ class MachFormatter(base.BaseFormatter):
         count = summary['counts']
         logs = summary['unexpected_logs']
 
         rv = ["", self.term.yellow(suite), self.term.yellow("~" * len(suite))]
 
         # Format check counts
         checks = self.summary.aggregate('count', count)
         rv.append("Ran {} checks ({})".format(sum(checks.values()),
-                  ', '.join(['{} {}s'.format(v, k) for k, v in checks.items() if v])))
+                  ', '.join(['{} {}s'.format(v, k) for k, v in sorted(checks.items()) if v])))
 
         # Format expected counts
         checks = self.summary.aggregate('expected', count, include_skip=False)
         rv.append("Expected results: {}".format(sum(checks.values())))
 
         # Format skip counts
         skip_tests = count["test"]["expected"]["skip"]
         skip_subtests = count["subtest"]["expected"]["skip"]
@@ -141,17 +141,17 @@ class MachFormatter(base.BaseFormatter):
         checks = self.summary.aggregate('unexpected', count)
         unexpected_count = sum(checks.values())
         if unexpected_count:
             rv.append("Unexpected results: {}".format(unexpected_count))
             for key in ('test', 'subtest', 'assert'):
                 if not count[key]['unexpected']:
                     continue
                 status_str = ", ".join(["{} {}".format(n, s)
-                                        for s, n in count[key]['unexpected'].items()])
+                                        for s, n in sorted(count[key]['unexpected'].items())])
                 rv.append("  {}: {} ({})".format(
                           key, sum(count[key]['unexpected'].values()), status_str))
 
         # Format status
         if not any(count[key]["unexpected"] for key in ('test', 'subtest', 'assert')):
             rv.append(self.term.green("OK"))
         else:
             heading = "Unexpected Results"
--- a/testing/mozbase/mozlog/mozlog/handlers/base.py
+++ b/testing/mozbase/mozlog/mozlog/handlers/base.py
@@ -73,36 +73,49 @@ class StreamHandler(BaseHandler):
     :param formatter: formatter to convert messages to string format
     """
 
     _lock = Lock()
 
     def __init__(self, stream, formatter):
         BaseHandler.__init__(self, formatter)
         assert stream is not None
-        # This is a hack to deal with the case where we are passed a
-        # StreamWriter (e.g. by mach for stdout). A StreamWriter requires
-        # the code to handle unicode in exactly the opposite way compared
-        # to a normal stream i.e. you always have to pass in a Unicode
-        # object rather than a string object. Cope with that by extracting
-        # the underlying raw stream.
-        if isinstance(stream, codecs.StreamWriter):
-            stream = stream.stream
+        if six.PY2:
+            # This is a hack to deal with the case where we are passed a
+            # StreamWriter (e.g. by mach for stdout). A StreamWriter requires
+            # the code to handle unicode in exactly the opposite way compared
+            # to a normal stream i.e. you always have to pass in a Unicode
+            # object rather than a string object. Cope with that by extracting
+            # the underlying raw stream.
+            if isinstance(stream, codecs.StreamWriter):
+                stream = stream.stream
 
         self.formatter = formatter
         self.stream = stream
 
     def __call__(self, data):
         """Write a log message.
 
         :param data: Structured log message dictionary."""
         formatted = self.formatter(data)
         if not formatted:
             return
         with self._lock:
-            if isinstance(formatted, six.text_type):
-                self.stream.write(formatted.encode("utf-8", "replace"))
-            elif isinstance(formatted, str):
+            if six.PY3:
+                import io
+                import mozfile
+                if isinstance(self.stream, io.StringIO) and isinstance(formatted, bytes):
+                    formatted = formatted.decode()
+                elif (
+                     isinstance(self.stream, io.BytesIO)
+                     or isinstance(self.stream, mozfile.NamedTemporaryFile)
+                     ) and isinstance(formatted, str):
+                    formatted = formatted.encode()
                 self.stream.write(formatted)
             else:
-                assert False, "Got output from the formatter of an unexpected type"
+                if isinstance(formatted, six.text_type):
+                    self.stream.write(formatted.encode("utf-8", "replace"))
+                elif isinstance(formatted, str):
+                    self.stream.write(formatted)
+                else:
+                    assert False, "Got output from the formatter of an unexpected type"
 
             self.stream.flush()
--- a/testing/mozbase/mozlog/mozlog/unstructured/logger.py
+++ b/testing/mozbase/mozlog/mozlog/unstructured/logger.py
@@ -145,17 +145,17 @@ class MozFormatter(Formatter):
             pad = self.level_length - len(record.levelname) + 1
         sep = '|'.rjust(pad)
         fmt = '%(name)s %(levelname)s ' + sep + ' %(message)s'
         if self.include_timestamp:
             fmt = '%(asctime)s ' + fmt
         # this protected member is used to define the format
         # used by the base Formatter's method
         self._fmt = fmt
-        return Formatter.format(self, record)
+        return Formatter(fmt=fmt).format(record)
 
 
 def getLogger(name, handler=None):
     """
     Returns the logger with the specified name.
     If the logger doesn't exist, it is created.
     If handler is specified, adds it to the logger. Otherwise a default handler
     that logs to standard output will be used.
--- a/testing/mozbase/mozlog/mozlog/unstructured/loglistener.py
+++ b/testing/mozbase/mozlog/mozlog/unstructured/loglistener.py
@@ -27,17 +27,17 @@ class LogMessageHandler(socketserver.Bas
         self._partial_message = ''
         self.request.settimeout(self.server.timeout)
 
         while True:
             try:
                 data = self.request.recv(1024)
                 if not data:
                     return
-                self.process_message(data)
+                self.process_message(data.decode())
             except socket.timeout:
                 return
 
     def process_message(self, data):
         """Processes data from a connected log source. Messages are assumed
         to be newline delimited, and generally well-formed JSON."""
         for part in data.split('\n'):
             msg_string = self._partial_message + part
new file mode 100644
--- /dev/null
+++ b/testing/mozbase/mozlog/setup.cfg
@@ -0,0 +1,2 @@
+[bdist_wheel]
+universal=1
--- a/testing/mozbase/mozlog/setup.py
+++ b/testing/mozbase/mozlog/setup.py
@@ -2,17 +2,17 @@
 # License, v. 2.0. If a copy of the MPL was not distributed with this file,
 # You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from __future__ import absolute_import
 
 from setuptools import setup, find_packages
 
 PACKAGE_NAME = 'mozlog'
-PACKAGE_VERSION = '3.10'
+PACKAGE_VERSION = '4.0'
 DEPS = [
     'blessings>=1.3',
     'mozterm',
     'six >= 1.10.0',
 ]
 
 
 setup(name=PACKAGE_NAME,
@@ -29,17 +29,17 @@ setup(name=PACKAGE_NAME,
       tests_require=['mozfile'],
       platforms=['Any'],
       classifiers=['Development Status :: 4 - Beta',
                    'Environment :: Console',
                    'Intended Audience :: Developers',
                    'License :: OSI Approved :: Mozilla Public License 1.1 (MPL 1.1)',
                    'Operating System :: OS Independent',
                    'Programming Language :: Python :: 2.7',
-                   'Programming Language :: Python :: 3',
+                   'Programming Language :: Python :: 3.5',
                    'Topic :: Software Development :: Libraries :: Python Modules'],
       package_data={"mozlog": ["formatters/html/main.js",
                                "formatters/html/style.css"]},
       entry_points={
           "console_scripts": [
               "structlog = mozlog.scripts:main"
           ],
           'pytest11': [
--- a/testing/mozbase/mozlog/tests/manifest.ini
+++ b/testing/mozbase/mozlog/tests/manifest.ini
@@ -1,9 +1,6 @@
 [DEFAULT]
 subsuite = mozbase
 [test_logger.py]
-skip-if = python == 3
 [test_logtypes.py]
 [test_formatters.py]
-skip-if = python == 3
 [test_structured.py]
-skip-if = python == 3
--- a/testing/mozbase/mozlog/tests/test_formatters.py
+++ b/testing/mozbase/mozlog/tests/test_formatters.py
@@ -1,135 +1,135 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 from __future__ import absolute_import, print_function, unicode_literals
 
 import mozunit
 import pytest
-from io import BytesIO
+from six import BytesIO
 
 from mozlog.structuredlog import StructuredLogger
 from mozlog.formatters import (
     MachFormatter,
 )
 from mozlog.handlers import StreamHandler
 
 formatters = {
     'mach': MachFormatter,
 }
 
 FORMATS = {
     # A list of tuples consisting of (name, options, expected string).
     'PASS': [
-        ('mach', {}, """
+        ('mach', {}, b"""
  0:00.00 SUITE_START: running 3 tests
  0:00.00 TEST_START: test_foo
  0:00.00 TEST_END: OK
  0:00.00 TEST_START: test_bar
  0:00.00 TEST_END: Test OK. Subtests passed 1/1. Unexpected 0
  0:00.00 TEST_START: test_baz
  0:00.00 TEST_END: FAIL
  0:00.00 SUITE_END
 
 suite 1
 ~~~~~~~
-Ran 4 checks (3 tests, 1 subtests)
+Ran 4 checks (1 subtests, 3 tests)
 Expected results: 4
 OK
-""".lstrip('\n')),
-        ('mach', {'verbose': True}, """
+""".lstrip(b'\n')),
+        ('mach', {'verbose': True}, b"""
  0:00.00 SUITE_START: running 3 tests
  0:00.00 TEST_START: test_foo
  0:00.00 TEST_END: OK
  0:00.00 TEST_START: test_bar
  0:00.00 PASS a subtest
  0:00.00 TEST_END: Test OK. Subtests passed 1/1. Unexpected 0
  0:00.00 TEST_START: test_baz
  0:00.00 TEST_END: FAIL
  0:00.00 SUITE_END
 
 suite 1
 ~~~~~~~
-Ran 4 checks (3 tests, 1 subtests)
+Ran 4 checks (1 subtests, 3 tests)
 Expected results: 4
 OK
-""".lstrip('\n')),
+""".lstrip(b'\n')),
     ],
 
     'FAIL': [
-        ('mach', {}, """
+        ('mach', {}, b"""
  0:00.00 SUITE_START: running 3 tests
  0:00.00 TEST_START: test_foo
  0:00.00 TEST_END: FAIL, expected PASS - expected 0 got 1
  0:00.00 TEST_START: test_bar
  0:00.00 TEST_END: Test OK. Subtests passed 0/2. Unexpected 2
 FAIL a subtest - expected 0 got 1
     SimpleTest.is@SimpleTest/SimpleTest.js:312:5
     @caps/tests/mochitest/test_bug246699.html:53:1
 TIMEOUT another subtest
  0:00.00 TEST_START: test_baz
  0:00.00 TEST_END: PASS, expected FAIL
  0:00.00 SUITE_END
 
 suite 1
 ~~~~~~~
-Ran 5 checks (3 tests, 2 subtests)
+Ran 5 checks (2 subtests, 3 tests)
 Expected results: 1
 Unexpected results: 4
   test: 2 (1 fail, 1 pass)
   subtest: 2 (1 fail, 1 timeout)
 
 Unexpected Results
 ------------------
 test_foo
   FAIL test_foo - expected 0 got 1
 test_bar
   FAIL a subtest - expected 0 got 1
     SimpleTest.is@SimpleTest/SimpleTest.js:312:5
     @caps/tests/mochitest/test_bug246699.html:53:1
   TIMEOUT another subtest
 test_baz
   UNEXPECTED-PASS test_baz
-""".lstrip('\n')),
-        ('mach', {'verbose': True}, """
+""".lstrip(b'\n')),
+        ('mach', {'verbose': True}, b"""
  0:00.00 SUITE_START: running 3 tests
  0:00.00 TEST_START: test_foo
  0:00.00 TEST_END: FAIL, expected PASS - expected 0 got 1
  0:00.00 TEST_START: test_bar
  0:00.00 FAIL a subtest - expected 0 got 1
     SimpleTest.is@SimpleTest/SimpleTest.js:312:5
     @caps/tests/mochitest/test_bug246699.html:53:1
  0:00.00 TIMEOUT another subtest
  0:00.00 TEST_END: Test OK. Subtests passed 0/2. Unexpected 2
  0:00.00 TEST_START: test_baz
  0:00.00 TEST_END: PASS, expected FAIL
  0:00.00 SUITE_END
 
 suite 1
 ~~~~~~~
-Ran 5 checks (3 tests, 2 subtests)
+Ran 5 checks (2 subtests, 3 tests)
 Expected results: 1
 Unexpected results: 4
   test: 2 (1 fail, 1 pass)
   subtest: 2 (1 fail, 1 timeout)
 
 Unexpected Results
 ------------------
 test_foo
   FAIL test_foo - expected 0 got 1
 test_bar
   FAIL a subtest - expected 0 got 1
     SimpleTest.is@SimpleTest/SimpleTest.js:312:5
     @caps/tests/mochitest/test_bug246699.html:53:1
   TIMEOUT another subtest
 test_baz
   UNEXPECTED-PASS test_baz
-""".lstrip('\n')),
+""".lstrip(b'\n')),
     ],
 }
 
 
 def ids(test):
     ids = []
     for value in FORMATS[test]:
         args = ", ".join(["{}={}".format(k, v) for k, v in value[1].items()])
--- a/testing/mozbase/mozlog/tests/test_logger.py
+++ b/testing/mozbase/mozlog/tests/test_logger.py
@@ -205,25 +205,25 @@ class TestStructuredLogging(unittest.Tes
 
         host, port = self.log_server.server_address
 
         sock = socket.socket()
         sock.connect((host, port))
 
         # Sleeps prevent listener from receiving entire message in a single call
         # to recv in order to test reconstruction of partial messages.
-        sock.sendall(message_string[:8])
+        sock.sendall(message_string[:8].encode())
         time.sleep(.01)
-        sock.sendall(message_string[8:32])
+        sock.sendall(message_string[8:32].encode())
         time.sleep(.01)
-        sock.sendall(message_string[32:64])
+        sock.sendall(message_string[32:64].encode())
         time.sleep(.01)
-        sock.sendall(message_string[64:128])
+        sock.sendall(message_string[64:128].encode())
         time.sleep(.01)
-        sock.sendall(message_string[128:])
+        sock.sendall(message_string[128:].encode())
 
         server_thread.join()
 
 
 class Loggable(mozlog.LoggingMixin):
     """Trivial class inheriting from LoggingMixin"""
     pass
 
--- a/testing/mozbase/mozlog/tests/test_structured.py
+++ b/testing/mozbase/mozlog/tests/test_structured.py
@@ -483,45 +483,60 @@ class TestTypeConversions(BaseStructured
                              "time": "1234"})
         self.assert_log_equals({"action": "suite_start",
                                 "tests": {"default": ["1"]},
                                 "time": 1234})
         self.logger.suite_end()
 
     def test_tuple(self):
         self.logger.suite_start([])
-        self.logger.test_start(("\xf0\x90\x8d\x84\xf0\x90\x8c\xb4\xf0\x90\x8d\x83\xf0\x90\x8d\x84",
-                                42, u"\u16a4"))
+        if six.PY3:
+            self.logger.test_start((b"\xf0\x90\x8d\x84\xf0\x90\x8c\xb4\xf0\x90"
+                                    b"\x8d\x83\xf0\x90\x8d\x84".decode(),
+                                    42, u"\u16a4"))
+        else:
+            self.logger.test_start(("\xf0\x90\x8d\x84\xf0\x90\x8c\xb4\xf0\x90"
+                                    "\x8d\x83\xf0\x90\x8d\x84",
+                                    42, u"\u16a4"))
         self.assert_log_equals({"action": "test_start",
                                 "test": (u'\U00010344\U00010334\U00010343\U00010344',
                                          u"42", u"\u16a4")})
         self.logger.suite_end()
 
     def test_non_string_messages(self):
         self.logger.suite_start([])
         self.logger.info(1)
         self.assert_log_equals({"action": "log",
                                 "message": "1",
                                 "level": "INFO"})
         self.logger.info([1, (2, '3'), "s", "s" + chr(255)])
-        self.assert_log_equals({"action": "log",
-                                "message": "[1, (2, '3'), 's', 's\\xff']",
-                                "level": "INFO"})
+        if six.PY3:
+            self.assert_log_equals({"action": "log",
+                                    "message": "[1, (2, '3'), 's', 's\xff']",
+                                    "level": "INFO"})
+        else:
+            self.assert_log_equals({"action": "log",
+                                    "message": "[1, (2, '3'), 's', 's\\xff']",
+                                    "level": "INFO"})
+
         self.logger.suite_end()
 
     def test_utf8str_write(self):
         with mozfile.NamedTemporaryFile() as logfile:
             _fmt = formatters.TbplFormatter()
             _handler = handlers.StreamHandler(logfile, _fmt)
             self.logger.add_handler(_handler)
             self.logger.suite_start([])
             self.logger.info("☺")
             logfile.seek(0)
             data = logfile.readlines()[-1].strip()
-            self.assertEquals(data, "☺")
+            if six.PY3:
+                self.assertEquals(data.decode(), "☺")
+            else:
+                self.assertEquals(data, "☺")
             self.logger.suite_end()
             self.logger.remove_handler(_handler)
 
     def test_arguments(self):
         self.logger.info(message="test")
         self.assert_log_equals({"action": "log",
                                 "message": "test",
                                 "level": "INFO"})
@@ -794,17 +809,17 @@ Unexpected results: 2
         self.logger.test_start("test2")
         self.logger.test_status("test2", "subtest1",
                                 status="TIMEOUT", expected="PASS")
         self.logger.test_end("test2", status="TIMEOUT", expected="OK")
 
         self.set_position()
         self.logger.suite_end()
 
-        self.assertIn("Ran 5 checks (2 tests, 3 subtests)", self.loglines)
+        self.assertIn("Ran 5 checks (3 subtests, 2 tests)", self.loglines)
         self.assertIn("Expected results: 2", self.loglines)
         self.assertIn("""
 Unexpected results: 3
   test: 1 (1 timeout)
   subtest: 2 (1 fail, 1 timeout)
 """.strip(), "\n".join(self.loglines))
 
     def test_summary_ok(self):
@@ -957,47 +972,47 @@ class TestCommandline(unittest.TestCase)
         commandline.add_logging_group(parser)
 
         args = parser.parse_args(["--log-tbpl=%s" % self.logfile.name])
         logger = commandline.setup_logging("test_fmtopts", args, {})
         logger.info("INFO message")
         logger.debug("DEBUG message")
         logger.error("ERROR message")
         # The debug level is not logged by default.
-        self.assertEqual(["INFO message",
-                          "ERROR message"],
+        self.assertEqual([b"INFO message",
+                          b"ERROR message"],
                          self.loglines)
 
     def test_logging_errorlevel(self):
         parser = argparse.ArgumentParser()
         commandline.add_logging_group(parser)
         args = parser.parse_args(
             ["--log-tbpl=%s" % self.logfile.name, "--log-tbpl-level=error"])
         logger = commandline.setup_logging("test_fmtopts", args, {})
         logger.info("INFO message")
         logger.debug("DEBUG message")
         logger.error("ERROR message")
 
         # Only the error level and above were requested.
-        self.assertEqual(["ERROR message"],
+        self.assertEqual([b"ERROR message"],
                          self.loglines)
 
     def test_logging_debuglevel(self):
         parser = argparse.ArgumentParser()
         commandline.add_logging_group(parser)
         args = parser.parse_args(
             ["--log-tbpl=%s" % self.logfile.name, "--log-tbpl-level=debug"])
         logger = commandline.setup_logging("test_fmtopts", args, {})
         logger.info("INFO message")
         logger.debug("DEBUG message")
         logger.error("ERROR message")
         # Requesting a lower log level than default works as expected.
-        self.assertEqual(["INFO message",
-                          "DEBUG message",
-                          "ERROR message"],
+        self.assertEqual([b"INFO message",
+                          b"DEBUG message",
+                          b"ERROR message"],
                          self.loglines)
 
     def test_unused_options(self):
         parser = argparse.ArgumentParser()
         commandline.add_logging_group(parser)
         args = parser.parse_args(["--log-tbpl-level=error"])
         self.assertRaises(ValueError, commandline.setup_logging,
                           "test_fmtopts", args, {})
--- a/testing/mozbase/mozprofile/setup.py
+++ b/testing/mozbase/mozprofile/setup.py
@@ -6,17 +6,17 @@ from __future__ import absolute_import
 
 from setuptools import setup
 
 PACKAGE_NAME = 'mozprofile'
 PACKAGE_VERSION = '2.1.0'
 
 deps = [
     'mozfile>=1.2',
-    'mozlog==3.*',
+    'mozlog~=4.0',
     'six>=1.10.0,<2',
 ]
 
 setup(name=PACKAGE_NAME,
       version=PACKAGE_VERSION,
       description="Library to create and modify Mozilla application profiles",
       long_description="see https://firefox-source-docs.mozilla.org/mozbase/index.html",
       classifiers=['Environment :: Console',
--- a/testing/mozbase/mozrunner/setup.py
+++ b/testing/mozbase/mozrunner/setup.py
@@ -10,17 +10,17 @@ PACKAGE_NAME = 'mozrunner'
 PACKAGE_VERSION = '7.2.0'
 
 desc = """Reliable start/stop/configuration of Mozilla Applications (Firefox, Thunderbird, etc.)"""
 
 deps = [
     'mozdevice>=1.1.6',
     'mozfile>=1.2',
     'mozinfo>=0.7,<2',
-    'mozlog==3.*',
+    'mozlog~=4.0',
     'mozprocess>=0.23,<1',
     'mozprofile~=2.1',
     'six>=1.10.0,<2',
 ]
 
 EXTRAS_REQUIRE = {'crash': ['mozcrash >= 1.0']}
 
 
--- a/testing/mozbase/mozversion/setup.py
+++ b/testing/mozbase/mozversion/setup.py
@@ -18,15 +18,15 @@ setup(name='mozversion',
       keywords='mozilla',
       author='Mozilla Automation and Testing Team',
       author_email='tools@lists.mozilla.org',
       url='https://wiki.mozilla.org/Auto-tools/Projects/Mozbase',
       license='MPL',
       packages=['mozversion'],
       include_package_data=True,
       zip_safe=False,
-      install_requires=['mozlog ~= 3.0',
+      install_requires=['mozlog ~= 4.0',
                         'six >= 1.10.0'],
       entry_points="""
       # -*- Entry points: -*-
       [console_scripts]
       mozversion = mozversion:cli
       """)
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.colouralpha.html.ini
@@ -0,0 +1,5 @@
+[2d.gradient.interpolate.colouralpha.html]
+  [Canvas test: 2d.gradient.interpolate.colouralpha]
+    expected:
+      if os == "win" and webrender: FAIL
+      PASS
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.overlap.html.ini
@@ -0,0 +1,5 @@
+[2d.gradient.interpolate.overlap.html]
+  [Canvas test: 2d.gradient.interpolate.overlap]
+    expected:
+      if os == "win" and webrender: FAIL
+      PASS
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/2dcontext/path-objects/2d.path.arc.selfintersect.1.html.ini
@@ -0,0 +1,5 @@
+[2d.path.arc.selfintersect.1.html]
+  [arc() with lineWidth > 2*radius is drawn sensibly]
+    expected:
+      if os == "win" and webrender: FAIL
+      PASS
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/2dcontext/path-objects/2d.path.rect.zero.3.html.ini
@@ -0,0 +1,5 @@
+[2d.path.rect.zero.3.html]
+  [Canvas test: 2d.path.rect.zero.3]
+    expected:
+      if os == "win" and webrender: FAIL
+      PASS
--- a/testing/web-platform/meta/css/css-position/position-sticky-nested-bottom.html.ini
+++ b/testing/web-platform/meta/css/css-position/position-sticky-nested-bottom.html.ini
@@ -1,17 +1,12 @@
 [position-sticky-nested-bottom.html]
   [the inner sticky can stick before the outer one if necessary]
     expected:
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "mac": PASS
       FAIL
 
   [neither sticky can escape their containing block]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       FAIL
 
--- a/testing/web-platform/meta/css/css-position/position-sticky-nested-right.html.ini
+++ b/testing/web-platform/meta/css/css-position/position-sticky-nested-right.html.ini
@@ -1,17 +1,12 @@
 [position-sticky-nested-right.html]
   [the inner sticky can stick before the outer one if necessary]
     expected:
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "mac": PASS
       FAIL
 
   [neither sticky can escape their containing block]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       FAIL
 
--- a/testing/web-platform/meta/css/css-shapes/shape-outside/values/shape-margin-001.html.ini
+++ b/testing/web-platform/meta/css/css-shapes/shape-outside/values/shape-margin-001.html.ini
@@ -2,22 +2,18 @@
   [10cm - computed]
     expected: FAIL
 
   [10mm - computed]
     expected: FAIL
 
   [10ex - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [10vh - computed]
     expected:
       if not debug and not webrender and not e10s and (os == "android") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
     bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1514429
 
--- a/testing/web-platform/meta/css/css-shapes/shape-outside/values/shape-outside-circle-005.html.ini
+++ b/testing/web-platform/meta/css/css-shapes/shape-outside/values/shape-outside-circle-005.html.ini
@@ -2,22 +2,18 @@
   [test unit: cm - circle(50cm) - computed]
     expected: FAIL
 
   [test unit: mm - circle(50mm) - computed]
     expected: FAIL
 
   [test unit: ex - circle(50ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit: cm - circle(50cm) - inline]
     expected: FAIL
 
   [test unit: mm - circle(50mm) - inline]
     expected: FAIL
--- a/testing/web-platform/meta/css/css-shapes/shape-outside/values/shape-outside-ellipse-004.html.ini
+++ b/testing/web-platform/meta/css/css-shapes/shape-outside/values/shape-outside-ellipse-004.html.ini
@@ -122,36 +122,28 @@
   [test unit (computed): in - ellipse(at bottom 70in left 50%)]
     expected: FAIL
 
   [test unit (computed): mm - ellipse(at top 50% left 50mm)]
     expected: FAIL
 
   [test unit (computed): ex - ellipse(at right 80ex)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit (computed): em - ellipse(at top 50em right 80em)]
     expected: FAIL
 
   [test unit (computed): ex - ellipse(at 50% 50ex)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit (computed): vw - ellipse(at bottom 70vw left 50%)]
     expected: FAIL
 
   [test unit (computed): cm - ellipse(at 50cm)]
     expected: FAIL
@@ -162,53 +154,41 @@
   [test unit (computed): cm - ellipse(at center 60cm)]
     expected: FAIL
 
   [test unit (computed): in - ellipse(at bottom 70in right 80in)]
     expected: FAIL
 
   [test unit (computed): ex - ellipse(at left 50ex top 50%)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit (computed): cm - ellipse(at left 50cm bottom 70cm)]
     expected: FAIL
 
   [test unit (computed): pt - ellipse(at right 80% bottom 70pt)]
     expected: FAIL
 
   [test unit (computed): cm - ellipse(at left 50cm)]
     expected: FAIL
 
   [test unit (computed): ex - ellipse(at 70ex bottom)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit (computed): ex - ellipse(at right 80% top 50ex)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit (computed): pc - ellipse(at left 50% bottom 70pc)]
     expected: FAIL
 
   [test unit (computed): em - ellipse(at right 80em bottom 70em)]
     expected: FAIL
@@ -279,22 +259,18 @@
   [test unit (computed): vw - ellipse(at right 80% bottom 70vw)]
     expected: FAIL
 
   [test unit (computed): in - ellipse(at right 80in bottom 70%)]
     expected: FAIL
 
   [test unit (computed): ex - ellipse(at 50ex 50%)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit (computed): em - ellipse(at top 50% right 80em)]
     expected: FAIL
 
   [test unit (computed): pt - ellipse(at right 80pt bottom 70%)]
     expected: FAIL
@@ -308,22 +284,18 @@
   [test unit (computed): cm - ellipse(at right 80% bottom 70cm)]
     expected: FAIL
 
   [test unit (computed): vh - ellipse(at bottom 70% right 80vh)]
     expected: FAIL
 
   [test unit (computed): ex - ellipse(at 60ex center)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit (computed): ch - ellipse(at bottom 70ch right 80%)]
     expected: FAIL
 
   [test unit (computed): mm - ellipse(at right 80mm top 50mm)]
     expected: FAIL
@@ -403,36 +375,28 @@
   [test unit (computed): in - ellipse(at left 50% bottom 70in)]
     expected: FAIL
 
   [test unit (computed): vh - ellipse(at bottom 70vh left 50vh)]
     expected: FAIL
 
   [test unit (computed): ex - ellipse(at bottom 70% left 50ex)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit (computed): pt - ellipse(at bottom 70pt left 50pt)]
     expected: FAIL
 
   [test unit (computed): ex - ellipse(at top 50ex left 50%)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit (computed): cm - ellipse(at bottom 70cm left 50%)]
     expected: FAIL
 
   [test unit (computed): vw - ellipse(at top 50vw right 80vw)]
     expected: FAIL
@@ -515,22 +479,18 @@
   [test unit (computed): vh - ellipse(at right 80% bottom 70vh)]
     expected: FAIL
 
   [test unit (computed): vmax - ellipse(at left 50% bottom 70vmax)]
     expected: FAIL
 
   [test unit (computed): ex - ellipse(at top 50ex left 50ex)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit (computed): ex - ellipse(at bottom 70ex left 50ex)]
     expected: FAIL
 
   [test unit (computed): mm - ellipse(at 50mm top)]
     expected: FAIL
@@ -568,53 +528,41 @@
   [test unit (computed): in - ellipse(at right 80in bottom 70in)]
     expected: FAIL
 
   [test unit (computed): pt - ellipse(at bottom 70pt right 80pt)]
     expected: FAIL
 
   [test unit (computed): ex - ellipse(at center 60ex)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit (computed): pc - ellipse(at bottom 70pc right 80%)]
     expected: FAIL
 
   [test unit (computed): ex - ellipse(at 50ex top)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit (computed): ch - ellipse(at right 80ch top 50ch)]
     expected: FAIL
 
   [test unit (computed): vw - ellipse(at bottom 70vw right 80vw)]
     expected: FAIL
 
   [test unit (computed): ex - ellipse(at 50ex)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit (computed): pt - ellipse(at bottom 70% right 80pt)]
     expected: FAIL
 
   [test unit (computed): rem - ellipse(at top 50% right 80rem)]
     expected: FAIL
@@ -640,22 +588,18 @@
   [test unit (computed): em - ellipse(at bottom 70em left 50%)]
     expected: FAIL
 
   [test unit (computed): ex - ellipse(at right 80ex bottom 70%)]
     expected: FAIL
 
   [test unit (computed): ex - ellipse(at left 50ex bottom 70%)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit (computed): vh - ellipse(at bottom 70vh right 80vh)]
     expected: FAIL
 
   [test unit (computed): vmax - ellipse(at right 80vmax bottom 70%)]
     expected: FAIL
@@ -681,22 +625,18 @@
   [test unit (computed): pt - ellipse(at top 50% right 80pt)]
     expected: FAIL
 
   [test unit (computed): in - ellipse(at bottom 70% right 80in)]
     expected: FAIL
 
   [test unit (computed): ex - ellipse(at top 50% left 50ex)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit (computed): ex - ellipse(at right 80ex top 50%)]
     expected: FAIL
 
   [test unit (computed): vmin - ellipse(at bottom 70vmin left 50%)]
     expected: FAIL
@@ -722,22 +662,18 @@
   [test unit (computed): mm - ellipse(at bottom 70mm left 50mm)]
     expected: FAIL
 
   [test unit (computed): cm - ellipse(at bottom 70cm right 80cm)]
     expected: FAIL
 
   [test unit (computed): ex - ellipse(at top 50ex right 80%)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit (computed): ch - ellipse(at bottom 70ch left 50%)]
     expected: FAIL
 
   [test unit (computed): ex - ellipse(at right 80ex top 50ex)]
     expected: FAIL
@@ -772,22 +708,18 @@
   [test unit (computed): mm - ellipse(at left 50mm top 50mm)]
     expected: FAIL
 
   [test unit (computed): vmin - ellipse(at bottom 70vmin left 50vmin)]
     expected: FAIL
 
   [test unit (computed): ex - ellipse(at left 50ex)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit (computed): cm - ellipse(at top 50cm right 80cm)]
     expected: FAIL
 
   [test unit (computed): rem - ellipse(at bottom 70rem right 80%)]
     expected: FAIL
@@ -801,53 +733,41 @@
   [test unit (computed): mm - ellipse(at left 50mm bottom 70mm)]
     expected: FAIL
 
   [test unit (computed): vw - ellipse(at top 50% right 80vw)]
     expected: FAIL
 
   [test unit (computed): ex - ellipse(at 50ex 50ex)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit (computed): rem - ellipse(at bottom 70rem left 50rem)]
     expected: FAIL
 
   [test unit (computed): ex - ellipse(at bottom 70% right 80ex)]
     expected: FAIL
 
   [test unit (computed): in - ellipse(at bottom 70in right 80%)]
     expected: FAIL
 
   [test unit (computed): ex - ellipse(at left 50% top 50ex)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit (computed): ex - ellipse(at left 50ex top 50ex)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit (computed): vh - ellipse(at right 80vh top 50%)]
     expected: FAIL
 
   [test unit (computed): pc - ellipse(at bottom 70% right 80pc)]
     expected: FAIL
--- a/testing/web-platform/meta/css/css-shapes/shape-outside/values/shape-outside-ellipse-005.html.ini
+++ b/testing/web-platform/meta/css/css-shapes/shape-outside/values/shape-outside-ellipse-005.html.ini
@@ -155,91 +155,63 @@
   [test unit: em - ellipse(25em closest-side) - computed]
     expected: FAIL
 
   [test unit: ex - ellipse(50ex) - computed]
     expected: FAIL
 
   [test unit: ex - ellipse(50ex 100ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit: ex - ellipse(100ex 100px) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit: ex - ellipse(50ex 25%) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit: ex - ellipse(25% 50ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit: ex - ellipse(25ex closest-side) - computed]
     expected: FAIL
 
   [test unit: ex - ellipse(closest-side 75ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit: ex - ellipse(25ex farthest-side) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit: ex - ellipse(farthest-side 75ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [test unit: ch - ellipse(50ch) - computed]
     expected: FAIL
 
   [test unit: ch - ellipse(25ch closest-side) - computed]
     expected: FAIL
--- a/testing/web-platform/meta/css/css-shapes/shape-outside/values/shape-outside-inset-003.html.ini
+++ b/testing/web-platform/meta/css/css-shapes/shape-outside/values/shape-outside-inset-003.html.ini
@@ -116,231 +116,151 @@
   [inset(10mm round 10mm 20mm 30mm 40mm / 10mm 20mm 30mm) - computed]
     expected: FAIL
 
   [inset(10mm round 10mm 20mm 30mm 40mm / 10mm 20mm 30mm 40mm) - computed]
     expected: FAIL
 
   [inset(10ex round 10ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [inset(10ex round 10ex / 10ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [inset(10ex round 10ex / 10ex 20ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [inset(10ex round 10ex / 10ex 20ex 30ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [inset(10ex round 10ex / 10ex 20ex 30ex 40ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [inset(10ex round 10ex 20ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [inset(10ex round 10ex 20ex / 10ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [inset(10ex round 10ex 20ex / 10ex 20ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [inset(10ex round 10ex 20ex / 10ex 20ex 30ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [inset(10ex round 10ex 20ex / 10ex 20ex 30ex 40ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [inset(10ex round 10ex 20ex 30ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [inset(10ex round 10ex 20ex 30ex / 10ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [inset(10ex round 10ex 20ex 30ex / 10ex 20ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [inset(10ex round 10ex 20ex 30ex / 10ex 20ex 30ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [inset(10ex round 10ex 20ex 30ex / 10ex 20ex 30ex 40ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [inset(10ex round 10ex 20ex 30ex 40ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [inset(10ex round 10ex 20ex 30ex 40ex / 10ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [inset(10ex round 10ex 20ex 30ex 40ex / 10ex 20ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [inset(10ex round 10ex 20ex 30ex 40ex / 10ex 20ex 30ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [inset(10ex round 10ex 20ex 30ex 40ex / 10ex 20ex 30ex 40ex) - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [inset(10vmin round 10vmin 20vmin 30vmin) - computed]
     expected:
       if not debug and not webrender and not e10s and (os == "android") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
 
   [inset(10vmax round 10vmax 20vmax 30vmax 40vmax / 10vmax 20vmax) - computed]
--- a/testing/web-platform/meta/css/css-shapes/shape-outside/values/shape-outside-polygon-004.html.ini
+++ b/testing/web-platform/meta/css/css-shapes/shape-outside/values/shape-outside-polygon-004.html.ini
@@ -1,39 +1,27 @@
 [shape-outside-polygon-004.html]
   [Three vertices - ex ex, ex ex, ex ex - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [Three vertices - em em, em em, ex ex - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [Three vertices - ex ex, em, em, em em - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [One vertex - cm cm - computed]
     expected: FAIL
 
   [One vertex - cm mm - computed]
     expected: FAIL
--- a/testing/web-platform/meta/css/css-shapes/shape-outside/values/shape-outside-shape-arguments-000.html.ini
+++ b/testing/web-platform/meta/css/css-shapes/shape-outside/values/shape-outside-shape-arguments-000.html.ini
@@ -1,17 +1,13 @@
 [shape-outside-shape-arguments-000.html]
   [Font relative units - computed]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       if os == "android": PASS
       FAIL
 
   [View relative units - computed]
     expected:
       if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
       if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
       FAIL
--- a/testing/web-platform/meta/css/css-ui/caret-color-013.html.ini
+++ b/testing/web-platform/meta/css/css-ui/caret-color-013.html.ini
@@ -1,71 +1,43 @@
 [caret-color-013.html]
   [Test default caret-color]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       FAIL
 
   [Test caret-color: initial]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       FAIL
 
   [Test caret-color: inherit]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       FAIL
 
   [Test caret-color: auto]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       FAIL
 
   [Test caret-color: currentcolor]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       FAIL
 
   [Reset caret-color: initial]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       FAIL
 
   [Test caret-color: initial (inherited)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       FAIL
 
--- a/testing/web-platform/meta/css/css-variables/variable-presentation-attribute.html.ini
+++ b/testing/web-platform/meta/css/css-variables/variable-presentation-attribute.html.ini
@@ -1,17 +1,13 @@
 [variable-presentation-attribute.html]
   [Testing 'clip' on '#test4'.]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       FAIL
 
   [Testing 'alignment-baseline'.]
     expected: FAIL
 
   [Testing 'baseline-shift'.]
     expected: FAIL
 
--- a/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001.html.ini
+++ b/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001.html.ini
@@ -1,31 +1,25 @@
 [text-orientation-script-001.html]
   disabled:
     if os == "mac": true
   [Default orientation for vo=R]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
   [Default orientation for vo=U]
     expected: FAIL
 
   [Default orientation for vo=Tr]
     expected: FAIL
 
   [Default orientation for vo=Tu]
     expected: FAIL
 
   [Orientation=Upright]
     expected: FAIL
 
   [Orientation=Rotated]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
--- a/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001a.html.ini
+++ b/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001a.html.ini
@@ -1,20 +1,14 @@
 [text-orientation-script-001a.html]
   [Default orientation for vo=R]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
   [Orientation=Upright]
     expected: FAIL
 
   [Orientation=Rotated]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
--- a/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001b.html.ini
+++ b/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001b.html.ini
@@ -1,20 +1,14 @@
 [text-orientation-script-001b.html]
   [Default orientation for vo=R]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
   [Orientation=Upright]
     expected: FAIL
 
   [Orientation=Rotated]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
--- a/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001c.html.ini
+++ b/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001c.html.ini
@@ -1,20 +1,14 @@
 [text-orientation-script-001c.html]
   [Default orientation for vo=R]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
   [Orientation=Upright]
     expected: FAIL
 
   [Orientation=Rotated]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
--- a/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001d.html.ini
+++ b/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001d.html.ini
@@ -1,20 +1,14 @@
 [text-orientation-script-001d.html]
   [Default orientation for vo=R]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
   [Orientation=Upright]
     expected: FAIL
 
   [Orientation=Rotated]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
--- a/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001e.html.ini
+++ b/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001e.html.ini
@@ -1,20 +1,14 @@
 [text-orientation-script-001e.html]
   [Default orientation for vo=R]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
   [Orientation=Upright]
     expected: FAIL
 
   [Orientation=Rotated]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
--- a/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001f.html.ini
+++ b/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001f.html.ini
@@ -1,20 +1,14 @@
 [text-orientation-script-001f.html]
   [Default orientation for vo=R]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
   [Orientation=Upright]
     expected: FAIL
 
   [Orientation=Rotated]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
--- a/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001g.html.ini
+++ b/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001g.html.ini
@@ -1,20 +1,14 @@
 [text-orientation-script-001g.html]
   [Default orientation for vo=R]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
   [Orientation=Upright]
     expected: FAIL
 
   [Orientation=Rotated]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
--- a/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001h.html.ini
+++ b/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001h.html.ini
@@ -1,20 +1,14 @@
 [text-orientation-script-001h.html]
   [Default orientation for vo=R]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
   [Orientation=Upright]
     expected: FAIL
 
   [Orientation=Rotated]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
--- a/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001i.html.ini
+++ b/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001i.html.ini
@@ -1,20 +1,14 @@
 [text-orientation-script-001i.html]
   [Default orientation for vo=R]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
   [Orientation=Upright]
     expected: FAIL
 
   [Orientation=Rotated]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
--- a/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001j.html.ini
+++ b/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001j.html.ini
@@ -3,14 +3,11 @@
   [Default orientation for vo=U]
     expected: FAIL
 
   [Orientation=Upright]
     expected: FAIL
 
   [Orientation=Rotated]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
--- a/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001k.html.ini
+++ b/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001k.html.ini
@@ -2,14 +2,11 @@
   [Default orientation for vo=U]
     expected: FAIL
 
   [Orientation=Upright]
     expected: FAIL
 
   [Orientation=Rotated]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
--- a/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001l.html.ini
+++ b/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001l.html.ini
@@ -2,14 +2,11 @@
   [Default orientation for vo=U]
     expected: FAIL
 
   [Orientation=Upright]
     expected: FAIL
 
   [Orientation=Rotated]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
--- a/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001m.html.ini
+++ b/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001m.html.ini
@@ -2,14 +2,11 @@
   [Default orientation for vo=U]
     expected: FAIL
 
   [Orientation=Upright]
     expected: FAIL
 
   [Orientation=Rotated]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
--- a/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001n.html.ini
+++ b/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001n.html.ini
@@ -2,14 +2,11 @@
   [Default orientation for vo=U]
     expected: FAIL
 
   [Orientation=Upright]
     expected: FAIL
 
   [Orientation=Rotated]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
--- a/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001o.html.ini
+++ b/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001o.html.ini
@@ -2,14 +2,11 @@
   [Default orientation for vo=U]
     expected: FAIL
 
   [Orientation=Upright]
     expected: FAIL
 
   [Orientation=Rotated]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
--- a/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001p.html.ini
+++ b/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001p.html.ini
@@ -2,14 +2,11 @@
   [Default orientation for vo=Tr]
     expected: FAIL
 
   [Orientation=Upright]
     expected: FAIL
 
   [Orientation=Rotated]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
--- a/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001q.html.ini
+++ b/testing/web-platform/meta/css/css-writing-modes/text-orientation-script-001q.html.ini
@@ -2,14 +2,11 @@
   [Default orientation for vo=Tu]
     expected: FAIL
 
   [Orientation=Upright]
     expected: FAIL
 
   [Orientation=Rotated]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
--- a/testing/web-platform/meta/css/selectors/focus-visible-005.html.ini
+++ b/testing/web-platform/meta/css/selectors/focus-visible-005.html.ini
@@ -1,12 +1,9 @@
 [focus-visible-005.html]
   [Programmatic focus should always match :focus-visible]
     expected: FAIL
 
   [Programmatic focus after click should not match :focus-visible]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       FAIL
 
--- a/testing/web-platform/meta/html/infrastructure/urls/resolving-urls/query-encoding/navigation.sub.html.ini
+++ b/testing/web-platform/meta/html/infrastructure/urls/resolving-urls/query-encoding/navigation.sub.html.ini
@@ -1,27 +1,25 @@
 [navigation.sub.html?encoding=x-cp1251]
   expected:
     if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): TIMEOUT
     if not debug and not asan and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
-    if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): TIMEOUT
-    if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): TIMEOUT
-    if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): TIMEOUT
+    if not debug and (os == "win"): TIMEOUT
+    if not debug and (os == "mac"): TIMEOUT
   [hyperlink auditing <a ping>]
     expected: TIMEOUT
 
   [hyperlink auditing <area ping>]
     expected: TIMEOUT
 
 
 [navigation.sub.html?encoding=utf8]
   expected:
     if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): TIMEOUT
     if not debug and not asan and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): TIMEOUT
-    if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): TIMEOUT
-    if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): TIMEOUT
-    if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): TIMEOUT
+    if not debug and (os == "win"): TIMEOUT
+    if not debug and (os == "mac"): TIMEOUT
   [hyperlink auditing <a ping>]
     expected: TIMEOUT
 
   [hyperlink auditing <area ping>]
     expected: TIMEOUT
 
--- a/testing/web-platform/meta/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-immediate.window.js.ini
+++ b/testing/web-platform/meta/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-immediate.window.js.ini
@@ -1,35 +1,23 @@
 [abort-refresh-immediate.window.html]
   expected:
-    if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): OK
-    if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): OK
-    if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): OK
-    if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): OK
+    if os == "win": OK
     if os == "android": OK
     TIMEOUT
   [document.open() aborts documents that are queued for navigation through Refresh header with timeout 0 (fetch())]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       if os == "android": PASS
       TIMEOUT
 
   [document.open() aborts documents that are queued for navigation through Refresh header with timeout 0 (image loading)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       if os == "android": PASS
       TIMEOUT
 
   [document.open() aborts documents that are queued for navigation through Refresh header with timeout 0 (XMLHttpRequest)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
+      if os == "win": PASS
       if os == "android": PASS
       TIMEOUT
 
--- a/testing/web-platform/meta/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-multisecond-header.window.js.ini
+++ b/testing/web-platform/meta/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/abort-refresh-multisecond-header.window.js.ini
@@ -1,23 +1,17 @@
 [abort-refresh-multisecond-header.window.html]
   expected: TIMEOUT
   [document.open() does NOT abort documents that are queued for navigation through Refresh header with 1-sec timeout (fetch())]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): FAIL
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): FAIL
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): FAIL
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): FAIL
+      if os == "win": FAIL
       if os == "android": FAIL
       TIMEOUT
 
   [document.open() does NOT abort documents that are queued for navigation through Refresh header with 4-sec timeout (image loading)]
     expected: TIMEOUT
 
   [document.open() does NOT abort documents that are queued for navigation through Refresh header with 1-sec timeout (XMLHttpRequest)]
     expected:
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): FAIL
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): FAIL
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): FAIL
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): FAIL
+      if os == "win": FAIL
       if os == "android": FAIL
       TIMEOUT
 
--- a/testing/web-platform/meta/infrastructure/testdriver/file_upload.sub.html.ini
+++ b/testing/web-platform/meta/infrastructure/testdriver/file_upload.sub.html.ini
@@ -1,7 +1,4 @@
 [file_upload.sub.html]
   expected:
     if not debug and not webrender and not e10s and (os == "android") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): ERROR
-    if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): ERROR
-    if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): ERROR
-    if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): ERROR
-    if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): ERROR
+    if os == "win": ERROR
--- a/testing/web-platform/meta/payment-request/idlharness.https.window.js.ini
+++ b/testing/web-platform/meta/payment-request/idlharness.https.window.js.ini
@@ -251,26 +251,19 @@
       if not e10s: FAIL
 
   [PaymentResponse interface: operation complete(PaymentComplete)]
     expected:
       if not e10s: FAIL
 
   [PaymentResponse interface: operation retry(PaymentValidationErrors)]
     expected:
-      if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
-      if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
-      if debug and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if e10s and (os == "linux"): PASS
+      if os == "win": PASS
+      if os == "mac": PASS
       FAIL
 
   [PaymentResponse interface: attribute onpayerdetailchange]
     expected:
       if not e10s: FAIL
 
   [PaymentMethodChangeEvent interface: existence and properties of interface object]
     expected:
--- a/testing/web-platform/meta/payment-request/interfaces.https.html.ini
+++ b/testing/web-platform/meta/payment-request/interfaces.https.html.ini
@@ -459,26 +459,19 @@
       if not e10s: FAIL
 
   [PaymentRequest interface: new PaymentRequest([{supportedMethods: 'foo'}\], {total: {label: 'bar', amount: {currency: 'USD', value: '0'}} }) must inherit property "onpaymentmethodchange" with the proper type]
     expected:
       if not e10s: FAIL
 
   [PaymentResponse interface: operation retry(PaymentValidationErrors)]
     expected:
-      if debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
-      if debug and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): PASS
-      if debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): PASS
-      if not debug and not webrender and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): PASS
+      if e10s and (os == "linux"): PASS
+      if os == "mac": PASS
+      if os == "win": PASS
       FAIL
 
   [PaymentResponse interface: attribute onpayerdetailchange]
     expected:
       if not e10s: FAIL
 
   [PaymentMethodChangeEvent interface: existence and properties of interface object]
     expected:
--- a/testing/web-platform/meta/service-workers/service-worker/fetch-canvas-tainting-video-cache.https.html.ini
+++ b/testing/web-platform/meta/service-workers/service-worker/fetch-canvas-tainting-video-cache.https.html.ini
@@ -1,12 +1,13 @@
 [fetch-canvas-tainting-video-cache.https.html]
   disabled:
     if os == "linux": https://bugzilla.mozilla.org/show_bug.cgi?id=1464898
     if (os == "win") and (version == "6.1.7601") and (bits == 32): https://bugzilla.mozilla.org/show_bug.cgi?id=1464898
+    if (os == "win") and webrender: https://bugzilla.mozilla.org/show_bug.cgi?id=1464898
     if verify and (os == "linux"): fails in verify mode
     if verify and (os == "win"): fails in verify mode
   [url "https://web-platform.test:8443/service-workers/service-worker/resources/fetch-access-control.py?VIDEO&cache=true&mode=cors&credentials=same-origin&url=https%3A%2F%2Fwww1.web-platform.test%3A8443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FVIDEO%26cache%3Dtrue%26ACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8443" with crossOrigin "" should be NOT_TAINTED]
     expected: FAIL
 
   [url "https://www1.web-platform.test:8443/service-workers/service-worker/resources/fetch-access-control.py?VIDEO&cache=true&mode=cors&credentials=same-origin&url=https%3A%2F%2Fwww1.web-platform.test%3A8443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FVIDEO%26cache%3Dtrue%26ACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8443" with crossOrigin "" should be NOT_TAINTED]
     expected: FAIL
 
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/semantics/embedded-content/the-img-element/srcset/srcset-media-dynamic.html
@@ -0,0 +1,25 @@
+<!doctype html>
+<title>source element in picture handles dynamic media change correctly.</title>
+<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez">
+<link rel="author" href="https://mozilla.org" title="Mozilla">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1523627">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<picture id="pic">
+  <source srcset="data:,a">
+</picture>
+<script>
+let t = async_test("Dynamic media change is handled correctly");
+
+let pic = document.getElementById("pic");
+// Something that will never match.
+pic.querySelector("source").setAttribute("media", "not all");
+
+let img = document.createElement("img");
+img.src = "data:,b";
+pic.appendChild(img);
+
+onload = t.step_func_done(function() {
+  assert_equals(img.currentSrc, "data:,b");
+});
+</script>
--- a/toolkit/components/telemetry/Scalars.yaml
+++ b/toolkit/components/telemetry/Scalars.yaml
@@ -2131,16 +2131,30 @@ timestamps:
     expires: never
     kind: uint
     notification_emails:
       - hkirschner@mozilla.com
     release_channel_collection: opt-out
     record_in_processes:
       - main
 
+  about_home_topsites_first_paint:
+    bug_numbers:
+      - 1518521
+    description: >
+      Record the timestamp of when the first about:home's Topsites are painted. Only records if
+      about:home is set as the default homepage, and if sessions are not being restored by default.
+    expires: never
+    kind: uint
+    notification_emails:
+      - mconley@mozilla.com
+    release_channel_collection: opt-out
+    record_in_processes:
+      - main
+
 browser.timings:
   last_shutdown:
     bug_numbers:
       - 1429510
     description: >
       The time, in milliseconds, it took to complete the last shutdown.
       On successful shutdown, Telemetry saves this to disk into Telemetry.ShutdownTime.txt.
       On the next startup this is loaded and recorded.
--- a/toolkit/components/telemetry/app/TelemetryEnvironment.jsm
+++ b/toolkit/components/telemetry/app/TelemetryEnvironment.jsm
@@ -266,16 +266,18 @@ const DEFAULT_ENVIRONMENT_PREFS = new Ma
   ["pdfjs.disabled", {what: RECORD_PREF_VALUE}],
   ["places.history.enabled", {what: RECORD_PREF_VALUE}],
   ["plugins.show_infobar", {what: RECORD_PREF_VALUE}],
   ["privacy.fuzzyfox.enabled", {what: RECORD_PREF_VALUE}],
   ["privacy.trackingprotection.enabled", {what: RECORD_PREF_VALUE}],
   ["privacy.donottrackheader.enabled", {what: RECORD_PREF_VALUE}],
   ["security.mixed_content.block_active_content", {what: RECORD_PREF_VALUE}],
   ["security.mixed_content.block_display_content", {what: RECORD_PREF_VALUE}],
+  ["toolkit.telemetry.testing.overridePreRelease", {what: RECORD_PREF_VALUE}],
+  ["toolkit.telemetry.overrideUpdateChannel", {what: RECORD_PREF_STATE}],
   ["xpinstall.signatures.required", {what: RECORD_PREF_VALUE}],
 ]);
 
 const LOGGER_NAME = "Toolkit.Telemetry";
 
 const PREF_BLOCKLIST_ENABLED = "extensions.blocklist.enabled";
 const PREF_DISTRIBUTION_ID = "distribution.id";
 const PREF_DISTRIBUTION_VERSION = "distribution.version";
--- a/toolkit/components/telemetry/docs/internals/preferences.rst
+++ b/toolkit/components/telemetry/docs/internals/preferences.rst
@@ -97,17 +97,17 @@ Preferences
   If ``unified`` is false, we don't use this value.
 
 ``toolkit.telemetry.archive.enabled``
 
   Allow pings to be archived locally. This can only be enabled if ``unified`` is on.
 
 ``toolkit.telemetry.server``
 
-  The server Telemetry pings are sent to.
+  The server Telemetry pings are sent to. Change requires restart.
 
 ``toolkit.telemetry.log.level``
 
   This sets the Telemetry logging verbosity per ``Log.jsm``. The available levels, in descending order of verbosity, are ``Trace``, ``Debug``, ``Config``, ``Info``, ``Warn``, ``Error`` and ``Fatal`` with the default being ``Warn``.
 
   By default logging goes only the console service.
 
 ``toolkit.telemetry.log.dump``
--- a/toolkit/crashreporter/breakpad-client/linux/handler/exception_handler.cc
+++ b/toolkit/crashreporter/breakpad-client/linux/handler/exception_handler.cc
@@ -211,16 +211,17 @@ pthread_mutex_t g_handler_stack_mutex_ =
 
 // sizeof(CrashContext) can be too big w.r.t the size of alternatate stack
 // for SignalHandler(). Keep the crash context as a .bss field. Exception
 // handlers are serialized by the |g_handler_stack_mutex_| and at most one at a
 // time can use |g_crash_context_|.
 ExceptionHandler::CrashContext g_crash_context_;
 
 FirstChanceHandler g_first_chance_handler_ = nullptr;
+FirstChanceHandlerDeprecated g_first_chance_handler_deprecated_ = nullptr;
 bool g_skip_sigill_ = false;
 }  // namespace
 
 // Runs before crashing: normal context.
 ExceptionHandler::ExceptionHandler(const MinidumpDescriptor& descriptor,
                                    FilterCallback filter,
                                    MinidumpCallback callback,
                                    void* callback_context,
@@ -344,16 +345,21 @@ void ExceptionHandler::SignalHandler(int
   // safety in WebAssembly. This means some signals might be expected if they
   // originate from Wasm code while accessing the guard region. We give V8 the
   // chance to handle and recover from these signals first.
   if (g_first_chance_handler_ != nullptr &&
       g_first_chance_handler_(sig, info, uc)) {
     return;
   }
 
+  if (g_first_chance_handler_deprecated_ != nullptr &&
+      g_first_chance_handler_deprecated_(sig, info, uc)) {
+    return;
+  }
+
   // All the exception signals are blocked at this point.
   pthread_mutex_lock(&g_handler_stack_mutex_);
 
   // Sometimes, Breakpad runs inside a process where some other buggy code
   // saves and restores signal handlers temporarily with 'signal'
   // instead of 'sigaction'. This loses the SA_SIGINFO flag associated
   // with this function. As a consequence, the values of 'info' and 'uc'
   // become totally bogus, generally inducing a crash.
@@ -821,12 +827,18 @@ bool ExceptionHandler::WriteMinidumpForC
                                       child,
                                       child_blamed_thread))
       return false;
 
   return callback ? callback(descriptor, callback_context, true) : true;
 }
 
 void SetFirstChanceExceptionHandler(FirstChanceHandler callback) {
+  g_first_chance_handler_deprecated_ = nullptr;
   g_first_chance_handler_ = callback;
 }
 
+void SetFirstChanceExceptionHandler(FirstChanceHandlerDeprecated callback) {
+  g_first_chance_handler_ = nullptr;
+  g_first_chance_handler_deprecated_ = callback;
+}
+
 }  // namespace google_breakpad
--- a/toolkit/crashreporter/breakpad-client/linux/handler/exception_handler.h
+++ b/toolkit/crashreporter/breakpad-client/linux/handler/exception_handler.h
@@ -268,15 +268,19 @@ class ExceptionHandler {
   // dumper code cannot extract enough information from /proc/<pid>/maps.
   MappingList mapping_list_;
 
   // Callers can request additional memory regions to be included in
   // the dump.
   AppMemoryList app_memory_list_;
 };
 
+typedef bool (*FirstChanceHandler)(int, siginfo_t*, void*);
+void SetFirstChanceExceptionHandler(FirstChanceHandler callback);
 
-typedef bool (*FirstChanceHandler)(int, void*, void*);
-void SetFirstChanceExceptionHandler(FirstChanceHandler callback);
+typedef bool (*FirstChanceHandlerDeprecated)(int, void*, void*);
+// Deprecated. Use SetFirstChanceExceptionHandler(FirstChanceHandler callback)
+// instead.
+void SetFirstChanceExceptionHandler(FirstChanceHandlerDeprecated callback);
 
 }  // namespace google_breakpad
 
 #endif  // CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H_
--- a/toolkit/crashreporter/breakpad-client/linux/handler/exception_handler_unittest.cc
+++ b/toolkit/crashreporter/breakpad-client/linux/handler/exception_handler_unittest.cc
@@ -523,21 +523,42 @@ TEST(ExceptionHandlerTest, StackedHandle
                             -1);
     CrashWithCallbacks(NULL, DoneCallbackReturnFalse, temp_dir.path());
   }
   ASSERT_NO_FATAL_FAILURE(WaitForProcessToTerminate(child, SIGKILL));
 }
 
 namespace {
 const int kSimpleFirstChanceReturnStatus = 42;
-bool SimpleFirstChanceHandler(int, void*, void*) {
+bool SimpleFirstChanceHandlerDeprecated(int, void*, void*) {
+  _exit(kSimpleFirstChanceReturnStatus);
+}
+
+bool SimpleFirstChanceHandler(int, siginfo_t*, void*) {
   _exit(kSimpleFirstChanceReturnStatus);
 }
 }
 
+TEST(ExceptionHandlerTest, FirstChanceHandlerRunsDeprecated) {
+  AutoTempDir temp_dir;
+
+  const pid_t child = fork();
+  if (child == 0) {
+    ExceptionHandler handler(
+        MinidumpDescriptor(temp_dir.path()), NULL, NULL, NULL, true, -1);
+    google_breakpad::SetFirstChanceExceptionHandler(
+        SimpleFirstChanceHandlerDeprecated);
+    DoNullPointerDereference();
+  }
+  int status;
+  ASSERT_NE(HANDLE_EINTR(waitpid(child, &status, 0)), -1);
+  ASSERT_TRUE(WIFEXITED(status));
+  ASSERT_EQ(kSimpleFirstChanceReturnStatus, WEXITSTATUS(status));
+}
+
 TEST(ExceptionHandlerTest, FirstChanceHandlerRuns) {
   AutoTempDir temp_dir;
 
   const pid_t child = fork();
   if (child == 0) {
     ExceptionHandler handler(
         MinidumpDescriptor(temp_dir.path()), NULL, NULL, NULL, true, -1);
     google_breakpad::SetFirstChanceExceptionHandler(SimpleFirstChanceHandler);
--- a/toolkit/crashreporter/breakpad-client/windows/common/minidump_callback.cc
+++ b/toolkit/crashreporter/breakpad-client/windows/common/minidump_callback.cc
@@ -207,16 +207,24 @@ void IncludeAppMemoryFromExceptionContex
     heapAddrCandidates[numElements++] = aExceptionContext->R10;
     heapAddrCandidates[numElements++] = aExceptionContext->R11;
     heapAddrCandidates[numElements++] = aExceptionContext->R12;
     heapAddrCandidates[numElements++] = aExceptionContext->R13;
     heapAddrCandidates[numElements++] = aExceptionContext->R14;
     heapAddrCandidates[numElements++] = aExceptionContext->R15;
   }
   heapAddrCandidates[numElements++] = aExceptionContext->Rip;
+#elif defined(_M_ARM64)
+  if (!aInstructionPointerOnly) {
+    for (auto reg : aExceptionContext->X) {
+      heapAddrCandidates[numElements++] = reg;
+    }
+    heapAddrCandidates[numElements++] = aExceptionContext->Sp;
+  }
+  heapAddrCandidates[numElements++] = aExceptionContext->Pc;
 #endif
 
   // Inplace sort the candidates for excluding or merging memory regions.
   auto begin = &heapAddrCandidates[0], end = &heapAddrCandidates[numElements];
   std::make_heap(begin, end);
   std::sort_heap(begin, end);
 
   auto appMemory = FindNextPreallocated(aList, aList.begin());
--- a/toolkit/crashreporter/breakpad-client/windows/handler/exception_handler.cc
+++ b/toolkit/crashreporter/breakpad-client/windows/handler/exception_handler.cc
@@ -380,17 +380,17 @@ bool ExceptionHandler::RequestUpload(DWO
 
 // static
 DWORD ExceptionHandler::ExceptionHandlerThreadMain(void* lpParameter) {
   ExceptionHandler* self = reinterpret_cast<ExceptionHandler *>(lpParameter);
   assert(self);
   assert(self->handler_start_semaphore_ != NULL);
   assert(self->handler_finish_semaphore_ != NULL);
 
-  while (true) {
+  for (;;) {
     if (WaitForSingleObject(self->handler_start_semaphore_, INFINITE) ==
         WAIT_OBJECT_0) {
       // Perform the requested action.
       if (self->is_shutdown_) {
         // The instance of the exception handler is being destroyed.
         break;
       } else {
         self->handler_return_value_ =
new file mode 100644
--- /dev/null
+++ b/toolkit/crashreporter/breakpad-patches/01-llvm-windows-symbol-fixup.patch
@@ -0,0 +1,84 @@
+diff --git a/src/common/windows/pdb_source_line_writer.cc b/src/common/windows/pdb_source_line_writer.cc
+--- a/src/common/windows/pdb_source_line_writer.cc
++++ b/src/common/windows/pdb_source_line_writer.cc
+@@ -1019,34 +1019,50 @@ bool PDBSourceLineWriter::FindPEFile() {
+         }
+       }
+     }
+   }
+ 
+   return false;
+ }
+ 
++static const DWORD kUndecorateOptions =
++    UNDNAME_NO_MS_KEYWORDS | UNDNAME_NO_FUNCTION_RETURNS |
++    UNDNAME_NO_ALLOCATION_MODEL | UNDNAME_NO_ALLOCATION_LANGUAGE |
++    UNDNAME_NO_THISTYPE | UNDNAME_NO_ACCESS_SPECIFIERS |
++    UNDNAME_NO_THROW_SIGNATURES | UNDNAME_NO_MEMBER_TYPE |
++    UNDNAME_NO_RETURN_UDT_MODEL | UNDNAME_NO_ECSU;
++
++static void FixupLlvmUniqueSymbol(BSTR *name) {
++  wchar_t *suffix = wcsstr(*name, L".llvm.");
++
++  if (suffix != nullptr) {
++    *suffix = L'\0';
++
++    const size_t undecorated_len = 1024;
++    wchar_t undecorated[undecorated_len] = {};
++    DWORD res = UnDecorateSymbolNameW(*name, undecorated, undecorated_len,
++                                      kUndecorateOptions);
++    if (res == 0) {
++      fprintf(stderr, "failed to undecorate symbol %S\n", *name);
++    } else {
++      SysFreeString(*name);
++      *name = SysAllocString(undecorated);
++    }
++  }
++}
++
+ // static
+ bool PDBSourceLineWriter::GetSymbolFunctionName(IDiaSymbol *function,
+                                                 BSTR *name,
+                                                 int *stack_param_size) {
+   *stack_param_size = -1;
+-  const DWORD undecorate_options = UNDNAME_NO_MS_KEYWORDS |
+-                                   UNDNAME_NO_FUNCTION_RETURNS |
+-                                   UNDNAME_NO_ALLOCATION_MODEL |
+-                                   UNDNAME_NO_ALLOCATION_LANGUAGE |
+-                                   UNDNAME_NO_THISTYPE |
+-                                   UNDNAME_NO_ACCESS_SPECIFIERS |
+-                                   UNDNAME_NO_THROW_SIGNATURES |
+-                                   UNDNAME_NO_MEMBER_TYPE |
+-                                   UNDNAME_NO_RETURN_UDT_MODEL |
+-                                   UNDNAME_NO_ECSU;
+ 
+   // Use get_undecoratedNameEx to get readable C++ names with arguments.
+-  if (function->get_undecoratedNameEx(undecorate_options, name) != S_OK) {
++  if (function->get_undecoratedNameEx(kUndecorateOptions, name) != S_OK) {
+     if (function->get_name(name) != S_OK) {
+       fprintf(stderr, "failed to get function name\n");
+       return false;
+     }
+ 
+     // It's possible for get_name to return an empty string, so
+     // special-case that.
+     if (wcscmp(*name, L"") == 0) {
+@@ -1060,16 +1076,18 @@ bool PDBSourceLineWriter::GetSymbolFunct
+     // it's already formatted properly to be used as output.  Don't do any
+     // additional processing.
+     //
+     // MSVC7's DIA seems to not undecorate names in as many cases as MSVC8's.
+     // This will result in calling get_name for some C++ symbols, so
+     // all of the parameter and return type information may not be included in
+     // the name string.
+   } else {
++    FixupLlvmUniqueSymbol(name);
++
+     // C++ uses a bogus "void" argument for functions and methods that don't
+     // take any parameters.  Take it out of the undecorated name because it's
+     // ugly and unnecessary.
+     const wchar_t *replace_string = L"(void)";
+     const size_t replace_length = wcslen(replace_string);
+     const wchar_t *replacement_string = L"()";
+     size_t length = wcslen(*name);
+     if (length >= replace_length) {
new file mode 100644
--- /dev/null
+++ b/toolkit/crashreporter/breakpad-patches/02-define-print-mach-result.patch
@@ -0,0 +1,24 @@
+diff --git a/src/common/mac/MachIPC.h b/src/common/mac/MachIPC.h
+--- a/src/common/mac/MachIPC.h
++++ b/src/common/mac/MachIPC.h
+@@ -90,18 +90,20 @@
+ //
+ //    char messageString[] = "Hello server!\n";
+ //    message.SetData(messageString, strlen(messageString)+1);
+ //
+ //    kern_return_t result = sender.SendMessage(message, 1000); // timeout 1000ms
+ //
+ 
+ namespace google_breakpad {
++#ifndef PRINT_MACH_RESULT
+ #define PRINT_MACH_RESULT(result_, message_) \
+   printf(message_" %s (%d)\n", mach_error_string(result_), result_ );
++#endif
+ 
+ //==============================================================================
+ // A wrapper class for mach_msg_port_descriptor_t (with same memory layout)
+ // with convenient constructors and accessors
+ class MachMsgPortDescriptor : public mach_msg_port_descriptor_t {
+  public:
+   // General-purpose constructor
+   MachMsgPortDescriptor(mach_port_t in_name,
new file mode 100644
--- /dev/null
+++ b/toolkit/crashreporter/breakpad-patches/03-strstr-libc-replacement.patch
@@ -0,0 +1,54 @@
+diff --git a/src/common/linux/linux_libc_support.cc b/src/common/linux/linux_libc_support.cc
+--- a/src/common/linux/linux_libc_support.cc
++++ b/src/common/linux/linux_libc_support.cc
+@@ -133,16 +133,27 @@ const char* my_strrchr(const char* hayst
+   while (*haystack) {
+     if (*haystack == needle)
+       ret = haystack;
+     haystack++;
+   }
+   return ret;
+ }
+ 
++const char* my_strstr(const char* haystack, const char* needle) {
++  while (*haystack != 0) {
++    if((*haystack == *needle) &&
++       (my_strncmp(haystack, needle, my_strlen(needle)) == 0)) {
++      return haystack;
++    }
++    haystack++;
++  }
++  return nullptr;
++}
++
+ void* my_memchr(const void* src, int needle, size_t src_len) {
+   const unsigned char* p = (const unsigned char*)src;
+   const unsigned char* p_end = p + src_len;
+   for (; p < p_end; ++p) {
+     if (*p == needle)
+       return (void*)p;
+   }
+   return NULL;
+diff --git a/src/common/linux/linux_libc_support.h b/src/common/linux/linux_libc_support.h
+--- a/src/common/linux/linux_libc_support.h
++++ b/src/common/linux/linux_libc_support.h
+@@ -62,16 +62,18 @@ extern unsigned my_uint_len(uintmax_t i)
+ //   i: the unsigned integer to serialise.
+ //   i_len: the length of the integer in base 10 (see |my_uint_len|).
+ extern void my_uitos(char* output, uintmax_t i, unsigned i_len);
+ 
+ extern const char* my_strchr(const char* haystack, char needle);
+ 
+ extern const char* my_strrchr(const char* haystack, char needle);
+ 
++extern const char *my_strstr(const char *haystack, const char *needle);
++
+ // Read a hex value
+ //   result: (output) the resulting value
+ //   s: a string
+ // Returns a pointer to the first invalid charactor.
+ extern const char* my_read_hex_ptr(uintptr_t* result, const char* s);
+ 
+ extern const char* my_read_decimal_ptr(uintptr_t* result, const char* s);
+ 
+
--- a/toolkit/crashreporter/google-breakpad/GIT-INFO
+++ b/toolkit/crashreporter/google-breakpad/GIT-INFO
@@ -1,1 +1,1 @@
-1459e5df74dd03b7d3d473e6d271413d7aa98a88
+44384d80b32a5bb361c2ec3bee667f7ccee566d7
--- a/toolkit/crashreporter/google-breakpad/src/common/dwarf_cu_to_module.cc
+++ b/toolkit/crashreporter/google-breakpad/src/common/dwarf_cu_to_module.cc
@@ -926,32 +926,35 @@ class FunctionRange {
     function->lines.push_back(line);
   }
 
   Module::Address address;
   Module::Address size;
   Module::Function *function;
 };
 
-// Fills an array of ranges with pointers to the functions which owns them.
-// The array is sorted in ascending order and the ranges are non-overlapping.
+// Fills an array of ranges with pointers to the functions which owns
+// them. The array is sorted in ascending order and the ranges are non
+// empty and non-overlapping.
 
 static void FillSortedFunctionRanges(vector<FunctionRange> &dest_ranges,
                                      vector<Module::Function *> *functions) {
   for (vector<Module::Function *>::const_iterator func_it = functions->cbegin();
        func_it != functions->cend();
        func_it++)
   {
     Module::Function *func = *func_it;
     vector<Module::Range> &ranges = func->ranges;
     for (vector<Module::Range>::const_iterator ranges_it = ranges.cbegin();
          ranges_it != ranges.cend();
          ++ranges_it) {
       FunctionRange range(*ranges_it, func);
-      dest_ranges.push_back(range);
+      if (range.size != 0) {
+          dest_ranges.push_back(range);
+      }
     }
   }
 
   sort(dest_ranges.begin(), dest_ranges.end(),
     [](const FunctionRange &fr1, const FunctionRange &fr2) {
       return fr1.address < fr2.address;
     }
   );
--- a/toolkit/crashreporter/google-breakpad/src/common/mac/arch_utilities.cc
+++ b/toolkit/crashreporter/google-breakpad/src/common/mac/arch_utilities.cc
@@ -41,25 +41,41 @@
 #ifndef CPU_TYPE_ARM64
 #define CPU_TYPE_ARM64 (CPU_TYPE_ARM | CPU_ARCH_ABI64)
 #endif  // CPU_TYPE_ARM64
 
 #ifndef CPU_SUBTYPE_ARM64_ALL
 #define CPU_SUBTYPE_ARM64_ALL (static_cast<cpu_subtype_t>(0))
 #endif  // CPU_SUBTYPE_ARM64_ALL
 
+#ifndef CPU_SUBTYPE_ARM64_E
+#define CPU_SUBTYPE_ARM64_E (static_cast<cpu_subtype_t>(2))
+#endif  // CPU_SUBTYPE_ARM64_E
+
 namespace {
 
-const NXArchInfo* ArchInfo_arm64() {
+const NXArchInfo* ArchInfo_arm64(cpu_subtype_t cpu_subtype) {
+  const char* name = NULL;
+  switch (cpu_subtype) {
+    case CPU_SUBTYPE_ARM64_ALL:
+      name = "arm64";
+      break;
+    case CPU_SUBTYPE_ARM64_E:
+      name = "arm64e";
+      break;
+    default:
+      return NULL;
+  }
+
   NXArchInfo* arm64 = new NXArchInfo;
   *arm64 = *NXGetArchInfoFromCpuType(CPU_TYPE_ARM,
                                      CPU_SUBTYPE_ARM_V7);
-  arm64->name = "arm64";
+  arm64->name = name;
   arm64->cputype = CPU_TYPE_ARM64;
-  arm64->cpusubtype = CPU_SUBTYPE_ARM64_ALL;
+  arm64->cpusubtype = cpu_subtype;
   arm64->description = "arm 64";
   return arm64;
 }
 
 const NXArchInfo* ArchInfo_armv7s() {
   NXArchInfo* armv7s = new NXArchInfo;
   *armv7s = *NXGetArchInfoFromCpuType(CPU_TYPE_ARM,
                                       CPU_SUBTYPE_ARM_V7);
@@ -74,31 +90,40 @@ const NXArchInfo* ArchInfo_armv7s() {
 namespace google_breakpad {
 
 const NXArchInfo* BreakpadGetArchInfoFromName(const char* arch_name) {
   // TODO: Remove this when the OS knows about arm64.
   if (!strcmp("arm64", arch_name))
     return BreakpadGetArchInfoFromCpuType(CPU_TYPE_ARM64,
                                           CPU_SUBTYPE_ARM64_ALL);
 
+  if (!strcmp("arm64e", arch_name))
+    return BreakpadGetArchInfoFromCpuType(CPU_TYPE_ARM64,
+                                          CPU_SUBTYPE_ARM64_E);
+
   // TODO: Remove this when the OS knows about armv7s.
   if (!strcmp("armv7s", arch_name))
     return BreakpadGetArchInfoFromCpuType(CPU_TYPE_ARM, CPU_SUBTYPE_ARM_V7S);
 
   return NXGetArchInfoFromName(arch_name);
 }
 
 const NXArchInfo* BreakpadGetArchInfoFromCpuType(cpu_type_t cpu_type,
                                                  cpu_subtype_t cpu_subtype) {
   // TODO: Remove this when the OS knows about arm64.
   if (cpu_type == CPU_TYPE_ARM64 && cpu_subtype == CPU_SUBTYPE_ARM64_ALL) {
-    static const NXArchInfo* arm64 = ArchInfo_arm64();
+    static const NXArchInfo* arm64 = ArchInfo_arm64(cpu_subtype);
     return arm64;
   }
 
+  if (cpu_type == CPU_TYPE_ARM64 && cpu_subtype == CPU_SUBTYPE_ARM64_E) {
+    static const NXArchInfo* arm64e = ArchInfo_arm64(cpu_subtype);
+    return arm64e;
+  }
+
   // TODO: Remove this when the OS knows about armv7s.
   if (cpu_type == CPU_TYPE_ARM && cpu_subtype == CPU_SUBTYPE_ARM_V7S) {
     static const NXArchInfo* armv7s = ArchInfo_armv7s();
     return armv7s;
   }
 
   return NXGetArchInfoFromCpuType(cpu_type, cpu_subtype);
 }
@@ -109,16 +134,17 @@ const NXArchInfo* BreakpadGetArchInfoFro
 namespace {
 
 enum Architecture {
   kArch_i386 = 0,
   kArch_x86_64,
   kArch_x86_64h,
   kArch_arm,
   kArch_arm64,
+  kArch_arm64e,
   kArch_ppc,
   // This must be last.
   kNumArchitectures
 };
 
 // enum Architecture above and kKnownArchitectures below
 // must be kept in sync.
 const NXArchInfo kKnownArchitectures[] = {
@@ -153,16 +179,23 @@ const NXArchInfo kKnownArchitectures[] =
   {
     "arm64",
     CPU_TYPE_ARM64,
     CPU_SUBTYPE_ARM64_ALL,
     NX_LittleEndian,
     "ARM64"
   },
   {
+    "arm64e",
+    CPU_TYPE_ARM64,
+    CPU_SUBTYPE_ARM64_E,
+    NX_LittleEndian,
+    "ARM64e"
+  },
+  {
     "ppc",
     CPU_TYPE_POWERPC,
     CPU_SUBTYPE_POWERPC_ALL,
     NX_BigEndian,
     "PowerPC"
   }
 };
 
--- a/toolkit/crashreporter/google-breakpad/src/processor/logging.h
+++ b/toolkit/crashreporter/google-breakpad/src/processor/logging.h
@@ -142,19 +142,21 @@ string HexString(int number);
 int ErrnoString(string *error_string);
 
 }  // namespace google_breakpad
 
 #ifndef BPLOG_INIT
 #define BPLOG_INIT(pargc, pargv)
 #endif  // BPLOG_INIT
 
+#ifndef BPLOG_LAZY_STREAM
 #define BPLOG_LAZY_STREAM(stream, condition) \
     !(condition) ? (void) 0 : \
                    google_breakpad::LogMessageVoidify() & (BPLOG_ ## stream)
+#endif
 
 #ifndef BPLOG_MINIMUM_SEVERITY
 #define BPLOG_MINIMUM_SEVERITY SEVERITY_INFO
 #endif
 
 #define BPLOG_LOG_IS_ON(severity) \
     ((google_breakpad::LogStream::SEVERITY_ ## severity) >= \
      (google_breakpad::LogStream::BPLOG_MINIMUM_SEVERITY))
@@ -185,12 +187,14 @@ int ErrnoString(string *error_string);
 #ifndef BPLOG_CRITICAL_STREAM
 #define BPLOG_CRITICAL_STREAM std::cerr
 #endif  // BPLOG_CRITICAL_STREAM
 #define BPLOG_CRITICAL google_breakpad::LogStream(BPLOG_CRITICAL_STREAM, \
                         google_breakpad::LogStream::SEVERITY_CRITICAL, \
                         __FILE__, __LINE__)
 #endif  // BPLOG_CRITICAL
 
+#ifndef BPLOG_IF
 #define BPLOG_IF(severity, condition) \
     BPLOG_LAZY_STREAM(severity, ((condition) && BPLOG_LOG_IS_ON(severity)))
+#endif  // BPLOG_IF
 
 #endif  // PROCESSOR_LOGGING_H__
--- a/toolkit/crashreporter/google-breakpad/src/processor/minidump.cc
+++ b/toolkit/crashreporter/google-breakpad/src/processor/minidump.cc
@@ -2394,17 +2394,21 @@ const uint8_t* MinidumpModule::GetCVReco
     } else if (signature == MD_CVINFOELF_SIGNATURE) {
       // Now that the structure type is known, recheck the size.
       if (MDCVInfoELF_minsize > module_.cv_record.data_size) {
         BPLOG(ERROR) << "MinidumpModule CodeViewELF record size mismatch, " <<
                         MDCVInfoELF_minsize << " > " <<
                         module_.cv_record.data_size;
         return NULL;
       }
-      // There's nothing to swap in CVInfoELF, it's just raw bytes.
+      if (minidump_->swap()) {
+        MDCVInfoELF* cv_record_elf =
+            reinterpret_cast<MDCVInfoELF*>(&(*cv_record)[0]);
+        Swap(&cv_record_elf->cv_signature);
+      }
     }
 
     // If the signature doesn't match something above, it's not something
     // that Breakpad can presently handle directly.  Because some modules in
     // the wild contain such CodeView records as MD_CVINFOCV50_SIGNATURE,
     // don't bail out here - allow the data to be returned to the user,
     // although byte-swapping can't be done.
 
--- a/toolkit/crashreporter/google-breakpad/src/processor/minidump_processor.cc
+++ b/toolkit/crashreporter/google-breakpad/src/processor/minidump_processor.cc
@@ -350,16 +350,36 @@ static const MDRawSystemInfo* GetSystemI
     return NULL;
 
   if (system_info)
     *system_info = minidump_system_info;
 
   return minidump_system_info->system_info();
 }
 
+static uint64_t GetAddressForArchitecture(const MDCPUArchitecture architecture,
+                                          size_t raw_address)
+{
+  switch (architecture) {
+    case MD_CPU_ARCHITECTURE_X86:
+    case MD_CPU_ARCHITECTURE_MIPS:
+    case MD_CPU_ARCHITECTURE_PPC:
+    case MD_CPU_ARCHITECTURE_SHX:
+    case MD_CPU_ARCHITECTURE_ARM:
+    case MD_CPU_ARCHITECTURE_X86_WIN64:
+      // 32-bit architectures, mask the upper bits.
+      return raw_address & 0xffffffffULL;
+
+    default:
+      // All other architectures either have 64-bit pointers or it's impossible
+      // to tell from the minidump (e.g. MSIL or SPARC) so use 64-bits anyway.
+      return raw_address;
+  }
+}
+
 // Extract CPU info string from ARM-specific MDRawSystemInfo structure.
 // raw_info: pointer to source MDRawSystemInfo.
 // cpu_info: address of target string, cpu info text will be appended to it.
 static void GetARMCpuInfo(const MDRawSystemInfo* raw_info,
                           string* cpu_info) {
   assert(raw_info != NULL && cpu_info != NULL);
 
   // Write ARM architecture version.
@@ -530,16 +550,17 @@ bool MinidumpProcessor::GetCPUInfo(Minid
     }
 
     case MD_CPU_ARCHITECTURE_ARM: {
       info->cpu = "arm";
       GetARMCpuInfo(raw_system_info, &info->cpu_info);
       break;
     }
 
+    case MD_CPU_ARCHITECTURE_ARM64:
     case MD_CPU_ARCHITECTURE_ARM64_OLD: {
       info->cpu = "arm64";
       break;
     }
 
     case MD_CPU_ARCHITECTURE_MIPS: {
       info->cpu = "mips";
       break;
@@ -1631,16 +1652,22 @@ string MinidumpProcessor::GetCrashReason
     }
 
     default: {
       BPLOG(INFO) << "Unknown exception reason " << reason;
       break;
     }
   }
 
+  if (address) {
+    *address = GetAddressForArchitecture(
+      static_cast<MDCPUArchitecture>(raw_system_info->processor_architecture),
+      *address);
+  }
+
   return reason;
 }
 
 // static
 string MinidumpProcessor::GetAssertion(Minidump *dump) {
   MinidumpAssertion *assertion = dump->GetAssertion();
   if (!assertion)
     return "";
--- a/toolkit/crashreporter/google-breakpad/src/processor/minidump_processor_unittest.cc
+++ b/toolkit/crashreporter/google-breakpad/src/processor/minidump_processor_unittest.cc
@@ -198,16 +198,22 @@ static const char *kSystemInfoCPUInfo =
 #define ASSERT_TRUE_ABORT(cond) \
   if (!(cond)) {                                                        \
     fprintf(stderr, "FAILED: %s at %s:%d\n", #cond, __FILE__, __LINE__); \
     abort(); \
   }
 
 #define ASSERT_EQ_ABORT(e1, e2) ASSERT_TRUE_ABORT((e1) == (e2))
 
+static string GetTestDataPath() {
+  char *srcdir = getenv("srcdir");
+
+  return string(srcdir ? srcdir : ".") + "/src/processor/testdata/";
+}
+
 class TestSymbolSupplier : public SymbolSupplier {
  public:
   TestSymbolSupplier() : interrupt_(false) {}
 
   virtual SymbolResult GetSymbolFile(const CodeModule *module,
                                      const SystemInfo *system_info,
                                      string *symbol_file);
 
@@ -244,20 +250,18 @@ SymbolSupplier::SymbolResult TestSymbolS
   ASSERT_EQ_ABORT(system_info->os_short, kSystemInfoOSShort);
   ASSERT_EQ_ABORT(system_info->os_version, kSystemInfoOSVersion);
 
   if (interrupt_) {
     return INTERRUPT;
   }
 
   if (module && module->code_file() == "c:\\test_app.exe") {
-      *symbol_file = string(getenv("srcdir") ? getenv("srcdir") : ".") +
-                     "/src/processor/testdata/symbols/test_app.pdb/" +
-                     module->debug_identifier() +
-                     "/test_app.sym";
+      *symbol_file = GetTestDataPath() + "symbols/test_app.pdb/" +
+                     module->debug_identifier() + "/test_app.sym";
     return FOUND;
   }
 
   return NOT_FOUND;
 }
 
 SymbolSupplier::SymbolResult TestSymbolSupplier::GetSymbolFile(
     const CodeModule *module,
@@ -455,18 +459,17 @@ TEST_F(MinidumpProcessorTest, TestCorrup
 
 // This test case verifies that the symbol supplier is only consulted
 // once per minidump per module.
 TEST_F(MinidumpProcessorTest, TestSymbolSupplierLookupCounts) {
   MockSymbolSupplier supplier;
   BasicSourceLineResolver resolver;
   MinidumpProcessor processor(&supplier, &resolver);
 
-  string minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") +
-                         "/src/processor/testdata/minidump2.dmp";
+  string minidump_file = GetTestDataPath() + "minidump2.dmp";
   ProcessState state;
   EXPECT_CALL(supplier, GetCStringSymbolData(
       Property(&google_breakpad::CodeModule::code_file,
                "c:\\test_app.exe"),
       _, _, _, _)).WillOnce(Return(SymbolSupplier::NOT_FOUND));
   EXPECT_CALL(supplier, GetCStringSymbolData(
       Property(&google_breakpad::CodeModule::code_file,
                Ne("c:\\test_app.exe")),
@@ -496,18 +499,17 @@ TEST_F(MinidumpProcessorTest, TestSymbol
             google_breakpad::PROCESS_OK);
 }
 
 TEST_F(MinidumpProcessorTest, TestBasicProcessing) {
   TestSymbolSupplier supplier;
   BasicSourceLineResolver resolver;
   MinidumpProcessor processor(&supplier, &resolver);
 
-  string minidump_file = string(getenv("srcdir") ? getenv("srcdir") : ".") +
-                         "/src/processor/testdata/minidump2.dmp";
+  string minidump_file = GetTestDataPath() + "minidump2.dmp";
 
   ProcessState state;
   ASSERT_EQ(processor.Process(minidump_file, &state),
             google_breakpad::PROCESS_OK);
   ASSERT_EQ(state.system_info()->os, kSystemInfoOS);
   ASSERT_EQ(state.system_info()->os_short, kSystemInfoOSShort);
   ASSERT_EQ(state.system_info()->os_version, kSystemInfoOSVersion);
   ASSERT_EQ(state.system_info()->cpu, kSystemInfoCPU);
@@ -734,14 +736,34 @@ TEST_F(MinidumpProcessorTest, TestThread
   EXPECT_EQ(processor.Process(&dump, &state),
             google_breakpad::PROCESS_OK);
 
   // Should have a single thread with zero frames.
   ASSERT_EQ(1U, state.threads()->size());
   ASSERT_EQ(0U, state.threads()->at(0)->frames()->size());
 }
 
+TEST_F(MinidumpProcessorTest, Test32BitCrashingAddress) {
+  TestSymbolSupplier supplier;
+  BasicSourceLineResolver resolver;
+  MinidumpProcessor processor(&supplier, &resolver);
+
+  string minidump_file = GetTestDataPath() + "minidump_32bit_crash_addr.dmp";
+
+  ProcessState state;
+  ASSERT_EQ(processor.Process(minidump_file, &state),
+            google_breakpad::PROCESS_OK);
+  ASSERT_EQ(state.system_info()->os, kSystemInfoOS);
+  ASSERT_EQ(state.system_info()->os_short, kSystemInfoOSShort);
+  ASSERT_EQ(state.system_info()->os_version, kSystemInfoOSVersion);
+  ASSERT_EQ(state.system_info()->cpu, kSystemInfoCPU);
+  ASSERT_EQ(state.system_info()->cpu_info, kSystemInfoCPUInfo);
+  ASSERT_TRUE(state.crashed());
+  ASSERT_EQ(state.crash_reason(), "EXCEPTION_ACCESS_VIOLATION_WRITE");
+  ASSERT_EQ(state.crash_address(), 0x45U);
+}
+
 }  // namespace
 
 int main(int argc, char *argv[]) {
   ::testing::InitGoogleTest(&argc, argv);
   return RUN_ALL_TESTS();
 }
--- a/toolkit/crashreporter/google-breakpad/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj
+++ b/toolkit/crashreporter/google-breakpad/src/tools/mac/dump_syms/dump_syms.xcodeproj/project.pbxproj
@@ -31,16 +31,18 @@
 			productName = all_unittests;
 		};
 /* End PBXAggregateTarget section */
 
 /* Begin PBXBuildFile section */
 		162F64FA161C591500CD68D5 /* arch_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = 162F64F8161C591500CD68D5 /* arch_utilities.cc */; };
 		162F6500161C5F2200CD68D5 /* arch_utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = 162F64F8161C591500CD68D5 /* arch_utilities.cc */; };
 		4247E63D2110D4B200482558 /* path_helper.cc in Sources */ = {isa = PBXBuildFile; fileRef = EB06C7511FEBC515000214D9 /* path_helper.cc */; };
+		4262382721AC496F00E5A3A6 /* dwarf_range_list_handler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4262382521AC496F00E5A3A6 /* dwarf_range_list_handler.cc */; };
+		4262382821AC49A000E5A3A6 /* dwarf_range_list_handler.h in Sources */ = {isa = PBXBuildFile; fileRef = 4262382621AC496F00E5A3A6 /* dwarf_range_list_handler.h */; };
 		4D72CAF513DFBAC2006CABE3 /* md5.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4D72CAF413DFBAC2006CABE3 /* md5.cc */; };
 		8BCAAA4C1CE3A7980046090B /* elf_reader.cc in Sources */ = {isa = PBXBuildFile; fileRef = 8BCAAA4A1CE3A7980046090B /* elf_reader.cc */; };
 		8BCAAA4D1CE3B1260046090B /* elf_reader.cc in Sources */ = {isa = PBXBuildFile; fileRef = 8BCAAA4A1CE3A7980046090B /* elf_reader.cc */; };
 		B84A91F8116CF78F006C210E /* libgtestmockall.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B88FB024116BDFFF00407530 /* libgtestmockall.a */; };
 		B84A91FB116CF7AF006C210E /* module.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE241166603300407530 /* module.cc */; };
 		B84A91FC116CF7AF006C210E /* stabs_to_module.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE3C11666C8900407530 /* stabs_to_module.cc */; };
 		B84A91FD116CF7AF006C210E /* stabs_to_module_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FB0D8116CEC0600407530 /* stabs_to_module_unittest.cc */; };
 		B88FAE1911665FE400407530 /* dwarf2diehandler.cc in Sources */ = {isa = PBXBuildFile; fileRef = B88FAE1711665FE400407530 /* dwarf2diehandler.cc */; };
@@ -273,16 +275,18 @@
 		};
 /* End PBXContainerItemProxy section */
 
 /* Begin PBXFileReference section */
 		08FB7796FE84155DC02AAC07 /* dump_syms.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = dump_syms.cc; path = ../../../common/mac/dump_syms.cc; sourceTree = "<group>"; };
 		08FB779EFE84155DC02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
 		162F64F8161C591500CD68D5 /* arch_utilities.cc */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = arch_utilities.cc; path = ../../../common/mac/arch_utilities.cc; sourceTree = "<group>"; };
 		162F64F9161C591500CD68D5 /* arch_utilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = arch_utilities.h; path = ../../../common/mac/arch_utilities.h; sourceTree = "<group>"; };
+		4262382521AC496F00E5A3A6 /* dwarf_range_list_handler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dwarf_range_list_handler.cc; path = ../../../common/dwarf_range_list_handler.cc; sourceTree = "<group>"; };
+		4262382621AC496F00E5A3A6 /* dwarf_range_list_handler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dwarf_range_list_handler.h; path = ../../../common/dwarf_range_list_handler.h; sourceTree = "<group>"; };
 		4D72CAF413DFBAC2006CABE3 /* md5.cc */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.cpp; fileEncoding = 4; name = md5.cc; path = ../../../common/md5.cc; sourceTree = SOURCE_ROOT; };
 		557800890BE1F3AB00EC23E0 /* macho_utilities.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = macho_utilities.cc; path = ../../../common/mac/macho_utilities.cc; sourceTree = SOURCE_ROOT; };
 		5578008A0BE1F3AB00EC23E0 /* macho_utilities.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = macho_utilities.h; path = ../../../common/mac/macho_utilities.h; sourceTree = SOURCE_ROOT; };
 		8B31023E11F0CF1C00FCF3E4 /* Breakpad.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Breakpad.xcconfig; path = ../../../common/mac/Breakpad.xcconfig; sourceTree = SOURCE_ROOT; };
 		8B3102D411F0D60300FCF3E4 /* BreakpadDebug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = BreakpadDebug.xcconfig; path = ../../../common/mac/BreakpadDebug.xcconfig; sourceTree = SOURCE_ROOT; };
 		8B3102D511F0D60300FCF3E4 /* BreakpadRelease.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = BreakpadRelease.xcconfig; path = ../../../common/mac/BreakpadRelease.xcconfig; sourceTree = SOURCE_ROOT; };
 		8BCAAA4A1CE3A7980046090B /* elf_reader.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = elf_reader.cc; path = ../../../common/dwarf/elf_reader.cc; sourceTree = "<group>"; };
 		8BCAAA4B1CE3A7980046090B /* elf_reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = elf_reader.h; path = ../../../common/dwarf/elf_reader.h; sourceTree = "<group>"; };
@@ -608,16 +612,18 @@
 		};
 		F9F5344B0E7C8FFC0012363F /* DWARF */ = {
 			isa = PBXGroup;
 			children = (
 				B88FAF34116A595400407530 /* cfi_assembler.cc */,
 				B88FAF35116A595400407530 /* cfi_assembler.h */,
 				F95B422E0E0E22D100DBDE83 /* dwarf2enums.h */,
 				F95B422F0E0E22D100DBDE83 /* dwarf2reader.cc */,
+				4262382521AC496F00E5A3A6 /* dwarf_range_list_handler.cc */,
+				4262382621AC496F00E5A3A6 /* dwarf_range_list_handler.h */,
 				F95B42300E0E22D100DBDE83 /* dwarf2reader.h */,
 				B88FAF36116A595400407530 /* dwarf2reader_cfi_unittest.cc */,
 				F95B422D0E0E22D100DBDE83 /* bytereader.h */,
 				F95B422B0E0E22D100DBDE83 /* bytereader-inl.h */,
 				F95B422C0E0E22D100DBDE83 /* bytereader.cc */,
 				B88FB0DA116CEC5800407530 /* bytereader_unittest.cc */,
 				F95B42310E0E22D100DBDE83 /* line_state_machine.h */,
 				B88FAE1711665FE400407530 /* dwarf2diehandler.cc */,
@@ -1080,31 +1086,33 @@
 				B89E0E9A11665A7200DD08C9 /* macho_reader.cc in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		B8C5B50E1166531A00D34F4E /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				4262382821AC49A000E5A3A6 /* dwarf_range_list_handler.h in Sources */,
 				162F64FA161C591500CD68D5 /* arch_utilities.cc in Sources */,
 				B88FAE2C1166606200407530 /* macho_reader.cc in Sources */,
 				8BCAAA4C1CE3A7980046090B /* elf_reader.cc in Sources */,
 				B8C5B5171166534700D34F4E /* dwarf2reader.cc in Sources */,
 				EB06C7531FEBC516000214D9 /* path_helper.cc in Sources */,
 				B8C5B5181166534700D34F4E /* bytereader.cc in Sources */,
 				B8C5B5191166534700D34F4E /* macho_utilities.cc in Sources */,
 				B8C5B51A1166534700D34F4E /* file_id.cc in Sources */,
 				B8C5B51B1166534700D34F4E /* macho_id.cc in Sources */,
 				B8C5B51C1166534700D34F4E /* macho_walker.cc in Sources */,
 				B8C5B51D1166534700D34F4E /* dump_syms.cc in Sources */,
 				B8C5B51E1166534700D34F4E /* dump_syms_tool.cc in Sources */,
 				B88FAE1911665FE400407530 /* dwarf2diehandler.cc in Sources */,
 				B88FAE261166603300407530 /* dwarf_cu_to_module.cc in Sources */,
 				B88FAE271166603300407530 /* dwarf_line_to_module.cc in Sources */,
+				4262382721AC496F00E5A3A6 /* dwarf_range_list_handler.cc in Sources */,
 				B88FAE281166603300407530 /* language.cc in Sources */,
 				B88FAE291166603300407530 /* module.cc in Sources */,
 				B88FAE351166673E00407530 /* dwarf_cfi_to_module.cc in Sources */,
 				B88FAE3B11666C6F00407530 /* stabs_reader.cc in Sources */,
 				B88FAE3E11666C8900407530 /* stabs_to_module.cc in Sources */,
 				4D72CAF513DFBAC2006CABE3 /* md5.cc in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -1238,28 +1246,30 @@
 		};
 /* End PBXTargetDependency section */
 
 /* Begin XCBuildConfiguration section */
 		1DEB927908733DD40010E9CD /* Debug */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 8B3102D411F0D60300FCF3E4 /* BreakpadDebug.xcconfig */;
 			buildSettings = {
+				CLANG_CXX_LANGUAGE_STANDARD = "c++0x";
 				HEADER_SEARCH_PATHS = (
 					../../..,
 					../../../common/mac/include/,
 					../../../third_party/musl/include/,
 				);
 			};
 			name = Debug;
 		};
 		1DEB927A08733DD40010E9CD /* Release */ = {
 			isa = XCBuildConfiguration;
 			baseConfigurationReference = 8B3102D511F0D60300FCF3E4 /* BreakpadRelease.xcconfig */;
 			buildSettings = {
+				CLANG_CXX_LANGUAGE_STANDARD = "c++0x";
 				HEADER_SEARCH_PATHS = (
 					../../..,
 					../../../common/mac/include/,
 					../../../third_party/musl/include/,
 				);
 			};
 			name = Release;
 		};
--- a/toolkit/crashreporter/google-breakpad/src/tools/mac/upload_system_symbols/arch_constants.h
+++ b/toolkit/crashreporter/google-breakpad/src/tools/mac/upload_system_symbols/arch_constants.h
@@ -38,20 +38,25 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 #ifndef CPU_TYPE_ARM64
 #define CPU_TYPE_ARM64 (CPU_TYPE_ARM | CPU_ARCH_ABI64)
 #endif
 
 #ifndef CPU_SUBTYPE_ARM64_ALL
 #define CPU_SUBTYPE_ARM64_ALL 0
 #endif
 
+#ifndef CPU_SUBTYPE_ARM64_E
+#define CPU_SUBTYPE_ARM64_E 2
+#endif
+
 const cpu_type_t kCPU_TYPE_ARM = CPU_TYPE_ARM;
 const cpu_type_t kCPU_TYPE_ARM64 = CPU_TYPE_ARM64;
 
 const cpu_subtype_t kCPU_SUBTYPE_ARM64_ALL = CPU_SUBTYPE_ARM64_ALL;
+const cpu_subtype_t kCPU_SUBTYPE_ARM64_E = CPU_SUBTYPE_ARM64_E;
 const cpu_subtype_t kCPU_SUBTYPE_ARM_V7S = CPU_SUBTYPE_ARM_V7S;
 
 const char* GetNXArchInfoName(cpu_type_t cpu_type, cpu_subtype_t cpu_subtype) {
   const NXArchInfo* arch_info = NXGetArchInfoFromCpuType(cpu_type, cpu_subtype);
   if (!arch_info)
     return 0;
   return arch_info->name;
 }
--- a/toolkit/crashreporter/google-breakpad/src/tools/mac/upload_system_symbols/arch_reader.go
+++ b/toolkit/crashreporter/google-breakpad/src/tools/mac/upload_system_symbols/arch_reader.go
@@ -42,16 +42,19 @@ import "C"
 // getArchStringFromHeader takes a MachO FileHeader and returns a string that
 // represents the CPU type and subtype.
 // This function is a Go version of src/common/mac/arch_utilities.cc:BreakpadGetArchInfoFromCpuType().
 func getArchStringFromHeader(header macho.FileHeader) string {
 	// TODO(rsesek): As of 10.9.4, OS X doesn't list these in /usr/include/mach/machine.h.
 	if header.Cpu == C.kCPU_TYPE_ARM64 && header.SubCpu == C.kCPU_SUBTYPE_ARM64_ALL {
 		return "arm64"
 	}
+	if header.Cpu == C.kCPU_TYPE_ARM64 && header.SubCpu == C.kCPU_SUBTYPE_ARM64_E {
+		return "arm64e"
+	}
 	if header.Cpu == C.kCPU_TYPE_ARM && header.SubCpu == C.kCPU_SUBTYPE_ARM_V7S {
 		return "armv7s"
 	}
 
 	cstr := C.GetNXArchInfoName(C.cpu_type_t(header.Cpu), C.cpu_subtype_t(header.SubCpu))
 	if cstr == nil {
 		return ""
 	}
--- a/toolkit/crashreporter/update-breakpad.sh
+++ b/toolkit/crashreporter/update-breakpad.sh
@@ -22,26 +22,27 @@ rev=${2-HEAD}
 # Breakpad uses gclient for externals, so manually export what we need.
 lss_rev=$(cd $breakpad_repo; git show ${rev}:DEPS | python -c "import sys; exec sys.stdin; print deps['src/src/third_party/lss'].split('@')[1]")
 (cd $breakpad_repo/src/third_party/lss; git archive --prefix=toolkit/crashreporter/google-breakpad/src/third_party/lss/ $lss_rev) | (cd $repo; tar xf -)
 
 # remove some extraneous bits
 # We've forked src/client toolkit/crashreporter/breakpad-client.
 rm -rf \
   ${crashreporter_dir}/google-breakpad/appveyor.yml \
+  ${crashreporter_dir}/google-breakpad/autotools/ \
   ${crashreporter_dir}/google-breakpad/docs/ \
-  ${crashreporter_dir}/google-breakpad/autotools/ \
   ${crashreporter_dir}/google-breakpad/m4/ \
   ${crashreporter_dir}/google-breakpad/scripts/ \
   ${crashreporter_dir}/google-breakpad/src/client/ \
+  ${crashreporter_dir}/google-breakpad/src/processor/testdata/ \
+  ${crashreporter_dir}/google-breakpad/src/testing/ \
   ${crashreporter_dir}/google-breakpad/src/third_party/protobuf \
-  ${crashreporter_dir}/google-breakpad/src/testing/ \
   ${crashreporter_dir}/google-breakpad/src/tools/gyp/ \
-  ${crashreporter_dir}/google-breakpad/src/processor/testdata/ \
   ${crashreporter_dir}/google-breakpad/src/tools/windows/dump_syms/testdata/ \
+  ${crashreporter_dir}/google-breakpad/.github/mistaken-pull-closer.yml \
   ${crashreporter_dir}/google-breakpad/.travis.yml
 
 # restore our Makefile.ins
 hg -R ${repo} st -n | grep "Makefile\.in$" | xargs hg revert --no-backup
 # and moz.build files
 hg -R ${repo} st -n | grep "moz\.build$" | xargs hg revert --no-backup
 # and some other makefiles
 hg -R ${repo} st -n | grep "objs\.mozbuild$" | xargs hg revert --no-backup