Merge mozilla-central to mozilla-inbound
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Fri, 13 Jan 2017 10:22:50 +0100
changeset 374312 bb6cabf1f0417c8076056a52991217522c4cbf01
parent 374311 3f756d8ee4cf3847773ca1ffc6999948f670455b (current diff)
parent 374253 91f5293e9a89056565493ed5073c3842b0ee9fdc (diff)
child 374313 6584da54c13dcebacf6623bb5eb1c89231d67f50
push id6996
push userjlorenzo@mozilla.com
push dateMon, 06 Mar 2017 20:48:21 +0000
treeherdermozilla-beta@d89512dab048 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone53.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge mozilla-central to mozilla-inbound
browser/installer/package-manifest.in
browser/themes/shared/icon.png
browser/themes/shared/theme-switcher-icon.png
browser/themes/shared/theme-switcher-icon@2x.png
devtools/client/webide/content/devicesettings.js
devtools/client/webide/content/devicesettings.xhtml
devtools/client/webide/test/test_device_settings.html
devtools/server/actors/settings.js
devtools/server/tests/mochitest/test_settings.html
dom/settings/SettingsDB.jsm
dom/settings/SettingsManager.js
dom/settings/SettingsManager.manifest
dom/settings/SettingsRequestManager.jsm
dom/settings/SettingsService.js
dom/settings/SettingsService.manifest
dom/settings/moz.build
dom/settings/tests/chrome.ini
dom/settings/tests/file_bug1110872.html
dom/settings/tests/file_loadserver.js
dom/settings/tests/test_settings_basics.html
dom/settings/tests/test_settings_blobs.html
dom/settings/tests/test_settings_bug1110872.html
dom/settings/tests/test_settings_data_uris.html
dom/settings/tests/test_settings_events.html
dom/settings/tests/test_settings_navigator_object.html
dom/settings/tests/test_settings_observer_killer.html
dom/settings/tests/test_settings_onsettingchange.html
dom/settings/tests/test_settings_permissions.html
dom/settings/tests/test_settings_service.js
dom/settings/tests/test_settings_service_callback.js
dom/settings/tests/unit/test_settingsrequestmanager_messages.js
dom/settings/tests/unit/xpcshell.ini
dom/webidl/MozSettingsEvent.webidl
dom/webidl/MozSettingsTransactionEvent.webidl
dom/webidl/SettingsManager.webidl
toolkit/components/telemetry/Telemetry.cpp
--- a/browser/app/profile/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/install.rdf.in
+++ b/browser/app/profile/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/install.rdf.in
@@ -8,18 +8,18 @@
 
 <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
      xmlns:em="http://www.mozilla.org/2004/em-rdf#">
 
   <Description about="urn:mozilla:install-manifest">
     <em:id>{972ce4c6-7e08-4474-a285-3208198ce6fd}</em:id>
     <em:version>@FIREFOX_VERSION@</em:version>
 
-    <!-- Target Application this theme can install into, 
-        with minimum and maximum supported versions. --> 
+    <!-- Target Application this theme can install into,
+        with minimum and maximum supported versions. -->
     <em:targetApplication>
       <Description>
         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
         <em:minVersion>@FIREFOX_VERSION@</em:minVersion>
         <em:maxVersion>@FIREFOX_VERSION@</em:maxVersion>
       </Description>
     </em:targetApplication>
 
@@ -30,11 +30,13 @@
     <!-- Front End Integration Hooks (used by Theme Manager)-->
     <em:creator>Mozilla</em:creator>
     <em:contributor>Mozilla Contributors</em:contributor>
 
     <!-- Allow lightweight themes to apply to this theme -->
     <em:skinnable>true</em:skinnable>
 
     <em:internalName>classic/1.0</em:internalName>
-  </Description>      
+
+    <em:iconURL>chrome://browser/content/default-theme-icon.svg</em:iconURL>
+  </Description>
 
 </RDF>
new file mode 100644
--- /dev/null
+++ b/browser/base/content/default-theme-icon.svg
@@ -0,0 +1,13 @@
+<?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/. -->
+<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32">
+    <rect fill="#fff" x="1" y="1" width="30" height="30" rx="2" ry="2"/>
+    <path fill="#e3e3e3" d="M3 1h26a2 2 0 0 1 2 2v18H1V3a2 2 0 0 1 2-2z"/>
+    <rect stroke="gray" fill="#fff" x="10.5" y="5.5" width="18" height="11" rx="1" ry="1"/>
+    <circle fill="#fcfcfc" stroke="gray" stroke-width="1.2px" cx="11" cy="11" r="7.5"/>
+    <path fill="#595959" d="M14 10h-3.6l1.3-1.3a1 1 0 0 0-1.4-1.4l-3 3a1 1 0 0 0 0 1.4l3 3a1 1 0 0 0 1.4-1.4L10.4 12H14a1 1 0 0 0 0-2z"/>
+    <path fill="none" stroke="#999" d="M1.5 20.5h29"/>
+    <rect fill="none" stroke="#999" stroke-width="2" x="1" y="1" width="30" height="30" rx="2" ry="2"/>
+</svg>
--- a/browser/base/jar.mn
+++ b/browser/base/jar.mn
@@ -89,16 +89,17 @@ browser.jar:
 #else
         content/browser/browser-tabsintitlebar.js       (content/browser-tabsintitlebar-stub.js)
 #endif
         content/browser/browser-thumbnails.js         (content/browser-thumbnails.js)
         content/browser/browser-trackingprotection.js (content/browser-trackingprotection.js)
         content/browser/tab-content.js                (content/tab-content.js)
         content/browser/content.js                    (content/content.js)
         content/browser/social-content.js             (content/social-content.js)
+        content/browser/default-theme-icon.svg        (content/default-theme-icon.svg)
         content/browser/defaultthemes/1.footer.jpg    (content/defaultthemes/1.footer.jpg)
         content/browser/defaultthemes/1.header.jpg    (content/defaultthemes/1.header.jpg)
         content/browser/defaultthemes/1.icon.jpg      (content/defaultthemes/1.icon.jpg)
         content/browser/defaultthemes/1.preview.jpg   (content/defaultthemes/1.preview.jpg)
         content/browser/defaultthemes/2.footer.jpg    (content/defaultthemes/2.footer.jpg)
         content/browser/defaultthemes/2.header.jpg    (content/defaultthemes/2.header.jpg)
         content/browser/defaultthemes/2.icon.jpg      (content/defaultthemes/2.icon.jpg)
         content/browser/defaultthemes/2.preview.jpg   (content/defaultthemes/2.preview.jpg)
--- a/browser/extensions/e10srollout/bootstrap.js
+++ b/browser/extensions/e10srollout/bootstrap.js
@@ -13,17 +13,17 @@ Cu.import("resource://gre/modules/Update
  // The amount of people to be part of e10s
 const TEST_THRESHOLD = {
   "beta"    : 0.5,  // 50%
   "release" : 1.0,  // 100%
 };
 
 const ADDON_ROLLOUT_POLICY = {
   "beta"    : "51alladdons", // Any WebExtension or addon except with mpc = false
-  "release" : "50allmpc", // Any WebExtension or addon with mpc = true
+  "release" : "51set1",
 };
 
 const PREF_COHORT_SAMPLE       = "e10s.rollout.cohortSample";
 const PREF_COHORT_NAME         = "e10s.rollout.cohort";
 const PREF_E10S_OPTED_IN       = "browser.tabs.remote.autostart";
 const PREF_E10S_FORCE_ENABLED  = "browser.tabs.remote.force-enable";
 const PREF_E10S_FORCE_DISABLED = "browser.tabs.remote.force-disable";
 const PREF_TOGGLE_E10S         = "browser.tabs.remote.autostart.2";
--- a/browser/extensions/e10srollout/install.rdf.in
+++ b/browser/extensions/e10srollout/install.rdf.in
@@ -5,17 +5,17 @@
 
 #filter substitution
 
 <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
      xmlns:em="http://www.mozilla.org/2004/em-rdf#">
 
   <Description about="urn:mozilla:install-manifest">
     <em:id>e10srollout@mozilla.org</em:id>
-    <em:version>1.6</em:version>
+    <em:version>1.7</em:version>
     <em:type>2</em:type>
     <em:bootstrap>true</em:bootstrap>
     <em:multiprocessCompatible>true</em:multiprocessCompatible>
 
     <!-- Target Application this theme can install into,
         with minimum and maximum supported versions. -->
     <em:targetApplication>
       <Description>
--- a/browser/extensions/shield-recipe-client/lib/NormandyApi.jsm
+++ b/browser/extensions/shield-recipe-client/lib/NormandyApi.jsm
@@ -5,16 +5,17 @@
 
 "use strict";
 
 const {utils: Cu, classes: Cc, interfaces: Ci} = Components;
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/Task.jsm");
 Cu.import("resource://gre/modules/CanonicalJSON.jsm");
 Cu.import("resource://gre/modules/Log.jsm");
+Cu.importGlobalProperties(["fetch"]); /* globals fetch */
 
 this.EXPORTED_SYMBOLS = ["NormandyApi"];
 
 const log = Log.repository.getLogger("extensions.shield-recipe-client");
 const prefs = Services.prefs.getBranch("extensions.shield-recipe-client.");
 
 this.NormandyApi = {
   apiCall(method, endpoint, data = {}) {
--- a/browser/extensions/shield-recipe-client/test/.eslintrc.js
+++ b/browser/extensions/shield-recipe-client/test/.eslintrc.js
@@ -3,14 +3,15 @@
 module.exports = {
   globals: {
     Assert: false,
     BrowserTestUtils: false,
     add_task: false,
     is: false,
     isnot: false,
     ok: false,
+    SpecialPowers: false,
   },
   rules: {
     "spaced-comment": 2,
     "space-before-function-paren": 2,
   }
 };
--- a/browser/extensions/shield-recipe-client/test/browser.ini
+++ b/browser/extensions/shield-recipe-client/test/browser.ini
@@ -1,6 +1,9 @@
 [browser_driver_uuids.js]
 [browser_env_expressions.js]
 [browser_EventEmitter.js]
 [browser_Storage.js]
 [browser_Heartbeat.js]
 skip-if = true # bug 1325409
+[browser_NormandyApi.js]
+  support-files =
+    test_server.sjs
new file mode 100644
--- /dev/null
+++ b/browser/extensions/shield-recipe-client/test/browser_NormandyApi.js
@@ -0,0 +1,21 @@
+"use strict";
+
+const {utils: Cu} = Components;
+Cu.import("resource://shield-recipe-client/lib/NormandyApi.jsm", this);
+
+add_task(function* () {
+  // Point the add-on to the test server.
+  yield SpecialPowers.pushPrefEnv({
+    set: [
+      [
+        "extensions.shield-recipe-client.api_url",
+        "http://mochi.test:8888/browser/browser/extensions/shield-recipe-client/test",
+      ]
+    ]
+  })
+
+  // Test that NormandyApi can fetch from the test server.
+  const response = yield NormandyApi.get("test_server.sjs");
+  const data = yield response.json();
+  Assert.deepEqual(data, {test: "data"}, "NormandyApi returned incorrect server data.");
+});
new file mode 100644
--- /dev/null
+++ b/browser/extensions/shield-recipe-client/test/test_server.sjs
@@ -0,0 +1,8 @@
+function handleRequest(request, response) {
+  // Allow cross-origin, so you can XHR to it!
+  response.setHeader("Access-Control-Allow-Origin", "*", false);
+  // Avoid confusing cache behaviors
+  response.setHeader("Cache-Control", "no-cache", false);
+  response.setHeader("Content-Type", "application/json", false);
+  response.write(JSON.stringify({test: "data"}))
+}
--- a/browser/installer/allowed-dupes.mn
+++ b/browser/installer/allowed-dupes.mn
@@ -19,17 +19,16 @@ browser/chrome/browser/content/browser/d
 browser/chrome/browser/content/browser/defaultthemes/5.header.png
 browser/chrome/browser/content/browser/extension.svg
 browser/chrome/browser/content/browser/places/bookmarkProperties.xul
 browser/chrome/browser/content/browser/places/bookmarkProperties2.xul
 browser/chrome/browser/skin/classic/browser/addons/addon-install-confirm.svg
 browser/chrome/browser/skin/classic/browser/connection-secure.svg
 browser/chrome/browser/skin/classic/browser/controlcenter/warning-gray.svg
 browser/chrome/browser/skin/classic/browser/newtab/close.png
-browser/chrome/browser/skin/classic/browser/theme-switcher-icon.png
 # devtools reduction is bug 1311178
 browser/chrome/devtools/content/dom/content/dom-view.css
 browser/chrome/devtools/content/dom/dom.html
 browser/chrome/devtools/content/dom/main.js
 browser/chrome/devtools/content/framework/toolbox-options.js
 browser/chrome/devtools/content/inspector/fonts/fonts.js
 browser/chrome/devtools/content/inspector/inspector.xhtml
 browser/chrome/devtools/content/memory/initializer.js
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -586,17 +586,16 @@
 
 ; [Browser Chrome Files]
 @RESPATH@/browser/chrome.manifest
 @RESPATH@/browser/chrome/browser@JAREXT@
 @RESPATH@/browser/chrome/browser.manifest
 @RESPATH@/browser/chrome/pdfjs.manifest
 @RESPATH@/browser/chrome/pdfjs/*
 @RESPATH@/browser/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/chrome.manifest
-@RESPATH@/browser/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/icon.png
 @RESPATH@/browser/extensions/{972ce4c6-7e08-4474-a285-3208198ce6fd}/install.rdf
 @RESPATH@/chrome/toolkit@JAREXT@
 @RESPATH@/chrome/toolkit.manifest
 @RESPATH@/chrome/recording.manifest
 @RESPATH@/chrome/recording/*
 #ifdef MOZ_GTK
 @RESPATH@/browser/chrome/icons/default/default16.png
 @RESPATH@/browser/chrome/icons/default/default32.png
--- a/browser/themes/moz.build
+++ b/browser/themes/moz.build
@@ -7,10 +7,8 @@
 toolkit = CONFIG['MOZ_WIDGET_TOOLKIT']
 
 if toolkit == 'cocoa':
     DIRS += ['osx']
 elif toolkit in ('gtk2', 'gtk3'):
     DIRS += ['linux']
 else:
     DIRS += ['windows']
-
-FINAL_TARGET_FILES.extensions['{972ce4c6-7e08-4474-a285-3208198ce6fd}'] += ['shared/icon.png']
--- a/browser/themes/osx/browser.css
+++ b/browser/themes/osx/browser.css
@@ -3264,20 +3264,16 @@ menulist.translate-infobar-element > .me
   .customization-tipPanel-contentImage:-moz-locale-dir(rtl) {
     list-style-image: url(chrome://browser/skin/customizableui/customize-illustration-rtl@2x.png);
   }
 
   #customization-tipPanel > .panel-arrowcontainer > .panel-arrowbox > .panel-arrow[side="left"],
   #customization-tipPanel > .panel-arrowcontainer > .panel-arrowbox > .panel-arrow[side="right"] {
     list-style-image: url("chrome://browser/skin/customizableui/panelarrow-customizeTip@2x.png");
   }
-
-  .customization-lwtheme-menu-theme[defaulttheme] {
-    list-style-image: url(chrome://browser/skin/theme-switcher-icon@2x.png);
-  }
 }
 
 /* End customization mode */
 
 .private-browsing-indicator {
   background-image: url("chrome://browser/skin/privatebrowsing-mask.png");
   background-repeat: no-repeat;
   background-size: 100% auto;
--- a/browser/themes/shared/customizableui/customizeMode.inc.css
+++ b/browser/themes/shared/customizableui/customizeMode.inc.css
@@ -189,17 +189,17 @@
   /* Sadly, button.css thinks its margins are perfect for everyone. */
   margin-inline-start: 6px !important;
 }
 
 #customization-lwtheme-button > .box-inherit > .box-inherit > .button-icon {
   width: 20px;
   height: 20px;
   border-radius: 2px;
-  background-image: url("chrome://browser/skin/theme-switcher-icon.png");
+  background-image: url("chrome://browser/content/default-theme-icon.svg");
   background-size: contain;
 }
 
 %ifdef CAN_DRAW_IN_TITLEBAR
 #customization-titlebar-visibility-button {
   list-style-image: url("chrome://browser/skin/customizableui/customize-titleBar-toggle.png");
   -moz-image-region: rect(0, 24px, 24px, 0);
 }
@@ -383,17 +383,17 @@ toolbarpaletteitem[place="toolbar"]:not(
   margin: 0 -5px 5px;
   padding-top: 0;
   padding-inline-end: 5px;
   padding-bottom: 0;
   padding-inline-start: 0;
 }
 
 .customization-lwtheme-menu-theme[defaulttheme] {
-  list-style-image: url(chrome://browser/skin/theme-switcher-icon.png);
+  list-style-image: url(chrome://browser/content/default-theme-icon.svg);
 }
 
 .customization-lwtheme-menu-theme[active="true"],
 .customization-lwtheme-menu-theme:hover {
   background-color: var(--arrowpanel-dimmed);
   border-color: var(--panel-separator-color);
 }
 
deleted file mode 100644
index 891e7afb1055e484669e792432ac1df496aa14ca..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/themes/shared/jar.inc.mn
+++ b/browser/themes/shared/jar.inc.mn
@@ -101,18 +101,16 @@
   skin/classic/browser/gear.svg                                (../shared/search/gear.svg)
   skin/classic/browser/tabbrowser/connecting.png               (../shared/tabbrowser/connecting.png)
   skin/classic/browser/tabbrowser/connecting@2x.png            (../shared/tabbrowser/connecting@2x.png)
   skin/classic/browser/tabbrowser/crashed.svg                  (../shared/tabbrowser/crashed.svg)
   skin/classic/browser/tabbrowser/pendingpaint.png             (../shared/tabbrowser/pendingpaint.png)
   skin/classic/browser/tabbrowser/tab-audio.svg                (../shared/tabbrowser/tab-audio.svg)
   skin/classic/browser/tabbrowser/tab-audio-small.svg          (../shared/tabbrowser/tab-audio-small.svg)
   skin/classic/browser/tabbrowser/tab-overflow-indicator.png   (../shared/tabbrowser/tab-overflow-indicator.png)
-  skin/classic/browser/theme-switcher-icon.png                 (../shared/theme-switcher-icon.png)
-  skin/classic/browser/theme-switcher-icon@2x.png              (../shared/theme-switcher-icon@2x.png)
   skin/classic/browser/toolbarbutton-dropdown-arrow.png        (../shared/toolbarbutton-dropdown-arrow.png)
   skin/classic/browser/translating-16.png                      (../shared/translation/translating-16.png)
   skin/classic/browser/translating-16@2x.png                   (../shared/translation/translating-16@2x.png)
   skin/classic/browser/translation-16.png                      (../shared/translation/translation-16.png)
   skin/classic/browser/translation-16@2x.png                   (../shared/translation/translation-16@2x.png)
   skin/classic/browser/undoCloseTab.png                        (../shared/undoCloseTab.png)
   skin/classic/browser/undoCloseTab@2x.png                     (../shared/undoCloseTab@2x.png)
   skin/classic/browser/update-badge.svg                        (../shared/update-badge.svg)
deleted file mode 100644
index 891e7afb1055e484669e792432ac1df496aa14ca..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 286adfeaad64110999418d055e58ff097ef56c78..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/devtools/client/shared/widgets/tooltip/ImageTooltipHelper.js
+++ b/devtools/client/shared/widgets/tooltip/ImageTooltipHelper.js
@@ -114,22 +114,17 @@ function setImageTooltip(tooltip, doc, i
  *
  * @param {HTMLTooltip} tooltip
  *        The tooltip instance on which the image preview content should be set
  * @param {Document} doc
  *        A document element to create the HTML elements needed for the tooltip
  */
 function setBrokenImageTooltip(tooltip, doc) {
   let div = doc.createElementNS(XHTML_NS, "div");
-  div.style.cssText = `
-    box-sizing: border-box;
-    height: 100%;
-    text-align: center;
-    line-height: 30px;`;
-
+  div.className = "theme-comment devtools-tooltip-image-broken";
   let message = L10N.getStr("previewTooltip.image.brokenImage");
   div.textContent = message;
   tooltip.setContent(div, {width: 150, height: 30});
 }
 
 module.exports.getImageDimensions = getImageDimensions;
 module.exports.setImageTooltip = setImageTooltip;
 module.exports.setBrokenImageTooltip = setBrokenImageTooltip;
--- a/devtools/client/themes/tooltips.css
+++ b/devtools/client/themes/tooltips.css
@@ -441,8 +441,17 @@
 #searchbox-panel-listbox .autocomplete-item > .initial-value {
   max-width: 130px;
   margin-left: 15px;
 }
 
 #searchbox-panel-listbox .autocomplete-item > .autocomplete-value {
   max-width: 150px;
 }
+
+/* Tooltip: Image tooltip */
+
+.devtools-tooltip-image-broken {
+  box-sizing: border-box;
+  height: 100%;
+  text-align: center;
+  line-height: 30px;
+}
--- a/dom/animation/KeyframeEffectReadOnly.h
+++ b/dom/animation/KeyframeEffectReadOnly.h
@@ -43,18 +43,18 @@ class ErrorResult;
 struct TimingParams;
 
 namespace dom {
 class ElementOrCSSPseudoElement;
 class GlobalObject;
 class OwningElementOrCSSPseudoElement;
 class UnrestrictedDoubleOrKeyframeAnimationOptions;
 class UnrestrictedDoubleOrKeyframeEffectOptions;
-enum class IterationCompositeOperation : uint32_t;
-enum class CompositeOperation : uint32_t;
+enum class IterationCompositeOperation : uint8_t;
+enum class CompositeOperation : uint8_t;
 struct AnimationPropertyDetails;
 }
 
 /**
  * A property-value pair specified on a keyframe.
  */
 struct PropertyValuePair
 {
--- a/dom/base/nsGlobalWindow.h
+++ b/dom/base/nsGlobalWindow.h
@@ -110,17 +110,17 @@ class BarProp;
 struct ChannelPixelLayout;
 class Console;
 class Crypto;
 class CustomElementRegistry;
 class DocGroup;
 class External;
 class Function;
 class Gamepad;
-enum class ImageBitmapFormat : uint32_t;
+enum class ImageBitmapFormat : uint8_t;
 class IdleRequest;
 class IdleRequestCallback;
 class Location;
 class MediaQueryList;
 class MozSelfSupport;
 class Navigator;
 class OwningExternalOrWindowProxy;
 class Promise;
--- a/dom/base/nsIDocument.h
+++ b/dom/base/nsIDocument.h
@@ -144,17 +144,17 @@ class ImportManager;
 class HTMLBodyElement;
 struct LifecycleCallbackArgs;
 class Link;
 class Location;
 class MediaQueryList;
 class GlobalObject;
 class NodeFilter;
 class NodeIterator;
-enum class OrientationType : uint32_t;
+enum class OrientationType : uint8_t;
 class ProcessingInstruction;
 class Promise;
 class StyleSheetList;
 class SVGDocument;
 class SVGSVGElement;
 class Touch;
 class TouchList;
 class TreeWalker;
@@ -3040,19 +3040,20 @@ protected:
 
   // Whether this document has (or will have, once we have a pres shell) a
   // Gecko- or Servo-backed style system.
   mozilla::StyleBackendType mStyleBackendType;
 
 #ifdef MOZILLA_INTERNAL_API
   // Our visibility state
   mozilla::dom::VisibilityState mVisibilityState;
-  static_assert(sizeof(mozilla::dom::VisibilityState) == sizeof(uint32_t), "Error size of mVisibilityState and mDummy");
+  static_assert(sizeof(mozilla::dom::VisibilityState) == sizeof(uint8_t),
+                "Error size of mVisibilityState and mDummy");
 #else
-  uint32_t mDummy;
+  uint8_t mDummy;
 #endif
 
   // True if BIDI is enabled.
   bool mBidiEnabled : 1;
   // True if a MathML element has ever been owned by this document.
   bool mMathMLEnabled : 1;
 
   // True if this document is the initial document for a window.  This should
--- a/dom/bindings/Codegen.py
+++ b/dom/bindings/Codegen.py
@@ -9620,25 +9620,35 @@ class CGEnum(CGThing):
         self.cgThings = CGList([strings, toJSValue], "\n")
 
     def stringsNamespace(self):
         return self.enum.identifier.name + "Values"
 
     def nEnumStrings(self):
         return len(self.enum.values()) + 1
 
+    def underlyingType(self):
+        count = self.nEnumStrings()
+        if count <= 256:
+            return "uint8_t"
+        if count <= 65536:
+            return "uint16_t"
+        raise ValueError("Enum " + self.enum.identifier.name +
+                         " has more than 65536 values")
+
     def declare(self):
         decl = fill(
             """
-            enum class ${name} : uint32_t {
+            enum class ${name} : ${ty} {
               $*{enums}
               EndGuard_
             };
             """,
             name=self.enum.identifier.name,
+            ty=self.underlyingType(),
             enums=",\n".join(map(getEnumValueName, self.enum.values())) + ",\n")
         strings = CGNamespace(self.stringsNamespace(),
                               CGGeneric(declare="extern const EnumEntry %s[%d];\n"
                                         % (ENUM_ENTRY_VARIABLE_NAME, self.nEnumStrings())))
         return decl + "\n" + self.cgThings.declare()
 
     def define(self):
         return self.cgThings.define()
--- a/dom/cache/CacheStorage.h
+++ b/dom/cache/CacheStorage.h
@@ -23,17 +23,17 @@ namespace mozilla {
 class ErrorResult;
 
 namespace ipc {
   class PrincipalInfo;
 } // namespace ipc
 
 namespace dom {
 
-enum class CacheStorageNamespace : uint32_t;
+enum class CacheStorageNamespace : uint8_t;
 class Promise;
 
 namespace workers {
   class WorkerPrivate;
 } // namespace workers
 
 namespace cache {
 
--- a/dom/canvas/CanvasPath.h
+++ b/dom/canvas/CanvasPath.h
@@ -10,17 +10,17 @@
 #include "nsWrapperCache.h"
 #include "mozilla/gfx/2D.h"
 #include "mozilla/dom/BindingDeclarations.h"
 #include "mozilla/ErrorResult.h"
 
 namespace mozilla {
 namespace dom {
 
-enum class CanvasWindingRule : uint32_t;
+enum class CanvasWindingRule : uint8_t;
 class SVGMatrix;
 
 class CanvasPath final :
   public nsWrapperCache
 {
 public:
   NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(CanvasPath)
   NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(CanvasPath)
--- a/dom/canvas/ImageBitmap.h
+++ b/dom/canvas/ImageBitmap.h
@@ -47,17 +47,17 @@ class CanvasRenderingContext2D;
 struct ChannelPixelLayout;
 class CreateImageBitmapFromBlob;
 class CreateImageBitmapFromBlobTask;
 class CreateImageBitmapFromBlobWorkerTask;
 class File;
 class HTMLCanvasElement;
 class HTMLImageElement;
 class HTMLVideoElement;
-enum class ImageBitmapFormat : uint32_t;
+enum class ImageBitmapFormat : uint8_t;
 class ImageData;
 class ImageUtils;
 template<typename T> class MapDataIntoBufferSource;
 class Promise;
 class PostMessageEvent; // For StructuredClone between windows.
 
 struct ImageBitmapCloneData final
 {
--- a/dom/canvas/ImageUtils.h
+++ b/dom/canvas/ImageUtils.h
@@ -16,17 +16,17 @@ namespace layers {
 class Image;
 }
 
 class ErrorResult;
 
 namespace dom {
 
 struct ChannelPixelLayout;
-enum class ImageBitmapFormat : uint32_t;
+enum class ImageBitmapFormat : uint8_t;
 
 typedef nsTArray<ChannelPixelLayout> ImagePixelLayout;
 
 /*
  * ImageUtils is a wrapper around layers::Image. It provides three unified
  * methods to all sub-classes of layers::Image, which are:
  *
  * (1) GetFormat() converts the image's format into ImageBitmapFormat enum.
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -4468,18 +4468,21 @@ void HTMLMediaElement::UnbindFromTree(bo
   RunInStableState(task);
 }
 
 /* static */
 CanPlayStatus
 HTMLMediaElement::GetCanPlay(const nsAString& aType,
                              DecoderDoctorDiagnostics* aDiagnostics)
 {
-  MediaContentType contentType{aType};
-  return DecoderTraits::CanHandleContentType(contentType, aDiagnostics);
+  Maybe<MediaContentType> contentType = MakeMediaContentType(aType);
+  if (!contentType) {
+    return CANPLAY_NO;
+  }
+  return DecoderTraits::CanHandleContentType(*contentType, aDiagnostics);
 }
 
 NS_IMETHODIMP
 HTMLMediaElement::CanPlayType(const nsAString& aType, nsAString& aResult)
 {
   DecoderDoctorDiagnostics diagnostics;
   CanPlayStatus canPlay = GetCanPlay(aType, &diagnostics);
   diagnostics.StoreFormatDiagnostics(
--- a/dom/html/nsBrowserElement.h
+++ b/dom/html/nsBrowserElement.h
@@ -17,18 +17,18 @@ class nsFrameLoader;
 
 namespace mozilla {
 
 namespace dom {
 struct BrowserElementDownloadOptions;
 struct BrowserElementExecuteScriptOptions;
 class BrowserElementNextPaintEventCallback;
 class DOMRequest;
-enum class BrowserFindCaseSensitivity: uint32_t;
-enum class BrowserFindDirection: uint32_t;
+enum class BrowserFindCaseSensitivity: uint8_t;
+enum class BrowserFindDirection: uint8_t;
 } // namespace dom
 
 class ErrorResult;
 
 /**
  * A helper class for browser-element frames
  */
 class nsBrowserElement
--- a/dom/ipc/TabChild.cpp
+++ b/dom/ipc/TabChild.cpp
@@ -383,23 +383,16 @@ TabChild::TabChild(nsIContentChild* aMan
   , mDidSetRealShowInfo(false)
   , mDidLoadURLInit(false)
   , mIsFreshProcess(false)
   , mLayerObserverEpoch(0)
 #if defined(XP_WIN) && defined(ACCESSIBILITY)
   , mNativeWindowHandle(0)
 #endif
 {
-  // In the general case having the TabParent tell us if APZ is enabled or not
-  // doesn't really work because the TabParent itself may not have a reference
-  // to the owning widget during initialization. Instead we assume that this
-  // TabChild corresponds to a widget type that would have APZ enabled, and just
-  // check the other conditions necessary for enabling APZ.
-  mAsyncPanZoomEnabled = gfxPlatform::AsyncPanZoomEnabled();
-
   nsWeakPtr weakPtrThis(do_GetWeakReference(static_cast<nsITabChild*>(this)));  // for capture by the lambda
   mSetAllowedTouchBehaviorCallback = [weakPtrThis](uint64_t aInputBlockId,
                                                    const nsTArray<TouchBehaviorFlags>& aFlags)
   {
     if (nsCOMPtr<nsITabChild> tabChild = do_QueryReferent(weakPtrThis)) {
       static_cast<TabChild*>(tabChild.get())->SetAllowedTouchBehavior(aInputBlockId, aFlags);
     }
   };
@@ -426,16 +419,25 @@ TabChild::TabChild(nsIContentChild* aMan
     }
   }
 
   for (uint32_t idx = 0; idx < NUMBER_OF_AUDIO_CHANNELS; idx++) {
     mAudioChannelsActive.AppendElement(false);
   }
 }
 
+bool
+TabChild::AsyncPanZoomEnabled() const
+{
+  // If we have received the CompositorOptions we can answer definitively. If
+  // not, return a best guess based on gfxPlaform values.
+  return mCompositorOptions ? mCompositorOptions->UseAPZ()
+                            : gfxPlatform::AsyncPanZoomEnabled();
+}
+
 NS_IMETHODIMP
 TabChild::Observe(nsISupports *aSubject,
                   const char *aTopic,
                   const char16_t *aData)
 {
   if (!strcmp(aTopic, BEFORE_FIRST_PAINT)) {
     if (AsyncPanZoomEnabled()) {
       nsCOMPtr<nsIDocument> subject(do_QueryInterface(aSubject));
@@ -2497,16 +2499,20 @@ TabChild::InitRenderingState(const Textu
     // Pushing layers transactions directly to a separate
     // compositor context.
     PCompositorBridgeChild* compositorChild = CompositorBridgeChild::Get();
     if (!compositorChild) {
       NS_WARNING("failed to get CompositorBridgeChild instance");
       return;
     }
 
+    CompositorOptions options;
+    Unused << compositorChild->SendGetCompositorOptions(aLayersId, &options);
+    mCompositorOptions = Some(options);
+
     ShadowLayerForwarder* lf =
         mPuppetWidget->GetLayerManager(
             nullptr, mTextureFactoryIdentifier.mParentBackend)
                 ->AsShadowForwarder();
     // As long as we are creating a ClientLayerManager for the puppet widget,
     // lf must be non-null here.
     MOZ_ASSERT(lf);
 
@@ -2545,21 +2551,20 @@ TabChild::InitRenderingState(const Textu
                                      BEFORE_FIRST_PAINT,
                                      false);
     }
 }
 
 void
 TabChild::InitAPZState()
 {
-  auto cbc = CompositorBridgeChild::Get();
-
-  if (!cbc->GetAPZEnabled(mLayersId)) {
+  if (!mCompositorOptions->UseAPZ()) {
     return;
   }
+  auto cbc = CompositorBridgeChild::Get();
 
   // Initialize the ApzcTreeManager. This takes multiple casts because of ugly multiple inheritance.
   PAPZCTreeManagerChild* baseProtocol = cbc->SendPAPZCTreeManagerConstructor(mLayersId);
   APZCTreeManagerChild* derivedProtocol = static_cast<APZCTreeManagerChild*>(baseProtocol);
 
   mApzcTreeManager = RefPtr<IAPZCTreeManager>(derivedProtocol);
 
   // Initialize the GeckoContentController for this tab. We don't hold a reference because we don't need it.
@@ -2889,16 +2894,22 @@ TabChild::ReinitRendering()
   // will send a sync message to the Compositor of the widget owning this tab.
   // This guarantees the correct association is in place before our
   // PLayerTransaction constructor message arrives on the cross-process
   // compositor bridge.
   SendEnsureLayersConnected();
 
   RefPtr<CompositorBridgeChild> cb = CompositorBridgeChild::Get();
 
+  // Refresh the compositor options since we may now be attached to a different
+  // compositor than we were previously.
+  CompositorOptions options;
+  Unused << cb->SendGetCompositorOptions(mLayersId, &options);
+  mCompositorOptions = Some(options);
+
   bool success;
   nsTArray<LayersBackend> ignored;
   PLayerTransactionChild* shadowManager =
     cb->SendPLayerTransactionConstructor(ignored, LayersId(), &mTextureFactoryIdentifier, &success);
   if (!success) {
     NS_WARNING("failed to re-allocate layer transaction");
     return;
   }
--- a/dom/ipc/TabChild.h
+++ b/dom/ipc/TabChild.h
@@ -28,16 +28,17 @@
 #include "nsITooltipListener.h"
 #include "mozilla/Attributes.h"
 #include "mozilla/dom/TabContext.h"
 #include "mozilla/DOMEventTargetHelper.h"
 #include "mozilla/EventDispatcher.h"
 #include "mozilla/EventForwards.h"
 #include "mozilla/layers/CompositorTypes.h"
 #include "mozilla/layers/APZCCallbackHelper.h"
+#include "mozilla/layers/CompositorOptions.h"
 #include "nsIWebBrowserChrome3.h"
 #include "mozilla/dom/ipc/IdType.h"
 #include "AudioChannelService.h"
 #include "PuppetWidget.h"
 #include "mozilla/layers/GeckoContentController.h"
 #include "nsISHistoryListener.h"
 #include "nsIPartialSHistoryListener.h"
 
@@ -612,17 +613,17 @@ public:
 
   bool IPCOpen() const { return mIPCOpen; }
 
   bool ParentIsActive() const
   {
     return mParentIsActive;
   }
 
-  bool AsyncPanZoomEnabled() const { return mAsyncPanZoomEnabled; }
+  bool AsyncPanZoomEnabled() const;
 
   virtual ScreenIntSize GetInnerSize() override;
 
   // Call RecvShow(nsIntSize(0, 0)) and block future calls to RecvShow().
   void DoFakeShow(const TextureFactoryIdentifier& aTextureFactoryIdentifier,
                   const uint64_t& aLayersId,
                   PRenderFrameChild* aRenderFrame,
                   const ShowInfo& aShowInfo);
@@ -771,26 +772,29 @@ private:
   bool mHasValidInnerSize;
   bool mDestroyed;
   // Position of client area relative to the outer window
   LayoutDeviceIntPoint mClientOffset;
   // Position of tab, relative to parent widget (typically the window)
   LayoutDeviceIntPoint mChromeDisp;
   TabId mUniqueId;
 
+  // Holds the compositor options for the compositor rendering this tab,
+  // once we find out which compositor that is.
+  Maybe<mozilla::layers::CompositorOptions> mCompositorOptions;
+
   friend class ContentChild;
   float mDPI;
   int32_t mRounding;
   double mDefaultScale;
 
   bool mIsTransparent;
 
   bool mIPCOpen;
   bool mParentIsActive;
-  bool mAsyncPanZoomEnabled;
   CSSSize mUnscaledInnerSize;
   bool mDidSetRealShowInfo;
   bool mDidLoadURLInit;
   bool mIsFreshProcess;
 
   AutoTArray<bool, NUMBER_OF_AUDIO_CHANNELS> mAudioChannelsActive;
 
   RefPtr<layers::IAPZCTreeManager> mApzcTreeManager;
--- a/dom/media/DecoderTraits.cpp
+++ b/dom/media/DecoderTraits.cpp
@@ -139,18 +139,21 @@ IsMP4SupportedType(const MediaContentTyp
                    DecoderDoctorDiagnostics* aDiagnostics)
 {
   return MP4Decoder::CanHandleMediaType(aParsedType, aDiagnostics);
 }
 static bool
 IsMP4SupportedType(const nsACString& aType,
                    DecoderDoctorDiagnostics* aDiagnostics)
 {
-  MediaContentType contentType{aType};
-  return IsMP4SupportedType(contentType, aDiagnostics);
+  Maybe<MediaContentType> contentType = MakeMediaContentType(aType);
+  if (!contentType) {
+    return false;
+  }
+  return IsMP4SupportedType(*contentType, aDiagnostics);
 }
 #endif
 
 /* static */ bool
 DecoderTraits::IsMP4TypeAndEnabled(const nsACString& aType,
                                    DecoderDoctorDiagnostics* aDiagnostics)
 {
 #ifdef MOZ_FMP4
@@ -188,17 +191,16 @@ IsFlacSupportedType(const nsACString& aT
   return FlacDecoder::CanHandleMediaType(aType, aCodecs);
 }
 
 static
 CanPlayStatus
 CanHandleCodecsType(const MediaContentType& aType,
                     DecoderDoctorDiagnostics* aDiagnostics)
 {
-  MOZ_ASSERT(aType.IsValid());
   // We should have been given a codecs string, though it may be empty.
   MOZ_ASSERT(aType.HaveCodecs());
 
   char const* const* codecList = nullptr;
   if (IsOggTypeAndEnabled(aType.GetMIMEType())) {
     if (IsOggSupportedType(aType.GetMIMEType(), aType.GetCodecs())) {
       return CANPLAY_YES;
     } else {
@@ -334,20 +336,16 @@ CanHandleMediaType(const MediaContentTyp
   return CANPLAY_NO;
 }
 
 /* static */
 CanPlayStatus
 DecoderTraits::CanHandleContentType(const MediaContentType& aContentType,
                                     DecoderDoctorDiagnostics* aDiagnostics)
 {
-  if (!aContentType.IsValid()) {
-    return CANPLAY_NO;
-  }
-
   return CanHandleMediaType(aContentType, aDiagnostics);
 }
 
 /* static */
 bool DecoderTraits::ShouldHandleMediaType(const char* aMIMEType,
                                           DecoderDoctorDiagnostics* aDiagnostics)
 {
   if (IsWaveSupportedType(nsDependentCString(aMIMEType))) {
@@ -365,18 +363,21 @@ bool DecoderTraits::ShouldHandleMediaTyp
   if (nsDependentCString(aMIMEType).EqualsASCII("video/quicktime")) {
     RefPtr<nsPluginHost> pluginHost = nsPluginHost::GetInst();
     if (pluginHost &&
         pluginHost->HavePluginForType(nsDependentCString(aMIMEType))) {
       return false;
     }
   }
 
-  MediaContentType parsed{nsDependentCString(aMIMEType)};
-  return CanHandleMediaType(parsed, aDiagnostics)
+  Maybe<MediaContentType> parsed = MakeMediaContentType(aMIMEType);
+  if (!parsed) {
+    return false;
+  }
+  return CanHandleMediaType(*parsed, aDiagnostics)
          != CANPLAY_NO;
 }
 
 // Instantiates but does not initialize decoder.
 static
 already_AddRefed<MediaDecoder>
 InstantiateDecoder(const nsACString& aType,
                    MediaDecoderOwner* aOwner,
--- a/dom/media/MediaContentType.cpp
+++ b/dom/media/MediaContentType.cpp
@@ -5,27 +5,16 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "MediaContentType.h"
 
 #include "nsContentTypeParser.h"
 
 namespace mozilla {
 
-MediaContentType::MediaContentType(const nsAString& aType)
-{
-  Populate(aType);
-}
-
-MediaContentType::MediaContentType(const nsACString& aType)
-{
-  NS_ConvertUTF8toUTF16 typeUTF16(aType);
-  Populate(typeUTF16);
-}
-
 static int32_t
 GetParameterAsNumber(const nsContentTypeParser& aParser,
                      const char* aParameter,
                      const int32_t aErrorReturn)
 {
   nsAutoString parameterString;
   nsresult rv = aParser.GetParameter(aParameter, parameterString);
   if (NS_FAILED_impl(rv)) {
@@ -33,28 +22,59 @@ GetParameterAsNumber(const nsContentType
   }
   int32_t number = parameterString.ToInteger(&rv);
   if (MOZ_UNLIKELY(NS_FAILED_impl(rv))) {
     return aErrorReturn;
   }
   return number;
 }
 
-void
+bool
 MediaContentType::Populate(const nsAString& aType)
 {
+  MOZ_ASSERT(NS_IsMainThread());
+
   nsContentTypeParser parser(aType);
   nsAutoString mime;
   nsresult rv = parser.GetType(mime);
-  if (NS_SUCCEEDED(rv)) {
-    mMIMEType = NS_ConvertUTF16toUTF8(mime);
+  if (!NS_SUCCEEDED(rv) || mime.IsEmpty()) {
+    return false;
   }
 
+  mMIMEType = NS_ConvertUTF16toUTF8(mime);
+
   rv = parser.GetParameter("codecs", mCodecs);
   mHaveCodecs = NS_SUCCEEDED(rv);
 
   mWidth = GetParameterAsNumber(parser, "width", -1);
   mHeight = GetParameterAsNumber(parser, "height", -1);
   mFramerate = GetParameterAsNumber(parser, "framerate", -1);
   mBitrate = GetParameterAsNumber(parser, "bitrate", -1);
+
+  return true;
+}
+
+Maybe<MediaContentType>
+MakeMediaContentType(const nsAString& aType)
+{
+  Maybe<MediaContentType> type{Some(MediaContentType{})};
+  if (!type->Populate(aType)) {
+    type.reset();
+  }
+  return type;
+}
+
+Maybe<MediaContentType>
+MakeMediaContentType(const nsACString& aType)
+{
+  return MakeMediaContentType(NS_ConvertUTF8toUTF16(aType));
+}
+
+Maybe<MediaContentType>
+MakeMediaContentType(const char* aType)
+{
+  if (!aType) {
+    return Nothing();
+  }
+  return MakeMediaContentType(nsDependentCString(aType));
 }
 
 } // namespace mozilla
--- a/dom/media/MediaContentType.h
+++ b/dom/media/MediaContentType.h
@@ -12,49 +12,47 @@
 
 namespace mozilla {
 
 // Structure containing pre-parsed content type parameters, e.g.:
 // MIME type, optional codecs, etc.
 class MediaContentType
 {
 public:
-  // Parse UTF16 string to extract parameters.
-  explicit MediaContentType(const nsAString& aType);
-  // Parse UTF8 string to extract parameters.
-  explicit MediaContentType(const nsACString& aType);
-
-  bool IsValid() const { return !GetMIMEType().IsEmpty(); }
-
-  // MIME type. Empty if construction arguments could not be parsed.
+  // MIME type. Guaranteed not to be empty.
   const nsACString& GetMIMEType() const { return mMIMEType; }
 
   // Was there an explicit 'codecs' parameter provided?
   bool HaveCodecs() const { return mHaveCodecs; }
   // Codecs. May be empty if not provided or explicitly provided as empty.
   const nsAString& GetCodecs() const { return mCodecs; }
 
   // Sizes and rates.
   Maybe<int32_t> GetWidth() const { return GetMaybeNumber(mWidth); }
   Maybe<int32_t> GetHeight() const { return GetMaybeNumber(mHeight); }
   Maybe<int32_t> GetFramerate() const { return GetMaybeNumber(mFramerate); }
   Maybe<int32_t> GetBitrate() const { return GetMaybeNumber(mBitrate); }
 
 private:
-  void Populate(const nsAString& aType);
+  friend Maybe<MediaContentType> MakeMediaContentType(const nsAString& aType);
+  bool Populate(const nsAString& aType);
 
   Maybe<int32_t> GetMaybeNumber(int32_t aNumber) const
   {
     return (aNumber < 0) ? Maybe<int32_t>(Nothing()) : Some(int32_t(aNumber));
   }
 
-  nsCString mMIMEType; // UTF8 MIME type. Empty if parsing failed.
+  nsCString mMIMEType; // UTF8 MIME type.
   bool mHaveCodecs; // If false, mCodecs must be empty.
   nsString mCodecs;
   int32_t mWidth; // -1 if not provided.
   int32_t mHeight; // -1 if not provided.
   int32_t mFramerate; // -1 if not provided.
   int32_t mBitrate; // -1 if not provided.
 };
 
+Maybe<MediaContentType> MakeMediaContentType(const nsAString& aType);
+Maybe<MediaContentType> MakeMediaContentType(const nsACString& aType);
+Maybe<MediaContentType> MakeMediaContentType(const char* aType);
+
 } // namespace mozilla
 
 #endif // MediaContentType_h_
--- a/dom/media/VideoUtils.h
+++ b/dom/media/VideoUtils.h
@@ -357,36 +357,52 @@ CreateTrackInfoWithMIMEType(const nsACSt
 
 // Try and create a TrackInfo with a given codec MIME type, and optional extra
 // parameters from a content type (its MIME type and codecs are ignored).
 UniquePtr<TrackInfo>
 CreateTrackInfoWithMIMETypeAndContentTypeExtraParameters(
   const nsACString& aCodecMIMEType,
   const MediaContentType& aContentType);
 
-template <typename String>
+enum class StringListRangeEmptyItems
+{
+  // Skip all empty items (empty string will process nothing)
+  // E.g.: "a,,b" -> ["a", "b"], "" -> nothing
+  Skip,
+  // Process all, except if string is empty
+  // E.g.: "a,,b" -> ["a", "", "b"], "" -> nothing
+  ProcessEmptyItems,
+  // Process all, including 1 empty item in an empty string
+  // E.g.: "a,,b" -> ["a", "", "b"], "" -> [""]
+  ProcessAll
+};
+
+template <typename String,
+          StringListRangeEmptyItems empties = StringListRangeEmptyItems::Skip>
 class StringListRange
 {
   typedef typename String::char_type CharType;
   typedef const CharType* Pointer;
 
 public:
-  // Iterator into range, trims items and skips empty items.
+  // Iterator into range, trims items and optionally skips empty items.
   class Iterator
   {
   public:
     bool operator!=(const Iterator& a) const
     {
       return mStart != a.mStart || mEnd != a.mEnd;
     }
     Iterator& operator++()
     {
       SearchItemAt(mComma + 1);
       return *this;
     }
+    // DereferencedType should be 'const nsDependent[C]String' pointing into
+    // mList (which is 'const ns[C]String&').
     typedef decltype(Substring(Pointer(), Pointer())) DereferencedType;
     DereferencedType operator*()
     {
       return Substring(mStart, mEnd);
     }
   private:
     friend class StringListRange;
     Iterator(const CharType* aRangeStart, uint32_t aLength)
@@ -394,22 +410,31 @@ public:
     {
       SearchItemAt(aRangeStart);
     }
     void SearchItemAt(Pointer start)
     {
       // First, skip leading whitespace.
       for (Pointer p = start; ; ++p) {
         if (p >= mRangeEnd) {
-          mStart = mEnd = mComma = mRangeEnd;
+          if (p > mRangeEnd
+                  + (empties != StringListRangeEmptyItems::Skip ? 1 : 0)) {
+            p = mRangeEnd
+                + (empties != StringListRangeEmptyItems::Skip ? 1 : 0);
+          }
+          mStart = mEnd = mComma = p;
           return;
         }
         auto c = *p;
         if (c == CharType(',')) {
-          // Comma -> Empty item -> Skip.
+          // Comma -> Empty item -> Skip or process?
+          if (empties != StringListRangeEmptyItems::Skip) {
+            mStart = mEnd = mComma = p;
+            return;
+          }
         } else if (c != CharType(' ')) {
           mStart = p;
           break;
         }
       }
       // Find comma, recording start of trailing space.
       Pointer trailingWhitespace = nullptr;
       for (Pointer p = mStart + 1; ; ++p) {
@@ -439,40 +464,47 @@ public:
     }
     const Pointer mRangeEnd;
     Pointer mStart;
     Pointer mEnd;
     Pointer mComma;
   };
 
   explicit StringListRange(const String& aList) : mList(aList) {}
-  Iterator begin()
+  Iterator begin() const
   {
-    return Iterator(mList.Data(), mList.Length());
+    return Iterator(mList.Data()
+                    + ((empties == StringListRangeEmptyItems::ProcessEmptyItems
+                        && mList.Length() == 0) ? 1 : 0),
+                    mList.Length());
   }
-  Iterator end()
+  Iterator end() const
   {
-    return Iterator(mList.Data() + mList.Length(), 0);
+    return Iterator(mList.Data() + mList.Length()
+                    + (empties != StringListRangeEmptyItems::Skip ? 1 : 0),
+                    0);
   }
 private:
   const String& mList;
 };
 
-template <typename String>
-StringListRange<String>
+template <StringListRangeEmptyItems empties = StringListRangeEmptyItems::Skip,
+          typename String>
+StringListRange<String, empties>
 MakeStringListRange(const String& aList)
 {
-  return StringListRange<String>(aList);
+  return StringListRange<String, empties>(aList);
 }
 
-template <typename ListString, typename ItemString>
+template <StringListRangeEmptyItems empties = StringListRangeEmptyItems::Skip,
+          typename ListString, typename ItemString>
 static bool
 StringListContains(const ListString& aList, const ItemString& aItem)
 {
-  for (const auto& listItem : MakeStringListRange(aList)) {
+  for (const auto& listItem : MakeStringListRange<empties>(aList)) {
     if (listItem.Equals(aItem)) {
       return true;
     }
   }
   return false;
 }
 
 } // end namespace mozilla
--- a/dom/media/gtest/TestVideoUtils.cpp
+++ b/dom/media/gtest/TestVideoUtils.cpp
@@ -9,72 +9,107 @@
 
 using namespace mozilla;
 
 TEST(StringListRange, MakeStringListRange)
 {
   static const struct
   {
     const char* mList;
-    const char* mExpected;
+    const char* mExpectedSkipEmpties;
+    const char* mExpectedProcessAll;
+    const char* mExpectedProcessEmpties;
   } tests[] =
-  {
-    { "", "" },
-    { " ", "" },
-    { ",", "" },
-    { " , ", "" },
-    { "a", "a|" },
-    { "  a  ", "a|" },
-    { "aa,bb", "aa|bb|" },
-    { " a a ,  b b  ", "a a|b b|" },
-    { " , ,a 1,,  ,b  2,", "a 1|b  2|" }
+  { // string              skip         all               empties
+    { "",                  "",          "|",              "" },
+    { " ",                 "",          "|",              "|" },
+    { ",",                 "",          "||",             "||" },
+    { " , ",               "",          "||",             "||" },
+    { "a",                 "a|",        "a|",             "a|" },
+    { "  a  ",             "a|",        "a|",             "a|" },
+    { "a,",                "a|",        "a||",            "a||" },
+    { "a, ",               "a|",        "a||",            "a||" },
+    { ",a",                "a|",        "|a|",            "|a|" },
+    { " ,a",               "a|",        "|a|",            "|a|" },
+    { "aa,bb",             "aa|bb|",    "aa|bb|",         "aa|bb|" },
+    { " a a ,  b b  ",     "a a|b b|",  "a a|b b|",       "a a|b b|" },
+    { " , ,a 1,,  ,b  2,", "a 1|b  2|", "||a 1|||b  2||", "||a 1|||b  2||" }
   };
 
   for (const auto& test : tests) {
     nsCString list(test.mList);
     nsCString out;
     for (const auto& item : MakeStringListRange(list)) {
       out += item;
       out += "|";
     }
-    EXPECT_STREQ(test.mExpected, out.Data());
+    EXPECT_STREQ(test.mExpectedSkipEmpties, out.Data());
+    out.SetLength(0);
+
+    for (const auto& item :
+         MakeStringListRange<StringListRangeEmptyItems::ProcessAll>(list)) {
+      out += item;
+      out += "|";
+    }
+    EXPECT_STREQ(test.mExpectedProcessAll, out.Data());
+    out.SetLength(0);
+
+    for (const auto& item :
+         MakeStringListRange<StringListRangeEmptyItems::ProcessEmptyItems>(list)) {
+      out += item;
+      out += "|";
+    }
+    EXPECT_STREQ(test.mExpectedProcessEmpties, out.Data());
   }
 }
 
 TEST(StringListRange, StringListContains)
 {
   static const struct
   {
     const char* mList;
     const char* mItemToSearch;
-    bool mExpected;
+    bool mExpectedSkipEmpties;
+    bool mExpectedProcessAll;
+    bool mExpectedProcessEmpties;
   } tests[] =
-  {
-    { "", "", false },
-    { "", "a", false },
-    { " ", "a", false },
-    { ",", "a", false },
-    { " , ", "", false },
-    { " , ", "a", false },
-    { "a", "a", true },
-    { "a", "b", false },
-    { "  a  ", "a", true },
-    { "aa,bb", "aa", true },
-    { "aa,bb", "bb", true },
-    { "aa,bb", "cc", false },
-    { "aa,bb", " aa ", false },
-    { " a a ,  b b  ", "a a", true },
-    { " , ,a 1,,  ,b  2,", "a 1", true },
-    { " , ,a 1,,  ,b  2,", "b  2", true },
-    { " , ,a 1,,  ,b  2,", "", false },
-    { " , ,a 1,,  ,b  2,", " ", false },
-    { " , ,a 1,,  ,b  2,", "A 1", false },
-    { " , ,A 1,,  ,b  2,", "a 1", false }
+  { // haystack            needle  skip   all    empties
+    { "",                  "",     false, true,  false },
+    { " ",                 "",     false, true,  true  },
+    { "",                  "a",    false, false, false },
+    { " ",                 "a",    false, false, false },
+    { ",",                 "a",    false, false, false },
+    { " , ",               "",     false, true,  true  },
+    { " , ",               "a",    false, false, false },
+    { "a",                 "a",    true,  true,  true  },
+    { "a",                 "b",    false, false, false },
+    { "  a  ",             "a",    true,  true,  true  },
+    { "aa,bb",             "aa",   true,  true,  true  },
+    { "aa,bb",             "bb",   true,  true,  true  },
+    { "aa,bb",             "cc",   false, false, false },
+    { "aa,bb",             " aa ", false, false, false },
+    { " a a ,  b b  ",     "a a",  true,  true,  true  },
+    { " , ,a 1,,  ,b  2,", "a 1",  true,  true,  true  },
+    { " , ,a 1,,  ,b  2,", "b  2", true,  true,  true  },
+    { " , ,a 1,,  ,b  2,", "",     false, true,  true  },
+    { " , ,a 1,,  ,b  2,", " ",    false, false, false },
+    { " , ,a 1,,  ,b  2,", "A 1",  false, false, false },
+    { " , ,A 1,,  ,b  2,", "a 1",  false, false, false }
   };
 
   for (const auto& test : tests) {
     nsCString list(test.mList);
     nsCString itemToSearch(test.mItemToSearch);
-    EXPECT_EQ(test.mExpected, StringListContains(list, itemToSearch))
+    EXPECT_EQ(test.mExpectedSkipEmpties, StringListContains(list, itemToSearch))
+      << "trying to find \"" << itemToSearch.Data()
+      << "\" in \"" << list.Data() << "\" (skipping empties)";
+    EXPECT_EQ(test.mExpectedProcessAll,
+              StringListContains<StringListRangeEmptyItems::ProcessAll>
+                                (list, itemToSearch))
       << "trying to find \"" << itemToSearch.Data()
-      << "\" in \"" << list.Data() << "\"";
+      << "\" in \"" << list.Data() << "\" (processing everything)";
+    EXPECT_EQ(test.mExpectedProcessEmpties,
+              StringListContains<StringListRangeEmptyItems::ProcessEmptyItems>
+                                (list, itemToSearch))
+      << "trying to find \"" << itemToSearch.Data()
+      << "\" in \"" << list.Data() << "\" (processing empties)";
   }
 }
--- a/dom/media/mediasource/MediaSource.cpp
+++ b/dom/media/mediasource/MediaSource.cpp
@@ -88,29 +88,29 @@ namespace dom {
 /* static */
 nsresult
 MediaSource::IsTypeSupported(const nsAString& aType, DecoderDoctorDiagnostics* aDiagnostics)
 {
   if (aType.IsEmpty()) {
     return NS_ERROR_DOM_TYPE_ERR;
   }
 
-  MediaContentType contentType{aType};
-  if (!contentType.IsValid()) {
+  Maybe<MediaContentType> contentType = MakeMediaContentType(aType);
+  if (!contentType) {
     return NS_ERROR_DOM_TYPE_ERR;
   }
 
-  if (DecoderTraits::CanHandleContentType(contentType, aDiagnostics)
+  if (DecoderTraits::CanHandleContentType(*contentType, aDiagnostics)
       == CANPLAY_NO) {
     return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
   }
 
   // Now we know that this media type could be played.
   // MediaSource imposes extra restrictions, and some prefs.
-  const nsACString& mimeType = contentType.GetMIMEType();
+  const nsACString& mimeType = contentType->GetMIMEType();
   if (mimeType.EqualsASCII("video/mp4") || mimeType.EqualsASCII("audio/mp4")) {
     if (!Preferences::GetBool("media.mediasource.mp4.enabled", false)) {
       return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
     }
     return NS_OK;
   }
   if (mimeType.EqualsASCII("video/webm")) {
     if (!(Preferences::GetBool("media.mediasource.webm.enabled", false) ||
@@ -232,22 +232,22 @@ MediaSource::AddSourceBuffer(const nsASt
   if (mSourceBuffers->Length() >= MAX_SOURCE_BUFFERS) {
     aRv.Throw(NS_ERROR_DOM_QUOTA_EXCEEDED_ERR);
     return nullptr;
   }
   if (mReadyState != MediaSourceReadyState::Open) {
     aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
     return nullptr;
   }
-  MediaContentType contentType{aType};
-  if (!contentType.IsValid()) {
+  Maybe<MediaContentType> contentType = MakeMediaContentType(aType);
+  if (!contentType) {
     aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
     return nullptr;
   }
-  const nsACString& mimeType = contentType.GetMIMEType();
+  const nsACString& mimeType = contentType->GetMIMEType();
   RefPtr<SourceBuffer> sourceBuffer = new SourceBuffer(this, mimeType);
   if (!sourceBuffer) {
     aRv.Throw(NS_ERROR_FAILURE); // XXX need a better error here
     return nullptr;
   }
   mSourceBuffers->Append(sourceBuffer);
   MSE_DEBUG("sourceBuffer=%p", sourceBuffer.get());
   return sourceBuffer.forget();
--- a/dom/media/webaudio/AudioContext.h
+++ b/dom/media/webaudio/AudioContext.h
@@ -37,17 +37,17 @@ namespace mozilla {
 class DOMMediaStream;
 class ErrorResult;
 class MediaStream;
 class MediaStreamGraph;
 class AudioNodeStream;
 
 namespace dom {
 
-enum class AudioContextState : uint32_t;
+enum class AudioContextState : uint8_t;
 class AnalyserNode;
 class AudioBuffer;
 class AudioBufferSourceNode;
 class AudioDestinationNode;
 class AudioListener;
 class AudioNode;
 class BiquadFilterNode;
 class ChannelMergerNode;
@@ -66,17 +66,17 @@ class MediaStreamAudioSourceNode;
 class OscillatorNode;
 class PannerNode;
 class ScriptProcessorNode;
 class StereoPannerNode;
 class WaveShaperNode;
 class PeriodicWave;
 struct PeriodicWaveConstraints;
 class Promise;
-enum class OscillatorType : uint32_t;
+enum class OscillatorType : uint8_t;
 
 // This is addrefed by the OscillatorNodeEngine on the main thread
 // and then used from the MSG thread.
 // It can be released either from the graph thread or the main thread.
 class BasicWaveFormCache
 {
 public:
   explicit BasicWaveFormCache(uint32_t aSampleRate);
--- a/dom/media/webaudio/AudioNodeStream.cpp
+++ b/dom/media/webaudio/AudioNodeStream.cpp
@@ -345,21 +345,16 @@ AudioNodeStream::SetPassThrough(bool aPa
   GraphImpl()->AppendMessage(MakeUnique<Message>(this, aPassThrough));
 }
 
 void
 AudioNodeStream::SetChannelMixingParametersImpl(uint32_t aNumberOfChannels,
                                                 ChannelCountMode aChannelCountMode,
                                                 ChannelInterpretation aChannelInterpretation)
 {
-  // Make sure that we're not clobbering any significant bits by fitting these
-  // values in 16 bits.
-  MOZ_ASSERT(int(aChannelCountMode) < INT16_MAX);
-  MOZ_ASSERT(int(aChannelInterpretation) < INT16_MAX);
-
   mNumberOfInputChannels = aNumberOfChannels;
   mChannelCountMode = aChannelCountMode;
   mChannelInterpretation = aChannelInterpretation;
 }
 
 uint32_t
 AudioNodeStream::ComputedNumberOfChannels(uint32_t aInputChannelCount)
 {
--- a/dom/workers/WorkerScope.h
+++ b/dom/workers/WorkerScope.h
@@ -18,17 +18,17 @@ namespace mozilla {
 namespace dom {
 
 class AnyCallback;
 struct ChannelPixelLayout;
 class Console;
 class Crypto;
 class Function;
 class IDBFactory;
-enum class ImageBitmapFormat : uint32_t;
+enum class ImageBitmapFormat : uint8_t;
 class Performance;
 class Promise;
 class RequestOrUSVString;
 class ServiceWorkerRegistration;
 class WorkerLocation;
 class WorkerNavigator;
 
 namespace cache {
new file mode 100644
--- /dev/null
+++ b/gfx/ipc/CompositorOptions.h
@@ -0,0 +1,55 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=99: */
+/* 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/. */
+#ifndef _include_mozilla_gfx_ipc_CompositorOptions_h_
+#define _include_mozilla_gfx_ipc_CompositorOptions_h_
+
+namespace IPC {
+template <typename> struct ParamTraits;
+} // namespace IPC
+
+namespace mozilla {
+namespace layers {
+
+/**
+ * This class holds options that are "per compositor" - that is, these options
+ * affect a particular CompositorBridgeParent and all the content that it
+ * renders.
+ *
+ * This class is intended to be created by a platform widget (but NOT
+ * PuppetWidget) and passed to the graphics code during initialization of the
+ * top level compositor associated with that widget. The options are immutable
+ * after creation. The CompositorBridgeParent holds the canonical version of
+ * the options, but they may be accessed by other parts of the code as needed,
+ * and are accessible to content processes over PCompositorBridge as well.
+ */
+class CompositorOptions
+{
+public:
+  // This constructor needed for IPDL purposes, don't use it anywhere else.
+  CompositorOptions()
+    : mUseAPZ(false)
+  {
+  }
+
+  explicit CompositorOptions(bool aUseAPZ)
+    : mUseAPZ(aUseAPZ)
+  {
+  }
+
+  bool UseAPZ() const { return mUseAPZ; }
+
+  friend struct IPC::ParamTraits<CompositorOptions>;
+
+private:
+  bool mUseAPZ;
+
+  // Make sure to add new fields to the ParamTraits implementation
+};
+
+} // namespace layers
+} // namespace mozilla
+
+#endif // _include_mozilla_gfx_ipc_CompositorOptions_h_
--- a/gfx/ipc/GPUParent.cpp
+++ b/gfx/ipc/GPUParent.cpp
@@ -283,21 +283,22 @@ OpenParent(RefPtr<CompositorBridgeParent
     MOZ_CRASH("Failed to bind compositor");
   }
 }
 
 mozilla::ipc::IPCResult
 GPUParent::RecvNewWidgetCompositor(Endpoint<layers::PCompositorBridgeParent>&& aEndpoint,
                                    const CSSToLayoutDeviceScale& aScale,
                                    const TimeDuration& aVsyncRate,
+                                   const CompositorOptions& aOptions,
                                    const bool& aUseExternalSurfaceSize,
                                    const IntSize& aSurfaceSize)
 {
   RefPtr<CompositorBridgeParent> cbp =
-    new CompositorBridgeParent(aScale, aVsyncRate, aUseExternalSurfaceSize, aSurfaceSize);
+    new CompositorBridgeParent(aScale, aVsyncRate, aOptions, aUseExternalSurfaceSize, aSurfaceSize);
 
   MessageLoop* loop = CompositorThreadHolder::Loop();
   loop->PostTask(NewRunnableFunction(OpenParent, cbp, Move(aEndpoint)));
   return IPC_OK();
 }
 
 mozilla::ipc::IPCResult
 GPUParent::RecvNewContentCompositorBridge(Endpoint<PCompositorBridgeParent>&& aEndpoint)
--- a/gfx/ipc/GPUParent.h
+++ b/gfx/ipc/GPUParent.h
@@ -37,16 +37,17 @@ public:
   mozilla::ipc::IPCResult RecvInitImageBridge(Endpoint<PImageBridgeParent>&& aEndpoint) override;
   mozilla::ipc::IPCResult RecvInitVRManager(Endpoint<PVRManagerParent>&& aEndpoint) override;
   mozilla::ipc::IPCResult RecvUpdatePref(const GfxPrefSetting& pref) override;
   mozilla::ipc::IPCResult RecvUpdateVar(const GfxVarUpdate& pref) override;
   mozilla::ipc::IPCResult RecvNewWidgetCompositor(
       Endpoint<PCompositorBridgeParent>&& aEndpoint,
       const CSSToLayoutDeviceScale& aScale,
       const TimeDuration& aVsyncRate,
+      const CompositorOptions& aOptions,
       const bool& aUseExternalSurface,
       const IntSize& aSurfaceSize) override;
   mozilla::ipc::IPCResult RecvNewContentCompositorBridge(Endpoint<PCompositorBridgeParent>&& aEndpoint) override;
   mozilla::ipc::IPCResult RecvNewContentImageBridge(Endpoint<PImageBridgeParent>&& aEndpoint) override;
   mozilla::ipc::IPCResult RecvNewContentVRManager(Endpoint<PVRManagerParent>&& aEndpoint) override;
   mozilla::ipc::IPCResult RecvNewContentVideoDecoderManager(Endpoint<PVideoDecoderManagerParent>&& aEndpoint) override;
   mozilla::ipc::IPCResult RecvGetDeviceStatus(GPUDeviceData* aOutStatus) override;
   mozilla::ipc::IPCResult RecvAddLayerTreeIdMapping(nsTArray<LayerTreeIdMapping>&& aMappings) override;
--- a/gfx/ipc/GPUProcessManager.cpp
+++ b/gfx/ipc/GPUProcessManager.cpp
@@ -7,16 +7,17 @@
 #include "GPUProcessHost.h"
 #include "GPUProcessListener.h"
 #include "mozilla/Sprintf.h"
 #include "mozilla/StaticPtr.h"
 #include "mozilla/dom/ContentParent.h"
 #include "mozilla/layers/APZCTreeManager.h"
 #include "mozilla/layers/APZCTreeManagerChild.h"
 #include "mozilla/layers/CompositorBridgeParent.h"
+#include "mozilla/layers/CompositorOptions.h"
 #include "mozilla/layers/ImageBridgeChild.h"
 #include "mozilla/layers/ImageBridgeParent.h"
 #include "mozilla/layers/InProcessCompositorSession.h"
 #include "mozilla/layers/LayerTreeOwnerTracker.h"
 #include "mozilla/layers/RemoteCompositorSession.h"
 #include "mozilla/widget/PlatformWidgetTypes.h"
 #ifdef MOZ_WIDGET_SUPPORTS_OOP_COMPOSITING
 # include "mozilla/widget/CompositorWidgetChild.h"
@@ -482,59 +483,59 @@ GPUProcessManager::DestroyProcess()
     mVsyncBridge = nullptr;
   }
 }
 
 RefPtr<CompositorSession>
 GPUProcessManager::CreateTopLevelCompositor(nsBaseWidget* aWidget,
                                             LayerManager* aLayerManager,
                                             CSSToLayoutDeviceScale aScale,
-                                            bool aUseAPZ,
+                                            const CompositorOptions& aOptions,
                                             bool aUseExternalSurfaceSize,
                                             const gfx::IntSize& aSurfaceSize)
 {
   uint64_t layerTreeId = AllocateLayerTreeId();
 
   EnsureGPUReady();
   EnsureImageBridgeChild();
   EnsureVRManager();
 
   if (mGPUChild) {
     RefPtr<CompositorSession> session = CreateRemoteSession(
       aWidget,
       aLayerManager,
       layerTreeId,
       aScale,
-      aUseAPZ,
+      aOptions,
       aUseExternalSurfaceSize,
       aSurfaceSize);
     if (session) {
       return session;
     }
 
     // We couldn't create a remote compositor, so abort the process.
     DisableGPUProcess("Failed to create remote compositor");
   }
 
   return InProcessCompositorSession::Create(
     aWidget,
     aLayerManager,
     layerTreeId,
     aScale,
-    aUseAPZ,
+    aOptions,
     aUseExternalSurfaceSize,
     aSurfaceSize);
 }
 
 RefPtr<CompositorSession>
 GPUProcessManager::CreateRemoteSession(nsBaseWidget* aWidget,
                                        LayerManager* aLayerManager,
                                        const uint64_t& aRootLayerTreeId,
                                        CSSToLayoutDeviceScale aScale,
-                                       bool aUseAPZ,
+                                       const CompositorOptions& aOptions,
                                        bool aUseExternalSurfaceSize,
                                        const gfx::IntSize& aSurfaceSize)
 {
 #ifdef MOZ_WIDGET_SUPPORTS_OOP_COMPOSITING
   ipc::Endpoint<PCompositorBridgeParent> parentPipe;
   ipc::Endpoint<PCompositorBridgeChild> childPipe;
 
   nsresult rv = PCompositorBridge::CreateEndpoints(
@@ -561,16 +562,17 @@ GPUProcessManager::CreateRemoteSession(n
 
   TimeDuration vsyncRate =
     gfxPlatform::GetPlatform()->GetHardwareVsync()->GetGlobalDisplay().GetVsyncRate();
 
   bool ok = mGPUChild->SendNewWidgetCompositor(
     Move(parentPipe),
     aScale,
     vsyncRate,
+    aOptions,
     aUseExternalSurfaceSize,
     aSurfaceSize);
   if (!ok) {
     return nullptr;
   }
 
   RefPtr<CompositorVsyncDispatcher> dispatcher = aWidget->GetCompositorVsyncDispatcher();
   RefPtr<CompositorWidgetVsyncObserver> observer =
@@ -580,17 +582,17 @@ GPUProcessManager::CreateRemoteSession(n
   if (!child->SendPCompositorWidgetConstructor(widget, initData)) {
     return nullptr;
   }
   if (!child->SendInitialize(aRootLayerTreeId)) {
     return nullptr;
   }
 
   RefPtr<APZCTreeManagerChild> apz = nullptr;
-  if (aUseAPZ) {
+  if (aOptions.UseAPZ()) {
     PAPZCTreeManagerChild* papz = child->SendPAPZCTreeManagerConstructor(0);
     if (!papz) {
       return nullptr;
     }
     apz = static_cast<APZCTreeManagerChild*>(papz);
   }
 
   RefPtr<RemoteCompositorSession> session =
--- a/gfx/ipc/GPUProcessManager.h
+++ b/gfx/ipc/GPUProcessManager.h
@@ -19,16 +19,17 @@
 #include "nsIObserverService.h"
 #include "nsThreadUtils.h"
 class nsBaseWidget;
 
 
 namespace mozilla {
 namespace layers {
 class IAPZCTreeManager;
+class CompositorOptions;
 class CompositorSession;
 class CompositorUpdateObserver;
 class PCompositorBridgeChild;
 class PImageBridgeChild;
 class RemoteCompositorSession;
 } // namespace layers
 namespace widget {
 class CompositorWidget;
@@ -51,16 +52,17 @@ class VsyncIOThreadHolder;
 
 // The GPUProcessManager is a singleton responsible for creating GPU-bound
 // objects that may live in another process. Currently, it provides access
 // to the compositor via CompositorBridgeParent.
 class GPUProcessManager final : public GPUProcessHost::Listener
 {
   friend class layers::RemoteCompositorSession;
 
+  typedef layers::CompositorOptions CompositorOptions;
   typedef layers::CompositorSession CompositorSession;
   typedef layers::CompositorUpdateObserver CompositorUpdateObserver;
   typedef layers::IAPZCTreeManager IAPZCTreeManager;
   typedef layers::LayerManager LayerManager;
   typedef layers::PCompositorBridgeChild PCompositorBridgeChild;
   typedef layers::PImageBridgeChild PImageBridgeChild;
   typedef layers::RemoteCompositorSession RemoteCompositorSession;
 
@@ -78,17 +80,17 @@ public:
   // used, or one is launched and ready, this function returns immediately.
   // Otherwise it blocks until the GPU process has finished launching.
   void EnsureGPUReady();
 
   RefPtr<CompositorSession> CreateTopLevelCompositor(
     nsBaseWidget* aWidget,
     LayerManager* aLayerManager,
     CSSToLayoutDeviceScale aScale,
-    bool aUseAPZ,
+    const CompositorOptions& aOptions,
     bool aUseExternalSurfaceSize,
     const gfx::IntSize& aSurfaceSize);
 
   bool CreateContentBridges(
     base::ProcessId aOtherProcess,
     ipc::Endpoint<PCompositorBridgeChild>* aOutCompositor,
     ipc::Endpoint<PImageBridgeChild>* aOutImageBridge,
     ipc::Endpoint<PVRManagerChild>* aOutVRBridge,
@@ -192,17 +194,17 @@ private:
   void EnsureImageBridgeChild();
   void EnsureVRManager();
 
   RefPtr<CompositorSession> CreateRemoteSession(
     nsBaseWidget* aWidget,
     LayerManager* aLayerManager,
     const uint64_t& aRootLayerTreeId,
     CSSToLayoutDeviceScale aScale,
-    bool aUseAPZ,
+    const CompositorOptions& aOptions,
     bool aUseExternalSurfaceSize,
     const gfx::IntSize& aSurfaceSize);
 
   DISALLOW_COPY_AND_ASSIGN(GPUProcessManager);
 
   class Observer final : public nsIObserver {
   public:
     NS_DECL_ISUPPORTS
--- a/gfx/ipc/GfxMessageUtils.h
+++ b/gfx/ipc/GfxMessageUtils.h
@@ -15,16 +15,17 @@
 #include "chrome/common/ipc_message_utils.h"
 #include "gfxPoint.h"
 #include "gfxRect.h"
 #include "gfxTelemetry.h"
 #include "gfxTypes.h"
 #include "ipc/IPCMessageUtils.h"
 #include "mozilla/gfx/Matrix.h"
 #include "mozilla/layers/AsyncDragMetrics.h"
+#include "mozilla/layers/CompositorOptions.h"
 #include "mozilla/layers/CompositorTypes.h"
 #include "mozilla/layers/GeckoContentController.h"
 #include "mozilla/layers/LayersTypes.h"
 #include "nsRect.h"
 #include "nsRegion.h"
 #include "mozilla/Array.h"
 
 #include <stdint.h>
@@ -1313,11 +1314,25 @@ struct ParamTraits<mozilla::Array<T, Len
       if (!ReadParam(aMsg, aIter, &aResult[i])) {
         return false;
       }
     }
     return true;
   }
 };
 
+template <>
+struct ParamTraits<mozilla::layers::CompositorOptions>
+{
+  typedef mozilla::layers::CompositorOptions paramType;
+
+  static void Write(Message* aMsg, const paramType& aParam) {
+    WriteParam(aMsg, aParam.mUseAPZ);
+  }
+
+  static bool Read(const Message* aMsg, PickleIterator* aIter, paramType* aResult) {
+    return ReadParam(aMsg, aIter, &aResult->mUseAPZ);
+  }
+};
+
 } /* namespace IPC */
 
 #endif /* __GFXMESSAGEUTILS_H__ */
--- a/gfx/ipc/InProcessCompositorSession.cpp
+++ b/gfx/ipc/InProcessCompositorSession.cpp
@@ -22,27 +22,27 @@ InProcessCompositorSession::InProcessCom
 {
 }
 
 /* static */ RefPtr<InProcessCompositorSession>
 InProcessCompositorSession::Create(nsIWidget* aWidget,
                                    LayerManager* aLayerManager,
                                    const uint64_t& aRootLayerTreeId,
                                    CSSToLayoutDeviceScale aScale,
-                                   bool aUseAPZ,
+                                   const CompositorOptions& aOptions,
                                    bool aUseExternalSurfaceSize,
                                    const gfx::IntSize& aSurfaceSize)
 {
   CompositorWidgetInitData initData;
   aWidget->GetCompositorWidgetInitData(&initData);
 
-  RefPtr<CompositorWidget> widget = CompositorWidget::CreateLocal(initData, aWidget);
+  RefPtr<CompositorWidget> widget = CompositorWidget::CreateLocal(initData, aOptions, aWidget);
   RefPtr<CompositorBridgeChild> child = new CompositorBridgeChild(aLayerManager);
   RefPtr<CompositorBridgeParent> parent =
-    child->InitSameProcess(widget, aRootLayerTreeId, aScale, aUseAPZ, aUseExternalSurfaceSize, aSurfaceSize);
+    child->InitSameProcess(widget, aRootLayerTreeId, aScale, aOptions, aUseExternalSurfaceSize, aSurfaceSize);
 
   return new InProcessCompositorSession(widget, child, parent);
 }
 
 CompositorBridgeParent*
 InProcessCompositorSession::GetInProcessBridge() const
 {
   return mCompositorBridgeParent;
--- a/gfx/ipc/InProcessCompositorSession.h
+++ b/gfx/ipc/InProcessCompositorSession.h
@@ -8,27 +8,29 @@
 
 #include "CompositorSession.h"
 #include "mozilla/gfx/Point.h"
 #include "Units.h"
 
 namespace mozilla {
 namespace layers {
 
+class CompositorOptions;
+
 // A CompositorSession where both the child and parent CompositorBridge reside
 // in the same process.
 class InProcessCompositorSession final : public CompositorSession
 {
 public:
   static RefPtr<InProcessCompositorSession> Create(
     nsIWidget* aWidget,
     LayerManager* aLayerManager,
     const uint64_t& aRootLayerTreeId,
     CSSToLayoutDeviceScale aScale,
-    bool aUseAPZ,
+    const CompositorOptions& aOptions,
     bool aUseExternalSurfaceSize,
     const gfx::IntSize& aSurfaceSize);
 
   CompositorBridgeParent* GetInProcessBridge() const override;
   void SetContentController(GeckoContentController* aController) override;
   RefPtr<IAPZCTreeManager> GetAPZCTreeManager() const override;
   bool Reset(const nsTArray<LayersBackend>& aBackendHints,
              uint64_t aSeqNo,
--- a/gfx/ipc/PGPU.ipdl
+++ b/gfx/ipc/PGPU.ipdl
@@ -9,16 +9,17 @@ include protocol PImageBridge;
 include protocol PVRManager;
 include protocol PVsyncBridge;
 include protocol PVideoDecoderManager;
 
 using base::ProcessId from "base/process.h";
 using mozilla::TimeDuration from "mozilla/TimeStamp.h";
 using mozilla::CSSToLayoutDeviceScale from "Units.h";
 using mozilla::gfx::IntSize from "mozilla/gfx/2D.h";
+using mozilla::layers::CompositorOptions from "mozilla/layers/CompositorOptions.h";
 using mozilla::Telemetry::Accumulation from "mozilla/TelemetryComms.h";
 using mozilla::Telemetry::KeyedAccumulation from "mozilla/TelemetryComms.h";
 
 namespace mozilla {
 namespace gfx {
 
 union GfxPrefValue {
   bool;
@@ -53,16 +54,17 @@ parent:
   // Called to update a gfx preference or variable.
   async UpdatePref(GfxPrefSetting pref);
   async UpdateVar(GfxVarUpdate var);
 
   // Create a new top-level compositor.
   async NewWidgetCompositor(Endpoint<PCompositorBridgeParent> endpoint,
                             CSSToLayoutDeviceScale scale,
                             TimeDuration vsyncRate,
+                            CompositorOptions options,
                             bool useExternalSurface,
                             IntSize surfaceSize);
 
   // Create a new content-process compositor bridge.
   async NewContentCompositorBridge(Endpoint<PCompositorBridgeParent> endpoint);
   async NewContentImageBridge(Endpoint<PImageBridgeParent> endpoint);
   async NewContentVRManager(Endpoint<PVRManagerParent> endpoint);
   async NewContentVideoDecoderManager(Endpoint<PVideoDecoderManagerParent> endpoint);
--- a/gfx/ipc/moz.build
+++ b/gfx/ipc/moz.build
@@ -18,16 +18,17 @@ EXPORTS.mozilla.gfx += [
     'GPUProcessManager.h',
     'SharedDIB.h',
     'VsyncBridgeChild.h',
     'VsyncBridgeParent.h',
     'VsyncIOThreadHolder.h',
 ]
 
 EXPORTS.mozilla.layers += [
+    'CompositorOptions.h',
     'CompositorSession.h',
     'InProcessCompositorSession.h',
     'RemoteCompositorSession.h',
 ]
 
 EXPORTS.mozilla.widget += [
     'CompositorWidgetVsyncObserver.h',
 ]
--- a/gfx/layers/composite/LayerManagerComposite.cpp
+++ b/gfx/layers/composite/LayerManagerComposite.cpp
@@ -1404,17 +1404,17 @@ LayerComposite::SetLayerManager(HostLaye
   mCompositeManager = static_cast<LayerManagerComposite*>(aManager);
   mCompositor = mCompositeManager->GetCompositor();
 }
 
 bool
 LayerManagerComposite::AsyncPanZoomEnabled() const
 {
   if (CompositorBridgeParent* bridge = mCompositor->GetCompositorBridgeParent()) {
-    return bridge->AsyncPanZoomEnabled();
+    return bridge->GetOptions().UseAPZ();
   }
   return false;
 }
 
 nsIntRegion
 LayerComposite::GetFullyRenderedRegion() {
   if (TiledContentHost* tiled = GetCompositableHost() ? GetCompositableHost()->AsTiledContentHost()
                                                         : nullptr) {
--- a/gfx/layers/ipc/CompositorBridgeChild.cpp
+++ b/gfx/layers/ipc/CompositorBridgeChild.cpp
@@ -229,33 +229,33 @@ CompositorBridgeChild::ReinitForContent(
 
   return InitForContent(Move(aEndpoint));
 }
 
 CompositorBridgeParent*
 CompositorBridgeChild::InitSameProcess(widget::CompositorWidget* aWidget,
                                        const uint64_t& aLayerTreeId,
                                        CSSToLayoutDeviceScale aScale,
-                                       bool aUseAPZ,
+                                       const CompositorOptions& aOptions,
                                        bool aUseExternalSurface,
                                        const gfx::IntSize& aSurfaceSize)
 {
   TimeDuration vsyncRate =
     gfxPlatform::GetPlatform()->GetHardwareVsync()->GetGlobalDisplay().GetVsyncRate();
 
   mCompositorBridgeParent =
-    new CompositorBridgeParent(aScale, vsyncRate, aUseExternalSurface, aSurfaceSize);
+    new CompositorBridgeParent(aScale, vsyncRate, aOptions, aUseExternalSurface, aSurfaceSize);
 
   bool ok = Open(mCompositorBridgeParent->GetIPCChannel(),
                  CompositorThreadHolder::Loop(),
                  ipc::ChildSide);
   MOZ_RELEASE_ASSERT(ok);
 
   InitIPDL();
-  mCompositorBridgeParent->InitSameProcess(aWidget, aLayerTreeId, aUseAPZ);
+  mCompositorBridgeParent->InitSameProcess(aWidget, aLayerTreeId);
   return mCompositorBridgeParent;
 }
 
 /* static */ RefPtr<CompositorBridgeChild>
 CompositorBridgeChild::CreateRemote(const uint64_t& aProcessToken,
                                     LayerManager* aLayerManager,
                                     Endpoint<PCompositorBridgeChild>&& aEndpoint)
 {
@@ -1083,24 +1083,16 @@ CompositorBridgeChild::DeallocPComposito
 #ifdef MOZ_WIDGET_SUPPORTS_OOP_COMPOSITING
   delete aActor;
   return true;
 #else
   return false;
 #endif
 }
 
-bool
-CompositorBridgeChild::GetAPZEnabled(uint64_t aLayerTreeId)
-{
-  bool result = false;
-  Unused << SendAsyncPanZoomEnabled(aLayerTreeId, &result);
-  return result;
-}
-
 PAPZCTreeManagerChild*
 CompositorBridgeChild::AllocPAPZCTreeManagerChild(const uint64_t& aLayersId)
 {
   APZCTreeManagerChild* child = new APZCTreeManagerChild();
   child->AddRef();
   return child;
 }
 
--- a/gfx/layers/ipc/CompositorBridgeChild.h
+++ b/gfx/layers/ipc/CompositorBridgeChild.h
@@ -33,16 +33,17 @@ class CompositorWidget;
 namespace layers {
 
 using mozilla::dom::TabChild;
 
 class IAPZCTreeManager;
 class APZCTreeManagerChild;
 class ClientLayerManager;
 class CompositorBridgeParent;
+class CompositorOptions;
 class TextureClient;
 class TextureClientPool;
 struct FrameMetrics;
 
 class CompositorBridgeChild final : public PCompositorBridgeChild,
                                     public TextureForwarder
 {
   typedef InfallibleTArray<AsyncParentMessageData> AsyncParentMessageArray;
@@ -75,17 +76,17 @@ public:
   /**
    * Initialize the CompositorBridgeChild, create CompositorBridgeParent, and
    * open a same-process connection.
    */
   CompositorBridgeParent* InitSameProcess(
     widget::CompositorWidget* aWidget,
     const uint64_t& aLayerTreeId,
     CSSToLayoutDeviceScale aScale,
-    bool aUseAPZ,
+    const CompositorOptions& aOptions,
     bool aUseExternalSurface,
     const gfx::IntSize& aSurfaceSize);
 
   static CompositorBridgeChild* Get();
 
   static bool ChildProcessHasCompositorBridge();
 
   // Returns whether the compositor is in the GPU process (false if in the UI
@@ -215,18 +216,16 @@ public:
   virtual bool AllocShmem(size_t aSize,
                           mozilla::ipc::SharedMemory::SharedMemoryType aShmType,
                           mozilla::ipc::Shmem* aShmem) override;
   virtual bool DeallocShmem(mozilla::ipc::Shmem& aShmem) override;
 
   PCompositorWidgetChild* AllocPCompositorWidgetChild(const CompositorWidgetInitData& aInitData) override;
   bool DeallocPCompositorWidgetChild(PCompositorWidgetChild* aActor) override;
 
-  bool GetAPZEnabled(uint64_t aLayerTreeId);
-
   PAPZCTreeManagerChild* AllocPAPZCTreeManagerChild(const uint64_t& aLayersId) override;
   bool DeallocPAPZCTreeManagerChild(PAPZCTreeManagerChild* aActor) override;
 
   PAPZChild* AllocPAPZChild(const uint64_t& aLayersId) override;
   bool DeallocPAPZChild(PAPZChild* aActor) override;
 
   void ProcessingError(Result aCode, const char* aReason) override;
 
--- a/gfx/layers/ipc/CompositorBridgeParent.cpp
+++ b/gfx/layers/ipc/CompositorBridgeParent.cpp
@@ -284,26 +284,28 @@ CalculateCompositionFrameRate()
 static inline MessageLoop*
 CompositorLoop()
 {
   return CompositorThreadHolder::Loop();
 }
 
 CompositorBridgeParent::CompositorBridgeParent(CSSToLayoutDeviceScale aScale,
                                                const TimeDuration& aVsyncRate,
+                                               const CompositorOptions& aOptions,
                                                bool aUseExternalSurfaceSize,
                                                const gfx::IntSize& aSurfaceSize)
   : mWidget(nullptr)
   , mScale(aScale)
   , mVsyncRate(aVsyncRate)
   , mIsTesting(false)
   , mPendingTransaction(0)
   , mPaused(false)
   , mUseExternalSurfaceSize(aUseExternalSurfaceSize)
   , mEGLSurfaceSize(aSurfaceSize)
+  , mOptions(aOptions)
   , mPauseCompositionMonitor("PauseCompositionMonitor")
   , mResumeCompositionMonitor("ResumeCompositionMonitor")
   , mResetCompositorMonitor("ResetCompositorMonitor")
   , mRootLayerTreeID(0)
   , mOverrideComposeReadiness(false)
   , mForceCompositionTask(nullptr)
   , mCompositorThreadHolder(CompositorThreadHolder::GetSingleton())
   , mCompositorScheduler(nullptr)
@@ -315,22 +317,21 @@ CompositorBridgeParent::CompositorBridge
 #endif
 {
   // Always run destructor on the main thread
   MOZ_ASSERT(NS_IsMainThread());
 }
 
 void
 CompositorBridgeParent::InitSameProcess(widget::CompositorWidget* aWidget,
-                                        const uint64_t& aLayerTreeId,
-                                        bool aUseAPZ)
+                                        const uint64_t& aLayerTreeId)
 {
   mWidget = aWidget;
   mRootLayerTreeID = aLayerTreeId;
-  if (aUseAPZ) {
+  if (mOptions.UseAPZ()) {
     mApzcTreeManager = new APZCTreeManager();
   }
 
   // IPDL initialization. mSelfRef is cleared in DeferredDestroy.
   SetOtherProcessId(base::GetCurrentProcId());
   mSelfRef = this;
 
   Initialize();
@@ -1041,16 +1042,19 @@ CompositorBridgeParent::ForceComposeToTa
   AutoRestore<bool> override(mOverrideComposeReadiness);
   mOverrideComposeReadiness = true;
   mCompositorScheduler->ForceComposeToTarget(aTarget, aRect);
 }
 
 PAPZCTreeManagerParent*
 CompositorBridgeParent::AllocPAPZCTreeManagerParent(const uint64_t& aLayersId)
 {
+  // We should only ever get this if APZ is enabled in this compositor.
+  MOZ_ASSERT(mOptions.UseAPZ());
+
   // The main process should pass in 0 because we assume mRootLayerTreeID
   MOZ_ASSERT(aLayersId == 0);
 
   // This message doubles as initialization
   MOZ_ASSERT(!mApzcTreeManager);
   mApzcTreeManager = new APZCTreeManager();
 
   MonitorAutoLock lock(*sIndirectLayerTreesLock);
@@ -1093,21 +1097,22 @@ bool
 CompositorBridgeParent::DeallocPAPZParent(PAPZParent* aActor)
 {
   RemoteContentController* controller = static_cast<RemoteContentController*>(aActor);
   controller->Release();
   return true;
 }
 
 mozilla::ipc::IPCResult
-CompositorBridgeParent::RecvAsyncPanZoomEnabled(const uint64_t& aLayersId, bool* aHasAPZ)
+CompositorBridgeParent::RecvGetCompositorOptions(const uint64_t& aLayersId,
+                                                 CompositorOptions* aOptions)
 {
   // The main process should pass in 0 because we assume mRootLayerTreeID
   MOZ_ASSERT(aLayersId == 0);
-  *aHasAPZ = AsyncPanZoomEnabled();
+  *aOptions = mOptions;
   return IPC_OK();
 }
 
 RefPtr<APZCTreeManager>
 CompositorBridgeParent::GetAPZCTreeManager()
 {
   return mApzcTreeManager;
 }
@@ -1643,17 +1648,17 @@ CompositorBridgeParent::AllocPCompositor
 {
 #if defined(MOZ_WIDGET_SUPPORTS_OOP_COMPOSITING)
   if (mWidget) {
     // Should not create two widgets on the same compositor.
     return nullptr;
   }
 
   widget::CompositorWidgetParent* widget =
-    new widget::CompositorWidgetParent(aInitData);
+    new widget::CompositorWidgetParent(aInitData, mOptions);
   widget->AddRef();
 
   // Sending the constructor acts as initialization as well.
   mWidget = widget;
   return widget;
 #else
   return nullptr;
 #endif
--- a/gfx/layers/ipc/CompositorBridgeParent.h
+++ b/gfx/layers/ipc/CompositorBridgeParent.h
@@ -23,16 +23,17 @@
 #include "mozilla/Monitor.h"            // for Monitor
 #include "mozilla/RefPtr.h"             // for RefPtr
 #include "mozilla/TimeStamp.h"          // for TimeStamp
 #include "mozilla/dom/ipc/IdType.h"
 #include "mozilla/gfx/Point.h"          // for IntSize
 #include "mozilla/ipc/ProtocolUtils.h"
 #include "mozilla/ipc/SharedMemory.h"
 #include "mozilla/layers/CompositorController.h"
+#include "mozilla/layers/CompositorOptions.h"
 #include "mozilla/layers/CompositorVsyncSchedulerOwner.h"
 #include "mozilla/layers/GeckoContentController.h"
 #include "mozilla/layers/ISurfaceAllocator.h" // for ShmemAllocator
 #include "mozilla/layers/LayersMessages.h"  // for TargetConfig
 #include "mozilla/layers/MetricsSharingController.h"
 #include "mozilla/layers/PCompositorBridgeParent.h"
 #include "mozilla/layers/APZTestData.h"
 #include "mozilla/widget/CompositorWidget.h"
@@ -150,25 +151,25 @@ class CompositorBridgeParent final : pub
   friend class gfx::GPUParent;
 
 public:
   NS_IMETHOD_(MozExternalRefCountType) AddRef() override { return CompositorBridgeParentBase::AddRef(); }
   NS_IMETHOD_(MozExternalRefCountType) Release() override { return CompositorBridgeParentBase::Release(); }
 
   explicit CompositorBridgeParent(CSSToLayoutDeviceScale aScale,
                                   const TimeDuration& aVsyncRate,
+                                  const CompositorOptions& aOptions,
                                   bool aUseExternalSurfaceSize,
                                   const gfx::IntSize& aSurfaceSize);
 
   // Must only be called by CompositorBridgeChild. After invoking this, the
   // IPC channel is active and RecvWillStop/ActorDestroy must be called to
   // free the compositor.
   void InitSameProcess(widget::CompositorWidget* aWidget,
-                       const uint64_t& aLayerTreeId,
-                       bool aUseAPZ);
+                       const uint64_t& aLayerTreeId);
 
   // Must only be called by GPUParent. After invoking this, the IPC channel
   // is active and RecvWillStop/ActorDestroy must be called to free the
   // compositor.
   bool Bind(Endpoint<PCompositorBridgeParent>&& aEndpoint);
 
   virtual mozilla::ipc::IPCResult RecvInitialize(const uint64_t& aRootLayerTreeId) override;
   virtual mozilla::ipc::IPCResult RecvReset(nsTArray<LayersBackend>&& aBackendHints,
@@ -426,22 +427,23 @@ public:
   void ForceComposeToTarget(gfx::DrawTarget* aTarget, const gfx::IntRect* aRect = nullptr);
 
   PAPZCTreeManagerParent* AllocPAPZCTreeManagerParent(const uint64_t& aLayersId) override;
   bool DeallocPAPZCTreeManagerParent(PAPZCTreeManagerParent* aActor) override;
 
   PAPZParent* AllocPAPZParent(const uint64_t& aLayersId) override;
   bool DeallocPAPZParent(PAPZParent* aActor) override;
 
-  mozilla::ipc::IPCResult RecvAsyncPanZoomEnabled(const uint64_t& aLayersId, bool* aHasAPZ) override;
+  mozilla::ipc::IPCResult RecvGetCompositorOptions(const uint64_t& aLayersId,
+                                                   CompositorOptions* aOptions) override;
 
   RefPtr<APZCTreeManager> GetAPZCTreeManager();
 
-  bool AsyncPanZoomEnabled() const {
-    return !!mApzcTreeManager;
+  CompositorOptions GetOptions() const {
+    return mOptions;
   }
 
 private:
 
   void Initialize();
 
   /**
    * Called during destruction in order to release resources as early as possible.
@@ -544,16 +546,18 @@ protected:
 
   uint64_t mPendingTransaction;
 
   bool mPaused;
 
   bool mUseExternalSurfaceSize;
   gfx::IntSize mEGLSurfaceSize;
 
+  CompositorOptions mOptions;
+
   mozilla::Monitor mPauseCompositionMonitor;
   mozilla::Monitor mResumeCompositionMonitor;
   mozilla::Monitor mResetCompositorMonitor;
 
   uint64_t mCompositorID;
   uint64_t mRootLayerTreeID;
 
   bool mOverrideComposeReadiness;
--- a/gfx/layers/ipc/CrossProcessCompositorBridgeParent.cpp
+++ b/gfx/layers/ipc/CrossProcessCompositorBridgeParent.cpp
@@ -10,16 +10,17 @@
 #include "base/message_loop.h"          // for MessageLoop
 #include "base/task.h"                  // for CancelableTask, etc
 #include "base/thread.h"                // for Thread
 #include "mozilla/ipc/Transport.h"      // for Transport
 #include "mozilla/layers/APZCTreeManager.h"  // for APZCTreeManager
 #include "mozilla/layers/APZCTreeManagerParent.h"  // for APZCTreeManagerParent
 #include "mozilla/layers/APZThreadUtils.h"  // for APZCTreeManager
 #include "mozilla/layers/AsyncCompositionManager.h"
+#include "mozilla/layers/CompositorOptions.h"
 #include "mozilla/layers/CompositorThread.h"
 #include "mozilla/layers/LayerManagerComposite.h"
 #include "mozilla/layers/LayerTreeOwnerTracker.h"
 #include "mozilla/layers/PLayerTransactionParent.h"
 #include "mozilla/layers/RemoteContentController.h"
 #include "mozilla/mozalloc.h"           // for operator new, etc
 #include "nsDebug.h"                    // for NS_ASSERTION, etc
 #include "nsTArray.h"                   // for nsTArray
@@ -104,28 +105,31 @@ CrossProcessCompositorBridgeParent::Deal
 {
   LayerTransactionParent* slp = static_cast<LayerTransactionParent*>(aLayers);
   EraseLayerState(slp->GetId());
   static_cast<LayerTransactionParent*>(aLayers)->ReleaseIPDLReference();
   return true;
 }
 
 mozilla::ipc::IPCResult
-CrossProcessCompositorBridgeParent::RecvAsyncPanZoomEnabled(const uint64_t& aLayersId, bool* aHasAPZ)
+CrossProcessCompositorBridgeParent::RecvGetCompositorOptions(const uint64_t& aLayersId,
+                                                             CompositorOptions* aOptions)
 {
   // Check to see if this child process has access to this layer tree.
   if (!LayerTreeOwnerTracker::Get()->IsMapped(aLayersId, OtherPid())) {
-    NS_ERROR("Unexpected layers id in RecvAsyncPanZoomEnabled; dropping message...");
+    NS_ERROR("Unexpected layers id in RecvGetCompositorOptions; dropping message...");
     return IPC_FAIL_NO_REASON(this);
   }
 
   MonitorAutoLock lock(*sIndirectLayerTreesLock);
   CompositorBridgeParent::LayerTreeState& state = sIndirectLayerTrees[aLayersId];
 
-  *aHasAPZ = state.mParent ? state.mParent->AsyncPanZoomEnabled() : false;
+  if (state.mParent) {
+    *aOptions = state.mParent->GetOptions();
+  }
   return IPC_OK();
 }
 
 PAPZCTreeManagerParent*
 CrossProcessCompositorBridgeParent::AllocPAPZCTreeManagerParent(const uint64_t& aLayersId)
 {
   // Check to see if this child process has access to this layer tree.
   if (!LayerTreeOwnerTracker::Get()->IsMapped(aLayersId, OtherPid())) {
--- a/gfx/layers/ipc/CrossProcessCompositorBridgeParent.h
+++ b/gfx/layers/ipc/CrossProcessCompositorBridgeParent.h
@@ -8,16 +8,18 @@
 #define mozilla_layers_CrossProcessCompositorBridgeParent_h
 
 #include "mozilla/layers/CompositorBridgeParent.h"
 #include "mozilla/layers/CompositorThread.h"
 
 namespace mozilla {
 namespace layers {
 
+class CompositorOptions;
+
 /**
  * This class handles layer updates pushed directly from child processes to
  * the compositor thread. It's associated with a CompositorBridgeParent on the
  * compositor thread. While it uses the PCompositorBridge protocol to manage
  * these updates, it doesn't actually drive compositing itself. For that it
  * hands off work to the CompositorBridgeParent it's associated with.
  */
 class CrossProcessCompositorBridgeParent final : public CompositorBridgeParentBase
@@ -132,17 +134,17 @@ public:
     // Not allowed.
     return nullptr;
   }
   bool DeallocPCompositorWidgetParent(PCompositorWidgetParent* aActor) override {
     // Not allowed.
     return false;
   }
 
-  virtual mozilla::ipc::IPCResult RecvAsyncPanZoomEnabled(const uint64_t& aLayersId, bool* aHasAPZ) override;
+  virtual mozilla::ipc::IPCResult RecvGetCompositorOptions(const uint64_t& aLayersId, CompositorOptions* aOptions) override;
 
   virtual PAPZCTreeManagerParent* AllocPAPZCTreeManagerParent(const uint64_t& aLayersId) override;
   virtual bool DeallocPAPZCTreeManagerParent(PAPZCTreeManagerParent* aActor) override;
 
   virtual PAPZParent* AllocPAPZParent(const uint64_t& aLayersId) override;
   virtual bool DeallocPAPZParent(PAPZParent* aActor) override;
 
   virtual void UpdatePaintTime(LayerTransactionParent* aLayerTree, const TimeDuration& aPaintTime) override;
--- a/gfx/layers/ipc/PCompositorBridge.ipdl
+++ b/gfx/layers/ipc/PCompositorBridge.ipdl
@@ -28,16 +28,17 @@ using mozilla::layers::TouchBehaviorFlag
 using mozilla::CrossProcessMutexHandle from "mozilla/ipc/CrossProcessMutex.h";
 using mozilla::ipc::SharedMemoryBasic::Handle from "mozilla/ipc/SharedMemoryBasic.h";
 using mozilla::CSSIntRegion from "Units.h";
 using mozilla::LayoutDeviceIntPoint from "Units.h";
 using mozilla::LayoutDeviceIntRegion from "Units.h";
 using class mozilla::TimeStamp from "mozilla/TimeStamp.h";
 using class mozilla::layers::FrameUniformityData from "mozilla/layers/FrameUniformityData.h";
 using mozilla::layers::TextureFlags from "mozilla/layers/CompositorTypes.h";
+using mozilla::layers::CompositorOptions from "mozilla/layers/CompositorOptions.h";
 
 namespace mozilla {
 namespace layers {
 
 
 /**
  * The PCompositorBridge protocol is used to manage communication between
  * the main thread and the compositor thread context. It's primary
@@ -123,18 +124,18 @@ parent:
   // Must be called before Initialize().
   async PCompositorWidget(CompositorWidgetInitData aInitData);
 
   // When out-of-process, this must be called to finish initialization.
   sync Initialize(uint64_t rootLayerTreeId);
   sync Reset(LayersBackend[] aBackendHints, uint64_t aSeqNo)
     returns (bool aResult, TextureFactoryIdentifier aOutIdentifier);
 
-  // Returns whether this Compositor has APZ enabled or not.
-  sync AsyncPanZoomEnabled(uint64_t layersId) returns (bool aHasAPZ);
+  // Returns the CompositorOptions for this compositor.
+  sync GetCompositorOptions(uint64_t layersId) returns (CompositorOptions aOptions);
 
   // Must be called after Initialize(), and only succeeds if AsyncPanZoomEnabled() is true.
   async PAPZ(uint64_t layersId);
   async PAPZCTreeManager(uint64_t layersId);
 
   /**
    * Confirmation callback for UpdatePluginConfigurations and HideAllPlugins.
    */
--- a/gfx/tests/gtest/TestCompositor.cpp
+++ b/gfx/tests/gtest/TestCompositor.cpp
@@ -148,17 +148,18 @@ static already_AddRefed<Compositor> Crea
 static std::vector<LayerManagerData> GetLayerManagers(std::vector<LayersBackend> aBackends)
 {
   std::vector<LayerManagerData> managers;
 
   for (size_t i = 0; i < aBackends.size(); i++) {
     auto backend = aBackends[i];
 
     RefPtr<MockWidget> widget = new MockWidget();
-    RefPtr<widget::CompositorWidget> proxy = new widget::InProcessCompositorWidget(widget);
+    CompositorOptions options;
+    RefPtr<widget::CompositorWidget> proxy = new widget::InProcessCompositorWidget(options, widget);
     RefPtr<Compositor> compositor = CreateTestCompositor(backend, proxy);
 
     RefPtr<LayerManagerComposite> layerManager = new LayerManagerComposite(compositor);
 
     managers.push_back(LayerManagerData(compositor, widget, proxy, layerManager));
   }
 
   return managers;
--- a/gfx/vr/gfxVR.h
+++ b/gfx/vr/gfxVR.h
@@ -16,18 +16,18 @@
 #include "mozilla/TimeStamp.h"
 #include "mozilla/TypedEnumBits.h"
 
 namespace mozilla {
 namespace layers {
 class PTextureParent;
 }
 namespace dom {
-enum class GamepadMappingType : uint32_t;
-enum class GamepadHand : uint32_t;
+enum class GamepadMappingType : uint8_t;
+enum class GamepadHand : uint8_t;
 struct GamepadPoseState;
 }
 namespace gfx {
 class VRLayerParent;
 class VRDisplayHost;
 class VRControllerHost;
 
 enum class VRDeviceType : uint16_t {
new file mode 100644
--- /dev/null
+++ b/layout/reftests/svg/filter-on-continuation-box-01.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html class="reftest-wait">
+<style type="text/css">
+  div {
+    border: 1px solid grey;
+    width: 100px;
+    color: black;
+  }
+</style>
+
+<div>
+  <span id="myspan">Wrapped sentence</span>
+</div>
+
+<script>
+  window.addEventListener("MozReftestInvalidate",
+    function() {
+      document.getElementById("myspan").style.filter = "opacity(50%)";
+      document.documentElement.classList.remove("reftest-wait");
+    }, false);
+</script>
+
+</html>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/layout/reftests/svg/filter-on-continuation-box-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<style type="text/css">
+  div {
+    border: 1px solid grey;
+    width: 100px;
+    color: rgba(0,0,0,0.5);
+  }
+</style>
+
+<div>
+  <span id="myspan">Wrapped sentence</span>
+</div>
+
+</html>
\ No newline at end of file
--- a/layout/reftests/svg/reftest.list
+++ b/layout/reftests/svg/reftest.list
@@ -460,8 +460,10 @@ default-preferences
 == clipPath-and-mask-on-outflowElement-01b.html clipPath-on-outflowElement-01-ref.html
 
 != nested-mask-mode.svg about:blank
 == mask-empty-size.svg about:blank
 
 == paint-on-maskLayer-1a.html paint-on-maskLayer-1-ref.html
 == paint-on-maskLayer-1b.html paint-on-maskLayer-1-ref.html
 == paint-on-maskLayer-1c.html paint-on-maskLayer-1-ref.html
+
+fuzzy(71,817) == filter-on-continuation-box-01.html filter-on-continuation-box-ref.html
--- a/layout/style/nsStyleConsts.h
+++ b/layout/style/nsStyleConsts.h
@@ -309,18 +309,18 @@ enum class StyleOrient : uint8_t {
 #define NS_STYLE_WILL_CHANGE_SCROLL             (1<<2)
 #define NS_STYLE_WILL_CHANGE_OPACITY            (1<<3)
 #define NS_STYLE_WILL_CHANGE_FIXPOS_CB          (1<<4)
 #define NS_STYLE_WILL_CHANGE_ABSPOS_CB          (1<<5)
 
 // See AnimationEffectReadOnly.webidl
 // and mozilla/dom/AnimationEffectReadOnlyBinding.h
 namespace dom {
-enum class PlaybackDirection : uint32_t;
-enum class FillMode : uint32_t;
+enum class PlaybackDirection : uint8_t;
+enum class FillMode : uint8_t;
 }
 
 // See nsStyleDisplay
 #define NS_STYLE_ANIMATION_ITERATION_COUNT_INFINITE 0
 
 // See nsStyleDisplay
 #define NS_STYLE_ANIMATION_PLAY_STATE_RUNNING     0
 #define NS_STYLE_ANIMATION_PLAY_STATE_PAUSED      1
--- a/layout/svg/nsSVGIntegrationUtils.cpp
+++ b/layout/svg/nsSVGIntegrationUtils.cpp
@@ -21,16 +21,17 @@
 #include "nsSVGMaskFrame.h"
 #include "nsSVGPaintServerFrame.h"
 #include "nsSVGUtils.h"
 #include "FrameLayerBuilder.h"
 #include "BasicLayers.h"
 #include "mozilla/gfx/Point.h"
 #include "nsCSSRendering.h"
 #include "mozilla/Unused.h"
+#include "mozilla/RestyleManager.h"
 
 using namespace mozilla;
 using namespace mozilla::layers;
 using namespace mozilla::gfx;
 using namespace mozilla::image;
 
 // ----------------------------------------------------------------------
 
@@ -105,28 +106,38 @@ private:
     //
     //  * reftests/svg/svg-integration/clipPath-html-06.xhtml
     //  * reftests/svg/svg-integration/clipPath-html-06-extref.xhtml
     //
     // If we ever got passed a frame with the PreTransformOverflowAreasProperty
     // property set, that would be bad, since then our GetVisualOverflowRect()
     // call would give us the post-effects, and post-transform, overflow rect.
     //
-    // With image masks, there is one more exception.
-    //
-    // In nsStyleImageLayers::Layer::CalcDifference, we do not add
-    // nsChangeHint_UpdateOverflow hint when image mask(not SVG mask) property
-    // value changed, since replace image mask does not cause layout change.
-    // So even if we apply a new mask image to this frame,
-    // PreEffectsBBoxProperty might still left empty.
-    NS_ASSERTION(nsSVGEffects::GetEffectProperties(aFrame).MightHaveNoneSVGMask() ||
+    // There are two more exceptions:
+    // 1. In nsStyleImageLayers::Layer::CalcDifference, we do not add
+    //    nsChangeHint_UpdateOverflow hint when image mask(not SVG mask)
+    //    property value changed, since replace image mask does not cause
+    //    layout change. So even if we apply a new mask image to this frame,
+    //    PreEffectsBBoxProperty might still left empty.
+    // 2. During restyling: before the last continuation is restyled, there
+    //    is no guarantee that every continuation carries a
+    //    PreEffectsBBoxProperty property.
+#ifdef DEBUG
+    nsIFrame* firstFrame =
+      nsLayoutUtils::FirstContinuationOrIBSplitSibling(aFrame);
+    bool mightHaveNoneSVGMask =
+      nsSVGEffects::GetEffectProperties(firstFrame).MightHaveNoneSVGMask();
+    bool inRestyle =
+      aFrame->PresContext()->RestyleManager()->AsGecko()->IsInStyleRefresh();
+
+    NS_ASSERTION(mightHaveNoneSVGMask || inRestyle ||
                  aFrame->GetParent()->StyleContext()->GetPseudo() ==
                    nsCSSAnonBoxes::mozAnonymousBlock,
                  "How did we getting here, then?");
-
+#endif
     NS_ASSERTION(!aFrame->Properties().Get(
                    aFrame->PreTransformOverflowAreasProperty()),
                  "GetVisualOverflowRect() won't return the pre-effects rect!");
     return aFrame->GetVisualOverflowRect();
   }
 
   nsIFrame*     mFirstContinuation;
   nsIFrame*     mCurrentFrame;
--- a/media/mtransport/third_party/nICEr/src/stun/addrs.c
+++ b/media/mtransport/third_party/nICEr/src/stun/addrs.c
@@ -172,16 +172,17 @@ stun_get_win32_addrs(nr_local_addr addrs
       }
 
       r = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER, NULL, AdapterAddresses, &buflen);
       if (r == NO_ERROR) {
         break;
       }
       r_log(NR_LOG_STUN, LOG_ERR, "GetAdaptersAddresses() returned error (%d)", r);
       RFREE(AdapterAddresses);
+      AdapterAddresses = NULL;
     }
 
     if (n >= 5) {
       r_log(NR_LOG_STUN, LOG_ERR, "5 failures calling GetAdaptersAddresses()");
       ABORT(R_INTERNAL);
     }
 
     n = 0;
@@ -238,19 +239,17 @@ stun_get_win32_addrs(nr_local_addr addrs
       }
     }
 
    done:
     *count = n;
     _status = 0;
 
   abort:
-    if (AdapterAddresses) {
-      RFREE(AdapterAddresses);
-    }
+    RFREE(AdapterAddresses);
     return _status;
 }
 
 #else /* WIN32 */
 
 static int
 nr_stun_is_duplicate_addr(nr_local_addr addrs[], int count, nr_local_addr *addr);
 
--- a/testing/profiles/prefs_general.js
+++ b/testing/profiles/prefs_general.js
@@ -301,18 +301,18 @@ user_pref("browser.uitour.url", "http://
 // Tell the search service we are running in the US.  This also has the desired
 // side-effect of preventing our geoip lookup.
 user_pref("browser.search.isUS", true);
 user_pref("browser.search.countryCode", "US");
 // This will prevent HTTP requests for region defaults.
 user_pref("browser.search.geoSpecificDefaults", false);
 
 // Make sure self support doesn't hit the network.
-user_pref("browser.selfsupport.url", "https://%(server)s/selfsupport-dummy/");
-user_pref("extensions.shield-recipe-client.api_url", "https://%(server)s/selfsupport-dummy/");
+user_pref("browser.selfsupport.url", "https://example.com/selfsupport-dummy/");
+user_pref("extensions.shield-recipe-client.api_url", "https://example.com/selfsupport-dummy/");
 
 user_pref("media.eme.enabled", true);
 
 user_pref("media.autoplay.enabled", true);
 
 // Don't use auto-enabled e10s
 user_pref("browser.tabs.remote.autostart.1", false);
 user_pref("browser.tabs.remote.autostart.2", false);
--- a/toolkit/components/telemetry/Telemetry.cpp
+++ b/toolkit/components/telemetry/Telemetry.cpp
@@ -2928,18 +2928,18 @@ GetStackAndModules(const std::vector<uin
     Ret.AddFrame(frame);
   }
 
 #ifdef MOZ_ENABLE_PROFILER_SPS
   for (unsigned i = 0, n = rawModules.GetSize(); i != n; ++i) {
     const SharedLibrary &info = rawModules.GetEntry(i);
     const std::string &name = info.GetName();
     std::string basename = name;
-#ifdef XP_MACOSX
-    // FIXME: We want to use just the basename as the libname, but the
+#if defined(XP_MACOSX) || defined(XP_LINUX)
+    // We want to use just the basename as the libname, but the
     // current profiler addon needs the full path name, so we compute the
     // basename in here.
     size_t pos = name.rfind('/');
     if (pos != std::string::npos) {
       basename = name.substr(pos + 1);
     }
 #endif
     mozilla::Telemetry::ProcessedStack::Module module = {
--- a/toolkit/mozapps/extensions/internal/E10SAddonsRollout.jsm
+++ b/toolkit/mozapps/extensions/internal/E10SAddonsRollout.jsm
@@ -97,16 +97,805 @@ const set49Release = [
 const set49PaneOnly = [
   ADDONS.ABP,
   ADDONS.VDH,
   ADDONS.Emoji,
   ADDONS.ASP,
   ADDONS.ACR
 ]
 
+// ================== ADDONS FOR 51 RELEASE ==================
+//
+// During the 51 beta cycle, we tested e10s with all addons
+// except those explicitly marked as being incompatible.
+// For release, instead of opening this up, we assembled
+// the lists below with all addons that were seen on beta
+// and had over 50 installs.
+//
+// This list is in a new format to allow fast access and also
+// to allow controlling by the number of addons installed.
+
+const set51Release = {
+  "_65Members_@download.fromdoctopdf.com": {minVersion: "7.102.10.4221", installs: 32092},
+  "light_plugin_ACF0E80077C511E59DED005056C00008@kaspersky.com": {minVersion: "4.6.3-15", installs: 27758},
+  "_ceMembers_@free.easypdfcombine.com": {minVersion: "7.102.10.4117", installs: 17797},
+  "caa1-aDOiCAxFFMOVIX@jetpack": {minVersion: "0.1.7", installs: 13150},
+  "{4ED1F68A-5463-4931-9384-8FFF5ED91D92}": {minVersion: "5.0.248.0", installs: 12774},
+  "_dbMembers_@free.getformsonline.com": {minVersion: "7.102.10.4251", installs: 11909},
+  "_4zMembers_@www.videodownloadconverter.com": {minVersion: "7.102.10.5033", installs: 11612},
+  "light_plugin_F6F079488B53499DB99380A7E11A93F6@kaspersky.com": {minVersion: "5.0.141-4-20161031140250", installs: 10944},
+  "YoutubeDownloader@PeterOlayev.com": {minVersion: "2.4.1", installs: 10722},
+  "{82AF8DCA-6DE9-405D-BD5E-43525BDAD38A}": {minVersion: "8.0.0.9103", installs: 8856},
+  "client@anonymox.net": {minVersion: "2.5.2", installs: 8225},
+  "_8hMembers_@download.allin1convert.com": {minVersion: "7.102.10.3584", installs: 7681},
+  "light_plugin_D772DC8D6FAF43A29B25C4EBAA5AD1DE@kaspersky.com": {minVersion: "4.6.2-42-20160922074409", installs: 7177},
+  "_dzMembers_@www.pconverter.com": {minVersion: "7.102.10.4851", installs: 7115},
+  "fxdevtools-adapters@mozilla.org": {minVersion: "0.3.5", installs: 6926},
+  "_9pMembers_@free.onlinemapfinder.com": {minVersion: "7.102.10.4836", installs: 6583},
+  "@DownloadManager": {minVersion: "0.2.1", installs: 6412},
+  "ar1er-ewrgfdgomusix@jetpack": {minVersion: "1.0.6", installs: 5975},
+  "_agMembers_@free.premierdownloadmanager.com": {minVersion: "7.102.10.4846", installs: 5605},
+  "_paMembers_@www.filmfanatic.com": {minVersion: "7.102.10.4163", installs: 5448},
+  "_gtMembers_@free.gamingwonderland.com": {minVersion: "7.102.10.4263", installs: 5241},
+  "LVD-SAE@iacsearchandmedia.com": {minVersion: "8.5", installs: 4694},
+  "_fsMembers_@free.pdfconverterhq.com": {minVersion: "7.102.10.4849", installs: 4526},
+  "_6xMembers_@www.readingfanatic.com": {minVersion: "7.102.10.4914", installs: 4417},
+  "@mysmartprice-ff": {minVersion: "0.0.6", installs: 4381},
+  "jid1-YcMV6ngYmQRA2w@jetpack": {minVersion: "1.37.9", installs: 3899},
+  "{58d735b4-9d6c-4e37-b146-7b9f7e79e318}": {minVersion: "1.6", installs: 3733},
+  "anttoolbar@ant.com": {minVersion: "2.4.7.47", installs: 3720},
+  "adblockpopups@jessehakanen.net": {minVersion: "0.9.2.1-signed.1-signed", installs: 3602},
+  "ERAIL.IN.FFPLUGIN@jetpack": {minVersion: "6.0.rev142", installs: 3545},
+  "WebProtection@360safe.com": {minVersion: "5.0.0.1005", installs: 3475},
+  "yasearch@yandex.ru": {minVersion: "8.20.4", installs: 3299},
+  "{19503e42-ca3c-4c27-b1e2-9cdb2170ee34}": {minVersion: "1.5.6.14", installs: 3106},
+  "{C1A2A613-35F1-4FCF-B27F-2840527B6556}": {minVersion: "2016.8.1.9", installs: 3083},
+  "_b7Members_@free.mytransitguide.com": {minVersion: "7.102.10.4812", installs: 3011},
+  "_9tMembers_@free.internetspeedtracker.com": {minVersion: "7.102.10.4339", installs: 2828},
+  "_64Members_@www.televisionfanatic.com": {minVersion: "7.102.10.4968", installs: 2821},
+  "info@youtube-mp3.org": {minVersion: "1.0.9.1-signed.1-signed", installs: 2717},
+  "ffext_basicvideoext@startpage24": {minVersion: "1.97.37.1-signed.1-signed", installs: 2663},
+  "MUB-SAE@iacsearchandmedia.com": {minVersion: "8.7", installs: 2650},
+  "_4jMembers_@www.radiorage.com": {minVersion: "7.102.10.4916", installs: 2631},
+  "@Email": {minVersion: "4.0.12", installs: 2583},
+  "_gcMembers_@www.weatherblink.com": {minVersion: "7.38.8.56523", installs: 2519},
+  "_dqMembers_@www.downspeedtest.com": {minVersion: "7.102.10.3827", installs: 2445},
+  "translator@zoli.bod": {minVersion: "2.1.0.5.1.1-signed", installs: 2310},
+  "{a38384b3-2d1d-4f36-bc22-0f7ae402bcd7}": {minVersion: "1.0.0.51", installs: 2190},
+  "_1eMembers_@www.videoscavenger.com": {minVersion: "7.38.8.45273", installs: 2185},
+  "tvplusnewtab-the-extension1@mozilla.com": {minVersion: "0.1.5", installs: 2155},
+  "homepage@mail.ru": {minVersion: "1.0.2", installs: 2124},
+  "search@mail.ru": {minVersion: "1.0.7", installs: 2038},
+  "_69Members_@www.packagetracer.com": {minVersion: "7.102.10.4831", installs: 2036},
+  "{7b8a500a-a464-4624-bd4f-73eaafe0f766}": {minVersion: "3", installs: 2027},
+  "paulsaintuzb@gmail.com": {minVersion: "8.2.1", installs: 2005},
+  "k7srff_enUS@k7computing.com": {minVersion: "2.4", installs: 1929},
+  "_e5Members_@www.productivityboss.com": {minVersion: "7.38.8.46590", installs: 1892},
+  "vdpure@link64": {minVersion: "1.97.43", installs: 1860},
+  "_9tMembers_@download.internetspeedtracker.com": {minVersion: "7.38.8.56171", installs: 1824},
+  "_g3Members_@free.easyphotoedit.com": {minVersion: "7.102.10.4108", installs: 1822},
+  "_64Members_@download.televisionfanatic.com": {minVersion: "7.38.9.3004", installs: 1730},
+  "_8iMembers_@download.audiotoaudio.com": {minVersion: "7.102.10.3585", installs: 1704},
+  "adblockultimate@adblockultimate.net": {minVersion: "2.25", installs: 1648},
+  "eagleget_ffext@eagleget.com": {minVersion: "3.8", installs: 1640},
+  "_9eMembers_@free.findmefreebies.com": {minVersion: "7.102.10.4193", installs: 1638},
+  "content_blocker_663BE8@kaspersky.com": {minVersion: "4.5.4.19.1", installs: 1625},
+  "virtual_keyboard_074028@kaspersky.com": {minVersion: "4.5.4.19.1", installs: 1624},
+  "browsec@browsec.com": {minVersion: "2.0.3", installs: 1610},
+  "@Maps": {minVersion: "4.0.0", installs: 1587},
+  "_exMembers_@free.easydocmerge.com": {minVersion: "7.102.10.4137", installs: 1493},
+  "{635abd67-4fe9-1b23-4f01-e679fa7484c1}": {minVersion: "5.0.2", installs: 1490},
+  "abb@amazon.com": {minVersion: "10.1612.1.304", installs: 1463},
+  "{1BC9BA34-1EED-42ca-A505-6D2F1A935BBB}": {minVersion: "6.2.18.1", installs: 1436},
+  "mp4downloader@jeff.net": {minVersion: "1.3.3.1-signed.1-signed", installs: 1410},
+  "jid1-16aeif9OQIRKxA@jetpack": {minVersion: "1.1.4", installs: 1399},
+  "{c45c406e-ab73-11d8-be73-000a95be3b12}": {minVersion: "1.2.11", installs: 1367},
+  "online_banking_08806E@kaspersky.com": {minVersion: "4.5.4.19.1", installs: 1356},
+  "_ewMembers_@free.mergedocsonline.com": {minVersion: "7.102.10.4710", installs: 1337},
+  "@DiscreteSearch": {minVersion: "0.2.1", installs: 1306},
+  "{6AC85730-7D0F-4de0-B3FA-21142DD85326}": {minVersion: "2.8.2", installs: 1286},
+  "{063DA41A-2561-401B-91FA-AC75E460F4EB}": {minVersion: "1.0.7.1", installs: 1280},
+  "netvideohunter@netvideohunter.com": {minVersion: "1.2", installs: 1260},
+  "_8eMembers_@download.howtosimplified.com": {minVersion: "7.102.10.4285", installs: 1230},
+  "FGZ-SAE@iacsearchandmedia.com": {minVersion: "8.5", installs: 1220},
+  "adguardadblocker@adguard.com": {minVersion: "2.4.14", installs: 1172},
+  "_39Members_@www.mapsgalaxy.com": {minVersion: "7.102.10.4730", installs: 1171},
+  "_euMembers_@free.filesendsuite.com": {minVersion: "7.102.10.4154", installs: 1166},
+  "_brMembers_@free.yourtemplatefinder.com": {minVersion: "7.102.10.5047", installs: 1159},
+  "_8jMembers_@download.myimageconverter.com": {minVersion: "7.102.10.4778", installs: 1150},
+  "_12Members_@free.myscrapnook.com": {minVersion: "7.102.10.4739", installs: 1113},
+  "_7eMembers_@www.homeworksimplified.com": {minVersion: "7.102.10.4290", installs: 1109},
+  "{fe272bd1-5f76-4ea4-8501-a05d35d823fc}": {minVersion: "2.1.9.1-signed.1-let-fixed.1-signed", installs: 1108},
+  "_frMembers_@free.testforspeed.com": {minVersion: "7.102.10.4993", installs: 1107},
+  "{068e178c-61a9-4a63-b74f-87404a6f5ea1}": {minVersion: "2", installs: 1104},
+  "@Package": {minVersion: "0.2.0", installs: 1092},
+  "6asa42dfa4784fsf368g@youtubeconverter.me": {minVersion: "0.1", installs: 1071},
+  "_diMembers_@www.free.easymaillogin.com": {minVersion: "7.102.10.4112", installs: 1043},
+  "_v4Members_@www.dictionaryboss.com": {minVersion: "7.102.10.3797", installs: 1035},
+  "colorPicker@colorPicker": {minVersion: "3.0.1-signed.1-signed", installs: 1023},
+  "hotspot-shield@anchorfree.com": {minVersion: "1.2.87", installs: 1000},
+  "manishjain9@hotmail.com_easiestyoutube": {minVersion: "7.2.1-signed.1-let-fixed.1-signed", installs: 993},
+  "{cd617375-6743-4ee8-bac4-fbf10f35729e}": {minVersion: "2.9.6", installs: 987},
+  "@Converter": {minVersion: "4.1.0", installs: 986},
+  "{dd3d7613-0246-469d-bc65-2a3cc1668adc}": {minVersion: "1.1.8.1-signed.1-signed", installs: 983},
+  "ubufox@ubuntu.com": {minVersion: "3.2", installs: 950},
+  "jid1-lpoiffmusixlib@jetpack": {minVersion: "0.1.9", installs: 945},
+  "_5aMembers_@download.mywebface.com": {minVersion: "7.102.10.4837", installs: 930},
+  "leethax@leethax.net": {minVersion: "2016.12.02", installs: 930},
+  "{1A2D0EC4-75F5-4c91-89C4-3656F6E44B68}": {minVersion: "0.6.3.1-signed.1-signed", installs: 885},
+  "{64161300-e22b-11db-8314-0800200c9a66}": {minVersion: "0.9.6.18", installs: 875},
+  "_bfMembers_@free.snapmyscreen.com": {minVersion: "7.102.10.4951", installs: 827},
+  "uriloader@pdf.js": {minVersion: "1.0.277.1-signed.1-signed", installs: 815},
+  "{e968fc70-8f95-4ab9-9e79-304de2a71ee1}": {minVersion: "0.7.3.1-signed.1-signed", installs: 805},
+  "save-as-pdf-ff@pdfcrowd.com": {minVersion: "1.5.1-signed.1-signed", installs: 804},
+  "{75CEEE46-9B64-46f8-94BF-54012DE155F0}": {minVersion: "0.4.15", installs: 794},
+  "safesearchplus2@avira.com": {minVersion: "1.4.1.371", installs: 786},
+  "easyscreenshot@mozillaonline.com": {minVersion: "1.2.8", installs: 785},
+  "_eeMembers_@download.freeradiocast.com": {minVersion: "7.38.8.46366", installs: 783},
+  "_89Members_@download.safepcrepair.com": {minVersion: "7.39.8.51080", installs: 777},
+  "{a3a5c777-f583-4fef-9380-ab4add1bc2a5}": {minVersion: "2.4.2.1-signed", installs: 771},
+  "content_blocker@kaspersky.com": {minVersion: "4.0.10.15", installs: 770},
+  "safesearch@avira.com": {minVersion: "1.4.1.371", installs: 767},
+  "youtube2mp3@mondayx.de": {minVersion: "1.2.3.1-signed.1-signed", installs: 748},
+  "2020Player_IKEA@2020Technologies.com": {minVersion: "5.0.94.1", installs: 736},
+  "_edMembers_@free.myradioaccess.com": {minVersion: "7.102.10.4797", installs: 734},
+  "_dmMembers_@free.gounzip.com": {minVersion: "7.102.10.4277", installs: 733},
+  "Media-Newtab-the-extension1@mozilla.com": {minVersion: "0.1.6", installs: 732},
+  "foxmarks@kei.com": {minVersion: "4.3.19", installs: 728},
+  "{e8deb9e5-5688-4655-838a-b7a121a9f16e}": {minVersion: "48.4", installs: 726},
+  "{195A3098-0BD5-4e90-AE22-BA1C540AFD1E}": {minVersion: "4.1.0.1-signed.1-signed", installs: 722},
+  "jid1-4P0kohSJxU1qGg@jetpack": {minVersion: "1.22.550", installs: 719},
+  "DailymotionVideoDownloader@PeterOlayev.com": {minVersion: "1.0.6.1-signed.1-signed", installs: 717},
+  "jid1-P34HaABBBpOerQ@jetpack": {minVersion: "0.2.1-signed.1-signed", installs: 715},
+  "SQLiteManager@mrinalkant.blogspot.com": {minVersion: "0.8.3.1-signed.1-signed", installs: 700},
+  "2.0@disconnect.me": {minVersion: "3.15.3.1-signed.1-signed", installs: 693},
+  "multifox@hultmann": {minVersion: "3.2.3", installs: 690},
+  "_5mMembers_@download.myfuncards.com": {minVersion: "7.102.10.4783", installs: 679},
+  "_btMembers_@free.catsandcatapults.com": {minVersion: "7.102.10.3677", installs: 673},
+  "pavel.sherbakov@gmail.com": {minVersion: "19.1.1", installs: 666},
+  "_fbMembers_@free.smarterpassword.com": {minVersion: "7.102.10.4936", installs: 644},
+  "jid2-l8SPBzHJWBIiHQ@jetpack": {minVersion: "3.1", installs: 639},
+  "{B17C1C5A-04B1-11DB-9804-B622A1EF5492}": {minVersion: "1.3.2", installs: 633},
+  "myplaycitycom@gametab": {minVersion: "1.6", installs: 616},
+  "{ad0d925d-88f8-47f1-85ea-8463569e756e}": {minVersion: "2.0.5", installs: 604},
+  "{37964A3C-4EE8-47b1-8321-34DE2C39BA4D}": {minVersion: "2.5.4.174", installs: 603},
+  "youtubemp3podcaster@jeremy.d.gregorio.com": {minVersion: "3.9.0", installs: 601},
+  "caa1-aDOiCAxFFPRIVATE@jetpack": {minVersion: "0.2.0", installs: 598},
+  "_f5Members_@free.typingfanatic.com": {minVersion: "7.102.10.5014", installs: 595},
+  "_94Members_@www.motitags.com": {minVersion: "7.102.10.4744", installs: 594},
+  "{888d99e7-e8b5-46a3-851e-1ec45da1e644}": {minVersion: "45.0.0", installs: 581},
+  "_1cMembers_@www.bringmesports.com": {minVersion: "7.102.10.3646", installs: 580},
+  "{a6fd85ed-e919-4a43-a5af-8da18bda539f}": {minVersion: "2.9.1.1-signed", installs: 572},
+  "{0fc22c4c-93ed-48ea-ad12-dc8039cf3795}": {minVersion: "1.3", installs: 568},
+  "homeutil@yandex.ru": {minVersion: "1.0.13", installs: 565},
+  "_doMembers_@free.convertanyfile.com": {minVersion: "7.38.8.45860", installs: 563},
+  "SocialNewPages-the-extension1@mozilla.com": {minVersion: "0.1.9", installs: 561},
+  "wappalyzer@crunchlabz.com": {minVersion: "3.2.7", installs: 557},
+  "_5qMembers_@www.zwinky.com": {minVersion: "7.38.8.45270", installs: 551},
+  "{0545b830-f0aa-4d7e-8820-50a4629a56fe}": {minVersion: "31.0.9", installs: 531},
+  "vk@sergeykolosov.mp": {minVersion: "0.3.9.5", installs: 522},
+  "{77b819fa-95ad-4f2c-ac7c-486b356188a9}": {minVersion: "4.0.20130422.1-signed.1-signed", installs: 505},
+  "@true-key": {minVersion: "1.23.0.2433", installs: 501},
+  "_1pMembers_@www.referenceboss.com": {minVersion: "7.102.10.4932", installs: 499},
+  "{C7AE725D-FA5C-4027-BB4C-787EF9F8248A}": {minVersion: "1.0.0.4", installs: 494},
+  "alx-ffdeveloper@amazon.com": {minVersion: "3.0.2", installs: 493},
+  "{3d7eb24f-2740-49df-8937-200b1cc08f8a}": {minVersion: "1.5.20", installs: 491},
+  "_1gMembers_@www.inboxace.com": {minVersion: "7.38.8.56535", installs: 488},
+  "{7DD78D43-0962-4d9b-BC76-ABF13B3B2ED1}": {minVersion: "3.5.0.1428", installs: 484},
+  "imageblock@hemantvats.com": {minVersion: "3.1", installs: 472},
+  "onepassword4@agilebits.com": {minVersion: "4.6.2", installs: 470},
+  "online_banking@kaspersky.com": {minVersion: "4.0.10.15", installs: 463},
+  "virtual_keyboard@kaspersky.com": {minVersion: "4.0.10.15", installs: 463},
+  "button@scholar.google.com": {minVersion: "1.1.1-signed.1-signed", installs: 463},
+  "anti_banner@kaspersky.com": {minVersion: "4.0.10.15", installs: 462},
+  "url_advisor@kaspersky.com": {minVersion: "4.0.10.15", installs: 461},
+  "{6d96bb5e-1175-4ebf-8ab5-5f56f1c79f65}": {minVersion: "0.9.8", installs: 457},
+  "_14Members_@download.totalrecipesearch.com": {minVersion: "7.102.10.4983", installs: 456},
+  "{394DCBA4-1F92-4f8e-8EC9-8D2CB90CB69B}": {minVersion: "5.1.1", installs: 447},
+  "_57Members_@free.marineaquariumfree.com": {minVersion: "7.102.10.4716", installs: 446},
+  "e67f8350-7edf-11e3-baa7-0800200c9a66@fri-gate.org": {minVersion: "2.2.1.1-signed", installs: 446},
+  "FireXPath@pierre.tholence.com": {minVersion: "0.9.7.1.1-signed.1-signed", installs: 442},
+  "@youtube_downloader": {minVersion: "0.0.9", installs: 435},
+  "ff_hpset@jetpack": {minVersion: "1.0.8", installs: 428},
+  "{d0bfdcce-52c7-4b32-bb45-948f62db8d3f}": {minVersion: "49.1", installs: 406},
+  "_j2Members_@www.soccerinferno.com": {minVersion: "7.102.10.4948", installs: 405},
+  "autoform@olifozzy": {minVersion: "1.2.4.1-signed.1-signed", installs: 405},
+  "FunSafeTab-the-extension1@mozilla.com": {minVersion: "0.1.9", installs: 405},
+  "testpilot@labs.mozilla.com": {minVersion: "1.2.3.1-signed", installs: 405},
+  "vwof@drev.com": {minVersion: "3.1.2", installs: 401},
+  "_ftMembers_@free.mytelevisionhq.com": {minVersion: "7.102.10.4817", installs: 397},
+  "{e001c731-5e37-4538-a5cb-8168736a2360}": {minVersion: "0.9.9.152", installs: 396},
+  "{95E84BD3-3604-4AAC-B2CA-D9AC3E55B64B}": {minVersion: "2.0.0.78", installs: 393},
+  "jid0-9XfBwUWnvPx4wWsfBWMCm4Jj69E@jetpack": {minVersion: "0.4.11", installs: 390},
+  "_8lMembers_@free.filesharefanatic.com": {minVersion: "7.102.10.4171", installs: 389},
+  "clipconverter@clipconverter.cc": {minVersion: "1.5.2", installs: 387},
+  "_7jMembers_@download.gardeningenthusiast.com": {minVersion: "7.102.10.4260", installs: 383},
+  "antmark@ant.com": {minVersion: "1.1.14", installs: 383},
+  "_flMembers_@free.myformsfinder.com": {minVersion: "7.102.10.4784", installs: 381},
+  "{c36177c0-224a-11da-8cd6-0800200c9a91}": {minVersion: "3.9.85.1-signed.1-signed", installs: 375},
+  "@searchincognito": {minVersion: "0.1.0", installs: 375},
+  "{f13b157f-b174-47e7-a34d-4815ddfdfeb8}": {minVersion: "0.9.89.1-signed.1-signed", installs: 373},
+  "_5eMembers_@www.translationbuddy.com": {minVersion: "7.38.8.45962", installs: 372},
+  "{9c51bd27-6ed8-4000-a2bf-36cb95c0c947}": {minVersion: "11.0.1.1-signed.1-signed", installs: 370},
+  "clickclean@hotcleaner.com": {minVersion: "4.1.1-signed.1-signed", installs: 366},
+  "jid1-xKH0EoS44u1a2w@jetpack": {minVersion: "0.1.1-signed.1-signed", installs: 366},
+  "{c2056674-a37f-4b29-9300-2004759d74fe}": {minVersion: "2.0.0.1090", installs: 361},
+  "newtab-tv-the-extension1@mozilla.com": {minVersion: "0.1.5", installs: 359},
+  "ascsurfingprotectionnew@iobit.com": {minVersion: "2.1.3", installs: 355},
+  "FunTabSafe-the-extension1@mozilla.com": {minVersion: "0.1.9", installs: 353},
+  "d.lehr@chello.at": {minVersion: "1.2", installs: 350},
+  "anticontainer@downthemall.net": {minVersion: "1.5", installs: 348},
+  "{F8A55C97-3DB6-4961-A81D-0DE0080E53CB}": {minVersion: "1.0.10", installs: 347},
+  "@FormsApp": {minVersion: "0.2.0", installs: 346},
+  "multilinksplus@hugsmile.eu": {minVersion: "3.9.3", installs: 343},
+  "jid1-KWFaW5zc0EbtBQ@jetpack": {minVersion: "0.2.0", installs: 335},
+  "{e8f509f0-b677-11de-8a39-0800200c9a66}": {minVersion: "1.12.1-signed.1-let-fixed.1-signed", installs: 334},
+  "{37E4D8EA-8BDA-4831-8EA1-89053939A250}": {minVersion: "3.0.0.2.1-signed.1-signed", installs: 333},
+  "{c8d3bc80-0810-4d21-a2c2-be5f2b2832ac}": {minVersion: "0.98", installs: 332},
+  "{cb40da56-497a-4add-955d-3377cae4c33b}": {minVersion: "10.2.0.271", installs: 331},
+  "{5546F97E-11A5-46b0-9082-32AD74AAA920}": {minVersion: "0.76.1-signed.1-signed", installs: 325},
+  "_14Members_@www.totalrecipesearch.com": {minVersion: "7.38.8.45925", installs: 324},
+  "info@mp3it.eu": {minVersion: "1.4.1.1-signed.1-signed", installs: 324},
+  "firefox-autofill@googlegroups.com": {minVersion: "3.6.1-signed.1-signed", installs: 317},
+  "jid1-TQvJxTBYHA8qXg@jetpack": {minVersion: "0.4.1-signed.1-signed", installs: 315},
+  "{8f8fe09b-0bd3-4470-bc1b-8cad42b8203a}": {minVersion: "0.17.1-signed.1-signed", installs: 311},
+  "{D4DD63FA-01E4-46a7-B6B1-EDAB7D6AD389}": {minVersion: "0.9.10.1-signed.1-signed", installs: 311},
+  "{d7f46ca0-899d-11da-a72b-0800200c9a65}": {minVersion: "0.1.2.1-signed.1-signed", installs: 311},
+  "twoo@twoo.com": {minVersion: "1.6.0.1-signed", installs: 303},
+  "_29Members_@www.headlinealley.com": {minVersion: "7.38.8.56537", installs: 302},
+  "_e2Members_@free.coolpopulargames.com": {minVersion: "7.38.8.45873", installs: 300},
+  "TopTVTab-the-extension1@mozilla.com": {minVersion: "0.1.9", installs: 300},
+  "tmbepff@trendmicro.com": {minVersion: "9.2.0.1026", installs: 293},
+  "_2vMembers_@www.dailybibleguide.com": {minVersion: "7.38.8.52880", installs: 289},
+  "{54e46280-0211-11e3-b778-0800200c9a66}": {minVersion: "0.3", installs: 285},
+  "_49Members_@www.utilitychest.com": {minVersion: "7.38.8.45977", installs: 284},
+  "amcontextmenu@loucypher": {minVersion: "0.4.2.1-signed.1-signed", installs: 284},
+  "jid1-r1tDuNiNb4SEww@jetpack": {minVersion: "1.1.2673", installs: 283},
+  "_erMembers_@free.getvideoconvert.com": {minVersion: "7.102.10.5038", installs: 281},
+  "{b1df372d-8b32-4c7d-b6b4-9c5b78cf6fb1}": {minVersion: "0.87.1-signed.1-signed", installs: 281},
+  "jid1-cHKBMlArKdIVEg@jetpack": {minVersion: "1.24.1-signed.1-signed", installs: 281},
+  "@90B817C8-8A5C-413B-9DDD-B2C61ED6E79A": {minVersion: "1.09", installs: 278},
+  "smarterwiki@wikiatic.com": {minVersion: "5.2.1.1-signed.1-signed", installs: 278},
+  "whatsapppanel@alejandrobrizuela.com.ar": {minVersion: "1.1.1.1-signed.1-signed", installs: 277},
+  "lazarus@interclue.com": {minVersion: "2.3.1-signed.1-signed", installs: 275},
+  "{DEDA1132-B316-11DD-8BC1-4E5D56D89593}": {minVersion: "0.18", installs: 274},
+  "_h2Members_@free.calendarspark.com": {minVersion: "7.102.10.3641", installs: 273},
+  "@youtubedownloadere": {minVersion: "0.0.1", installs: 273},
+  "multirevenue@googlemail.com": {minVersion: "6.1.1", installs: 272},
+  "_d9Members_@www.everydaylookup.com": {minVersion: "7.102.10.4140", installs: 271},
+  "belgiumeid@eid.belgium.be": {minVersion: "1.0.21", installs: 271},
+  "{62DD0A97-FDD4-421b-94A5-D1A9434450C7}": {minVersion: "3.1", installs: 270},
+  "the-addon-bar@GeekInTraining-GiT": {minVersion: "3.2.9-compat-fixed-4", installs: 264},
+  "@phextension": {minVersion: "6.0.2", installs: 262},
+  "FunMediaTab-the-extension1@mozilla.com": {minVersion: "0.1.9", installs: 262},
+  "{7f57cf46-4467-4c2d-adfa-0cba7c507e54}": {minVersion: "4.0.1", installs: 259},
+  "safefacebook@bkav": {minVersion: "1.0.4", installs: 255},
+  "content_blocker_6418E0D362104DADA084DC312DFA8ABC@kaspersky.com": {minVersion: "4.5.3.8", installs: 254},
+  "virtual_keyboard_294FF26A1D5B455495946778FDE7CEDB@kaspersky.com": {minVersion: "4.5.3.8", installs: 254},
+  "{B821BF60-5C2D-41EB-92DC-3E4CCD3A22E4}": {minVersion: "4.3.1.10", installs: 252},
+  "@E9438230-A7DF-4D1F-8F2D-CA1D0F0F7924": {minVersion: "1.08.8.66", installs: 252},
+  "jid1-6MGm94JnyY2VkA@jetpack": {minVersion: "2.1.8", installs: 250},
+  "{20a82645-c095-46ed-80e3-08825760534b}": {minVersion: "1.3.1.1-signed", installs: 246},
+  "{a192bf54-089f-4325-ac25-7eafcd17a342}": {minVersion: "3.2", installs: 246},
+  "e389d8c2-5554-4ba2-a36e-ac7a57093130@gmail.com": {minVersion: "1.44.275", installs: 244},
+  "yslow@yahoo-inc.com": {minVersion: "3.1.8.1-signed.1-signed", installs: 244},
+  "avg@safeguard": {minVersion: "19.6.0.592", installs: 243},
+  "@windscribeff": {minVersion: "0.1.43", installs: 242},
+  "jid1-PBNne26X1Kn6hQ@jetpack": {minVersion: "3.3.3", installs: 240},
+  "{53A03D43-5363-4669-8190-99061B2DEBA5}": {minVersion: "1.5.14", installs: 239},
+  "@offersolymp": {minVersion: "0.0.2", installs: 238},
+  "firefox@dotvpn.com": {minVersion: "1.0.2", installs: 238},
+  "{62760FD6-B943-48C9-AB09-F99C6FE96088}": {minVersion: "4.2.9", installs: 236},
+  "jid1-sNL73VCI4UB0Fw@jetpack": {minVersion: "2.1.4", installs: 236},
+  "low_quality_flash@pie2k.com": {minVersion: "0.2.1-signed.1-signed", installs: 236},
+  "jid1-l6VQSR2FeKnliQ@jetpack": {minVersion: "2.0.1-signed", installs: 235},
+  "_5zMembers_@www.couponxplorer.com": {minVersion: "7.102.10.3738", installs: 234},
+  "adonis.cuhk@gmail.com": {minVersion: "1.8.9.1-signed.1-signed", installs: 234},
+  "_e1Members_@free.actionclassicgames.com": {minVersion: "7.38.8.45834", installs: 232},
+  "{ea4637dc-e014-4c17-9c2c-879322d23268}": {minVersion: "2.1.1-signed.1-signed", installs: 229},
+  "{4DC70064-89E2-4a55-8FC6-E8CDEAE3618C}": {minVersion: "0.7.7.1-signed.1-signed", installs: 228},
+  "odyssey_crypto_control@odysseytec.com": {minVersion: "3.5", installs: 228},
+  "seostatus@rubyweb": {minVersion: "1.5.9.1-signed.1-signed", installs: 228},
+  "_apMembers_@free.puzzlegamesdaily.com": {minVersion: "7.102.10.4865", installs: 227},
+  "@safesearchincognito": {minVersion: "0.1.8", installs: 226},
+  "jid1-HfCj61J5q2gaGQ@jetpack": {minVersion: "1.0.3", installs: 224},
+  "@stopads": {minVersion: "0.0.4", installs: 224},
+  "dta3noaero@vano": {minVersion: "1.0.1", installs: 224},
+  "rainbow@colors.org": {minVersion: "1.6.1-signed.1-signed", installs: 223},
+  "{146f1820-2b0d-49ef-acbf-d85a6986e10c}": {minVersion: "0.1.9.3.1-signed.1-signed", installs: 222},
+  "{b2bfe60c-eef8-4e20-8334-c53afdc1ffdd}": {minVersion: "3.2", installs: 222},
+  "{b7870b41-bfb3-44cd-8cc2-e392e51b0874}": {minVersion: "3.8", installs: 222},
+  "printPages2Pdf@reinhold.ripper": {minVersion: "0.1.9.3.1-signed", installs: 221},
+  "YouTubetoALL@ALLPlayer.org": {minVersion: "0.8.5.1-signed.1-signed", installs: 221},
+  "{7a526449-3a92-426f-8ca4-47439918f2b1}": {minVersion: "3.2", installs: 219},
+  "jdwimqhayu@yahoo.com": {minVersion: "0.0.0.6", installs: 219},
+  "{54FBE89E-C878-46bb-A064-AB327EE26EBC}": {minVersion: "3.8", installs: 214},
+  "modernDownloadManager@teo.pl": {minVersion: "0.2.2", installs: 214},
+  "{eb8fff7e-1dce-4f3f-a51d-d9513ed6bab4}": {minVersion: "3.8", installs: 211},
+  "jid0-YQz0l1jthOIz179ehuitYAOdBEs@jetpack": {minVersion: "2.0.2", installs: 211},
+  "{7e80e173-7e63-464e-8252-fe170b15c15a}": {minVersion: "2.3", installs: 210},
+  "{35d6291e-1d4b-f9b4-c52f-77e6410d1326}": {minVersion: "4.11.1.0", installs: 209},
+  "{3c59c791-aeec-44bb-af60-ff112eea18e3}": {minVersion: "3.2", installs: 209},
+  "{90477448-b59c-48cd-98af-6a298cbc15d2}": {minVersion: "3.8", installs: 209},
+  "{24d26487-6274-48b1-b500-22f24884f971}": {minVersion: "2.3", installs: 208},
+  "{b7389dbc-6646-412f-bbd5-53168ee68a98}": {minVersion: "49", installs: 208},
+  "{22181a4d-af90-4ca3-a569-faed9118d6bc}": {minVersion: "11.0.0.1181", installs: 207},
+  "printpdf@pavlov.net": {minVersion: "0.76.1-signed.1-signed", installs: 207},
+  "@com.virtualjame.disableads": {minVersion: "0.1.0", installs: 206},
+  "{9AA46F4F-4DC7-4c06-97AF-6665170634FE}": {minVersion: "1.11.6.1-signed.1-signed", installs: 205},
+  "tinyjsdebugger@enigmail.net": {minVersion: "1.1.5", installs: 204},
+  "_foMembers_@free.flightsearchapp.com": {minVersion: "7.102.10.4176", installs: 202},
+  "jid1-rs90nxQtPi3Asg@jetpack": {minVersion: "1.8.1-signed.1-signed", installs: 201},
+  "vlcplaylist@helgatauscher.de": {minVersion: "0.8.1-signed.1-signed", installs: 201},
+  "jid1-G80Ec8LLEbK5fQ@jetpack": {minVersion: "1.3.8", installs: 200},
+  "_gpMembers_@free.mymapswizard.com": {minVersion: "7.102.10.4775", installs: 199},
+  "BestMediaTab-the-extension1@mozilla.com": {minVersion: "0.1.9", installs: 199},
+  "info@convert2mp3.net": {minVersion: "2.5.1-signed.1-signed", installs: 199},
+  "partnerdefaults@mozilla.com": {minVersion: "1.0.1", installs: 199},
+  "qwantcomforfirefox@jetpack": {minVersion: "3.0.28", installs: 199},
+  "{65e41d20-f092-41b7-bb83-c6e8a9ab0f57}": {minVersion: "1.2.6", installs: 198},
+  "amznUWL2@amazon.com": {minVersion: "1.11", installs: 197},
+  "{1b80ae74-4912-44fc-9f27-30f9252a5ad7}": {minVersion: "2.3", installs: 197},
+  "{c9b4cd26-6f0e-4972-a9e0-8b77e811aa8f}": {minVersion: "2.3", installs: 197},
+  "shopcbtoolbar2@befrugal.com": {minVersion: "2013.3.23.1", installs: 197},
+  "trafficlight@bitdefender.com": {minVersion: "0.2.23.1-signed.1-signed", installs: 197},
+  "webrank-toolbar@probcomp.com": {minVersion: "4.4.1.1-signed.1-signed", installs: 197},
+  "_4lMembers_@www.bibletriviatime.com": {minVersion: "7.102.10.4330", installs: 196},
+  "xthunder@lshai.com": {minVersion: "1.3.4.1-signed.1-signed", installs: 196},
+  "extension@hidemyass.com": {minVersion: "1.3.2", installs: 195},
+  "jid1-MIAJd5BiK7V4Pw@jetpack": {minVersion: "0.9.1-signed.1-signed", installs: 195},
+  "{51aa69f8-8825-4def-916a-a766c5e3c0fd}": {minVersion: "3.8", installs: 194},
+  "{2bc72c53-9bde-4db2-8479-eda9a5e71f4e}": {minVersion: "3.2", installs: 193},
+  "{a95d8332-e4b4-6e7f-98ac-20b733364387}": {minVersion: "1.0.5", installs: 191},
+  "ocr@babylon.com": {minVersion: "1.1", installs: 191},
+  "{d3b9472c-f8b1-4a10-935b-1087bac8417f}": {minVersion: "3.8", installs: 189},
+  "windowpromo@dm73.net": {minVersion: "1.6", installs: 188},
+  "alldownloader@link64": {minVersion: "1.00.17.1-signed.1-signed", installs: 187},
+  "{3e0e7d2a-070f-4a47-b019-91fe5385ba79}": {minVersion: "3.6.5.2", installs: 185},
+  "jid1-vFmnfCkyf5VeSA@jetpack": {minVersion: "0.4.0", installs: 185},
+  "@greatdealz": {minVersion: "0.0.3", installs: 184},
+  "superstart@enjoyfreeware.org": {minVersion: "7.4.0.1-signed", installs: 183},
+  "{c2fc3c2b-a65a-453c-bf95-101fde56ed1d}": {minVersion: "2.3", installs: 182},
+  "{53152e75-fd90-472f-9d30-5cba3679eab9}": {minVersion: "48.3", installs: 180},
+  "jid0-raWjElI57dRa4jx9CCiYm5qZUQU@jetpack": {minVersion: "3.0.12.1.1-signed.1-signed", installs: 180},
+  "_ivMembers_@free.simplepictureedit.com": {minVersion: "7.102.10.14166", installs: 179},
+  "jid1-wKRSK9TpFpr9Hw@jetpack": {minVersion: "0.92", installs: 179},
+  "emailExtractor@penzil.com": {minVersion: "1.3.1-signed.1-signed", installs: 178},
+  "{60B7679C-BED9-11E5-998D-8526BB8E7F8B}": {minVersion: "6.3", installs: 177},
+  "@pdfit": {minVersion: "0.1.9", installs: 177},
+  "jid1-6AyZ1PQXsR9LgQ@jetpack": {minVersion: "0.2.1", installs: 177},
+  "_6oMembers_@free.heroicplay.com": {minVersion: "7.38.8.46626", installs: 175},
+  "{4BBDD651-70CF-4821-84F8-2B918CF89CA3}": {minVersion: "8.9.3.1", installs: 173},
+  "jid1-GeRCnsiDhZiTvA@jetpack": {minVersion: "1.0.3", installs: 172},
+  "jid0-zs24wecdcQo0Lp18D7QOV4WSZFo@jetpack": {minVersion: "0.2.1-signed.1-signed", installs: 171},
+  "{c50ca3c4-5656-43c2-a061-13e717f73fc8}": {minVersion: "5.0.1.48.1-signed.1-signed", installs: 170},
+  "selenium_ide_buttons@egarracingteam.com.ar": {minVersion: "1.2.0.1-signed.1-signed", installs: 170},
+  "WSVCU@Wondershare.com": {minVersion: "7.1.0", installs: 169},
+  "{4cc4a13b-94a6-7568-370d-5f9de54a9c7f}": {minVersion: "2.7.1-signed.1-signed", installs: 168},
+  "{aa84ce40-4253-a00a-8cd6-0800200f9a67}": {minVersion: "3.12.0", installs: 168},
+  "FasterFox_Lite@BigRedBrent": {minVersion: "3.9.9Lite.1-signed.1-signed", installs: 167},
+  "{6cc0f0f7-a6e2-4834-9682-24de2229b51e}": {minVersion: "23.6", installs: 166},
+  "{b749fc7c-e949-447f-926c-3f4eed6accfe}": {minVersion: "0.7.1.1.1-signed.1-signed", installs: 166},
+  "@mendeleyimporter": {minVersion: "1.6.8", installs: 166},
+  "ALone-live@ya.ru": {minVersion: "1.4.11", installs: 166},
+  "{4093c4de-454a-4329-8aff-c6b0b123c386}": {minVersion: "0.8.14.1-signed.1-signed", installs: 165},
+  "cookiemgr@jayapal.com": {minVersion: "5.12", installs: 164},
+  "touchenex@raon.co.kr": {minVersion: "1.0.1.11", installs: 163},
+  "{b0e1b4a6-2c6f-4e99-94f2-8e625d7ae255}": {minVersion: "3.5.0.1-signed.1-signed", installs: 162},
+  "isreaditlater@ideashower.com": {minVersion: "3.0.6.1-signed", installs: 161},
+  "safesearchplus@avira.com": {minVersion: "1.4.1.371", installs: 161},
+  "_e0Members_@www.downshotfree.com": {minVersion: "7.102.10.3833", installs: 159},
+  "LDSI_plashcor@gmail.com": {minVersion: "1.1.0.3", installs: 159},
+  "jid1-9ETkKdBARv7Iww@jetpack": {minVersion: "0.20.1-signed.1-signed", installs: 157},
+  "jid1-CGxMej0nDJTjwQ@jetpack": {minVersion: "1.0.1-signed.1-signed", installs: 157},
+  "{00f7ab9f-62f4-4145-b2f9-38d579d639f6}": {minVersion: "49", installs: 156},
+  "googledictionary@toptip.ca": {minVersion: "7.5", installs: 156},
+  "shopearn@prodege.com": {minVersion: "219", installs: 156},
+  "fvdmedia@gmail.com": {minVersion: "11.0.1", installs: 155},
+  "magicplayer_unlisted@acestream.org": {minVersion: "1.1.42", installs: 155},
+  "{0538E3E3-7E9B-4d49-8831-A227C80A7AD3}": {minVersion: "2.2.2.1-signed.1-let-fixed.1-signed", installs: 154},
+  "{73007fef-a6e0-47d3-b4e7-dfc116ed6f65}": {minVersion: "1.15.1-signed.1-signed", installs: 153},
+  "{cd617372-6743-4ee4-bac4-fbf60f35719e}": {minVersion: "2.0.1-signed.1-signed", installs: 152},
+  "TopSecurityTab-the-extension1@mozilla.com": {minVersion: "0.1.9", installs: 152},
+  "jid1-hDf2iQXGiUjzGQ@jetpack": {minVersion: "2.5.0", installs: 151},
+  "_dnMembers_@www.free.webmailworld.com": {minVersion: "7.102.10.5052", installs: 149},
+  "jid1-rrMTK7JqsxNOeQ@jetpack": {minVersion: "2.1.0", installs: 149},
+  "jid1-XgC5trUcILmXBw@jetpack": {minVersion: "2.0.3", installs: 149},
+  "online_banking_69A4E213815F42BD863D889007201D82@kaspersky.com": {minVersion: "4.5.3.8", installs: 148},
+  "jid1-AXn9cXcB4fD1QQ@jetpack": {minVersion: "0.7.4", installs: 148},
+  "feedly@devhd": {minVersion: "16.0.528.1-signed.1-signed", installs: 147},
+  "{6E727987-C8EA-44DA-8749-310C0FBE3C3E}": {minVersion: "2.0.0.11", installs: 146},
+  "{1082eb84-f0f2-11e5-8e18-9bb85ab7992e}": {minVersion: "1.07", installs: 146},
+  "{c151d79e-e61b-4a90-a887-5a46d38fba99}": {minVersion: "2.8.8", installs: 146},
+  "public.proartex@gmail.com": {minVersion: "1.1.3", installs: 145},
+  "jid1-8J7ayxTha4KqKQ@jetpack": {minVersion: "1.1.1-signed.1-signed", installs: 144},
+  "stealthyextension@gmail.com": {minVersion: "3.0.1.1-signed", installs: 144},
+  "_beMembers_@free.dailylocalguide.com": {minVersion: "7.38.9.7920", installs: 143},
+  "mytube@ashishmishra.in": {minVersion: "0.979.1-signed.1-signed", installs: 142},
+  "@A3592ADB-854A-443A-854E-EB92130D470D": {minVersion: "1.08.8.88", installs: 139},
+  "FunkyTVTabs-the-extension1@mozilla.com": {minVersion: "0.1.9", installs: 139},
+  "jid1-QpHD8URtZWJC2A@jetpack": {minVersion: "4.3.0", installs: 138},
+  "savedeo-video-downloader@fczbkk.com": {minVersion: "0.4.1.1-signed.1-signed", installs: 137},
+  "toolbar@shopathome.com": {minVersion: "8.20.3.1", installs: 137},
+  "_dyMembers_@www.dezipper.com": {minVersion: "7.102.10.3775", installs: 135},
+  "jid0-zXo3XFGyiDalgkeEO4UYJTUwo2I@jetpack": {minVersion: "1.0.0", installs: 134},
+  "{d57c9ff1-6389-48fc-b770-f78bd89b6e8a}": {minVersion: "1.46.1-signed.1-signed", installs: 133},
+  "@searchlock-fx": {minVersion: "1.1.6", installs: 133},
+  "dm@jetpack": {minVersion: "0.0.2", installs: 133},
+  "proxyselector@mozilla.org": {minVersion: "1.31.1-signed.1-signed", installs: 133},
+  "{065829BC-17B5-4C0B-9429-3173C361092E}": {minVersion: "1.0.8", installs: 132},
+  "{ada4b710-8346-4b82-8199-5de2b400a6ae}": {minVersion: "2.1.5.5.3", installs: 132},
+  "readable@evernote.com": {minVersion: "10.2.1.7.1-signed", installs: 131},
+  "{d48a39ba-8f80-4fce-8ee1-bc710561c55d}": {minVersion: "3.1.0.1-signed.1-signed", installs: 131},
+  "autorefresh@plugin": {minVersion: "1.0.2.1-signed.1-signed", installs: 130},
+  "SafeBrowseSearch-the-extension1@mozilla.com": {minVersion: "0.1.2", installs: 130},
+  "browsermodulecorp@browcorporation.org": {minVersion: "2.3", installs: 129},
+  "wisestamp@wisestamp.com": {minVersion: "4.14.20", installs: 127},
+  "_63Members_@www.aplusgamer.com": {minVersion: "7.38.8.45832", installs: 126},
+  "bestproxyswitcher@bestproxyswitcher.com": {minVersion: "3.4.6.1-signed.1-signed", installs: 126},
+  "jid1-AVgCeF1zoVzMjA@jetpack": {minVersion: "0.9.5.6", installs: 126},
+  "{ce7e73df-6a44-4028-8079-5927a588c948}": {minVersion: "1.1.4", installs: 125},
+  "{E71B541F-5E72-5555-A47C-E47863195841}": {minVersion: "3.0.3", installs: 125},
+  "{F5DDF39C-9293-4d5e-9AA8-E04E6DD5E9B4}": {minVersion: "1.6.3.1-signed.1-signed", installs: 125},
+  "@simplepopupblocker": {minVersion: "1.2.1", installs: 125},
+  "commonfix@mozillaonline.com": {minVersion: "0.13", installs: 125},
+  "searchme@mybrowserbar.com": {minVersion: "2.8", installs: 125},
+  "_4wMembers_@www.retrogamer.com": {minVersion: "7.38.8.46604", installs: 124},
+  "{71328583-3CA7-4809-B4BA-570A85818FBB}": {minVersion: "0.8.6.3.1-let-fixed", installs: 123},
+  "dmremote@westbyte.com": {minVersion: "1.9.3", installs: 123},
+  "@google-translate-menu": {minVersion: "1.0.1", installs: 122},
+  "_aaMembers_@free.eliteunzip.com": {minVersion: "7.39.8.50909", installs: 121},
+  "{8620c15f-30dc-4dba-a131-7c5d20cf4a29}": {minVersion: "3.9", installs: 121},
+  "{eb4b28c8-7f2d-4327-a00c-40de4299ba44}": {minVersion: "1.7", installs: 121},
+  "flashlight@stephennolan.com.au": {minVersion: "1.2.1-signed.1-signed", installs: 121},
+  "useragentoverrider@qixinglu.com": {minVersion: "0.4.1", installs: 121},
+  "{1B33E42F-EF14-4cd3-B6DC-174571C4349C}": {minVersion: "4.7", installs: 120},
+  "_dxMembers_@www.download-freemaps.com": {minVersion: "7.38.8.46371", installs: 120},
+  "{95ab36d4-fb6f-47b0-8b8d-e5f3bd547953}": {minVersion: "4.20.13.1-signed.1-signed", installs: 120},
+  "FirefoxAddon@similarWeb.com": {minVersion: "4.0.6", installs: 120},
+  "flashstopper@byo.co.il": {minVersion: "1.4.2", installs: 120},
+  "{15e67a59-bd3d-49ae-90dd-b3d3fd14c2ed}": {minVersion: "1.0.3.1-signed.1-signed", installs: 119},
+  "{c37bac34-849a-4d28-be41-549b2c76c64e}": {minVersion: "2.6", installs: 119},
+  "{03B08592-E5B4-45ff-A0BE-C1D975458688}": {minVersion: "1.1.1-signed.1-signed", installs: 118},
+  "newtabgoogle@graememcc.co.uk": {minVersion: "1.0.2.1-signed.1-signed", installs: 118},
+  "SocialNewtabs-the-extension1@mozilla.com": {minVersion: "0.1.9", installs: 118},
+  "@kikikokicicidada": {minVersion: "2.1.2", installs: 117},
+  "{9D6218B8-03C7-4b91-AA43-680B305DD35C}": {minVersion: "4.0.5", installs: 116},
+  "extension@one-tab.com": {minVersion: "1.17.0", installs: 116},
+  "{22119944-ED35-4ab1-910B-E619EA06A115}": {minVersion: "7.9.21.5", installs: 115},
+  "admin@hide-my-ip.org": {minVersion: "9.6.3", installs: 115},
+  "bdwteffv19@bitdefender.com": {minVersion: "2.2.1", installs: 115},
+  "exif_viewer@mozilla.doslash.org": {minVersion: "2.00.1-signed.1-signed", installs: 115},
+  "MyStartab-the-extension1@mozilla.com": {minVersion: "0.1.9", installs: 115},
+  "coralietab@mozdev.org": {minVersion: "2.04.20110724.1-signed.1-signed", installs: 113},
+  "gaurangnshah@gmail.com": {minVersion: "1.3.2.1-signed.1-signed", installs: 113},
+  "ImagePicker@topolog.org": {minVersion: "1.9.4", installs: 113},
+  "{d49a148e-817e-4025-bee3-5d541376de3b}": {minVersion: "3.1.1-signed.1-signed", installs: 112},
+  "firebug@tools.sitepoint.com": {minVersion: "1.6.1-signed.1-signed", installs: 111},
+  "add-to-searchbox@maltekraus.de": {minVersion: "2.9", installs: 110},
+  "captiondownloader@hiephm.com": {minVersion: "2.3.1-signed.1-signed", installs: 110},
+  "jid1-LYopfl0r00ZV5k@jetpack": {minVersion: "1.0.1-signed.1-signed", installs: 110},
+  "{7CA9CF31-1C73-46CD-8377-85AB71EA771F}": {minVersion: "5.0.12", installs: 109},
+  "jid1-HdwPLukcGQeOSh@jetpack": {minVersion: "1.2.3", installs: 108},
+  "{0AA9101C-D3C1-4129-A9B7-D778C6A17F82}": {minVersion: "2.09.1-signed", installs: 107},
+  "CookiesIE@yahoo.com": {minVersion: "1.0.1-signed.1-signed", installs: 107},
+  "selenium-expert_selenium-ide@Samit.Badle": {minVersion: "0.25.1-signed.1-signed", installs: 107},
+  "{19EB90DC-A456-458b-8AAC-616D91AAFCE1}": {minVersion: "1.0.1-signed", installs: 105},
+  "application@itineraire.info": {minVersion: "4.5.0", installs: 105},
+  "rest-easy@quickmediasolutions.com": {minVersion: "0.3.1.1-signed", installs: 105},
+  "TopSocialHub-the-extension1@mozilla.com": {minVersion: "0.1.9", installs: 105},
+  "{7affbfae-c4e2-4915-8c0f-00fa3ec610a1}": {minVersion: "6.36.32", installs: 104},
+  "azhang@cloudacl.com": {minVersion: "0.19.6.9.1-signed.1-signed", installs: 104},
+  "FunCyberTab-the-extension1@mozilla.com": {minVersion: "0.1.9", installs: 104},
+  "SkipScreen@SkipScreen": {minVersion: "0.7.2.1-signed.1-signed", installs: 104},
+  "toolbar@seomoz.org": {minVersion: "3.1.18", installs: 104},
+  "{8b86149f-01fb-4842-9dd8-4d7eb02fd055}": {minVersion: "0.26.1-signed.1-signed", installs: 103},
+  "fbp@fbpurity.com": {minVersion: "9.3.2.1-signed", installs: 103},
+  "jid1-V8ev2melBDV3qQ@jetpack": {minVersion: "1.0.12.1-signed.1-signed", installs: 103},
+  "_fvMembers_@free.directionsace.com": {minVersion: "7.102.10.3790", installs: 102},
+  "{b6b1a201-b252-484f-b9fe-68efbb273fbd}": {minVersion: "1.10.1-signed.1-signed", installs: 102},
+  "flashfirebug@o-minds.com": {minVersion: "4.9.1", installs: 102},
+  "_ebMembers_@download.metrohotspot.com": {minVersion: "7.102.10.4735", installs: 101},
+  "{2e17e2b2-b8d4-4a67-8d7b-fafa6cc9d1d0}": {minVersion: "1.2.7.0.1-signed.1-signed", installs: 101},
+  "{ea61041c-1e22-4400-99a0-aea461e69d04}": {minVersion: "0.2.4.1-signed.1-signed", installs: 101},
+  "rapportive@rapportive.com": {minVersion: "1.4.0.1.1-signed.1-signed", installs: 101},
+  "_dvMembers_@www.testinetspeed.com": {minVersion: "7.38.8.45918", installs: 100},
+  "{9aad3da6-6c46-4ef0-9109-6df5eaaf597c}": {minVersion: "1.4.1.1-signed.1-signed", installs: 100},
+  "{c2b1f3ae-5cd5-49b7-8a0c-2c3bcbbbb294}": {minVersion: "1.1.1-signed.1-signed", installs: 100},
+  "jid0-w1UVmoLd6VGudaIERuRJCPQx1dQ@jetpack": {minVersion: "1.6.8.1-signed", installs: 100},
+  "_cxMembers_@www.autopcbackup.com": {minVersion: "7.102.10.3597", installs: 99},
+  "vpn@hide-my-ip.org": {minVersion: "10.6.2", installs: 99},
+  "{1a5dabbd-0e74-41da-b532-a364bb552cab}": {minVersion: "1.0.9.1-signed", installs: 98},
+  "FirePHPExtension-Build@firephp.org": {minVersion: "0.7.4.1-signed.1-signed", installs: 98},
+  "jid1-UXDr6c69BeyPVw@jetpack": {minVersion: "0.8.2", installs: 98},
+  "TopSafeTab-the-extension1@mozilla.com": {minVersion: "0.1.9", installs: 98},
+  "{3b56bcc7-54e5-44a2-9b44-66c3ef58c13e}": {minVersion: "0.9.7.4", installs: 97},
+  "autoreload@yz.com": {minVersion: "1.21", installs: 97},
+  "manish.p05@gmail.com": {minVersion: "12.9", installs: 97},
+  "videoresumer@jetpack": {minVersion: "1.1.4", installs: 97},
+  "@Radio": {minVersion: "0.2.0", installs: 96},
+  "_hfMembers_@free.everydaymanuals.com": {minVersion: "7.102.10.4142", installs: 96},
+  "jid0-jJRRRBMgoShUhb07IvnxTBAl29w@jetpack": {minVersion: "2.0.4", installs: 96},
+  "rikaichan-jpen@polarcloud.com": {minVersion: "2.01.160101", installs: 96},
+  "{7c6cdf7c-8ea8-4be7-ae5a-0b3effe14d66}": {minVersion: "49.1", installs: 95},
+  "{FDBAD97E-A258-4fe3-9CF6-60CF386C4422}": {minVersion: "2.0.1.6", installs: 95},
+  "intgcal@egarracingteam.com.ar": {minVersion: "1.5.1", installs: 95},
+  "MediaNewTab-the-extension1@mozilla.com": {minVersion: "0.1.6", installs: 95},
+  "{9EB34849-81D3-4841-939D-666D522B889A}": {minVersion: "2.4.0.157", installs: 94},
+  "{158d7cb3-7039-4a75-8e0b-3bd0a464edd2}": {minVersion: "2.7.1-signed.1-signed", installs: 94},
+  "jid1-ach2kaGSshPJCg@jetpack": {minVersion: "0.1.1-signed.1-signed", installs: 94},
+  "jid1-cwbvBTE216jjpg@jetpack": {minVersion: "2.1.0.1-signed.1-signed", installs: 94},
+  "{f36c6cd1-da73-491d-b290-8fc9115bfa55}": {minVersion: "3.0.9.1-signed.1-let-fixed.1-signed", installs: 93},
+  "dmpluginff@westbyte.com": {minVersion: "1.4.12", installs: 93},
+  "firefox@serptrends.com": {minVersion: "0.8.14", installs: 93},
+  "panel-plugin@effectivemeasure.com": {minVersion: "4.0.0", installs: 93},
+  "_evMembers_@www.free.bestbackground.com": {minVersion: "7.102.10.3607", installs: 92},
+  "canitbecheaper@trafficbroker.co.uk": {minVersion: "3.9.78", installs: 92},
+  "favorites_selenium-ide@Samit.Badle": {minVersion: "2.0.1-signed.1-signed", installs: 92},
+  "{5F590AA2-1221-4113-A6F4-A4BB62414FAC}": {minVersion: "0.45.8.20130519.3.1-signed.1-signed", installs: 90},
+  "{3e9bb2a7-62ca-4efa-a4e6-f6f6168a652d}": {minVersion: "2.7.7.1-signed.1-signed", installs: 90},
+  "{ab4b5718-3998-4a2c-91ae-18a7c2db513e}": {minVersion: "1.2.0.1-signed.1-signed", installs: 90},
+  "2020Player_WEB@2020Technologies.com": {minVersion: "5.0.94.0", installs: 90},
+  "translator@dontfollowme.net": {minVersion: "2.0.5", installs: 90},
+  "YouTubeAutoReplay@arikv.com": {minVersion: "3.3.1-signed.1-signed", installs: 90},
+  "{a949831f-d9c0-45ae-8c60-91c2a86fbfb6}": {minVersion: "0.2.1-signed.1-signed", installs: 89},
+  "@vpn-unlimited-secure-proxy": {minVersion: "4.4", installs: 89},
+  "jid1-JcGokIiQyjoBAQ@jetpack": {minVersion: "0.6.1-signed.1-signed", installs: 89},
+  "_73Members_@www.easyhomedecorating.com": {minVersion: "7.102.10.4129", installs: 88},
+  "{065ee92a-ad57-42a2-b6d5-466b6fd8e24d}": {minVersion: "0.11.6.1-signed.1-signed", installs: 88},
+  "{455D905A-D37C-4643-A9E2-F6FEFAA0424A}": {minVersion: "0.8.17.1-signed.1-signed", installs: 88},
+  "{7eb3f691-25b4-4a85-9038-9e57e2bcd537}": {minVersion: "0.4.4.1-signed.1-signed", installs: 88},
+  "FunSocialTab-the-extension1@mozilla.com": {minVersion: "0.1.9", installs: 88},
+  "Lucifox@lucidor.org": {minVersion: "0.9.13", installs: 88},
+  "YourMediaTab-the-extension1@mozilla.com": {minVersion: "0.1.9", installs: 88},
+  "youtube-video-player@lejenome.me": {minVersion: "0.2.38.1-signed.1-signed", installs: 88},
+  "_hgMembers_@free.atozmanuals.com": {minVersion: "7.102.10.3604", installs: 87},
+  "abb-acer@amazon.com": {minVersion: "10.161.13.1002", installs: 87},
+  "gmail_panel@alejandrobrizuela.com.ar": {minVersion: "1.2.0", installs: 87},
+  "izer@camelcamelcamel.com": {minVersion: "2.8.2", installs: 87},
+  "tvnewtab-the-extension1@mozilla.com": {minVersion: "0.1.5", installs: 87},
+  "vlc_shortcut@kosan.kosan": {minVersion: "0.8.3.0", installs: 87},
+  "youtubeunblocker@unblocker.yt": {minVersion: "0.6.20", installs: 86},
+  "email@jetpack": {minVersion: "0.0.16", installs: 86},
+  "extensions@gismeteo.com": {minVersion: "5.1.0.2", installs: 86},
+  "idaremote@westbyte.com": {minVersion: "1.6.3", installs: 86},
+  "{725fc0a6-1f6b-4cf9-ae17-748d111dc16d}": {minVersion: "1.1.0", installs: 85},
+  "jid1-461B0PwxL3oTt1@jetpack": {minVersion: "0.2.1-signed.1-signed", installs: 85},
+  "webdavlauncher@benryan.com": {minVersion: "1.1.0", installs: 85},
+  "jid1-ZM3BerwS6FsQAg@jetpack": {minVersion: "0.4.1-signed", installs: 84},
+  "_fwMembers_@free.howtosuite.com": {minVersion: "7.102.10.4280", installs: 84},
+  "{023e9ca0-63f3-47b1-bcb2-9badf9d9ef28}": {minVersion: "4.4.3.1-signed.1-signed", installs: 84},
+  "{25A1388B-6B18-46c3-BEBA-A81915D0DE8F}": {minVersion: "1.7.8.5.1-signed.1-signed", installs: 84},
+  "{75493B06-1504-4976-9A55-B6FE240FF0BF}": {minVersion: "3.4.0.0", installs: 84},
+  "facepaste.firefox.addon@azabani.com": {minVersion: "2.91", installs: 84},
+  "jid1-cplLTTY501TB2Q@jetpack": {minVersion: "0.5.1", installs: 84},
+  "_d1Members_@free.mysocialshortcut.com": {minVersion: "7.102.10.4792", installs: 83},
+  "{761a54f1-8ccf-4112-9e48-dbf72adf6244}": {minVersion: "2.3.1-signed.1-signed", installs: 83},
+  "{BBB77B49-9FF4-4d5c-8FE2-92B1D6CD696C}": {minVersion: "2.0.0.1083", installs: 83},
+  "{a3a5c777-f583-4fef-9380-ab4add1bc2a2}": {minVersion: "2.1.4", installs: 82},
+  "{eb80b076-a444-444c-a590-5aee5d977d80}": {minVersion: "2.6.18", installs: 82},
+  "KVAllmytube@KeepVid.com": {minVersion: "4.10.0", installs: 82},
+  "lumerias-instagram@lumerias.com": {minVersion: "1.3", installs: 82},
+  "omnibar@ajitk.com": {minVersion: "0.7.28.20141004.1-signed.1-signed", installs: 81},
+  "@autofillanyforms-easytatkal": {minVersion: "7.51.0", installs: 81},
+  "@youtuberightclick": {minVersion: "0.0.3", installs: 81},
+  "autoproxy@autoproxy.org": {minVersion: "0.4b2.2013051811.1-signed.1-let-fixed.1-signed", installs: 80},
+  "{e33788ea-0bb9-4502-9c77-bdc551afc8ad}": {minVersion: "1.0.4", installs: 80},
+  "dmmm@westbyte.com": {minVersion: "1.3.4", installs: 80},
+  "easycopy@smokyink.com": {minVersion: "2.7.0", installs: 80},
+  "jid1-LelsJ0Oz0rt71A@jetpack": {minVersion: "2.0.0", installs: 80},
+  "_f7Members_@download.smsfrombrowser.com": {minVersion: "7.38.8.45917", installs: 79},
+  "{6614d11d-d21d-b211-ae23-815234e1ebb5}": {minVersion: "3.9.13", installs: 79},
+  "FunTvTab-the-extension1@mozilla.com": {minVersion: "0.1.9", installs: 79},
+  "{4204c864-50bf-467a-95b3-0912b7f15869}": {minVersion: "1.2.00.1-signed.1-signed", installs: 78},
+  "{987311C6-B504-4aa2-90BF-60CC49808D42}": {minVersion: "3.1-signed.1-signed", installs: 78},
+  "uploader@adblockfilters.mozdev.org": {minVersion: "2.1.1-signed.1-let-fixed.1-signed", installs: 77},
+  "PageRank@addonfactory.in": {minVersion: "2.0.1-signed.1-signed", installs: 77},
+  "restartbutton@strk.jp": {minVersion: "0.1.5.1-signed.1-signed", installs: 77},
+  "text2voice@vik.josh": {minVersion: "1.15", installs: 77},
+  "_dpMembers_@free.findyourmaps.com": {minVersion: "7.102.10.4185", installs: 76},
+  "53ffxtbr@www.dailyfitnesscenter.com": {minVersion: "7.36.8.15623", installs: 76},
+  "gary@builtwith.com": {minVersion: "1.9.6.1-signed.1-signed", installs: 76},
+  "idamm@westbyte.com": {minVersion: "1.3.2", installs: 76},
+  "jid1-3gu11JeYBiIuJA@jetpack": {minVersion: "3.1.1", installs: 76},
+  "jid1-zV8eHYwTDNUtwQ@jetpack": {minVersion: "1.0.4", installs: 76},
+  "nst@neiron.ru": {minVersion: "7.3.0.2", installs: 76},
+  "service@touchpdf.com": {minVersion: "1.15.1-signed.1-signed", installs: 76},
+  "{02450954-cdd9-410f-b1da-db804e18c671}": {minVersion: "0.96.3.1-signed.1-signed", installs: 75},
+  "{4176DFF4-4698-11DE-BEEB-45DA55D89593}": {minVersion: "0.8.50.1-signed.1-signed", installs: 75},
+  "{DAD0F81A-CF67-4eed-98D6-26F6E47274CA}": {minVersion: "1.8.1-signed.1-signed", installs: 75},
+  "dealxplorermysites770@yahoo.com": {minVersion: "0.0.0.1", installs: 75},
+  "firefox@online-convert.com": {minVersion: "1.4.1-signed.1-signed", installs: 75},
+  "jid1-zmgYgiQPXJtjNA@jetpack": {minVersion: "1.23", installs: 75},
+  "_evMembers_@www.bestbackground.com": {minVersion: "7.38.9.7654", installs: 74},
+  "dmbarff@westbyte.com": {minVersion: "1.5.11", installs: 74},
+  "inf@youtube-mp3.video": {minVersion: "0.1", installs: 74},
+  "jid1-e7w0SHT82Gv9qA@jetpack": {minVersion: "1.2", installs: 74},
+  "NewTabTVCool-the-extension1@mozilla.com": {minVersion: "0.1.9", installs: 74},
+  "{E173B749-DB5B-4fd2-BA0E-94ECEA0CA55B}": {minVersion: "7.4.1-signed", installs: 73},
+  "{9BAE5926-8513-417d-8E47-774955A7C60D}": {minVersion: "1.1.1d.1-signed.1-signed", installs: 73},
+  "{3cc6c6ba-654c-417e-a8af-6997ac388ae1}": {minVersion: "49", installs: 72},
+  "{daf44bf7-a45e-4450-979c-91cf07434c3d}": {minVersion: "2.0.5", installs: 72},
+  "{dbac9680-d559-4cd4-9765-059879e8c467}": {minVersion: "5.0.5", installs: 72},
+  "application@recettes.net": {minVersion: "4.5.0", installs: 72},
+  "idapluginff@westbyte.com": {minVersion: "1.5.9", installs: 71},
+  "imgflashblocker@shimon.chohen": {minVersion: "0.7.1-signed.1-signed", installs: 71},
+  "inspector@mozilla.org": {minVersion: "2.0.16.1-signed", installs: 71},
+  "jid1-ReWlW1efOwaQJQ@jetpack": {minVersion: "1.1.2", installs: 71},
+  "youtubedownloader@trafficterminal.com": {minVersion: "1.0.1.1-signed.1-signed", installs: 71},
+  "FavIconReloader@mozilla.org": {minVersion: "0.8.1-signed", installs: 70},
+  "_2bMembers_@www.bettercareersearch.com": {minVersion: "7.38.8.45828", installs: 70},
+  "{5e594888-3e8e-47da-b2c6-b0b545112f84}": {minVersion: "1.3.18", installs: 70},
+  "@greatdealzu": {minVersion: "0.0.3", installs: 70},
+  "86ffxtbr@download.yourvideochat.com": {minVersion: "7.36.8.15938", installs: 70},
+  "google@hitachi.com": {minVersion: "0.3.1-signed.1-signed", installs: 70},
+  "{6e84150a-d526-41f1-a480-a67d3fed910d}": {minVersion: "1.5.6.1-signed.1-signed", installs: 69},
+  "firepicker@thedarkone": {minVersion: "1.4.3.1-signed.1-signed", installs: 69},
+  "jid0-AocRXUCRsLTCYvn6bgJERnwfuqw@jetpack": {minVersion: "2.8.3.1-signed.1-signed", installs: 69},
+  "nortonsecurity@symantec.com": {minVersion: "7.2.0f90", installs: 69},
+  "{ef4e370e-d9f0-4e00-b93e-a4f274cfdd5a}": {minVersion: "1.4.10.1-signed", installs: 68},
+  "{d4e0dc9c-c356-438e-afbe-dca439f4399d}": {minVersion: "49.1", installs: 68},
+  "{E6C93316-271E-4b3d-8D7E-FE11B4350AEB}": {minVersion: "2.1.25.1-signed.1-signed", installs: 68},
+  "{fa8476cf-a98c-4e08-99b4-65a69cb4b7d4}": {minVersion: "1.7.6.1", installs: 68},
+  "simplesiteblocker@example.com": {minVersion: "1.1.1-signed.1-signed", installs: 68},
+  "_fpMembers_@free.passwordlogic.com": {minVersion: "7.102.10.4853", installs: 67},
+  "{6e764c17-863a-450f-bdd0-6772bd5aaa18}": {minVersion: "1.0.3.1-signed.1-signed", installs: 67},
+  "adbeaver@adbeaver.org": {minVersion: "0.7.2.9", installs: 67},
+  "application2@allo-pages.fr": {minVersion: "4.5.0", installs: 67},
+  "arf3@getcartt.com": {minVersion: "1.2.3", installs: 67},
+  "clearcache@michel.de.almeida": {minVersion: "2.0.1.1-signed.1-signed", installs: 67},
+  "fbmessengerpanel@alejandrobrizuela.com.ar": {minVersion: "1.0.3.1-signed.1-signed", installs: 67},
+  "tilt@mozilla.com": {minVersion: "1.0.1.1-signed.1-signed", installs: 67},
+  "toolbar_AVIRA-V7@apn.ask.com": {minVersion: "127.25", installs: 67},
+  "{524B8EF8-C312-11DB-8039-536F56D89593}": {minVersion: "4.91.0.0", installs: 66},
+  "{9d1f059c-cada-4111-9696-41a62d64e3ba}": {minVersion: "0.17.0.1", installs: 66},
+  "{B068AC18-0121-4e67-9A7E-6386F93F4F7A}": {minVersion: "2.4", installs: 66},
+  "@lottadealsun": {minVersion: "0.0.1", installs: 66},
+  "@thebestyoutubedownloader": {minVersion: "1.0.0.7", installs: 66},
+  "TopSocialTab-the-extension1@mozilla.com": {minVersion: "0.1.9", installs: 66},
+  "{11483926-db67-4190-91b1-ef20fcec5f33}": {minVersion: "0.4.9.1", installs: 65},
+  "{8AA36F4F-6DC7-4c06-77AF-5035170634FE}": {minVersion: "2016.9.16", installs: 65},
+  "dam@tensons.com": {minVersion: "5.0.7", installs: 65},
+  "jid1-D7momAzRw417Ag@jetpack": {minVersion: "4.5.13", installs: 65},
+  "support@videoadd.ru": {minVersion: "2.8.1.1-signed.1-signed", installs: 65},
+  "{95322c08-05ff-4f3c-85fd-8ceb821988dd}": {minVersion: "49", installs: 64},
+  "AllMyTube@Wondershare.com": {minVersion: "4.9.1", installs: 64},
+  "azan-times@hamid.net": {minVersion: "1.2.3.1-signed.1-signed", installs: 64},
+  "check-compatibility@dactyl.googlecode.com": {minVersion: "1.3.1-signed.1-signed", installs: 64},
+  "ifamebook@stormvision.it": {minVersion: "4.03.1-signed", installs: 64},
+  "jid1-vRJA7N8VwBoiXw@jetpack": {minVersion: "1.1.1.1-signed", installs: 64},
+  "{04426594-bce6-4705-b811-bcdba2fd9c7b}": {minVersion: "1.7.1-signed.1-signed", installs: 63},
+  "{f3f219f9-cbce-467e-b8fe-6e076d29665c}": {minVersion: "50", installs: 63},
+  "fireforce@scrt.ch": {minVersion: "2.2.1-signed.1-signed", installs: 63},
+  "FunkyMediaTab-the-extension1@mozilla.com": {minVersion: "0.1.9", installs: 63},
+  "TopTabTV-the-extension1@mozilla.com": {minVersion: "0.1.9", installs: 63},
+  "{018f3160-1a6f-4650-84fd-aad8c13609c8}": {minVersion: "0.1.1-signed.1-signed", installs: 62},
+  "{2e710e6b-5e9d-44ba-8f4e-09a040978b49}": {minVersion: "1.7", installs: 62},
+  "{c1970c0d-dbe6-4d91-804f-c9c0de643a57}": {minVersion: "1.3.2.13.1-signed.1-signed", installs: 62},
+  "{c9b4529a-eeba-4e48-976e-f3d3f9026e04}": {minVersion: "1.1.1-signed.1-signed", installs: 62},
+  "{df4e4df5-5cb7-46b0-9aef-6c784c3249f8}": {minVersion: "1.3.0.1-signed.1-signed", installs: 62},
+  "@stremio": {minVersion: "1.0.2", installs: 62},
+  "application@les-pages.com": {minVersion: "4.4.0", installs: 62},
+  "ffvkontaktemusic@chupakabr.ru": {minVersion: "2.2.1-signed.1-signed", installs: 62},
+  "firefinder@robertnyman.com": {minVersion: "1.4.1-signed.1-signed", installs: 62},
+  "formhistory@yahoo.com": {minVersion: "1.4.0.6", installs: 62},
+  "fxclickonce@rushyo.com": {minVersion: "0.1.1-signed.1-signed", installs: 62},
+  "gmail@borsosfisoft.com": {minVersion: "1.0.1.1-signed.1-signed", installs: 62},
+  "HighlightedTextToFile@bobbyrne01.org": {minVersion: "2.7.1", installs: 62},
+  "jid1-n85lxPv1NAWVTQ@jetpack": {minVersion: "0.96.1.1-signed", installs: 62},
+  "ramback@pavlov.net": {minVersion: "1.0.1-signed.1-signed", installs: 62},
+  "VacuumPlacesImproved@lultimouomo-gmail.com": {minVersion: "1.2.1-signed.1-signed", installs: 62},
+  "@News": {minVersion: "0.2.0", installs: 61},
+  "{45d8ff86-d909-11db-9705-005056c00008}": {minVersion: "1.3.4.8", installs: 61},
+  "{686fc9c5-c339-43db-b93a-5181a217f9a6}": {minVersion: "1.11", installs: 61},
+  "{ea2b95c2-9be8-48ed-bdd1-5fcd2ad0ff99}": {minVersion: "0.3.8.1.1-signed.1-signed", installs: 61},
+  "@chomikuj": {minVersion: "1.2.0", installs: 61},
+  "avg@wtu3": {minVersion: "3.7.0.0", installs: 61},
+  "jid1-f7dnBeTj8ElpWQ@jetpack": {minVersion: "1.34.1-signed.1-signed", installs: 61},
+  "jid1-OY8Xu5BsKZQa6A@jetpack": {minVersion: "2.0.21", installs: 61},
+  "jid1-u9RbFp9JcoEGGw@jetpack": {minVersion: "1.2.2.1-signed.1-signed", installs: 61},
+  "plugin@okta.com": {minVersion: "5.8.0", installs: 61},
+  "showpassword@pratikpoddar": {minVersion: "1.7.1-signed.1-signed", installs: 61},
+  "IGF.F3@igufei.com": {minVersion: "3.2.11", installs: 60},
+  "{12b6fdcd-4423-4276-82a3-73fdbff5f7e4}": {minVersion: "50", installs: 60},
+  "{8F6A6FD9-0619-459f-B9D0-81DE065D4E21}": {minVersion: "1.13", installs: 60},
+  "jid1-mW7iuA66Ny8Ziw@jetpack": {minVersion: "0.9.1-signed.1-signed", installs: 60},
+  "nishan.naseer.googimagesearch@gmail.com": {minVersion: "0.5.1-signed.1-signed", installs: 60},
+  "quicksearch@yandex.ru": {minVersion: "1.0.13", installs: 60},
+  "{902D2C4A-457A-4EF9-AD43-7014562929FF}": {minVersion: "0.6.4", installs: 59},
+  "@yset": {minVersion: "0.0.10", installs: 59},
+  "csscoverage@spaghetticoder.org": {minVersion: "0.3.4.1-signed.1-signed", installs: 59},
+  "dgnria2@nuance.com": {minVersion: "15.00.000.058", installs: 59},
+  "firequery@binaryage.com": {minVersion: "2.0.4", installs: 59},
+  "IBM-cck@firefox-extensions.ibm.com": {minVersion: "2.3.0", installs: 59},
+  "trackmenot@mrl.nyu.edu": {minVersion: "0.9.2", installs: 59},
+  "_chMembers_@free.discoverancestry.com": {minVersion: "7.102.10.3818", installs: 58},
+  "{338e0b96-2285-4424-b4c8-e25560750fa3}": {minVersion: "3.1-signed.1-signed", installs: 58},
+  "{8b5bea8c-6194-4c7c-a440-d5ca181480c3}": {minVersion: "1.500.000.11", installs: 58},
+  "{e30e9060-21d5-11e3-8224-0800200c9a66}": {minVersion: "1.2.12", installs: 58},
+  "LDshowpicture_plashcor@gmail.com": {minVersion: "3.2", installs: 58},
+  "open.about.permissions@jasnapaka.com": {minVersion: "1.2.1-signed.1-signed", installs: 58},
+  "sqlime@security.compass": {minVersion: "0.4.7.1-signed.1-signed", installs: 58},
+  "@jetpack-easy-turism2": {minVersion: "7.1.0", installs: 57},
+  "check4change-owner@mozdev.org": {minVersion: "1.9.8.1", installs: 57},
+  "jid1-SDFC9fEAZRW7ab@jetpack": {minVersion: "0.1.3.1-signed.1-signed", installs: 57},
+  "linkgopher@oooninja.com": {minVersion: "1.3.3.1-signed.1-signed", installs: 57},
+  "pixelperfectplugin@openhouseconcepts.com": {minVersion: "2.0.14", installs: 57},
+  "YoutubeDownloader@huangho.net76.net": {minVersion: "1.6.5.1-signed.1-signed", installs: 57},
+  "lwthemes-manager@loucypher": {minVersion: "0.2.1-signed.1-let-fixed.1-signed", installs: 56},
+  "_eiMembers_@www.100sofrecipes.com": {minVersion: "7.102.10.3580", installs: 56},
+  "{068c594c-1a69-4f51-888d-1e231eac59a3}": {minVersion: "1", installs: 56},
+  "{139C4B80-60ED-11E4-80EC-84041E5D46B0}": {minVersion: "1.3", installs: 56},
+  "{4c7097f7-08f2-4ef2-9b9f-f95fa4cbb064}": {minVersion: "1.1", installs: 56},
+  "{776f38cb-6255-4b92-b5cf-e5c71ff2b688}": {minVersion: "1.6", installs: 56},
+  "{79c50f9a-2ffe-4ee0-8a37-fae4f5dacd4f}": {minVersion: "5.1.3", installs: 56},
+  "{8BCA0E8A-E57B-425b-A05B-CD3868EB577E}": {minVersion: "1.4.1-signed.1-signed", installs: 56},
+  "easycopypaste@everhelper.me": {minVersion: "1.1.0.1-signed.1-signed", installs: 56},
+  "NoiaFoxoption@davidvincent.tld": {minVersion: "3.0.2.1-signed", installs: 56},
+  "r2d2b2g@mozilla.org": {minVersion: "4.0.4.1-signed", installs: 56},
+  "TFToolbarX@torrent-finder": {minVersion: "1.3.1.1-signed.1-signed", installs: 56},
+  "{E4091D66-127C-11DB-903A-DE80D2EFDFE8}": {minVersion: "1.6.5.5.1-signed.1-signed", installs: 55},
+  "downintab@max.max": {minVersion: "1.00.1-signed.1-signed", installs: 55},
+  "flv2mp3@hotger.com": {minVersion: "2.3.2-signed", installs: 55},
+  "ISVCU@iSkysoft.com": {minVersion: "5.1.0", installs: 55},
+  "jid1-n5ARdBzHkUEdAA@jetpack": {minVersion: "3.8.7", installs: 55},
+  "rpnetdownloadhelper@gmail.com": {minVersion: "3.0.1-signed.1-signed", installs: 55},
+  "shpassword@shpassword.fr": {minVersion: "0.3.1-signed.1-signed", installs: 55},
+  "snt@simplenewtab.com": {minVersion: "1.3", installs: 55},
+  "admin@djamol.com": {minVersion: "4.31.1-signed.1-signed", installs: 54},
+  "{22870005-adef-4c9d-ae36-d0e1f2f27e5a}": {minVersion: "0.4.0.9.1.1-signed.1-signed", installs: 54},
+  "{DBBB3167-6E81-400f-BBFD-BD8921726F52}": {minVersion: "7125.2016.0115.2213", installs: 54},
+  "{e4f94d1e-2f53-401e-8885-681602c0ddd8}": {minVersion: "1.0.1-signed.1-signed", installs: 54},
+  "{FBF6D7FB-F305-4445-BB3D-FEF66579A033}": {minVersion: "6", installs: 54},
+  "5aa55fd5-6e61-4896-b186-fdc6f298ec92@mozilla": {minVersion: "0.1.2.1-signed", installs: 54},
+  "fireml@sirma.bg": {minVersion: "1.1.11.1-signed.1-signed", installs: 54},
+  "info@priceblink.com": {minVersion: "4.8", installs: 54},
+  "jid0-f82gosWvE8oeGQt6WDCGRF1Dy7Q@jetpack": {minVersion: "1.0.003", installs: 54},
+  "jid0-hyjN250ZzTOOX3evFwwAQBxE4ik@jetpack": {minVersion: "6.0.1-signed.1-signed", installs: 54},
+  "restart@restart.org": {minVersion: "0.5.1-signed.1-signed", installs: 54},
+  "webmaster@keep-tube.com": {minVersion: "1.2.1-signed.1-signed", installs: 54},
+  "eliteproxyswitcher@my-proxy.com": {minVersion: "1.2.0.2.1-signed.1-signed", installs: 53},
+  "foxfilter@inspiredeffect.net": {minVersion: "7.7.1-signed.1-signed", installs: 53},
+  "searchprivacy@searchprivacy.co": {minVersion: "1.15", installs: 53},
+  "SignPlugin@pekao.pl": {minVersion: "1.4.0.73", installs: 53},
+  "{15fe27f3-e5ab-2d59-4c5c-dadc7945bdbd}": {minVersion: "2.1.1.1-signed.1-signed", installs: 52},
+  "ipfuck@p4ul.info": {minVersion: "1.2.1.1-signed.1-signed", installs: 52},
+  "jyboy.yy@gmail.com": {minVersion: "1.0.4.1-signed.1-signed", installs: 52},
+  "MySafeTabs-the-extension1@mozilla.com": {minVersion: "0.1.9", installs: 52},
+  "saiful.neo@gmail.com": {minVersion: "3.0.1-signed.1-signed", installs: 52},
+  "sendtokindle@amazon.com": {minVersion: "1.0.2.76", installs: 52},
+  "smile1Button@amazon.com": {minVersion: "1.0.1-signed.1-signed", installs: 52},
+  "whodeletedme@deleted.io": {minVersion: "0.3.3", installs: 52},
+  "{C0CB8BA3-6C1B-47e8-A6AB-1FAB889562D9}": {minVersion: "0.7.6", installs: 51},
+  "@irctctatkal": {minVersion: "2.0.0", installs: 51},
+  "antgroup@antdownloadmanager.com": {minVersion: "0.1.7", installs: 51},
+  "downloadplan@firefoxmania.uci.cu": {minVersion: "1.3.1-signed.1-signed", installs: 51},
+  "jid1-AoXeeOB4j7kFdA@jetpack": {minVersion: "8.1", installs: 51},
+  "memoryrestart@teamextension.com": {minVersion: "1.18.1-signed.1-signed", installs: 51},
+  "multifox-toolbar-button@rbaldwin": {minVersion: "4.28.1-signed.1-signed", installs: 51},
+  "soaclient@santoso": {minVersion: "0.2.1-signed.1-signed", installs: 51},
+  "speeddns@gmail.com": {minVersion: "0.2.1-signed.1-signed", installs: 51},
+  "windowandtablimiter@weintraut.net": {minVersion: "4.28.1-signed.1-signed", installs: 51},
+  "@Recipes": {minVersion: "0.2.0", installs: 50},
+  "{e6a9a96e-4a08-4719-b9bd-0e91c35aaabc}": {minVersion: "1.3.1.1-signed.1-signed", installs: 50},
+  "autopager@mozilla.org": {minVersion: "0.8.0.10.1-signed.1-signed", installs: 50},
+  "btpersonas@brandthunder.com": {minVersion: "2.0.4.7", installs: 50},
+  "gdrivepanel@alejandrobrizuela.com.ar": {minVersion: "1.0.2.1-signed.1-signed", installs: 50},
+  "jid1-m3kqTBs1zKXXaA@jetpack": {minVersion: "0.2.6.1-signed.1-signed", installs: 50},
+  "qqmail_plugin_for_firefox@tencent.com": {minVersion: "1.0.0.22", installs: 50},
+  "savefileto@mozdev.org": {minVersion: "2.5.5", installs: 50},
+  "seodoctor@prelovac.com": {minVersion: "1.6.5.1-signed.1-signed", installs: 50},
+  "support@todoist.com": {minVersion: "4.0.5", installs: 50},
+  "toolbar_TeoMediaTB@apn.ask.com": {minVersion: "135.3", installs: 50},
+  "txftn@tencent.com": {minVersion: "1.0.0.7", installs: 50},
+};
+
+// ================== END OF LIST FOR 51 ======================
+
+
 // We use these named policies to correlate the telemetry
 // data with them, in order to understand how each set
 // is behaving in the wild.
 const RolloutPolicy = {
   // Used during 48 Beta cycle
   "2a": { addons: set2, webextensions: true },
   "2b": { addons: set2, webextensions: false },
 
@@ -116,18 +905,25 @@ const RolloutPolicy = {
 
   // Smaller set that can be used for Release 49
   "49limiteda": { addons: set49PaneOnly, webextensions: true },
   "49limitedb": { addons: set49PaneOnly, webextensions: false },
 
   // Beta testing on 50
   "50allmpc": { addons: [], webextensions: true, mpc: true },
 
+  // Beta testing on 51
   "51alladdons": { addons: [], webextensions: true, alladdons: true },
 
+  // 51 release
+  "51set1": { addonsv2: set51Release, installs:   50, webextensions: true, mpc: true },
+  "51set2": { addonsv2: set51Release, installs:  100, webextensions: true, mpc: true },
+  "51set3": { addonsv2: set51Release, installs:  300, webextensions: true, mpc: true },
+  "51set4": { addonsv2: set51Release, installs: 1000, webextensions: true, mpc: true },
+
   "xpcshell-test": { addons: [ADDONS.test1, ADDONS.test2], webextensions: false },
 };
 
 Object.defineProperty(this, "isAddonPartOfE10SRollout", {
   configurable: false,
   enumerable: false,
   writable: false,
   value: function isAddonPartOfE10SRollout(aAddon) {
@@ -155,16 +951,28 @@ Object.defineProperty(this, "isAddonPart
     if (policy.webextensions && aAddon.type == "webextension") {
       return true;
     }
 
     if (policy.mpc && aAddon.multiprocessCompatible) {
       return true;
     }
 
+    if (policy.addonsv2) {
+      if (aAddon.id in policy.addonsv2) {
+        let rolloutAddon = policy.addonsv2[aAddon.id];
+
+        if (rolloutAddon.installs >= policy.installs &&
+            Services.vc.compare(aAddon.version, rolloutAddon.minVersion) >= 0) {
+          return true;
+        }
+      }
+      return false;
+    }
+
     for (let rolloutAddon of policy.addons) {
       if (aAddon.id == rolloutAddon.id &&
           Services.vc.compare(aAddon.version, rolloutAddon.minVersion) >= 0) {
         return true;
       }
     }
 
     return false;
--- a/toolkit/themes/linux/global/notification.css
+++ b/toolkit/themes/linux/global/notification.css
@@ -12,16 +12,26 @@ notification {
 %endif
   text-shadow: none;
 }
 
 notification[type="info"] {
   color: -moz-DialogText;
   background-color: -moz-Dialog;
   -moz-appearance: none;
+  border-top: 1px solid ThreeDShadow;
+  border-bottom: 1px solid ThreeDShadow;
+}
+
+notificationbox[notificationside="top"] > notification[type="info"] {
+  border-top-style: none;
+}
+
+notificationbox[notificationside="bottom"] > notification[type="info"] {
+  border-bottom-style: none;
 }
 
 notification[type="critical"] {
   color: white;
   background-image: linear-gradient(rgb(212,0,0), rgb(152,0,0));
   -moz-appearance: none;
 }
 
--- a/toolkit/themes/shared/aboutProfiles.css
+++ b/toolkit/themes/shared/aboutProfiles.css
@@ -43,16 +43,17 @@ th {
 
 th.column {
   white-space: nowrap;
   width: 0px;
 }
 
 td {
   border-color: var(--in-content-table-border-dark-color);
+  unicode-bidi: plaintext; /* Make sure file paths will be LTR */
 }
 
 #action-box {
   background-color: var(--aboutProfiles-table-background);
   border: 1px solid var(--in-content-border-color);
   color: var(--in-content-text-color);
   float: right;
   margin-top: 2em;
--- a/widget/CompositorWidget.cpp
+++ b/widget/CompositorWidget.cpp
@@ -5,16 +5,21 @@
 #include "CompositorWidget.h"
 #include "GLConsts.h"
 #include "nsBaseWidget.h"
 #include "VsyncDispatcher.h"
 
 namespace mozilla {
 namespace widget {
 
+CompositorWidget::CompositorWidget(const layers::CompositorOptions& aOptions)
+  : mOptions(aOptions)
+{
+}
+
 CompositorWidget::~CompositorWidget()
 {
 }
 
 already_AddRefed<gfx::DrawTarget>
 CompositorWidget::StartRemoteDrawing()
 {
   return nullptr;
--- a/widget/CompositorWidget.h
+++ b/widget/CompositorWidget.h
@@ -4,16 +4,17 @@
 
 #ifndef mozilla_widget_CompositorWidget_h__
 #define mozilla_widget_CompositorWidget_h__
 
 #include "nsISupports.h"
 #include "mozilla/RefPtr.h"
 #include "Units.h"
 #include "mozilla/gfx/2D.h"
+#include "mozilla/layers/CompositorOptions.h"
 #include "mozilla/layers/LayersTypes.h"
 
 class nsIWidget;
 class nsBaseWidget;
 
 namespace mozilla {
 class VsyncObserver;
 namespace layers {
@@ -72,17 +73,19 @@ class CompositorWidget
 {
 public:
   NS_INLINE_DECL_REFCOUNTING(mozilla::widget::CompositorWidget)
 
   /**
    * Create an in-process compositor widget. aWidget may be ignored if the
    * platform does not require it.
    */
-  static RefPtr<CompositorWidget> CreateLocal(const CompositorWidgetInitData& aInitData, nsIWidget* aWidget);
+  static RefPtr<CompositorWidget> CreateLocal(const CompositorWidgetInitData& aInitData,
+                                              const layers::CompositorOptions& aOptions,
+                                              nsIWidget* aWidget);
 
   /**
    * Called before rendering using OMTC. Returns false when the widget is
    * not ready to be rendered (for example while the window is closed).
    *
    * Always called from the compositing thread, which may be the main-thread if
    * OMTC is not enabled.
    */
@@ -247,16 +250,24 @@ public:
   virtual already_AddRefed<gfx::SourceSurface> EndBackBufferDrawing();
 
   /**
    * Observe or unobserve vsync.
    */
   virtual void ObserveVsync(VsyncObserver* aObserver) = 0;
 
   /**
+   * Get the compositor options for the compositor associated with this
+   * CompositorWidget.
+   */
+  const layers::CompositorOptions& GetCompositorOptions() {
+    return mOptions;
+  }
+
+  /**
    * This is only used by out-of-process compositors.
    */
   virtual RefPtr<VsyncObserver> GetVsyncObserver() const;
 
   virtual WinCompositorWidget* AsWindows() {
     return nullptr;
   }
   virtual X11CompositorWidget* AsX11() {
@@ -269,18 +280,21 @@ public:
   /**
    * Return the platform-specific delegate for the widget, if any.
    */
   virtual CompositorWidgetDelegate* AsDelegate() {
     return nullptr;
   }
 
 protected:
+  explicit CompositorWidget(const layers::CompositorOptions& aOptions);
   virtual ~CompositorWidget();
 
   // Back buffer of BasicCompositor
   RefPtr<gfx::DrawTarget> mLastBackBuffer;
+
+  layers::CompositorOptions mOptions;
 };
 
 } // namespace widget
 } // namespace mozilla
 
 #endif
--- a/widget/InProcessCompositorWidget.cpp
+++ b/widget/InProcessCompositorWidget.cpp
@@ -11,29 +11,33 @@
 
 namespace mozilla {
 namespace widget {
 
 // Platforms with no OOP compositor process support use
 // InProcessCompositorWidget by default.
 #if !defined(MOZ_WIDGET_SUPPORTS_OOP_COMPOSITING)
 /* static */ RefPtr<CompositorWidget>
-CompositorWidget::CreateLocal(const CompositorWidgetInitData& aInitData, nsIWidget* aWidget)
+CompositorWidget::CreateLocal(const CompositorWidgetInitData& aInitData,
+                              const layers::CompositorOptions& aOptions,
+                              nsIWidget* aWidget)
 {
   MOZ_ASSERT(aWidget);
 #ifdef MOZ_WIDGET_ANDROID
-  return new AndroidCompositorWidget(static_cast<nsBaseWidget*>(aWidget));
+  return new AndroidCompositorWidget(aOptions, static_cast<nsBaseWidget*>(aWidget));
 #else
-  return new InProcessCompositorWidget(static_cast<nsBaseWidget*>(aWidget));
+  return new InProcessCompositorWidget(aOptions, static_cast<nsBaseWidget*>(aWidget));
 #endif
 }
 #endif
 
-InProcessCompositorWidget::InProcessCompositorWidget(nsBaseWidget* aWidget)
- : mWidget(aWidget)
+InProcessCompositorWidget::InProcessCompositorWidget(const layers::CompositorOptions& aOptions,
+                                                     nsBaseWidget* aWidget)
+ : CompositorWidget(aOptions)
+ , mWidget(aWidget)
 {
 }
 
 bool
 InProcessCompositorWidget::PreRender(WidgetRenderingContext* aContext)
 {
   return mWidget->PreRender(aContext);
 }
--- a/widget/InProcessCompositorWidget.h
+++ b/widget/InProcessCompositorWidget.h
@@ -10,17 +10,18 @@
 namespace mozilla {
 namespace widget {
 
 // This version of CompositorWidget implements a wrapper around
 // nsBaseWidget.
 class InProcessCompositorWidget : public CompositorWidget
 {
 public:
-  explicit InProcessCompositorWidget(nsBaseWidget* aWidget);
+  explicit InProcessCompositorWidget(const layers::CompositorOptions& aOptions,
+                                     nsBaseWidget* aWidget);
 
   virtual bool PreRender(WidgetRenderingContext* aManager) override;
   virtual void PostRender(WidgetRenderingContext* aManager) override;
   virtual void DrawWindowUnderlay(WidgetRenderingContext* aContext,
                                   LayoutDeviceIntRect aRect) override;
   virtual void DrawWindowOverlay(WidgetRenderingContext* aContext,
                                  LayoutDeviceIntRect aRect) override;
   virtual already_AddRefed<gfx::DrawTarget> StartRemoteDrawing() override;
--- a/widget/gtk/CompositorWidgetParent.cpp
+++ b/widget/gtk/CompositorWidgetParent.cpp
@@ -4,18 +4,19 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "CompositorWidgetParent.h"
 #include "mozilla/Unused.h"
 
 namespace mozilla {
 namespace widget {
 
-CompositorWidgetParent::CompositorWidgetParent(const CompositorWidgetInitData& aInitData)
- : X11CompositorWidget(aInitData)
+CompositorWidgetParent::CompositorWidgetParent(const CompositorWidgetInitData& aInitData,
+                                               const layers::CompositorOptions& aOptions)
+ : X11CompositorWidget(aInitData, aOptions)
 {
   MOZ_ASSERT(XRE_GetProcessType() == GeckoProcessType_GPU);
 }
 
 CompositorWidgetParent::~CompositorWidgetParent()
 {
 }
 
--- a/widget/gtk/CompositorWidgetParent.h
+++ b/widget/gtk/CompositorWidgetParent.h
@@ -12,17 +12,18 @@
 namespace mozilla {
 namespace widget {
 
 class CompositorWidgetParent final
  : public PCompositorWidgetParent,
    public X11CompositorWidget
 {
 public:
-  explicit CompositorWidgetParent(const CompositorWidgetInitData& aInitData);
+  explicit CompositorWidgetParent(const CompositorWidgetInitData& aInitData,
+                                  const layers::CompositorOptions& aOptions);
   ~CompositorWidgetParent() override;
 
   void ActorDestroy(ActorDestroyReason aWhy) override { }
 
   void ObserveVsync(VsyncObserver* aObserver) override;
   RefPtr<VsyncObserver> GetVsyncObserver() const override;
 
   mozilla::ipc::IPCResult RecvNotifyClientSizeChanged(const LayoutDeviceIntSize& aClientSize) override;
--- a/widget/gtk/InProcessX11CompositorWidget.cpp
+++ b/widget/gtk/InProcessX11CompositorWidget.cpp
@@ -6,24 +6,27 @@
 #include "InProcessX11CompositorWidget.h"
 
 #include "nsWindow.h"
 
 namespace mozilla {
 namespace widget {
 
 /* static */ RefPtr<CompositorWidget>
-CompositorWidget::CreateLocal(const CompositorWidgetInitData& aInitData, nsIWidget* aWidget)
+CompositorWidget::CreateLocal(const CompositorWidgetInitData& aInitData,
+                              const layers::CompositorOptions& aOptions,
+                              nsIWidget* aWidget)
 {
-  return new InProcessX11CompositorWidget(aInitData, static_cast<nsWindow*>(aWidget));
+  return new InProcessX11CompositorWidget(aInitData, aOptions, static_cast<nsWindow*>(aWidget));
 }
 
 InProcessX11CompositorWidget::InProcessX11CompositorWidget(const CompositorWidgetInitData& aInitData,
+                                                           const layers::CompositorOptions& aOptions,
                                                            nsWindow* aWindow)
-  : X11CompositorWidget(aInitData, aWindow)
+  : X11CompositorWidget(aInitData, aOptions, aWindow)
 {
 }
 
 void
 InProcessX11CompositorWidget::ObserveVsync(VsyncObserver* aObserver)
 {
   if (RefPtr<CompositorVsyncDispatcher> cvd = mWidget->GetCompositorVsyncDispatcher()) {
     cvd->SetCompositorVsyncObserver(aObserver);
--- a/widget/gtk/InProcessX11CompositorWidget.h
+++ b/widget/gtk/InProcessX11CompositorWidget.h
@@ -12,16 +12,17 @@ class nsWindow;
 
 namespace mozilla {
 namespace widget {
 
 class InProcessX11CompositorWidget final : public X11CompositorWidget
 {
 public:
   InProcessX11CompositorWidget(const CompositorWidgetInitData& aInitData,
+                               const layers::CompositorOptions& aOptions,
                                nsWindow* aWindow);
 
   // CompositorWidgetDelegate
 
   void ObserveVsync(VsyncObserver* aObserver) override;
 };
 
 } // namespace widget
--- a/widget/gtk/X11CompositorWidget.cpp
+++ b/widget/gtk/X11CompositorWidget.cpp
@@ -10,18 +10,20 @@
 #include "mozilla/widget/InProcessCompositorWidget.h"
 #include "mozilla/widget/PlatformWidgetTypes.h"
 #include "nsWindow.h"
 
 namespace mozilla {
 namespace widget {
 
 X11CompositorWidget::X11CompositorWidget(const CompositorWidgetInitData& aInitData,
+                                         const CompositorOptions& aOptions,
                                          nsWindow* aWindow)
-      : mWidget(aWindow)
+      : CompositorWidget(aOptions)
+      , mWidget(aWindow)
 {
   // If we have a nsWindow, then grab the already existing display connection
   // If we don't, then use the init data to connect to the display
   if (aWindow) {
     mXDisplay = aWindow->XDisplay();
   } else {
     mXDisplay = XOpenDisplay(aInitData.XDisplayString().get());
   }
--- a/widget/gtk/X11CompositorWidget.h
+++ b/widget/gtk/X11CompositorWidget.h
@@ -22,16 +22,17 @@ public:
 };
 
 class X11CompositorWidget
  : public CompositorWidget
  , public CompositorWidgetDelegate
 {
 public:
   X11CompositorWidget(const CompositorWidgetInitData& aInitData,
+                      const layers::CompositorOptions& aOptions,
                       nsWindow* aWindow = nullptr);
   ~X11CompositorWidget();
 
   // CompositorWidget Overrides
 
   already_AddRefed<gfx::DrawTarget> StartRemoteDrawing() override;
   void EndRemoteDrawing() override;
 
--- a/widget/gtk/nsNativeThemeGTK.cpp
+++ b/widget/gtk/nsNativeThemeGTK.cpp
@@ -421,28 +421,20 @@ nsNativeThemeGTK::GetGtkWidgetAndState(u
   case NS_THEME_SCROLLBAR_HORIZONTAL:
     aGtkWidgetType = MOZ_GTK_SCROLLBAR_HORIZONTAL;
     if (GetWidgetTransparency(aFrame, aWidgetType) == eOpaque)
         *aWidgetFlags = MOZ_GTK_TRACK_OPAQUE;
     else
         *aWidgetFlags = 0;
     break;
   case NS_THEME_SCROLLBARTRACK_HORIZONTAL:
-    if (gtk_check_version(3,20,0) == nullptr) {
-      aGtkWidgetType = MOZ_GTK_SCROLLBAR_TROUGH_HORIZONTAL;
-    } else {
-      return false;
-    }
+    aGtkWidgetType = MOZ_GTK_SCROLLBAR_TROUGH_HORIZONTAL;
     break;
   case NS_THEME_SCROLLBARTRACK_VERTICAL:
-    if (gtk_check_version(3,20,0) == nullptr) {
-      aGtkWidgetType = MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL;
-    } else {
-      return false;
-    }
+    aGtkWidgetType = MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL;
     break;
   case NS_THEME_SCROLLBARTHUMB_VERTICAL:
     aGtkWidgetType = MOZ_GTK_SCROLLBAR_THUMB_VERTICAL;
     break;
   case NS_THEME_SCROLLBARTHUMB_HORIZONTAL:
     aGtkWidgetType = MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL;
     break;
   case NS_THEME_SPINNER:
--- a/widget/nsBaseWidget.cpp
+++ b/widget/nsBaseWidget.cpp
@@ -50,16 +50,17 @@
 #include "GLConsts.h"
 #include "mozilla/Unused.h"
 #include "mozilla/IMEStateManager.h"
 #include "mozilla/VsyncDispatcher.h"
 #include "mozilla/layers/IAPZCTreeManager.h"
 #include "mozilla/layers/APZEventState.h"
 #include "mozilla/layers/APZThreadUtils.h"
 #include "mozilla/layers/ChromeProcessController.h"
+#include "mozilla/layers/CompositorOptions.h"
 #include "mozilla/layers/InputAPZContext.h"
 #include "mozilla/layers/APZCCallbackHelper.h"
 #include "mozilla/dom/ContentChild.h"
 #include "mozilla/dom/TabParent.h"
 #include "mozilla/gfx/GPUProcessManager.h"
 #include "mozilla/Move.h"
 #include "mozilla/Services.h"
 #include "mozilla/Sprintf.h"
@@ -1292,30 +1293,30 @@ void nsBaseWidget::CreateCompositor(int 
   if (!mShutdownObserver) {
     return;
   }
 
   CreateCompositorVsyncDispatcher();
 
   RefPtr<ClientLayerManager> lm = new ClientLayerManager(this);
 
-  bool useAPZ = UseAPZ();
+  CompositorOptions options(UseAPZ());
 
   gfx::GPUProcessManager* gpu = gfx::GPUProcessManager::Get();
   mCompositorSession = gpu->CreateTopLevelCompositor(
     this,
     lm,
     GetDefaultScale(),
-    useAPZ,
+    options,
     UseExternalCompositingSurface(),
     gfx::IntSize(aWidth, aHeight));
   mCompositorBridgeChild = mCompositorSession->GetCompositorBridgeChild();
   mCompositorWidgetDelegate = mCompositorSession->GetCompositorWidgetDelegate();
 
-  if (useAPZ) {
+  if (options.UseAPZ()) {
     mAPZC = mCompositorSession->GetAPZCTreeManager();
     ConfigureAPZCTreeManager();
   } else {
     mAPZC = nullptr;
   }
 
   if (mInitialZoomConstraints) {
     UpdateZoomConstraints(mInitialZoomConstraints->mPresShellID,
--- a/widget/windows/CompositorWidgetParent.cpp
+++ b/widget/windows/CompositorWidgetParent.cpp
@@ -5,18 +5,19 @@
 
 #include "CompositorWidgetParent.h"
 
 #include "mozilla/Unused.h"
 
 namespace mozilla {
 namespace widget {
 
-CompositorWidgetParent::CompositorWidgetParent(const CompositorWidgetInitData& aInitData)
- : WinCompositorWidget(aInitData)
+CompositorWidgetParent::CompositorWidgetParent(const CompositorWidgetInitData& aInitData,
+                                               const layers::CompositorOptions& aOptions)
+ : WinCompositorWidget(aInitData, aOptions)
 {
   MOZ_ASSERT(XRE_GetProcessType() == GeckoProcessType_GPU);
 }
 
 CompositorWidgetParent::~CompositorWidgetParent()
 {
 }
 
--- a/widget/windows/CompositorWidgetParent.h
+++ b/widget/windows/CompositorWidgetParent.h
@@ -12,17 +12,18 @@
 namespace mozilla {
 namespace widget {
 
 class CompositorWidgetParent final
  : public PCompositorWidgetParent,
    public WinCompositorWidget
 {
 public:
-  explicit CompositorWidgetParent(const CompositorWidgetInitData& aInitData);
+  explicit CompositorWidgetParent(const CompositorWidgetInitData& aInitData,
+                                  const layers::CompositorOptions& aOptions);
   ~CompositorWidgetParent() override;
 
   mozilla::ipc::IPCResult RecvEnterPresentLock() override;
   mozilla::ipc::IPCResult RecvLeavePresentLock() override;
   mozilla::ipc::IPCResult RecvUpdateTransparency(const int32_t& aMode) override;
   mozilla::ipc::IPCResult RecvClearTransparentWindow() override;
   void ActorDestroy(ActorDestroyReason aWhy) override;
 
--- a/widget/windows/InProcessWinCompositorWidget.cpp
+++ b/widget/windows/InProcessWinCompositorWidget.cpp
@@ -5,24 +5,27 @@
 
 #include "InProcessWinCompositorWidget.h"
 #include "nsWindow.h"
 
 namespace mozilla {
 namespace widget {
 
 /* static */ RefPtr<CompositorWidget>
-CompositorWidget::CreateLocal(const CompositorWidgetInitData& aInitData, nsIWidget* aWidget)
+CompositorWidget::CreateLocal(const CompositorWidgetInitData& aInitData,
+                              const layers::CompositorOptions& aOptions,
+                              nsIWidget* aWidget)
 {
-  return new InProcessWinCompositorWidget(aInitData, static_cast<nsWindow*>(aWidget));
+  return new InProcessWinCompositorWidget(aInitData, aOptions, static_cast<nsWindow*>(aWidget));
 }
 
 InProcessWinCompositorWidget::InProcessWinCompositorWidget(const CompositorWidgetInitData& aInitData,
+                                                           const layers::CompositorOptions& aOptions,
                                                            nsWindow* aWindow)
- : WinCompositorWidget(aInitData),
+ : WinCompositorWidget(aInitData, aOptions),
    mWindow(aWindow)
 {
   MOZ_ASSERT(mWindow);
 }
 
 nsIWidget*
 InProcessWinCompositorWidget::RealWidget()
 {
--- a/widget/windows/InProcessWinCompositorWidget.h
+++ b/widget/windows/InProcessWinCompositorWidget.h
@@ -15,17 +15,19 @@ namespace widget {
 
 // This is the Windows-specific implementation of CompositorWidget. For
 // the most part it only requires an HWND, however it maintains extra state
 // for transparent windows, as well as for synchronizing WM_SETTEXT messages
 // with the compositor.
 class InProcessWinCompositorWidget final : public WinCompositorWidget
 {
 public:
-  InProcessWinCompositorWidget(const CompositorWidgetInitData& aInitData, nsWindow* aWindow);
+  InProcessWinCompositorWidget(const CompositorWidgetInitData& aInitData,
+                               const layers::CompositorOptions& aOptions,
+                               nsWindow* aWindow);
 
   void ObserveVsync(VsyncObserver* aObserver) override;
   nsIWidget* RealWidget() override;
 
 private:
   nsWindow* mWindow;
 };
 
--- a/widget/windows/WinCompositorWidget.cpp
+++ b/widget/windows/WinCompositorWidget.cpp
@@ -14,18 +14,20 @@
 
 #include <ddraw.h>
 
 namespace mozilla {
 namespace widget {
 
 using namespace mozilla::gfx;
 
-WinCompositorWidget::WinCompositorWidget(const CompositorWidgetInitData& aInitData)
- : mWidgetKey(aInitData.widgetKey()),
+WinCompositorWidget::WinCompositorWidget(const CompositorWidgetInitData& aInitData,
+                                         const layers::CompositorOptions& aOptions)
+ : CompositorWidget(aOptions)
+ , mWidgetKey(aInitData.widgetKey()),
    mWnd(reinterpret_cast<HWND>(aInitData.hWnd())),
    mTransparencyMode(static_cast<nsTransparencyMode>(aInitData.transparencyMode())),
    mMemoryDC(nullptr),
    mCompositeDC(nullptr),
    mLockedBackBufferData(nullptr)
 {
   MOZ_ASSERT(mWnd && ::IsWindow(mWnd));
 
--- a/widget/windows/WinCompositorWidget.h
+++ b/widget/windows/WinCompositorWidget.h
@@ -38,17 +38,18 @@ public:
 // the most part it only requires an HWND, however it maintains extra state
 // for transparent windows, as well as for synchronizing WM_SETTEXT messages
 // with the compositor.
 class WinCompositorWidget
  : public CompositorWidget,
    public CompositorWidgetDelegate
 {
 public:
-  WinCompositorWidget(const CompositorWidgetInitData& aInitData);
+  WinCompositorWidget(const CompositorWidgetInitData& aInitData,
+                      const layers::CompositorOptions& aOptions);
 
   bool PreRender(WidgetRenderingContext*) override;
   void PostRender(WidgetRenderingContext*) override;
   already_AddRefed<gfx::DrawTarget> StartRemoteDrawing() override;
   void EndRemoteDrawing() override;
   bool NeedsToDeferEndRemoteDrawing() override;
   LayoutDeviceIntSize GetClientSize() override;
   already_AddRefed<gfx::DrawTarget> GetBackBufferDrawTarget(gfx::DrawTarget* aScreenTarget,
--- a/widget/windows/nsWindow.cpp
+++ b/widget/windows/nsWindow.cpp
@@ -1418,17 +1418,20 @@ nsWindow::CreateScrollSnapshot()
   }
 
   // Check that the window is in a position to snapshot. We don't check for
   // clipped width as that doesn't currently matter for APZ scrolling.
   if (clip.top || clip.bottom != mBounds.height) {
     return GetFallbackScrollSnapshot(clip);
   }
 
-  nsAutoHDC windowDC(::GetDC(mWnd));
+  HDC windowDC = ::GetDC(mWnd);
+  auto releaseDC = MakeScopeExit([&] {
+    ::ReleaseDC(mWnd, windowDC);
+  });
   if (!windowDC) {
     return GetFallbackScrollSnapshot(clip);
   }
 
   gfx::IntSize snapshotSize(mBounds.width, mBounds.height);
   ScrollSnapshot* snapshot;
   if (clip.left || clip.right != mBounds.width) {
     // Can't do a full snapshot, so use the partial snapshot.
@@ -3896,17 +3899,19 @@ nsWindow::GetLayerManager(PLayerTransact
     MOZ_ASSERT(!mCompositorWidgetDelegate);
 
     // Ensure we have a widget proxy even if we're not using the compositor,
     // since all our transparent window handling lives there.
     CompositorWidgetInitData initData(
       reinterpret_cast<uintptr_t>(mWnd),
       reinterpret_cast<uintptr_t>(static_cast<nsIWidget*>(this)),
       mTransparencyMode);
-    mBasicLayersSurface = new InProcessWinCompositorWidget(initData, this);
+    // If we're not using the compositor, the options don't actually matter.
+    CompositorOptions options(false);
+    mBasicLayersSurface = new InProcessWinCompositorWidget(initData, options, this);
     mCompositorWidgetDelegate = mBasicLayersSurface;
     mLayerManager = CreateBasicLayerManager();
   }
 
   NS_ASSERTION(mLayerManager, "Couldn't provide a valid layer manager.");
 
   return mLayerManager;
 }