Merge mozilla-central to autoland. a=merge CLOSED TREE
authorCiure Andrei <aciure@mozilla.com>
Wed, 03 Oct 2018 19:45:50 +0300
changeset 495165 5099db41a664d28a75e0bc2c384a111bf5f2b044
parent 495164 9368d2715723b4f692b67ae088c125cbb26cb2ea (current diff)
parent 495121 3530790e23d18b6f8f73471e367a942f201dd452 (diff)
child 495166 60fed71d173f2c67d8ddf5ead0d87efd889cdb5c
push id9984
push userffxbld-merge
push dateMon, 15 Oct 2018 21:07:35 +0000
treeherdermozilla-beta@183d27ea8570 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone64.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge mozilla-central to autoland. a=merge CLOSED TREE
browser/config/mozconfigs/linux32/opt-dmd
browser/config/mozconfigs/linux64/opt-dmd
browser/config/mozconfigs/macosx64/opt-dmd
browser/config/mozconfigs/win32/opt-dmd
browser/config/mozconfigs/win64/opt-dmd
browser/locales/en-US/chrome/browser/aboutRestartRequired.dtd
dom/webidl/GroupedHistoryEvent.webidl
testing/web-platform/meta/webvr/webvr-disabled-by-feature-policy.https.sub.html.ini
testing/web-platform/meta/webvr/webvr-enabled-by-feature-policy-attribute-redirect-on-load.https.sub.html.ini
testing/web-platform/meta/webvr/webvr-enabled-on-self-origin-by-feature-policy.https.sub.html.ini
toolkit/content/widgets/progressmeter.xml
--- a/accessible/tests/mochitest/value/test_progress.xul
+++ b/accessible/tests/mochitest/value/test_progress.xul
@@ -17,16 +17,17 @@
   <script type="application/javascript">
   <![CDATA[
     function doTest()
     {
       // progressmeter
       testValue("pm1", "50%", 50, 0, 100, 0);
       testValue("pm2", "50%", 500, 0, 1000, 0);
       testValue("pm3", "", 0, 0, 100, 0);
+      testValue("pm4", "", 0, 0, 100, 0);
 
       // aria progressbar
       testValue("ariapb1", "500", 500, 0, 1000, 0);
       testValue("ariapb2", "", 0, 0, 0, 0);
 
       SimpleTest.finish();
     }
 
@@ -45,19 +46,22 @@
       <p id="display"></p>
       <div id="content" style="display: none">
       </div>
       <pre id="test">
       </pre>
     </body>
 
     <!-- progressmeter -->
-    <progressmeter id="pm1" value="50"/>
-    <progressmeter id="pm2" value="500" max="1000"/>
-    <progressmeter id="pm3"/>
+    <vbox>
+      <progressmeter id="pm1" value="50"/>
+      <progressmeter id="pm2" value="500" max="1000"/>
+      <progressmeter id="pm3"/>
+      <progressmeter id="pm4" mode="undetermined"/>
+    </vbox>
 
     <!-- aria -->
     <description id="ariapb1" role="progressbar"
                  aria-valuenow="500" aria-valuemin="0" aria-valuemax="1000"/>
     <description id="ariapb2" role="progressbar"/>
   </hbox>
 
 </window>
--- a/browser/base/content/aboutRestartRequired.xhtml
+++ b/browser/base/content/aboutRestartRequired.xhtml
@@ -1,56 +1,43 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
+<?xml version="1.0" encoding="UTF-8" ?>
 <!-- This Source Code Form is subject to the terms of the Mozilla Public
    - License, v. 2.0. If a copy of the MPL was not distributed with this
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!DOCTYPE html [
-  <!ENTITY % htmlDTD
-    PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "DTD/xhtml1-strict.dtd">
-  %htmlDTD;
-  <!ENTITY % globalDTD
-    SYSTEM "chrome://global/locale/global.dtd">
-  %globalDTD;
-  <!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd" >
-  %brandDTD;
-  <!ENTITY % restartRequiredDTD
-    SYSTEM "chrome://browser/locale/aboutRestartRequired.dtd">
-  %restartRequiredDTD;
-]>
+<!DOCTYPE html>
 
 <html xmlns="http://www.w3.org/1999/xhtml">
   <head>
-    <title>&restartRequired.title;</title>
+    <title data-l10n-id="restart-required-title"></title>
     <link rel="stylesheet" type="text/css" media="all"
           href="chrome://browser/skin/aboutRestartRequired.css"/>
     <!-- If the location of the favicon is changed here, the
          FAVICON_ERRORPAGE_URL symbol in
          toolkit/components/places/src/nsFaviconService.h should be updated. -->
-    <link rel="icon" id="favicon"
+    <link rel="icon" type="image/png" id="favicon"
           href="chrome://global/skin/icons/warning.svg"/>
+    <link rel="localization" href="branding/brand.ftl"/>
+    <link rel="localization" href="browser/aboutRestartRequired.ftl"/>
   </head>
-
-  <body dir="&locale.dir;">
+  <body>
     <!-- PAGE CONTAINER (for styling purposes only) -->
     <div id="errorPageContainer">
       <div id="text-container">
         <div id="title">
-          <h1 id="title-text">&restartRequired.header;</h1>
+          <h1 id="title-text" data-l10n-id="restart-required-header"></h1>
         </div>
         <div id="errorLongContent">
-          <div id="errorLongDesc">&restartRequired.description;</div>
+          <div id="errorLongDesc">
+            <p data-l10n-id="restart-required-intro"></p>
+            <p data-l10n-id="restart-required-description"></p>
+          </div>
         </div>
       </div>
       <!-- Restart Button -->
       <div id="restartButtonContainer" class="button-container">
-        <button id="restart" class="primary" autocomplete="off"
-                onclick="AboutRestartRequired.restart();">
-          &restartButton.label;
-        </button>
+        <button id="restart" data-l10n-id="restart-button-label" class="primary" autocomplete="off"
+                onclick="AboutRestartRequired.restart();"></button>
       </div>
     </div>
   </body>
   <script type="text/javascript"
-           src="chrome://browser/content/aboutRestartRequired.js"/>
+          src="chrome://browser/content/aboutRestartRequired.js"/>
 </html>
--- a/browser/components/downloads/DownloadsViewUI.jsm
+++ b/browser/components/downloads/DownloadsViewUI.jsm
@@ -9,16 +9,17 @@
 
 "use strict";
 
 var EXPORTED_SYMBOLS = [
   "DownloadsViewUI",
 ];
 
 ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
+ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
 
 XPCOMUtils.defineLazyModuleGetters(this, {
   BrowserWindowTracker: "resource:///modules/BrowserWindowTracker.jsm",
   Downloads: "resource://gre/modules/Downloads.jsm",
   DownloadUtils: "resource://gre/modules/DownloadUtils.jsm",
   DownloadsCommon: "resource:///modules/DownloadsCommon.jsm",
   FileUtils: "resource://gre/modules/FileUtils.jsm",
   OS: "resource://gre/modules/osfile.jsm",
@@ -423,18 +424,25 @@ this.DownloadsViewUI.DownloadElementShel
     }
 
     // These attributes are set in all code paths, because they are relevant for
     // downloads that are in progress and for other states where the progress
     // bar is visible.
     if (this.download.hasProgress) {
       this.element.setAttribute("progressmode", "normal");
       this.element.setAttribute("progress", this.download.progress);
+      this.element.removeAttribute("progress-undetermined");
     } else {
-      this.element.setAttribute("progressmode", "undetermined");
+      // Suppress the progress animation on Linux for the Downloads Panel
+      // progress bars when the file size is unknown.
+      this.element.setAttribute("progressmode",
+                                AppConstants.platform == "linux" ? "normal" :
+                                                                   "undetermined");
+      this.element.setAttribute("progress-undetermined", "true");
+      this.element.setAttribute("progress", "100");
     }
 
     if (progressPaused) {
       this.element.setAttribute("progresspaused", "true");
     } else {
       this.element.removeAttribute("progresspaused");
     }
 
--- a/browser/components/downloads/content/download.xml
+++ b/browser/components/downloads/content/download.xml
@@ -38,17 +38,17 @@
                -->
           <xul:description class="downloadTarget"
                            crop="center"
                            xbl:inherits="value=displayName,tooltiptext=displayName"/>
           <xul:progressmeter anonid="progressmeter"
                              class="downloadProgress"
                              min="0"
                              max="100"
-                             xbl:inherits="mode=progressmode,value=progress,paused=progresspaused"/>
+                             xbl:inherits="progress-undetermined,mode=progressmode,value=progress,paused=progresspaused"/>
           <xul:description class="downloadDetails downloadDetailsNormal"
                            crop="end"
                            xbl:inherits="value=status,tooltiptext=status"/>
           <xul:description class="downloadDetails downloadDetailsHover"
                            crop="end"
                            xbl:inherits="value=hoverStatus"/>
           <xul:description class="downloadDetails downloadDetailsButtonHover"
                            crop="end"
--- a/browser/components/sessionstore/SessionStore.jsm
+++ b/browser/components/sessionstore/SessionStore.jsm
@@ -1041,20 +1041,16 @@ var SessionStoreInternal = {
         if (target.namespaceURI == NS_XUL &&
             target.localName == "browser" &&
             target.frameLoader &&
             target.permanentKey) {
           this._lastKnownFrameLoader.set(target.permanentKey, target.frameLoader);
           this.resetEpoch(target);
         }
         break;
-      case "BrowserWillChangeProcess":
-        let promise = TabStateFlusher.flush(target);
-        target.frameLoader.addProcessChangeBlockingPromise(promise);
-        break;
       case "BrowserChangedProcess":
         let newEpoch = 1 + Math.max(this.getCurrentEpoch(target),
                                     this.getCurrentEpoch(aEvent.otherBrowser));
         this.setCurrentEpoch(target, newEpoch);
         target.messageManager.sendAsyncMessage("SessionStore:becomeActiveProcess", {
           epoch: newEpoch,
         });
         break;
@@ -1120,17 +1116,16 @@ var SessionStoreInternal = {
     // notification of tab add/remove/selection/show/hide
     TAB_EVENTS.forEach(function(aEvent) {
       tabbrowser.tabContainer.addEventListener(aEvent, this, true);
     }, this);
 
     // Keep track of a browser's latest frameLoader.
     aWindow.gBrowser.addEventListener("XULFrameLoaderCreated", this);
     aWindow.gBrowser.addEventListener("BrowserChangedProcess", this);
-    aWindow.gBrowser.addEventListener("BrowserWillChangeProcess", this);
   },
 
   /**
    * Initializes a given window.
    *
    * Windows are registered as soon as they are created but we need to wait for
    * the session file to load, and the initial window's delayed startup to
    * finish before initializing a window, i.e. restoring data into it.
@@ -1386,17 +1381,16 @@ var SessionStoreInternal = {
     let browsers = Array.from(tabbrowser.browsers);
 
     TAB_EVENTS.forEach(function(aEvent) {
       tabbrowser.tabContainer.removeEventListener(aEvent, this, true);
     }, this);
 
     aWindow.gBrowser.removeEventListener("XULFrameLoaderCreated", this);
     aWindow.gBrowser.removeEventListener("BrowserChangedProcess", this);
-    aWindow.gBrowser.removeEventListener("BrowserWillChangeProcess", this);
 
     let winData = this._windows[aWindow.__SSi];
 
     // Collect window data only when *not* closed during shutdown.
     if (RunState.isRunning) {
       // Grab the most recent window data. The tab data will be updated
       // once we finish flushing all of the messages from the tabs.
       let tabMap = this._collectWindowData(aWindow);
--- a/browser/components/sessionstore/test/browser.ini
+++ b/browser/components/sessionstore/test/browser.ini
@@ -238,17 +238,17 @@ skip-if = (os == 'win' && bits == 64) ||
 # Disabled for frequent intermittent failures
 [browser_464620_a.js]
 skip-if = true
 [browser_464620_b.js]
 skip-if = true
 
 # Disabled on OS X:
 [browser_625016.js]
-skip-if = os == "mac" || (os == "linux" && debug) # linux, Bug 1348583
+skip-if = (os == "mac") || (os == "linux" && debug) || (os == "linux" && asan && bits == 64) # linux, Bug 1348583 # Bug 1430977
 
 [browser_906076_lazy_tabs.js]
 [browser_911547.js]
 [browser_1284886_suspend_tab.js]
 skip-if = !e10s
 [browser_async_window_flushing.js]
 [browser_focus_after_restore.js]
 [browser_forget_async_closings.js]
--- a/browser/config/mozconfigs/linux32/nightly
+++ b/browser/config/mozconfigs/linux32/nightly
@@ -1,7 +1,8 @@
 . "$topsrcdir/browser/config/mozconfigs/linux32/common-opt"
 
 ac_add_options --enable-verify-mar
+ac_add_options --enable-dmd
 
 ac_add_options --with-branding=browser/branding/nightly
 
 . "$topsrcdir/build/mozconfig.common.override"
deleted file mode 100644
--- a/browser/config/mozconfigs/linux32/opt-dmd
+++ /dev/null
@@ -1,3 +0,0 @@
-ac_add_options --enable-dmd
-
-. "$topsrcdir/browser/config/mozconfigs/linux32/nightly"
--- a/browser/config/mozconfigs/linux32/valgrind
+++ b/browser/config/mozconfigs/linux32/valgrind
@@ -1,10 +1,11 @@
 . $topsrcdir/browser/config/mozconfigs/linux32/nightly
 
 ac_add_options --enable-valgrind
+ac_add_options --disable-dmd
 ac_add_options --disable-jemalloc
 ac_add_options --disable-install-strip
 ac_add_options --disable-gtest-in-build
 
 # Include the override mozconfig again (even though the above includes it)
 # since it's supposed to override everything.
 . "$topsrcdir/build/mozconfig.common.override"
--- a/browser/config/mozconfigs/linux64/nightly
+++ b/browser/config/mozconfigs/linux64/nightly
@@ -1,7 +1,8 @@
 . "$topsrcdir/browser/config/mozconfigs/linux64/common-opt"
 
 ac_add_options --enable-verify-mar
+ac_add_options --enable-dmd
 
 ac_add_options --with-branding=browser/branding/nightly
 
 . "$topsrcdir/build/mozconfig.common.override"
deleted file mode 100644
--- a/browser/config/mozconfigs/linux64/opt-dmd
+++ /dev/null
@@ -1,3 +0,0 @@
-ac_add_options --enable-dmd
-
-. "$topsrcdir/browser/config/mozconfigs/linux64/nightly"
--- a/browser/config/mozconfigs/linux64/valgrind
+++ b/browser/config/mozconfigs/linux64/valgrind
@@ -1,10 +1,11 @@
 . $topsrcdir/browser/config/mozconfigs/linux64/nightly
 
 ac_add_options --enable-valgrind
+ac_add_options --disable-dmd
 ac_add_options --disable-jemalloc
 ac_add_options --disable-install-strip
 ac_add_options --disable-gtest-in-build
 
 # Include the override mozconfig again (even though the above includes it)
 # since it's supposed to override everything.
 . "$topsrcdir/build/mozconfig.common.override"
--- a/browser/config/mozconfigs/macosx64/nightly
+++ b/browser/config/mozconfigs/macosx64/nightly
@@ -1,13 +1,14 @@
 . "$topsrcdir/browser/config/mozconfigs/macosx64/common-opt"
 
 ac_add_options --disable-install-strip
 ac_add_options --enable-verify-mar
 ac_add_options --enable-instruments
+ac_add_options --enable-dmd
 
 # Cross-compiled builds fail when dtrace is enabled
 if test `uname -s` != Linux; then
   ac_add_options --enable-dtrace
 fi
 
 ac_add_options --enable-lto
 
deleted file mode 100644
--- a/browser/config/mozconfigs/macosx64/opt-dmd
+++ /dev/null
@@ -1,5 +0,0 @@
-ac_add_options --enable-dmd
-
-. "$topsrcdir/browser/config/mozconfigs/macosx64/nightly"
-
-ac_add_options --disable-lto
--- a/browser/config/mozconfigs/whitelist
+++ b/browser/config/mozconfigs/whitelist
@@ -4,16 +4,17 @@ whitelist = {
     'release': {},
     'nightly': {},
     }
 
 all_platforms = ['win64', 'win32', 'linux32', 'linux64', 'macosx64']
 
 for platform in all_platforms:
     whitelist['nightly'][platform] = [
+        'ac_add_options --enable-dmd',
         'ac_add_options --with-branding=browser/branding/nightly',
     ]
 
 whitelist['nightly']['macosx64'] += [
     'ac_add_options --disable-install-strip',
     'ac_add_options --enable-instruments',
     'ac_add_options --enable-dtrace',
     'if test `uname -s` != Linux; then',
--- a/browser/config/mozconfigs/win32/nightly
+++ b/browser/config/mozconfigs/win32/nightly
@@ -1,8 +1,9 @@
 . "$topsrcdir/build/mozconfig.win-common"
 . "$topsrcdir/browser/config/mozconfigs/win32/common-opt"
 
 ac_add_options --enable-verify-mar
+ac_add_options --enable-dmd
 
 ac_add_options --with-branding=browser/branding/nightly
 
 . "$topsrcdir/build/mozconfig.common.override"
deleted file mode 100644
--- a/browser/config/mozconfigs/win32/opt-dmd
+++ /dev/null
@@ -1,3 +0,0 @@
-ac_add_options --enable-dmd
-
-. "$topsrcdir/browser/config/mozconfigs/win32/nightly"
--- a/browser/config/mozconfigs/win64/nightly
+++ b/browser/config/mozconfigs/win64/nightly
@@ -1,9 +1,10 @@
 . "$topsrcdir/build/mozconfig.win-common"
 . "$topsrcdir/browser/config/mozconfigs/win64/common-win64"
 . "$topsrcdir/browser/config/mozconfigs/win64/common-opt"
 
 ac_add_options --enable-verify-mar
+ac_add_options --enable-dmd
 
 ac_add_options --with-branding=browser/branding/nightly
 
 . "$topsrcdir/build/mozconfig.common.override"
deleted file mode 100644
--- a/browser/config/mozconfigs/win64/opt-dmd
+++ /dev/null
@@ -1,3 +0,0 @@
-ac_add_options --enable-dmd
-
-. "$topsrcdir/browser/config/mozconfigs/win64/nightly"
new file mode 100644
--- /dev/null
+++ b/browser/locales/en-US/browser/aboutRestartRequired.ftl
@@ -0,0 +1,11 @@
+# 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/.
+
+restart-required-title = Restart Required
+restart-required-header = Sorry. We just need to do one small thing to keep going.
+restart-required-intro = We have just installed an update in the background. Click Restart { -brand-short-name } to finish
+    applying it.
+restart-required-description = We will restore all your pages, windows and tabs afterwards, so you can be on your way quickly.
+
+restart-button-label = Restart { -brand-short-name }
deleted file mode 100644
--- a/browser/locales/en-US/chrome/browser/aboutRestartRequired.dtd
+++ /dev/null
@@ -1,13 +0,0 @@
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!ENTITY restartRequired.title "Restart Required">
-
-<!ENTITY restartRequired.header "Sorry. We just need to do one small thing to keep going.">
-<!ENTITY restartRequired.description "
-<p>We have just installed an update in the background. Click Restart &brandShortName; to finish applying it.</p>
-<p>We will restore all your pages, windows and tabs afterwards, so you can be on your way quickly.</p>
-">
-
-<!ENTITY restartButton.label "Restart &brandShortName;">
--- a/browser/locales/jar.mn
+++ b/browser/locales/jar.mn
@@ -13,17 +13,16 @@
 @AB_CD@.jar:
 % locale browser @AB_CD@ %locale/browser/
 # bookmarks.html is produced by LOCALIZED_GENERATED_FILES.
     locale/browser/bookmarks.html                  (bookmarks.html)
     locale/browser/aboutDialog.dtd                 (%chrome/browser/aboutDialog.dtd)
     locale/browser/aboutPrivateBrowsing.dtd        (%chrome/browser/aboutPrivateBrowsing.dtd)
     locale/browser/aboutRobots.dtd                 (%chrome/browser/aboutRobots.dtd)
     locale/browser/accounts.properties             (%chrome/browser/accounts.properties)
-    locale/browser/aboutRestartRequired.dtd        (%chrome/browser/aboutRestartRequired.dtd)
     locale/browser/aboutSearchReset.dtd            (%chrome/browser/aboutSearchReset.dtd)
     locale/browser/aboutSessionRestore.dtd         (%chrome/browser/aboutSessionRestore.dtd)
     locale/browser/aboutTabCrashed.dtd             (%chrome/browser/aboutTabCrashed.dtd)
     locale/browser/browser.dtd                     (%chrome/browser/browser.dtd)
     locale/browser/baseMenuOverlay.dtd             (%chrome/browser/baseMenuOverlay.dtd)
     locale/browser/browser.properties              (%chrome/browser/browser.properties)
     locale/browser/customizableui/customizableWidgets.properties (%chrome/browser/customizableui/customizableWidgets.properties)
     locale/browser/lightweightThemes.properties    (%chrome/browser/lightweightThemes.properties)
--- a/browser/themes/osx/places/sidebar.css
+++ b/browser/themes/osx/places/sidebar.css
@@ -21,17 +21,17 @@
   min-height: 32px;
 }
 
 .sidebar-placesTreechildren::-moz-tree-separator {
   border-top: 1px solid #505d6d;
   margin: 0 10px;
 }
 
-.sidebar-panel:not([lwt-sidebar]) .sidebar-placesTreechildren::-moz-tree-row(selected) {
+.sidebar-panel:not([lwt-sidebar]) .sidebar-placesTreechildren::-moz-tree-row(selected,blur) {
   -moz-appearance: -moz-mac-source-list-selection;
   -moz-font-smoothing-background-color: -moz-mac-source-list-selection;
 }
 
 .sidebar-panel:not([lwt-sidebar-highlight]) .sidebar-placesTreechildren::-moz-tree-row(selected,focus) {
   -moz-appearance: -moz-mac-active-source-list-selection;
   -moz-font-smoothing-background-color: -moz-mac-active-source-list-selection;
 }
--- a/browser/themes/osx/syncedtabs/sidebar.css
+++ b/browser/themes/osx/syncedtabs/sidebar.css
@@ -13,17 +13,17 @@ body:not([lwt-sidebar]) .content-contain
 
 .item-title-container {
   box-sizing: border-box;
   align-items: center;
   height: 24px;
   font-size: 12px;
 }
 
-body:not([lwt-sidebar]) .item.selected > .item-title-container {
+body:not([lwt-sidebar]) .item.selected:not(:focus) > .item-title-container {
   -moz-appearance: -moz-mac-source-list-selection;
   -moz-font-smoothing-background-color: -moz-mac-source-list-selection;
 }
 
 body:not([lwt-sidebar-highlight]) .item.selected:focus > .item-title-container {
   -moz-appearance: -moz-mac-active-source-list-selection;
   -moz-font-smoothing-background-color: -moz-mac-active-source-list-selection;
 }
--- a/browser/themes/shared/downloads/progressmeter.inc.css
+++ b/browser/themes/shared/downloads/progressmeter.inc.css
@@ -8,33 +8,28 @@
   /* for overriding rules in progressmeter.css */
   -moz-appearance: none;
   border-style: none;
   background-color: transparent;
   min-width: initial;
   min-height: initial;
 }
 
-.downloadProgress[mode="undetermined"] {
-  /* for overriding rules on global.css in Linux. */
-  -moz-binding: url("chrome://global/content/bindings/progressmeter.xml#progressmeter");
-}
-
 .downloadProgress > .progress-bar {
   background-color: Highlight;
 
   /* for overriding rules in progressmeter.css */
   -moz-appearance: none;
 }
 
 .downloadProgress[paused="true"] > .progress-bar {
   background-color: GrayText;
 }
 
-.downloadProgress[mode="undetermined"] > .progress-bar {
+.downloadProgress[progress-undetermined] > .progress-bar {
   /* Make a white reflecting animation.
      Create a gradient with 2 identical pattern, and enlarge the size to 200%.
      This allows us to animate background-position with percentage. */
   background-image: linear-gradient(90deg, transparent 0%,
                                            rgba(255,255,255,0.5) 25%,
                                            transparent 50%,
                                            rgba(255,255,255,0.5) 75%,
                                            transparent 100%);
@@ -51,17 +46,17 @@
   border-inline-end-width: 1px;
   background-color: ButtonFace;
 }
 
 .downloadProgress[value="0"] > .progress-remainder {
   border-width: 1px;
 }
 
-.downloadProgress > .progress-remainder[mode="undetermined"] {
+.downloadProgress[progress-undetermined] > .progress-remainder {
   border: none;
 }
 
 @keyframes downloadProgressSlideX {
   0% {
     background-position: 0 0;
   }
   100% {
--- a/devtools/client/framework/components/MeatballMenu.js
+++ b/devtools/client/framework/components/MeatballMenu.js
@@ -1,26 +1,26 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 "use strict";
 
-const { PureComponent } = require("devtools/client/shared/vendor/react");
+const { PureComponent, createFactory } = require("devtools/client/shared/vendor/react");
 const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
-const { createFactory } = require("devtools/client/shared/vendor/react");
 const MenuItem = createFactory(
   require("devtools/client/shared/components/menu/MenuItem")
 );
 const MenuList = createFactory(
   require("devtools/client/shared/components/menu/MenuList")
 );
 const dom = require("devtools/client/shared/vendor/react-dom-factories");
 const { hr } = dom;
-const { openDocLink } = require("devtools/client/shared/link");
-const { assert } = require("devtools/shared/DevToolsUtils");
+
+loader.lazyRequireGetter(this, "openDocLink", "devtools/client/shared/link", true);
+loader.lazyRequireGetter(this, "assert", "devtools/shared/DevToolsUtils", true);
 
 const openDevToolsDocsLink = () => {
   openDocLink(
     "https://developer.mozilla.org/docs/Tools?utm_source=devtools&utm_medium=tabbar-menu"
   );
 };
 
 const openCommunityLink = () => {
--- a/dom/base/Navigator.cpp
+++ b/dom/base/Navigator.cpp
@@ -1269,21 +1269,27 @@ Navigator::RequestGamepadServiceTest()
     mGamepadServiceTest = GamepadServiceTest::CreateTestService(mWindow);
   }
   return mGamepadServiceTest;
 }
 
 already_AddRefed<Promise>
 Navigator::GetVRDisplays(ErrorResult& aRv)
 {
-  if (!mWindow || !mWindow->GetDocShell()) {
+  if (!mWindow || !mWindow->GetDocShell() || !mWindow->GetExtantDoc()) {
     aRv.Throw(NS_ERROR_UNEXPECTED);
     return nullptr;
   }
 
+  if (!FeaturePolicyUtils::IsFeatureAllowed(mWindow->GetExtantDoc(),
+                                            NS_LITERAL_STRING("vr"))) {
+    aRv.Throw(NS_ERROR_DOM_SECURITY_ERR);
+    return nullptr;
+  }
+
   nsGlobalWindowInner* win = nsGlobalWindowInner::Cast(mWindow);
   win->NotifyVREventListenerAdded();
 
   RefPtr<Promise> p = Promise::Create(mWindow->AsGlobal(), aRv);
   if (aRv.Failed()) {
     return nullptr;
   }
 
--- a/dom/base/nsFrameLoader.cpp
+++ b/dom/base/nsFrameLoader.cpp
@@ -90,17 +90,16 @@
 #include "nsSandboxFlags.h"
 #include "mozilla/layers/CompositorBridgeChild.h"
 #include "mozilla/dom/CustomEvent.h"
 
 #include "mozilla/dom/ipc/StructuredCloneData.h"
 #include "mozilla/WebBrowserPersistLocalDocument.h"
 #include "mozilla/dom/Promise.h"
 #include "mozilla/dom/PromiseNativeHandler.h"
-#include "mozilla/dom/GroupedHistoryEvent.h"
 #include "mozilla/dom/ParentSHistory.h"
 #include "mozilla/dom/ChildSHistory.h"
 
 #include "mozilla/dom/HTMLBodyElement.h"
 
 #include "mozilla/ContentPrincipal.h"
 
 #ifdef XP_WIN
@@ -161,17 +160,16 @@ NS_INTERFACE_MAP_END
 nsFrameLoader::nsFrameLoader(Element* aOwner, nsPIDOMWindowOuter* aOpener,
                              bool aNetworkCreated, int32_t aJSPluginID)
   : mOwnerContent(aOwner)
   , mDetachedSubdocFrame(nullptr)
   , mOpener(aOpener)
   , mRemoteBrowser(nullptr)
   , mChildID(0)
   , mJSPluginID(aJSPluginID)
-  , mBrowserChangingProcessBlockers(nullptr)
   , mDepthTooGreat(false)
   , mIsTopLevelContent(false)
   , mDestroyCalled(false)
   , mNeedsAsyncDestroy(false)
   , mInSwap(false)
   , mInShow(false)
   , mHideCalled(false)
   , mNetworkCreated(aNetworkCreated)
@@ -338,95 +336,16 @@ nsFrameLoader::LoadURI(nsIURI* aURI, nsI
   rv = doc->InitializeFrameLoader(this);
   if (NS_FAILED(rv)) {
     mURIToLoad = nullptr;
     mTriggeringPrincipal = nullptr;
   }
   return rv;
 }
 
-bool
-nsFrameLoader::SwapBrowsersAndNotify(nsFrameLoader* aOther)
-{
-  // Cache the owner content before calling SwapBrowsers, which will change
-  // these member variables.
-  RefPtr<mozilla::dom::Element> primaryContent = mOwnerContent;
-  RefPtr<mozilla::dom::Element> secondaryContent = aOther->mOwnerContent;
-
-  // Swap loaders through our owner, so the owner's listeners will be correctly
-  // setup.
-  nsCOMPtr<nsIBrowser> ourBrowser = do_QueryInterface(primaryContent);
-  nsCOMPtr<nsIBrowser> otherBrowser = do_QueryInterface(secondaryContent);
-  if (NS_WARN_IF(!ourBrowser || !otherBrowser)) {
-    return false;
-  }
-  nsresult rv = ourBrowser->SwapBrowsers(otherBrowser, nsIBrowser::SWAP_KEEP_PERMANENT_KEY);
-  if (NS_WARN_IF(NS_FAILED(rv))) {
-    return false;
-  }
-
-  // Dispatch the BrowserChangedProcess event to tell JS that the process swap
-  // has occurred.
-  GroupedHistoryEventInit eventInit;
-  eventInit.mBubbles = true;
-  eventInit.mCancelable= false;
-  eventInit.mOtherBrowser = secondaryContent;
-  RefPtr<GroupedHistoryEvent> event =
-    GroupedHistoryEvent::Constructor(primaryContent,
-                                     NS_LITERAL_STRING("BrowserChangedProcess"),
-                                     eventInit);
-  event->SetTrusted(true);
-  primaryContent->DispatchEvent(*event);
-
-  return true;
-}
-
-already_AddRefed<Promise>
-nsFrameLoader::FireWillChangeProcessEvent()
-{
-  AutoJSAPI jsapi;
-  if (NS_WARN_IF(!jsapi.Init(mOwnerContent->GetOwnerGlobal()))) {
-    return nullptr;
-  }
-  JSContext* cx = jsapi.cx();
-
-  // Set our mBrowserChangingProcessBlockers property to refer to the blockers
-  // list. We will synchronously dispatch a DOM event to collect this list of
-  // blockers.
-  nsTArray<RefPtr<Promise>> blockers;
-  mBrowserChangingProcessBlockers = &blockers;
-
-  GroupedHistoryEventInit eventInit;
-  eventInit.mBubbles = true;
-  eventInit.mCancelable = false;
-  eventInit.mOtherBrowser = nullptr;
-  RefPtr<GroupedHistoryEvent> event =
-    GroupedHistoryEvent::Constructor(mOwnerContent,
-                                     NS_LITERAL_STRING("BrowserWillChangeProcess"),
-                                     eventInit);
-  event->SetTrusted(true);
-  mOwnerContent->DispatchEvent(*event);
-
-  mBrowserChangingProcessBlockers = nullptr;
-
-  ErrorResult rv;
-  RefPtr<Promise> allPromise = Promise::All(cx, blockers, rv);
-  return allPromise.forget();
-}
-
-void
-nsFrameLoader::AddProcessChangeBlockingPromise(Promise& aPromise, ErrorResult& aRv)
-{
-  if (NS_WARN_IF(!mBrowserChangingProcessBlockers)) {
-    aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
-  } else {
-    mBrowserChangingProcessBlockers->AppendElement(&aPromise);
-  }
-}
-
 nsresult
 nsFrameLoader::ReallyStartLoading()
 {
   nsresult rv = ReallyStartLoadingInternal();
   if (NS_FAILED(rv)) {
     FireErrorEvent();
   }
 
@@ -3120,32 +3039,16 @@ nsFrameLoader::RequestNotifyAfterRemoteP
 {
   // If remote browsing (e10s), handle this with the TabParent.
   if (mRemoteBrowser) {
     Unused << mRemoteBrowser->SendRequestNotifyAfterRemotePaint();
   }
 }
 
 void
-nsFrameLoader::RequestFrameLoaderClose(ErrorResult& aRv)
-{
-  nsCOMPtr<nsIBrowser> browser = do_QueryInterface(mOwnerContent);
-  if (NS_WARN_IF(!browser)) {
-    // OwnerElement other than nsIBrowser is not supported yet.
-    aRv.Throw(NS_ERROR_NOT_IMPLEMENTED);
-    return;
-  }
-
-  nsresult rv = browser->CloseBrowser();
-  if (NS_FAILED(rv)) {
-    aRv.Throw(rv);
-  }
-}
-
-void
 nsFrameLoader::RequestUpdatePosition(ErrorResult& aRv)
 {
   if (auto* tabParent = TabParent::GetFrom(GetRemoteBrowser())) {
     nsresult rv = tabParent->UpdatePosition();
 
     if (NS_FAILED(rv)) {
       aRv.Throw(rv);
     }
--- a/dom/base/nsFrameLoader.h
+++ b/dom/base/nsFrameLoader.h
@@ -134,18 +134,16 @@ public:
    * @param aURI The URI to load.
    * @param aTriggeringPrincipal The triggering principal for the load. May be
    *        null, in which case the node principal of the owner content will be
    *        used.
    */
   nsresult LoadURI(nsIURI* aURI, nsIPrincipal* aTriggeringPrincipal,
                    bool aOriginalSrc);
 
-  void AddProcessChangeBlockingPromise(mozilla::dom::Promise& aPromise, mozilla::ErrorResult& aRv);
-
   /**
    * Destroy the frame loader and everything inside it. This will
    * clear the weak owner content reference.
    */
   void Destroy();
 
   void ActivateRemoteFrame(mozilla::ErrorResult& aRv);
 
@@ -161,18 +159,16 @@ public:
                                   mozilla::ErrorResult& aRv);
 
   void ActivateFrameEvent(const nsAString& aType,
                           bool aCapture,
                           mozilla::ErrorResult& aRv);
 
   void RequestNotifyAfterRemotePaint();
 
-  void RequestFrameLoaderClose(mozilla::ErrorResult& aRv);
-
   void RequestUpdatePosition(mozilla::ErrorResult& aRv);
 
   void Print(uint64_t aOuterWindowID,
              nsIPrintSettings* aPrintSettings,
              nsIWebProgressListener* aProgressListener,
              mozilla::ErrorResult& aRv);
 
   void StartPersistence(uint64_t aOuterWindowID,
@@ -438,24 +434,16 @@ private:
     eTabParentRemoved,
     eTabParentChanged
   };
   void MaybeUpdatePrimaryTabParent(TabParentChange aChange);
 
   nsresult
   PopulateUserContextIdFromAttribute(mozilla::OriginAttributes& aAttr);
 
-  // Swap ourselves with the frameloader aOther, and notify chrome code with
-  // a BrowserChangedProcess event.
-  bool SwapBrowsersAndNotify(nsFrameLoader* aOther);
-
-  // Returns a promise which will be resolved once all of the blockers have
-  // resolved which were added during the BrowserWillChangeProcess event.
-  already_AddRefed<mozilla::dom::Promise> FireWillChangeProcessEvent();
-
   nsCOMPtr<nsIDocShell> mDocShell;
   nsCOMPtr<nsIURI> mURIToLoad;
   nsCOMPtr<nsIPrincipal> mTriggeringPrincipal;
   mozilla::dom::Element* mOwnerContent; // WEAK
 
   // After the frameloader has been removed from the DOM but before all of the
   // messages from the frame have been received, we keep a strong reference to
   // our <browser> element.
@@ -477,20 +465,16 @@ private:
   TabParent* mRemoteBrowser;
   uint64_t mChildID;
 
   int32_t mJSPluginID;
 
   // Holds the last known size of the frame.
   mozilla::ScreenIntSize mLazySize;
 
-  // A stack-maintained reference to an array of promises which are blocking
-  // grouped history navigation
-  nsTArray<RefPtr<mozilla::dom::Promise>>* mBrowserChangingProcessBlockers;
-
   RefPtr<mozilla::dom::ParentSHistory> mParentSHistory;
 
   bool mDepthTooGreat : 1;
   bool mIsTopLevelContent : 1;
   bool mDestroyCalled : 1;
   bool mNeedsAsyncDestroy : 1;
   bool mInSwap : 1;
   bool mInShow : 1;
--- a/dom/security/featurepolicy/FeaturePolicyUtils.cpp
+++ b/dom/security/featurepolicy/FeaturePolicyUtils.cpp
@@ -35,17 +35,16 @@ static FeatureMap sSupportedFeatures[] =
   // TODO: not supported yet!!!
   { "geolocation", FeatureMap::eSelf  },
   // TODO: not supported yet!!!
   { "microphone", FeatureMap::eSelf  },
   { "midi", FeatureMap::eSelf  },
   { "payment", FeatureMap::eSelf  },
   // TODO: not supported yet!!!
   { "speaker", FeatureMap::eSelf  },
-  // TODO: not supported yet!!!
   { "vr", FeatureMap::eSelf  },
 };
 
 /* static */ bool
 FeaturePolicyUtils::IsSupportedFeature(const nsAString& aFeatureName)
 {
   uint32_t numFeatures = (sizeof(sSupportedFeatures) / sizeof(sSupportedFeatures[0]));
   for (uint32_t i = 0; i < numFeatures; ++i) {
--- a/dom/webidl/FrameLoader.webidl
+++ b/dom/webidl/FrameLoader.webidl
@@ -35,24 +35,16 @@ interface FrameLoader {
 
   /**
    * Get the ParentSHistory for the nsFrameLoader. May return null if this
    * frameloader is not for a toplevel frame.
    */
   readonly attribute ParentSHistory? parentSHistory;
 
   /**
-   * Adds a blocking promise for the current cross process navigation.
-   * This method can only be called while the "BrowserWillChangeProcess" event
-   * is being fired.
-   */
-  [Throws]
-  void addProcessChangeBlockingPromise(Promise<any> aPromise);
-
-  /**
    * Find out whether the loader's frame is at too great a depth in
    * the frame tree.  This can be used to decide what operations may
    * or may not be allowed on the loader's docshell.
    */
   [Pure]
   readonly attribute boolean depthTooGreat;
 
   /**
@@ -93,22 +85,16 @@ interface FrameLoader {
   /**
    * Request that the next time a remote layer transaction has been
    * received by the Compositor, a MozAfterRemoteFrame event be sent
    * to the window.
    */
   void requestNotifyAfterRemotePaint();
 
   /**
-   * Close the window through the ownerElement.
-   */
-  [Throws]
-  void requestFrameLoaderClose();
-
-  /**
    * Force a remote browser to recompute its dimension and screen position.
    */
   [Throws]
   void requestUpdatePosition();
 
   /**
    * Print the current document.
    *
@@ -125,23 +111,16 @@ interface FrameLoader {
   /**
    * If false, then the subdocument is not clipped to its CSS viewport, and the
    * subdocument's viewport scrollbar(s) are not rendered.
    * Defaults to true.
    */
   attribute boolean clipSubdocument;
 
   /**
-   * If false, then the subdocument's scroll coordinates will not be clamped
-   * to their scroll boundaries.
-   * Defaults to true.
-   */
-  attribute boolean clampScrollPosition;
-
-  /**
    * The element which owns this frame loader.
    *
    * For example, if this is a frame loader for an <iframe>, this attribute
    * returns the iframe element.
    */
   [Pure]
   readonly attribute Element? ownerElement;
 
deleted file mode 100644
--- a/dom/webidl/GroupedHistoryEvent.webidl
+++ /dev/null
@@ -1,17 +0,0 @@
-/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-[ChromeOnly,
- Constructor(DOMString type, optional GroupedHistoryEventInit eventInitDict)]
-interface GroupedHistoryEvent : Event
-{
-  readonly attribute Element? otherBrowser;
-};
-
-dictionary GroupedHistoryEventInit : EventInit
-{
-  Element? otherBrowser = null;
-};
--- a/dom/webidl/moz.build
+++ b/dom/webidl/moz.build
@@ -128,19 +128,16 @@ with Files("GeometryUtils.webidl"):
     BUG_COMPONENT = ("Core", "Layout")
 
 with Files("GetUserMediaRequest.webidl"):
     BUG_COMPONENT = ("Core", "WebRTC")
 
 with Files("Grid.webidl"):
     BUG_COMPONENT = ("Core", "CSS Parsing and Computation")
 
-with Files("GroupedHistoryEvent.webidl"):
-    BUG_COMPONENT = ("Core", "Document Navigation")
-
 with Files("HTML*"):
     BUG_COMPONENT = ("Core", "DOM: Core & HTML")
 
 with Files("HashChangeEvent.webidl"):
     BUG_COMPONENT = ("Core", "DOM: Events")
 
 with Files("HiddenPluginEvent.webidl"):
     BUG_COMPONENT = ("Core", "Plug-ins")
@@ -1048,17 +1045,16 @@ GENERATED_EVENTS_WEBIDL_FILES = [
     'DeviceLightEvent.webidl',
     'DeviceOrientationEvent.webidl',
     'DeviceProximityEvent.webidl',
     'ErrorEvent.webidl',
     'FontFaceSetLoadEvent.webidl',
     'GamepadAxisMoveEvent.webidl',
     'GamepadButtonEvent.webidl',
     'GamepadEvent.webidl',
-    'GroupedHistoryEvent.webidl',
     'HashChangeEvent.webidl',
     'HiddenPluginEvent.webidl',
     'ImageCaptureErrorEvent.webidl',
     'MediaQueryListEvent.webidl',
     'MediaRecorderErrorEvent.webidl',
     'MediaStreamEvent.webidl',
     'MediaStreamTrackEvent.webidl',
     'MIDIConnectionEvent.webidl',
--- a/js/src/shell/js.cpp
+++ b/js/src/shell/js.cpp
@@ -6681,44 +6681,54 @@ GetSharedObject(JSContext* cx, unsigned 
           case MailboxTag::Empty: {
             break;
           }
           case MailboxTag::SharedArrayBuffer:
           case MailboxTag::WasmMemory: {
             // Flag was set in the sender; ensure it is set in the receiver.
             MOZ_ASSERT(cx->realm()->creationOptions().getSharedMemoryAndAtomicsEnabled());
 
+            // The protocol for creating a SAB requires the refcount to be
+            // incremented prior to the SAB creation.
+
             SharedArrayRawBuffer* buf = mbx->val.sarb.buffer;
             uint32_t length = mbx->val.sarb.length;
             if (!buf->addReference()) {
                 JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_SC_SAB_REFCNT_OFLO);
                 return false;
             }
-            auto dropBuf = MakeScopeExit([buf] { buf->dropReference(); });
+
+            // If the allocation fails we must decrement the refcount before
+            // returning.
 
             Rooted<ArrayBufferObjectMaybeShared*> maybesab(cx, SharedArrayBufferObject::New(cx, buf, length));
             if (!maybesab) {
-                return false;
-            }
+                buf->dropReference();
+                return false;
+            }
+
+            // At this point the SAB was created successfully and it owns the
+            // refcount-increase on the buffer that we performed above.  So even
+            // if we fail to allocate along any path below we must not decrement
+            // the refcount; the garbage collector must be allowed to handle
+            // that via finalization of the orphaned SAB object.
+
             if (mbx->tag == MailboxTag::SharedArrayBuffer) {
                 newObj = maybesab;
             } else {
                 if (!GlobalObject::ensureConstructor(cx, cx->global(), JSProto_WebAssembly)) {
                     return false;
                 }
-
                 RootedObject proto(cx, &cx->global()->getPrototype(JSProto_WasmMemory).toObject());
                 newObj = WasmMemoryObject::create(cx, maybesab, proto);
                 MOZ_ASSERT_IF(newObj, newObj->as<WasmMemoryObject>().isShared());
-            }
-            if (!newObj) {
-                return false;
-            }
-
-            dropBuf.release();
+                if (!newObj) {
+                    return false;
+                }
+            }
 
             break;
           }
           case MailboxTag::WasmModule: {
             // Flag was set in the sender; ensure it is set in the receiver.
             MOZ_ASSERT(cx->realm()->creationOptions().getSharedMemoryAndAtomicsEnabled());
 
             if (!GlobalObject::ensureConstructor(cx, cx->global(), JSProto_WebAssembly)) {
--- a/layout/xul/tree/nsTreeBodyFrame.cpp
+++ b/layout/xul/tree/nsTreeBodyFrame.cpp
@@ -1843,16 +1843,18 @@ void
 nsTreeBodyFrame::PrefillPropertyArray(int32_t aRowIndex, nsTreeColumn* aCol)
 {
   MOZ_ASSERT(!aCol || aCol->GetFrame(), "invalid column passed");
   mScratchArray.Clear();
 
   // focus
   if (mFocused)
     mScratchArray.AppendElement(nsGkAtoms::focus);
+  else
+    mScratchArray.AppendElement(nsGkAtoms::blur);
 
   // sort
   bool sorted = false;
   mView->IsSorted(&sorted);
   if (sorted)
     mScratchArray.AppendElement(nsGkAtoms::sorted);
 
   // drag session
--- a/memory/replace/dmd/dmd.py
+++ b/memory/replace/dmd/dmd.py
@@ -327,25 +327,27 @@ def getDigestFromFile(args, inputFile):
 
     def buildTraceDescription(traceTable, frameTable, traceKey):
         frameKeys = traceTable[traceKey]
         fmt = '    #{:02d}{:}'
 
         if args.filter_stacks_for_testing:
             # When running SmokeDMD.cpp, every stack trace should contain at
             # least one frame that contains 'DMD.cpp', from either |DMD.cpp| or
-            # |SmokeDMD.cpp|. (Or 'dmd.cpp' on Windows.) If we see such a
+            # |SmokeDMD.cpp|. (Or 'dmd.cpp' on Windows.) On builds without
+            # debuginfo we expect just |SmokeDMD|. If we see such a
             # frame, we replace the entire stack trace with a single,
             # predictable frame. There is too much variation in the stack
             # traces across different machines and platforms to do more precise
             # matching, but this level of matching will result in failure if
             # stack fixing fails completely.
             for frameKey in frameKeys:
                 frameDesc = frameTable[frameKey]
-                if 'DMD.cpp' in frameDesc or 'dmd.cpp' in frameDesc:
+                expected = ('DMD.cpp', 'dmd.cpp', 'SmokeDMD')
+                if any(ex in frameDesc for ex in expected):
                     return [fmt.format(1, ': ... DMD.cpp ...')]
 
         # The frame number is always '#00' (see DMD.h for why), so we have to
         # replace that with the correct frame number.
         desc = []
         for n, frameKey in enumerate(traceTable[traceKey], start=1):
             desc.append(fmt.format(n, frameTable[frameKey][3:]))
         return desc
--- a/memory/replace/dmd/test/xpcshell.ini
+++ b/memory/replace/dmd/test/xpcshell.ini
@@ -26,9 +26,9 @@ support-files =
   script-diff-live2.json
   script-diff-live-expected.txt
   script-diff-dark-matter1.json
   script-diff-dark-matter2.json
   script-diff-dark-matter-expected.txt
 
 [test_dmd.js]
 dmd = true
-skip-if = !(os=='linux' || os=='win' || os=='mac')
+skip-if = !(os=='linux' || os=='mac' || (os=='win' && !pgo))
new file mode 100644
--- /dev/null
+++ b/python/l10n/fluent_migrations/bug_1488788_aboutrestartrequired.py
@@ -0,0 +1,25 @@
+# coding=utf8
+
+# Any copyright is dedicated to the Public Domain.
+# http://creativecommons.org/publicdomain/zero/1.0/
+
+from __future__ import absolute_import
+import fluent.syntax.ast as FTL
+from fluent.migrate.helpers import transforms_from
+from fluent.migrate.helpers import TERM_REFERENCE
+from fluent.migrate import REPLACE
+
+def migrate(ctx):
+    """Bug 1488788- Migrate about:restartrequired from DTD to Fluent, part {index}."""
+
+    ctx.add_transforms(
+        "browser/browser/aboutRestartRequired.ftl",
+        "browser/browser/aboutRestartRequired.ftl",
+        transforms_from(
+"""
+restart-required-title = { COPY("browser/chrome/browser/aboutRestartRequired.dtd", "restartRequired.title") }
+
+restart-required-header = { COPY("browser/chrome/browser/aboutRestartRequired.dtd", "restartRequired.header") }
+""")
+        )
+
--- a/taskcluster/ci/build/linux.yml
+++ b/taskcluster/ci/build/linux.yml
@@ -55,50 +55,16 @@ linux64-plain/opt:
     run-on-projects: [trunk]
     toolchains:
         - linux64-binutils
         - linux64-clang
         - linux64-rust
         - linux64-node
         - linux64-cbindgen
 
-linux64-dmd/opt:
-    description: "Linux64 DMD Opt"
-    index:
-        product: firefox
-        job-name: linux64-dmd-opt
-    treeherder:
-        platform: linux64-dmd/opt
-        symbol: Bdmd
-        tier: 2
-    worker-type: aws-provisioner-v1/gecko-{level}-b-linux
-    worker:
-        max-run-time: 3600
-    run:
-        using: mozharness
-        actions: [get-secrets build check-test]
-        config:
-            - builds/releng_base_firefox.py
-            - builds/releng_base_linux_64_builds.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        extra-config:
-            mozconfig_variant: 'opt-dmd'
-        secrets: true
-        tooltool-downloads: public
-        need-xvfb: true
-    run-on-projects: []
-    toolchains:
-        - linux64-binutils
-        - linux64-clang
-        - linux64-rust
-        - linux64-rust-size
-        - linux64-cbindgen
-        - linux64-sccache
-        - linux64-node
-
 linux64/pgo:
     description: "Linux64 PGO"
     index:
         product: firefox
         job-name: linux64-pgo
     attributes:
         enable-full-crashsymbols: true
     treeherder:
--- a/taskcluster/ci/build/macosx.yml
+++ b/taskcluster/ci/build/macosx.yml
@@ -104,54 +104,16 @@ macosx64-asan-fuzzing/opt:
         - linux64-libdmg
         - linux64-llvm-dsymutil
         - linux64-rust-macos
         - linux64-rust-size
         - linux64-cbindgen
         - linux64-sccache
         - linux64-node
 
-macosx64-dmd/opt:
-    description: "MacOS X x64 DMD Cross-compile"
-    index:
-        product: firefox
-        job-name: macosx64-dmd-opt
-    treeherder:
-        platform: osx-10-10-dmd/opt
-        symbol: Bdmd
-        tier: 2
-    worker-type: aws-provisioner-v1/gecko-{level}-b-linux
-    worker:
-        max-run-time: 3600
-        env:
-            TOOLTOOL_MANIFEST: "browser/config/tooltool-manifests/macosx64/cross-releng.manifest"
-    run:
-        using: mozharness
-        actions: [get-secrets build]
-        config:
-            - builds/releng_base_firefox.py
-            - builds/releng_base_mac_64_cross_builds.py
-        script: "mozharness/scripts/fx_desktop_build.py"
-        extra-config:
-            mozconfig_variant: 'opt-dmd'
-        secrets: true
-        tooltool-downloads: internal
-    run-on-projects: []
-    toolchains:
-        - linux64-cctools-port
-        - linux64-clang
-        - linux64-hfsplus
-        - linux64-libdmg
-        - linux64-llvm-dsymutil
-        - linux64-rust-macos
-        - linux64-rust-size
-        - linux64-cbindgen
-        - linux64-sccache
-        - linux64-node
-
 macosx64-devedition-nightly/opt:
     description: "MacOS X Dev Edition x64 Nightly"
     attributes:
         nightly: true
         enable-full-crashsymbols: true
     shipping-phase: build
     shipping-product: devedition
     index:
--- a/taskcluster/ci/build/windows.yml
+++ b/taskcluster/ci/build/windows.yml
@@ -65,50 +65,16 @@ win32/opt:
     toolchains:
         - win64-clang-cl
         - win64-rust
         - win64-rust-size
         - win64-cbindgen
         - win64-sccache
         - win64-node
 
-win32-dmd/opt:
-    description: "Win32 DMD Opt"
-    index:
-        product: firefox
-        job-name: win32-dmd-opt
-    treeherder:
-        platform: windows2012-32-dmd/opt
-        symbol: Bdmd
-        tier: 2
-    worker-type: aws-provisioner-v1/gecko-{level}-b-win2012
-    worker:
-        max-run-time: 7200
-        env:
-            TOOLTOOL_MANIFEST: "browser/config/tooltool-manifests/win32/releng.manifest"
-    run:
-        using: mozharness
-        options: [append-env-variables-from-configs]
-        script: mozharness/scripts/fx_desktop_build.py
-        config:
-            - builds/releng_base_firefox.py
-            - builds/taskcluster_base_windows.py
-            - builds/taskcluster_base_win32.py
-            - builds/taskcluster_sub_win32/opt.py
-        extra-config:
-            mozconfig_variant: 'opt-dmd'
-    run-on-projects: []
-    toolchains:
-        - win64-clang-cl
-        - win64-rust
-        - win64-rust-size
-        - win64-cbindgen
-        - win64-sccache
-        - win64-node
-
 win32/pgo:
     description: "Win32 Opt PGO"
     index:
         product: firefox
         job-name: win32-pgo
     attributes:
         enable-full-crashsymbols: true
     treeherder:
@@ -260,50 +226,16 @@ win64-plain/opt:
             - builds/taskcluster_sub_win64/plain_opt.py
     run-on-projects: [trunk]
     toolchains:
         - win64-clang-cl
         - win64-rust
         - win64-node
         - win64-cbindgen
 
-win64-dmd/opt:
-    description: "Win64 DMD Opt"
-    index:
-        product: firefox
-        job-name: win64-dmd-opt
-    treeherder:
-        platform: windows2012-64-dmd/opt
-        symbol: Bdmd
-        tier: 2
-    worker-type: aws-provisioner-v1/gecko-{level}-b-win2012
-    worker:
-        max-run-time: 7200
-        env:
-            TOOLTOOL_MANIFEST: "browser/config/tooltool-manifests/win64/releng.manifest"
-    run:
-        using: mozharness
-        options: [append-env-variables-from-configs]
-        script: mozharness/scripts/fx_desktop_build.py
-        config:
-            - builds/releng_base_firefox.py
-            - builds/taskcluster_base_windows.py
-            - builds/taskcluster_base_win64.py
-            - builds/taskcluster_sub_win64/opt.py
-        extra-config:
-            mozconfig_variant: 'opt-dmd'
-    run-on-projects: []
-    toolchains:
-        - win64-clang-cl
-        - win64-rust
-        - win64-rust-size
-        - win64-cbindgen
-        - win64-sccache
-        - win64-node
-
 win32-nightly/opt:
     description: "Win32 Nightly"
     index:
         product: firefox
         job-name: win32-opt
         type: nightly
     attributes:
         nightly: true
--- a/taskcluster/taskgraph/target_tasks.py
+++ b/taskcluster/taskgraph/target_tasks.py
@@ -548,26 +548,16 @@ def target_tasks_nightly_desktop(full_ta
         set(target_tasks_nightly_win32(full_task_graph, parameters, graph_config))
         | set(target_tasks_nightly_win64(full_task_graph, parameters, graph_config))
         | set(target_tasks_nightly_macosx(full_task_graph, parameters, graph_config))
         | set(target_tasks_nightly_linux(full_task_graph, parameters, graph_config))
         | set(target_tasks_nightly_asan(full_task_graph, parameters, graph_config))
     )
 
 
-# Opt DMD builds should only run nightly
-@_target_task('nightly_dmd')
-def target_tasks_dmd(full_task_graph, parameters, graph_config):
-    """Target DMD that run nightly on the m-c branch."""
-    def filter(task):
-        platform = task.attributes.get('build_platform', '')
-        return platform.endswith('-dmd')
-    return [l for l, t in full_task_graph.tasks.iteritems() if filter(t)]
-
-
 # Run Searchfox analysis once daily.
 @_target_task('searchfox_index')
 def target_tasks_searchfox(full_task_graph, parameters, graph_config):
     """Select tasks required for indexing Firefox for Searchfox web site each day"""
     # For now we only do Linux and Mac debug builds. Windows builds
     # are currently broken (bug 1418415).
     return ['searchfox-linux64-searchfox/debug',
             'searchfox-macosx64-searchfox/debug']
--- a/testing/mozharness/mozharness/mozilla/building/buildbase.py
+++ b/testing/mozharness/mozharness/mozilla/building/buildbase.py
@@ -389,17 +389,16 @@ class BuildOptionParser(object):
         'android-checkstyle': 'builds/releng_sub_%s_configs/%s_checkstyle.py',
         'android-lint': 'builds/releng_sub_%s_configs/%s_lint.py',
         'android-findbugs': 'builds/releng_sub_%s_configs/%s_findbugs.py',
         'android-geckoview-docs': 'builds/releng_sub_%s_configs/%s_geckoview_docs.py',
         'valgrind': 'builds/releng_sub_%s_configs/%s_valgrind.py',
         'artifact': 'builds/releng_sub_%s_configs/%s_artifact.py',
         'debug-artifact': 'builds/releng_sub_%s_configs/%s_debug_artifact.py',
         'devedition': 'builds/releng_sub_%s_configs/%s_devedition.py',
-        'dmd': 'builds/releng_sub_%s_configs/%s_dmd.py',
         'tup': 'builds/releng_sub_%s_configs/%s_tup.py',
     }
     build_pool_cfg_file = 'builds/build_pool_specifics.py'
     branch_cfg_file = 'builds/branch_specifics.py'
 
     @classmethod
     def _query_pltfrm_and_bits(cls, target_option, options):
         """ determine platform and bits
--- a/testing/web-platform/meta/webvr/__dir__.ini
+++ b/testing/web-platform/meta/webvr/__dir__.ini
@@ -1,1 +1,1 @@
-prefs: [dom.vr.enabled:true]
+prefs: [dom.vr.enabled:true,dom.security.featurePolicy.enabled:true]
deleted file mode 100644
--- a/testing/web-platform/meta/webvr/webvr-disabled-by-feature-policy.https.sub.html.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[webvr-disabled-by-feature-policy.https.sub.html]
-  [Feature-Policy header vr "none" disallows the top-level document.]
-    expected: FAIL
-
-  [Feature-Policy header vr "none" disallows same-origin iframes.]
-    expected: FAIL
-
-  [Feature-Policy header vr "none" disallows cross-origin iframes.]
-    expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/webvr/webvr-enabled-by-feature-policy-attribute-redirect-on-load.https.sub.html.ini
+++ /dev/null
@@ -1,7 +0,0 @@
-[webvr-enabled-by-feature-policy-attribute-redirect-on-load.https.sub.html]
-  [Feature-Policy allow="vr" attribute allows same-origin relocation]
-    expected: FAIL
-
-  [Feature-Policy allow="vr" attribute disallows cross-origin relocation]
-    expected: FAIL
-
--- a/testing/web-platform/meta/webvr/webvr-enabled-by-feature-policy-attribute.https.sub.html.ini
+++ b/testing/web-platform/meta/webvr/webvr-enabled-by-feature-policy-attribute.https.sub.html.ini
@@ -1,7 +1,4 @@
 [webvr-enabled-by-feature-policy-attribute.https.sub.html]
-  [Feature-Policy allow="vr" attribute allows same-origin iframe]
-    expected: FAIL
-
   [Feature-Policy allow="vr" attribute allows cross-origin iframe]
     expected: FAIL
 
deleted file mode 100644
--- a/testing/web-platform/meta/webvr/webvr-enabled-on-self-origin-by-feature-policy.https.sub.html.ini
+++ /dev/null
@@ -1,4 +0,0 @@
-[webvr-enabled-on-self-origin-by-feature-policy.https.sub.html]
-  [Feature-Policy header vr "self" disallows cross-origin iframes.]
-    expected: FAIL
-
--- a/toolkit/components/telemetry/Histograms.json
+++ b/toolkit/components/telemetry/Histograms.json
@@ -527,28 +527,28 @@
     "kind": "linear",
     "high": 500,
     "n_buckets": 100,
     "bug_numbers": [1487271],
     "description": "Number of forget skippables occurred during a minute"
   },
   "FULLSCREEN_TRANSITION_BLACK_MS": {
     "record_in_processes": ["main", "content"],
-    "alert_emails": ["xquan@mozilla.com"],
+    "alert_emails": ["mozilla-telemetry@upsuper.org"],
     "expires_in_version": "never",
     "kind": "exponential",
     "low": 100,
     "high": 5000,
     "n_buckets": 50,
     "bug_numbers": [1271160],
     "description": "The time spent in the fully-black screen in fullscreen transition"
   },
   "FULLSCREEN_CHANGE_MS": {
     "record_in_processes": ["main", "content"],
-    "alert_emails": ["xquan@mozilla.com"],
+    "alert_emails": ["mozilla-telemetry@upsuper.org"],
     "expires_in_version": "never",
     "kind": "exponential",
     "low": 100,
     "high": 5000,
     "n_buckets": 50,
     "bug_numbers": [1271160],
     "description": "The time content uses to enter/exit fullscreen regardless of fullscreen transition timeout"
   },
@@ -14180,17 +14180,17 @@
     "expires_in_version": "67",
     "kind": "exponential",
     "high": 50,
     "n_buckets": 20,
     "description": "Total number of http:// and https:// doc groups per tab group, including docgroups fully in bfcache. Collected at the point when the top level document of the tab group is unloaded."
   },
   "HIDDEN_VIEWPORT_OVERFLOW_TYPE": {
     "record_in_processes": ["main", "content"],
-    "alert_emails": ["xquan@mozilla.com", "botond@mozilla.com"],
+    "alert_emails": ["mozilla-telemetry@upsuper.org", "botond@mozilla.com"],
     "bug_numbers": [1423013, 1423017],
     "expires_in_version": "65",
     "kind": "categorical",
     "releaseChannelCollection": "opt-out",
     "labels": ["NoOverflow", "Desktop", "ButNotMinScaleSize", "MinScaleSize"],
     "description": "How common are different types of out-of-reach viewport overflow?"
   },
   "WR_SCENEBUILD_TIME": {
--- a/toolkit/content/customElements.js
+++ b/toolkit/content/customElements.js
@@ -196,16 +196,17 @@ window.MozXULElement = MozXULElement;
 window.MozBaseControl = MozBaseControl;
 
 // For now, don't load any elements in the extension dummy document.
 // We will want to load <browser> when that's migrated (bug 1441935).
 const isDummyDocument = document.documentURI == "chrome://extensions/content/dummy.xul";
 if (!isDummyDocument) {
   for (let script of [
     "chrome://global/content/elements/general.js",
+    "chrome://global/content/elements/progressmeter.js",
     "chrome://global/content/elements/radio.js",
     "chrome://global/content/elements/textbox.js",
     "chrome://global/content/elements/tabbox.js",
   ]) {
     Services.scriptloader.loadSubScript(script, window);
   }
 
   for (let [tag, script] of [
--- a/toolkit/content/jar.mn
+++ b/toolkit/content/jar.mn
@@ -77,17 +77,16 @@ toolkit.jar:
 *  content/global/bindings/dialog.xml          (widgets/dialog.xml)
    content/global/bindings/general.xml         (widgets/general.xml)
    content/global/bindings/groupbox.xml        (widgets/groupbox.xml)
    content/global/bindings/menu.xml            (widgets/menu.xml)
    content/global/bindings/menulist.xml        (widgets/menulist.xml)
    content/global/bindings/notification.xml    (widgets/notification.xml)
    content/global/bindings/numberbox.xml       (widgets/numberbox.xml)
    content/global/bindings/popup.xml           (widgets/popup.xml)
-   content/global/bindings/progressmeter.xml   (widgets/progressmeter.xml)
    content/global/bindings/radio.xml           (widgets/radio.xml)
    content/global/bindings/richlistbox.xml     (widgets/richlistbox.xml)
    content/global/bindings/scrollbox.xml       (widgets/scrollbox.xml)
    content/global/bindings/spinner.js          (widgets/spinner.js)
 *  content/global/bindings/tabbox.xml          (widgets/tabbox.xml)
    content/global/bindings/text.xml            (widgets/text.xml)
 *  content/global/bindings/textbox.xml         (widgets/textbox.xml)
    content/global/bindings/timekeeper.js       (widgets/timekeeper.js)
@@ -95,16 +94,17 @@ toolkit.jar:
    content/global/bindings/toolbar.xml         (widgets/toolbar.xml)
    content/global/bindings/toolbarbutton.xml   (widgets/toolbarbutton.xml)
    content/global/bindings/tree.xml            (widgets/tree.xml)
    content/global/bindings/videocontrols.xml   (widgets/videocontrols.xml)
 *  content/global/bindings/wizard.xml          (widgets/wizard.xml)
    content/global/elements/findbar.js          (widgets/findbar.js)
    content/global/elements/editor.js          (widgets/editor.js)
    content/global/elements/general.js          (widgets/general.js)
+   content/global/elements/progressmeter.js    (widgets/progressmeter.js)
    content/global/elements/radio.js            (widgets/radio.js)
    content/global/elements/stringbundle.js     (widgets/stringbundle.js)
    content/global/elements/tabbox.js           (widgets/tabbox.js)
    content/global/elements/textbox.js          (widgets/textbox.js)
    content/global/elements/videocontrols.js    (widgets/videocontrols.js)
 #ifdef XP_MACOSX
    content/global/macWindowMenu.js
 #endif
--- a/toolkit/content/tests/widgets/mochitest.ini
+++ b/toolkit/content/tests/widgets/mochitest.ini
@@ -30,17 +30,17 @@ skip-if = toolkit == 'android' # Bug 148
 [test_mousecapture_area.html]
 skip-if = (verify && debug) || toolkit == 'android' # Bug 1483656 (android)
 [test_ua_widget.html]
 skip-if = toolkit == 'android' # Bug 1483656
 [test_videocontrols.html]
 tags = fullscreen
 skip-if = toolkit == 'android' || (verify && debug && (os == 'linux')) #TIMED_OUT
 [test_videocontrols_keyhandler.html]
-skip-if = toolkit == 'android'
+skip-if = (toolkit == 'android') || (os == 'linux') #Bug 1366957
 [test_videocontrols_vtt.html]
 skip-if = toolkit == 'android' # Bug 1483656
 [test_videocontrols_iframe_fullscreen.html]
 skip-if = toolkit == 'android' # Bug 1483656
 [test_videocontrols_size.html]
 skip-if = toolkit == 'android' # Bug 1483656
 [test_videocontrols_audio.html]
 skip-if = toolkit == 'android' # Bug 1483656
rename from toolkit/content/widgets/progressmeter.xml
rename to toolkit/content/widgets/progressmeter.js
--- a/toolkit/content/widgets/progressmeter.xml
+++ b/toolkit/content/widgets/progressmeter.js
@@ -1,112 +1,149 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
+"use strict";
+
+// This is loaded into chrome windows with the subscript loader. Wrap in
+// a block to prevent accidentally leaking globals onto `window`.
+{
 
-<bindings id="progressmeterBindings"
-   xmlns="http://www.mozilla.org/xbl"
-   xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
-   xmlns:xbl="http://www.mozilla.org/xbl">
+/**
+ * XUL progressmeter element.
+ */
+class MozProgressmeter extends MozXULElement {
+  get mode() {
+    return this.getAttribute("mode");
+  }
 
-  <binding id="progressmeter">
-    <content>
-      <xul:spacer class="progress-bar" xbl:inherits="mode"/>
-      <xul:spacer class="progress-remainder" xbl:inherits="mode"/>
-    </content>
+  set mode(val) {
+    if (this.mode != val) {
+      this.setAttribute("mode", val);
+    }
+    return val;
+  }
 
-    <implementation>
-      <property name="mode" onset="if (this.mode != val) this.setAttribute('mode', val); return val;"
-                            onget="return this.getAttribute('mode');"/>
+  get value() {
+    return this.getAttribute("value") || "0";
+  }
 
-      <property name="value" onget="return this.getAttribute('value') || '0';">
-        <setter><![CDATA[
-          var p = Math.round(val);
-          var max = Math.round(this.max);
-          if (p < 0)
-            p = 0;
-          else if (p > max)
-            p = max;
-          var c = this.value;
-          if (p != c) {
-            var delta = p - c;
-            if (delta < 0)
-              delta = -delta;
-            if (delta > 3 || p == 0 || p == max) {
-              this.setAttribute("value", p);
-              // Fire DOM event so that accessible value change events occur
-              var event = document.createEvent("Events");
-              event.initEvent("ValueChange", true, true);
-              this.dispatchEvent(event);
-            }
-          }
+  set value(val) {
+    let p = Math.round(val);
+    let max = Math.round(this.max);
+    if (p < 0) {
+      p = 0;
+    } else if (p > max) {
+      p = max;
+    }
+
+    let c = this.value;
+    if (p != c) {
+      let delta = p - c;
+      if (delta < 0) {
+        delta = -delta;
+      }
+      if (delta > 3 || p == 0 || p == max) {
+        this.setAttribute("value", p);
+        // Fire DOM event so that accessible value change events occur
+        let event = document.createEvent("Events");
+        event.initEvent("ValueChange", true, true);
+        this.dispatchEvent(event);
+      }
+    }
+
+    return val;
+  }
+
+  get max() {
+    return this.getAttribute("max") || "100";
+  }
+
+  set max(val) {
+    this.setAttribute("max", isNaN(val) ? 100 : Math.max(val, 1));
+    this.value = this.value;
+    return val;
+  }
 
-          return val;
-        ]]></setter>
-      </property>
-      <property name="max"
-                onget="return this.getAttribute('max') || '100';"
-                onset="this.setAttribute('max', isNaN(val) ? 100 : Math.max(val, 1));
-                       this.value = this.value;
-                       return val;" />
-    </implementation>
-  </binding>
+  isUndetermined() {
+    return this.getAttribute("mode") == "undetermined";
+  }
+
+  connectedCallback() {
+    this._initUI();
+  }
 
-  <binding id="progressmeter-undetermined"
-           extends="chrome://global/content/bindings/progressmeter.xml#progressmeter">
-    <content>
-      <xul:stack class="progress-remainder" flex="1" anonid="stack" style="overflow: -moz-hidden-unscrollable;">
-        <xul:spacer class="progress-bar" anonid="spacer" top="0" style="margin-right: -1000px;"/>
-      </xul:stack>
-    </content>
+  disconnectedCallback() {
+    this.runAnimation = false;
+  }
+
+  static get observedAttributes() {
+    return [ "mode" ];
+  }
+
+  attributeChangedCallback(name, oldValue, newValue) {
+    if (name === "mode" && oldValue != newValue) {
+      this._initUI();
+    }
+  }
 
-    <implementation>
-      <field name="_alive">true</field>
-      <method name="_init">
-        <body><![CDATA[
-          var stack =
-            document.getAnonymousElementByAttribute(this, "anonid", "stack");
-          var spacer =
-            document.getAnonymousElementByAttribute(this, "anonid", "spacer");
-          var isLTR =
-           document.defaultView.getComputedStyle(this).direction == "ltr";
-          var startTime = performance.now();
-          var self = this;
+  _initUI() {
+    let isUndetermined = this.isUndetermined();
+    let content = isUndetermined ?
+      `
+        <spacer class="progress-bar"/>
+        <spacer class="progress-remainder"/>
+      ` :
+      `
+        <stack class="progress-remainder" flex="1" style="overflow: -moz-hidden-unscrollable;">
+          <spacer class="progress-bar" top="0" style="margin-right: -1000px;"/>
+        </stack>
+      `;
+
+    this._stack = null;
+    this._spacer = null;
+    this._runAnimation = isUndetermined;
+
+    this.textContent = "";
+    this.appendChild(MozXULElement.parseXULToFragment(content));
 
-          function nextStep(t) {
-            try {
-              var width = stack.boxObject.width;
-              if (!width) {
-                // Maybe we've been removed from the document.
-                if (self._alive)
-                  requestAnimationFrame(nextStep);
-                return;
-              }
+    if (!isUndetermined) {
+      return;
+    }
+
+    this._stack = this.querySelector(".progress-remainder");
+    this._spacer = this.querySelector(".progress-bar");
+    this._isLTR = document.defaultView.getComputedStyle(this).direction == "ltr";
+    this._startTime = window.performance.now();
 
-              var elapsedTime = t - startTime;
+    let nextStep = (t) => {
+      if (!this._runAnimation) {
+        return;
+      }
 
-              // Width of chunk is 1/5 (determined by the ratio 2000:400) of the
-              // total width of the progress bar. The left edge of the chunk
-              // starts at -1 and moves all the way to 4. It covers the distance
-              // in 2 seconds.
-              var position = isLTR ? ((elapsedTime % 2000) / 400) - 1 :
+      let width = this._stack.boxObject.width;
+      if (width) {
+        let elapsedTime = t - this._startTime;
+
+        // Width of chunk is 1/5 (determined by the ratio 2000:400) of the
+        // total width of the progress bar. The left edge of the chunk
+        // starts at -1 and moves all the way to 4. It covers the distance
+        // in 2 seconds.
+        let position = this._isLTR ? ((elapsedTime % 2000) / 400) - 1 :
                                      ((elapsedTime % 2000) / -400) + 4;
 
-              width = width >> 2;
-              spacer.height = stack.boxObject.height;
-              spacer.width = width;
-              spacer.left = width * position;
+        width = width >> 2;
+        this._spacer.height = this._stack.boxObject.height;
+        this._spacer.width = width;
+        this._spacer.left = width * position;
+      }
 
-              requestAnimationFrame(nextStep);
-            } catch (e) {
-            }
-          }
-          requestAnimationFrame(nextStep);
-        ]]></body>
-      </method>
+      window.requestAnimationFrame(nextStep);
+    };
 
-      <constructor>this._init();</constructor>
-    </implementation>
-  </binding>
+    window.requestAnimationFrame(nextStep);
+  }
+}
 
-</bindings>
+customElements.define("progressmeter", MozProgressmeter);
+
+}
--- a/toolkit/content/xul.css
+++ b/toolkit/content/xul.css
@@ -583,22 +583,16 @@ tabpanels {
 
 /********** tooltip *********/
 
 tooltip[titletip="true"] {
   /* The width of the tooltip isn't limited on cropped <tree> cells. */
   max-width: none;
 }
 
-/********** progressmeter **********/
-
-progressmeter {
-  -moz-binding: url("chrome://global/content/bindings/progressmeter.xml#progressmeter");
-}
-
 /********** basic rule for anonymous content that needs to pass box properties through
  ********** to an insertion point parent that holds the real kids **************/
 
 .box-inherit {
   -moz-box-orient: inherit;
   -moz-box-pack: inherit;
   -moz-box-align: inherit;
   -moz-box-direction: inherit;
--- a/toolkit/themes/linux/global/global.css
+++ b/toolkit/themes/linux/global/global.css
@@ -13,20 +13,16 @@
 @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
 
 /* ::::: XBL bindings ::::: */
 
 menulist > menupopup {
   -moz-binding: url("chrome://global/content/bindings/popup.xml#popup-scrollbars");
 }
 
-progressmeter[mode="undetermined"] {
-  -moz-binding: url("chrome://global/content/bindings/progressmeter.xml#progressmeter-undetermined");
-}
-
 @media (-moz-menubar-drag) {
   toolbar[type="menubar"]:not([autohide="true"]) {
     -moz-binding: url("chrome://global/content/bindings/toolbar.xml#toolbar-drag");
   }
 }
 
 /* ::::: Variables ::::: */
 :root {
--- a/xpcom/ds/StaticAtoms.py
+++ b/xpcom/ds/StaticAtoms.py
@@ -160,16 +160,17 @@ STATIC_ATOMS = [
     Atom("bgcolor", "bgcolor"),
     Atom("bgsound", "bgsound"),
     Atom("big", "big"),
     Atom("binding", "binding"),
     Atom("bindings", "bindings"),
     Atom("bindToUntrustedContent", "bindToUntrustedContent"),
     Atom("block", "block"),
     Atom("blockquote", "blockquote"),
+    Atom("blur", "blur"),
     Atom("body", "body"),
     Atom("boolean", "boolean"),
     Atom("border", "border"),
     Atom("bordercolor", "bordercolor"),
     Atom("both", "both"),
     Atom("bottom", "bottom"),
     Atom("bottomend", "bottomend"),
     Atom("bottomstart", "bottomstart"),