Merge mozilla-central to autoland. a=merge CLOSED TREE
authorCiure Andrei <aciure@mozilla.com>
Wed, 03 Oct 2018 19:45:50 +0300
changeset 487800 5099db41a664d28a75e0bc2c384a111bf5f2b044
parent 487799 9368d2715723b4f692b67ae088c125cbb26cb2ea (current diff)
parent 487724 3530790e23d18b6f8f73471e367a942f201dd452 (diff)
child 487801 60fed71d173f2c67d8ddf5ead0d87efd889cdb5c
push id246
push userfmarier@mozilla.com
push dateSat, 13 Oct 2018 00:15:40 +0000
reviewersmerge
milestone64.0a1
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"),