Merge mozilla-central to autoland. a=merge CLOSED TREE
authorshindli <shindli@mozilla.com>
Fri, 04 May 2018 11:39:54 +0300
changeset 416900 b874f380be661a3bf1ef6acc8398d34e2a4efada
parent 416899 04d34700272c7d4372a71f8f97a30d13ced2580d (current diff)
parent 416897 8994f35fe5fc89f4e8f4e09579a6962f8a4a3e65 (diff)
child 416901 2fc5c1baf4d339f6b48d2a948eb0fe61a827f3fc
push id33943
push usercsabou@mozilla.com
push dateFri, 04 May 2018 17:19:55 +0000
treeherdermozilla-central@ef1db4e8bf06 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone61.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
devtools/client/inspector/changes/actions/index.js
devtools/client/inspector/changes/actions/moz.build
devtools/client/inspector/changes/changes.js
devtools/client/inspector/changes/components/ChangesApp.js
devtools/client/inspector/changes/components/moz.build
devtools/client/inspector/changes/moz.build
devtools/client/inspector/changes/reducers/changes.js
devtools/client/inspector/changes/reducers/index.js
devtools/client/inspector/changes/reducers/moz.build
devtools/client/inspector/events/actions/index.js
devtools/client/inspector/events/actions/moz.build
devtools/client/inspector/events/components/EventsApp.js
devtools/client/inspector/events/components/moz.build
devtools/client/inspector/events/events.js
devtools/client/inspector/events/moz.build
devtools/client/inspector/events/reducers/events.js
devtools/client/inspector/events/reducers/index.js
devtools/client/inspector/events/reducers/moz.build
testing/marionette/harness/marionette_harness/www/test_carets_columns.html
testing/marionette/harness/marionette_harness/www/test_carets_cursor.html
testing/marionette/harness/marionette_harness/www/test_carets_display_none.html
testing/marionette/harness/marionette_harness/www/test_carets_iframe.html
testing/marionette/harness/marionette_harness/www/test_carets_longtext.html
testing/marionette/harness/marionette_harness/www/test_carets_multipleline.html
testing/marionette/harness/marionette_harness/www/test_carets_multiplerange.html
testing/marionette/harness/marionette_harness/www/test_carets_selection.html
testing/web-platform/meta/fetch/api/redirect/redirect-mode-worker.html.ini
testing/web-platform/meta/fetch/api/redirect/redirect-mode.html.ini
testing/web-platform/meta/service-workers/service-worker/fetch-event-redirect.https.html.ini
--- a/browser/installer/Makefile.in
+++ b/browser/installer/Makefile.in
@@ -143,16 +143,19 @@ DEFINES += -DCLANG_CL
 endif
 
 ifdef LLVM_SYMBOLIZER
 DEFINES += -DLLVM_SYMBOLIZER=$(notdir $(LLVM_SYMBOLIZER))
 endif
 ifdef MOZ_CLANG_RT_ASAN_LIB_PATH
 DEFINES += -DMOZ_CLANG_RT_ASAN_LIB=$(notdir $(MOZ_CLANG_RT_ASAN_LIB_PATH))
 endif
+ifdef WIN_DIA_SDK_BIN_DIR
+DEFINES += -DWIN_DIA_SDK_BIN_DIR=1
+endif
 
 # Builds using the hybrid FasterMake/RecursiveMake backend will
 # fail to produce a langpack. See bug 1255096.
 libs::
 ifeq (,$(filter FasterMake+RecursiveMake,$(BUILD_BACKENDS)))
 	$(MAKE) -C $(DEPTH)/browser/locales langpack
 endif
 
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -583,16 +583,20 @@ bin/libfreebl_32int64_3.so
 @BINPATH@/pingsender@BIN_SUFFIX@
 
 ; Shutdown Terminator
 @RESPATH@/components/nsTerminatorTelemetry.js
 @RESPATH@/components/terminator.manifest
 
 #ifdef LLVM_SYMBOLIZER
 @BINPATH@/@LLVM_SYMBOLIZER@
+; On Windows, llvm-symbolizer depends on the MS DIA library.
+#ifdef WIN_DIA_SDK_BIN_DIR
+@BINPATH@/msdia140.dll
+#endif
 #endif
 
 #ifdef MOZ_CLANG_RT_ASAN_LIB
 @BINPATH@/@MOZ_CLANG_RT_ASAN_LIB@
 #endif
 
 
 ; media
--- a/build/win32/moz.build
+++ b/build/win32/moz.build
@@ -21,8 +21,14 @@ if CONFIG['WIN32_REDIST_DIR'] and CONFIG
             '%%%s/%s' % (CONFIG['WIN32_REDIST_DIR'], CONFIG[f])
         ]
 
 if CONFIG['WIN_UCRT_REDIST_DIR'] and CONFIG['COMPILE_ENVIRONMENT']:
     for f in ['api-ms-win-*.dll', 'ucrtbase.dll']:
         FINAL_TARGET_FILES += [
             '%%%s/%s' % (CONFIG['WIN_UCRT_REDIST_DIR'], f)
         ]
+
+if CONFIG['LLVM_SYMBOLIZER'] and CONFIG['WIN_DIA_SDK_BIN_DIR']:
+    # On Windows, llvm-symbolizer depends on the MS DIA library.
+    FINAL_TARGET_FILES += [
+        '%%%s/msdia140.dll' % CONFIG['WIN_DIA_SDK_BIN_DIR']
+    ]
--- a/build/win32/mozconfig.vs2017
+++ b/build/win32/mozconfig.vs2017
@@ -4,27 +4,29 @@ if [ -z "${VSPATH}" ]; then
 fi
 
 if [ -d "${VSPATH}" ]; then
     VSWINPATH="$(cd ${VSPATH} && pwd -W)"
 
     export WINDOWSSDKDIR="${VSWINPATH}/SDK"
     export WIN32_REDIST_DIR="${VSPATH}/VC/redist/x86/Microsoft.VC141.CRT"
     export WIN_UCRT_REDIST_DIR="${VSPATH}/SDK/Redist/ucrt/DLLs/x86"
+    export WIN_DIA_SDK_BIN_DIR="${VSPATH}/DIA SDK/bin"
 
-    export PATH="${VSPATH}/VC/bin/Hostx86/x86:${VSPATH}/VC/bin/Hostx64/x86:${VSPATH}/VC/bin/Hostx64/x64:${VSPATH}/SDK/bin/10.0.15063.0/x64:${VSPATH}/DIA SDK/bin:${PATH}"
+    export PATH="${VSPATH}/VC/bin/Hostx86/x86:${VSPATH}/VC/bin/Hostx64/x86:${VSPATH}/VC/bin/Hostx64/x64:${VSPATH}/SDK/bin/10.0.15063.0/x64:${WIN_DIA_SDK_BIN_DIR}:${PATH}"
     export PATH="${VSPATH}/VC/redist/x86/Microsoft.VC141.CRT:${VSPATH}/SDK/Redist/ucrt/DLLs/x86:${PATH}"
 
     export INCLUDE="${VSPATH}/VC/include:${VSPATH}/VC/atlmfc/include:${VSPATH}/SDK/Include/10.0.15063.0/ucrt:${VSPATH}/SDK/Include/10.0.15063.0/shared:${VSPATH}/SDK/Include/10.0.15063.0/um:${VSPATH}/SDK/Include/10.0.15063.0/winrt:${VSPATH}/DIA SDK/include"
     export LIB="${VSPATH}/VC/lib/x86:${VSPATH}/VC/atlmfc/lib/x86:${VSPATH}/SDK/Lib/10.0.15063.0/ucrt/x86:${VSPATH}/SDK/Lib/10.0.15063.0/um/x86:${VSPATH}/DIA SDK/lib"
 
     export WIN64_LINK="${VSPATH}/VC/bin/Hostx64/x64/link.exe"
     export WIN64_LIB="${VSPATH}/VC/lib/x64:${VSPATH}/VC/atlmfc/lib/x64:${VSPATH}/SDK/Lib/10.0.15063.0/ucrt/x64:${VSPATH}/SDK/Lib/10.0.15063.0/um/x64:${VSPATH}/DIA SDK/lib/amd64"
 fi
 
 . $topsrcdir/build/mozconfig.vs-common
 
 mk_export_correct_style WINDOWSSDKDIR
 mk_export_correct_style WIN32_REDIST_DIR
 mk_export_correct_style WIN_UCRT_REDIST_DIR
+mk_export_correct_style WIN_DIA_SDK_BIN_DIR
 mk_export_correct_style PATH
 mk_export_correct_style INCLUDE
 mk_export_correct_style LIB
--- a/build/win64/mozconfig.vs2017
+++ b/build/win64/mozconfig.vs2017
@@ -4,23 +4,25 @@ if [ -z "${VSPATH}" ]; then
 fi
 
 if [ -d "${VSPATH}" ]; then
     VSWINPATH="$(cd ${VSPATH} && pwd -W)"
 
     export WINDOWSSDKDIR="${VSWINPATH}/SDK"
     export WIN32_REDIST_DIR=${VSPATH}/VC/redist/x64/Microsoft.VC141.CRT
     export WIN_UCRT_REDIST_DIR="${VSPATH}/SDK/Redist/ucrt/DLLs/x64"
+    export WIN_DIA_SDK_BIN_DIR="${VSPATH}/DIA SDK/bin/amd64"
 
-    export PATH="${VSPATH}/VC/bin/Hostx64/x64:${VSPATH}/SDK/bin/10.0.15063.0/x64:${VSPATH}/VC/redist/x64/Microsoft.VC141.CRT:${VSPATH}/SDK/Redist/ucrt/DLLs/x64:${VSPATH}/DIA SDK/bin/amd64:${PATH}"
+    export PATH="${VSPATH}/VC/bin/Hostx64/x64:${VSPATH}/SDK/bin/10.0.15063.0/x64:${VSPATH}/VC/redist/x64/Microsoft.VC141.CRT:${VSPATH}/SDK/Redist/ucrt/DLLs/x64:${WIN_DIA_SDK_BIN_DIR}:${PATH}"
 
     export INCLUDE="${VSPATH}/VC/include:${VSPATH}/VC/atlmfc/include:${VSPATH}/SDK/Include/10.0.15063.0/ucrt:${VSPATH}/SDK/Include/10.0.15063.0/shared:${VSPATH}/SDK/Include/10.0.15063.0/um:${VSPATH}/SDK/Include/10.0.15063.0/winrt:${VSPATH}/DIA SDK/include"
     export LIB="${VSPATH}/VC/lib/x64:${VSPATH}/VC/atlmfc/lib/x64:${VSPATH}/SDK/Lib/10.0.15063.0/ucrt/x64:${VSPATH}/SDK/Lib/10.0.15063.0/um/x64:${VSPATH}/DIA SDK/lib/amd64"
 fi
 
 . $topsrcdir/build/mozconfig.vs-common
 
 mk_export_correct_style WINDOWSSDKDIR
 mk_export_correct_style WIN32_REDIST_DIR
 mk_export_correct_style WIN_UCRT_REDIST_DIR
+mk_export_correct_style WIN_DIA_SDK_BIN_DIR
 mk_export_correct_style PATH
 mk_export_correct_style INCLUDE
 mk_export_correct_style LIB
deleted file mode 100644
--- a/devtools/client/inspector/changes/actions/index.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-"use strict";
-
-const { createEnum } = require("devtools/client/shared/enum");
-
-createEnum([
-
-  // Update the entire changes state with the new list of changes.
-  "UPDATE_CHANGES",
-
-], module.exports);
deleted file mode 100644
--- a/devtools/client/inspector/changes/actions/moz.build
+++ /dev/null
@@ -1,9 +0,0 @@
-# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
-# vim: set filetype=python:
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-DevToolsModules(
-    'index.js',
-)
deleted file mode 100644
--- a/devtools/client/inspector/changes/changes.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-"use strict";
-
-const { createFactory, createElement } = require("devtools/client/shared/vendor/react");
-const { Provider } = require("devtools/client/shared/vendor/react-redux");
-
-const ChangesApp = createFactory(require("./components/ChangesApp"));
-
-const { LocalizationHelper } = require("devtools/shared/l10n");
-const INSPECTOR_L10N =
-  new LocalizationHelper("devtools/client/locales/inspector.properties");
-
-class ChangesView {
-  constructor(inspector, window) {
-    this.document = window.document;
-    this.inspector = inspector;
-    this.store = inspector.store;
-
-    this.init();
-  }
-
-  init() {
-    if (!this.inspector) {
-      return;
-    }
-
-    let changesApp = ChangesApp({});
-
-    let provider = createElement(Provider, {
-      id: "changesview",
-      key: "changesview",
-      store: this.store,
-      title: INSPECTOR_L10N.getStr("inspector.sidebar.changesViewTitle")
-    }, changesApp);
-
-    // Expose the provider to let inspector.js use it in setupSidebar.
-    this.provider = provider;
-  }
-
-  destroy() {
-    this.document = null;
-    this.inspector = null;
-    this.store = null;
-  }
-}
-
-module.exports = ChangesView;
deleted file mode 100644
--- a/devtools/client/inspector/changes/components/ChangesApp.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-"use strict";
-
-const { PureComponent } = require("devtools/client/shared/vendor/react");
-const dom = require("devtools/client/shared/vendor/react-dom-factories");
-const { connect } = require("devtools/client/shared/vendor/react-redux");
-
-class ChangesApp extends PureComponent {
-  static get propTypes() {
-    return {};
-  }
-
-  render() {
-    return dom.div(
-      {
-        id: "changes-container",
-      }
-    );
-  }
-}
-
-module.exports = connect(state => state)(ChangesApp);
deleted file mode 100644
--- a/devtools/client/inspector/changes/components/moz.build
+++ /dev/null
@@ -1,9 +0,0 @@
-# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
-# vim: set filetype=python:
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-DevToolsModules(
-    'ChangesApp.js',
-)
deleted file mode 100644
--- a/devtools/client/inspector/changes/moz.build
+++ /dev/null
@@ -1,15 +0,0 @@
-# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
-# vim: set filetype=python:
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-DIRS += [
-    'actions',
-    'components',
-    'reducers',
-]
-
-DevToolsModules(
-    'changes.js',
-)
deleted file mode 100644
--- a/devtools/client/inspector/changes/reducers/changes.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-"use strict";
-
-const INITIAL_CHANGES = [];
-
-let reducers = {
-
-};
-
-module.exports = function(changes = INITIAL_CHANGES, action) {
-  let reducer = reducers[action.type];
-  if (!reducer) {
-    return changes;
-  }
-  return reducer(changes, action);
-};
deleted file mode 100644
--- a/devtools/client/inspector/changes/reducers/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-"use strict";
-
-exports.changes = require("./changes");
deleted file mode 100644
--- a/devtools/client/inspector/changes/reducers/moz.build
+++ /dev/null
@@ -1,10 +0,0 @@
-# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
-# vim: set filetype=python:
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-DevToolsModules(
-    'changes.js',
-    'index.js',
-)
deleted file mode 100644
--- a/devtools/client/inspector/events/actions/index.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-"use strict";
-
-const { createEnum } = require("devtools/client/shared/enum");
-
-createEnum([
-
-  // Update the entire events state with the new list of events.
-  "UPDATE_EVENTS",
-
-], module.exports);
deleted file mode 100644
--- a/devtools/client/inspector/events/actions/moz.build
+++ /dev/null
@@ -1,9 +0,0 @@
-# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
-# vim: set filetype=python:
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-DevToolsModules(
-    'index.js',
-)
deleted file mode 100644
--- a/devtools/client/inspector/events/components/EventsApp.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-"use strict";
-
-const { PureComponent } = require("devtools/client/shared/vendor/react");
-const dom = require("devtools/client/shared/vendor/react-dom-factories");
-const { connect } = require("devtools/client/shared/vendor/react-redux");
-
-class EventsApp extends PureComponent {
-  static get propTypes() {
-    return {};
-  }
-
-  render() {
-    return dom.div(
-      {
-        id: "events-container",
-      }
-    );
-  }
-}
-
-module.exports = connect(state => state)(EventsApp);
deleted file mode 100644
--- a/devtools/client/inspector/events/components/moz.build
+++ /dev/null
@@ -1,9 +0,0 @@
-# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
-# vim: set filetype=python:
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-DevToolsModules(
-    'EventsApp.js',
-)
deleted file mode 100644
--- a/devtools/client/inspector/events/events.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-"use strict";
-
-const { createFactory, createElement } = require("devtools/client/shared/vendor/react");
-const { Provider } = require("devtools/client/shared/vendor/react-redux");
-
-const EventsApp = createFactory(require("./components/EventsApp"));
-
-const { LocalizationHelper } = require("devtools/shared/l10n");
-const INSPECTOR_L10N =
-  new LocalizationHelper("devtools/client/locales/inspector.properties");
-
-class EventsView {
-  constructor(inspector, window) {
-    this.document = window.document;
-    this.inspector = inspector;
-    this.store = inspector.store;
-
-    this.init();
-  }
-
-  init() {
-    if (!this.inspector) {
-      return;
-    }
-
-    let eventsApp = EventsApp({});
-
-    let provider = createElement(Provider, {
-      id: "eventsview",
-      key: "eventsview",
-      store: this.store,
-      title: INSPECTOR_L10N.getStr("inspector.sidebar.eventsViewTitle")
-    }, eventsApp);
-
-    // Expose the provider to let inspector.js use it in setupSidebar.
-    this.provider = provider;
-  }
-
-  destroy() {
-    this.document = null;
-    this.inspector = null;
-    this.store = null;
-  }
-}
-
-module.exports = EventsView;
deleted file mode 100644
--- a/devtools/client/inspector/events/moz.build
+++ /dev/null
@@ -1,15 +0,0 @@
-# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
-# vim: set filetype=python:
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-DIRS += [
-    'actions',
-    'components',
-    'reducers',
-]
-
-DevToolsModules(
-    'events.js',
-)
deleted file mode 100644
--- a/devtools/client/inspector/events/reducers/events.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-"use strict";
-
-const INITIAL_EVENTS = [];
-
-let reducers = {
-
-};
-
-module.exports = function(events = INITIAL_EVENTS, action) {
-  let reducer = reducers[action.type];
-  if (!reducer) {
-    return events;
-  }
-  return reducer(events, action);
-};
deleted file mode 100644
--- a/devtools/client/inspector/events/reducers/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-"use strict";
-
-exports.events = require("./events");
deleted file mode 100644
--- a/devtools/client/inspector/events/reducers/moz.build
+++ /dev/null
@@ -1,10 +0,0 @@
-# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
-# vim: set filetype=python:
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-DevToolsModules(
-    'events.js',
-    'index.js',
-)
--- a/devtools/client/inspector/inspector.js
+++ b/devtools/client/inspector/inspector.js
@@ -835,68 +835,16 @@ Inspector.prototype = {
     // Rules, Layout, Computed, etc.
     if (this.show3PaneToggle) {
       this.sidebar.addExistingTab(
         "computedview",
         INSPECTOR_L10N.getStr("inspector.sidebar.computedViewTitle"),
         defaultTab == "computedview");
     }
 
-    if (Services.prefs.getBoolPref("devtools.changesview.enabled")) {
-      // Inject a lazy loaded react tab by exposing a fake React object
-      // with a lazy defined Tab thanks to `panel` being a function
-      let changesId = "changesview";
-      let changesTitle = INSPECTOR_L10N.getStr("inspector.sidebar.changesViewTitle");
-      this.sidebar.addTab(
-        changesId,
-        changesTitle,
-        {
-          props: {
-            id: changesId,
-            title: changesTitle
-          },
-          panel: () => {
-            if (!this.changesview) {
-              const ChangesView =
-                this.browserRequire("devtools/client/inspector/changes/changes");
-              this.changesview = new ChangesView(this, this.panelWin);
-            }
-
-            return this.changesview.provider;
-          }
-        },
-        defaultTab == changesId);
-    }
-
-    if (Services.prefs.getBoolPref("devtools.eventsview.enabled")) {
-      // Inject a lazy loaded react tab by exposing a fake React object
-      // with a lazy defined Tab thanks to `panel` being a function
-      let eventsId = "eventsview";
-      let eventsTitle = INSPECTOR_L10N.getStr("inspector.sidebar.eventsViewTitle");
-      this.sidebar.addTab(
-        eventsId,
-        eventsTitle,
-        {
-          props: {
-            id: eventsId,
-            title: eventsTitle
-          },
-          panel: () => {
-            if (!this.eventview) {
-              const EventsView =
-                this.browserRequire("devtools/client/inspector/events/events");
-              this.eventsview = new EventsView(this, this.panelWin);
-            }
-
-            return this.eventsview.provider;
-          }
-        },
-        defaultTab == eventsId);
-    }
-
     if (this.target.form.animationsActor) {
       const animationTitle =
         INSPECTOR_L10N.getStr("inspector.sidebar.animationInspectorTitle");
 
       if (Services.prefs.getBoolPref("devtools.new-animationinspector.enabled")) {
         const animationId = "newanimationinspector";
 
         this.sidebar.addTab(
--- a/devtools/client/inspector/moz.build
+++ b/devtools/client/inspector/moz.build
@@ -1,20 +1,18 @@
 # 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/.
 
 DIRS += [
     'animation',
     'animation-old',
     'boxmodel',
-    'changes',
     'components',
     'computed',
-    'events',
     'extensions',
     'flexbox',
     'fonts',
     'grids',
     'layout',
     'markup',
     'rules',
     'shared'
--- a/devtools/client/inspector/reducers.js
+++ b/devtools/client/inspector/reducers.js
@@ -4,17 +4,15 @@
 
 "use strict";
 
 // This file exposes the Redux reducers of the box model, grid and grid highlighter
 // settings.
 
 exports.animations = require("devtools/client/inspector/animation/reducers/animations");
 exports.boxModel = require("devtools/client/inspector/boxmodel/reducers/box-model");
-exports.changes = require("devtools/client/inspector/changes/reducers/changes");
-exports.events = require("devtools/client/inspector/events/reducers/events");
 exports.extensionsSidebar = require("devtools/client/inspector/extensions/reducers/sidebar");
 exports.flexbox = require("devtools/client/inspector/flexbox/reducers/flexbox");
 exports.fontOptions = require("devtools/client/inspector/fonts/reducers/font-options");
 exports.fontData = require("devtools/client/inspector/fonts/reducers/fonts");
 exports.fontEditor = require("devtools/client/inspector/fonts/reducers/font-editor");
 exports.grids = require("devtools/client/inspector/grids/reducers/grids");
 exports.highlighterSettings = require("devtools/client/inspector/grids/reducers/highlighter-settings");
--- a/devtools/client/locales/en-US/inspector.properties
+++ b/devtools/client/locales/en-US/inspector.properties
@@ -400,26 +400,16 @@ inspector.sidebar.computedViewTitle=Comp
 # that corresponds to the tool displaying layout information defined in the page.
 inspector.sidebar.layoutViewTitle2=Layout
 
 # LOCALIZATION NOTE (inspector.sidebar.newBadge):
 # This is the text of a promotion badge showed in the inspector sidebar, next to a panel
 # name. Used to promote new/recent panels such as the layout panel.
 inspector.sidebar.newBadge=new!
 
-# LOCALIZATION NOTE (inspector.sidebar.changesViewTitle):
-# This is the title shown in a tab in the side panel of the Inspector panel
-# that corresponds to the tool displaying CSS changes.
-inspector.sidebar.changesViewTitle=Changes
-
-# LOCALIZATION NOTE (inspector.sidebar.eventsViewTitle):
-# This is the title shown in a tab in the side panel of the Inspector panel
-# that corresponds to the tool displaying the list of event listeners used in the page.
-inspector.sidebar.eventsViewTitle=Events
-
 # LOCALIZATION NOTE (inspector.sidebar.animationInspectorTitle):
 # This is the title shown in a tab in the side panel of the Inspector panel
 # that corresponds to the tool displaying animations defined in the page.
 inspector.sidebar.animationInspectorTitle=Animations
 
 # LOCALIZATION NOTE (inspector.eyedropper.label): A string displayed as the tooltip of
 # a button in the inspector which toggles the Eyedropper tool
 inspector.eyedropper.label=Grab a color from the page
--- a/devtools/client/preferences/devtools-client.js
+++ b/devtools/client/preferences/devtools-client.js
@@ -70,20 +70,16 @@ pref("devtools.inspector.imagePreviewToo
 // Enable user agent style inspection in rule-view
 pref("devtools.inspector.showUserAgentStyles", false);
 // Show all native anonymous content (like controls in <video> tags)
 pref("devtools.inspector.showAllAnonymousContent", false);
 // Enable the Flexbox highlighter
 pref("devtools.inspector.flexboxHighlighter.enabled", false);
 // Enable the CSS shapes highlighter
 pref("devtools.inspector.shapesHighlighter.enabled", true);
-// Enable the Changes View
-pref("devtools.changesview.enabled", false);
-// Enable the Events View
-pref("devtools.eventsview.enabled", false);
 // Enable the Flexbox Inspector panel
 pref("devtools.flexboxinspector.enabled", false);
 // Enable the new Animation Inspector in Nightly only
 #if defined(NIGHTLY_BUILD)
 pref("devtools.new-animationinspector.enabled", true);
 #else
 pref("devtools.new-animationinspector.enabled", false);
 #endif
--- a/dom/indexedDB/ActorsParent.cpp
+++ b/dom/indexedDB/ActorsParent.cpp
@@ -6344,17 +6344,16 @@ private:
   const uint32_t mTelemetryId;
   const PersistenceType mPersistenceType;
   const bool mFileHandleDisabled;
   const bool mChromeWriteAccessAllowed;
   bool mClosed;
   bool mInvalidated;
   bool mActorWasAlive;
   bool mActorDestroyed;
-  bool mMetadataCleanedUp;
 #ifdef DEBUG
   bool mAllBlobsUnmapped;
 #endif
 
 public:
   // Created by OpenDatabaseOp.
   Database(Factory* aFactory,
            const PrincipalInfo& aPrincipalInfo,
@@ -7465,17 +7464,16 @@ protected:
   nsCString mSuffix;
   nsCString mGroup;
   nsCString mOrigin;
   nsCString mDatabaseId;
   nsString mDatabaseFilePath;
   State mState;
   bool mEnforcingQuota;
   const bool mDeleting;
-  bool mBlockedDatabaseOpen;
   bool mChromeWriteAccessAllowed;
   bool mFileHandleDisabled;
 
 public:
   void
   NoteDatabaseBlocked(Database* aDatabase);
 
   virtual void
@@ -7484,19 +7482,30 @@ public:
 #ifdef DEBUG
   bool
   HasBlockedDatabases() const
   {
     return !mMaybeBlockedDatabases.IsEmpty();
   }
 #endif
 
+  bool
+  DatabaseFilePathIsKnown() const
+  {
+    AssertIsOnOwningThread();
+
+    return !mDatabaseFilePath.IsEmpty();
+  }
+
   const nsString&
   DatabaseFilePath() const
   {
+    AssertIsOnOwningThread();
+    MOZ_ASSERT(!mDatabaseFilePath.IsEmpty());
+
     return mDatabaseFilePath;
   }
 
 protected:
   FactoryOp(Factory* aFactory,
             already_AddRefed<ContentParent> aContentParent,
             const CommonFactoryRequestParams& aCommonParams,
             bool aDeleting);
@@ -7523,16 +7532,19 @@ protected:
 
   nsresult
   SendToIOThread();
 
   void
   WaitForTransactions();
 
   void
+  CleanupMetadata();
+
+  void
   FinishSendResults();
 
   nsresult
   SendVersionChangeMessages(DatabaseActorInfo* aDatabaseActorInfo,
                             Database* aOpeningDatabase,
                             uint64_t aOldVersion,
                             const NullableVersion& aNewVersion);
 
@@ -13682,16 +13694,21 @@ Factory::AllocPBackgroundIDBFactoryReque
   if (aParams.type() == FactoryRequestParams::TOpenDatabaseRequestParams) {
     actor = new OpenDatabaseOp(this,
                                contentParent.forget(),
                                *commonParams);
   } else {
     actor = new DeleteDatabaseOp(this, contentParent.forget(), *commonParams);
   }
 
+  gFactoryOps->AppendElement(actor);
+
+  // Balanced in CleanupMetadata() which is/must always called by SendResults().
+  IncreaseBusyCount();
+
   // Transfer ownership to IPDL.
   return actor.forget().take();
 }
 
 mozilla::ipc::IPCResult
 Factory::RecvPBackgroundIDBFactoryRequestConstructor(
                                      PBackgroundIDBFactoryRequestParent* aActor,
                                      const FactoryRequestParams& aParams)
@@ -13863,17 +13880,16 @@ Database::Database(Factory* aFactory,
   , mTelemetryId(aTelemetryId)
   , mPersistenceType(aMetadata->mCommonMetadata.persistenceType())
   , mFileHandleDisabled(aFileHandleDisabled)
   , mChromeWriteAccessAllowed(aChromeWriteAccessAllowed)
   , mClosed(false)
   , mInvalidated(false)
   , mActorWasAlive(false)
   , mActorDestroyed(false)
-  , mMetadataCleanedUp(false)
 #ifdef DEBUG
   , mAllBlobsUnmapped(false)
 #endif
 {
   AssertIsOnBackgroundThread();
   MOZ_ASSERT(aFactory);
   MOZ_ASSERT(aMetadata);
   MOZ_ASSERT(aFileManager);
@@ -13976,18 +13992,16 @@ Database::Invalidate()
     NS_WARNING("Failed to abort all transactions!");
   }
 
   if (!Helper::InvalidateMutableFiles(mMutableFiles)) {
     NS_WARNING("Failed to abort all mutable files!");
   }
 
   MOZ_ALWAYS_TRUE(CloseInternal());
-
-  CleanupMetadata();
 }
 
 nsresult
 Database::EnsureConnection()
 {
   MOZ_ASSERT(!NS_IsMainThread());
   MOZ_ASSERT(!IsOnBackgroundThread());
 
@@ -14243,32 +14257,28 @@ Database::ConnectionClosedCallback()
   }
 }
 
 void
 Database::CleanupMetadata()
 {
   AssertIsOnBackgroundThread();
 
-  if (!mMetadataCleanedUp) {
-    mMetadataCleanedUp = true;
-
-    DatabaseActorInfo* info;
-    MOZ_ALWAYS_TRUE(gLiveDatabaseHashtable->Get(Id(), &info));
-    MOZ_ALWAYS_TRUE(info->mLiveDatabases.RemoveElement(this));
-
-    if (info->mLiveDatabases.IsEmpty()) {
-      MOZ_ASSERT(!info->mWaitingFactoryOp ||
-                 !info->mWaitingFactoryOp->HasBlockedDatabases());
-      gLiveDatabaseHashtable->Remove(Id());
-    }
-
-    // Match the IncreaseBusyCount in OpenDatabaseOp::EnsureDatabaseActor().
-    DecreaseBusyCount();
-  }
+  DatabaseActorInfo* info;
+  MOZ_ALWAYS_TRUE(gLiveDatabaseHashtable->Get(Id(), &info));
+  MOZ_ALWAYS_TRUE(info->mLiveDatabases.RemoveElement(this));
+
+  if (info->mLiveDatabases.IsEmpty()) {
+    MOZ_ASSERT(!info->mWaitingFactoryOp ||
+               !info->mWaitingFactoryOp->HasBlockedDatabases());
+    gLiveDatabaseHashtable->Remove(Id());
+  }
+
+  // Match the IncreaseBusyCount in OpenDatabaseOp::EnsureDatabaseActor().
+  DecreaseBusyCount();
 }
 
 bool
 Database::VerifyRequestParams(const DatabaseRequestParams& aParams) const
 {
   AssertIsOnBackgroundThread();
   MOZ_ASSERT(aParams.type() != DatabaseRequestParams::T__None);
 
@@ -17883,46 +17893,45 @@ QuotaClient::StopIdleMaintenance()
 void
 QuotaClient::ShutdownWorkThreads()
 {
   AssertIsOnBackgroundThread();
   MOZ_ASSERT(!mShutdownRequested);
 
   mShutdownRequested = true;
 
-  // Shutdown maintenance thread pool (this spins the event loop until all
-  // threads are gone). This should release any maintenance related quota
-  // objects.
-  if (mMaintenanceThreadPool) {
-    mMaintenanceThreadPool->Shutdown();
-    mMaintenanceThreadPool = nullptr;
-  }
-
-  // Let any runnables dispatched from dying maintenance threads to be
-  // processed. This should release any maintenance related directory locks.
-  if (mCurrentMaintenance) {
-    MOZ_ALWAYS_TRUE(SpinEventLoopUntil([&]() {
-      return !mCurrentMaintenance;
-    }));
-  }
-
+  AbortOperations(VoidCString());
+
+  // This should release any IDB related quota objects or directory locks.
+  MOZ_ALWAYS_TRUE(SpinEventLoopUntil([&]() {
+    return (!gFactoryOps || gFactoryOps->IsEmpty()) &&
+           (!gLiveDatabaseHashtable || !gLiveDatabaseHashtable->Count()) &&
+           !mCurrentMaintenance;
+  }));
+
+  // And finally, shutdown all threads.
   RefPtr<ConnectionPool> connectionPool = gConnectionPool.get();
   if (connectionPool) {
     connectionPool->Shutdown();
 
     gConnectionPool = nullptr;
   }
 
   RefPtr<FileHandleThreadPool> fileHandleThreadPool =
     gFileHandleThreadPool.get();
   if (fileHandleThreadPool) {
     fileHandleThreadPool->Shutdown();
 
     gFileHandleThreadPool = nullptr;
   }
+
+  if (mMaintenanceThreadPool) {
+    mMaintenanceThreadPool->Shutdown();
+    mMaintenanceThreadPool = nullptr;
+  }
 }
 
 void
 QuotaClient::DidInitialize(QuotaManager* aQuotaManager)
 {
   MOZ_ASSERT(NS_IsMainThread());
 
   if (IndexedDatabaseManager* mgr = IndexedDatabaseManager::Get()) {
@@ -18646,17 +18655,19 @@ Maintenance::BeginDatabaseMaintenance()
   public:
     static bool
     IsSafeToRunMaintenance(const nsAString& aDatabasePath)
     {
       if (gFactoryOps) {
         for (uint32_t index = gFactoryOps->Length(); index > 0; index--) {
           RefPtr<FactoryOp>& existingOp = (*gFactoryOps)[index - 1];
 
-          MOZ_ASSERT(!existingOp->DatabaseFilePath().IsEmpty());
+          if (!existingOp->DatabaseFilePathIsKnown()) {
+            continue;
+          }
 
           if (existingOp->DatabaseFilePath() == aDatabasePath) {
             return false;
           }
         }
       }
 
       if (gLiveDatabaseHashtable) {
@@ -20693,17 +20704,16 @@ FactoryOp::FactoryOp(Factory* aFactory,
   : DatabaseOperationBase(aFactory->GetLoggingInfo()->Id(),
                           aFactory->GetLoggingInfo()->NextRequestSN())
   , mFactory(aFactory)
   , mContentParent(Move(aContentParent))
   , mCommonParams(aCommonParams)
   , mState(State::Initial)
   , mEnforcingQuota(true)
   , mDeleting(aDeleting)
-  , mBlockedDatabaseOpen(false)
   , mChromeWriteAccessAllowed(false)
   , mFileHandleDisabled(false)
 {
   AssertIsOnBackgroundThread();
   MOZ_ASSERT(aFactory);
   MOZ_ASSERT(!QuotaClient::IsShuttingDownOnBackgroundThread());
 }
 
@@ -20836,59 +20846,52 @@ FactoryOp::RetryCheckPermission()
 
 nsresult
 FactoryOp::DirectoryOpen()
 {
   AssertIsOnOwningThread();
   MOZ_ASSERT(mState == State::DirectoryOpenPending);
   MOZ_ASSERT(mDirectoryLock);
   MOZ_ASSERT(!mDatabaseFilePath.IsEmpty());
-
-  // gFactoryOps could be null here if the child process crashed or something
-  // and that cleaned up the last Factory actor.
-  if (!gFactoryOps) {
-    return NS_ERROR_DOM_INDEXEDDB_UNKNOWN_ERR;
-  }
+  MOZ_ASSERT(gFactoryOps);
 
   // See if this FactoryOp needs to wait.
   bool delayed = false;
+  bool foundThis = false;
   for (uint32_t index = gFactoryOps->Length(); index > 0; index--) {
     RefPtr<FactoryOp>& existingOp = (*gFactoryOps)[index - 1];
-    if (MustWaitFor(*existingOp)) {
+
+    if (existingOp == this) {
+      foundThis = true;
+      continue;
+    }
+
+    if (foundThis && MustWaitFor(*existingOp)) {
       // Only one op can be delayed.
       MOZ_ASSERT(!existingOp->mDelayedOp);
       existingOp->mDelayedOp = this;
       delayed = true;
       break;
     }
   }
 
-  // Adding this to the factory ops list will block any additional ops from
-  // proceeding until this one is done.
-  gFactoryOps->AppendElement(this);
-
   if (!delayed) {
     QuotaClient* quotaClient = QuotaClient::GetInstance();
     MOZ_ASSERT(quotaClient);
 
     if (RefPtr<Maintenance> currentMaintenance =
           quotaClient->GetCurrentMaintenance()) {
       if (RefPtr<DatabaseMaintenance> databaseMaintenance =
             currentMaintenance->GetDatabaseMaintenance(mDatabaseFilePath)) {
         databaseMaintenance->WaitForCompletion(this);
         delayed = true;
       }
     }
   }
 
-  mBlockedDatabaseOpen = true;
-
-  // Balanced in FinishSendResults().
-  IncreaseBusyCount();
-
   mState = State::DatabaseOpenPending;
   if (!delayed) {
     nsresult rv = DatabaseOpen();
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
   }
 
@@ -20934,38 +20937,42 @@ FactoryOp::WaitForTransactions()
   mState = State::WaitingForTransactionsToComplete;
 
   RefPtr<WaitForTransactionsHelper> helper =
     new WaitForTransactionsHelper(mDatabaseId, this);
   helper->WaitForTransactions();
 }
 
 void
+FactoryOp::CleanupMetadata()
+{
+  AssertIsOnOwningThread();
+
+  if (mDelayedOp) {
+    MOZ_ALWAYS_SUCCEEDS(NS_DispatchToCurrentThread(mDelayedOp.forget()));
+  }
+
+  MOZ_ASSERT(gFactoryOps);
+  gFactoryOps->RemoveElement(this);
+
+  // Match the IncreaseBusyCount in AllocPBackgroundIDBFactoryRequestParent().
+  DecreaseBusyCount();
+}
+
+void
 FactoryOp::FinishSendResults()
 {
   AssertIsOnOwningThread();
   MOZ_ASSERT(mState == State::SendingResults);
   MOZ_ASSERT(mFactory);
 
   // Make sure to release the factory on this thread.
   RefPtr<Factory> factory;
   mFactory.swap(factory);
 
-  if (mBlockedDatabaseOpen) {
-    if (mDelayedOp) {
-      MOZ_ALWAYS_SUCCEEDS(NS_DispatchToCurrentThread(mDelayedOp.forget()));
-    }
-
-    MOZ_ASSERT(gFactoryOps);
-    gFactoryOps->RemoveElement(this);
-
-    // Match the IncreaseBusyCount in DirectoryOpen().
-    DecreaseBusyCount();
-  }
-
   mState = State::Completed;
 }
 
 nsresult
 FactoryOp::CheckPermission(ContentParent* aContentParent,
                            PermissionRequestBase::PermissionValue* aPermission)
 {
   MOZ_ASSERT(NS_IsMainThread());
@@ -22437,38 +22444,45 @@ OpenDatabaseOp::SendResults()
     MOZ_ASSERT(!mDirectoryLock);
 
     if (NS_FAILED(mResultCode)) {
       mDatabase->Invalidate();
     }
 
     // Make sure to release the database on this thread.
     mDatabase = nullptr;
+
+    CleanupMetadata();
   } else if (mDirectoryLock) {
+    // ConnectionClosedCallback will call CleanupMetadata().
     nsCOMPtr<nsIRunnable> callback = NewRunnableMethod(
       "dom::indexedDB::OpenDatabaseOp::ConnectionClosedCallback",
       this,
       &OpenDatabaseOp::ConnectionClosedCallback);
 
     RefPtr<WaitForTransactionsHelper> helper =
       new WaitForTransactionsHelper(mDatabaseId, callback);
     helper->WaitForTransactions();
+  } else {
+    CleanupMetadata();
   }
 
   FinishSendResults();
 }
 
 void
 OpenDatabaseOp::ConnectionClosedCallback()
 {
   AssertIsOnOwningThread();
   MOZ_ASSERT(NS_FAILED(mResultCode));
   MOZ_ASSERT(mDirectoryLock);
 
   mDirectoryLock = nullptr;
+
+  CleanupMetadata();
 }
 
 void
 OpenDatabaseOp::EnsureDatabaseActor()
 {
   AssertIsOnOwningThread();
   MOZ_ASSERT(mState == State::BeginVersionChange ||
              mState == State::DatabaseWorkVersionChange ||
@@ -23112,16 +23126,18 @@ DeleteDatabaseOp::SendResults()
     }
 
     Unused <<
       PBackgroundIDBFactoryRequestParent::Send__delete__(this, response);
   }
 
   mDirectoryLock = nullptr;
 
+  CleanupMetadata();
+
   FinishSendResults();
 }
 
 nsresult
 DeleteDatabaseOp::
 VersionChangeOp::DeleteFile(nsIFile* aDirectory,
                             const nsAString& aFilename,
                             QuotaManager* aQuotaManager)
--- a/dom/indexedDB/test/unit/test_storageOption_pref.js
+++ b/dom/indexedDB/test/unit/test_storageOption_pref.js
@@ -79,20 +79,24 @@ function* testSteps()
   request = indexedDB.openForPrincipal(principal, name,
     { version, storage: "persistent" });
 
   request.onerror = errorHandler;
   request.onupgradeneeded = grabEventAndContinueHandler;
   request.onsuccess = grabEventAndContinueHandler;
   event = yield undefined;
 
+  is(event.type, "upgradeneeded", "Got correct event type");
+
   db = event.target.result;
   db.onerror = errorHandler;
 
-  is(event.type, "upgradeneeded", "Got correct event type");
+  event = yield undefined;
+
+  is(event.type, "success", "Got correct event type");
 
   is(db.name, name, "Correct name");
   is(db.version, version, "Correct version");
   is(db.storage, "persistent", "Correct persistence type");
 
   // A new database was created (because it changed persistence type).
   is(db.objectStoreNames.length, 0, "Got no data");
 
--- a/gfx/thebes/gfxContext.h
+++ b/gfx/thebes/gfxContext.h
@@ -254,16 +254,25 @@ public:
     /**
      * Gets the current color.  It's returned in the device color space.
      * returns false if there is something other than a color
      *         set as the current source (pattern, surface, etc)
      */
     bool GetDeviceColor(mozilla::gfx::Color& aColorOut);
 
     /**
+     * Returns true if color is neither opaque nor transparent (i.e. alpha is not 0
+     * or 1), and false otherwise. If true, aColorOut is set on output.
+     */
+    bool HasNonOpaqueNonTransparentColor(mozilla::gfx::Color& aColorOut) {
+        return GetDeviceColor(aColorOut) &&
+               0.f < aColorOut.a && aColorOut.a < 1.f;
+    }
+
+    /**
      * Set a solid color in the sRGB color space to use for drawing.
      * If CMS is not enabled, the color is treated as a device-space color
      * and this call is identical to SetDeviceColor().
      */
     void SetColor(const mozilla::gfx::Color& aColor);
 
     /**
      * Uses a pattern for drawing.
--- a/gfx/thebes/gfxFont.cpp
+++ b/gfx/thebes/gfxFont.cpp
@@ -2163,26 +2163,28 @@ gfxFont::Draw(const gfxTextRun *aTextRun
     if (!fontParams.scaledFont) {
         return;
     }
 
     auto* textDrawer = aRunParams.context->GetTextDrawer();
 
     fontParams.needsOblique = IsSyntheticOblique();
     fontParams.haveSVGGlyphs = GetFontEntry()->TryGetSVGData(this);
-
-    if (fontParams.haveSVGGlyphs && textDrawer) {
-        textDrawer->FoundUnsupportedFeature();
-        return;
-    }
-
     fontParams.haveColorGlyphs = GetFontEntry()->TryGetColorGlyphs();
     fontParams.contextPaint = aRunParams.runContextPaint;
 
     if (textDrawer) {
+        Color color;
+        if (fontParams.haveSVGGlyphs ||
+            (fontParams.haveColorGlyphs &&
+             aRunParams.context->HasNonOpaqueNonTransparentColor(color))) {
+            textDrawer->FoundUnsupportedFeature();
+            return;
+        }
+
         fontParams.isVerticalFont = aRunParams.isVerticalRun;
     } else {
         fontParams.isVerticalFont =
             aOrientation == gfx::ShapedTextFlags::TEXT_ORIENT_VERTICAL_UPRIGHT;
     }
 
     gfxContextMatrixAutoSaveRestore matrixRestore;
     layout::TextDrawTarget::AutoRestoreWRGlyphFlags glyphFlagsRestore;
--- a/gfx/thebes/gfxGDIFont.cpp
+++ b/gfx/thebes/gfxGDIFont.cpp
@@ -46,17 +46,17 @@ gfxGDIFont::gfxGDIFont(GDIFontEntry *aFo
                        AntialiasOption anAAOption)
     : gfxFont(nullptr, aFontEntry, aFontStyle, anAAOption),
       mFont(nullptr),
       mFontFace(nullptr),
       mMetrics(nullptr),
       mSpaceGlyph(0),
       mScriptCache(nullptr)
 {
-    mNeedsBold = aFontStyle->NeedsSyntheticBold(aFontEntry);
+    mNeedsSyntheticBold = aFontStyle->NeedsSyntheticBold(aFontEntry);
 
     Initialize();
 
     if (mFont) {
         mUnscaledFont = aFontEntry->LookupUnscaledFont(mFont);
     }
 }
 
@@ -217,17 +217,17 @@ gfxGDIFont::Initialize()
         } else if (mStyle.sizeAdjust == 0.0) {
             mAdjustedSize = 0.0;
         }
     }
 
     // (bug 724231) for local user fonts, we don't use GDI's synthetic bold,
     // as it could lead to a different, incompatible face being used
     // but instead do our own multi-striking
-    if (mNeedsBold && GetFontEntry()->IsLocalUserFont()) {
+    if (mNeedsSyntheticBold && GetFontEntry()->IsLocalUserFont()) {
         mApplySyntheticBold = true;
     }
 
     // this may end up being zero
     mAdjustedSize = ROUND(mAdjustedSize);
     FillLogFont(logFont, mAdjustedSize);
     mFont = ::CreateFontIndirectW(&logFont);
 
@@ -452,23 +452,23 @@ gfxGDIFont::FillLogFont(LOGFONTW& aLogFo
         if (fe->IsLocalUserFont()) {
             // for local user fonts, don't change the original weight
             // in the entry's logfont, because that could alter the
             // choice of actual face used (bug 724231)
             weight = 0;
         } else {
             // avoid GDI synthetic bold which occurs when weight
             // specified is >= font data weight + 200
-            weight = mNeedsBold ? 700 : 200;
+            weight = mNeedsSyntheticBold ? 700 : 200;
         }
     } else {
         // GDI doesn't support variation fonts, so for system fonts we know
         // that the entry has only a single weight, not a range.
         MOZ_ASSERT(fe->Weight().IsSingle());
-        weight = mNeedsBold ? 700 : fe->Weight().Min().ToIntRounded();
+        weight = mNeedsSyntheticBold ? 700 : fe->Weight().Min().ToIntRounded();
     }
 
     fe->FillLogFont(&aLogFont, weight, aSize);
 }
 
 uint32_t
 gfxGDIFont::GetGlyph(uint32_t aUnicode, uint32_t aVarSelector)
 {
--- a/gfx/thebes/gfxGDIFont.h
+++ b/gfx/thebes/gfxGDIFont.h
@@ -93,17 +93,17 @@ protected:
     void FillLogFont(LOGFONTW& aLogFont, gfxFloat aSize);
 
     HFONT                 mFont;
     cairo_font_face_t    *mFontFace;
 
     Metrics              *mMetrics;
     uint32_t              mSpaceGlyph;
 
-    bool                  mNeedsBold;
+    bool                  mNeedsSyntheticBold;
 
     // cache of glyph IDs (used for non-sfnt fonts only)
     mozilla::UniquePtr<nsDataHashtable<nsUint32HashKey,uint32_t> > mGlyphIDs;
     SCRIPT_CACHE          mScriptCache;
 
     // cache of glyph widths in 16.16 fixed-point pixels
     mozilla::UniquePtr<nsDataHashtable<nsUint32HashKey,int32_t> > mGlyphWidths;
 };
--- a/gfx/thebes/gfxTextRun.cpp
+++ b/gfx/thebes/gfxTextRun.cpp
@@ -542,29 +542,16 @@ HasSyntheticBoldOrColor(const gfxTextRun
                 return true;
             }
 #endif
         }
     }
     return false;
 }
 
-// Returns true if color is neither opaque nor transparent (i.e. alpha is not 0
-// or 1), and false otherwise. If true, aCurrentColorOut is set on output.
-static bool
-HasNonOpaqueNonTransparentColor(gfxContext *aContext, Color& aCurrentColorOut)
-{
-    if (aContext->GetDeviceColor(aCurrentColorOut)) {
-        if (0.f < aCurrentColorOut.a && aCurrentColorOut.a < 1.f) {
-            return true;
-        }
-    }
-    return false;
-}
-
 // helper class for double-buffering drawing with non-opaque color
 struct MOZ_STACK_CLASS BufferAlphaColor {
     explicit BufferAlphaColor(gfxContext *aContext)
         : mContext(aContext)
     {
 
     }
 
@@ -630,17 +617,17 @@ gfxTextRun::Draw(Range aRange, gfx::Poin
 
     // synthetic bolding draws glyphs twice ==> colors with opacity won't draw
     // correctly unless first drawn without alpha
     BufferAlphaColor syntheticBoldBuffer(aParams.context);
     Color currentColor;
     bool needToRestore = false;
 
     if (aParams.drawMode & DrawMode::GLYPH_FILL &&
-        HasNonOpaqueNonTransparentColor(aParams.context, currentColor) &&
+        aParams.context->HasNonOpaqueNonTransparentColor(currentColor) &&
         HasSyntheticBoldOrColor(this, aRange) &&
         !aParams.context->GetTextDrawer()) {
 
         needToRestore = true;
         // Measure text; use the bounding box to determine the area we need
         // to buffer.
         gfxTextRun::Metrics metrics = MeasureText(
             aRange, gfxFont::LOOSE_INK_EXTENTS,
--- a/gfx/webrender_bindings/Moz2DImageRenderer.cpp
+++ b/gfx/webrender_bindings/Moz2DImageRenderer.cpp
@@ -149,17 +149,17 @@ AddFontData(WrFontKey aKey, const uint8_
 
 void
 AddNativeFontHandle(WrFontKey aKey, void* aHandle, uint32_t aIndex) {
   StaticMutexAutoLock lock(sFontDataTableLock);
   auto i = sFontDataTable.find(aKey);
   if (i == sFontDataTable.end()) {
     FontTemplate& font = sFontDataTable[aKey];
 #ifdef XP_MACOSX
-    font.mUnscaledFont = new UnscaledFontMac(reinterpret_cast<CGFontRef>(aHandle), true);
+    font.mUnscaledFont = new UnscaledFontMac(reinterpret_cast<CGFontRef>(aHandle), false);
 #elif defined(XP_WIN)
     font.mUnscaledFont = new UnscaledFontDWrite(reinterpret_cast<IDWriteFontFace*>(aHandle), nullptr);
 #elif defined(ANDROID)
     font.mUnscaledFont = new UnscaledFontFreeType(reinterpret_cast<const char*>(aHandle), aIndex);
 #else
     font.mUnscaledFont = new UnscaledFontFontconfig(reinterpret_cast<const char*>(aHandle), aIndex);
 #endif
   }
--- a/layout/base/tests/marionette/test_accessiblecaret_cursor_mode.py
+++ b/layout/base/tests/marionette/test_accessiblecaret_cursor_mode.py
@@ -24,17 +24,17 @@ class AccessibleCaretCursorModeTestCase(
     # Element IDs.
     _input_id = 'input'
     _input_padding_id = 'input-padding'
     _textarea_id = 'textarea'
     _textarea_one_line_id = 'textarea-one-line'
     _contenteditable_id = 'contenteditable'
 
     # Test html files.
-    _cursor_html = 'test_carets_cursor.html'
+    _cursor_html = 'layout/test_carets_cursor.html'
 
     def setUp(self):
         # Code to execute before every test is running.
         super(AccessibleCaretCursorModeTestCase, self).setUp()
         self.caret_tested_pref = 'layout.accessiblecaret.enabled'
         self.hide_carets_for_mouse = 'layout.accessiblecaret.hide_carets_for_mouse_input'
         self.prefs = {
             self.caret_tested_pref: True,
@@ -197,17 +197,17 @@ class AccessibleCaretCursorModeTestCase(
         x, y = sel.first_caret_location()
 
         # Drag the caret up by 50px, and insert '!'.
         self.actions.flick(el, x, y, x, y - 50).perform()
         self.actions.key_down(content_to_add).key_up(content_to_add).perform()
         self.assertNotEqual(non_target_content, sel.content)
 
     def test_drag_caret_from_front_to_end_across_columns(self):
-        self.open_test_html('test_carets_columns.html')
+        self.open_test_html('layout/test_carets_columns.html')
         el = self.marionette.find_element(By.ID, 'columns-inner')
         sel = SelectionManager(el)
         content_to_add = '!'
         target_content = sel.content + content_to_add
 
         # Goal: the cursor position can be changed by dragging the caret from
         # the front to the end of the content.
 
--- a/layout/base/tests/marionette/test_accessiblecaret_selection_mode.py
+++ b/layout/base/tests/marionette/test_accessiblecaret_selection_mode.py
@@ -35,22 +35,22 @@ class AccessibleCaretSelectionModeTestCa
     _textarea_rtl_id = 'textarea-rtl'
     _contenteditable_id = 'contenteditable'
     _contenteditable2_id = 'contenteditable2'
     _content_id = 'content'
     _content2_id = 'content2'
     _non_selectable_id = 'non-selectable'
 
     # Test html files.
-    _selection_html = 'test_carets_selection.html'
-    _multipleline_html = 'test_carets_multipleline.html'
-    _multiplerange_html = 'test_carets_multiplerange.html'
-    _longtext_html = 'test_carets_longtext.html'
-    _iframe_html = 'test_carets_iframe.html'
-    _display_none_html = 'test_carets_display_none.html'
+    _selection_html = 'layout/test_carets_selection.html'
+    _multipleline_html = 'layout/test_carets_multipleline.html'
+    _multiplerange_html = 'layout/test_carets_multiplerange.html'
+    _longtext_html = 'layout/test_carets_longtext.html'
+    _iframe_html = 'layout/test_carets_iframe.html'
+    _display_none_html = 'layout/test_carets_display_none.html'
 
     def setUp(self):
         # Code to execute before every test is running.
         super(AccessibleCaretSelectionModeTestCase, self).setUp()
         self.carets_tested_pref = 'layout.accessiblecaret.enabled'
         self.prefs = {
             'layout.word_select.eat_space_to_next_word': False,
             self.carets_tested_pref: True,
--- a/mobile/android/components/geckoview/GeckoViewExternalAppService.js
+++ b/mobile/android/components/geckoview/GeckoViewExternalAppService.js
@@ -18,22 +18,20 @@ function ExternalAppService() {
 }
 
 ExternalAppService.prototype = {
   classID: Components.ID("{a89eeec6-6608-42ee-a4f8-04d425992f45}"),
   QueryInterface: ChromeUtils.generateQI([Ci.nsIExternalHelperAppService]),
 
   doContent(mimeType, request, context, forceSave) {
     const channel = request.QueryInterface(Ci.nsIChannel);
-    const mm = context.QueryInterface(Ci.nsIDocShell).tabChild.messageManager;
-
     debug `doContent: uri=${channel.URI.displaySpec}
                       contentType=${channel.contentType}`;
 
-    EventDispatcher.forMessageManager(mm).sendRequest({
+    GeckoViewUtils.getDispatcherForWindow(context).sendRequest({
       type: "GeckoView:ExternalResponse",
       uri: channel.URI.displaySpec,
       contentType: channel.contentType,
       contentLength: channel.contentLength,
       filename: channel.contentDispositionFilename
     });
 
     request.cancel(Cr.NS_ERROR_ABORT);
--- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoSession.java
@@ -2842,17 +2842,17 @@ public class GeckoSession extends LayerS
                     throw new IllegalArgumentException("String: " + type + " is not a valid media type string");
                 }
             }
 
             /* package */ MediaSource(GeckoBundle media) {
                 id = media.getString("id");
                 rawId = media.getString("rawId");
                 name = media.getString("name");
-                source = getSourceFromString(media.getString("source"));
+                source = getSourceFromString(media.getString("mediaSource"));
                 type = getTypeFromString(media.getString("type"));
             }
         }
 
         /**
          * Callback interface for notifying the result of a media permission request,
          * including which media source(s) to use.
          */
--- a/old-configure.in
+++ b/old-configure.in
@@ -224,16 +224,23 @@ case "$target" in
 
         if test -n "$WIN_UCRT_REDIST_DIR"; then
           if test ! -d "$WIN_UCRT_REDIST_DIR"; then
             AC_MSG_ERROR([Invalid Windows UCRT Redist directory: ${WIN_UCRT_REDIST_DIR}])
           fi
           WIN_UCRT_REDIST_DIR=`cd "$WIN_UCRT_REDIST_DIR" && pwd -W`
         fi
 
+        if test -n "$WIN_DIA_SDK_BIN_DIR"; then
+          if test ! -d "$WIN_DIA_SDK_BIN_DIR"; then
+            AC_MSG_ERROR([Invalid Windows DIA SDK directory: ${WIN_DIA_SDK_BIN_DIR}])
+          fi
+          WIN_DIA_SDK_BIN_DIR=`cd "$WIN_DIA_SDK_BIN_DIR" && pwd -W`
+        fi
+
         AC_SUBST(MSVC_HAS_DIA_SDK)
         AC_SUBST(MSVC_C_RUNTIME_DLL)
         AC_SUBST(MSVC_CXX_RUNTIME_DLL)
 
         AC_DEFINE(HAVE_SEH_EXCEPTIONS)
 
         if test -n "$WIN32_REDIST_DIR"; then
           if test ! -d "$WIN32_REDIST_DIR"; then
@@ -4402,16 +4409,17 @@ if test -n "$MOZ_TELEMETRY_REPORTING" ||
   MOZ_DATA_REPORTING=1
   AC_DEFINE(MOZ_DATA_REPORTING)
   AC_SUBST(MOZ_DATA_REPORTING)
 fi
 
 dnl win32 options
 AC_SUBST(WIN32_REDIST_DIR)
 AC_SUBST(WIN_UCRT_REDIST_DIR)
+AC_SUBST(WIN_DIA_SDK_BIN_DIR)
 
 dnl ========================================================
 dnl ICU Support
 dnl ========================================================
 
 _INTL_API=yes
 
 if test "$MOZ_WIDGET_TOOLKIT" = "cocoa"; then
--- a/security/manager/ssl/nsNSSComponent.cpp
+++ b/security/manager/ssl/nsNSSComponent.cpp
@@ -694,39 +694,32 @@ nsNSSComponent::MaybeEnableFamilySafetyC
   if (!(IsWin8Point1OrLater() && !IsWin10OrLater())) {
     return;
   }
   // Detect but don't import by default.
   uint32_t familySafetyMode = Preferences::GetUint(kFamilySafetyModePref, 1);
   if (familySafetyMode > 2) {
     familySafetyMode = 0;
   }
-  Telemetry::Accumulate(Telemetry::FAMILY_SAFETY, familySafetyMode);
   if (familySafetyMode == 0) {
     return;
   }
   bool familySafetyEnabled;
   nsresult rv = AccountHasFamilySafetyEnabled(familySafetyEnabled);
   if (NS_FAILED(rv)) {
-    Telemetry::Accumulate(Telemetry::FAMILY_SAFETY, 3);
     return;
   }
   if (!familySafetyEnabled) {
-    Telemetry::Accumulate(Telemetry::FAMILY_SAFETY, 4);
     return;
   }
-  Telemetry::Accumulate(Telemetry::FAMILY_SAFETY, 5);
   if (familySafetyMode == 2) {
     rv = LoadFamilySafetyRoot();
     if (NS_FAILED(rv)) {
-      Telemetry::Accumulate(Telemetry::FAMILY_SAFETY, 6);
       MOZ_LOG(gPIPNSSLog, LogLevel::Debug,
               ("failed to load Family Safety root"));
-    } else {
-      Telemetry::Accumulate(Telemetry::FAMILY_SAFETY, 7);
     }
   }
 #endif // XP_WIN
 }
 
 #ifdef XP_WIN
 // Helper function to determine if the OS considers the given certificate to be
 // a trust anchor for TLS server auth certificates. This is to be used in the
--- a/servo/components/style/properties/properties.mako.rs
+++ b/servo/components/style/properties/properties.mako.rs
@@ -51,22 +51,16 @@ use values::computed;
 use values::computed::NonNegativeLength;
 use rule_tree::{CascadeLevel, StrongRuleNode};
 use self::computed_value_flags::*;
 use str::{CssString, CssStringBorrow, CssStringWriter};
 use style_adjuster::StyleAdjuster;
 
 pub use self::declaration_block::*;
 
-#[cfg(feature = "gecko")]
-#[macro_export]
-macro_rules! property_name {
-    ($s: tt) => { atom!($s) }
-}
-
 <%!
     from data import Method, Keyword, to_rust_ident, to_camel_case, SYSTEM_FONT_LONGHANDS
     import os.path
 %>
 
 #[path="${repr(os.path.join(os.path.dirname(__file__), 'computed_value_flags.rs'))[1:-1]}"]
 pub mod computed_value_flags;
 #[path="${repr(os.path.join(os.path.dirname(__file__), 'declaration_block.rs'))[1:-1]}"]
rename from testing/marionette/harness/marionette_harness/www/test_carets_columns.html
rename to testing/marionette/harness/marionette_harness/www/layout/test_carets_columns.html
rename from testing/marionette/harness/marionette_harness/www/test_carets_cursor.html
rename to testing/marionette/harness/marionette_harness/www/layout/test_carets_cursor.html
rename from testing/marionette/harness/marionette_harness/www/test_carets_display_none.html
rename to testing/marionette/harness/marionette_harness/www/layout/test_carets_display_none.html
rename from testing/marionette/harness/marionette_harness/www/test_carets_iframe.html
rename to testing/marionette/harness/marionette_harness/www/layout/test_carets_iframe.html
rename from testing/marionette/harness/marionette_harness/www/test_carets_longtext.html
rename to testing/marionette/harness/marionette_harness/www/layout/test_carets_longtext.html
rename from testing/marionette/harness/marionette_harness/www/test_carets_multipleline.html
rename to testing/marionette/harness/marionette_harness/www/layout/test_carets_multipleline.html
rename from testing/marionette/harness/marionette_harness/www/test_carets_multiplerange.html
rename to testing/marionette/harness/marionette_harness/www/layout/test_carets_multiplerange.html
rename from testing/marionette/harness/marionette_harness/www/test_carets_selection.html
rename to testing/marionette/harness/marionette_harness/www/layout/test_carets_selection.html
--- a/testing/mochitest/mochitest_options.py
+++ b/testing/mochitest/mochitest_options.py
@@ -931,17 +931,19 @@ class AndroidArguments(ArgumentContainer
             options.topsrcdir = build_obj.topsrcdir
 
         if options.pidFile != "":
             f = open(options.pidFile, 'w')
             f.write("%s" % os.getpid())
             f.close()
 
         if not options.robocopApk and build_obj:
-            options.robocopApk = build_obj.substs.get('GRADLE_ANDROID_APP_ANDROIDTEST_APK')
+            apk = build_obj.substs.get('GRADLE_ANDROID_APP_ANDROIDTEST_APK')
+            if apk and os.path.exists(apk):
+                options.robocopApk = apk
 
         if options.robocopApk != "":
             if not os.path.exists(options.robocopApk):
                 parser.error(
                     "Unable to find robocop APK '%s'" %
                     options.robocopApk)
             options.robocopApk = os.path.abspath(options.robocopApk)
 
--- a/testing/tps/README
+++ b/testing/tps/README
@@ -2,17 +2,17 @@ TPS is a test automation framework for F
 https://developer.mozilla.org/en/TPS for documentation.
 
 Installation
 ============
 
 TPS requires several packages to operate properly. To install TPS and
 required packages, use the INSTALL.sh script, provided:
 
-  ./INSTALL.sh /path/to/create/virtualenv
+  python create_venv.py /path/to/create/virtualenv
 
 This script will create a virtalenv and install TPS into it. TPS can then
 be run by activating the virtualenv and executing:
 
   runtps --binary=/path/to/firefox
 
 
 Configuration
--- a/testing/tps/create_venv.py
+++ b/testing/tps/create_venv.py
@@ -33,17 +33,17 @@ To execute tps use:
 
 See runtps --help for all options
 
 ***********************************************************************
 """
 
 # Link to the folder, which contains the zip archives of virtualenv
 URL_VIRTUALENV = 'https://codeload.github.com/pypa/virtualenv/zip/'
-VERSION_VIRTUALENV = '1.11.6'
+VERSION_VIRTUALENV = '15.0.0'
 
 
 if sys.platform == 'win32':
     bin_name = os.path.join('Scripts', 'activate.bat')
     activate_env = os.path.join('Scripts', 'activate_this.py')
     python_env = os.path.join('Scripts', 'python.exe')
 else:
     bin_name = os.path.join('bin', 'activate')
--- a/testing/tps/setup.py
+++ b/testing/tps/setup.py
@@ -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/.
 
 
 from setuptools import setup, find_packages
 import sys
 
-version = '0.5'
+version = '0.6'
 
 deps = ['httplib2 == 0.9.2',
         'mozfile == 1.2',
         'mozhttpd == 0.7',
         'mozinfo == 0.10',
         'mozinstall == 1.15',
         'mozprocess == 0.26',
-        'mozprofile == 1.0.0',
-        'mozrunner == 6.15',
+        'mozprofile == 1.1.0',
+        'mozrunner == 7.0.1',
         'mozversion == 1.5',
        ]
 
 # we only support python 2.6+ right now
 assert sys.version_info[0] == 2
 assert sys.version_info[1] >= 6
 
 setup(name='tps',
deleted file mode 100644
--- a/testing/web-platform/meta/fetch/api/redirect/redirect-mode-worker.html.ini
+++ /dev/null
@@ -1,31 +0,0 @@
-[redirect-mode-worker.html]
-  [Redirect 301 in follow redirect and cors mode]
-    expected: FAIL
-
-  [Redirect 301 in follow redirect and no-cors mode]
-    expected: FAIL
-
-  [Redirect 302 in follow redirect and cors mode]
-    expected: FAIL
-
-  [Redirect 302 in follow redirect and no-cors mode]
-    expected: FAIL
-
-  [Redirect 303 in follow redirect and cors mode]
-    expected: FAIL
-
-  [Redirect 303 in follow redirect and no-cors mode]
-    expected: FAIL
-
-  [Redirect 307 in follow redirect and cors mode]
-    expected: FAIL
-
-  [Redirect 307 in follow redirect and no-cors mode]
-    expected: FAIL
-
-  [Redirect 308 in follow redirect and cors mode]
-    expected: FAIL
-
-  [Redirect 308 in follow redirect and no-cors mode]
-    expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/fetch/api/redirect/redirect-mode.html.ini
+++ /dev/null
@@ -1,31 +0,0 @@
-[redirect-mode.html]
-  [Redirect 301 in follow redirect and cors mode]
-    expected: FAIL
-
-  [Redirect 301 in follow redirect and no-cors mode]
-    expected: FAIL
-
-  [Redirect 302 in follow redirect and cors mode]
-    expected: FAIL
-
-  [Redirect 302 in follow redirect and no-cors mode]
-    expected: FAIL
-
-  [Redirect 303 in follow redirect and cors mode]
-    expected: FAIL
-
-  [Redirect 303 in follow redirect and no-cors mode]
-    expected: FAIL
-
-  [Redirect 307 in follow redirect and cors mode]
-    expected: FAIL
-
-  [Redirect 307 in follow redirect and no-cors mode]
-    expected: FAIL
-
-  [Redirect 308 in follow redirect and cors mode]
-    expected: FAIL
-
-  [Redirect 308 in follow redirect and no-cors mode]
-    expected: FAIL
-
deleted file mode 100644
--- a/testing/web-platform/meta/service-workers/service-worker/fetch-event-redirect.https.html.ini
+++ /dev/null
@@ -1,19 +0,0 @@
-[fetch-event-redirect.https.html]
-  [Non-navigation, manual redirect, no-cors mode Request redirected to same-origin without credentials should fail]
-    expected: FAIL
-
-  [Non-navigation, manual redirect, no-cors mode Request redirected to no-cors without credentials should fail]
-    expected: FAIL
-
-  [Non-navigation, manual redirect, no-cors mode Request redirected to cors without credentials should fail]
-    expected: FAIL
-
-  [Non-navigation, manual redirect, no-cors mode Request redirected to same-origin with credentials should fail]
-    expected: FAIL
-
-  [Non-navigation, manual redirect, no-cors mode Request redirected to no-cors with credentials should fail]
-    expected: FAIL
-
-  [Non-navigation, manual redirect, no-cors mode Request redirected to cors with credentials should fail]
-    expected: FAIL
-
--- a/toolkit/components/telemetry/GCTelemetry.jsm
+++ b/toolkit/components/telemetry/GCTelemetry.jsm
@@ -111,18 +111,16 @@ class GCData {
 // You should also adjust browser_TelemetryGC.js.
 const MAX_GC_KEYS = 24;
 const MAX_SLICES = 4;
 const MAX_SLICE_KEYS = 12;
 const MAX_PHASES = 65;
 const LOGGER_NAME = "Toolkit.Telemetry";
 
 function limitProperties(name, obj, count, log) {
-  log.trace("limitProperties");
-
   // If there are too many properties delete all/most of them. We don't
   // expect this ever to happen.
   let num_properties = Object.keys(obj).length;
   if (num_properties > count) {
     for (let key of Object.keys(obj)) {
       // If this is the main GC object then save some of the critical
       // properties.
       if (name === "data" && (
--- a/toolkit/components/telemetry/Histograms.json
+++ b/toolkit/components/telemetry/Histograms.json
@@ -484,25 +484,16 @@
   },
   "DEVICE_RESET_REASON": {
     "record_in_processes": ["main", "content", "gpu"],
     "expires_in_version": "never",
     "kind": "enumerated",
     "n_values": 10,
     "description": "GPU Device Reset Reason (ok, hung, removed, reset, internal error, invalid call, out of memory)"
   },
-  "FAMILY_SAFETY": {
-    "record_in_processes": ["main", "content"],
-    "alert_emails": ["seceng-telemetry@mozilla.com"],
-    "expires_in_version": "60",
-    "kind": "enumerated",
-    "n_values": 16,
-    "bug_numbers": [1239166],
-    "description": "Status of Family Safety detection and remediation. See nsNSSComponent.cpp."
-  },
   "FETCH_IS_MAINTHREAD": {
     "record_in_processes": ["main", "content"],
     "expires_in_version": "50",
     "kind": "boolean",
     "description": "Was Fetch request initiated from the main thread?"
   },
   "FORCED_DEVICE_RESET_REASON": {
     "record_in_processes": ["main", "content", "gpu"],
--- a/toolkit/mozapps/installer/upload-files.mk
+++ b/toolkit/mozapps/installer/upload-files.mk
@@ -73,16 +73,20 @@ endif
 
 ifdef WIN_UCRT_REDIST_DIR
   JSSHELL_BINS += $(notdir $(wildcard $(DIST)/bin/api-ms-win-*.dll))
   JSSHELL_BINS += ucrtbase.dll
 endif
 
 ifdef LLVM_SYMBOLIZER
   JSSHELL_BINS += $(notdir $(LLVM_SYMBOLIZER))
+  # On Windows, llvm-symbolizer depends on the MS DIA library.
+  ifdef WIN_DIA_SDK_BIN_DIR
+    JSSHELL_BINS += msdia140.dll
+  endif
 endif
 ifdef MOZ_CLANG_RT_ASAN_LIB_PATH
   JSSHELL_BINS += $(notdir $(MOZ_CLANG_RT_ASAN_LIB_PATH))
 endif
 
 MAKE_JSSHELL  = $(call py_action,zip,-C $(DIST)/bin --strip $(abspath $(PKG_JSSHELL)) $(JSSHELL_BINS))
 
 JARLOG_DIR = $(topobjdir)/jarlog/