Merge mozilla-central to mozilla-inbound
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Fri, 30 Sep 2016 12:08:17 +0200
changeset 316043 33d05c77b5c6aa7556f0ac6d95f873e2bff61ca7
parent 316042 5262594e0f3f2e700532e3c1f7d5c2b884150c3e (current diff)
parent 315962 5ffed033557e5b6f9694123f1948f867f913ede3 (diff)
child 316044 a4bcc0fe30b5b5001d6b8bb58e2377c21f8e2a3e
push id30759
push userphilringnalda@gmail.com
push dateSat, 01 Oct 2016 06:25:09 +0000
treeherdermozilla-central@fcc62bbf09ee [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone52.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
devtools/client/inspector/inspector-panel.js
testing/mochitest/cc-analyzer.js
--- a/Makefile.in
+++ b/Makefile.in
@@ -167,18 +167,24 @@ install-manifests: $(addprefix install-,
 ifneq (,$(filter FasterMake+RecursiveMake,$(BUILD_BACKENDS)))
 install-manifests: faster
 .PHONY: faster
 faster: install-dist/idl
 	$(MAKE) -C faster FASTER_RECURSIVE_MAKE=1
 endif
 
 .PHONY: tup
-tup: install-manifests buildid.h source-repo.h
+tup:
+	$(call BUILDSTATUS,TIERS make tup)
+	$(call BUILDSTATUS,TIER_START make)
+	$(MAKE) install-manifests buildid.h source-repo.h
+	$(call BUILDSTATUS,TIER_FINISH make)
+	$(call BUILDSTATUS,TIER_START tup)
 	@$(TUP) $(if $(findstring s,$(filter-out --%,$(MAKEFLAGS))),,--verbose)
+	$(call BUILDSTATUS,TIER_FINISH tup)
 
 # process_install_manifest needs to be invoked with --no-remove when building
 # js as standalone because automated builds are building nspr separately and
 # that would remove the resulting files.
 # Eventually, a standalone js build would just be able to build nspr itself,
 # removing the need for the former.
 ifdef JS_STANDALONE
 NO_REMOVE=1
--- a/accessible/base/TextAttrs.cpp
+++ b/accessible/base/TextAttrs.cpp
@@ -711,23 +711,19 @@ TextAttrsMgr::AutoGeneratedTextAttr::
 ////////////////////////////////////////////////////////////////////////////////
 // TextDecorTextAttr
 ////////////////////////////////////////////////////////////////////////////////
 
 TextAttrsMgr::TextDecorValue::
   TextDecorValue(nsIFrame* aFrame)
 {
   const nsStyleTextReset* textReset = aFrame->StyleTextReset();
-  mStyle = textReset->GetDecorationStyle();
-
-  bool isForegroundColor = false;
-  textReset->GetDecorationColor(mColor, isForegroundColor);
-  if (isForegroundColor)
-    mColor = aFrame->StyleColor()->mColor;
-
+  mStyle = textReset->mTextDecorationStyle;
+  mColor = aFrame->StyleColor()->
+    CalcComplexColor(textReset->mTextDecorationColor);
   mLine = textReset->mTextDecorationLine &
     (NS_STYLE_TEXT_DECORATION_LINE_UNDERLINE |
      NS_STYLE_TEXT_DECORATION_LINE_LINE_THROUGH);
 }
 
 TextAttrsMgr::TextDecorTextAttr::
   TextDecorTextAttr(nsIFrame* aRootFrame, nsIFrame* aFrame) :
   TTextAttr<TextDecorValue>(!aFrame)
--- a/browser/components/customizableui/CustomizableWidgets.jsm
+++ b/browser/components/customizableui/CustomizableWidgets.jsm
@@ -461,16 +461,19 @@ const CustomizableWidgets = [
       appendTo.appendChild(messageLabel);
       return messageLabel;
     },
     _appendClient: function (client, attachFragment) {
       let doc = attachFragment.ownerDocument;
       // Create the element for the remote client.
       let clientItem = doc.createElementNS(kNSXUL, "label");
       clientItem.setAttribute("itemtype", "client");
+      let window = doc.defaultView;
+      clientItem.setAttribute("tooltiptext",
+        window.gSyncUI.formatLastSyncDate(new Date(client.lastModified)));
       clientItem.textContent = client.name;
 
       attachFragment.appendChild(clientItem);
 
       if (client.tabs.length == 0) {
         let label = this._appendMessageLabel("notabsforclientlabel", attachFragment);
         label.setAttribute("class", "PanelUI-remotetabs-notabsforclient-label");
       } else {
--- a/browser/components/extensions/ext-tabs.js
+++ b/browser/components/extensions/ext-tabs.js
@@ -3,17 +3,18 @@
 "use strict";
 
 XPCOMUtils.defineLazyServiceGetter(this, "aboutNewTabService",
                                    "@mozilla.org/browser/aboutnewtab-service;1",
                                    "nsIAboutNewTabService");
 
 XPCOMUtils.defineLazyModuleGetter(this, "MatchPattern",
                                   "resource://gre/modules/MatchPattern.jsm");
-
+XPCOMUtils.defineLazyModuleGetter(this, "PromiseUtils",
+                                  "resource://gre/modules/PromiseUtils.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "Services",
                                   "resource://gre/modules/Services.jsm");
 
 Cu.import("resource://gre/modules/ExtensionUtils.jsm");
 
 var {
   EventManager,
   ignoreEvent,
@@ -237,42 +238,62 @@ let tabListener = {
     let windowId = WindowManager.getId(tab.ownerGlobal);
     let tabId = TabManager.getId(tab);
 
     this.emit("tab-removed", {tab, tabId, windowId, isWindowClosing});
   },
 
   tabReadyInitialized: false,
   tabReadyPromises: new WeakMap(),
+  initializingTabs: new WeakSet(),
 
   initTabReady() {
     if (!this.tabReadyInitialized) {
       AllWindowEvents.addListener("progress", this);
 
       this.tabReadyInitialized = true;
     }
   },
 
   onLocationChange(browser, webProgress, request, locationURI, flags) {
     if (webProgress.isTopLevel) {
       let gBrowser = browser.ownerGlobal.gBrowser;
       let tab = gBrowser.getTabForBrowser(browser);
 
+      // Now we are certain that the first page in the tab was loaded.
+      this.initializingTabs.delete(tab);
+
+      // browser.innerWindowID is now set, resolve the promises if any.
       let deferred = this.tabReadyPromises.get(tab);
       if (deferred) {
         deferred.resolve(tab);
         this.tabReadyPromises.delete(tab);
       }
     }
   },
 
+  /**
+   * Returns a promise that resolves when the tab is ready.
+   * Tabs created via the `tabs.create` method are "ready" once the location
+   * changed to the requested URL. Other tabs are always assumed to be ready.
+   *
+   * @param {XULElement} tab The <tab> element.
+   * @returns {Promise} Resolves with the given tab once ready.
+   */
   awaitTabReady(tab) {
-    return new Promise((resolve, reject) => {
-      this.tabReadyPromises.set(tab, {resolve, reject});
-    });
+    let deferred = this.tabReadyPromises.get(tab);
+    if (!deferred) {
+      deferred = PromiseUtils.defer();
+      if (!this.initializingTabs.has(tab) && tab.linkedBrowser.innerWindowID) {
+        deferred.resolve(tab);
+      } else {
+        this.tabReadyPromises.set(tab, deferred);
+      }
+    }
+    return deferred.promise;
   },
 };
 
 extensions.registerSchemaAPI("tabs", "addon_parent", context => {
   let {extension} = context;
   let self = {
     tabs: {
       onActivated: new WindowEventManager(context, "tabs.onActivated", "TabSelect", (fire, event) => {
@@ -533,28 +554,28 @@ extensions.registerSchemaAPI("tabs", "ad
           if (createProperties.index !== null) {
             window.gBrowser.moveTabTo(tab, createProperties.index);
           }
 
           if (createProperties.pinned) {
             window.gBrowser.pinTab(tab);
           }
 
-          if (!createProperties.url || createProperties.url.startsWith("about:")) {
+          if (createProperties.url && !createProperties.url.startsWith("about:")) {
             // We can't wait for a location change event for about:newtab,
             // since it may be pre-rendered, in which case its initial
             // location change event has already fired.
-            return tab;
+
+            // Mark the tab as initializing, so that operations like
+            // `executeScript` wait until the requested URL is loaded in
+            // the tab before dispatching messages to the inner window
+            // that contains the URL we're attempting to load.
+            tabListener.initializingTabs.add(tab);
           }
 
-          // Wait for the first location change event, so that operations
-          // like `executeScript` are dispatched to the inner window that
-          // contains the URL we're attempting to load.
-          return tabListener.awaitTabReady(tab);
-        }).then(tab => {
           return TabManager.convert(extension, tab);
         });
       },
 
       remove: function(tabs) {
         if (!Array.isArray(tabs)) {
           tabs = [tabs];
         }
@@ -712,75 +733,75 @@ extensions.registerSchemaAPI("tabs", "ad
         if (!extension.hasPermission("<all_urls>")) {
           return Promise.reject({message: "The <all_urls> permission is required to use the captureVisibleTab API"});
         }
 
         let window = windowId == null ?
           WindowManager.topWindow :
           WindowManager.getWindow(windowId, context);
 
-        let browser = window.gBrowser.selectedBrowser;
-        let recipient = {
-          innerWindowID: browser.innerWindowID,
-        };
+        let tab = window.gBrowser.selectedTab;
+        return tabListener.awaitTabReady(tab).then(() => {
+          let browser = tab.linkedBrowser;
+          let recipient = {
+            innerWindowID: browser.innerWindowID,
+          };
 
-        if (!options) {
-          options = {};
-        }
-        if (options.format == null) {
-          options.format = "png";
-        }
-        if (options.quality == null) {
-          options.quality = 92;
-        }
+          if (!options) {
+            options = {};
+          }
+          if (options.format == null) {
+            options.format = "png";
+          }
+          if (options.quality == null) {
+            options.quality = 92;
+          }
 
-        let message = {
-          options,
-          width: browser.clientWidth,
-          height: browser.clientHeight,
-        };
+          let message = {
+            options,
+            width: browser.clientWidth,
+            height: browser.clientHeight,
+          };
 
-        return context.sendMessage(browser.messageManager, "Extension:Capture",
-                                   message, {recipient});
+          return context.sendMessage(browser.messageManager, "Extension:Capture",
+                                     message, {recipient});
+        });
       },
 
       detectLanguage: function(tabId) {
         let tab = tabId !== null ? TabManager.getTab(tabId, context) : TabManager.activeTab;
 
-        let browser = tab.linkedBrowser;
-        let recipient = {innerWindowID: browser.innerWindowID};
+        return tabListener.awaitTabReady(tab).then(() => {
+          let browser = tab.linkedBrowser;
+          let recipient = {innerWindowID: browser.innerWindowID};
 
-        return context.sendMessage(browser.messageManager, "Extension:DetectLanguage",
-                                   {}, {recipient});
+          return context.sendMessage(browser.messageManager, "Extension:DetectLanguage",
+                                     {}, {recipient});
+        });
       },
 
       // Used to executeScript, insertCSS and removeCSS.
       _execute: function(tabId, details, kind, method) {
         let tab = tabId !== null ? TabManager.getTab(tabId, context) : TabManager.activeTab;
-        let mm = tab.linkedBrowser.messageManager;
 
         let options = {
           js: [],
           css: [],
           remove_css: method == "removeCSS",
         };
 
         // We require a `code` or a `file` property, but we can't accept both.
         if ((details.code === null) == (details.file === null)) {
           return Promise.reject({message: `${method} requires either a 'code' or a 'file' property, but not both`});
         }
 
         if (details.frameId !== null && details.allFrames) {
           return Promise.reject({message: `'frameId' and 'allFrames' are mutually exclusive`});
         }
 
-        let recipient = {
-          innerWindowID: tab.linkedBrowser.innerWindowID,
-        };
-
         if (TabManager.for(extension).hasActiveTabPermission(tab)) {
           // If we have the "activeTab" permission for this tab, ignore
           // the host whitelist.
           options.matchesHost = ["<all_urls>"];
         } else {
           options.matchesHost = extension.whiteListedHosts.serialize();
         }
 
@@ -804,17 +825,24 @@ extensions.registerSchemaAPI("tabs", "ad
           options.match_about_blank = details.matchAboutBlank;
         }
         if (details.runAt !== null) {
           options.run_at = details.runAt;
         } else {
           options.run_at = "document_idle";
         }
 
-        return context.sendMessage(mm, "Extension:Execute", {options}, {recipient});
+        return tabListener.awaitTabReady(tab).then(() => {
+          let browser = tab.linkedBrowser;
+          let recipient = {
+            innerWindowID: browser.innerWindowID,
+          };
+
+          return context.sendMessage(browser.messageManager, "Extension:Execute", {options}, {recipient});
+        });
       },
 
       executeScript: function(tabId, details) {
         return self.tabs._execute(tabId, details, "js", "executeScript");
       },
 
       insertCSS: function(tabId, details) {
         return self.tabs._execute(tabId, details, "css", "insertCSS").then(() => {});
new file mode 100644
--- /dev/null
+++ b/browser/config/mozconfigs/linux32/artifact
@@ -0,0 +1,9 @@
+MOZ_AUTOMATION_BUILD_SYMBOLS=0
+MOZ_AUTOMATION_L10N_CHECK=0
+
+. "$topsrcdir/browser/config/mozconfigs/linux32/common-opt"
+. "$topsrcdir/build/mozconfig.common.override"
+
+ac_add_options --enable-artifact-builds
+unset CC
+unset CXX
new file mode 100644
--- /dev/null
+++ b/browser/config/mozconfigs/macosx64/artifact
@@ -0,0 +1,7 @@
+MOZ_AUTOMATION_BUILD_SYMBOLS=0
+MOZ_AUTOMATION_L10N_CHECK=0
+
+. "$topsrcdir/build/macosx/mozconfig.common"
+. "$topsrcdir/build/mozconfig.common.override"
+
+ac_add_options --enable-artifact-builds
new file mode 100644
--- /dev/null
+++ b/browser/config/mozconfigs/win32/artifact
@@ -0,0 +1,9 @@
+MOZ_AUTOMATION_BUILD_SYMBOLS=0
+MOZ_AUTOMATION_L10N_CHECK=0
+
+. "$topsrcdir/browser/config/mozconfigs/common"
+. "$topsrcdir/build/mozconfig.win-common"
+. "$topsrcdir/build/win32/mozconfig.vs-latest"
+. "$topsrcdir/build/mozconfig.common.override"
+
+ac_add_options --enable-artifact-builds
new file mode 100644
--- /dev/null
+++ b/browser/config/mozconfigs/win64/artifact
@@ -0,0 +1,10 @@
+MOZ_AUTOMATION_BUILD_SYMBOLS=0
+MOZ_AUTOMATION_L10N_CHECK=0
+
+. "$topsrcdir/browser/config/mozconfigs/win64/common-win64"
+. "$topsrcdir/browser/config/mozconfigs/common"
+. "$topsrcdir/build/mozconfig.win-common"
+. "$topsrcdir/build/win64/mozconfig.vs-latest"
+. "$topsrcdir/build/mozconfig.common.override"
+
+ac_add_options --enable-artifact-builds
--- a/browser/extensions/pocket/content/main.js
+++ b/browser/extensions/pocket/content/main.js
@@ -124,17 +124,17 @@ var pktUI = (function() {
 
     // -- Panel UI -- //
 
     /**
      * Show the sign-up panel
      */
     function showSignUp() {
         // AB test: Direct logged-out users to tab vs panel
-        if (pktApi.getSignupPanelTabTestVariant() == 'tab')
+        if (pktApi.getSignupPanelTabTestVariant() == 'v2')
         {
             let site = Services.prefs.getCharPref("extensions.pocket.site");
             openTabWithUrl('https://' + site + '/firefox_learnmore?s=ffi&t=autoredirect&tv=page_learnmore&src=ff_ext', true);
 
             // force the panel closed before it opens
             getPanel().hidePopup();
 
             return;
--- a/browser/extensions/pocket/content/pktApi.jsm
+++ b/browser/extensions/pocket/content/pktApi.jsm
@@ -605,17 +605,17 @@ var pktApi = (function() {
             error: options.error
         });
     }
 
     /**
      * Helper function to get current signup AB group the user is in
      */
     function getSignupPanelTabTestVariant() {
-        return getMultipleTestOption('panelSignUp', {control: 2, v1: 7, v2: 1 })
+        return getMultipleTestOption('panelSignUp', {control: 1, v1: 2, v2: 7 })
     }
 
     function getMultipleTestOption(testName, testOptions) {
         // Get the test from preferences if we've already assigned the user to a test
         var settingName = 'test.' + testName;
         var assignedValue = getSetting(settingName);
         var valArray = [];
 
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/en-GB/pocket.properties
@@ -0,0 +1,43 @@
+# 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/.
+
+addtags = Add Tags
+alreadyhaveacct = Already a Pocket user?
+continueff = Continue with Firefox
+errorgeneric = There was an error when trying to save to Pocket.
+learnmore = Learn More
+loginnow = Log in
+maxtaglength = Tags are limited to 25 characters
+mustbeconnected = You must be connected to the Internet in order to save to Pocket. Please check your connection and try again.
+onlylinkssaved = Only links can be saved
+pagenotsaved = Page Not Saved
+pageremoved = Page Removed
+pagesaved = Saved to Pocket
+processingremove = Removing Page…
+processingtags = Adding tags…
+removepage = Remove Page
+save = Save
+saving = Saving…
+signupemail = Sign up with email
+signuptosave = Sign up for Pocket. It’s free.
+suggestedtags = Suggested Tags
+tagline = Save articles and videos from Firefox to view in Pocket on any device, any time.
+taglinestory_one = Click the Pocket Button to save any article, video or page from Firefox.
+taglinestory_two = View in Pocket on any device, any time.
+tagssaved = Tags Added
+tos = By continuing, you agree to Pocket’s <a href="%1$S" target="_blank">Terms of Service</a> and <a href="%2$S" target="_blank">Privacy Policy</a>
+tryitnow = Try It Now
+signinfirefox = Sign in with Firefox
+signupfirefox = Sign up with Firefox
+viewlist = View List
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = Save to Pocket
+saveToPocketCmd.label = Save Page to Pocket
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = Save Link to Pocket
+saveLinkToPocketCmd.accesskey = o
+pocketMenuitem.label = View Pocket List
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/es-AR/pocket.properties
@@ -0,0 +1,43 @@
+# 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/.
+
+addtags = Agregar etiquetas
+alreadyhaveacct = ¿Ya es un usuario de Pocket?
+continueff = Continuar con Firefox
+errorgeneric = Hubo un error al tratar de guardar en Pocket.
+learnmore = Conocer más
+loginnow = Ingresar
+maxtaglength = Las etiquetas están limitadas a 25 caracteres
+mustbeconnected = Debe estar conectado a Internet para poder guardar en Pocket. Verifique la conexión e intente nuevamente.
+onlylinkssaved = Solamente pueden guardarle enlaces
+pagenotsaved = Página no guardada
+pageremoved = Página eliminada
+pagesaved = Guardado en Pocket
+processingremove = Eliminando página…
+processingtags = Agregando etiquetas…
+removepage = Eliminar página
+save = Guardar
+saving = Guardando…
+signupemail = Ingresar con correo electrónico
+signuptosave = Registrarse en Pocket. En grátis.
+suggestedtags = Etiquetas sugeridas
+tagline = Guardar artículos y videos desde Firefox para ver en Pocket en cualquier dispositivo en cualquier momento.
+taglinestory_one = Clic en el botón Pocket para guardar cualquier artículo, video o página desde Firefox.
+taglinestory_two = Ver en Pocket en cualquier dispositivo en cualquier momento.
+tagssaved = Etiquetas agregadas
+tos = Al continuar acepta los <a href="%1$S" target="_blank">términos de servicio</a> y la <a href="%2$S" target="_blank">política de privacidad</a> de Pocket
+tryitnow = Probalo ahora
+signinfirefox = Ingresar con Firefox
+signupfirefox = Registrarse con Firefox
+viewlist = Ver lista
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = Guardar en Pocket
+saveToPocketCmd.label = Guardar página en Pocket
+saveToPocketCmd.accesskey = G
+saveLinkToPocketCmd.label = Guardar enlace en Pocket
+saveLinkToPocketCmd.accesskey = o
+pocketMenuitem.label = Ver lista de Pocket
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/gu-IN/pocket.properties
@@ -0,0 +1,43 @@
+# 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/.
+
+addtags = ટૅગ્સ ઉમેરો
+alreadyhaveacct = પહેલેથી જ એક પોકેટ વપરાશકર્તા છો?
+continueff = ફાયરફોક્સ સાથે ચાલુ રાખો
+errorgeneric = પોકેટ સાચવી રાખવા માટે પ્રયાસ હતો ત્યારે એક ભૂલ હતી.
+learnmore = વધુ શીખો
+loginnow = પ્રવેશ કરો
+maxtaglength = ટૅગ્સ 25 અક્ષરો સુધી મર્યાદિત છે
+mustbeconnected = તમે પોકેટ પર સેવ કરવા માટે ઇન્ટરનેટ સાથે જોડાયેલ હોવા જ જોઈએ. કૃપા કરીને તમારા જોડાણ તપાસ કરો અને ફરીથી પ્રયત્ન કરો.
+onlylinkssaved = માત્ર લિંક્સ સાચવી શકાય છે
+pagenotsaved = પૃષ્ઠ સાચવેલા નથી
+pageremoved = પૃષ્ઠ દૂર
+pagesaved = પોકેટ પર સાચવ્યું
+processingremove = પૃષ્ઠ દૂર કરી રહ્યા છીએ…
+processingtags = ટૅગ્સ ઉમેરી રહ્યું છે…
+removepage = પૃષ્ઠ દૂર
+save = સાચવો
+saving = સાચવી રહ્યું છે…
+signupemail = ઇમેઇલ સાથે સાઇનઅપ
+signuptosave = પોકેટ માટે સાઇન અપ કરો. તે મફત છે.
+suggestedtags = સૂચવેલ ટૅગ્સ
+tagline = કોઈપણ ઉપકરણ, કોઈ પણ સમય પર પોકેટ માં જોવા માટે ફાયરફોક્સ ના લેખો અને વીડિયો સાચવો.
+taglinestory_one = ફાયરફોક્સ એક લેખ, વિડિઓ અથવા પાનું સેવ કરવા પોકેટ બટન પર ક્લિક કરો.
+taglinestory_two = કોઈપણ ઉપકરણ, કોઈ પણ સમય પર પોકેટ માં જુઓ.
+tagssaved = ટૅગ્સ ઉમેર્યું
+tos = ચાલુ કરવાથી, તમે પોકેટ માટેની <a href="%1$S" target="_blank">સેવાની શરતો</a> અને <a href="%2$S" target="_blank">ગોપનીયતા નીતિ</a>સંમત થશો
+tryitnow = અત્યારે પ્રયાસ કરો
+signinfirefox = ફાયરફોક્સ સાથે ચાલુ રાખો
+signupfirefox = ફાયરફોક્સ સાથે સાઇન અપ કરો
+viewlist = યાદી જુઓ
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = પોકેટ
+pocket-button.tooltiptext = પોકેટ પર સાચવો
+saveToPocketCmd.label = પોકેટ પર પૃષ્ઠ સાચવો
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = પોકેટ પર લિંક સાચવો
+saveLinkToPocketCmd.accesskey = o
+pocketMenuitem.label = જુઓ પોકેટની યાદી
--- a/browser/extensions/pocket/locale/jar.mn
+++ b/browser/extensions/pocket/locale/jar.mn
@@ -1,30 +1,33 @@
 #filter substitution
 # 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/.
 
 # These are used for the big if statement, as the preprocessor can't handle
 # dashes.
 #define bn_BD bn-BD
+#define en_GB en-GB
 #define en_US en-US
+#define es_AR es-AR
 #define es_CL es-CL
 #define es_ES es-ES
 #define es_MX es-MX
 #define fy_NL fy-NL
+#define gu_IN gu-IN
 #define nn_NO nn-NO
 #define pt_BR pt-BR
 #define pt_PT pt-PT
 #define sv_SE sv-SE
 #define zh_CN zh-CN
 #define zh_TW zh-TW
 
 [features/firefox@getpocket.com] @AB_CD@.jar:
 % locale pocket @AB_CD@ %locale/@AB_CD@/
   # For locales we support, include the file from the locale's directory in the
   # source tree.
   # For other locales (and en-US) fallback to the en-US directory.
-#if AB_CD == ast || AB_CD == az || AB_CD == bg || AB_CD == bn_BD || AB_CD == cs || AB_CD == da || AB_CD == de || AB_CD == dsb || AB_CD == en_US || AB_CD == es_CL || AB_CD == es_ES || AB_CD == es_MX || AB_CD == et || AB_CD == fi || AB_CD == fr || AB_CD == fy_NL || AB_CD == hr || AB_CD == hsb || AB_CD == hu || AB_CD == it || AB_CD == ja || AB_CD == kab || AB_CD == lv || AB_CD == nl || AB_CD == nn_NO || AB_CD == or || AB_CD == pt_BR || AB_CD == pt_PT || AB_CD == rm || AB_CD == ro || AB_CD == ru || AB_CD == sk || AB_CD == sl || AB_CD == sq || AB_CD == sr || AB_CD == sv_SE || AB_CD == te || AB_CD == th || AB_CD == tr || AB_CD == uk || AB_CD == zh_CN || AB_CD == zh_TW
+#if AB_CD == ast || AB_CD == az || AB_CD == bg || AB_CD == bn_BD || AB_CD == cs || AB_CD == da || AB_CD == de || AB_CD == dsb || AB_CD == en_GB || AB_CD == en_US || AB_CD == es_AR || AB_CD == es_CL || AB_CD == es_ES || AB_CD == es_MX || AB_CD == et || AB_CD == fi || AB_CD == fr || AB_CD == fy_NL || AB_CD == gu_IN || AB_CD == hr || AB_CD == hsb || AB_CD == hu || AB_CD == it || AB_CD == ja || AB_CD == ka || AB_CD == kab || AB_CD == lt || AB_CD == lv || AB_CD == mr || AB_CD == ms || AB_CD == nl || AB_CD == nn_NO || AB_CD == or || AB_CD == pl || AB_CD == pt_BR || AB_CD == pt_PT || AB_CD == rm || AB_CD == ro || AB_CD == ru || AB_CD == sk || AB_CD == sl || AB_CD == sq || AB_CD == sr || AB_CD == sv_SE || AB_CD == te || AB_CD == th || AB_CD == tr || AB_CD == uk || AB_CD == zh_CN || AB_CD == zh_TW
   locale/@AB_CD@/                (@AB_CD@/*)
 #else
   locale/@AB_CD@/                (en-US/*)
 #endif
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/ka/pocket.properties
@@ -0,0 +1,43 @@
+# 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/.
+
+addtags = იარლიყების დამატება
+alreadyhaveacct = უკვე იყენებთ Pocket-ს?
+continueff = Firefox-ით გაგრძელება
+errorgeneric = Pocket-ში შენახვისას დაფიქსირდა შეცდომა.
+learnmore = დაწვრილებით
+loginnow = შესვლა
+maxtaglength = იარლიყები შეზღუდულია 25 ასომდე
+mustbeconnected = Pocket-ში შესანახად საჭიროა ინტერნეთთან კავშირი. გთხოვთ შეამოწმეთ თქვენი კავშირი და ხელახლა ცადეთ.
+onlylinkssaved = შესაძლებელია მხოლოდ ბმულების შენახვა
+pagenotsaved = გვერდი არ შეინახა
+pageremoved = გვერდი წაიშალა
+pagesaved = შეინახა Pocket-ში
+processingremove = იშლება გვერდი…
+processingtags = ემატება იარლიყები…
+removepage = გვერდის წაშლა
+save = შენახვა
+saving = ინახება…
+signupemail = რეგისტრაცია ელ-ფოსტით
+signuptosave = დარეგისტრირდით Pocket-ზე. ეს უფასოა.
+suggestedtags = შემოთავაზებული იარლიყები
+tagline = შეინახეთ სტატიები და ვიდეობეი Firefox-იდან მათ Pocket-ში სანახავად ნებისმიერ მოწყობილობაზე, ნებისმიერ დროს.
+taglinestory_one = Firefox-იდან ნებისმიერი სტატიის, ვიდეოს ან გვერდის შესანახად დააწკაპეთ Pocket-ის ღილაკს.
+taglinestory_two = დაათვალიერეთ Pocket-ში ნებისმიერ მოწყობილობაზე, ნებისმიერ დროს.
+tagssaved = იარლიყები დაემატა
+tos = გაგრძელების შემთხვევაში თქვენ ეთანხმებით Pocket-ის <a href="%1$S" target="_blank">მომსახურების პირობებს</a> და <a href="%2$S" target="_blank">პრივატულობის პოლიტიკას</a>
+tryitnow = სცადეთ ახლავე
+signinfirefox = შესვლა Firefox-ით
+signupfirefox = რეგისრაცია Firefox-ით
+viewlist = სიის ნახვა
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = Pocket-ში შენახვა
+saveToPocketCmd.label = გვერდის შენახვა Pocket-ში
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = ბმულის შენახვა Pocket-ში
+saveLinkToPocketCmd.accesskey = o
+pocketMenuitem.label = Pocket სიის ნახვა
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/lt/pocket.properties
@@ -0,0 +1,43 @@
+# 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/.
+
+addtags = Pridėkite gairių
+alreadyhaveacct = Jau naudojatės „Pocket“?
+continueff = Tęsti su „Firefox“
+errorgeneric = Bandant išsaugoti į „Pocket“ įvyko klaida.
+learnmore = Sužinokite daugiau
+loginnow = Prisijungti
+maxtaglength = Gaires gali sudaryti iki 25 simbolių
+mustbeconnected = Norėdami saugoti į „Pocket“, turite būti prisijungę prie interneto. Prašome patikrinti savo ryšį ir bandyti vėl.
+onlylinkssaved = Išsaugoti galima tik nuorodas
+pagenotsaved = Tinklalapis neišsaugotas
+pageremoved = Tinklalapis pašalintas
+pagesaved = Išsaugota į „Pocket“
+processingremove = Šalinamas tinklalapis…
+processingtags = Pridedamos gairės…
+removepage = Pašalinti tinklalapį
+save = Išsaugoti
+saving = Išsaugoma…
+signupemail = Prisijungti su el. paštu
+signuptosave = Pradėkite naudotis „Pocket“. Tai nemokama.
+suggestedtags = Siūlomos gairės
+tagline = Išsaugokite straipsnius bei vaizdo įrašus iš „Firefox“ norėdami juos peržiūrėti bet kokiame įrenginyje su „Pocket“, bet kuriuo metu.
+taglinestory_one = Spustelėkite „Pocket“ mygtuką norėdami išsaugoti bet kokį straipsnį, vaizdo įrašą ar tinklalapį iš „Firefox“.
+taglinestory_two = Peržiūrėkite bet kokiame įrenginyje su „Pocket“, bet kuriuo metu.
+tagssaved = Gairės pridėtos
+tos = Tęsdami sutinkate su „Pocket“ <a href="%1$S" target="_blank">paslaugos teikimo sąlygomis</a> bei <a href="%2$S" target="_blank">privatumo nuostatais</a>
+tryitnow = Išbandykite dabar
+signinfirefox = Prisijungti su „Firefox“
+signupfirefox = Prisijungti su „Firefox“
+viewlist = Peržiūrėti sąrašą
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = Išsaugoti į „Pocket“
+saveToPocketCmd.label = Išsaugoti tinklalapį į „Pocket“
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = Išsaugoti saitą į „Pocket“
+saveLinkToPocketCmd.accesskey = o
+pocketMenuitem.label = Peržiūrėti „Pocket“ sąrašą
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/mr/pocket.properties
@@ -0,0 +1,43 @@
+# 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/.
+
+addtags = टॅग जोडा
+alreadyhaveacct = आधीपासून Pocket वापरताय?
+continueff = Firefox सोबत पुढे चला
+errorgeneric = Pocket मध्ये जतन करताना त्रुटी आली.
+learnmore = अधिक जाणून घ्या
+loginnow = लॉग इन
+maxtaglength = टॅग्ज साठी 25 वर्णांची मर्यादा आहे
+mustbeconnected = Pocket मध्ये साठविण्यासाठी आपले इंटरनेट चालू असणे आवश्यक आहे. कृपया आपली जोडणी तपासा आणि पुन्हा प्रयत्न करा.
+onlylinkssaved = फक्त दुवे जतन केले जाऊ शकतात
+pagenotsaved = पृष्ठ जतन झाले नाही
+pageremoved = पृष्ठ काढले गेले
+pagesaved = Pocket मध्ये जतन झाले
+processingremove = पृष्ठ काढून टाकत आहे...
+processingtags = टॅग्ज जोडत आहे…
+removepage = पृष्ठ काढून टाका
+save = जतन करा
+saving = जतन करत आहे...
+signupemail = ईमेलसह साईन अप करा
+signuptosave = Pocket साठी साईन अप करा. हे मोफत आहे.
+suggestedtags = सूचविलेले टॅग्स
+tagline = Firefox मधील नोंदी आणि व्हिडीओ कुठल्याही साधनावर केंव्हाही Pocket मध्ये पाहण्यासाठी साठवा.
+taglinestory_one = Firefox वरील कोणताही लेख, व्हिडिओ किंवा पृष्ठ जतन करण्यासाठी Pocket बटणावर क्लिक करा.
+taglinestory_two = कधीही कुठल्याही साधनावर Pocket मध्ये पाहा.
+tagssaved = टॅग्स जोडले
+tos = सुरु ठेवुन, आपण Pocketच्या <a href="%1$S" target="_blank">सेवेच्या अटी</a> आणि <a href="%2$S" target="_blank">गोपनीयता धोरणांशी</a> सहमत आहात
+tryitnow = आत्ताच वापरुन पाहा
+signinfirefox = Firefox सह साइन इन करा
+signupfirefox = Firefox सह साईन अप करा
+viewlist = यादी पहा
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = Pocket मध्ये जतन करा
+saveToPocketCmd.label = पृष्ठ Pocket मध्ये जतन करा
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = दुवा Pocket मध्ये संकलित करा
+saveLinkToPocketCmd.accesskey = o
+pocketMenuitem.label = पॉकेट सूची पहा
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/ms/pocket.properties
@@ -0,0 +1,43 @@
+# 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/.
+
+addtags = Tambah Tag
+alreadyhaveacct = Sudah menjadi pengguna Poket?
+continueff = Teruskan dengan Firefox
+errorgeneric = Ada ralat semasa cuba menyimpan ke Pocket.
+learnmore = Ketahui Selanjutnya
+loginnow = Log masuk
+maxtaglength = Tag dihadkan hanya 25 aksara
+mustbeconnected = Anda mesti ada sambungan Internet untuk menyimpan ke Pocket. Sila periksa sambungan anda dan cuba lagi.
+onlylinkssaved = Hanya pautan boleh disimpan
+pagenotsaved = Halaman Tidak Disimpan
+pageremoved = Halaman Dialih keluar
+pagesaved = Disimpan ke Pocket
+processingremove = Sedang mengalih keluar Halaman…
+processingtags = Sedang menambah tag…
+removepage = Alih keluar Halaman
+save = Simpan
+saving = Sedang menyimpan…
+signupemail = Daftar dengan e-mel
+signuptosave = Daftar masuk ke Pocket. Percuma.
+suggestedtags = Tag Disyorkan
+tagline = Simpan artikel dan video dari Firefox untuk dilihat dalam Pocket pada apa jua peranti pada bila-bila masa.
+taglinestory_one = Klik butang Pocket untuk menyimpan apa jua artikel, video atau halaman daripada Firefox.
+taglinestory_two = Papar dalam Pocket dalam mana-mana peranti, bila-bila masa saja.
+tagssaved = Tag Ditambah
+tos = Dengan meneruskan, anda setuju dengan <a href="%1$S" target="_blank">Terma Perkhidmatan</a> Pocket dan <a href="%2$S" target="_blank">Polisi Privasi</a>
+tryitnow = Cubanya Sekarang
+signinfirefox = Daftar masuk Firefox
+signupfirefox = Daftar dengan Firefox
+viewlist = Senarai Paparan
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = Simpan ke Pocket
+saveToPocketCmd.label = Simpan Halaman ke Pocket
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = Simpan Pautan ke Pocket
+saveLinkToPocketCmd.accesskey = o
+pocketMenuitem.label = Papar Senarai Pocket
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/pl/pocket.properties
@@ -0,0 +1,48 @@
+# 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/.
+
+taglinestory_one=Kliknij przycisk Pocket, aby wysłać dowolny artykuł, film lub stronę z Firefoksa.
+taglinestory_two=Czytaj z Pocket o dowolnej porze na dowolnym urządzeniu.
+learnmore=Więcej informacji
+
+signuptosave=Utwórz konto w Pocket. Jest darmowe.
+signupfirefox=Utwórz konto z Firefoksem
+signupemail=Utwórz konto z adresem e-mail
+alreadyhaveacct=Masz już konto Pocket?
+loginnow=Zaloguj się
+
+tos=Kontynuując, wyrażasz zgodę na <a href="%1$S" target="_blank">warunki korzystania z usługi</a> i <a href="%2$S" target="_blank">politykę prywatności</a>
+tryitnow=Wypróbuj teraz
+
+continueff=Kontynuuj z kontem Firefoksa
+signinfirefox=Zaloguj się z Firefoksem
+viewlist=Otwórz w Pocket
+
+removepage=Usuń stronę
+processingremove=Usuwanie strony…
+pageremoved=Usunięto stronę
+
+save=Wyślij
+saving=Wysyłanie…
+pagesaved=Wysłano do Pocket
+
+addtags=Etykiety
+processingtags=Wysyłanie etykiet…
+tagssaved=Wysłano etykiety
+maxtaglength=Etykiety są ograniczone do 25 znaków
+suggestedtags=Sugerowane etykiety
+tagline=Wysyłaj artykuły i filmy z Firefoksa do Pocket, aby wyświetlić je o dowolnej porze na dowolnym urządzeniu.
+
+errorgeneric=Wystąpił błąd podczas wysyłania do Pocket.
+mustbeconnected=Połączenie z Internetem jest konieczne do przesyłania do Pocket. Proszę sprawdzić połączenie i spróbować ponownie.
+onlylinkssaved=Tylko odnośniki mogą być przesyłane
+pagenotsaved=Nie przesłano strony
+
+pocket-button.label=Pocket
+pocket-button.tooltiptext=Wyślij do Pocket
+saveToPocketCmd.label=Wyślij stronę do Pocket
+saveToPocketCmd.accesskey=s
+saveLinkToPocketCmd.label=Wyślij odnośnik do Pocket
+saveLinkToPocketCmd.accesskey=o
+pocketMenuitem.label=Wysłane do Pocket
--- a/browser/themes/osx/syncedtabs/sidebar.css
+++ b/browser/themes/osx/syncedtabs/sidebar.css
@@ -107,17 +107,17 @@ html {
 .search-box {
   -moz-appearance: searchfield;
   padding: 1px;
   font-size: 12px;
   cursor: text;
   margin: 4px 8px 10px;
   border-width: 3px;
   border-style: solid;
-  border-color: -moz-use-text-color;
+  border-color: currentcolor;
   border-image: none;
   -moz-border-top-colors: transparent #888 #000;
   -moz-border-right-colors: transparent #FFF #000;
   -moz-border-bottom-colors: transparent #FFF #000;
   -moz-border-left-colors: transparent #888 #000;
   border-top-right-radius: 2px;
   border-bottom-left-radius: 2px;
   background-color: #FFF;
--- a/build/moz.configure/init.configure
+++ b/build/moz.configure/init.configure
@@ -811,10 +811,8 @@ add_old_configure_assignment('PKG_CONFIG
 # Bug 1278542: This function is a workaround to resolve
 # |android_ndk_include|'s dependency on 'gonkdir.' The
 # actual implementation is located in b2g/moz.configure.
 # Remove this function as soon as 'android_ndk_include'
 # depends on 'target.'
 @dependable
 def gonkdir():
     return None
-
-include(include_project_configure)
--- a/build/mozconfig.cache
+++ b/build/mozconfig.cache
@@ -77,18 +77,21 @@ elif test -z "$CCACHE_DIR" -a -z "$SCCAC
                 master=dummy.usw1.mozilla.com
                 ;;
             us-west-2)
                 master=dummy.usw2.mozilla.com
                 ;;
             esac
         fi
     fi
+fi
 
-
+# if platform hasn't been determined from buildprops, and we're on windows,
+# it must be set to prevent adding ac_add_options --with-ccache below
+if test -z "$platform"; then
     # set platform based on the SYSTEMROOT env var
     case "${SYSTEMROOT}" in
     *Windows)
         platform=windows
         ;;
     esac
 fi
 
--- a/devtools/client/animationinspector/animation-controller.js
+++ b/devtools/client/animationinspector/animation-controller.js
@@ -137,17 +137,17 @@ var AnimationsController = {
       return;
     }
     this.initialized = promise.defer();
 
     this.onPanelVisibilityChange = this.onPanelVisibilityChange.bind(this);
     this.onNewNodeFront = this.onNewNodeFront.bind(this);
     this.onAnimationMutations = this.onAnimationMutations.bind(this);
 
-    let target = gToolbox.target;
+    let target = gInspector.target;
     this.animationsFront = new AnimationsFront(target.client, target.form);
 
     // Expose actor capabilities.
     this.traits = yield getServerTraits(target);
 
     if (this.destroyed) {
       console.warn("Could not fully initialize the AnimationsController");
       return;
--- a/devtools/client/definitions.js
+++ b/devtools/client/definitions.js
@@ -4,17 +4,17 @@
 
 "use strict";
 
 const Services = require("Services");
 const osString = Services.appinfo.OS;
 
 // Panels
 loader.lazyGetter(this, "OptionsPanel", () => require("devtools/client/framework/toolbox-options").OptionsPanel);
-loader.lazyGetter(this, "InspectorPanel", () => require("devtools/client/inspector/inspector-panel").InspectorPanel);
+loader.lazyGetter(this, "InspectorPanel", () => require("devtools/client/inspector/panel").InspectorPanel);
 loader.lazyGetter(this, "WebConsolePanel", () => require("devtools/client/webconsole/panel").WebConsolePanel);
 loader.lazyGetter(this, "DebuggerPanel", () => require("devtools/client/debugger/panel").DebuggerPanel);
 loader.lazyGetter(this, "StyleEditorPanel", () => require("devtools/client/styleeditor/styleeditor-panel").StyleEditorPanel);
 loader.lazyGetter(this, "ShaderEditorPanel", () => require("devtools/client/shadereditor/panel").ShaderEditorPanel);
 loader.lazyGetter(this, "CanvasDebuggerPanel", () => require("devtools/client/canvasdebugger/panel").CanvasDebuggerPanel);
 loader.lazyGetter(this, "WebAudioEditorPanel", () => require("devtools/client/webaudioeditor/panel").WebAudioEditorPanel);
 loader.lazyGetter(this, "MemoryPanel", () => require("devtools/client/memory/panel").MemoryPanel);
 loader.lazyGetter(this, "PerformancePanel", () => require("devtools/client/performance/panel").PerformancePanel);
--- a/devtools/client/framework/devtools-browser.js
+++ b/devtools/client/framework/devtools-browser.js
@@ -136,16 +136,20 @@ var gDevToolsBrowser = exports.gDevTools
         break;
       case "nsPref:changed":
         if (prefName.endsWith("enabled")) {
           for (let win of this._trackedBrowserWindows) {
             this.updateCommandAvailability(win);
           }
         }
         break;
+      case "domwindowopened":
+        let win = subject.QueryInterface(Ci.nsIDOMEventTarget);
+        win.addEventListener("DOMContentLoaded", this, { once: true });
+        break;
     }
   },
 
   _prefObserverRegistered: false,
 
   ensurePrefObserver: function () {
     if (!this._prefObserverRegistered) {
       this._prefObserverRegistered = true;
@@ -397,42 +401,59 @@ var gDevToolsBrowser = exports.gDevTools
    * Move WebIDE widget to the navbar
    */
    // Used by webide.js
   moveWebIDEWidgetInNavbar: function () {
     CustomizableUI.addWidgetToArea("webide-button", CustomizableUI.AREA_NAVBAR);
   },
 
   /**
+   * Starts setting up devtools on a given browser window. This method is
+   * called on DOMContentLoaded, so earlier than registerBrowserWindow which
+   * is called after delayed-startup notification. This method should only do
+   * what has to be done early. Otherwise devtools should be initialized lazily
+   * to prevent overloading Firefox startup.
+   *
+   * @param {ChromeWindow} window
+   *        The window to which devtools should be hooked to.
+   */
+  _onBrowserWindowLoaded: function (win) {
+    // This method is called for all top level window, only consider firefox
+    // windows
+    if (!win.gBrowser || !win.location.href.endsWith("browser.xul")) {
+      return;
+    }
+    BrowserMenus.addMenus(win.document);
+    win.addEventListener("unload", this);
+  },
+
+  /**
    * Add this DevTools's presence to a browser window's document
    *
-   * @param {XULDocument} doc
-   *        The document to which devtools should be hooked to.
+   * @param {ChromeWindow} win
+   *        The window to which devtools should be hooked to.
    */
   _registerBrowserWindow: function (win) {
     if (gDevToolsBrowser._trackedBrowserWindows.has(win)) {
       return;
     }
     gDevToolsBrowser._trackedBrowserWindows.add(win);
 
-    BrowserMenus.addMenus(win.document);
-
     // Register the Developer widget in the Hamburger menu or navbar
     // only once menus are registered as it depends on it.
     gDevToolsBrowser.installDeveloperWidget();
 
     // Inject lazily DeveloperToolbar on the chrome window
     loader.lazyGetter(win, "DeveloperToolbar", function () {
       let { DeveloperToolbar } = require("devtools/client/shared/developer-toolbar");
       return new DeveloperToolbar(win);
     });
 
     this.updateCommandAvailability(win);
     this.ensurePrefObserver();
-    win.addEventListener("unload", this);
 
     let tabContainer = win.gBrowser.tabContainer;
     tabContainer.addEventListener("TabSelect", this, false);
     tabContainer.addEventListener("TabOpen", this, false);
     tabContainer.addEventListener("TabClose", this, false);
     tabContainer.addEventListener("TabPinned", this, false);
     tabContainer.addEventListener("TabUnpinned", this, false);
   },
@@ -619,23 +640,26 @@ var gDevToolsBrowser = exports.gDevTools
   /**
    * Called on browser unload to remove menu entries, toolboxes and event
    * listeners from the closed browser window.
    *
    * @param  {XULWindow} win
    *         The window containing the menu entry
    */
   _forgetBrowserWindow: function (win) {
+    // _forgetBrowserWindow can only be called once for each window, but
+    // _registerBrowserWindow may not have been called. Instead, only
+    // _onBrowserWindowLoaded was and we only need to revert that.
+    win.removeEventListener("unload", this);
+    BrowserMenus.removeMenus(win.document);
+
     if (!gDevToolsBrowser._trackedBrowserWindows.has(win)) {
       return;
     }
     gDevToolsBrowser._trackedBrowserWindows.delete(win);
-    win.removeEventListener("unload", this);
-
-    BrowserMenus.removeMenus(win.document);
 
     // Destroy toolboxes for closed window
     for (let [target, toolbox] of gDevTools._toolboxes) {
       if (toolbox.win.top == win) {
         toolbox.destroy();
       }
     }
 
@@ -674,16 +698,19 @@ var gDevToolsBrowser = exports.gDevTools
         this._tabStats.histOpen.push(open);
         this._tabStats.histPinned.push(pinned);
         this._tabStats.peakOpen = Math.max(open, this._tabStats.peakOpen);
         this._tabStats.peakPinned = Math.max(pinned, this._tabStats.peakPinned);
         break;
       case "TabSelect":
         gDevToolsBrowser._updateMenuCheckbox();
         break;
+      case "DOMContentLoaded":
+        gDevToolsBrowser._onBrowserWindowLoaded(event.target.defaultView);
+        break;
       case "unload":
         // top-level browser window unload
         gDevToolsBrowser._forgetBrowserWindow(event.target.defaultView);
         break;
     }
   },
 
   _pingTelemetry: function () {
@@ -703,16 +730,17 @@ var gDevToolsBrowser = exports.gDevTools
     this._telemetry.log(TABS_PINNED_AVG_HISTOGRAM, mean(tabStats.histPinned));
   },
 
   /**
    * All browser windows have been closed, tidy up remaining objects.
    */
   destroy: function () {
     Services.prefs.removeObserver("devtools.", gDevToolsBrowser);
+    Services.ww.unregisterNotification(gDevToolsBrowser);
     Services.obs.removeObserver(gDevToolsBrowser, "browser-delayed-startup-finished");
     Services.obs.removeObserver(gDevToolsBrowser.destroy, "quit-application");
 
     gDevToolsBrowser._pingTelemetry();
     gDevToolsBrowser._telemetry = null;
 
     for (let win of gDevToolsBrowser._trackedBrowserWindows) {
       gDevToolsBrowser._forgetBrowserWindow(win);
@@ -735,24 +763,26 @@ gDevTools.on("tool-unregistered", functi
   }
   gDevToolsBrowser._removeToolFromWindows(toolId);
 });
 
 gDevTools.on("toolbox-ready", gDevToolsBrowser._updateMenuCheckbox);
 gDevTools.on("toolbox-destroyed", gDevToolsBrowser._updateMenuCheckbox);
 
 Services.obs.addObserver(gDevToolsBrowser.destroy, "quit-application", false);
+Services.ww.registerNotification(gDevToolsBrowser);
 Services.obs.addObserver(gDevToolsBrowser, "browser-delayed-startup-finished", false);
 
 // Fake end of browser window load event for all already opened windows
 // that is already fully loaded.
 let enumerator = Services.wm.getEnumerator(gDevTools.chromeWindowType);
 while (enumerator.hasMoreElements()) {
   let win = enumerator.getNext();
   if (win.gBrowserInit && win.gBrowserInit.delayedStartupFinished) {
+    gDevToolsBrowser._onBrowserWindowLoaded(win);
     gDevToolsBrowser._registerBrowserWindow(win);
   }
 }
 
 // Watch for module loader unload. Fires when the tools are reloaded.
 unload(function () {
   gDevToolsBrowser.destroy();
 });
--- a/devtools/client/framework/test/browser_toolbox_textbox_context_menu.js
+++ b/devtools/client/framework/test/browser_toolbox_textbox_context_menu.js
@@ -2,17 +2,17 @@
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 const URL = "data:text/html;charset=utf8,test for textbox context menu";
 
 add_task(function* () {
   let toolbox = yield openNewTabAndToolbox(URL, "inspector");
-  let textboxContextMenu = toolbox.textboxContextMenuPopup;
+  let textboxContextMenu = toolbox.textBoxContextMenuPopup;
 
   emptyClipboard();
 
   // Make sure the focus is predictable.
   let inspector = toolbox.getPanel("inspector");
   let onFocus = once(inspector.searchBox, "focus");
   inspector.searchBox.focus();
   yield onFocus;
--- a/devtools/client/framework/toolbox.js
+++ b/devtools/client/framework/toolbox.js
@@ -132,17 +132,17 @@ function Toolbox(target, selectedTool, h
   this.destroy = this.destroy.bind(this);
   this.highlighterUtils = getHighlighterUtils(this);
   this._highlighterReady = this._highlighterReady.bind(this);
   this._highlighterHidden = this._highlighterHidden.bind(this);
   this._prefChanged = this._prefChanged.bind(this);
   this._saveSplitConsoleHeight = this._saveSplitConsoleHeight.bind(this);
   this._onFocus = this._onFocus.bind(this);
   this._showDevEditionPromo = this._showDevEditionPromo.bind(this);
-  this._updateTextboxMenuItems = this._updateTextboxMenuItems.bind(this);
+  this._updateTextBoxMenuItems = this._updateTextBoxMenuItems.bind(this);
   this._onBottomHostMinimized = this._onBottomHostMinimized.bind(this);
   this._onBottomHostMaximized = this._onBottomHostMaximized.bind(this);
   this._onToolSelectWhileMinimized = this._onToolSelectWhileMinimized.bind(this);
   this._onPerformanceFrontEvent = this._onPerformanceFrontEvent.bind(this);
   this._onBottomHostWillChange = this._onBottomHostWillChange.bind(this);
   this._toggleMinimizeMode = this._toggleMinimizeMode.bind(this);
   this._onTabbarFocus = this._onTabbarFocus.bind(this);
   this._onTabbarArrowKeypress = this._onTabbarArrowKeypress.bind(this);
@@ -397,20 +397,20 @@ Toolbox.prototype = {
       gDevTools.on("pref-changed", this._prefChanged);
 
       let framesMenu = this.doc.getElementById("command-button-frames");
       framesMenu.addEventListener("click", this.showFramesMenu, false);
 
       let noautohideMenu = this.doc.getElementById("command-button-noautohide");
       noautohideMenu.addEventListener("click", this._toggleAutohide, true);
 
-      this.textboxContextMenuPopup =
+      this.textBoxContextMenuPopup =
         this.doc.getElementById("toolbox-textbox-context-popup");
-      this.textboxContextMenuPopup.addEventListener("popupshowing",
-        this._updateTextboxMenuItems, true);
+      this.textBoxContextMenuPopup.addEventListener("popupshowing",
+        this._updateTextBoxMenuItems, true);
 
       this.shortcuts = new KeyShortcuts({
         window: this.doc.defaultView
       });
       this._buildDockButtons();
       this._buildOptions();
       this._buildTabs();
       this._applyCacheSettings();
@@ -2091,20 +2091,20 @@ Toolbox.prototype = {
       this.webconsolePanel.removeEventListener("resize",
         this._saveSplitConsoleHeight);
       this.webconsolePanel = null;
     }
     if (this.closeButton) {
       this.closeButton.removeEventListener("click", this.destroy, true);
       this.closeButton = null;
     }
-    if (this.textboxContextMenuPopup) {
-      this.textboxContextMenuPopup.removeEventListener("popupshowing",
-        this._updateTextboxMenuItems, true);
-      this.textboxContextMenuPopup = null;
+    if (this.textBoxContextMenuPopup) {
+      this.textBoxContextMenuPopup.removeEventListener("popupshowing",
+        this._updateTextBoxMenuItems, true);
+      this.textBoxContextMenuPopup = null;
     }
     if (this.tabbar) {
       this.tabbar.removeEventListener("focus", this._onTabbarFocus, true);
       this.tabbar.removeEventListener("click", this._onTabbarFocus, true);
       this.tabbar.removeEventListener("keypress", this._onTabbarArrowKeypress);
       this.tabbar = null;
     }
 
@@ -2230,23 +2230,34 @@ Toolbox.prototype = {
       return;
     }
     showDoorhanger({ window: this.win, type: "deveditionpromo" });
   },
 
   /**
    * Enable / disable necessary textbox menu items using globalOverlay.js.
    */
-  _updateTextboxMenuItems: function () {
+  _updateTextBoxMenuItems: function () {
     let window = this.win;
     ["cmd_undo", "cmd_delete", "cmd_cut",
      "cmd_copy", "cmd_paste", "cmd_selectAll"].forEach(window.goUpdateCommand);
   },
 
   /**
+   * Open the textbox context menu at given coordinates.
+   * Panels in the toolbox can call this on contextmenu events with event.screenX/Y
+   * instead of having to implement their own copy/paste/selectAll menu.
+   * @param {Number} x
+   * @param {Number} y
+   */
+  openTextBoxContextMenu: function (x, y) {
+    this.textBoxContextMenuPopup.openPopupAtScreen(x, y, true);
+  },
+
+  /**
    * Connects to the SPS profiler when the developer tools are open. This is
    * necessary because of the WebConsole's `profile` and `profileEnd` methods.
    */
   initPerformance: Task.async(function* () {
     // If target does not have profiler actor (addons), do not
     // even register the shared performance connection.
     if (!this.target.hasActor("profiler")) {
       return promise.resolve();
--- a/devtools/client/inspector/components/box-model.js
+++ b/devtools/client/inspector/components/box-model.js
@@ -336,20 +336,20 @@ BoxModelView.prototype = {
     }
   },
 
   /**
    * Start listening to reflows in the current tab.
    */
   trackReflows: function () {
     if (!this.reflowFront) {
-      let toolbox = this.inspector.toolbox;
-      if (toolbox.target.form.reflowActor) {
-        this.reflowFront = ReflowFront(toolbox.target.client,
-                                       toolbox.target.form);
+      let { target } = this.inspector;
+      if (target.form.reflowActor) {
+        this.reflowFront = ReflowFront(target.client,
+                                       target.form);
       } else {
         return;
       }
     }
 
     this.reflowFront.on("reflows", this.update);
     this.reflowFront.start();
   },
@@ -379,17 +379,16 @@ BoxModelView.prototype = {
       initial: initialValue,
       contentType: InplaceEditor.CONTENT_TYPES.CSS_VALUE,
       property: {
         name: dimension.property
       },
       start: self => {
         self.elt.parentNode.classList.add("boxmodel-editing");
       },
-
       change: value => {
         if (NUMERIC.test(value)) {
           value += "px";
         }
 
         let properties = [
           { name: property, value: value }
         ];
@@ -399,25 +398,25 @@ BoxModelView.prototype = {
           let style = session.getProperty(bprop);
           if (!style || style == "none" || style == "hidden") {
             properties.push({ name: bprop, value: "solid" });
           }
         }
 
         session.setProperties(properties).catch(e => console.error(e));
       },
-
       done: (value, commit) => {
         editor.elt.parentNode.classList.remove("boxmodel-editing");
         if (!commit) {
           session.revert().then(() => {
             session.destroy();
           }, e => console.error(e));
         }
       },
+      contextMenu: this.inspector.onTextBoxContextMenu,
       cssProperties: this._cssProperties
     }, event);
   },
 
   /**
    * Is the BoxModelView visible in the sidebar.
    * @return {Boolean}
    */
@@ -463,17 +462,17 @@ BoxModelView.prototype = {
     if (this.inspector.markup) {
       this.inspector.markup.off("leave", this.onMarkupViewLeave);
       this.inspector.markup.off("node-hover", this.onMarkupViewNodeHover);
     }
 
     this.inspector.sidebar.off("computedview-selected", this.onNewNode);
     this.inspector.selection.off("new-node-front", this.onNewSelection);
     this.inspector.sidebar.off("select", this.onSidebarSelect);
-    this.inspector._target.off("will-navigate", this.onWillNavigate);
+    this.inspector.target.off("will-navigate", this.onWillNavigate);
     this.inspector.off("computed-view-filtered", this.onFilterComputedView);
 
     this.inspector = null;
     this.doc = null;
     this.wrapper = null;
     this.container = null;
     this.expander = null;
     this.sizeLabel = null;
@@ -787,17 +786,17 @@ BoxModelView.prototype = {
         // Hide completely the geometry editor if the picker is clicked
         toolbox.on("picker-started", this.onPickerStarted);
 
         // Temporary hide the geometry editor
         this.inspector.markup.on("leave", this.onMarkupViewLeave);
         this.inspector.markup.on("node-hover", this.onMarkupViewNodeHover);
 
         // Release the actor on will-navigate event
-        this.inspector._target.once("will-navigate", this.onWillNavigate);
+        this.inspector.target.once("will-navigate", this.onWillNavigate);
       });
   },
 
   /**
    * Hide the geometry editor highlighter on the currently selected element
    * @param {Boolean} [updateButton=true]
    *   Indicates if the Geometry Editor's button needs to be unchecked too
    */
--- a/devtools/client/inspector/computed/computed.js
+++ b/devtools/client/inspector/computed/computed.js
@@ -143,18 +143,16 @@ function CssComputedView(inspector, docu
   // Create bound methods.
   this.focusWindow = this.focusWindow.bind(this);
   this._onContextMenu = this._onContextMenu.bind(this);
   this._onClick = this._onClick.bind(this);
   this._onCopy = this._onCopy.bind(this);
   this._onFilterStyles = this._onFilterStyles.bind(this);
   this._onClearSearch = this._onClearSearch.bind(this);
   this._onIncludeBrowserStyles = this._onIncludeBrowserStyles.bind(this);
-  this._onFilterTextboxContextMenu =
-    this._onFilterTextboxContextMenu.bind(this);
 
   let doc = this.styleDocument;
   this.element = doc.getElementById("propertyContainer");
   this.searchField = doc.getElementById("computedview-searchbox");
   this.searchClearButton = doc.getElementById("computedview-searchinput-clear");
   this.includeBrowserStylesCheckbox =
     doc.getElementById("browser-style-checkbox");
 
@@ -162,18 +160,17 @@ function CssComputedView(inspector, docu
   this._onShortcut = this._onShortcut.bind(this);
   this.shortcuts.on("CmdOrCtrl+F", this._onShortcut);
   this.shortcuts.on("Escape", this._onShortcut);
   this.styleDocument.addEventListener("mousedown", this.focusWindow);
   this.element.addEventListener("click", this._onClick);
   this.element.addEventListener("copy", this._onCopy);
   this.element.addEventListener("contextmenu", this._onContextMenu);
   this.searchField.addEventListener("input", this._onFilterStyles);
-  this.searchField.addEventListener("contextmenu",
-                                    this._onFilterTextboxContextMenu);
+  this.searchField.addEventListener("contextmenu", this.inspector.onTextBoxContextMenu);
   this.searchClearButton.addEventListener("click", this._onClearSearch);
   this.includeBrowserStylesCheckbox.addEventListener("input",
     this._onIncludeBrowserStyles);
 
   this.searchClearButton.hidden = true;
 
   // No results text.
   this.noResults = this.styleDocument.getElementById("computedview-no-results");
@@ -542,29 +539,16 @@ CssComputedView.prototype = {
       }
 
       this.refreshPanel();
       this._filterChangeTimeout = null;
     }, filterTimeout);
   },
 
   /**
-   * Context menu handler for filter style search box.
-   */
-  _onFilterTextboxContextMenu: function (event) {
-    try {
-      this.styleDocument.defaultView.focus();
-      let contextmenu = this.inspector.toolbox.textboxContextMenuPopup;
-      contextmenu.openPopupAtScreen(event.screenX, event.screenY, true);
-    } catch (e) {
-      console.error(e);
-    }
-  },
-
-  /**
    * Called when the user clicks on the clear button in the filter style search
    * box. Returns true if the search box is cleared and false otherwise.
    */
   _onClearSearch: function () {
     if (this.searchField.value) {
       this.setFilterStyles("");
       return true;
     }
@@ -649,18 +633,17 @@ CssComputedView.prototype = {
   get matchedProperties() {
     return this._matchedProperties || new Set();
   },
 
   /**
    * Focus the window on mousedown.
    */
   focusWindow: function () {
-    let win = this.styleDocument.defaultView;
-    win.focus();
+    this.styleWindow.focus();
   },
 
   /**
    * Context menu handler.
    */
   _onContextMenu: function (event) {
     this._contextmenu.show(event);
   },
@@ -687,17 +670,17 @@ CssComputedView.prototype = {
     event.preventDefault();
   },
 
   /**
    * Copy the current selection to the clipboard
    */
   copySelection: function () {
     try {
-      let win = this.styleDocument.defaultView;
+      let win = this.styleWindow;
       let text = win.getSelection().toString().trim();
 
       // Tidy up block headings by moving CSS property names and their
       // values onto the same line and inserting a colon between them.
       let textArray = text.split(/[\r\n]+/);
       let result = "";
 
       // Parse text array to output string.
@@ -753,17 +736,17 @@ CssComputedView.prototype = {
 
     // Remove bound listeners
     this.styleDocument.removeEventListener("mousedown", this.focusWindow);
     this.element.removeEventListener("click", this._onClick);
     this.element.removeEventListener("copy", this._onCopy);
     this.element.removeEventListener("contextmenu", this._onContextMenu);
     this.searchField.removeEventListener("input", this._onFilterStyles);
     this.searchField.removeEventListener("contextmenu",
-                                         this._onFilterTextboxContextMenu);
+      this.inspector.onTextBoxContextMenu);
     this.searchClearButton.removeEventListener("click", this._onClearSearch);
     this.includeBrowserStylesCheckbox.removeEventListener("input",
       this._onIncludeBrowserStyles);
 
     // Nodes used in templating
     this.element = null;
     this.panel = null;
     this.searchField = null;
--- a/devtools/client/inspector/computed/test/browser_computed_search-filter_context-menu.js
+++ b/devtools/client/inspector/computed/test/browser_computed_search-filter_context-menu.js
@@ -12,17 +12,17 @@ const TEST_URI = "<h1>test filter contex
 
 add_task(function* () {
   yield addTab("data:text/html;charset=utf-8," + encodeURIComponent(TEST_URI));
   let {toolbox, inspector, view} = yield openComputedView();
   yield selectNode("h1", inspector);
 
   let win = view.styleWindow;
   let searchField = view.searchField;
-  let searchContextMenu = toolbox.textboxContextMenuPopup;
+  let searchContextMenu = toolbox.textBoxContextMenuPopup;
   ok(searchContextMenu,
     "The search filter context menu is loaded in the computed view");
 
   let cmdUndo = searchContextMenu.querySelector("[command=cmd_undo]");
   let cmdDelete = searchContextMenu.querySelector("[command=cmd_delete]");
   let cmdSelectAll = searchContextMenu.querySelector("[command=cmd_selectAll]");
   let cmdCut = searchContextMenu.querySelector("[command=cmd_cut]");
   let cmdCopy = searchContextMenu.querySelector("[command=cmd_copy]");
--- a/devtools/client/inspector/fonts/fonts.js
+++ b/devtools/client/inspector/fonts/fonts.js
@@ -27,19 +27,20 @@ FontInspector.prototype = {
     this.onNewNode = this.onNewNode.bind(this);
     this.onThemeChanged = this.onThemeChanged.bind(this);
     this.inspector.selection.on("new-node-front", this.onNewNode);
     this.inspector.sidebar.on("fontinspector-selected", this.onNewNode);
     this.showAll = this.showAll.bind(this);
     this.showAllLink = this.chromeDoc.getElementById("font-showall");
     this.showAllLink.addEventListener("click", this.showAll);
     this.previewTextChanged = this.previewTextChanged.bind(this);
-    this.previewInput =
-      this.chromeDoc.getElementById("font-preview-text-input");
+    this.previewInput = this.chromeDoc.getElementById("font-preview-text-input");
     this.previewInput.addEventListener("input", this.previewTextChanged);
+    this.previewInput.addEventListener("contextmenu",
+      this.inspector.onTextBoxContextMenu);
 
     // Listen for theme changes as the color of the previews depend on the theme
     gDevTools.on("theme-switched", this.onThemeChanged);
 
     this.update();
   },
 
   /**
@@ -54,16 +55,18 @@ FontInspector.prototype = {
    * Remove listeners.
    */
   destroy: function () {
     this.chromeDoc = null;
     this.inspector.sidebar.off("fontinspector-selected", this.onNewNode);
     this.inspector.selection.off("new-node-front", this.onNewNode);
     this.showAllLink.removeEventListener("click", this.showAll);
     this.previewInput.removeEventListener("input", this.previewTextChanged);
+    this.previewInput.removeEventListener("contextmenu",
+      this.inspector.onTextBoxContextMenu);
 
     gDevTools.off("theme-switched", this.onThemeChanged);
 
     if (this._previewUpdateTimeout) {
       clearTimeout(this._previewUpdateTimeout);
     }
   },
 
--- a/devtools/client/inspector/inspector-search.js
+++ b/devtools/client/inspector/inspector-search.js
@@ -37,22 +37,19 @@ function InspectorSearch(inspector, inpu
   this.searchClearButton = clearBtn;
   this._lastSearched = null;
 
   this.searchClearButton.hidden = true;
 
   this._onKeyDown = this._onKeyDown.bind(this);
   this._onInput = this._onInput.bind(this);
   this._onClearSearch = this._onClearSearch.bind(this);
-  this._onFilterTextboxContextMenu =
-    this._onFilterTextboxContextMenu.bind(this);
   this.searchBox.addEventListener("keydown", this._onKeyDown, true);
   this.searchBox.addEventListener("input", this._onInput, true);
-  this.searchBox.addEventListener("contextmenu",
-    this._onFilterTextboxContextMenu);
+  this.searchBox.addEventListener("contextmenu", this.inspector.onTextBoxContextMenu);
   this.searchClearButton.addEventListener("click", this._onClearSearch);
 
   // For testing, we need to be able to wait for the most recent node request
   // to finish.  Tests can watch this promise for that.
   this._lastQuery = promise.resolve(null);
 
   this.autocompleter = new SelectorAutocompleter(inspector, input);
   EventEmitter.decorate(this);
@@ -64,17 +61,17 @@ InspectorSearch.prototype = {
   get walker() {
     return this.inspector.walker;
   },
 
   destroy: function () {
     this.searchBox.removeEventListener("keydown", this._onKeyDown, true);
     this.searchBox.removeEventListener("input", this._onInput, true);
     this.searchBox.removeEventListener("contextmenu",
-      this._onFilterTextboxContextMenu);
+      this.inspector.onTextBoxContextMenu);
     this.searchClearButton.removeEventListener("click", this._onClearSearch);
     this.searchBox = null;
     this.searchClearButton = null;
     this.autocompleter.destroy();
   },
 
   _onSearch: function (reverse = false) {
     this.doFullTextSearch(this.searchBox.value, reverse)
@@ -131,28 +128,16 @@ InspectorSearch.prototype = {
     const modifierKey = Services.appinfo.OS === "Darwin"
                         ? event.metaKey : event.ctrlKey;
     if (event.keyCode === KeyCodes.DOM_VK_G && modifierKey) {
       this._onSearch(event.shiftKey);
       event.preventDefault();
     }
   },
 
-  /**
-   * Context menu handler for filter search box.
-   */
-  _onFilterTextboxContextMenu: function (event) {
-    try {
-      let contextmenu = this.inspector.toolbox.textboxContextMenuPopup;
-      contextmenu.openPopupAtScreen(event.screenX, event.screenY, true);
-    } catch (e) {
-      console.error(e);
-    }
-  },
-
   _onClearSearch: function () {
     this.searchBox.classList.remove("devtools-style-searchbox-no-match");
     this.searchBox.value = "";
     this.searchClearButton.hidden = true;
     this.emit("search-cleared");
   }
 };
 
rename from devtools/client/inspector/inspector-panel.js
rename to devtools/client/inspector/inspector.js
--- a/devtools/client/inspector/inspector-panel.js
+++ b/devtools/client/inspector/inspector.js
@@ -1,16 +1,20 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set ft=javascript ts=2 et sw=2 tw=80: */
 /* 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/. */
 
+/* global window */
+
 "use strict";
 
+var Cu = Components.utils;
+var { require } = Cu.import("resource://devtools/shared/Loader.jsm", {});
 var Services = require("Services");
 var promise = require("promise");
 var defer = require("devtools/shared/defer");
 var EventEmitter = require("devtools/shared/event-emitter");
 const {executeSoon} = require("devtools/shared/DevToolsUtils");
 var {KeyShortcuts} = require("devtools/client/shared/key-shortcuts");
 var {Task} = require("devtools/shared/task");
 const {initCssProperties} = require("devtools/shared/fronts/css-properties");
@@ -76,54 +80,53 @@ const PORTRAIT_MODE_WIDTH = 700;
  * - computed-view-filtered
  *      Fired when the computed rules view is filtered
  * - rule-view-refreshed
  *      Fired when the rule view updates to a new node
  * - rule-view-sourcelinks-updated
  *      Fired when the stylesheet source links have been updated (when switching
  *      to source-mapped files)
  */
-function InspectorPanel(iframeWindow, toolbox) {
+function Inspector(toolbox) {
   this._toolbox = toolbox;
   this._target = toolbox.target;
-  this.panelDoc = iframeWindow.document;
-  this.panelWin = iframeWindow;
+  this.panelDoc = window.document;
+  this.panelWin = window;
   this.panelWin.inspector = this;
 
   this.telemetry = new Telemetry();
 
   this.nodeMenuTriggerInfo = null;
 
   this._handleRejectionIfNotDestroyed = this._handleRejectionIfNotDestroyed.bind(this);
   this._onBeforeNavigate = this._onBeforeNavigate.bind(this);
   this.onNewRoot = this.onNewRoot.bind(this);
   this._onContextMenu = this._onContextMenu.bind(this);
+  this.onTextBoxContextMenu = this.onTextBoxContextMenu.bind(this);
   this._updateSearchResultsLabel = this._updateSearchResultsLabel.bind(this);
   this.onNewSelection = this.onNewSelection.bind(this);
   this.onBeforeNewSelection = this.onBeforeNewSelection.bind(this);
   this.onDetached = this.onDetached.bind(this);
   this.onPaneToggleButtonClicked = this.onPaneToggleButtonClicked.bind(this);
   this._onMarkupFrameLoad = this._onMarkupFrameLoad.bind(this);
   this.onPanelWindowResize = this.onPanelWindowResize.bind(this);
   this.onSidebarShown = this.onSidebarShown.bind(this);
   this.onSidebarHidden = this.onSidebarHidden.bind(this);
 
   this._target.on("will-navigate", this._onBeforeNavigate);
   this._detectingActorFeatures = this._detectActorFeatures();
 
   EventEmitter.decorate(this);
 }
 
-exports.InspectorPanel = InspectorPanel;
-
-InspectorPanel.prototype = {
+Inspector.prototype = {
   /**
    * open is effectively an asynchronous constructor
    */
-  open: Task.async(function* () {
+  init: Task.async(function* () {
     // Localize all the nodes containing a data-localization attribute.
     localizeMarkup(this.panelDoc);
 
     this._cssPropertiesLoaded = initCssProperties(this.toolbox);
     yield this._cssPropertiesLoaded;
     yield this.target.makeRemote();
     yield this._getPageStyle();
     let defaultSelection = yield this._getDefaultNodeForSelection();
@@ -141,16 +144,20 @@ InspectorPanel.prototype = {
   get walker() {
     return this._toolbox.walker;
   },
 
   get selection() {
     return this._toolbox.selection;
   },
 
+  get highlighter() {
+    return this._toolbox.highlighter;
+  },
+
   get isOuterHTMLEditable() {
     return this._target.client.traits.editOuterHTML;
   },
 
   get hasUrlToImageDataResolver() {
     return this._target.client.traits.urlToImageDataResolver;
   },
 
@@ -270,17 +277,17 @@ InspectorPanel.prototype = {
     this._defaultNode = null;
     this.selection.setNodeFront(null);
     this._destroyMarkup();
     this.isDirty = false;
     this._pendingSelection = null;
   },
 
   _getPageStyle: function () {
-    return this._toolbox.inspector.getPageStyle().then(pageStyle => {
+    return this.inspector.getPageStyle().then(pageStyle => {
       this.pageStyle = pageStyle;
     }, this._handleRejectionIfNotDestroyed);
   },
 
   /**
    * Return a promise that will resolve to the default node for selection.
    */
   _getDefaultNodeForSelection: function () {
@@ -436,18 +443,16 @@ InspectorPanel.prototype = {
   /**
    * Build Splitter located between the main and side area of
    * the Inspector panel.
    */
   setupSplitter: function () {
     let SplitBox = this.React.createFactory(this.browserRequire(
       "devtools/client/shared/components/splitter/split-box"));
 
-    this.panelWin.addEventListener("resize", this.onPanelWindowResize, true);
-
     let splitter = SplitBox({
       className: "inspector-sidebar-splitter",
       initialWidth: INITIAL_SIDEBAR_SIZE,
       initialHeight: INITIAL_SIDEBAR_SIZE,
       minSize: MIN_SIDEBAR_SIZE,
       splitterSize: 1,
       endPanelControl: true,
       startPanel: this.InspectorTabPanel({
@@ -457,16 +462,18 @@ InspectorPanel.prototype = {
         id: "inspector-sidebar-container"
       }),
       vert: this.useLandscapeMode(),
     });
 
     this._splitter = this.ReactDOM.render(splitter,
       this.panelDoc.getElementById("inspector-splitter-box"));
 
+    this.panelWin.addEventListener("resize", this.onPanelWindowResize, true);
+
     // Persist splitter state in preferences.
     this.sidebar.on("show", this.onSidebarShown);
     this.sidebar.on("hide", this.onSidebarHidden);
     this.sidebar.on("destroy", this.onSidebarHidden);
   },
 
   /**
    * Splitter clean up.
@@ -597,17 +604,17 @@ InspectorPanel.prototype = {
 
     // Setup the add-node button.
     this.addNode = this.addNode.bind(this);
     this.addNodeButton = this.panelDoc.getElementById("inspector-element-add-button");
     this.addNodeButton.addEventListener("click", this.addNode);
 
     // Setup the eye-dropper icon if we're in an HTML document and we have actor support.
     if (this.selection.nodeFront && this.selection.nodeFront.isInHTMLDocument) {
-      this.toolbox.target.actorHasMethod("inspector", "pickColorFromPage").then(value => {
+      this.target.actorHasMethod("inspector", "pickColorFromPage").then(value => {
         if (!value) {
           return;
         }
 
         this.onEyeDropperDone = this.onEyeDropperDone.bind(this);
         this.onEyeDropperButtonClicked = this.onEyeDropperButtonClicked.bind(this);
         this.eyeDropperButton = this.panelDoc
                                     .getElementById("inspector-eyedropper-toggle");
@@ -921,16 +928,27 @@ InspectorPanel.prototype = {
     e.preventDefault();
     this._openMenu({
       screenX: e.screenX,
       screenY: e.screenY,
       target: e.target,
     });
   },
 
+  /**
+   * This is meant to be called by all the search, filter, inplace text boxes in the
+   * inspector, and just calls through to the toolbox openTextBoxContextMenu helper.
+   * @param {DOMEvent} e
+   */
+  onTextBoxContextMenu: function (e) {
+    e.stopPropagation();
+    e.preventDefault();
+    this.toolbox.openTextBoxContextMenu(e.screenX, e.screenY);
+  },
+
   _openMenu: function ({ target, screenX = 0, screenY = 0 } = { }) {
     let markupContainer = this.markup.getContainer(this.selection.nodeFront);
 
     this.contextMenuTarget = target;
     this.nodeMenuTriggerInfo = markupContainer &&
       markupContainer.editor.getInfoAtNode(target);
 
     let isSelectionElement = this.selection.isElementNode() &&
@@ -1268,17 +1286,17 @@ InspectorPanel.prototype = {
     let doc = this.panelDoc;
 
     this._markupBox = doc.getElementById("markup-box");
 
     // create tool iframe
     this._markupFrame = doc.createElement("iframe");
     this._markupFrame.setAttribute("flex", "1");
     this._markupFrame.setAttribute("tooltip", "aHTMLTooltip");
-    this._markupFrame.addEventListener("contextmenu", this._onContextMenu, true);
+    this._markupFrame.addEventListener("contextmenu", this._onContextMenu);
 
     // This is needed to enable tooltips inside the iframe document.
     this._markupFrame.addEventListener("load", this._onMarkupFrameLoad, true);
 
     this._markupBox.setAttribute("collapsed", true);
     this._markupBox.appendChild(this._markupFrame);
     this._markupFrame.setAttribute("src", "chrome://devtools/content/inspector/markup/markup.xhtml");
     this._markupFrame.setAttribute("aria-label",
@@ -1297,17 +1315,17 @@ InspectorPanel.prototype = {
     this.emit("markuploaded");
   },
 
   _destroyMarkup: function () {
     let destroyPromise;
 
     if (this._markupFrame) {
       this._markupFrame.removeEventListener("load", this._onMarkupFrameLoad, true);
-      this._markupFrame.removeEventListener("contextmenu", this._onContextMenu, true);
+      this._markupFrame.removeEventListener("contextmenu", this._onContextMenu);
     }
 
     if (this.markup) {
       destroyPromise = this.markup.destroy();
       this.markup = null;
     } else {
       destroyPromise = promise.resolve();
     }
@@ -1811,8 +1829,95 @@ InspectorPanel.prototype = {
   copyAttributeLink: function (link) {
     // When the inspector menu was setup on click (see _getNodeLinkMenuItems), we
     // already checked that resolveRelativeURL existed.
     this.inspector.resolveRelativeURL(link, this.selection.nodeFront).then(url => {
       clipboardHelper.copyString(url);
     }, console.error);
   }
 };
+
+// URL constructor doesn't support chrome: scheme
+let href = window.location.href.replace(/chrome:/, "http://");
+let url = new window.URL(href);
+
+// Only use this method to attach the toolbox if some query parameters are given
+if (url.search.length > 1) {
+  const { targetFromURL } = require("devtools/client/framework/target-from-url");
+  const { attachThread } = require("devtools/client/framework/attach-thread");
+  const { BrowserLoader } =
+    Cu.import("resource://devtools/client/shared/browser-loader.js", {});
+
+  const { Selection } = require("devtools/client/framework/selection");
+  const { InspectorFront } = require("devtools/shared/fronts/inspector");
+  const { getHighlighterUtils } = require("devtools/client/framework/toolbox-highlighter-utils");
+
+  Task.spawn(function* () {
+    let target = yield targetFromURL(url);
+
+    let notImplemented = function () {
+      throw new Error("Not implemented in a tab");
+    };
+    let fakeToolbox = {
+      target,
+      hostType: "bottom",
+      doc: window.document,
+      win: window,
+      on() {}, emit() {}, off() {},
+      initInspector() {},
+      browserRequire: BrowserLoader({
+        window: window,
+        useOnlyShared: true
+      }).require,
+      get React() {
+        return this.browserRequire("devtools/client/shared/vendor/react");
+      },
+      get ReactDOM() {
+        return this.browserRequire("devtools/client/shared/vendor/react-dom");
+      },
+      isToolRegistered() {
+        return false;
+      },
+      currentToolId: "inspector",
+      getCurrentPanel() {
+        return "inspector";
+      },
+      get textboxContextMenuPopup() {
+        notImplemented();
+      },
+      getPanel: notImplemented,
+      openSplitConsole: notImplemented,
+      viewCssSourceInStyleEditor: notImplemented,
+      viewJsSourceInDebugger: notImplemented,
+      viewSource: notImplemented,
+      viewSourceInDebugger: notImplemented,
+      viewSourceInStyleEditor: notImplemented,
+
+      // For attachThread:
+      highlightTool() {},
+      unhighlightTool() {},
+      selectTool() {},
+      raise() {},
+      getNotificationBox() {}
+    };
+
+    // attachThread also expect a toolbox as argument
+    fakeToolbox.threadClient = yield attachThread(fakeToolbox);
+
+    let inspector = InspectorFront(target.client, target.form);
+    let showAllAnonymousContent =
+      Services.prefs.getBoolPref("devtools.inspector.showAllAnonymousContent");
+    let walker = yield inspector.getWalker({ showAllAnonymousContent });
+    let selection = new Selection(walker);
+    let highlighter = yield inspector.getHighlighter(false);
+
+    fakeToolbox.inspector = inspector;
+    fakeToolbox.walker = walker;
+    fakeToolbox.selection = selection;
+    fakeToolbox.highlighter = highlighter;
+    fakeToolbox.highlighterUtils = getHighlighterUtils(fakeToolbox);
+
+    let inspectorUI = new Inspector(fakeToolbox);
+    inspectorUI.init();
+  }).then(null, e => {
+    window.alert("Unable to start the inspector:" + e.message + "\n" + e.stack);
+  });
+}
--- a/devtools/client/inspector/inspector.xhtml
+++ b/devtools/client/inspector/inspector.xhtml
@@ -20,16 +20,17 @@
 
 <!DOCTYPE html>
 
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
   <script type="application/javascript;version=1.8"
           src="chrome://devtools/content/shared/theme-switching.js"></script>
+  <script type="application/javascript;version=1.8" src="inspector.js" defer="true"></script>
 </head>
 <body class="theme-body" role="application">
   <div class="inspector-responsive-container theme-body inspector">
 
     <!-- Main Panel Content -->
     <div id="inspector-main-content" class="devtools-main-content">
       <div id="inspector-toolbar" class="devtools-toolbar" nowindowdrag="true"
                 data-localization-bundle="devtools/locale/inspector.properties">
--- a/devtools/client/inspector/markup/markup.js
+++ b/devtools/client/inspector/markup/markup.js
@@ -79,18 +79,18 @@ const INSPECTOR_L10N = new LocalizationH
  * updating based on mutations, and the undo/redo bindings.
  *
  * @param  {Inspector} inspector
  *         The inspector we're watching.
  * @param  {iframe} frame
  *         An iframe in which the caller has kindly loaded markup.xhtml.
  */
 function MarkupView(inspector, frame, controllerWindow) {
-  this._inspector = inspector;
-  this.walker = this._inspector.walker;
+  this.inspector = inspector;
+  this.walker = this.inspector.walker;
   this._frame = frame;
   this.win = this._frame.contentWindow;
   this.doc = this._frame.contentDocument;
   this._elt = this.doc.querySelector("#root");
   this.htmlEditor = new HTMLEditor(this.doc);
 
   try {
     this.maxChildren = Services.prefs.getIntPref("devtools.markup.pagesize");
@@ -104,17 +104,17 @@ function MarkupView(inspector, frame, co
     Services.prefs.getIntPref(ATTR_COLLAPSE_LENGTH_PREF);
 
   // Creating the popup to be used to show CSS suggestions.
   let options = {
     autoSelect: true,
     theme: "auto",
   };
 
-  this.popup = new AutocompletePopup(inspector._toolbox, options);
+  this.popup = new AutocompletePopup(inspector.toolbox, options);
 
   this.undo = new UndoStack();
   this.undo.installController(controllerWindow);
 
   this._containers = new Map();
 
   // Binding functions that need to be called in scope.
   this._handleRejectionIfNotDestroyed = this._handleRejectionIfNotDestroyed.bind(this);
@@ -140,18 +140,18 @@ function MarkupView(inspector, frame, co
   this._elt.addEventListener("mousemove", this._onMouseMove, false);
   this._elt.addEventListener("mouseout", this._onMouseOut, false);
   this._elt.addEventListener("blur", this._onBlur, true);
   this.win.addEventListener("mouseup", this._onMouseUp);
   this.win.addEventListener("copy", this._onCopy);
   this._frame.addEventListener("focus", this._onFocus, false);
   this.walker.on("mutations", this._mutationObserver);
   this.walker.on("display-change", this._onDisplayChange);
-  this._inspector.selection.on("new-node-front", this._onNewSelection);
-  this._inspector.toolbox.on("picker-node-hovered", this._onToolboxPickerHover);
+  this.inspector.selection.on("new-node-front", this._onNewSelection);
+  this.toolbox.on("picker-node-hovered", this._onToolboxPickerHover);
 
   this._onNewSelection();
   this._initTooltips();
 
   this._prefObserver = new PrefObserver("devtools.markup");
   this._prefObserver.on(ATTR_COLLAPSE_ENABLED_PREF,
                         this._onCollapseAttributesPrefChange);
   this._prefObserver.on(ATTR_COLLAPSE_LENGTH_PREF,
@@ -163,32 +163,36 @@ function MarkupView(inspector, frame, co
 MarkupView.prototype = {
   /**
    * How long does a node flash when it mutates (in ms).
    */
   CONTAINER_FLASHING_DURATION: 500,
 
   _selectedContainer: null,
 
+  get toolbox() {
+    return this.inspector.toolbox;
+  },
+
   /**
    * Handle promise rejections for various asynchronous actions, and only log errors if
    * the markup view still exists.
    * This is useful to silence useless errors that happen when the markup view is
    * destroyed while still initializing (and making protocol requests).
    */
   _handleRejectionIfNotDestroyed: function (e) {
     if (!this._destroyer) {
       console.error(e);
     }
   },
 
   _initTooltips: function () {
-    this.eventDetailsTooltip = new HTMLTooltip(this._inspector.toolbox,
+    this.eventDetailsTooltip = new HTMLTooltip(this.toolbox,
       {type: "arrow"});
-    this.imagePreviewTooltip = new HTMLTooltip(this._inspector.toolbox,
+    this.imagePreviewTooltip = new HTMLTooltip(this.toolbox,
       {type: "arrow", useXulWrapper: "true"});
     this._enableImagePreviewTooltip();
   },
 
   _enableImagePreviewTooltip: function () {
     this.imagePreviewTooltip.startTogglingOnHover(this._elt,
       this._isImagePreviewTarget);
   },
@@ -418,31 +422,30 @@ MarkupView.prototype = {
    *
    * @param  {NodeFront} nodeFront
    *         The node to show the highlighter for
    * @return {Promise} Resolves when the highlighter for this nodeFront is
    *         shown, taking into account that there could already be highlighter
    *         requests queued up
    */
   _showBoxModel: function (nodeFront) {
-    return this._inspector.toolbox.highlighterUtils
-      .highlightNodeFront(nodeFront);
+    return this.toolbox.highlighterUtils.highlightNodeFront(nodeFront);
   },
 
   /**
    * Hide the box model highlighter on a given node front
    *
    * @param  {Boolean} forceHide
    *         See toolbox-highlighter-utils/unhighlight
    * @return {Promise} Resolves when the highlighter for this nodeFront is
    *         hidden, taking into account that there could already be highlighter
    *         requests queued up
    */
   _hideBoxModel: function (forceHide) {
-    return this._inspector.toolbox.highlighterUtils.unhighlight(forceHide);
+    return this.toolbox.highlighterUtils.unhighlight(forceHide);
   },
 
   _briefBoxModelTimer: null,
 
   _clearBriefBoxModelTimer: function () {
     if (this._briefBoxModelTimer) {
       clearTimeout(this._briefBoxModelTimer);
       this._briefBoxModelPromise.resolve();
@@ -546,47 +549,47 @@ MarkupView.prototype = {
    * - if it's "test" (this is a special case for mochitest. In tests, we often
    * need to select elements but don't necessarily want the highlighter to come
    * and go after a delay as this might break test scenarios)
    * We also do not want to start a brief highlight timeout if the node is
    * already being hovered over, since in that case it will already be
    * highlighted.
    */
   _shouldNewSelectionBeHighlighted: function () {
-    let reason = this._inspector.selection.reason;
+    let reason = this.inspector.selection.reason;
     let unwantedReasons = [
       "inspector-open",
       "navigateaway",
       "nodeselected",
       "test"
     ];
-    let isHighlight = this._hoveredNode === this._inspector.selection.nodeFront;
+    let isHighlight = this._hoveredNode === this.inspector.selection.nodeFront;
     return !isHighlight && reason && unwantedReasons.indexOf(reason) === -1;
   },
 
   /**
    * React to new-node-front selection events.
    * Highlights the node if needed, and make sure it is shown and selected in
    * the view.
    */
   _onNewSelection: function () {
-    let selection = this._inspector.selection;
+    let selection = this.inspector.selection;
 
     this.htmlEditor.hide();
     if (this._hoveredNode && this._hoveredNode !== selection.nodeFront) {
       this.getContainer(this._hoveredNode).hovered = false;
       this._hoveredNode = null;
     }
 
     if (!selection.isNode()) {
       this.unmarkSelectedNode();
       return;
     }
 
-    let done = this._inspector.updating("markup-view");
+    let done = this.inspector.updating("markup-view");
     let onShowBoxModel, onShow;
 
     // Highlight the element briefly if needed.
     if (this._shouldNewSelectionBeHighlighted()) {
       onShowBoxModel = this._brieflyShowBoxModel(selection.nodeFront);
     }
 
     onShow = this.showNode(selection.nodeFront).then(() => {
@@ -606,17 +609,17 @@ MarkupView.prototype = {
     promise.all([onShowBoxModel, onShow]).then(done);
   },
 
   /**
    * Maybe make selected the current node selection's MarkupContainer depending
    * on why the current node got selected.
    */
   maybeNavigateToNewSelection: function () {
-    let {reason, nodeFront} = this._inspector.selection;
+    let {reason, nodeFront} = this.inspector.selection;
 
     // The list of reasons that should lead to navigating to the node.
     let reasonsToNavigate = [
       // If the user picked an element with the element picker.
       "picker-node-picked",
       // If the user selected an element with the browser context menu.
       "browser-context-menu",
       // If the user added a new node by clicking in the inspector toolbar.
@@ -651,19 +654,19 @@ MarkupView.prototype = {
   },
 
   _onCopy: function (evt) {
     // Ignore copy events from editors
     if (this._isInputOrTextarea(evt.target)) {
       return;
     }
 
-    let selection = this._inspector.selection;
+    let selection = this.inspector.selection;
     if (selection.isNode()) {
-      this._inspector.copyOuterHTML();
+      this.inspector.copyOuterHTML();
     }
     evt.stopPropagation();
     evt.preventDefault();
   },
 
   /**
    * Register all key shortcuts.
    */
@@ -708,17 +711,17 @@ MarkupView.prototype = {
         break;
       }
       case "markupView.edit.key": {
         this.beginEditingOuterHTML(this._selectedContainer.node);
         break;
       }
       case "markupView.scrollInto.key": {
         let selection = this._selectedContainer.node;
-        this._inspector.scrollNodeIntoView(selection);
+        this.inspector.scrollNodeIntoView(selection);
         break;
       }
       // Generic keys
       case "Delete": {
         this.deleteNodeOrAttribute();
         break;
       }
       case "Backspace": {
@@ -960,34 +963,34 @@ MarkupView.prototype = {
 
     let container;
     let {nodeType, isPseudoElement} = node;
     if (node === this.walker.rootNode) {
       container = new RootContainer(this, node);
       this._elt.appendChild(container.elt);
       this._rootNode = node;
     } else if (nodeType == nodeConstants.ELEMENT_NODE && !isPseudoElement) {
-      container = new MarkupElementContainer(this, node, this._inspector);
+      container = new MarkupElementContainer(this, node, this.inspector);
     } else if (nodeType == nodeConstants.COMMENT_NODE ||
                nodeType == nodeConstants.TEXT_NODE) {
-      container = new MarkupTextContainer(this, node, this._inspector);
+      container = new MarkupTextContainer(this, node, this.inspector);
     } else {
-      container = new MarkupReadOnlyContainer(this, node, this._inspector);
+      container = new MarkupReadOnlyContainer(this, node, this.inspector);
     }
 
     if (flashNode) {
       container.flashMutation();
     }
 
     this._containers.set(node, container);
     container.childrenDirty = true;
 
     this._updateChildren(container);
 
-    this._inspector.emit("container-created", container);
+    this.inspector.emit("container-created", container);
 
     return container;
   },
 
   /**
    * Mutation observer used for included nodes.
    */
   _mutationObserver: function (mutations) {
@@ -1034,17 +1037,17 @@ MarkupView.prototype = {
 
     this._waitForChildren().then(() => {
       if (this._destroyer) {
         // Could not fully update after markup mutations, the markup-view was destroyed
         // while waiting for children. Bail out silently.
         return;
       }
       this._flashMutatedNodes(mutations);
-      this._inspector.emit("markupmutation", mutations);
+      this.inspector.emit("markupmutation", mutations);
 
       // Since the htmlEditor is absolutely positioned, a mutation may change
       // the location in which it should be shown.
       this.htmlEditor.refresh();
     });
   },
 
   /**
@@ -1272,47 +1275,47 @@ MarkupView.prototype = {
           isNodeRemovalMutation = true;
           break;
         }
       }
       if (!isNodeRemovalMutation) {
         return;
       }
 
-      this._inspector.off("markupmutation", onMutations);
+      this.inspector.off("markupmutation", onMutations);
       this._removedNodeObserver = null;
 
       // Don't select the new node if the user has already changed the current
       // selection.
-      if (this._inspector.selection.nodeFront === parentContainer.node ||
-          (this._inspector.selection.nodeFront === removedNode && isHTMLTag)) {
+      if (this.inspector.selection.nodeFront === parentContainer.node ||
+          (this.inspector.selection.nodeFront === removedNode && isHTMLTag)) {
         let childContainers = parentContainer.getChildContainers();
         if (childContainers && childContainers[childIndex]) {
           this.markNodeAsSelected(childContainers[childIndex].node, reason);
           if (childContainers[childIndex].hasChildren) {
             this.expandNode(childContainers[childIndex].node);
           }
           this.emit("reselectedonremoved");
         }
       }
     };
 
     // Start listening for mutations until we find a childList change that has
     // removedNode removed.
-    this._inspector.on("markupmutation", onMutations);
+    this.inspector.on("markupmutation", onMutations);
   },
 
   /**
    * Make sure to stop listening for node removal markupmutations and not
    * reselect the corresponding node when that happens.
    * Useful when the outerHTML/tagname edition failed.
    */
   cancelReselectOnRemoved: function () {
     if (this._removedNodeObserver) {
-      this._inspector.off("markupmutation", this._removedNodeObserver);
+      this.inspector.off("markupmutation", this._removedNodeObserver);
       this._removedNodeObserver = null;
       this.emit("canceledreselectonremoved");
     }
   },
 
   /**
    * Replace the outerHTML of any node displayed in the inspector with
    * some other HTML code
@@ -1474,18 +1477,18 @@ MarkupView.prototype = {
 
     // Select the new container.
     this._selectedContainer = container;
     if (node) {
       this._selectedContainer.selected = true;
     }
 
     // Change the current selection if needed.
-    if (this._inspector.selection.nodeFront !== node) {
-      this._inspector.selection.setNodeFront(node, reason || "nodeselected");
+    if (this.inspector.selection.nodeFront !== node) {
+      this.inspector.selection.setNodeFront(node, reason || "nodeselected");
     }
 
     return true;
   },
 
   /**
    * Make sure that every ancestor of the selection are updated
    * and included in the list of visible children.
@@ -1521,17 +1524,17 @@ MarkupView.prototype = {
    * Check if the current selection is a descendent of the container.
    * if so, make sure it's among the visible set for the container,
    * and set the dirty flag if needed.
    *
    * @return The node that should be made visible, if any.
    */
   _checkSelectionVisible: function (container) {
     let centered = null;
-    let node = this._inspector.selection.nodeFront;
+    let node = this.inspector.selection.nodeFront;
     while (node) {
       if (node.parentNode() === container.node) {
         centered = node;
         break;
       }
       node = node.parentNode();
     }
 
@@ -1736,18 +1739,18 @@ MarkupView.prototype = {
     this._elt.removeEventListener("mousemove", this._onMouseMove, false);
     this._elt.removeEventListener("mouseout", this._onMouseOut, false);
     this._elt.removeEventListener("blur", this._onBlur, true);
     this.win.removeEventListener("mouseup", this._onMouseUp);
     this.win.removeEventListener("copy", this._onCopy);
     this._frame.removeEventListener("focus", this._onFocus, false);
     this.walker.off("mutations", this._mutationObserver);
     this.walker.off("display-change", this._onDisplayChange);
-    this._inspector.selection.off("new-node-front", this._onNewSelection);
-    this._inspector.toolbox.off("picker-node-hovered",
+    this.inspector.selection.off("new-node-front", this._onNewSelection);
+    this.toolbox.off("picker-node-hovered",
                                 this._onToolboxPickerHover);
 
     this._prefObserver.off(ATTR_COLLAPSE_ENABLED_PREF,
                            this._onCollapseAttributesPrefChange);
     this._prefObserver.off(ATTR_COLLAPSE_LENGTH_PREF,
                            this._onCollapseAttributesPrefChange);
     this._prefObserver.destroy();
 
@@ -2333,17 +2336,17 @@ MarkupContainer.prototype = {
     }
 
     // Follow attribute links if middle or meta click.
     if (isMiddleClick || isMetaClick) {
       let link = target.dataset.link;
       let type = target.dataset.type;
       // Make container tabbable descendants not tabbable (by default).
       this.canFocus = false;
-      this.markup._inspector.followAttributeLink(type, link);
+      this.markup.inspector.followAttributeLink(type, link);
       return;
     }
 
     // Start node drag & drop (if the mouse moved, see _onMouseMove).
     if (isLeftClick && this.isDraggable()) {
       this._isPreDragging = true;
       this._dragStartY = event.pageY;
     }
@@ -2641,17 +2644,17 @@ function MarkupElementContainer(markupVi
 
 MarkupElementContainer.prototype = Heritage.extend(MarkupContainer.prototype, {
   _buildEventTooltipContent: Task.async(function* (target, tooltip) {
     if (target.hasAttribute("data-event")) {
       yield tooltip.hide();
 
       let listenerInfo = yield this.node.getEventListenerInfo();
 
-      let toolbox = this.markup._inspector.toolbox;
+      let toolbox = this.markup.toolbox;
       setEventTooltip(tooltip, listenerInfo, toolbox);
       // Disable the image preview tooltip while we display the event details
       this.markup._disableImagePreviewTooltip();
       tooltip.once("hidden", () => {
         // Enable the image preview tooltip after closing the event details
         this.markup._enableImagePreviewTooltip();
       });
       tooltip.show(target);
@@ -2907,17 +2910,18 @@ function TextEditor(container, node, tem
           this.container.undo.do(() => {
             this.node.setNodeValue(val);
           }, () => {
             this.node.setNodeValue(oldValue);
           });
         });
       });
     },
-    cssProperties: getCssProperties(this.markup._inspector.toolbox)
+    cssProperties: getCssProperties(this.markup.toolbox),
+    contextMenu: this.markup.inspector.onTextBoxContextMenu
   });
 
   this.update();
 }
 
 TextEditor.prototype = {
   get selected() {
     return this._selected;
@@ -2961,17 +2965,17 @@ TextEditor.prototype = {
  *         The node being edited.
  */
 function ElementEditor(container, node) {
   this.container = container;
   this.node = node;
   this.markup = this.container.markup;
   this.template = this.markup.template.bind(this.markup);
   this.doc = this.markup.doc;
-  this._cssProperties = getCssProperties(this.markup._inspector.toolbox);
+  this._cssProperties = getCssProperties(this.markup.toolbox);
 
   this.attrElements = new Map();
   this.animationTimers = {};
 
   // The templates will fill the following properties
   this.elt = null;
   this.tag = null;
   this.closeTag = null;
@@ -2989,16 +2993,17 @@ function ElementEditor(container, node) 
     this.tag.setAttribute("tabindex", "-1");
     editableField({
       element: this.tag,
       multiline: true,
       maxWidth: () => getAutocompleteMaxWidth(this.tag, this.container.elt),
       trigger: "dblclick",
       stopOnReturn: true,
       done: this.onTagEdit.bind(this),
+      contextMenu: this.markup.inspector.onTextBoxContextMenu,
       cssProperties: this._cssProperties
     });
   }
 
   // Make the new attribute space editable.
   this.newAttr.editMode = editableField({
     element: this.newAttr,
     multiline: true,
@@ -3016,16 +3021,17 @@ function ElementEditor(container, node) 
       let undoMods = this._startModifyingAttributes();
       this._applyAttributes(val, null, doMods, undoMods);
       this.container.undo.do(() => {
         doMods.apply();
       }, function () {
         undoMods.apply();
       });
     },
+    contextMenu: this.markup.inspector.onTextBoxContextMenu,
     cssProperties: this._cssProperties
   });
 
   let displayName = this.node.displayName;
   this.tag.textContent = displayName;
   this.closeTag.textContent = displayName;
 
   let isVoidElement = HTML_VOID_ELEMENTS.includes(displayName);
@@ -3257,16 +3263,17 @@ ElementEditor.prototype = {
         doMods.removeAttribute(attribute.name);
         this._applyAttributes(newValue, attr, doMods, undoMods);
         this.container.undo.do(() => {
           doMods.apply();
         }, () => {
           undoMods.apply();
         });
       },
+      contextMenu: this.markup.inspector.onTextBoxContextMenu,
       cssProperties: this._cssProperties
     });
 
     // Figure out where we should place the attribute.
     if (attribute.name == "id") {
       before = this.attrList.firstChild;
     } else if (attribute.name == "class") {
       let idNode = this.attrElements.get("id");
@@ -3357,18 +3364,17 @@ ElementEditor.prototype = {
    * Listen to mutations, and when the attribute list is regenerated
    * try to focus on the attribute after the one that's being edited now.
    * If the attribute order changes, go to the beginning of the attribute list.
    */
   refocusOnEdit: function (attrName, attrNode, direction) {
     // Only allow one refocus on attribute change at a time, so when there's
     // more than 1 request in parallel, the last one wins.
     if (this._editedAttributeObserver) {
-      this.markup._inspector.off("markupmutation",
-        this._editedAttributeObserver);
+      this.markup.inspector.off("markupmutation", this._editedAttributeObserver);
       this._editedAttributeObserver = null;
     }
 
     let container = this.markup.getContainer(this.node);
 
     let activeAttrs = [...this.attrList.childNodes]
       .filter(el => el.style.display != "none");
     let attributeIndex = activeAttrs.indexOf(attrNode);
@@ -3443,17 +3449,17 @@ ElementEditor.prototype = {
         editable.focus();
       }
 
       this.markup.emit("refocusedonedit");
     };
 
     // Start listening for mutations until we find an attributes change
     // that modifies this attribute.
-    this.markup._inspector.once("markupmutation", onMutations);
+    this.markup.inspector.once("markupmutation", onMutations);
   },
 
   /**
    * Called when the tag name editor has is done editing.
    */
   onTagEdit: function (newTagName, isCommit) {
     if (!isCommit ||
         newTagName.toLowerCase() === this.node.tagName.toLowerCase() ||
--- a/devtools/client/inspector/markup/test/browser_markup_update-on-navigtion.js
+++ b/devtools/client/inspector/markup/test/browser_markup_update-on-navigtion.js
@@ -10,17 +10,17 @@ const URL_1 = SCHEMA + "<div id='one' st
 const URL_2 = SCHEMA + "<div id='two' style='color:green;'>TWO</div>";
 
 add_task(function* () {
   let {inspector, testActor} = yield openInspectorForURL(URL_1);
 
   assertMarkupViewIsLoaded();
   yield selectNode("#one", inspector);
 
-  let willNavigate = inspector.toolbox.target.once("will-navigate");
+  let willNavigate = inspector.target.once("will-navigate");
   yield testActor.eval(`content.location = "${URL_2}"`);
 
   info("Waiting for will-navigate");
   yield willNavigate;
 
   info("Navigation to page 2 has started, the inspector should be empty");
   assertMarkupViewIsEmpty();
 
--- a/devtools/client/inspector/moz.build
+++ b/devtools/client/inspector/moz.build
@@ -9,15 +9,15 @@ DIRS += [
     'markup',
     'rules',
     'shared'
 ]
 
 DevToolsModules(
     'breadcrumbs.js',
     'inspector-commands.js',
-    'inspector-panel.js',
     'inspector-search.js',
     'inspector.xhtml',
+    'panel.js',
     'toolsidebar.js',
 )
 
 BROWSER_CHROME_MANIFESTS += ['test/browser.ini']
new file mode 100644
--- /dev/null
+++ b/devtools/client/inspector/panel.js
@@ -0,0 +1,19 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+function InspectorPanel(iframeWindow, toolbox) {
+  this._inspector = new iframeWindow.Inspector(toolbox);
+}
+InspectorPanel.prototype = {
+  open() {
+    return this._inspector.init();
+  },
+
+  destroy() {
+    return this._inspector.destroy();
+  }
+};
+exports.InspectorPanel = InspectorPanel;
--- a/devtools/client/inspector/rules/rules.js
+++ b/devtools/client/inspector/rules/rules.js
@@ -107,18 +107,16 @@ function CssRuleView(inspector, document
 
   this._outputParser = new OutputParser(document, this.cssProperties);
 
   this._onAddRule = this._onAddRule.bind(this);
   this._onContextMenu = this._onContextMenu.bind(this);
   this._onCopy = this._onCopy.bind(this);
   this._onFilterStyles = this._onFilterStyles.bind(this);
   this._onClearSearch = this._onClearSearch.bind(this);
-  this._onFilterTextboxContextMenu =
-    this._onFilterTextboxContextMenu.bind(this);
   this._onTogglePseudoClassPanel = this._onTogglePseudoClassPanel.bind(this);
   this._onTogglePseudoClass = this._onTogglePseudoClass.bind(this);
 
   let doc = this.styleDocument;
   this.element = doc.getElementById("ruleview-container-focusable");
   this.addRuleButton = doc.getElementById("ruleview-add-rule-button");
   this.searchField = doc.getElementById("ruleview-searchbox");
   this.searchClearButton = doc.getElementById("ruleview-searchinput-clear");
@@ -135,18 +133,17 @@ function CssRuleView(inspector, document
   this.shortcuts.on("Escape", this._onShortcut);
   this.shortcuts.on("Return", this._onShortcut);
   this.shortcuts.on("Space", this._onShortcut);
   this.shortcuts.on("CmdOrCtrl+F", this._onShortcut);
   this.element.addEventListener("copy", this._onCopy);
   this.element.addEventListener("contextmenu", this._onContextMenu);
   this.addRuleButton.addEventListener("click", this._onAddRule);
   this.searchField.addEventListener("input", this._onFilterStyles);
-  this.searchField.addEventListener("contextmenu",
-                                    this._onFilterTextboxContextMenu);
+  this.searchField.addEventListener("contextmenu", this.inspector.onTextBoxContextMenu);
   this.searchClearButton.addEventListener("click", this._onClearSearch);
   this.pseudoClassToggle.addEventListener("click",
                                           this._onTogglePseudoClassPanel);
   this.hoverCheckbox.addEventListener("click", this._onTogglePseudoClass);
   this.activeCheckbox.addEventListener("click", this._onTogglePseudoClass);
   this.focusCheckbox.addEventListener("click", this._onTogglePseudoClass);
 
   this._handlePrefChange = this._handlePrefChange.bind(this);
@@ -465,17 +462,17 @@ CssRuleView.prototype = {
   },
 
   /**
    * Add a new rule to the current element.
    */
   _onAddRule: function () {
     let elementStyle = this._elementStyle;
     let element = elementStyle.element;
-    let client = this.inspector.toolbox.target.client;
+    let client = this.inspector.target.client;
     let pseudoClasses = element.pseudoClassLocks;
 
     if (!client.traits.addNewRule) {
       return;
     }
 
     if (!this.pageStyle.supportsAuthoredStyles) {
       // We're talking to an old server.
@@ -640,29 +637,16 @@ CssRuleView.prototype = {
 
       this.inspector.emit("ruleview-filtered");
 
       this._filterChangeTimeout = null;
     }, filterTimeout);
   },
 
   /**
-   * Context menu handler for filter style search box.
-   */
-  _onFilterTextboxContextMenu: function (event) {
-    try {
-      this.styleWindow.focus();
-      let contextmenu = this.inspector.toolbox.textboxContextMenuPopup;
-      contextmenu.openPopupAtScreen(event.screenX, event.screenY, true);
-    } catch (e) {
-      console.error(e);
-    }
-  },
-
-  /**
    * Called when the user clicks on the clear button in the filter style search
    * box. Returns true if the search box is cleared and false otherwise.
    */
   _onClearSearch: function () {
     if (this.searchField.value) {
       this.setFilterStyles("");
       return true;
     }
@@ -694,17 +678,17 @@ CssRuleView.prototype = {
 
     // Remove bound listeners
     this.shortcuts.destroy();
     this.element.removeEventListener("copy", this._onCopy);
     this.element.removeEventListener("contextmenu", this._onContextMenu);
     this.addRuleButton.removeEventListener("click", this._onAddRule);
     this.searchField.removeEventListener("input", this._onFilterStyles);
     this.searchField.removeEventListener("contextmenu",
-      this._onFilterTextboxContextMenu);
+      this.inspector.onTextBoxContextMenu);
     this.searchClearButton.removeEventListener("click", this._onClearSearch);
     this.pseudoClassToggle.removeEventListener("click",
       this._onTogglePseudoClassPanel);
     this.hoverCheckbox.removeEventListener("click", this._onTogglePseudoClass);
     this.activeCheckbox.removeEventListener("click", this._onTogglePseudoClass);
     this.focusCheckbox.removeEventListener("click", this._onTogglePseudoClass);
 
     this.searchField = null;
--- a/devtools/client/inspector/rules/test/browser_rules_search-filter_context-menu.js
+++ b/devtools/client/inspector/rules/test/browser_rules_search-filter_context-menu.js
@@ -11,17 +11,17 @@ const TEST_URI = "<h1>test filter contex
 
 add_task(function* () {
   yield addTab("data:text/html;charset=utf-8," + encodeURIComponent(TEST_URI));
   let {toolbox, inspector, view} = yield openRuleView();
   yield selectNode("h1", inspector);
 
   let win = view.styleWindow;
   let searchField = view.searchField;
-  let searchContextMenu = toolbox.textboxContextMenuPopup;
+  let searchContextMenu = toolbox.textBoxContextMenuPopup;
   ok(searchContextMenu,
     "The search filter context menu is loaded in the rule view");
 
   let cmdUndo = searchContextMenu.querySelector("[command=cmd_undo]");
   let cmdDelete = searchContextMenu.querySelector("[command=cmd_delete]");
   let cmdSelectAll = searchContextMenu.querySelector("[command=cmd_selectAll]");
   let cmdCut = searchContextMenu.querySelector("[command=cmd_cut]");
   let cmdCopy = searchContextMenu.querySelector("[command=cmd_copy]");
--- a/devtools/client/inspector/rules/views/rule-editor.js
+++ b/devtools/client/inspector/rules/views/rule-editor.js
@@ -82,17 +82,17 @@ RuleEditor.prototype = {
   destroy: function () {
     this.rule.domRule.off("location-changed");
     this.toolbox.off("tool-registered", this.updateSourceLink);
     this.toolbox.off("tool-unregistered", this.updateSourceLink);
   },
 
   get isSelectorEditable() {
     let trait = this.isEditable &&
-      this.toolbox.target.client.traits.selectorEditable &&
+      this.ruleView.inspector.target.client.traits.selectorEditable &&
       this.rule.domRule.type !== ELEMENT_STYLE &&
       this.rule.domRule.type !== CSSRule.KEYFRAME_RULE;
 
     // Do not allow editing anonymousselectors until we can
     // detect mutations on  pseudo elements in Bug 1034110.
     return trait && !this.rule.elementStyle.element.isAnonymous;
   },
 
@@ -140,17 +140,18 @@ RuleEditor.prototype = {
       this.selectorText.addEventListener("click", event => {
         // Clicks within the selector shouldn't propagate any further.
         event.stopPropagation();
       }, false);
 
       editableField({
         element: this.selectorText,
         done: this._onSelectorDone,
-        cssProperties: this.rule.cssProperties
+        cssProperties: this.rule.cssProperties,
+        contextMenu: this.ruleView.inspector.onTextBoxContextMenu
       });
     }
 
     if (this.rule.domRule.type !== CSSRule.KEYFRAME_RULE) {
       let selector = this.rule.domRule.selectors
                ? this.rule.domRule.selectors.join(", ")
                : this.ruleView.inspector.selectionCssSelector;
 
@@ -443,17 +444,18 @@ RuleEditor.prototype = {
 
     this.editor = new InplaceEditor({
       element: this.newPropSpan,
       done: this._onNewProperty,
       destroy: this._newPropertyDestroy,
       advanceChars: ":",
       contentType: InplaceEditor.CONTENT_TYPES.CSS_PROPERTY,
       popup: this.ruleView.popup,
-      cssProperties: this.rule.cssProperties
+      cssProperties: this.rule.cssProperties,
+      contextMenu: this.ruleView.inspector.onTextBoxContextMenu
     });
 
     // Auto-close the input if multiple rules get pasted into new property.
     this.editor.input.addEventListener("paste",
       blurOnMultipleProperties(this.rule.cssProperties), false);
   },
 
   /**
--- a/devtools/client/inspector/rules/views/text-property-editor.js
+++ b/devtools/client/inspector/rules/views/text-property-editor.js
@@ -214,17 +214,18 @@ TextPropertyEditor.prototype = {
       editableField({
         start: this._onStartEditing,
         element: this.nameSpan,
         done: this._onNameDone,
         destroy: this.updatePropertyState,
         advanceChars: ":",
         contentType: InplaceEditor.CONTENT_TYPES.CSS_PROPERTY,
         popup: this.popup,
-        cssProperties: this.cssProperties
+        cssProperties: this.cssProperties,
+        contextMenu: this.ruleView.inspector.onTextBoxContextMenu
       });
 
       // Auto blur name field on multiple CSS rules get pasted in.
       this.nameContainer.addEventListener("paste",
         blurOnMultipleProperties(this.cssProperties), false);
 
       this.valueContainer.addEventListener("click", (event) => {
         // Clicks within the value shouldn't propagate any further.
@@ -284,17 +285,18 @@ TextPropertyEditor.prototype = {
         destroy: this.update,
         validate: this._onValidate,
         advanceChars: advanceValidate,
         contentType: InplaceEditor.CONTENT_TYPES.CSS_VALUE,
         property: this.prop,
         popup: this.popup,
         multiline: true,
         maxWidth: () => this.container.getBoundingClientRect().width,
-        cssProperties: this.cssProperties
+        cssProperties: this.cssProperties,
+        contextMenu: this.ruleView.inspector.onTextBoxContextMenu
       });
     }
   },
 
   /**
    * Get the path from which to resolve requests for this
    * rule's stylesheet.
    *
--- a/devtools/client/inspector/test/browser.ini
+++ b/devtools/client/inspector/test/browser.ini
@@ -156,8 +156,9 @@ subsuite = clipboard
 [browser_inspector_search-reserved.js]
 [browser_inspector_search-selection.js]
 [browser_inspector_search-sidebar.js]
 [browser_inspector_select-docshell.js]
 [browser_inspector_select-last-selected.js]
 [browser_inspector_search-navigation.js]
 [browser_inspector_sidebarstate.js]
 [browser_inspector_switch-to-inspector-on-pick.js]
+[browser_inspector_textbox-menu.js]
--- a/devtools/client/inspector/test/browser_inspector_highlighter-03.js
+++ b/devtools/client/inspector/test/browser_inspector_highlighter-03.js
@@ -29,17 +29,17 @@ const DOCUMENT_SRC = "<style>" +
 
 const TEST_URI = "data:text/html;charset=utf-8," + DOCUMENT_SRC;
 
 add_task(function* () {
   let { inspector, toolbox, testActor } = yield openInspectorForURL(TEST_URI);
 
   info("Waiting for box mode to show.");
   let body = yield getNodeFront("body", inspector);
-  yield toolbox.highlighter.showBoxModel(body);
+  yield inspector.highlighter.showBoxModel(body);
 
   info("Waiting for element picker to become active.");
   yield startPicker(toolbox);
 
   info("Moving mouse over iframe padding.");
   yield moveMouseOver("iframe", 1, 1);
 
   info("Performing checks");
--- a/devtools/client/inspector/test/browser_inspector_highlighter-04.js
+++ b/devtools/client/inspector/test/browser_inspector_highlighter-04.js
@@ -22,22 +22,22 @@ const ELEMENTS = ["box-model-root",
                   "box-model-infobar-container",
                   "box-model-infobar-tagname",
                   "box-model-infobar-id",
                   "box-model-infobar-classes",
                   "box-model-infobar-pseudo-classes",
                   "box-model-infobar-dimensions"];
 
 add_task(function* () {
-  let {inspector, toolbox, testActor} = yield openInspectorForURL(TEST_URL);
+  let {inspector, testActor} = yield openInspectorForURL(TEST_URL);
 
   info("Show the box-model highlighter");
   let divFront = yield getNodeFront("div", inspector);
-  yield toolbox.highlighter.showBoxModel(divFront);
+  yield inspector.highlighter.showBoxModel(divFront);
 
   for (let id of ELEMENTS) {
     let foundId = yield testActor.getHighlighterNodeAttribute(id, "id");
     is(foundId, id, "Element " + id + " found");
   }
 
   info("Hide the box-model highlighter");
-  yield toolbox.highlighter.hideBoxModel();
+  yield inspector.highlighter.hideBoxModel();
 });
--- a/devtools/client/inspector/test/browser_inspector_highlighter-hover_02.js
+++ b/devtools/client/inspector/test/browser_inspector_highlighter-hover_02.js
@@ -6,30 +6,30 @@
 
 // Test that when after an element is selected and highlighted on hover, if the
 // mouse leaves the markup-view and comes back again on the same element, that
 // the highlighter is shown again on the node
 
 const TEST_URL = "data:text/html;charset=utf-8,<p>Select me!</p>";
 
 add_task(function* () {
-  let {toolbox, inspector, testActor} = yield openInspectorForURL(TEST_URL);
+  let {inspector, testActor} = yield openInspectorForURL(TEST_URL);
 
   info("hover over the <p> line in the markup-view so that it's the " +
        "currently hovered node");
   yield hoverContainer("p", inspector);
 
   info("select the <p> markup-container line by clicking");
   yield clickContainer("p", inspector);
   let isVisible = yield testActor.isHighlighting();
   ok(isVisible, "the highlighter is shown");
 
   info("listen to the highlighter's hidden event");
   let onHidden = testActor.waitForHighlighterEvent("hidden",
-    toolbox.highlighter);
+    inspector.highlighter);
   info("mouse-leave the markup-view");
   yield mouseLeaveMarkupView(inspector);
   yield onHidden;
   isVisible = yield testActor.isHighlighting();
   ok(!isVisible, "the highlighter is hidden after mouseleave");
 
   info("hover over the <p> line again, which is still selected");
   yield hoverContainer("p", inspector);
--- a/devtools/client/inspector/test/browser_inspector_highlighter-keybinding_03.js
+++ b/devtools/client/inspector/test/browser_inspector_highlighter-keybinding_03.js
@@ -41,17 +41,17 @@ add_task(function* () {
   yield doKeyStop(shortcutOpts);
   is(inspector.selection.nodeFront.id, "another",
      "The #another DIV is still selected. Passed.");
 
   function doKeyPick(args) {
     info("Key pressed. Waiting for element to be picked");
     testActor.synthesizeKey(args);
     return promise.all([
-      toolbox.selection.once("new-node-front"),
+      inspector.selection.once("new-node-front"),
       inspector.once("inspector-updated")
     ]);
   }
 
   function doKeyStop(args) {
     info("Key pressed. Waiting for picker to be canceled");
     testActor.synthesizeKey(args);
     return inspector.toolbox.once("picker-stopped");
--- a/devtools/client/inspector/test/browser_inspector_highlighter-options.js
+++ b/devtools/client/inspector/test/browser_inspector_highlighter-options.js
@@ -180,25 +180,25 @@ const TEST_DATA = [
           is(faded, "true", "Region " + region + " is faded");
         }
       }
     }
   }
 ];
 
 add_task(function* () {
-  let {inspector, toolbox, testActor} = yield openInspectorForURL(
+  let {inspector, testActor} = yield openInspectorForURL(
     "data:text/html;charset=utf-8," + encodeURI(TEST_URL));
 
   let divFront = yield getNodeFront("div", inspector);
 
   for (let {desc, options, checkHighlighter} of TEST_DATA) {
     info("Running test: " + desc);
 
     info("Show the box-model highlighter with options " + options);
-    yield toolbox.highlighter.showBoxModel(divFront, options);
+    yield inspector.highlighter.showBoxModel(divFront, options);
 
     yield checkHighlighter(testActor);
 
     info("Hide the box-model highlighter");
-    yield toolbox.highlighter.hideBoxModel();
+    yield inspector.highlighter.hideBoxModel();
   }
 });
--- a/devtools/client/inspector/test/browser_inspector_highlighter-xbl.js
+++ b/devtools/client/inspector/test/browser_inspector_highlighter-xbl.js
@@ -17,17 +17,17 @@ add_task(function* () {
   yield doKeyPick({key: "VK_RETURN", options: {}});
   is(inspector.selection.nodeFront.className, "scale-slider",
      "The .scale-slider inside the scale was selected");
 
   function doKeyPick(msg) {
     info("Key pressed. Waiting for element to be picked");
     testActor.synthesizeKey(msg);
     return promise.all([
-      toolbox.selection.once("new-node-front"),
+      inspector.selection.once("new-node-front"),
       inspector.once("inspector-updated")
     ]);
   }
 
   function moveMouseOver(selector) {
     info("Waiting for element " + selector + " to be highlighted");
     testActor.synthesizeMouse({
       options: {type: "mousemove"},
--- a/devtools/client/inspector/test/browser_inspector_invalidate.js
+++ b/devtools/client/inspector/test/browser_inspector_invalidate.js
@@ -10,26 +10,26 @@ const TEST_URI = "data:text/html;charset
   "browser_inspector_invalidate.js\n" +
   "<div style=\"width: 100px; height: 100px; background:yellow;\"></div>";
 
 add_task(function* () {
   let {inspector, testActor} = yield openInspectorForURL(TEST_URI);
   let divFront = yield getNodeFront("div", inspector);
 
   info("Waiting for highlighter to activate");
-  yield inspector.toolbox.highlighter.showBoxModel(divFront);
+  yield inspector.highlighter.showBoxModel(divFront);
 
   let rect = yield testActor.getSimpleBorderRect();
   is(rect.width, 100, "The highlighter has the right width.");
 
   info("Changing the test element's size and waiting for the highlighter " +
        "to update");
   yield testActor.changeHighlightedNodeWaitForUpdate(
     "style",
     "width: 200px; height: 100px; background:yellow;"
   );
 
   rect = yield testActor.getSimpleBorderRect();
   is(rect.width, 200, "The highlighter has the right width after update");
 
   info("Waiting for highlighter to hide");
-  yield inspector.toolbox.highlighter.hideBoxModel();
+  yield inspector.highlighter.hideBoxModel();
 });
--- a/devtools/client/inspector/test/browser_inspector_pseudoclass-lock.js
+++ b/devtools/client/inspector/test/browser_inspector_pseudoclass-lock.js
@@ -84,19 +84,18 @@ function* testNavigate(inspector, testAc
   ok(!(yield testActor.hasPseudoClassLock("#div-1", PSEUDO)),
      "pseudo-class lock is removed after inspecting sibling node");
 
   yield selectNode("#div-1", inspector);
   yield togglePseudoClass(inspector);
 }
 
 function* showPickerOn(selector, inspector) {
-  let highlighter = inspector.toolbox.highlighter;
   let nodeFront = yield getNodeFront(selector, inspector);
-  yield highlighter.showBoxModel(nodeFront);
+  yield inspector.highlighter.showBoxModel(nodeFront);
 }
 
 function* assertPseudoAddedToNode(inspector, testActor, ruleview) {
   info("Make sure the pseudoclass lock is applied to #div-1 and its ancestors");
 
   let hasLock = yield testActor.hasPseudoClassLock("#div-1", PSEUDO);
   ok(hasLock, "pseudo-class lock has been applied");
   hasLock = yield testActor.hasPseudoClassLock("#parent-div", PSEUDO);
@@ -114,17 +113,17 @@ function* assertPseudoAddedToNode(inspec
 
   info("Show the highlighter on #div-1");
   yield showPickerOn("#div-1", inspector);
 
   info("Check that the infobar selector contains the pseudo-class");
   let value = yield testActor.getHighlighterNodeTextContent(
     "box-model-infobar-pseudo-classes");
   is(value, PSEUDO, "pseudo-class in infobar selector");
-  yield inspector.toolbox.highlighter.hideBoxModel();
+  yield inspector.highlighter.hideBoxModel();
 }
 
 function* assertPseudoRemovedFromNode(testActor) {
   info("Make sure the pseudoclass lock is removed from #div-1 and its " +
        "ancestors");
 
   let hasLock = yield testActor.hasPseudoClassLock("#div-1", PSEUDO);
   ok(!hasLock, "pseudo-class lock has been removed");
@@ -140,10 +139,10 @@ function* assertPseudoRemovedFromView(in
     ".ruleview-rule.theme-separator");
   is(rules.length, 2, "rule view is showing 2 rules after removing lock");
 
   yield showPickerOn("#div-1", inspector);
 
   let value = yield testActor.getHighlighterNodeTextContent(
     "box-model-infobar-pseudo-classes");
   is(value, "", "pseudo-class removed from infobar selector");
-  yield inspector.toolbox.highlighter.hideBoxModel();
+  yield inspector.highlighter.hideBoxModel();
 }
--- a/devtools/client/inspector/test/browser_inspector_search-filter_context-menu.js
+++ b/devtools/client/inspector/test/browser_inspector_search-filter_context-menu.js
@@ -10,17 +10,17 @@ const TEST_URI = "<h1>test filter contex
 
 add_task(function* () {
   yield addTab("data:text/html;charset=utf-8," + encodeURIComponent(TEST_URI));
   let {toolbox, inspector} = yield openInspector();
   let {searchBox} = inspector;
   yield selectNode("h1", inspector);
 
   let win = inspector.panelWin;
-  let searchContextMenu = toolbox.textboxContextMenuPopup;
+  let searchContextMenu = toolbox.textBoxContextMenuPopup;
   ok(searchContextMenu,
     "The search filter context menu is loaded in the inspector");
 
   let cmdUndo = searchContextMenu.querySelector("[command=cmd_undo]");
   let cmdDelete = searchContextMenu.querySelector("[command=cmd_delete]");
   let cmdSelectAll = searchContextMenu.querySelector("[command=cmd_selectAll]");
   let cmdCut = searchContextMenu.querySelector("[command=cmd_cut]");
   let cmdCopy = searchContextMenu.querySelector("[command=cmd_copy]");
new file mode 100644
--- /dev/null
+++ b/devtools/client/inspector/test/browser_inspector_textbox-menu.js
@@ -0,0 +1,90 @@
+/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+"use strict";
+
+// Test that when right-clicking on various text boxes throughout the inspector does use
+// the toolbox's context menu (copy/cut/paste/selectAll/Undo).
+
+add_task(function* () {
+  yield addTab(`data:text/html;charset=utf-8,
+                <style>h1 { color: red; }</style>
+                <h1 id="title">textbox context menu test</h1>`);
+  let {toolbox, inspector} = yield openInspector();
+  yield selectNode("h1", inspector);
+
+  info("Testing the markup-view tagname");
+  let container = yield focusNode("h1", inspector);
+  let tag = container.editor.tag;
+  tag.focus();
+  EventUtils.sendKey("return", inspector.panelWin);
+  yield checkTextBox(inspector.markup.doc.activeElement, toolbox);
+
+  info("Testing the markup-view attribute");
+  EventUtils.sendKey("tab", inspector.panelWin);
+  yield checkTextBox(inspector.markup.doc.activeElement, toolbox);
+
+  info("Testing the markup-view new attribute");
+  // It takes 2 tabs to focus the newAttr field, the first one just moves the cursor to
+  // the end of the field.
+  EventUtils.sendKey("tab", inspector.panelWin);
+  EventUtils.sendKey("tab", inspector.panelWin);
+  yield checkTextBox(inspector.markup.doc.activeElement, toolbox);
+
+  info("Testing the markup-view textcontent");
+  EventUtils.sendKey("tab", inspector.panelWin);
+  yield checkTextBox(inspector.markup.doc.activeElement, toolbox);
+  // Blur this last markup-view field, since we're moving on to the rule-view next.
+  EventUtils.sendKey("escape", inspector.panelWin);
+
+  info("Testing the rule-view selector");
+  let ruleView = inspector.ruleview.view;
+  let cssRuleEditor = getRuleViewRuleEditor(ruleView, 1);
+  EventUtils.synthesizeMouse(cssRuleEditor.selectorText, 0, 0, {}, inspector.panelWin);
+  yield checkTextBox(inspector.panelDoc.activeElement, toolbox);
+
+  info("Testing the rule-view property name");
+  EventUtils.sendKey("tab", inspector.panelWin);
+  yield checkTextBox(inspector.panelDoc.activeElement, toolbox);
+
+  info("Testing the rule-view property value");
+  EventUtils.sendKey("tab", inspector.panelWin);
+  yield checkTextBox(inspector.panelDoc.activeElement, toolbox);
+
+  info("Testing the rule-view new property");
+  // Tabbing out of the value field triggers a ruleview-changed event that we need to wait
+  // for.
+  let onRuleViewChanged = once(ruleView, "ruleview-changed");
+  EventUtils.sendKey("tab", inspector.panelWin);
+  yield onRuleViewChanged;
+  yield checkTextBox(inspector.panelDoc.activeElement, toolbox);
+
+  info("Switching to the computed-view");
+  let onComputedViewReady = inspector.once("boxmodel-view-updated");
+  selectComputedView(inspector);
+  yield onComputedViewReady;
+
+  info("Testing the box-model region");
+  let margin = inspector.panelDoc.querySelector(".boxmodel-margin.boxmodel-top > span");
+  EventUtils.synthesizeMouseAtCenter(margin, {}, inspector.panelWin);
+  yield checkTextBox(inspector.panelDoc.activeElement, toolbox);
+});
+
+function* checkTextBox(textBox, {textBoxContextMenuPopup}) {
+  is(textBoxContextMenuPopup.state, "closed", "The menu is closed");
+
+  info("Simulating context click on the textbox and expecting the menu to open");
+  let onContextMenu = once(textBoxContextMenuPopup, "popupshown");
+  EventUtils.synthesizeMouse(textBox, 2, 2, {type: "contextmenu", button: 2},
+                             textBox.ownerDocument.defaultView);
+  yield onContextMenu;
+
+  is(textBoxContextMenuPopup.state, "open", "The menu is now visible");
+
+  info("Closing the menu");
+  let onContextMenuHidden = once(textBoxContextMenuPopup, "popuphidden");
+  textBoxContextMenuPopup.hidePopup();
+  yield onContextMenuHidden;
+
+  is(textBoxContextMenuPopup.state, "closed", "The menu is closed again");
+}
--- a/devtools/client/jar.mn
+++ b/devtools/client/jar.mn
@@ -20,16 +20,17 @@ devtools.jar:
     content/webconsole/webconsole.xul (webconsole/webconsole.xul)
 *   content/scratchpad/scratchpad.xul (scratchpad/scratchpad.xul)
     content/scratchpad/scratchpad.js (scratchpad/scratchpad.js)
     content/shared/splitview.css (shared/splitview.css)
     content/shared/theme-switching.js (shared/theme-switching.js)
     content/shared/frame-script-utils.js (shared/frame-script-utils.js)
     content/styleeditor/styleeditor.xul (styleeditor/styleeditor.xul)
     content/storage/storage.xul (storage/storage.xul)
+    content/inspector/inspector.js (inspector/inspector.js)
     content/inspector/fonts/fonts.js (inspector/fonts/fonts.js)
     content/inspector/markup/markup.xhtml (inspector/markup/markup.xhtml)
     content/animationinspector/animation-controller.js (animationinspector/animation-controller.js)
     content/animationinspector/animation-panel.js (animationinspector/animation-panel.js)
     content/animationinspector/animation-inspector.xhtml (animationinspector/animation-inspector.xhtml)
     content/sourceeditor/codemirror/addon/dialog/dialog.css (sourceeditor/codemirror/addon/dialog/dialog.css)
     content/sourceeditor/codemirror/addon/hint/show-hint.js (sourceeditor/codemirror/addon/hint/show-hint.js)
     content/sourceeditor/codemirror/addon/tern/tern.js (sourceeditor/codemirror/addon/tern/tern.js)
--- a/devtools/client/preferences/devtools.js
+++ b/devtools/client/preferences/devtools.js
@@ -345,11 +345,15 @@ pref("devtools.telemetry.tools.opened.ve
 // Enable the JSON View tool (an inspector for application/json documents) on
 // Nightly and Dev. Edition.
 #ifdef RELEASE_BUILD
 pref("devtools.jsonview.enabled", false);
 #else
 pref("devtools.jsonview.enabled", true);
 #endif
 
-// Disable the HTML responsive design tool by default.  Currently disabled until
-// ready to replace the legacy XUL version.
+// Enable the HTML responsive design tool in Nightly only.  Disabled by default for all
+// other channels.
+#ifdef NIGHTLY_BUILD
+pref("devtools.responsive.html.enabled", true);
+#else
 pref("devtools.responsive.html.enabled", false);
+#endif
--- a/devtools/client/responsive.html/index.js
+++ b/devtools/client/responsive.html/index.js
@@ -105,19 +105,19 @@ window.addInitialViewport = contentURI =
  * Called by manager.js when tests want to check the viewport size.
  */
 window.getViewportSize = () => {
   let { width, height } = bootstrap.store.getState().viewports[0];
   return { width, height };
 };
 
 /**
- * Called by manager.js to set viewport size from GCLI.
+ * Called by manager.js to set viewport size from tests, GCLI, etc.
  */
-window.setViewportSize = (width, height) => {
+window.setViewportSize = ({ width, height }) => {
   try {
     bootstrap.dispatch(resizeViewport(0, width, height));
   } catch (e) {
     console.error(e);
   }
 };
 
 /**
--- a/devtools/client/responsive.html/manager.js
+++ b/devtools/client/responsive.html/manager.js
@@ -167,17 +167,17 @@ const ResponsiveUIManager = exports.Resp
    * @param args
    *        The GCLI command arguments.
    */
   handleGcliCommand(window, tab, command, args) {
     let completed;
     switch (command) {
       case "resize to":
         completed = this.openIfNeeded(window, tab, { command: true });
-        this.activeTabs.get(tab).setViewportSize(args.width, args.height);
+        this.activeTabs.get(tab).setViewportSize(args);
         break;
       case "resize on":
         completed = this.openIfNeeded(window, tab, { command: true });
         break;
       case "resize off":
         completed = this.closeIfNeeded(window, tab, { command: true });
         break;
       case "resize toggle":
@@ -484,21 +484,21 @@ ResponsiveUI.prototype = {
   /**
    * Helper for tests. Assumes a single viewport for now.
    */
   getViewportSize() {
     return this.toolWindow.getViewportSize();
   },
 
   /**
-   * Helper for tests. Assumes a single viewport for now.
+   * Helper for tests, GCLI, etc. Assumes a single viewport for now.
    */
-  setViewportSize: Task.async(function* (width, height) {
+  setViewportSize: Task.async(function* (size) {
     yield this.inited;
-    this.toolWindow.setViewportSize(width, height);
+    this.toolWindow.setViewportSize(size);
   }),
 
   /**
    * Helper for tests/reloading the viewport. Assumes a single viewport for now.
    */
   getViewportBrowser() {
     return this.toolWindow.getViewportBrowser();
   },
--- a/devtools/client/responsive.html/reducers/viewports.js
+++ b/devtools/client/responsive.html/reducers/viewports.js
@@ -44,16 +44,23 @@ let reducers = {
   },
 
   [RESIZE_VIEWPORT](viewports, { id, width, height }) {
     return viewports.map(viewport => {
       if (viewport.id !== id) {
         return viewport;
       }
 
+      if (!width) {
+        width = viewport.width;
+      }
+      if (!height) {
+        height = viewport.height;
+      }
+
       return Object.assign({}, viewport, {
         width,
         height,
       });
     });
   },
 
   [ROTATE_VIEWPORT](viewports, { id }) {
--- a/devtools/client/responsive.html/test/browser/head.js
+++ b/devtools/client/responsive.html/test/browser/head.js
@@ -137,17 +137,17 @@ function waitForViewportResizeTo(ui, wid
 }
 
 var setViewportSize = Task.async(function* (ui, manager, width, height) {
   let size = ui.getViewportSize();
   info(`Current size: ${size.width} x ${size.height}, ` +
        `set to: ${width} x ${height}`);
   if (size.width != width || size.height != height) {
     let resized = waitForViewportResizeTo(ui, width, height);
-    ui.setViewportSize(width, height);
+    ui.setViewportSize({ width, height });
     yield resized;
   }
 });
 
 function getElRect(selector, win) {
   let el = win.document.querySelector(selector);
   return el.getBoundingClientRect();
 }
--- a/devtools/client/responsivedesign/responsivedesign.jsm
+++ b/devtools/client/responsivedesign/responsivedesign.jsm
@@ -57,28 +57,28 @@ var Manager = {
    *
    * @param aWindow the main window.
    * @param aTab the tab targeted.
    */
   toggle: function (aWindow, aTab) {
     if (this.isActiveForTab(aTab)) {
       ActiveTabs.get(aTab).close();
     } else {
-      this.runIfNeeded(aWindow, aTab);
+      this.openIfNeeded(aWindow, aTab);
     }
   },
 
   /**
    * Launches the responsive mode.
    *
    * @param aWindow the main window.
    * @param aTab the tab targeted.
    * @returns {ResponsiveUI} the instance of ResponsiveUI for the current tab.
    */
-  runIfNeeded: Task.async(function* (aWindow, aTab) {
+  openIfNeeded: Task.async(function* (aWindow, aTab) {
     let ui;
     if (!this.isActiveForTab(aTab)) {
       ui = new ResponsiveUI(aWindow, aTab);
       yield ui.inited;
     } else {
       ui = this.getResponsiveUIForTab(aTab);
     }
     return ui;
@@ -106,40 +106,42 @@ var Manager = {
    * @param aWindow the browser window.
    * @param aTab the tab targeted.
    * @param aCommand the command name.
    * @param aArgs command arguments.
    */
   handleGcliCommand: Task.async(function* (aWindow, aTab, aCommand, aArgs) {
     switch (aCommand) {
       case "resize to":
-        let ui = yield this.runIfNeeded(aWindow, aTab);
-        ui.setSize(aArgs.width, aArgs.height);
+        let ui = yield this.openIfNeeded(aWindow, aTab);
+        ui.setViewportSize(aArgs);
         break;
       case "resize on":
-        this.runIfNeeded(aWindow, aTab);
+        this.openIfNeeded(aWindow, aTab);
         break;
       case "resize off":
         if (this.isActiveForTab(aTab)) {
           yield ActiveTabs.get(aTab).close();
         }
         break;
       case "resize toggle":
         this.toggle(aWindow, aTab);
       default:
     }
   })
 };
 
 EventEmitter.decorate(Manager);
 
-// If the experimental HTML UI is enabled, delegate the ResponsiveUIManager API
-// over to that tool instead.  Performing this delegation here allows us to
-// contain the pref check to a single place.
-if (Services.prefs.getBoolPref("devtools.responsive.html.enabled")) {
+// If the new HTML RDM UI is enabled and e10s is enabled by default (e10s is required for
+// the new HTML RDM UI to function), delegate the ResponsiveUIManager API over to that
+// tool instead.  Performing this delegation here allows us to contain the pref check to a
+// single place.
+if (Services.prefs.getBoolPref("devtools.responsive.html.enabled") &&
+    Services.appinfo.browserTabsRemoteAutostart) {
   let { ResponsiveUIManager } =
     require("devtools/client/responsive.html/manager");
   this.ResponsiveUIManager = ResponsiveUIManager;
 } else {
   this.ResponsiveUIManager = Manager;
 }
 
 var defaultPresets = [
@@ -412,17 +414,17 @@ ResponsiveUI.prototype = {
       this.mm.addMessageListener(message, listener);
     });
   },
 
   /**
    * Emit an event when the content has been resized. Only used in tests.
    */
   onContentResize: function (msg) {
-    ResponsiveUIManager.emit("contentResize", {
+    ResponsiveUIManager.emit("content-resize", {
       tab: this.tab,
       width: msg.data.width,
       height: msg.data.height,
     });
   },
 
   /**
    * Handle events
@@ -438,16 +440,20 @@ ResponsiveUI.prototype = {
           this.checkMenus();
         } else if (!this.mainWindow.gBrowser.selectedTab.responsiveUI) {
           this.unCheckMenus();
         }
         break;
     }
   },
 
+  getViewportBrowser() {
+    return this.browser;
+  },
+
   /**
    * Check the menu items.
    */
   checkMenus: function RUI_checkMenus() {
     this.chromeDoc.getElementById("menu_responsiveUI").setAttribute("checked", "true");
   },
 
   /**
@@ -668,17 +674,20 @@ ResponsiveUI.prototype = {
       this.currentPresetKey = this.customPreset.key;
       this.menulist.selectedItem = menuitem;
     }
 
     let w = this.customPreset.width = parseInt(value[1], 10);
     let h = this.customPreset.height = parseInt(value[2], 10);
 
     this.saveCustomSize();
-    this.setSize(w, h);
+    this.setViewportSize({
+      width: w,
+      height: h,
+    });
   },
 
   /**
    * Build the presets list and append it to the menupopup.
    *
    * @param aParent menupopup.
    */
   registerPresets: function RUI_registerPresets(aParent) {
@@ -750,21 +759,19 @@ ResponsiveUI.prototype = {
         this.addbutton.hidden = true;
         this.removebutton.hidden = false;
       }
     }
   },
 
   /**
    * Apply a preset.
-   *
-   * @param aPreset preset to apply.
    */
-  loadPreset: function RUI_loadPreset(aPreset) {
-    this.setSize(aPreset.width, aPreset.height);
+  loadPreset(preset) {
+    this.setViewportSize(preset);
   },
 
   /**
    * Add a preset to the list and the memory
    */
   addPreset: function RUI_addPreset() {
     let w = this.customPreset.width;
     let h = this.customPreset.height;
@@ -840,30 +847,36 @@ ResponsiveUI.prototype = {
 
     this.customPreset.width = w;
     this.customPreset.height = h;
     let menuitem = this.customMenuitem;
     this.setMenuLabel(menuitem, this.customPreset);
     this.menulist.selectedItem = menuitem;
     this.currentPresetKey = this.customPreset.key;
 
-    this.setSize(w, h);
+    this.setViewportSize({
+      width: w,
+      height: h,
+    });
 
     this.savePresets();
   },
 
   /**
    * Swap width and height.
    */
   rotate: function RUI_rotate() {
     let selectedPreset = this.menuitems.get(this.selectedItem);
     let width = this.rotateValue ? selectedPreset.height : selectedPreset.width;
     let height = this.rotateValue ? selectedPreset.width : selectedPreset.height;
 
-    this.setSize(height, width);
+    this.setViewportSize({
+      width: height,
+      height: width,
+    });
 
     if (selectedPreset.custom) {
       this.saveCustomSize();
     } else {
       this.rotateValue = !this.rotateValue;
       this.saveCurrentPreset();
     }
   },
@@ -994,25 +1007,26 @@ ResponsiveUI.prototype = {
     let height = Number(this.stack.style.minHeight.replace("px", ""));
     return {
       width,
       height,
     };
   },
 
   /**
-   * Change the size of the browser.
-   *
-   * @param aWidth width of the browser.
-   * @param aHeight height of the browser.
+   * Change the size of the viewport.
    */
-  setSize: function RUI_setSize(aWidth, aHeight) {
-    debug(`SET SIZE TO ${aWidth} x ${aHeight}`);
-    this.setWidth(aWidth);
-    this.setHeight(aHeight);
+  setViewportSize({ width, height }) {
+    debug(`SET SIZE TO ${width} x ${height}`);
+    if (width) {
+      this.setWidth(width);
+    }
+    if (height) {
+      this.setHeight(height);
+    }
   },
 
   setWidth: function RUI_setWidth(aWidth) {
     aWidth = Math.min(Math.max(aWidth, MIN_WIDTH), MAX_WIDTH);
     this.stack.style.maxWidth = this.stack.style.minWidth = aWidth + "px";
 
     if (!this.ignoreX)
       this.resizeBarH.setAttribute("left", Math.round(aWidth / 2));
@@ -1117,17 +1131,17 @@ ResponsiveUI.prototype = {
     }
 
     if (height < MIN_HEIGHT) {
       height = MIN_HEIGHT;
     } else {
       this.lastScreenY = screenY;
     }
 
-    this.setSize(width, height);
+    this.setViewportSize({ width, height });
   },
 
   /**
    * Stop End resizing
    */
   stopResizing: function RUI_stopResizing() {
     this.container.style.pointerEvents = "auto";
 
--- a/devtools/client/responsivedesign/test/browser_responsiveui.js
+++ b/devtools/client/responsivedesign/test/browser_responsiveui.js
@@ -106,17 +106,17 @@ function* testManualMouseResize(rdm, man
     mouseMoveParams.ctrlKey = true;
   } else {
     x += 20; y += 10;
   }
 
   EventUtils.synthesizeMouse(rdm.resizer, x, y, mouseMoveParams, window);
   EventUtils.synthesizeMouse(rdm.resizer, x, y, {type: "mouseup"}, window);
 
-  yield once(manager, "contentResize");
+  yield once(manager, "content-resize");
 
   let expectedWidth = initialWidth + 20;
   let expectedHeight = initialHeight + 10;
   info("initial width: " + initialWidth);
   info("initial height: " + initialHeight);
 
   yield verifyResize(rdm, expectedWidth, expectedHeight);
 }
@@ -133,17 +133,17 @@ function* testResizeUsingCustomInput(rdm
   // While typing, the size should not change
   let currentSize = yield getSizing();
   is(currentSize.width, initialWidth, "Typing shouldn't change the width");
   is(currentSize.height, initialHeight, "Typing shouldn't change the height");
 
   // Only the `change` event must change the size
   EventUtils.synthesizeKey("VK_RETURN", {});
 
-  yield once(manager, "contentResize");
+  yield once(manager, "content-resize");
 
   yield verifyResize(rdm, expectedWidth, expectedHeight);
 }
 
 function* testInvalidUserInput(rdm) {
   let {width: initialWidth, height: initialHeight} = yield getSizing();
   let index = rdm.menulist.selectedIndex;
   let expectedValue = initialWidth + "\u00D7" + initialHeight;
@@ -167,17 +167,17 @@ function* testInvalidUserInput(rdm) {
 }
 
 function* testRotate(rdm, manager) {
   yield setSize(rdm, manager, 100, 200);
 
   let {width: initialWidth, height: initialHeight} = yield getSizing();
   rdm.rotate();
 
-  yield once(manager, "contentResize");
+  yield once(manager, "content-resize");
 
   let newSize = yield getSizing();
   is(newSize.width, initialHeight, "The width should now be the height.");
   is(newSize.height, initialWidth, "The height should now be the width.");
 
   let label = rdm.menulist.firstChild.firstChild.getAttribute("label");
   let [width, height] = extractSizeFromString(label);
   is(width, initialHeight, "Width in label should be updated");
--- a/devtools/client/responsivedesign/test/browser_responsiveui_window_close.js
+++ b/devtools/client/responsivedesign/test/browser_responsiveui_window_close.js
@@ -7,17 +7,17 @@ add_task(function* () {
   let newWindowPromise = BrowserTestUtils.waitForNewWindow();
   window.open("about:blank", "_blank");
   let newWindow = yield newWindowPromise;
 
   newWindow.focus();
   yield once(newWindow.gBrowser, "load", true);
 
   let tab = newWindow.gBrowser.selectedTab;
-  yield ResponsiveUIManager.runIfNeeded(newWindow, tab);
+  yield ResponsiveUIManager.openIfNeeded(newWindow, tab);
 
   // Close the window on a tab with an active responsive design UI and
   // wait for the UI to gracefully shutdown.  This has leaked the window
   // in the past.
   ok(ResponsiveUIManager.isActiveForTab(tab),
      "ResponsiveUI should be active for tab when the window is closed");
   let offPromise = once(ResponsiveUIManager, "off");
   yield BrowserTestUtils.closeWindow(newWindow);
--- a/devtools/client/responsivedesign/test/browser_responsiveuiaddcustompreset.js
+++ b/devtools/client/responsivedesign/test/browser_responsiveuiaddcustompreset.js
@@ -41,20 +41,23 @@ add_task(function* () {
      "selected item shouldn't change after add preset and cancel");
   is(presetCount, rdm.presets.length,
      "number of presets shouldn't change after add preset and cancel");
 
   // Adds the custom preset with "Testing preset"
   Services.prompt.value = "Testing preset";
   Services.prompt.returnBool = true;
 
-  let resized = once(manager, "contentResize");
+  let resized = once(manager, "content-resize");
   let customHeight = 123, customWidth = 456;
   rdm.startResizing({});
-  rdm.setSize(customWidth, customHeight);
+  rdm.setViewportSize({
+    width: customWidth,
+    height: customHeight,
+  });
   rdm.stopResizing({});
 
   rdm.addbutton.doCommand();
   yield resized;
 
   yield closeRDM(rdm);
 
   ({rdm} = yield openRDM(tab));
--- a/devtools/client/responsivedesign/test/head.js
+++ b/devtools/client/responsivedesign/test/head.js
@@ -8,18 +8,21 @@ let testDir = gTestPath.substr(0, gTestP
 let sharedHeadURI = testDir + "../../../framework/test/shared-head.js";
 Services.scriptloader.loadSubScript(sharedHeadURI, this);
 
 // Import the GCLI test helper
 let gcliHelpersURI = testDir + "../../../commandline/test/helpers.js";
 Services.scriptloader.loadSubScript(gcliHelpersURI, this);
 
 flags.testing = true;
+Services.prefs.setBoolPref("devtools.responsive.html.enabled", false);
+
 registerCleanupFunction(() => {
   flags.testing = false;
+  Services.prefs.clearUserPref("devtools.responsive.html.enabled");
   Services.prefs.clearUserPref("devtools.responsiveUI.currentPreset");
   Services.prefs.clearUserPref("devtools.responsiveUI.customHeight");
   Services.prefs.clearUserPref("devtools.responsiveUI.customWidth");
   Services.prefs.clearUserPref("devtools.responsiveUI.presets");
   Services.prefs.clearUserPref("devtools.responsiveUI.rotate");
 });
 
 SimpleTest.requestCompleteLog();
@@ -32,17 +35,17 @@ const { ResponsiveUIManager } = Cu.impor
  * @param {method} The method to use to open the RDM (values: menu, keyboard)
  * @return {rdm, manager} Returns the RUI instance and the manager
  */
 var openRDM = Task.async(function* (tab = gBrowser.selectedTab,
                                    method = "menu") {
   let manager = ResponsiveUIManager;
 
   let opened = once(manager, "on");
-  let resized = once(manager, "contentResize");
+  let resized = once(manager, "content-resize");
   if (method == "menu") {
     document.getElementById("menu_responsiveUI").doCommand();
   } else {
     synthesizeKeyFromKeyTag(document.getElementById("key_responsiveUI"));
   }
   yield opened;
 
   let rdm = manager.getResponsiveUIForTab(tab);
@@ -63,17 +66,17 @@ var openRDM = Task.async(function* (tab 
  * @param {rdm} ResponsiveUI instance for the tab
  */
 var closeRDM = Task.async(function* (rdm) {
   let manager = ResponsiveUIManager;
   if (!rdm) {
     rdm = manager.getResponsiveUIForTab(gBrowser.selectedTab);
   }
   let closed = once(manager, "off");
-  let resized = once(manager, "contentResize");
+  let resized = once(manager, "content-resize");
   rdm.close();
   yield resized;
   yield closed;
 });
 
 /**
  * Open the toolbox, with the inspector tool visible.
  * @return a promise that resolves when the inspector is ready
@@ -264,36 +267,36 @@ var selectNode = Task.async(function* (s
 });
 
 function waitForResizeTo(manager, width, height) {
   return new Promise(resolve => {
     let onResize = (_, data) => {
       if (data.width != width || data.height != height) {
         return;
       }
-      manager.off("contentResize", onResize);
-      info(`Got contentResize to ${width} x ${height}`);
+      manager.off("content-resize", onResize);
+      info(`Got content-resize to ${width} x ${height}`);
       resolve();
     };
-    info(`Waiting for contentResize to ${width} x ${height}`);
-    manager.on("contentResize", onResize);
+    info(`Waiting for content-resize to ${width} x ${height}`);
+    manager.on("content-resize", onResize);
   });
 }
 
 var setPresetIndex = Task.async(function* (rdm, manager, index) {
   info(`Current preset: ${rdm.menulist.selectedIndex}, change to: ${index}`);
   if (rdm.menulist.selectedIndex != index) {
-    let resized = once(manager, "contentResize");
+    let resized = once(manager, "content-resize");
     rdm.menulist.selectedIndex = index;
     yield resized;
   }
 });
 
 var setSize = Task.async(function* (rdm, manager, width, height) {
   let size = rdm.getSize();
   info(`Current size: ${size.width} x ${size.height}, ` +
        `set to: ${width} x ${height}`);
   if (size.width != width || size.height != height) {
     let resized = waitForResizeTo(manager, width, height);
-    rdm.setSize(width, height);
+    rdm.setViewportSize({ width, height });
     yield resized;
   }
 });
--- a/devtools/client/shared/inplace-editor.js
+++ b/devtools/client/shared/inplace-editor.js
@@ -83,16 +83,18 @@ function isKeyIn(key, ...keys) {
  *       Called when input is committed or blurred.  Called with
  *       current value, a boolean telling the caller whether to
  *       commit the change, and the direction of the next element to be
  *       selected. Direction may be one of Services.focus.MOVEFOCUS_FORWARD,
  *       Services.focus.MOVEFOCUS_BACKWARD, or null (no movement).
  *       This function is called before the editor has been torn down.
  *    {Function} destroy:
  *       Called when the editor is destroyed and has been torn down.
+ *    {Function} contextMenu:
+ *       Called when the user triggers a contextmenu event on the input.
  *    {Object} advanceChars:
  *       This can be either a string or a function.
  *       If it is a string, then if any characters in it are typed,
  *       focus will advance to the next element.
  *       Otherwise, if it is a function, then the function will
  *       be called with three arguments: a key code, the current text,
  *       and the insertion point.  If the function returns true,
  *       then the focus advance takes place.  If it returns false,
@@ -217,16 +219,17 @@ exports.getInplaceEditorForSpan = getInp
 function InplaceEditor(options, event) {
   this.elt = options.element;
   let doc = this.elt.ownerDocument;
   this.doc = doc;
   this.elt.inplaceEditor = this;
   this.cssProperties = options.cssProperties;
   this.change = options.change;
   this.done = options.done;
+  this.contextMenu = options.contextMenu;
   this.destroy = options.destroy;
   this.initial = options.initial ? options.initial : this.elt.textContent;
   this.multiline = options.multiline || false;
   this.maxWidth = options.maxWidth;
   if (typeof this.maxWidth == "function") {
     this.maxWidth = this.maxWidth();
   }
 
@@ -244,16 +247,17 @@ function InplaceEditor(options, event) {
                           : !!options.preserveTextStyles;
 
   this._onBlur = this._onBlur.bind(this);
   this._onWindowBlur = this._onWindowBlur.bind(this);
   this._onKeyPress = this._onKeyPress.bind(this);
   this._onInput = this._onInput.bind(this);
   this._onKeyup = this._onKeyup.bind(this);
   this._onAutocompletePopupClick = this._onAutocompletePopupClick.bind(this);
+  this._onContextMenu = this._onContextMenu.bind(this);
 
   this._createInput();
 
   // Hide the provided element and add our editor.
   this.originalDisplay = this.elt.style.display;
   this.elt.style.display = "none";
   this.elt.parentNode.insertBefore(this.input, this.elt);
 
@@ -285,16 +289,17 @@ function InplaceEditor(options, event) {
   }
 
   this.input.addEventListener("blur", this._onBlur, false);
   this.input.addEventListener("keypress", this._onKeyPress, false);
   this.input.addEventListener("input", this._onInput, false);
   this.input.addEventListener("dblclick", this._stopEventPropagation, false);
   this.input.addEventListener("click", this._stopEventPropagation, false);
   this.input.addEventListener("mousedown", this._stopEventPropagation, false);
+  this.input.addEventListener("contextmenu", this._onContextMenu, false);
   this.doc.defaultView.addEventListener("blur", this._onWindowBlur, false);
 
   this.validate = options.validate;
 
   if (this.validate) {
     this.input.addEventListener("keyup", this._onKeyup, false);
   }
 
@@ -344,21 +349,20 @@ InplaceEditor.prototype = {
       // Already cleared.
       return;
     }
 
     this.input.removeEventListener("blur", this._onBlur, false);
     this.input.removeEventListener("keypress", this._onKeyPress, false);
     this.input.removeEventListener("keyup", this._onKeyup, false);
     this.input.removeEventListener("input", this._onInput, false);
-    this.input.removeEventListener("dblclick", this._stopEventPropagation,
-      false);
+    this.input.removeEventListener("dblclick", this._stopEventPropagation, false);
     this.input.removeEventListener("click", this._stopEventPropagation, false);
-    this.input.removeEventListener("mousedown", this._stopEventPropagation,
-      false);
+    this.input.removeEventListener("mousedown", this._stopEventPropagation, false);
+    this.input.removeEventListener("contextmenu", this._onContextMenu, false);
     this.doc.defaultView.removeEventListener("blur", this._onWindowBlur, false);
 
     this._stopAutosize();
 
     this.elt.style.display = this.originalDisplay;
 
     if (this.doc.activeElement == this.input) {
       this.elt.focus();
@@ -1159,16 +1163,22 @@ InplaceEditor.prototype = {
       prevent = !input.value;
     }
 
     if (prevent) {
       event.preventDefault();
     }
   },
 
+  _onContextMenu: function (event) {
+    if (this.contextMenu) {
+      this.contextMenu(event);
+    }
+  },
+
   /**
    * Open the autocomplete popup, adding a custom click handler and classname.
    *
    * @param {Number} offset
    *        X-offset relative to the input starting edge.
    * @param {Number} selectedIndex
    *        The index of the item that should be selected. Use -1 to have no
    *        item selected.
--- a/devtools/client/shared/widgets/Tooltip.js
+++ b/devtools/client/shared/widgets/Tooltip.js
@@ -736,17 +736,17 @@ Heritage.extend(SwatchBasedEditorTooltip
       this._originalColor = this.currentSwatchColor.textContent;
       let color = this.activeSwatch.style.backgroundColor;
       this.spectrum.off("changed", this._onSpectrumColorChange);
       this.spectrum.rgb = this._colorToRgba(color);
       this.spectrum.on("changed", this._onSpectrumColorChange);
       this.spectrum.updateUI();
     }
 
-    let {target} = this.inspector.toolbox;
+    let {target} = this.inspector;
     target.actorHasMethod("inspector", "pickColorFromPage").then(value => {
       let tooltipDoc = this.tooltip.doc;
       let eyeButton = tooltipDoc.querySelector("#eyedropper-button");
       if (value && this.inspector.selection.nodeFront.isInHTMLDocument) {
         eyeButton.addEventListener("click", this._openEyeDropper);
       } else {
         eyeButton.style.display = "none";
       }
--- a/devtools/client/styleeditor/StyleEditorUI.jsm
+++ b/devtools/client/styleeditor/StyleEditorUI.jsm
@@ -956,25 +956,18 @@ StyleEditorUI.prototype = {
    *
    * @param  {object} options
    *         Object with width or/and height properties.
    */
   _launchResponsiveMode: Task.async(function* (options = {}) {
     let tab = this._target.tab;
     let win = this._target.tab.ownerDocument.defaultView;
 
-    yield ResponsiveUIManager.runIfNeeded(win, tab);
-    if (options.width && options.height) {
-      ResponsiveUIManager.getResponsiveUIForTab(tab).setSize(options.width,
-                                                             options.height);
-    } else if (options.width) {
-      ResponsiveUIManager.getResponsiveUIForTab(tab).setWidth(options.width);
-    } else if (options.height) {
-      ResponsiveUIManager.getResponsiveUIForTab(tab).setHeight(options.height);
-    }
+    yield ResponsiveUIManager.openIfNeeded(win, tab);
+    ResponsiveUIManager.getResponsiveUIForTab(tab).setViewportSize(options);
   }),
 
   /**
    * Jump cursor to the editor for a stylesheet and line number for a rule.
    *
    * @param  {object} location
    *         Location object with 'line', 'column', and 'source' properties.
    */
--- a/devtools/client/styleeditor/test/browser.ini
+++ b/devtools/client/styleeditor/test/browser.ini
@@ -51,16 +51,17 @@ support-files =
   doc_xulpage.xul
   sync.html
   utf-16.css
   !/devtools/client/commandline/test/helpers.js
   !/devtools/client/framework/test/shared-head.js
   !/devtools/client/inspector/shared/test/head.js
   !/devtools/client/inspector/test/head.js
   !/devtools/client/inspector/test/shared-head.js
+  !/devtools/client/responsive.html/test/browser/devices.json
   !/devtools/client/shared/test/test-actor-registry.js
   !/devtools/client/shared/test/test-actor.js
 
 [browser_styleeditor_autocomplete.js]
 [browser_styleeditor_autocomplete-disabled.js]
 [browser_styleeditor_bom.js]
 [browser_styleeditor_bug_740541_iframes.js]
 [browser_styleeditor_bug_851132_middle_click.js]
--- a/devtools/client/styleeditor/test/browser_styleeditor_media_sidebar.js
+++ b/devtools/client/styleeditor/test/browser_styleeditor_media_sidebar.js
@@ -5,19 +5,19 @@
 "use strict";
 
 // https rather than chrome to improve coverage
 const TESTCASE_URI = TEST_BASE_HTTPS + "media-rules.html";
 const MEDIA_PREF = "devtools.styleeditor.showMediaSidebar";
 
 const RESIZE = 300;
 const LABELS = ["not all", "all", "(max-width: 400px)",
-                "(min-height: 200px) and (max-height: 250px)",
+                "(min-height: 300px) and (max-height: 320px)",
                 "(max-width: 600px)"];
-const LINE_NOS = [1, 7, 19, 25, 30];
+const LINE_NOS = [1, 7, 19, 25, 31];
 const NEW_RULE = "\n@media (max-width: 600px) { div { color: blue; } }";
 
 waitForExplicitFinish();
 
 add_task(function* () {
   let { ui } = yield openStyleEditorForURL(TESTCASE_URI);
 
   is(ui.editors.length, 2, "correct number of editors");
--- a/devtools/client/styleeditor/test/browser_styleeditor_media_sidebar_links.js
+++ b/devtools/client/styleeditor/test/browser_styleeditor_media_sidebar_links.js
@@ -2,31 +2,40 @@
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 /* Tests responsive mode links for
  * @media sidebar width and height related conditions */
 
+const asyncStorage = require("devtools/shared/async-storage");
+Services.prefs.setCharPref("devtools.devices.url",
+  "http://example.com/browser/devtools/client/responsive.html/test/browser/devices.json");
+
+registerCleanupFunction(() => {
+  Services.prefs.clearUserPref("devtools.devices.url");
+  asyncStorage.removeItem("devtools.devices.url_cache");
+});
+
 const mgr = "resource://devtools/client/responsivedesign/responsivedesign.jsm";
 const {ResponsiveUIManager} = Cu.import(mgr, {});
 const TESTCASE_URI = TEST_BASE_HTTPS + "media-rules.html";
 const responsiveModeToggleClass = ".media-responsive-mode-toggle";
 
 add_task(function* () {
   let {ui} = yield openStyleEditorForURL(TESTCASE_URI);
 
   let editor = ui.editors[1];
   yield openEditor(editor);
 
   let tab = gBrowser.selectedTab;
   testNumberOfLinks(editor);
   yield testMediaLink(editor, tab, ui, 2, "width", 400);
-  yield testMediaLink(editor, tab, ui, 3, "height", 200);
+  yield testMediaLink(editor, tab, ui, 3, "height", 300);
 
   yield closeRDM(tab, ui);
   doFinalChecks(editor);
 });
 
 function testNumberOfLinks(editor) {
   let sidebar = editor.details.querySelector(".stylesheet-sidebar");
   let conditions = sidebar.querySelectorAll(".media-rule-condition");
@@ -42,41 +51,42 @@ function testNumberOfLinks(editor) {
        "There should be 2 responsive mode links in the media rule");
 }
 
 function* testMediaLink(editor, tab, ui, itemIndex, type, value) {
   let sidebar = editor.details.querySelector(".stylesheet-sidebar");
   let conditions = sidebar.querySelectorAll(".media-rule-condition");
 
   let onMediaChange = once(ui, "media-list-changed");
-  let onContentResize = waitForResizeTo(ResponsiveUIManager, type, value);
 
   info("Launching responsive mode");
   conditions[itemIndex].querySelector(responsiveModeToggleClass).click();
 
-  ResponsiveUIManager.getResponsiveUIForTab(tab).transitionsEnabled = false;
+  let rdmUI = ResponsiveUIManager.getResponsiveUIForTab(tab);
+  let onContentResize = waitForResizeTo(rdmUI, type, value);
+  rdmUI.transitionsEnabled = false;
 
   info("Waiting for the @media list to update");
   yield onMediaChange;
   yield onContentResize;
 
   ok(ResponsiveUIManager.isActiveForTab(tab),
     "Responsive mode should be active.");
   conditions = sidebar.querySelectorAll(".media-rule-condition");
   ok(!conditions[itemIndex].classList.contains("media-condition-unmatched"),
      "media rule should now be matched after responsive mode is active");
 
-  let dimension = (yield getSizing())[type];
+  let dimension = (yield getSizing(rdmUI))[type];
   is(dimension, value, `${type} should be properly set.`);
 }
 
 function* closeRDM(tab, ui) {
   info("Closing responsive mode");
   ResponsiveUIManager.toggle(window, tab);
-  let onMediaChange = once(ui, "media-list-changed");
+  let onMediaChange = waitForNEvents(ui, "media-list-changed", 2);
   yield once(ResponsiveUIManager, "off");
   yield onMediaChange;
   ok(!ResponsiveUIManager.isActiveForTab(tab),
      "Responsive mode should no longer be active.");
 }
 
 function doFinalChecks(editor) {
   let sidebar = editor.details.querySelector(".stylesheet-sidebar");
@@ -84,33 +94,41 @@ function doFinalChecks(editor) {
   conditions = sidebar.querySelectorAll(".media-rule-condition");
   ok(conditions[2].classList.contains("media-condition-unmatched"),
      "The width condition should now be unmatched");
   ok(conditions[3].classList.contains("media-condition-unmatched"),
      "The height condition should now be unmatched");
 }
 
 /* Helpers */
-function waitForResizeTo(manager, type, value) {
+function waitForResizeTo(rdmUI, type, value) {
   return new Promise(resolve => {
     let onResize = (_, data) => {
       if (data[type] != value) {
         return;
       }
-      manager.off("contentResize", onResize);
-      info(`Got contentResize to a ${type} of ${value}`);
+      ResponsiveUIManager.off("content-resize", onResize);
+      if (rdmUI.off) {
+        rdmUI.off("content-resize", onResize);
+      }
+      info(`Got content-resize to a ${type} of ${value}`);
       resolve();
     };
-    info(`Waiting for contentResize to a ${type} of ${value}`);
-    manager.on("contentResize", onResize);
+    info(`Waiting for content-resize to a ${type} of ${value}`);
+    // Old RDM emits on manager
+    ResponsiveUIManager.on("content-resize", onResize);
+    // New RDM emits on ui
+    if (rdmUI.on) {
+      rdmUI.on("content-resize", onResize);
+    }
   });
 }
 
-function* getSizing() {
-  let browser = gBrowser.selectedBrowser;
+function* getSizing(rdmUI) {
+  let browser = rdmUI.getViewportBrowser();
   let sizing = yield ContentTask.spawn(browser, {}, function* () {
     return {
       width: content.innerWidth,
       height: content.innerHeight
     };
   });
   return sizing;
 }
--- a/devtools/client/styleeditor/test/media-rules.css
+++ b/devtools/client/styleeditor/test/media-rules.css
@@ -17,13 +17,13 @@ div {
 }
 
 @media (max-width: 400px) {
   div {
     color: green;
   }
 }
 
-@media (min-height: 200px) and (max-height: 250px) {
+@media (min-height: 300px) and (max-height: 320px) {
   div {
     color: orange;
   }
-}
\ No newline at end of file
+}
--- a/devtools/client/themes/inspector.css
+++ b/devtools/client/themes/inspector.css
@@ -6,16 +6,24 @@
 :root {
   --eyedropper-image: url(images/command-eyedropper.svg);
 }
 
 .theme-firebug {
   --eyedropper-image: url(images/firebug/command-eyedropper.svg);
 }
 
+:root.theme-light {
+  --breadcrumbs-border-color: #f3f3f3;
+}
+
+:root.theme-dark {
+  --breadcrumbs-border-color: #454d5d;
+}
+
 /* Make sure to hide scroll bars for the parent window */
 window {
   overflow: hidden;
 }
 
 /* The main Inspector panel container. */
 .inspector-responsive-container {
   height: 100vh;
@@ -112,16 +120,20 @@ window {
 #inspector-sidebar-toggle-box {
   line-height: initial;
 }
 
 #inspector-breadcrumbs-toolbar {
   padding: 0px;
   border-bottom-width: 0px;
   border-top-width: 1px;
+  border-top-color: var(--breadcrumbs-border-color);
+  /* Bug 1262668 - Use the same background as the body so the breadcrumbs toolbar doesn't
+     get mistaken as a splitter */
+  background-color: var(--theme-body-background);
   display: block;
   position: relative;
 }
 
 #inspector-breadcrumbs-toolbar,
 #inspector-breadcrumbs-toolbar * {
   box-sizing: border-box;
 }
--- a/devtools/client/themes/widgets.css
+++ b/devtools/client/themes/widgets.css
@@ -209,17 +209,17 @@
 
 #breadcrumb-separator-before,
 #breadcrumb-separator-after:after {
   background: var(--theme-selection-background);
 }
 
 #breadcrumb-separator-after,
 #breadcrumb-separator-before:after {
-  background: var(--theme-toolbar-background);
+  background: var(--theme-body-background);
 }
 
 /* This chevron arrow cannot be replicated easily in CSS, so we are using
  * a background image for it (still keeping it in a separate element so
  * we can handle RTL support with a CSS transform).
  */
 #breadcrumb-separator-normal {
   background: url(images/breadcrumbs-divider@2x.png) no-repeat center right;
--- a/devtools/shared/css/generated/mach_commands.py
+++ b/devtools/shared/css/generated/mach_commands.py
@@ -107,18 +107,18 @@ class MachCommands(MachCommandBase):
 
     def output_template(self, substitutions):
         """Output a the properties-db.js from a template."""
         js_template_path = resolve_path(self.topsrcdir,
             'devtools/shared/css/generated/properties-db.js.in')
         destination_path = resolve_path(self.topsrcdir,
             'devtools/shared/css/generated/properties-db.js')
 
-        with open(js_template_path, 'r') as handle:
+        with open(js_template_path, 'rb') as handle:
             js_template = handle.read()
 
         preamble = '/* THIS IS AN AUTOGENERATED FILE.  DO NOT EDIT */\n\n'
         contents = string.Template(js_template).substitute(substitutions)
 
-        with open(destination_path, 'w') as destination:
+        with open(destination_path, 'wb') as destination:
             destination.write(preamble + contents)
 
         print('The database was successfully generated at ' + destination_path)
--- a/devtools/shared/css/generated/properties-db.js
+++ b/devtools/shared/css/generated/properties-db.js
@@ -11,17 +11,17 @@
  * to generate these files can be found at devtools/shared/css/generate-properties-db.js.
  */
 
 /* eslint-disable max-len */
 
 /**
  * A list of CSS Properties and their various characteristics.
  */
-exports.CSS_PROPERTIES = {"all": {"subproperties": ["align-content", "align-items", "align-self", "animation-delay", "animation-direction", "animation-duration", "animation-fill-mode", "animation-iteration-count", "animation-name", "animation-play-state", "animation-timing-function", "-moz-appearance", "backface-visibility", "background-attachment", "background-blend-mode", "background-clip", "background-color", "background-image", "background-origin", "background-position-x", "background-position-y", "background-repeat", "background-size", "-moz-binding", "block-size", "border-block-end-color", "border-block-end-style", "border-block-end-width", "border-block-start-color", "border-block-start-style", "border-block-start-width", "border-bottom-color", "-moz-border-bottom-colors", "border-bottom-left-radius", "border-bottom-right-radius", "border-bottom-style", "border-bottom-width", "border-collapse", "border-image-outset", "border-image-repeat", "border-image-slice", "border-image-source", "border-image-width", "border-inline-end-color", "border-inline-end-style", "border-inline-end-width", "border-inline-start-color", "border-inline-start-style", "border-inline-start-width", "border-left-color", "-moz-border-left-colors", "border-left-style", "border-left-width", "border-right-color", "-moz-border-right-colors", "border-right-style", "border-right-width", "border-spacing", "border-top-color", "-moz-border-top-colors", "border-top-left-radius", "border-top-right-radius", "border-top-style", "border-top-width", "bottom", "-moz-box-align", "box-decoration-break", "-moz-box-direction", "-moz-box-flex", "-moz-box-ordinal-group", "-moz-box-orient", "-moz-box-pack", "box-shadow", "box-sizing", "caption-side", "clear", "clip", "clip-path", "clip-rule", "color", "color-adjust", "color-interpolation", "color-interpolation-filters", "-moz-column-count", "-moz-column-fill", "-moz-column-gap", "-moz-column-rule-color", "-moz-column-rule-style", "-moz-column-rule-width", "-moz-column-width", "contain", "content", "-moz-control-character-visibility", "counter-increment", "counter-reset", "cursor", "display", "dominant-baseline", "empty-cells", "fill", "fill-opacity", "fill-rule", "filter", "flex-basis", "flex-direction", "flex-grow", "flex-shrink", "flex-wrap", "float", "-moz-float-edge", "flood-color", "flood-opacity", "font-family", "font-feature-settings", "font-kerning", "font-language-override", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-synthesis", "font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position", "font-weight", "-moz-force-broken-image-icon", "grid-auto-columns", "grid-auto-flow", "grid-auto-rows", "grid-column-end", "grid-column-gap", "grid-column-start", "grid-row-end", "grid-row-gap", "grid-row-start", "grid-template-areas", "grid-template-columns", "grid-template-rows", "height", "hyphens", "initial-letter", "image-orientation", "-moz-image-region", "image-rendering", "ime-mode", "inline-size", "isolation", "justify-content", "justify-items", "justify-self", "left", "letter-spacing", "lighting-color", "line-height", "list-style-image", "list-style-position", "list-style-type", "margin-block-end", "margin-block-start", "margin-bottom", "margin-inline-end", "margin-inline-start", "margin-left", "margin-right", "margin-top", "marker-end", "marker-mid", "marker-offset", "marker-start", "mask-clip", "mask-composite", "mask-image", "mask-mode", "mask-origin", "mask-position-x", "mask-position-y", "mask-repeat", "mask-size", "mask-type", "max-block-size", "max-height", "max-inline-size", "max-width", "min-block-size", "-moz-min-font-size-ratio", "min-height", "min-inline-size", "min-width", "mix-blend-mode", "object-fit", "object-position", "offset-block-end", "offset-block-start", "offset-inline-end", "offset-inline-start", "opacity", "order", "-moz-orient", "-moz-osx-font-smoothing", "outline-color", "outline-offset", "-moz-outline-radius-bottomleft", "-moz-outline-radius-bottomright", "-moz-outline-radius-topleft", "-moz-outline-radius-topright", "outline-style", "outline-width", "overflow-clip-box", "overflow-x", "overflow-y", "padding-block-end", "padding-block-start", "padding-bottom", "padding-inline-end", "padding-inline-start", "padding-left", "padding-right", "padding-top", "page-break-after", "page-break-before", "page-break-inside", "paint-order", "perspective", "perspective-origin", "pointer-events", "position", "quotes", "resize", "right", "ruby-align", "ruby-position", "scroll-behavior", "scroll-snap-coordinate", "scroll-snap-destination", "scroll-snap-points-x", "scroll-snap-points-y", "scroll-snap-type-x", "scroll-snap-type-y", "shape-outside", "shape-rendering", "-moz-stack-sizing", "stop-color", "stop-opacity", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "-x-system-font", "-moz-tab-size", "table-layout", "text-align", "text-align-last", "text-anchor", "text-combine-upright", "text-decoration-color", "text-decoration-line", "text-decoration-style", "text-emphasis-color", "text-emphasis-position", "text-emphasis-style", "-webkit-text-fill-color", "text-indent", "text-orientation", "text-overflow", "text-rendering", "text-shadow", "-moz-text-size-adjust", "-webkit-text-stroke-color", "-webkit-text-stroke-width", "text-transform", "top", "-moz-top-layer", "touch-action", "transform", "transform-box", "transform-origin", "transform-style", "transition-delay", "transition-duration", "transition-property", "transition-timing-function", "-moz-user-focus", "-moz-user-input", "-moz-user-modify", "-moz-user-select", "vector-effect", "vertical-align", "visibility", "white-space", "width", "will-change", "-moz-window-dragging", "-moz-window-shadow", "word-break", "word-spacing", "overflow-wrap", "writing-mode", "z-index"], "values": ["COLOR", "-moz-all", "-moz-available", "-moz-block-height", "-moz-box", "-moz-calc", "-moz-center", "-moz-crisp-edges", "-moz-deck", "-moz-element", "-moz-fit-content", "-moz-grid", "-moz-grid-group", "-moz-grid-line", "-moz-groupbox", "-moz-gtk-info-bar", "-moz-hidden-unscrollable", "-moz-image-rect", "-moz-inline-box", "-moz-inline-grid", "-moz-inline-stack", "-moz-left", "-moz-linear-gradient", "-moz-mac-disclosure-button-closed", "-moz-mac-disclosure-button-open", "-moz-mac-fullscreen-button", "-moz-mac-help-button", "-moz-mac-source-list", "-moz-mac-vibrancy-dark", "-moz-mac-vibrancy-light", "-moz-max-content", "-moz-middle-with-baseline", "-moz-min-content", "-moz-none", "-moz-popup", "-moz-pre-space", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "-moz-right", "-moz-stack", "-moz-text", "-moz-use-text-color", "-moz-win-borderless-glass", "-moz-win-browsertabbar-toolbox", "-moz-win-communications-toolbox", "-moz-win-exclude-glass", "-moz-win-glass", "-moz-win-media-toolbox", "-moz-window-button-box", "-moz-window-button-box-maximized", "-moz-window-button-close", "-moz-window-button-maximize", "-moz-window-button-minimize", "-moz-window-button-restore", "-moz-window-frame-bottom", "-moz-window-frame-left", "-moz-window-frame-right", "-moz-window-titlebar", "-moz-window-titlebar-maximized", "-webkit-box", "-webkit-flex", "-webkit-inline-box", "-webkit-inline-flex", "absolute", "active", "add", "all", "all-petite-caps", "all-small-caps", "alpha", "alphabetic", "alternate", "alternate-reverse", "always", "auto", "avoid", "backwards", "balance", "baseline", "bevel", "block", "block-axis", "border-box", "both", "bottom", "bottom-outside", "break-all", "break-word", "butt", "button", "button-arrow-down", "button-arrow-next", "button-arrow-previous", "button-arrow-up", "button-bevel", "button-focus", "calc", "capitalize", "caret", "center", "central", "checkbox", "checkbox-container", "checkbox-label", "checkmenuitem", "clone", "collapse", "color", "color-burn", "color-dodge", "column", "column-reverse", "condensed", "contain", "content-box", "contents", "cover", "crispedges", "cubic-bezier", "currentColor", "darken", "dashed", "default", "dialog", "difference", "disabled", "dotted", "double", "drag", "dualbutton", "ease", "ease-in", "ease-in-out", "ease-out", "economy", "element", "elements", "enabled", "end", "evenodd", "exact", "exclude", "exclusion", "expanded", "extra-condensed", "extra-expanded", "fill", "fill-box", "fixed", "flat", "flex", "flex-end", "flex-start", "forwards", "full-width", "geometricprecision", "grid", "groove", "groupbox", "hanging", "hard-light", "hidden", "hide", "horizontal", "horizontal-tb", "hsl", "hsla", "hue", "ideographic", "ignore", "inactive", "infinite", "inherit", "initial", "inline", "inline-axis", "inline-block", "inline-end", "inline-flex", "inline-grid", "inline-start", "inline-table", "inset", "inside", "intersect", "isolate", "italic", "justify", "keep-all", "large", "larger", "last-baseline", "left", "lighten", "linear", "linear-gradient", "linearrgb", "list-item", "listbox", "listitem", "local", "lowercase", "lr", "lr-tb", "luminance", "luminosity", "mandatory", "manipulation", "manual", "margin-box", "match-source", "mathematical", "medium", "menuarrow", "menubar", "menucheckbox", "menuimage", "menuitem", "menuitemtext", "menulist", "menulist-button", "menulist-text", "menulist-textfield", "menupopup", "menuradio", "menuseparator", "meterbar", "meterchunk", "middle", "miter", "mixed", "multiply", "no-change", "no-drag", "no-repeat", "non-scaling-stroke", "none", "nonzero", "normal", "nowrap", "number-input", "oblique", "optimizelegibility", "optimizequality", "optimizespeed", "outset", "outside", "over", "overlay", "padding-box", "painted", "pan-x", "pan-y", "paused", "petite-caps", "pre", "pre-line", "pre-wrap", "preserve-3d", "progressbar", "progressbar-vertical", "progresschunk", "progresschunk-vertical", "proximity", "radial-gradient", "radio", "radio-container", "radio-label", "radiomenuitem", "range", "range-thumb", "read-only", "read-write", "relative", "repeat", "repeat-x", "repeat-y", "repeating-linear-gradient", "repeating-radial-gradient", "reset-size", "resizer", "resizerpanel", "reverse", "rgb", "rgba", "ridge", "right", "rl", "rl-tb", "round", "row", "row-reverse", "ruby", "ruby-base", "ruby-base-container", "ruby-text", "ruby-text-container", "running", "saturation", "scale-down", "scale-horizontal", "scale-vertical", "scalethumb-horizontal", "scalethumb-vertical", "scalethumbend", "scalethumbstart", "scalethumbtick", "screen", "scroll", "scrollbar", "scrollbar-horizontal", "scrollbar-small", "scrollbar-vertical", "scrollbarbutton-down", "scrollbarbutton-left", "scrollbarbutton-right", "scrollbarbutton-up", "scrollbarthumb-horizontal", "scrollbarthumb-vertical", "scrollbartrack-horizontal", "scrollbartrack-vertical", "searchfield", "select-after", "select-all", "select-before", "select-menu", "select-same", "self-end", "self-start", "semi-condensed", "semi-expanded", "separate", "separator", "show", "sideways", "sideways-lr", "sideways-right", "sideways-rl", "slice", "small", "small-caps", "smaller", "smooth", "soft-light", "solid", "space", "space-around", "space-between", "space-evenly", "spinner", "spinner-downbutton", "spinner-textfield", "spinner-upbutton", "splitter", "square", "srgb", "start", "static", "statusbar", "statusbarpanel", "step-end", "step-start", "steps", "sticky", "stretch", "stretch-to-fit", "stroke", "sub", "subtract", "super", "tab", "tab-scroll-arrow-back", "tab-scroll-arrow-forward", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", "table-row-group", "tabpanel", "tabpanels", "tb", "tb-rl", "text", "text-after-edge", "text-before-edge", "text-bottom", "text-top", "textfield", "textfield-multiline", "thick", "thin", "titling-caps", "toggle", "toolbar", "toolbarbutton", "toolbarbutton-dropdown", "toolbargripper", "toolbox", "tooltip", "top", "top-outside", "transparent", "treeheader", "treeheadercell", "treeheadersortarrow", "treeitem", "treeline", "treetwisty", "treetwistyopen", "treeview", "tri-state", "ultra-condensed", "ultra-expanded", "under", "unicase", "unset", "uppercase", "upright", "url", "use-script", "vertical", "vertical-lr", "vertical-rl", "view-box", "visible", "visiblefill", "visiblepainted", "visiblestroke", "wavy", "window", "wrap", "wrap-reverse", "write-only", "x-large", "x-small", "xx-large", "xx-small"], "supports": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11], "isInherited": false}, "mask-image": {"subproperties": ["mask-image"], "supports": [4, 5, 11], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "isInherited": false}, "-webkit-animation-iteration-count": {"subproperties": ["animation-iteration-count"], "values": ["infinite", "inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "font-feature-settings": {"subproperties": ["font-feature-settings"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "border-block-start-color": {"subproperties": ["border-block-start-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "-webkit-flex-grow": {"subproperties": ["flex-grow"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "scroll-snap-destination": {"subproperties": ["scroll-snap-destination"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-font-language-override": {"subproperties": ["font-language-override"], "values": ["inherit", "initial", "normal", "unset"], "supports": [], "isInherited": true}, "text-emphasis": {"subproperties": ["text-emphasis-style", "text-emphasis-color"], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": true}, "grid-row-gap": {"subproperties": ["grid-row-gap"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "font-variant-east-asian": {"subproperties": ["font-variant-east-asian"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "outline-width": {"subproperties": ["outline-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "-webkit-flex-flow": {"subproperties": ["flex-direction", "flex-wrap"], "values": ["column", "column-reverse", "inherit", "initial", "nowrap", "row", "row-reverse", "unset", "wrap", "wrap-reverse"], "supports": [], "isInherited": false}, "grid-column-gap": {"subproperties": ["grid-column-gap"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "border-inline-start-style": {"subproperties": ["border-inline-start-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "scroll-snap-points-x": {"subproperties": ["scroll-snap-points-x"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "list-style-type": {"subproperties": ["list-style-type"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "padding-inline-end": {"subproperties": ["padding-inline-end"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-animation": {"subproperties": ["animation-duration", "animation-timing-function", "animation-delay", "animation-direction", "animation-fill-mode", "animation-iteration-count", "animation-play-state", "animation-name"], "values": ["alternate", "alternate-reverse", "backwards", "both", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "forwards", "infinite", "inherit", "initial", "linear", "none", "normal", "paused", "reverse", "running", "step-end", "step-start", "steps", "unset"], "supports": [7, 9, 10], "isInherited": false}, "-moz-border-start-width": {"subproperties": ["border-inline-start-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "page-break-before": {"subproperties": ["page-break-before"], "values": ["always", "auto", "avoid", "inherit", "initial", "left", "right", "unset"], "supports": [], "isInherited": false}, "flood-color": {"subproperties": ["flood-color"], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "text-anchor": {"subproperties": ["text-anchor"], "values": ["end", "inherit", "initial", "middle", "start", "unset"], "supports": [], "isInherited": true}, "-moz-box-pack": {"subproperties": ["-moz-box-pack"], "values": ["center", "end", "inherit", "initial", "justify", "start", "unset"], "supports": [], "isInherited": false}, "-webkit-user-select": {"subproperties": ["-moz-user-select"], "values": ["-moz-all", "-moz-none", "-moz-text", "all", "auto", "element", "elements", "inherit", "initial", "none", "text", "toggle", "tri-state", "unset"], "supports": [], "isInherited": false}, "-moz-border-end-style": {"subproperties": ["border-inline-end-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "padding-left": {"subproperties": ["padding-left"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-tab-size": {"subproperties": ["-moz-tab-size"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": true}, "perspective": {"subproperties": ["perspective"], "values": ["inherit", "initial", "none", "unset"], "supports": [6], "isInherited": false}, "max-block-size": {"subproperties": ["max-block-size"], "values": ["-moz-calc", "calc", "inherit", "initial", "none", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-animation-play-state": {"subproperties": ["animation-play-state"], "values": ["inherit", "initial", "paused", "running", "unset"], "supports": [], "isInherited": false}, "-moz-column-fill": {"subproperties": ["-moz-column-fill"], "values": ["auto", "balance", "inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-moz-stack-sizing": {"subproperties": ["-moz-stack-sizing"], "values": ["ignore", "inherit", "initial", "stretch-to-fit", "unset"], "supports": [], "isInherited": false}, "border-image-repeat": {"subproperties": ["border-image-repeat"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "font-variant-position": {"subproperties": ["font-variant-position"], "values": ["inherit", "initial", "normal", "sub", "super", "unset"], "supports": [], "isInherited": true}, "border-right-style": {"subproperties": ["border-right-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "-moz-box-align": {"subproperties": ["-moz-box-align"], "values": ["baseline", "center", "end", "inherit", "initial", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "border-left-style": {"subproperties": ["border-left-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "flex-flow": {"subproperties": ["flex-direction", "flex-wrap"], "values": ["column", "column-reverse", "inherit", "initial", "nowrap", "row", "row-reverse", "unset", "wrap", "wrap-reverse"], "supports": [], "isInherited": false}, "outline-color": {"subproperties": ["outline-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "font-variant-alternates": {"subproperties": ["font-variant-alternates"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "mask-mode": {"subproperties": ["mask-mode"], "supports": [], "values": ["alpha", "inherit", "initial", "luminance", "match-source", "unset"], "isInherited": false}, "flex-grow": {"subproperties": ["flex-grow"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "-moz-font-feature-settings": {"subproperties": ["font-feature-settings"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "-webkit-box-shadow": {"subproperties": ["box-shadow"], "values": ["inherit", "initial", "unset"], "supports": [2, 6], "isInherited": false}, "max-width": {"subproperties": ["max-width"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "calc", "inherit", "initial", "none", "unset"], "supports": [6, 8], "isInherited": false}, "border-inline-end-style": {"subproperties": ["border-inline-end-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "grid-column": {"subproperties": ["grid-column-start", "grid-column-end"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "image-orientation": {"subproperties": ["image-orientation"], "values": ["inherit", "initial", "unset"], "supports": [1], "isInherited": true}, "animation-duration": {"subproperties": ["animation-duration"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "-moz-animation-fill-mode": {"subproperties": ["animation-fill-mode"], "values": ["backwards", "both", "forwards", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "-moz-user-input": {"subproperties": ["-moz-user-input"], "values": ["auto", "disabled", "enabled", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": true}, "-webkit-animation-delay": {"subproperties": ["animation-delay"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "shape-rendering": {"subproperties": ["shape-rendering"], "values": ["auto", "crispedges", "geometricprecision", "inherit", "initial", "optimizespeed", "unset"], "supports": [], "isInherited": true}, "flex-shrink": {"subproperties": ["flex-shrink"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "text-rendering": {"subproperties": ["text-rendering"], "values": ["auto", "geometricprecision", "inherit", "initial", "optimizelegibility", "optimizespeed", "unset"], "supports": [], "isInherited": true}, "align-items": {"subproperties": ["align-items"], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "border-collapse": {"subproperties": ["border-collapse"], "values": ["collapse", "inherit", "initial", "separate", "unset"], "supports": [], "isInherited": true}, "text-combine-upright": {"subproperties": ["text-combine-upright"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "offset-block-end": {"subproperties": ["offset-block-end"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-border-start-color": {"subproperties": ["border-inline-start-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "marker": {"subproperties": ["marker-start", "marker-mid", "marker-end"], "values": ["inherit", "initial", "none", "unset", "url"], "supports": [11], "isInherited": true}, "-webkit-mask-position-y": {"subproperties": ["mask-position-y"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "outline-style": {"subproperties": ["outline-style"], "values": ["auto", "dashed", "dotted", "double", "groove", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "color-interpolation-filters": {"subproperties": ["color-interpolation-filters"], "values": ["auto", "inherit", "initial", "linearrgb", "srgb", "unset"], "supports": [], "isInherited": true}, "-moz-padding-end": {"subproperties": ["padding-inline-end"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "font-stretch": {"subproperties": ["font-stretch"], "values": ["condensed", "expanded", "extra-condensed", "extra-expanded", "inherit", "initial", "normal", "semi-condensed", "semi-expanded", "ultra-condensed", "ultra-expanded", "unset"], "supports": [], "isInherited": true}, "-moz-orient": {"subproperties": ["-moz-orient"], "values": ["block", "horizontal", "inherit", "initial", "inline", "unset", "vertical"], "supports": [], "isInherited": false}, "font-variant": {"subproperties": ["font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position"], "values": ["all-petite-caps", "all-small-caps", "inherit", "initial", "normal", "petite-caps", "small-caps", "sub", "super", "titling-caps", "unicase", "unset"], "supports": [], "isInherited": true}, "-webkit-animation-fill-mode": {"subproperties": ["animation-fill-mode"], "values": ["backwards", "both", "forwards", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "-moz-animation-duration": {"subproperties": ["animation-duration"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "border-left": {"subproperties": ["border-left-width", "border-left-style", "border-left-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "visibility": {"subproperties": ["visibility"], "values": ["collapse", "hidden", "inherit", "initial", "unset", "visible"], "supports": [], "isInherited": true}, "-moz-user-focus": {"subproperties": ["-moz-user-focus"], "values": ["ignore", "inherit", "initial", "none", "normal", "select-after", "select-all", "select-before", "select-menu", "select-same", "unset"], "supports": [], "isInherited": true}, "transform-box": {"subproperties": ["transform-box"], "values": ["border-box", "fill-box", "inherit", "initial", "unset", "view-box"], "supports": [], "isInherited": false}, "font-variant-caps": {"subproperties": ["font-variant-caps"], "values": ["all-petite-caps", "all-small-caps", "inherit", "initial", "normal", "petite-caps", "small-caps", "titling-caps", "unicase", "unset"], "supports": [], "isInherited": true}, "resize": {"subproperties": ["resize"], "values": ["both", "horizontal", "inherit", "initial", "none", "unset", "vertical"], "supports": [], "isInherited": false}, "offset-inline-end": {"subproperties": ["offset-inline-end"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "paint-order": {"subproperties": ["paint-order"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "stroke-linecap": {"subproperties": ["stroke-linecap"], "values": ["butt", "inherit", "initial", "round", "square", "unset"], "supports": [], "isInherited": true}, "animation-direction": {"subproperties": ["animation-direction"], "values": ["alternate", "alternate-reverse", "inherit", "initial", "normal", "reverse", "unset"], "supports": [], "isInherited": false}, "border-top-left-radius": {"subproperties": ["border-top-left-radius"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-box-align": {"subproperties": ["-moz-box-align"], "values": ["baseline", "center", "end", "inherit", "initial", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "-moz-text-size-adjust": {"subproperties": ["-moz-text-size-adjust"], "values": ["auto", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": true}, "list-style": {"subproperties": ["list-style-type", "list-style-image", "list-style-position"], "values": ["inherit", "initial", "inside", "none", "outside", "unset", "url"], "supports": [11], "isInherited": true}, "stroke": {"subproperties": ["stroke"], "values": ["inherit", "initial", "unset"], "supports": [2, 11], "isInherited": true}, "text-decoration-line": {"subproperties": ["text-decoration-line"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-webkit-background-size": {"subproperties": ["background-size"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "padding-bottom": {"subproperties": ["padding-bottom"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "border-image-slice": {"subproperties": ["border-image-slice"], "values": ["inherit", "initial", "unset"], "supports": [7, 8], "isInherited": false}, "-webkit-transition-delay": {"subproperties": ["transition-delay"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "background-repeat": {"subproperties": ["background-repeat"], "values": ["inherit", "initial", "no-repeat", "repeat", "repeat-x", "repeat-y", "round", "space", "unset"], "supports": [], "isInherited": false}, "flex-basis": {"subproperties": ["flex-basis"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-border-right-colors": {"subproperties": ["-moz-border-right-colors"], "values": ["inherit", "initial", "unset"], "supports": [2], "isInherited": false}, "-moz-image-region": {"subproperties": ["-moz-image-region"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "-webkit-transform-origin": {"subproperties": ["transform-origin"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "vector-effect": {"subproperties": ["vector-effect"], "values": ["inherit", "initial", "non-scaling-stroke", "none", "unset"], "supports": [], "isInherited": false}, "-moz-margin-end": {"subproperties": ["margin-inline-end"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-border-image": {"subproperties": ["border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat"], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "supports": [4, 5, 6, 7, 8, 11], "isInherited": false}, "-moz-border-end-color": {"subproperties": ["border-inline-end-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "ruby-position": {"subproperties": ["ruby-position"], "values": ["inherit", "initial", "over", "under", "unset"], "supports": [], "isInherited": true}, "inline-size": {"subproperties": ["inline-size"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "outline": {"subproperties": ["outline-width", "outline-style", "outline-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "auto", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "text-decoration": {"subproperties": ["text-decoration-color", "text-decoration-line", "text-decoration-style"], "values": ["COLOR", "-moz-none", "-moz-use-text-color", "currentColor", "dashed", "dotted", "double", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "solid", "transparent", "unset", "wavy"], "supports": [2], "isInherited": false}, "transition-duration": {"subproperties": ["transition-duration"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "order": {"subproperties": ["order"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "ime-mode": {"subproperties": ["ime-mode"], "values": ["active", "auto", "disabled", "inactive", "inherit", "initial", "normal", "unset"], "supports": [], "isInherited": false}, "counter-reset": {"subproperties": ["counter-reset"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "flood-opacity": {"subproperties": ["flood-opacity"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "flex-direction": {"subproperties": ["flex-direction"], "values": ["column", "column-reverse", "inherit", "initial", "row", "row-reverse", "unset"], "supports": [], "isInherited": false}, "-webkit-text-stroke-width": {"subproperties": ["-webkit-text-stroke-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": true}, "font-variant-numeric": {"subproperties": ["font-variant-numeric"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "-webkit-flex-wrap": {"subproperties": ["flex-wrap"], "values": ["inherit", "initial", "nowrap", "unset", "wrap", "wrap-reverse"], "supports": [], "isInherited": false}, "min-height": {"subproperties": ["min-height"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "left": {"subproperties": ["left"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-mask": {"subproperties": ["mask-image", "mask-repeat", "mask-position-x", "mask-position-y", "mask-clip", "mask-origin", "mask-size", "mask-composite", "mask-mode"], "supports": [4, 5, 6, 8, 11], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "add", "alpha", "border-box", "content-box", "exclude", "inherit", "initial", "intersect", "linear-gradient", "luminance", "match-source", "no-repeat", "none", "padding-box", "radial-gradient", "repeat", "repeat-x", "repeat-y", "repeating-linear-gradient", "repeating-radial-gradient", "round", "space", "subtract", "unset", "url"], "isInherited": false}, "stroke-width": {"subproperties": ["stroke-width"], "values": ["inherit", "initial", "unset"], "supports": [6, 7, 8], "isInherited": true}, "-moz-hyphens": {"subproperties": ["hyphens"], "values": ["auto", "inherit", "initial", "manual", "none", "unset"], "supports": [], "isInherited": true}, "background-origin": {"subproperties": ["background-origin"], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "supports": [], "isInherited": false}, "-moz-box-direction": {"subproperties": ["-moz-box-direction"], "values": ["inherit", "initial", "normal", "reverse", "unset"], "supports": [], "isInherited": false}, "border-inline-end-color": {"subproperties": ["border-inline-end-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "marker-offset": {"subproperties": ["marker-offset"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6], "isInherited": false}, "-webkit-background-clip": {"subproperties": ["background-clip"], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "text", "unset"], "supports": [], "isInherited": false}, "border-radius": {"subproperties": ["border-top-left-radius", "border-top-right-radius", "border-bottom-right-radius", "border-bottom-left-radius"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "flex": {"subproperties": ["flex-grow", "flex-shrink", "flex-basis"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 7, 8], "isInherited": false}, "margin-inline-end": {"subproperties": ["margin-inline-end"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-appearance": {"subproperties": ["-moz-appearance"], "values": ["-moz-gtk-info-bar", "-moz-mac-disclosure-button-closed", "-moz-mac-disclosure-button-open", "-moz-mac-fullscreen-button", "-moz-mac-help-button", "-moz-mac-source-list", "-moz-mac-vibrancy-dark", "-moz-mac-vibrancy-light", "-moz-win-borderless-glass", "-moz-win-browsertabbar-toolbox", "-moz-win-communications-toolbox", "-moz-win-exclude-glass", "-moz-win-glass", "-moz-win-media-toolbox", "-moz-window-button-box", "-moz-window-button-box-maximized", "-moz-window-button-close", "-moz-window-button-maximize", "-moz-window-button-minimize", "-moz-window-button-restore", "-moz-window-frame-bottom", "-moz-window-frame-left", "-moz-window-frame-right", "-moz-window-titlebar", "-moz-window-titlebar-maximized", "button", "button-arrow-down", "button-arrow-next", "button-arrow-previous", "button-arrow-up", "button-bevel", "button-focus", "caret", "checkbox", "checkbox-container", "checkbox-label", "checkmenuitem", "dialog", "dualbutton", "groupbox", "inherit", "initial", "listbox", "listitem", "menuarrow", "menubar", "menucheckbox", "menuimage", "menuitem", "menuitemtext", "menulist", "menulist-button", "menulist-text", "menulist-textfield", "menupopup", "menuradio", "menuseparator", "meterbar", "meterchunk", "none", "number-input", "progressbar", "progressbar-vertical", "progresschunk", "progresschunk-vertical", "radio", "radio-container", "radio-label", "radiomenuitem", "range", "range-thumb", "resizer", "resizerpanel", "scale-horizontal", "scale-vertical", "scalethumb-horizontal", "scalethumb-vertical", "scalethumbend", "scalethumbstart", "scalethumbtick", "scrollbar", "scrollbar-horizontal", "scrollbar-small", "scrollbar-vertical", "scrollbarbutton-down", "scrollbarbutton-left", "scrollbarbutton-right", "scrollbarbutton-up", "scrollbarthumb-horizontal", "scrollbarthumb-vertical", "scrollbartrack-horizontal", "scrollbartrack-vertical", "searchfield", "separator", "spinner", "spinner-downbutton", "spinner-textfield", "spinner-upbutton", "splitter", "statusbar", "statusbarpanel", "tab", "tab-scroll-arrow-back", "tab-scroll-arrow-forward", "tabpanel", "tabpanels", "textfield", "textfield-multiline", "toolbar", "toolbarbutton", "toolbarbutton-dropdown", "toolbargripper", "toolbox", "tooltip", "treeheader", "treeheadercell", "treeheadersortarrow", "treeitem", "treeline", "treetwisty", "treetwistyopen", "treeview", "unset", "window"], "supports": [], "isInherited": false}, "box-decoration-break": {"subproperties": ["box-decoration-break"], "values": ["clone", "inherit", "initial", "slice", "unset"], "supports": [], "isInherited": false}, "text-indent": {"subproperties": ["text-indent"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": true}, "hyphens": {"subproperties": ["hyphens"], "values": ["auto", "inherit", "initial", "manual", "none", "unset"], "supports": [], "isInherited": true}, "-moz-perspective": {"subproperties": ["perspective"], "values": ["inherit", "initial", "none", "unset"], "supports": [6], "isInherited": false}, "-webkit-animation-timing-function": {"subproperties": ["animation-timing-function"], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "supports": [10], "isInherited": false}, "text-transform": {"subproperties": ["text-transform"], "values": ["capitalize", "full-width", "inherit", "initial", "lowercase", "none", "unset", "uppercase"], "supports": [], "isInherited": true}, "font-size": {"subproperties": ["font-size"], "values": ["-moz-calc", "calc", "inherit", "initial", "large", "larger", "medium", "small", "smaller", "unset", "x-large", "x-small", "xx-large", "xx-small"], "supports": [6, 8], "isInherited": true}, "-webkit-animation-name": {"subproperties": ["animation-name"], "values": ["inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "-moz-border-start": {"subproperties": ["border-inline-start-width", "border-inline-start-style", "border-inline-start-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "mask-composite": {"subproperties": ["mask-composite"], "supports": [], "values": ["add", "exclude", "inherit", "initial", "intersect", "subtract", "unset"], "isInherited": false}, "-webkit-text-stroke": {"subproperties": ["-webkit-text-stroke-width", "-webkit-text-stroke-color"], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "hsl", "hsla", "inherit", "initial", "medium", "rgb", "rgba", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": true}, "padding-top": {"subproperties": ["padding-top"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-flex-shrink": {"subproperties": ["flex-shrink"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "color-adjust": {"subproperties": ["color-adjust"], "values": ["economy", "exact", "inherit", "initial", "unset"], "supports": [], "isInherited": true}, "grid-template-rows": {"subproperties": ["grid-template-rows"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "content": {"subproperties": ["content"], "values": ["inherit", "initial", "unset"], "supports": [11], "isInherited": false}, "padding-right": {"subproperties": ["padding-right"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-transform": {"subproperties": ["transform"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "marker-mid": {"subproperties": ["marker-mid"], "values": ["inherit", "initial", "none", "unset", "url"], "supports": [11], "isInherited": true}, "-moz-column-gap": {"subproperties": ["-moz-column-gap"], "values": ["-moz-calc", "calc", "inherit", "initial", "normal", "unset"], "supports": [6], "isInherited": false}, "-moz-border-start-style": {"subproperties": ["border-inline-start-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "clip-rule": {"subproperties": ["clip-rule"], "values": ["evenodd", "inherit", "initial", "nonzero", "unset"], "supports": [], "isInherited": true}, "font-family": {"subproperties": ["font-family"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "block-size": {"subproperties": ["block-size"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "offset-inline-start": {"subproperties": ["offset-inline-start"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "padding-block-end": {"subproperties": ["padding-block-end"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "transition": {"subproperties": ["transition-property", "transition-duration", "transition-timing-function", "transition-delay"], "values": ["all", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "none", "step-end", "step-start", "steps", "unset"], "supports": [9, 10], "isInherited": false}, "filter": {"subproperties": ["filter"], "values": ["inherit", "initial", "unset"], "supports": [11], "isInherited": false}, "border-right-width": {"subproperties": ["border-right-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "-webkit-flex-direction": {"subproperties": ["flex-direction"], "values": ["column", "column-reverse", "inherit", "initial", "row", "row-reverse", "unset"], "supports": [], "isInherited": false}, "-webkit-mask-composite": {"subproperties": ["mask-composite"], "supports": [], "values": ["add", "exclude", "inherit", "initial", "intersect", "subtract", "unset"], "isInherited": false}, "mix-blend-mode": {"subproperties": ["mix-blend-mode"], "values": ["color", "color-burn", "color-dodge", "darken", "difference", "exclusion", "hard-light", "hue", "inherit", "initial", "lighten", "luminosity", "multiply", "normal", "overlay", "saturation", "screen", "soft-light", "unset"], "supports": [], "isInherited": false}, "color-interpolation": {"subproperties": ["color-interpolation"], "values": ["auto", "inherit", "initial", "linearrgb", "srgb", "unset"], "supports": [], "isInherited": true}, "border-top-style": {"subproperties": ["border-top-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "fill-opacity": {"subproperties": ["fill-opacity"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": true}, "marker-start": {"subproperties": ["marker-start"], "values": ["inherit", "initial", "none", "unset", "url"], "supports": [11], "isInherited": true}, "border-bottom-width": {"subproperties": ["border-bottom-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "-moz-column-rule-style": {"subproperties": ["-moz-column-rule-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "clear": {"subproperties": ["clear"], "values": ["both", "inherit", "initial", "inline-end", "inline-start", "left", "none", "right", "unset"], "supports": [], "isInherited": false}, "grid-area": {"subproperties": ["grid-row-start", "grid-column-start", "grid-row-end", "grid-column-end"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "padding-inline-start": {"subproperties": ["padding-inline-start"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-border-end": {"subproperties": ["border-inline-end-width", "border-inline-end-style", "border-inline-end-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "background-clip": {"subproperties": ["background-clip"], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "text", "unset"], "supports": [], "isInherited": false}, "-webkit-text-fill-color": {"subproperties": ["-webkit-text-fill-color"], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": true}, "border-block-start-style": {"subproperties": ["border-block-start-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "top": {"subproperties": ["top"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "border-width": {"subproperties": ["border-top-width", "border-right-width", "border-bottom-width", "border-left-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "max-inline-size": {"subproperties": ["max-inline-size"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "calc", "inherit", "initial", "none", "unset"], "supports": [6, 8], "isInherited": false}, "border-inline-start-width": {"subproperties": ["border-inline-start-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "-moz-box-flex": {"subproperties": ["-moz-box-flex"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "animation-play-state": {"subproperties": ["animation-play-state"], "values": ["inherit", "initial", "paused", "running", "unset"], "supports": [], "isInherited": false}, "padding": {"subproperties": ["padding-top", "padding-right", "padding-bottom", "padding-left"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "dominant-baseline": {"subproperties": ["dominant-baseline"], "values": ["alphabetic", "auto", "central", "hanging", "ideographic", "inherit", "initial", "mathematical", "middle", "no-change", "reset-size", "text-after-edge", "text-before-edge", "unset", "use-script"], "supports": [], "isInherited": false}, "background-attachment": {"subproperties": ["background-attachment"], "values": ["fixed", "inherit", "initial", "local", "scroll", "unset"], "supports": [], "isInherited": false}, "-webkit-box-sizing": {"subproperties": ["box-sizing"], "values": ["border-box", "content-box", "inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-webkit-box-flex": {"subproperties": ["-moz-box-flex"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "text-orientation": {"subproperties": ["text-orientation"], "values": ["inherit", "initial", "mixed", "sideways", "sideways-right", "unset", "upright"], "supports": [], "isInherited": true}, "-moz-margin-start": {"subproperties": ["margin-inline-start"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "isolation": {"subproperties": ["isolation"], "values": ["auto", "inherit", "initial", "isolate", "unset"], "supports": [], "isInherited": false}, "-moz-border-bottom-colors": {"subproperties": ["-moz-border-bottom-colors"], "values": ["inherit", "initial", "unset"], "supports": [2], "isInherited": false}, "-moz-column-rule-width": {"subproperties": ["-moz-column-rule-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "scroll-snap-type-y": {"subproperties": ["scroll-snap-type-y"], "values": ["inherit", "initial", "mandatory", "none", "proximity", "unset"], "supports": [], "isInherited": false}, "-webkit-border-bottom-right-radius": {"subproperties": ["border-bottom-right-radius"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-column-count": {"subproperties": ["-moz-column-count"], "values": ["auto", "inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "border-left-width": {"subproperties": ["border-left-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "grid-column-end": {"subproperties": ["grid-column-end"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "background-blend-mode": {"subproperties": ["background-blend-mode"], "values": ["color", "color-burn", "color-dodge", "darken", "difference", "exclusion", "hard-light", "hue", "inherit", "initial", "lighten", "luminosity", "multiply", "normal", "overlay", "saturation", "screen", "soft-light", "unset"], "supports": [], "isInherited": false}, "vertical-align": {"subproperties": ["vertical-align"], "values": ["-moz-calc", "-moz-middle-with-baseline", "baseline", "bottom", "calc", "inherit", "initial", "middle", "sub", "super", "text-bottom", "text-top", "top", "unset"], "supports": [6, 8], "isInherited": false}, "clip": {"subproperties": ["clip"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "grid-auto-rows": {"subproperties": ["grid-auto-rows"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "margin-left": {"subproperties": ["margin-left"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "animation-name": {"subproperties": ["animation-name"], "values": ["inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "border-image-source": {"subproperties": ["border-image-source"], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "supports": [4, 5, 11], "isInherited": false}, "border": {"subproperties": ["border-top-width", "border-right-width", "border-bottom-width", "border-left-width", "border-top-style", "border-right-style", "border-bottom-style", "border-left-style", "border-top-color", "border-right-color", "border-bottom-color", "border-left-color", "-moz-border-top-colors", "-moz-border-right-colors", "-moz-border-bottom-colors", "-moz-border-left-colors", "border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat"], "values": ["COLOR", "-moz-calc", "-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "linear-gradient", "medium", "none", "outset", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset", "url"], "supports": [2, 6], "isInherited": false}, "-webkit-transition-timing-function": {"subproperties": ["transition-timing-function"], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "supports": [10], "isInherited": false}, "margin-bottom": {"subproperties": ["margin-bottom"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "animation": {"subproperties": ["animation-duration", "animation-timing-function", "animation-delay", "animation-direction", "animation-fill-mode", "animation-iteration-count", "animation-play-state", "animation-name"], "values": ["alternate", "alternate-reverse", "backwards", "both", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "forwards", "infinite", "inherit", "initial", "linear", "none", "normal", "paused", "reverse", "running", "step-end", "step-start", "steps", "unset"], "supports": [7, 9, 10], "isInherited": false}, "font-weight": {"subproperties": ["font-weight"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": true}, "border-block-start-width": {"subproperties": ["border-block-start-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "mask-type": {"subproperties": ["mask-type"], "values": ["alpha", "inherit", "initial", "luminance", "unset"], "supports": [], "isInherited": false}, "margin-block-end": {"subproperties": ["margin-block-end"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "min-inline-size": {"subproperties": ["min-inline-size"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "object-position": {"subproperties": ["object-position"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "page-break-after": {"subproperties": ["page-break-after"], "values": ["always", "auto", "avoid", "inherit", "initial", "left", "right", "unset"], "supports": [], "isInherited": false}, "transition-property": {"subproperties": ["transition-property"], "values": ["all", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "-moz-float-edge": {"subproperties": ["-moz-float-edge"], "values": ["content-box", "inherit", "initial", "margin-box", "unset"], "supports": [], "isInherited": false}, "white-space": {"subproperties": ["white-space"], "values": ["-moz-pre-space", "inherit", "initial", "normal", "nowrap", "pre", "pre-line", "pre-wrap", "unset"], "supports": [], "isInherited": true}, "-moz-binding": {"subproperties": ["-moz-binding"], "values": ["inherit", "initial", "none", "unset", "url"], "supports": [11], "isInherited": false}, "ruby-align": {"subproperties": ["ruby-align"], "values": ["center", "inherit", "initial", "space-around", "space-between", "start", "unset"], "supports": [], "isInherited": true}, "font-kerning": {"subproperties": ["font-kerning"], "values": ["auto", "inherit", "initial", "none", "normal", "unset"], "supports": [], "isInherited": true}, "border-block-end": {"subproperties": ["border-block-end-width", "border-block-end-style", "border-block-end-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "animation-timing-function": {"subproperties": ["animation-timing-function"], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "supports": [10], "isInherited": false}, "-webkit-border-radius": {"subproperties": ["border-top-left-radius", "border-top-right-radius", "border-bottom-right-radius", "border-bottom-left-radius"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "animation-iteration-count": {"subproperties": ["animation-iteration-count"], "values": ["infinite", "inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "-webkit-animation-direction": {"subproperties": ["animation-direction"], "values": ["alternate", "alternate-reverse", "inherit", "initial", "normal", "reverse", "unset"], "supports": [], "isInherited": false}, "justify-self": {"subproperties": ["justify-self"], "values": ["auto", "baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "-moz-border-top-colors": {"subproperties": ["-moz-border-top-colors"], "values": ["inherit", "initial", "unset"], "supports": [2], "isInherited": false}, "transition-timing-function": {"subproperties": ["transition-timing-function"], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "supports": [10], "isInherited": false}, "-moz-transition-duration": {"subproperties": ["transition-duration"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "scroll-snap-coordinate": {"subproperties": ["scroll-snap-coordinate"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-box-orient": {"subproperties": ["-moz-box-orient"], "values": ["block-axis", "horizontal", "inherit", "initial", "inline-axis", "unset", "vertical"], "supports": [], "isInherited": false}, "counter-increment": {"subproperties": ["counter-increment"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-webkit-transform-style": {"subproperties": ["transform-style"], "values": ["flat", "inherit", "initial", "preserve-3d", "unset"], "supports": [], "isInherited": false}, "-moz-transition-timing-function": {"subproperties": ["transition-timing-function"], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "supports": [10], "isInherited": false}, "grid-auto-columns": {"subproperties": ["grid-auto-columns"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-align-content": {"subproperties": ["align-content"], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "space-around", "space-between", "space-evenly", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "font": {"subproperties": ["font-family", "font-style", "font-weight", "font-size", "line-height", "font-size-adjust", "font-stretch", "-x-system-font", "font-feature-settings", "font-language-override", "font-kerning", "font-synthesis", "font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position"], "values": ["-moz-block-height", "-moz-calc", "all-petite-caps", "all-small-caps", "auto", "calc", "condensed", "expanded", "extra-condensed", "extra-expanded", "inherit", "initial", "italic", "large", "larger", "medium", "none", "normal", "oblique", "petite-caps", "semi-condensed", "semi-expanded", "small", "small-caps", "smaller", "sub", "super", "titling-caps", "ultra-condensed", "ultra-expanded", "unicase", "unset", "x-large", "x-small", "xx-large", "xx-small"], "supports": [6, 7, 8], "isInherited": true}, "flex-wrap": {"subproperties": ["flex-wrap"], "values": ["inherit", "initial", "nowrap", "unset", "wrap", "wrap-reverse"], "supports": [], "isInherited": false}, "grid-row-start": {"subproperties": ["grid-row-start"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "list-style-image": {"subproperties": ["list-style-image"], "values": ["inherit", "initial", "none", "unset", "url"], "supports": [11], "isInherited": true}, "text-emphasis-position": {"subproperties": ["text-emphasis-position"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "border-right": {"subproperties": ["border-right-width", "border-right-style", "border-right-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "font-style": {"subproperties": ["font-style"], "values": ["inherit", "initial", "italic", "normal", "oblique", "unset"], "supports": [], "isInherited": true}, "box-shadow": {"subproperties": ["box-shadow"], "values": ["inherit", "initial", "unset"], "supports": [2, 6], "isInherited": false}, "align-self": {"subproperties": ["align-self"], "values": ["auto", "baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "text-emphasis-color": {"subproperties": ["text-emphasis-color"], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": true}, "border-bottom": {"subproperties": ["border-bottom-width", "border-bottom-style", "border-bottom-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "border-spacing": {"subproperties": ["border-spacing"], "values": ["inherit", "initial", "unset"], "supports": [6], "isInherited": true}, "-webkit-border-top-right-radius": {"subproperties": ["border-top-right-radius"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "margin-inline-start": {"subproperties": ["margin-inline-start"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "grid-row-end": {"subproperties": ["grid-row-end"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "perspective-origin": {"subproperties": ["perspective-origin"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "page-break-inside": {"subproperties": ["page-break-inside"], "values": ["auto", "avoid", "inherit", "initial", "unset"], "supports": [], "isInherited": false}, "scroll-behavior": {"subproperties": ["scroll-behavior"], "values": ["auto", "inherit", "initial", "smooth", "unset"], "supports": [], "isInherited": false}, "-moz-backface-visibility": {"subproperties": ["backface-visibility"], "values": ["hidden", "inherit", "initial", "unset", "visible"], "supports": [], "isInherited": false}, "-moz-outline-radius": {"subproperties": ["-moz-outline-radius-topleft", "-moz-outline-radius-topright", "-moz-outline-radius-bottomright", "-moz-outline-radius-bottomleft"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "mask-clip": {"subproperties": ["mask-clip"], "supports": [], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "isInherited": false}, "grid-row": {"subproperties": ["grid-row-start", "grid-row-end"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "border-bottom-right-radius": {"subproperties": ["border-bottom-right-radius"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "line-height": {"subproperties": ["line-height"], "values": ["-moz-block-height", "-moz-calc", "calc", "inherit", "initial", "normal", "unset"], "supports": [6, 7, 8], "isInherited": true}, "stroke-linejoin": {"subproperties": ["stroke-linejoin"], "values": ["bevel", "inherit", "initial", "miter", "round", "unset"], "supports": [], "isInherited": true}, "text-align-last": {"subproperties": ["text-align-last"], "values": ["auto", "center", "end", "inherit", "initial", "justify", "left", "right", "start", "unset"], "supports": [], "isInherited": true}, "word-spacing": {"subproperties": ["word-spacing"], "values": ["-moz-calc", "calc", "inherit", "initial", "normal", "unset"], "supports": [6, 8], "isInherited": true}, "transform-style": {"subproperties": ["transform-style"], "values": ["flat", "inherit", "initial", "preserve-3d", "unset"], "supports": [], "isInherited": false}, "border-bottom-color": {"subproperties": ["border-bottom-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "font-language-override": {"subproperties": ["font-language-override"], "values": ["inherit", "initial", "normal", "unset"], "supports": [], "isInherited": true}, "-moz-outline-radius-topleft": {"subproperties": ["-moz-outline-radius-topleft"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "border-image": {"subproperties": ["border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat"], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "supports": [4, 5, 6, 7, 8, 11], "isInherited": false}, "caption-side": {"subproperties": ["caption-side"], "values": ["bottom", "bottom-outside", "inherit", "initial", "left", "right", "top", "top-outside", "unset"], "supports": [], "isInherited": true}, "-webkit-mask-position": {"subproperties": ["mask-position-x", "mask-position-y"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-inline-end-width": {"subproperties": ["border-inline-end-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "-webkit-border-image": {"subproperties": ["border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat"], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "supports": [4, 5, 6, 7, 8, 11], "isInherited": false}, "font-synthesis": {"subproperties": ["font-synthesis"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "grid-template": {"subproperties": ["grid-template-areas", "grid-template-rows", "grid-template-columns"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-mask-repeat": {"subproperties": ["mask-repeat"], "supports": [], "values": ["inherit", "initial", "no-repeat", "repeat", "repeat-x", "repeat-y", "round", "space", "unset"], "isInherited": false}, "-webkit-justify-content": {"subproperties": ["justify-content"], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "space-around", "space-between", "space-evenly", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "text-decoration-color": {"subproperties": ["text-decoration-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "color": {"subproperties": ["color"], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": true}, "-moz-border-end-width": {"subproperties": ["border-inline-end-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "height": {"subproperties": ["height"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "margin-right": {"subproperties": ["margin-right"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-border-bottom-left-radius": {"subproperties": ["border-bottom-left-radius"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-transform": {"subproperties": ["transform"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "border-bottom-left-radius": {"subproperties": ["border-bottom-left-radius"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "fill-rule": {"subproperties": ["fill-rule"], "values": ["evenodd", "inherit", "initial", "nonzero", "unset"], "supports": [], "isInherited": true}, "min-width": {"subproperties": ["min-width"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "empty-cells": {"subproperties": ["empty-cells"], "values": ["hide", "inherit", "initial", "show", "unset"], "supports": [], "isInherited": true}, "direction": {"subproperties": ["direction"], "values": ["inherit", "initial", "ltr", "rtl", "unset"], "supports": [], "isInherited": true}, "clip-path": {"subproperties": ["clip-path"], "values": ["inherit", "initial", "unset"], "supports": [11], "isInherited": false}, "-webkit-mask-size": {"subproperties": ["mask-size"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-box-orient": {"subproperties": ["-moz-box-orient"], "values": ["block-axis", "horizontal", "inherit", "initial", "inline-axis", "unset", "vertical"], "supports": [], "isInherited": false}, "z-index": {"subproperties": ["z-index"], "values": ["auto", "inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "background-position-y": {"subproperties": ["background-position-y"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "text-decoration-style": {"subproperties": ["text-decoration-style"], "values": ["-moz-none", "dashed", "dotted", "double", "inherit", "initial", "solid", "unset", "wavy"], "supports": [], "isInherited": false}, "grid-template-areas": {"subproperties": ["grid-template-areas"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-moz-perspective-origin": {"subproperties": ["perspective-origin"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-animation-direction": {"subproperties": ["animation-direction"], "values": ["alternate", "alternate-reverse", "inherit", "initial", "normal", "reverse", "unset"], "supports": [], "isInherited": false}, "font-size-adjust": {"subproperties": ["font-size-adjust"], "values": ["inherit", "initial", "none", "unset"], "supports": [7], "isInherited": true}, "cursor": {"subproperties": ["cursor"], "values": ["inherit", "initial", "unset"], "supports": [11], "isInherited": true}, "margin": {"subproperties": ["margin-top", "margin-right", "margin-bottom", "margin-left"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-animation": {"subproperties": ["animation-duration", "animation-timing-function", "animation-delay", "animation-direction", "animation-fill-mode", "animation-iteration-count", "animation-play-state", "animation-name"], "values": ["alternate", "alternate-reverse", "backwards", "both", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "forwards", "infinite", "inherit", "initial", "linear", "none", "normal", "paused", "reverse", "running", "step-end", "step-start", "steps", "unset"], "supports": [7, 9, 10], "isInherited": false}, "-moz-control-character-visibility": {"subproperties": ["-moz-control-character-visibility"], "values": ["hidden", "inherit", "initial", "unset", "visible"], "supports": [], "isInherited": true}, "letter-spacing": {"subproperties": ["letter-spacing"], "values": ["-moz-calc", "calc", "inherit", "initial", "normal", "unset"], "supports": [6], "isInherited": true}, "-moz-transition-delay": {"subproperties": ["transition-delay"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "will-change": {"subproperties": ["will-change"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "transform-origin": {"subproperties": ["transform-origin"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "font-variant-ligatures": {"subproperties": ["font-variant-ligatures"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "padding-block-start": {"subproperties": ["padding-block-start"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-animation-duration": {"subproperties": ["animation-duration"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "border-block-end-width": {"subproperties": ["border-block-end-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "-webkit-mask-origin": {"subproperties": ["mask-origin"], "supports": [], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "isInherited": false}, "word-break": {"subproperties": ["word-break"], "values": ["break-all", "inherit", "initial", "keep-all", "normal", "unset"], "supports": [], "isInherited": true}, "table-layout": {"subproperties": ["table-layout"], "values": ["auto", "fixed", "inherit", "initial", "unset"], "supports": [], "isInherited": false}, "text-overflow": {"subproperties": ["text-overflow"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-webkit-flex": {"subproperties": ["flex-grow", "flex-shrink", "flex-basis"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 7, 8], "isInherited": false}, "grid-auto-flow": {"subproperties": ["grid-auto-flow"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "border-top-right-radius": {"subproperties": ["border-top-right-radius"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "border-image-outset": {"subproperties": ["border-image-outset"], "values": ["inherit", "initial", "unset"], "supports": [6, 7], "isInherited": false}, "mask-size": {"subproperties": ["mask-size"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "touch-action": {"subproperties": ["touch-action"], "values": ["auto", "inherit", "initial", "manipulation", "none", "pan-x", "pan-y", "unset"], "supports": [], "isInherited": false}, "border-right-color": {"subproperties": ["border-right-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "backface-visibility": {"subproperties": ["backface-visibility"], "values": ["hidden", "inherit", "initial", "unset", "visible"], "supports": [], "isInherited": false}, "background-image": {"subproperties": ["background-image"], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "supports": [4, 5, 11], "isInherited": false}, "-moz-box-ordinal-group": {"subproperties": ["-moz-box-ordinal-group"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "-webkit-transition-property": {"subproperties": ["transition-property"], "values": ["all", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "writing-mode": {"subproperties": ["writing-mode"], "values": ["horizontal-tb", "inherit", "initial", "lr", "lr-tb", "rl", "rl-tb", "sideways-lr", "sideways-rl", "tb", "tb-rl", "unset", "vertical-lr", "vertical-rl"], "supports": [], "isInherited": true}, "stroke-opacity": {"subproperties": ["stroke-opacity"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": true}, "box-sizing": {"subproperties": ["box-sizing"], "values": ["border-box", "content-box", "inherit", "initial", "unset"], "supports": [], "isInherited": false}, "margin-top": {"subproperties": ["margin-top"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "position": {"subproperties": ["position"], "values": ["absolute", "fixed", "inherit", "initial", "relative", "static", "sticky", "unset"], "supports": [], "isInherited": false}, "list-style-position": {"subproperties": ["list-style-position"], "values": ["inherit", "initial", "inside", "outside", "unset"], "supports": [], "isInherited": true}, "-webkit-box-pack": {"subproperties": ["-moz-box-pack"], "values": ["center", "end", "inherit", "initial", "justify", "start", "unset"], "supports": [], "isInherited": false}, "quotes": {"subproperties": ["quotes"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "border-top": {"subproperties": ["border-top-width", "border-top-style", "border-top-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "-moz-animation-delay": {"subproperties": ["animation-delay"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "-webkit-transition": {"subproperties": ["transition-property", "transition-duration", "transition-timing-function", "transition-delay"], "values": ["all", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "none", "step-end", "step-start", "steps", "unset"], "supports": [9, 10], "isInherited": false}, "-moz-window-dragging": {"subproperties": ["-moz-window-dragging"], "values": ["default", "drag", "inherit", "initial", "no-drag", "unset"], "supports": [], "isInherited": false}, "lighting-color": {"subproperties": ["lighting-color"], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "background-size": {"subproperties": ["background-size"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-border-top-left-radius": {"subproperties": ["border-top-left-radius"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-outline-radius-bottomleft": {"subproperties": ["-moz-outline-radius-bottomleft"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "mask-position-x": {"subproperties": ["mask-position-x"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "mask-position-y": {"subproperties": ["mask-position-y"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "justify-content": {"subproperties": ["justify-content"], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "space-around", "space-between", "space-evenly", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "animation-fill-mode": {"subproperties": ["animation-fill-mode"], "values": ["backwards", "both", "forwards", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "-webkit-filter": {"subproperties": ["filter"], "values": ["inherit", "initial", "unset"], "supports": [11], "isInherited": false}, "word-wrap": {"subproperties": ["overflow-wrap"], "values": ["break-word", "inherit", "initial", "normal", "unset"], "supports": [], "isInherited": true}, "grid": {"subproperties": ["grid-template-areas", "grid-template-rows", "grid-template-columns", "grid-auto-flow", "grid-auto-rows", "grid-auto-columns", "grid-row-gap", "grid-column-gap"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "background": {"subproperties": ["background-color", "background-image", "background-repeat", "background-attachment", "background-clip", "background-origin", "background-position-x", "background-position-y", "background-size"], "values": ["COLOR", "-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "border-box", "content-box", "currentColor", "fixed", "hsl", "hsla", "inherit", "initial", "linear-gradient", "local", "no-repeat", "none", "padding-box", "radial-gradient", "repeat", "repeat-x", "repeat-y", "repeating-linear-gradient", "repeating-radial-gradient", "rgb", "rgba", "round", "scroll", "space", "text", "transparent", "unset", "url"], "supports": [2, 4, 5, 6, 8, 11], "isInherited": false}, "margin-block-start": {"subproperties": ["margin-block-start"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "grid-column-start": {"subproperties": ["grid-column-start"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "text-align": {"subproperties": ["text-align"], "values": ["-moz-center", "-moz-left", "-moz-right", "center", "end", "inherit", "initial", "justify", "left", "right", "start", "unset"], "supports": [], "isInherited": true}, "marker-end": {"subproperties": ["marker-end"], "values": ["inherit", "initial", "none", "unset", "url"], "supports": [11], "isInherited": true}, "justify-items": {"subproperties": ["justify-items"], "values": ["auto", "baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "mask-position": {"subproperties": ["mask-position-x", "mask-position-y"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-columns": {"subproperties": ["-moz-column-count", "-moz-column-width"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 7], "isInherited": false}, "-moz-outline-radius-topright": {"subproperties": ["-moz-outline-radius-topright"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "right": {"subproperties": ["right"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-border-left-colors": {"subproperties": ["-moz-border-left-colors"], "values": ["inherit", "initial", "unset"], "supports": [2], "isInherited": false}, "-webkit-mask-position-x": {"subproperties": ["mask-position-x"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-transition-duration": {"subproperties": ["transition-duration"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "border-top-width": {"subproperties": ["border-top-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "bottom": {"subproperties": ["bottom"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "border-block-end-style": {"subproperties": ["border-block-end-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "-webkit-order": {"subproperties": ["order"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "-moz-animation-iteration-count": {"subproperties": ["animation-iteration-count"], "values": ["infinite", "inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "-moz-animation-timing-function": {"subproperties": ["animation-timing-function"], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "supports": [10], "isInherited": false}, "background-color": {"subproperties": ["background-color"], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "-webkit-backface-visibility": {"subproperties": ["backface-visibility"], "values": ["hidden", "inherit", "initial", "unset", "visible"], "supports": [], "isInherited": false}, "animation-delay": {"subproperties": ["animation-delay"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "unicode-bidi": {"subproperties": ["unicode-bidi"], "values": ["-moz-isolate", "-moz-isolate-override", "-moz-plaintext", "bidi-override", "embed", "inherit", "initial", "isolate", "isolate-override", "normal", "plaintext", "unset"], "supports": [], "isInherited": false}, "text-shadow": {"subproperties": ["text-shadow"], "values": ["inherit", "initial", "unset"], "supports": [2, 6], "isInherited": true}, "-moz-user-modify": {"subproperties": ["-moz-user-modify"], "values": ["inherit", "initial", "read-only", "read-write", "unset", "write-only"], "supports": [], "isInherited": true}, "-webkit-box-direction": {"subproperties": ["-moz-box-direction"], "values": ["inherit", "initial", "normal", "reverse", "unset"], "supports": [], "isInherited": false}, "image-rendering": {"subproperties": ["image-rendering"], "values": ["-moz-crisp-edges", "auto", "inherit", "initial", "optimizequality", "optimizespeed", "unset"], "supports": [], "isInherited": true}, "border-inline-end": {"subproperties": ["border-inline-end-width", "border-inline-end-style", "border-inline-end-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "grid-gap": {"subproperties": ["grid-row-gap", "grid-column-gap"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-animation-name": {"subproperties": ["animation-name"], "values": ["inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "pointer-events": {"subproperties": ["pointer-events"], "values": ["all", "auto", "fill", "inherit", "initial", "none", "painted", "stroke", "unset", "visible", "visiblefill", "visiblepainted", "visiblestroke"], "supports": [], "isInherited": true}, "border-image-width": {"subproperties": ["border-image-width"], "values": ["inherit", "initial", "unset"], "supports": [6, 7, 8], "isInherited": false}, "border-inline-start": {"subproperties": ["border-inline-start-width", "border-inline-start-style", "border-inline-start-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "min-block-size": {"subproperties": ["min-block-size"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-mask-clip": {"subproperties": ["mask-clip"], "supports": [], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "isInherited": false}, "-webkit-mask-image": {"subproperties": ["mask-image"], "supports": [4, 5, 11], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "isInherited": false}, "float": {"subproperties": ["float"], "values": ["inherit", "initial", "inline-end", "inline-start", "left", "none", "right", "unset"], "supports": [], "isInherited": false}, "max-height": {"subproperties": ["max-height"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "calc", "inherit", "initial", "none", "unset"], "supports": [6, 8], "isInherited": false}, "outline-offset": {"subproperties": ["outline-offset"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6], "isInherited": false}, "-moz-transform-style": {"subproperties": ["transform-style"], "values": ["flat", "inherit", "initial", "preserve-3d", "unset"], "supports": [], "isInherited": false}, "overflow-wrap": {"subproperties": ["overflow-wrap"], "values": ["break-word", "inherit", "initial", "normal", "unset"], "supports": [], "isInherited": true}, "fill": {"subproperties": ["fill"], "values": ["inherit", "initial", "unset"], "supports": [2, 11], "isInherited": true}, "scroll-snap-type": {"subproperties": ["scroll-snap-type-x", "scroll-snap-type-y"], "values": ["inherit", "initial", "mandatory", "none", "proximity", "unset"], "supports": [], "isInherited": false}, "text-emphasis-style": {"subproperties": ["text-emphasis-style"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "transform": {"subproperties": ["transform"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-moz-text-align-last": {"subproperties": ["text-align-last"], "values": ["auto", "center", "end", "inherit", "initial", "justify", "left", "right", "start", "unset"], "supports": [], "isInherited": true}, "width": {"subproperties": ["width"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "stroke-miterlimit": {"subproperties": ["stroke-miterlimit"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": true}, "stop-opacity": {"subproperties": ["stop-opacity"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "border-top-color": {"subproperties": ["border-top-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "background-position": {"subproperties": ["background-position-x", "background-position-y"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "scroll-snap-type-x": {"subproperties": ["scroll-snap-type-x"], "values": ["inherit", "initial", "mandatory", "none", "proximity", "unset"], "supports": [], "isInherited": false}, "object-fit": {"subproperties": ["object-fit"], "values": ["contain", "cover", "fill", "inherit", "initial", "none", "scale-down", "unset"], "supports": [], "isInherited": false}, "-moz-box-sizing": {"subproperties": ["box-sizing"], "values": ["border-box", "content-box", "inherit", "initial", "unset"], "supports": [], "isInherited": false}, "offset-block-start": {"subproperties": ["offset-block-start"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-background-origin": {"subproperties": ["background-origin"], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "supports": [], "isInherited": false}, "-webkit-align-items": {"subproperties": ["align-items"], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "-moz-padding-start": {"subproperties": ["padding-inline-start"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "transition-delay": {"subproperties": ["transition-delay"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "border-style": {"subproperties": ["border-top-style", "border-right-style", "border-bottom-style", "border-left-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "mask-repeat": {"subproperties": ["mask-repeat"], "supports": [], "values": ["inherit", "initial", "no-repeat", "repeat", "repeat-x", "repeat-y", "round", "space", "unset"], "isInherited": false}, "overflow": {"subproperties": ["overflow-x", "overflow-y"], "values": ["-moz-hidden-unscrollable", "auto", "hidden", "inherit", "initial", "scroll", "unset", "visible"], "supports": [], "isInherited": false}, "mask-origin": {"subproperties": ["mask-origin"], "supports": [], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "isInherited": false}, "-moz-force-broken-image-icon": {"subproperties": ["-moz-force-broken-image-icon"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "grid-template-columns": {"subproperties": ["grid-template-columns"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-align-self": {"subproperties": ["align-self"], "values": ["auto", "baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "-webkit-perspective-origin": {"subproperties": ["perspective-origin"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "border-block-start": {"subproperties": ["border-block-start-width", "border-block-start-style", "border-block-start-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "display": {"subproperties": ["display"], "values": ["-moz-box", "-moz-deck", "-moz-grid", "-moz-grid-group", "-moz-grid-line", "-moz-groupbox", "-moz-inline-box", "-moz-inline-grid", "-moz-inline-stack", "-moz-popup", "-moz-stack", "-webkit-box", "-webkit-flex", "-webkit-inline-box", "-webkit-inline-flex", "block", "contents", "flex", "grid", "inherit", "initial", "inline", "inline-block", "inline-flex", "inline-grid", "inline-table", "list-item", "none", "ruby", "ruby-base", "ruby-base-container", "ruby-text", "ruby-text-container", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", "table-row-group", "unset"], "supports": [], "isInherited": false}, "-webkit-box-ordinal-group": {"subproperties": ["-moz-box-ordinal-group"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "-moz-column-width": {"subproperties": ["-moz-column-width"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6], "isInherited": false}, "border-color": {"subproperties": ["border-top-color", "border-right-color", "border-bottom-color", "border-left-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "-webkit-flex-basis": {"subproperties": ["flex-basis"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "stroke-dashoffset": {"subproperties": ["stroke-dashoffset"], "values": ["inherit", "initial", "unset"], "supports": [6, 7, 8], "isInherited": true}, "-moz-transform-origin": {"subproperties": ["transform-origin"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-text-size-adjust": {"subproperties": ["-moz-text-size-adjust"], "values": ["auto", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": true}, "border-left-color": {"subproperties": ["border-left-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "overflow-y": {"subproperties": ["overflow-y"], "values": ["-moz-hidden-unscrollable", "auto", "hidden", "inherit", "initial", "scroll", "unset", "visible"], "supports": [], "isInherited": false}, "overflow-x": {"subproperties": ["overflow-x"], "values": ["-moz-hidden-unscrollable", "auto", "hidden", "inherit", "initial", "scroll", "unset", "visible"], "supports": [], "isInherited": false}, "-moz-user-select": {"subproperties": ["-moz-user-select"], "values": ["-moz-all", "-moz-none", "-moz-text", "all", "auto", "element", "elements", "inherit", "initial", "none", "text", "toggle", "tri-state", "unset"], "supports": [], "isInherited": false}, "-moz-column-rule": {"subproperties": ["-moz-column-rule-width", "-moz-column-rule-style", "-moz-column-rule-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "-moz-outline-radius-bottomright": {"subproperties": ["-moz-outline-radius-bottomright"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-column-rule-color": {"subproperties": ["-moz-column-rule-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "-moz-transition": {"subproperties": ["transition-property", "transition-duration", "transition-timing-function", "transition-delay"], "values": ["all", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "none", "step-end", "step-start", "steps", "unset"], "supports": [9, 10], "isInherited": false}, "opacity": {"subproperties": ["opacity"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "-webkit-perspective": {"subproperties": ["perspective"], "values": ["inherit", "initial", "none", "unset"], "supports": [6], "isInherited": false}, "-webkit-text-stroke-color": {"subproperties": ["-webkit-text-stroke-color"], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": true}, "align-content": {"subproperties": ["align-content"], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "space-around", "space-between", "space-evenly", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "scroll-snap-points-y": {"subproperties": ["scroll-snap-points-y"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-moz-transition-property": {"subproperties": ["transition-property"], "values": ["all", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "border-bottom-style": {"subproperties": ["border-bottom-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "-moz-animation-play-state": {"subproperties": ["animation-play-state"], "values": ["inherit", "initial", "paused", "running", "unset"], "supports": [], "isInherited": false}, "mask": {"subproperties": ["mask-image", "mask-repeat", "mask-position-x", "mask-position-y", "mask-clip", "mask-origin", "mask-size", "mask-composite", "mask-mode"], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "add", "alpha", "border-box", "content-box", "exclude", "inherit", "initial", "intersect", "linear-gradient", "luminance", "match-source", "no-repeat", "none", "padding-box", "radial-gradient", "repeat", "repeat-x", "repeat-y", "repeating-linear-gradient", "repeating-radial-gradient", "round", "space", "subtract", "unset", "url"], "supports": [4, 5, 6, 8, 11], "isInherited": false}, "background-position-x": {"subproperties": ["background-position-x"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "stop-color": {"subproperties": ["stop-color"], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "border-block-end-color": {"subproperties": ["border-block-end-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "stroke-dasharray": {"subproperties": ["stroke-dasharray"], "values": ["inherit", "initial", "unset"], "supports": [6, 7, 8], "isInherited": true}, "border-inline-start-color": {"subproperties": ["border-inline-start-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}};
+exports.CSS_PROPERTIES = {"all": {"subproperties": ["align-content", "align-items", "align-self", "animation-delay", "animation-direction", "animation-duration", "animation-fill-mode", "animation-iteration-count", "animation-name", "animation-play-state", "animation-timing-function", "-moz-appearance", "backface-visibility", "background-attachment", "background-blend-mode", "background-clip", "background-color", "background-image", "background-origin", "background-position-x", "background-position-y", "background-repeat", "background-size", "-moz-binding", "block-size", "border-block-end-color", "border-block-end-style", "border-block-end-width", "border-block-start-color", "border-block-start-style", "border-block-start-width", "border-bottom-color", "-moz-border-bottom-colors", "border-bottom-left-radius", "border-bottom-right-radius", "border-bottom-style", "border-bottom-width", "border-collapse", "border-image-outset", "border-image-repeat", "border-image-slice", "border-image-source", "border-image-width", "border-inline-end-color", "border-inline-end-style", "border-inline-end-width", "border-inline-start-color", "border-inline-start-style", "border-inline-start-width", "border-left-color", "-moz-border-left-colors", "border-left-style", "border-left-width", "border-right-color", "-moz-border-right-colors", "border-right-style", "border-right-width", "border-spacing", "border-top-color", "-moz-border-top-colors", "border-top-left-radius", "border-top-right-radius", "border-top-style", "border-top-width", "bottom", "-moz-box-align", "box-decoration-break", "-moz-box-direction", "-moz-box-flex", "-moz-box-ordinal-group", "-moz-box-orient", "-moz-box-pack", "box-shadow", "box-sizing", "caption-side", "clear", "clip", "clip-path", "clip-rule", "color", "color-adjust", "color-interpolation", "color-interpolation-filters", "-moz-column-count", "-moz-column-fill", "-moz-column-gap", "-moz-column-rule-color", "-moz-column-rule-style", "-moz-column-rule-width", "-moz-column-width", "contain", "content", "-moz-control-character-visibility", "counter-increment", "counter-reset", "cursor", "display", "dominant-baseline", "empty-cells", "fill", "fill-opacity", "fill-rule", "filter", "flex-basis", "flex-direction", "flex-grow", "flex-shrink", "flex-wrap", "float", "-moz-float-edge", "flood-color", "flood-opacity", "font-family", "font-feature-settings", "font-kerning", "font-language-override", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-synthesis", "font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position", "font-weight", "-moz-force-broken-image-icon", "grid-auto-columns", "grid-auto-flow", "grid-auto-rows", "grid-column-end", "grid-column-gap", "grid-column-start", "grid-row-end", "grid-row-gap", "grid-row-start", "grid-template-areas", "grid-template-columns", "grid-template-rows", "height", "hyphens", "initial-letter", "image-orientation", "-moz-image-region", "image-rendering", "ime-mode", "inline-size", "isolation", "justify-content", "justify-items", "justify-self", "left", "letter-spacing", "lighting-color", "line-height", "list-style-image", "list-style-position", "list-style-type", "margin-block-end", "margin-block-start", "margin-bottom", "margin-inline-end", "margin-inline-start", "margin-left", "margin-right", "margin-top", "marker-end", "marker-mid", "marker-offset", "marker-start", "mask-clip", "mask-composite", "mask-image", "mask-mode", "mask-origin", "mask-position-x", "mask-position-y", "mask-repeat", "mask-size", "mask-type", "max-block-size", "max-height", "max-inline-size", "max-width", "min-block-size", "-moz-min-font-size-ratio", "min-height", "min-inline-size", "min-width", "mix-blend-mode", "object-fit", "object-position", "offset-block-end", "offset-block-start", "offset-inline-end", "offset-inline-start", "opacity", "order", "-moz-orient", "-moz-osx-font-smoothing", "outline-color", "outline-offset", "-moz-outline-radius-bottomleft", "-moz-outline-radius-bottomright", "-moz-outline-radius-topleft", "-moz-outline-radius-topright", "outline-style", "outline-width", "overflow-clip-box", "overflow-x", "overflow-y", "padding-block-end", "padding-block-start", "padding-bottom", "padding-inline-end", "padding-inline-start", "padding-left", "padding-right", "padding-top", "page-break-after", "page-break-before", "page-break-inside", "paint-order", "perspective", "perspective-origin", "pointer-events", "position", "quotes", "resize", "right", "ruby-align", "ruby-position", "scroll-behavior", "scroll-snap-coordinate", "scroll-snap-destination", "scroll-snap-points-x", "scroll-snap-points-y", "scroll-snap-type-x", "scroll-snap-type-y", "shape-outside", "shape-rendering", "-moz-stack-sizing", "stop-color", "stop-opacity", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "-x-system-font", "-moz-tab-size", "table-layout", "text-align", "text-align-last", "text-anchor", "text-combine-upright", "text-decoration-color", "text-decoration-line", "text-decoration-style", "text-emphasis-color", "text-emphasis-position", "text-emphasis-style", "-webkit-text-fill-color", "text-indent", "text-orientation", "text-overflow", "text-rendering", "text-shadow", "-moz-text-size-adjust", "-webkit-text-stroke-color", "-webkit-text-stroke-width", "text-transform", "top", "-moz-top-layer", "touch-action", "transform", "transform-box", "transform-origin", "transform-style", "transition-delay", "transition-duration", "transition-property", "transition-timing-function", "-moz-user-focus", "-moz-user-input", "-moz-user-modify", "-moz-user-select", "vector-effect", "vertical-align", "visibility", "white-space", "width", "will-change", "-moz-window-dragging", "-moz-window-shadow", "word-break", "word-spacing", "overflow-wrap", "writing-mode", "z-index"], "supports": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11], "values": ["COLOR", "-moz-all", "-moz-available", "-moz-block-height", "-moz-box", "-moz-calc", "-moz-center", "-moz-crisp-edges", "-moz-deck", "-moz-element", "-moz-fit-content", "-moz-grid", "-moz-grid-group", "-moz-grid-line", "-moz-groupbox", "-moz-gtk-info-bar", "-moz-hidden-unscrollable", "-moz-image-rect", "-moz-inline-box", "-moz-inline-grid", "-moz-inline-stack", "-moz-left", "-moz-linear-gradient", "-moz-mac-disclosure-button-closed", "-moz-mac-disclosure-button-open", "-moz-mac-fullscreen-button", "-moz-mac-help-button", "-moz-mac-source-list", "-moz-mac-vibrancy-dark", "-moz-mac-vibrancy-light", "-moz-max-content", "-moz-middle-with-baseline", "-moz-min-content", "-moz-none", "-moz-popup", "-moz-pre-space", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "-moz-right", "-moz-stack", "-moz-text", "-moz-win-borderless-glass", "-moz-win-browsertabbar-toolbox", "-moz-win-communications-toolbox", "-moz-win-exclude-glass", "-moz-win-glass", "-moz-win-media-toolbox", "-moz-window-button-box", "-moz-window-button-box-maximized", "-moz-window-button-close", "-moz-window-button-maximize", "-moz-window-button-minimize", "-moz-window-button-restore", "-moz-window-frame-bottom", "-moz-window-frame-left", "-moz-window-frame-right", "-moz-window-titlebar", "-moz-window-titlebar-maximized", "-webkit-box", "-webkit-flex", "-webkit-inline-box", "-webkit-inline-flex", "absolute", "active", "add", "all", "all-petite-caps", "all-small-caps", "alpha", "alphabetic", "alternate", "alternate-reverse", "always", "auto", "avoid", "backwards", "balance", "baseline", "bevel", "block", "block-axis", "border-box", "both", "bottom", "bottom-outside", "break-all", "break-word", "butt", "button", "button-arrow-down", "button-arrow-next", "button-arrow-previous", "button-arrow-up", "button-bevel", "button-focus", "calc", "capitalize", "caret", "center", "central", "checkbox", "checkbox-container", "checkbox-label", "checkmenuitem", "clone", "collapse", "color", "color-burn", "color-dodge", "column", "column-reverse", "condensed", "contain", "content-box", "contents", "cover", "crispedges", "cubic-bezier", "currentColor", "darken", "dashed", "default", "dialog", "difference", "disabled", "dotted", "double", "drag", "dualbutton", "ease", "ease-in", "ease-in-out", "ease-out", "economy", "element", "elements", "enabled", "end", "evenodd", "exact", "exclude", "exclusion", "expanded", "extra-condensed", "extra-expanded", "fill", "fill-box", "fixed", "flat", "flex", "flex-end", "flex-start", "forwards", "full-width", "geometricprecision", "grid", "groove", "groupbox", "hanging", "hard-light", "hidden", "hide", "horizontal", "horizontal-tb", "hsl", "hsla", "hue", "ideographic", "ignore", "inactive", "infinite", "inherit", "initial", "inline", "inline-axis", "inline-block", "inline-end", "inline-flex", "inline-grid", "inline-start", "inline-table", "inset", "inside", "intersect", "isolate", "italic", "justify", "keep-all", "large", "larger", "last-baseline", "left", "lighten", "linear", "linear-gradient", "linearrgb", "list-item", "listbox", "listitem", "local", "lowercase", "lr", "lr-tb", "luminance", "luminosity", "mandatory", "manipulation", "manual", "margin-box", "match-source", "mathematical", "medium", "menuarrow", "menubar", "menucheckbox", "menuimage", "menuitem", "menuitemtext", "menulist", "menulist-button", "menulist-text", "menulist-textfield", "menupopup", "menuradio", "menuseparator", "meterbar", "meterchunk", "middle", "miter", "mixed", "multiply", "no-change", "no-drag", "no-repeat", "non-scaling-stroke", "none", "nonzero", "normal", "nowrap", "number-input", "oblique", "optimizelegibility", "optimizequality", "optimizespeed", "outset", "outside", "over", "overlay", "padding-box", "painted", "pan-x", "pan-y", "paused", "petite-caps", "pre", "pre-line", "pre-wrap", "preserve-3d", "progressbar", "progressbar-vertical", "progresschunk", "progresschunk-vertical", "proximity", "radial-gradient", "radio", "radio-container", "radio-label", "radiomenuitem", "range", "range-thumb", "read-only", "read-write", "relative", "repeat", "repeat-x", "repeat-y", "repeating-linear-gradient", "repeating-radial-gradient", "reset-size", "resizer", "resizerpanel", "reverse", "rgb", "rgba", "ridge", "right", "rl", "rl-tb", "round", "row", "row-reverse", "ruby", "ruby-base", "ruby-base-container", "ruby-text", "ruby-text-container", "running", "saturation", "scale-down", "scale-horizontal", "scale-vertical", "scalethumb-horizontal", "scalethumb-vertical", "scalethumbend", "scalethumbstart", "scalethumbtick", "screen", "scroll", "scrollbar", "scrollbar-horizontal", "scrollbar-small", "scrollbar-vertical", "scrollbarbutton-down", "scrollbarbutton-left", "scrollbarbutton-right", "scrollbarbutton-up", "scrollbarthumb-horizontal", "scrollbarthumb-vertical", "scrollbartrack-horizontal", "scrollbartrack-vertical", "searchfield", "select-after", "select-all", "select-before", "select-menu", "select-same", "self-end", "self-start", "semi-condensed", "semi-expanded", "separate", "separator", "show", "sideways", "sideways-lr", "sideways-right", "sideways-rl", "slice", "small", "small-caps", "smaller", "smooth", "soft-light", "solid", "space", "space-around", "space-between", "space-evenly", "spinner", "spinner-downbutton", "spinner-textfield", "spinner-upbutton", "splitter", "square", "srgb", "start", "static", "statusbar", "statusbarpanel", "step-end", "step-start", "steps", "sticky", "stretch", "stretch-to-fit", "stroke", "sub", "subtract", "super", "tab", "tab-scroll-arrow-back", "tab-scroll-arrow-forward", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", "table-row-group", "tabpanel", "tabpanels", "tb", "tb-rl", "text", "text-after-edge", "text-before-edge", "text-bottom", "text-top", "textfield", "textfield-multiline", "thick", "thin", "titling-caps", "toggle", "toolbar", "toolbarbutton", "toolbarbutton-dropdown", "toolbargripper", "toolbox", "tooltip", "top", "top-outside", "transparent", "treeheader", "treeheadercell", "treeheadersortarrow", "treeitem", "treeline", "treetwisty", "treetwistyopen", "treeview", "tri-state", "ultra-condensed", "ultra-expanded", "under", "unicase", "unset", "uppercase", "upright", "url", "use-script", "vertical", "vertical-lr", "vertical-rl", "view-box", "visible", "visiblefill", "visiblepainted", "visiblestroke", "wavy", "window", "wrap", "wrap-reverse", "write-only", "x-large", "x-small", "xx-large", "xx-small"], "isInherited": false}, "mask-image": {"subproperties": ["mask-image"], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "supports": [4, 5, 11], "isInherited": false}, "-webkit-animation-iteration-count": {"subproperties": ["animation-iteration-count"], "supports": [7], "values": ["infinite", "inherit", "initial", "unset"], "isInherited": false}, "font-feature-settings": {"subproperties": ["font-feature-settings"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "border-block-start-color": {"subproperties": ["border-block-start-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "-webkit-flex-grow": {"subproperties": ["flex-grow"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "scroll-snap-destination": {"subproperties": ["scroll-snap-destination"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-font-language-override": {"subproperties": ["font-language-override"], "supports": [], "values": ["inherit", "initial", "normal", "unset"], "isInherited": true}, "text-emphasis": {"subproperties": ["text-emphasis-style", "text-emphasis-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": true}, "grid-row-gap": {"subproperties": ["grid-row-gap"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "font-variant-east-asian": {"subproperties": ["font-variant-east-asian"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "outline-width": {"subproperties": ["outline-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "-webkit-flex-flow": {"subproperties": ["flex-direction", "flex-wrap"], "supports": [], "values": ["column", "column-reverse", "inherit", "initial", "nowrap", "row", "row-reverse", "unset", "wrap", "wrap-reverse"], "isInherited": false}, "grid-column-gap": {"subproperties": ["grid-column-gap"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "border-inline-start-style": {"subproperties": ["border-inline-start-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "scroll-snap-points-x": {"subproperties": ["scroll-snap-points-x"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "list-style-type": {"subproperties": ["list-style-type"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "padding-inline-end": {"subproperties": ["padding-inline-end"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-moz-animation": {"subproperties": ["animation-duration", "animation-timing-function", "animation-delay", "animation-direction", "animation-fill-mode", "animation-iteration-count", "animation-play-state", "animation-name"], "supports": [7, 9, 10], "values": ["alternate", "alternate-reverse", "backwards", "both", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "forwards", "infinite", "inherit", "initial", "linear", "none", "normal", "paused", "reverse", "running", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "-moz-border-start-width": {"subproperties": ["border-inline-start-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "page-break-before": {"subproperties": ["page-break-before"], "supports": [], "values": ["always", "auto", "avoid", "inherit", "initial", "left", "right", "unset"], "isInherited": false}, "flood-color": {"subproperties": ["flood-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "text-anchor": {"subproperties": ["text-anchor"], "supports": [], "values": ["end", "inherit", "initial", "middle", "start", "unset"], "isInherited": true}, "-moz-box-pack": {"subproperties": ["-moz-box-pack"], "supports": [], "values": ["center", "end", "inherit", "initial", "justify", "start", "unset"], "isInherited": false}, "-webkit-user-select": {"subproperties": ["-moz-user-select"], "supports": [], "values": ["-moz-all", "-moz-none", "-moz-text", "all", "auto", "element", "elements", "inherit", "initial", "none", "text", "toggle", "tri-state", "unset"], "isInherited": false}, "-moz-border-end-style": {"subproperties": ["border-inline-end-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "padding-left": {"subproperties": ["padding-left"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-moz-tab-size": {"subproperties": ["-moz-tab-size"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": true}, "perspective": {"subproperties": ["perspective"], "supports": [6], "values": ["inherit", "initial", "none", "unset"], "isInherited": false}, "max-block-size": {"subproperties": ["max-block-size"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "none", "unset"], "isInherited": false}, "-webkit-animation-play-state": {"subproperties": ["animation-play-state"], "supports": [], "values": ["inherit", "initial", "paused", "running", "unset"], "isInherited": false}, "-moz-column-fill": {"subproperties": ["-moz-column-fill"], "supports": [], "values": ["auto", "balance", "inherit", "initial", "unset"], "isInherited": false}, "-moz-stack-sizing": {"subproperties": ["-moz-stack-sizing"], "supports": [], "values": ["ignore", "inherit", "initial", "stretch-to-fit", "unset"], "isInherited": false}, "border-image-repeat": {"subproperties": ["border-image-repeat"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "font-variant-position": {"subproperties": ["font-variant-position"], "supports": [], "values": ["inherit", "initial", "normal", "sub", "super", "unset"], "isInherited": true}, "border-right-style": {"subproperties": ["border-right-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "-moz-box-align": {"subproperties": ["-moz-box-align"], "supports": [], "values": ["baseline", "center", "end", "inherit", "initial", "start", "stretch", "unset"], "isInherited": false}, "border-left-style": {"subproperties": ["border-left-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "flex-flow": {"subproperties": ["flex-direction", "flex-wrap"], "supports": [], "values": ["column", "column-reverse", "inherit", "initial", "nowrap", "row", "row-reverse", "unset", "wrap", "wrap-reverse"], "isInherited": false}, "outline-color": {"subproperties": ["outline-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "font-variant-alternates": {"subproperties": ["font-variant-alternates"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "mask-mode": {"subproperties": ["mask-mode"], "values": ["alpha", "inherit", "initial", "luminance", "match-source", "unset"], "supports": [], "isInherited": false}, "flex-grow": {"subproperties": ["flex-grow"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-font-feature-settings": {"subproperties": ["font-feature-settings"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "-webkit-box-shadow": {"subproperties": ["box-shadow"], "supports": [2, 6], "values": ["inherit", "initial", "unset"], "isInherited": false}, "max-width": {"subproperties": ["max-width"], "supports": [6, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "calc", "inherit", "initial", "none", "unset"], "isInherited": false}, "border-inline-end-style": {"subproperties": ["border-inline-end-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "grid-column": {"subproperties": ["grid-column-start", "grid-column-end"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "image-orientation": {"subproperties": ["image-orientation"], "supports": [1], "values": ["inherit", "initial", "unset"], "isInherited": true}, "animation-duration": {"subproperties": ["animation-duration"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-animation-fill-mode": {"subproperties": ["animation-fill-mode"], "supports": [], "values": ["backwards", "both", "forwards", "inherit", "initial", "none", "unset"], "isInherited": false}, "-moz-user-input": {"subproperties": ["-moz-user-input"], "supports": [], "values": ["auto", "disabled", "enabled", "inherit", "initial", "none", "unset"], "isInherited": true}, "-webkit-animation-delay": {"subproperties": ["animation-delay"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "shape-rendering": {"subproperties": ["shape-rendering"], "supports": [], "values": ["auto", "crispedges", "geometricprecision", "inherit", "initial", "optimizespeed", "unset"], "isInherited": true}, "flex-shrink": {"subproperties": ["flex-shrink"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "text-rendering": {"subproperties": ["text-rendering"], "supports": [], "values": ["auto", "geometricprecision", "inherit", "initial", "optimizelegibility", "optimizespeed", "unset"], "isInherited": true}, "align-items": {"subproperties": ["align-items"], "supports": [], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "isInherited": false}, "border-collapse": {"subproperties": ["border-collapse"], "supports": [], "values": ["collapse", "inherit", "initial", "separate", "unset"], "isInherited": true}, "text-combine-upright": {"subproperties": ["text-combine-upright"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "offset-block-end": {"subproperties": ["offset-block-end"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-moz-border-start-color": {"subproperties": ["border-inline-start-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "marker": {"subproperties": ["marker-start", "marker-mid", "marker-end"], "supports": [11], "values": ["inherit", "initial", "none", "unset", "url"], "isInherited": true}, "-webkit-mask-position-y": {"subproperties": ["mask-position-y"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "outline-style": {"subproperties": ["outline-style"], "supports": [], "values": ["auto", "dashed", "dotted", "double", "groove", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "color-interpolation-filters": {"subproperties": ["color-interpolation-filters"], "supports": [], "values": ["auto", "inherit", "initial", "linearrgb", "srgb", "unset"], "isInherited": true}, "-moz-padding-end": {"subproperties": ["padding-inline-end"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "font-stretch": {"subproperties": ["font-stretch"], "supports": [], "values": ["condensed", "expanded", "extra-condensed", "extra-expanded", "inherit", "initial", "normal", "semi-condensed", "semi-expanded", "ultra-condensed", "ultra-expanded", "unset"], "isInherited": true}, "-moz-orient": {"subproperties": ["-moz-orient"], "supports": [], "values": ["block", "horizontal", "inherit", "initial", "inline", "unset", "vertical"], "isInherited": false}, "font-variant": {"subproperties": ["font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position"], "supports": [], "values": ["all-petite-caps", "all-small-caps", "inherit", "initial", "normal", "petite-caps", "small-caps", "sub", "super", "titling-caps", "unicase", "unset"], "isInherited": true}, "-webkit-animation-fill-mode": {"subproperties": ["animation-fill-mode"], "supports": [], "values": ["backwards", "both", "forwards", "inherit", "initial", "none", "unset"], "isInherited": false}, "-moz-animation-duration": {"subproperties": ["animation-duration"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-left": {"subproperties": ["border-left-width", "border-left-style", "border-left-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "visibility": {"subproperties": ["visibility"], "supports": [], "values": ["collapse", "hidden", "inherit", "initial", "unset", "visible"], "isInherited": true}, "-moz-user-focus": {"subproperties": ["-moz-user-focus"], "supports": [], "values": ["ignore", "inherit", "initial", "none", "normal", "select-after", "select-all", "select-before", "select-menu", "select-same", "unset"], "isInherited": true}, "transform-box": {"subproperties": ["transform-box"], "supports": [], "values": ["border-box", "fill-box", "inherit", "initial", "unset", "view-box"], "isInherited": false}, "font-variant-caps": {"subproperties": ["font-variant-caps"], "supports": [], "values": ["all-petite-caps", "all-small-caps", "inherit", "initial", "normal", "petite-caps", "small-caps", "titling-caps", "unicase", "unset"], "isInherited": true}, "resize": {"subproperties": ["resize"], "supports": [], "values": ["both", "horizontal", "inherit", "initial", "none", "unset", "vertical"], "isInherited": false}, "offset-inline-end": {"subproperties": ["offset-inline-end"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "paint-order": {"subproperties": ["paint-order"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "text-decoration-line": {"subproperties": ["text-decoration-line"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "animation-direction": {"subproperties": ["animation-direction"], "supports": [], "values": ["alternate", "alternate-reverse", "inherit", "initial", "normal", "reverse", "unset"], "isInherited": false}, "border-top-left-radius": {"subproperties": ["border-top-left-radius"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-box-align": {"subproperties": ["-moz-box-align"], "supports": [], "values": ["baseline", "center", "end", "inherit", "initial", "start", "stretch", "unset"], "isInherited": false}, "-moz-text-size-adjust": {"subproperties": ["-moz-text-size-adjust"], "supports": [], "values": ["auto", "inherit", "initial", "none", "unset"], "isInherited": true}, "list-style": {"subproperties": ["list-style-type", "list-style-image", "list-style-position"], "supports": [11], "values": ["inherit", "initial", "inside", "none", "outside", "unset", "url"], "isInherited": true}, "stroke": {"subproperties": ["stroke"], "supports": [2, 11], "values": ["inherit", "initial", "unset"], "isInherited": true}, "stroke-linecap": {"subproperties": ["stroke-linecap"], "supports": [], "values": ["butt", "inherit", "initial", "round", "square", "unset"], "isInherited": true}, "-webkit-background-size": {"subproperties": ["background-size"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "padding-bottom": {"subproperties": ["padding-bottom"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "border-image-slice": {"subproperties": ["border-image-slice"], "supports": [7, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-transition-delay": {"subproperties": ["transition-delay"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "background-repeat": {"subproperties": ["background-repeat"], "supports": [], "values": ["inherit", "initial", "no-repeat", "repeat", "repeat-x", "repeat-y", "round", "space", "unset"], "isInherited": false}, "flex-basis": {"subproperties": ["flex-basis"], "supports": [6, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-moz-border-right-colors": {"subproperties": ["-moz-border-right-colors"], "supports": [2], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-image-region": {"subproperties": ["-moz-image-region"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "-webkit-transform-origin": {"subproperties": ["transform-origin"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "vector-effect": {"subproperties": ["vector-effect"], "supports": [], "values": ["inherit", "initial", "non-scaling-stroke", "none", "unset"], "isInherited": false}, "-moz-margin-end": {"subproperties": ["margin-inline-end"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-moz-border-image": {"subproperties": ["border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat"], "supports": [4, 5, 6, 7, 8, 11], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "isInherited": false}, "-moz-border-end-color": {"subproperties": ["border-inline-end-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "ruby-position": {"subproperties": ["ruby-position"], "supports": [], "values": ["inherit", "initial", "over", "under", "unset"], "isInherited": true}, "inline-size": {"subproperties": ["inline-size"], "supports": [6, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "outline": {"subproperties": ["outline-width", "outline-style", "outline-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "auto", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "text-decoration": {"subproperties": ["text-decoration-color", "text-decoration-line", "text-decoration-style"], "supports": [2], "values": ["COLOR", "-moz-none", "currentColor", "dashed", "dotted", "double", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "solid", "transparent", "unset", "wavy"], "isInherited": false}, "transition-duration": {"subproperties": ["transition-duration"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "order": {"subproperties": ["order"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "ime-mode": {"subproperties": ["ime-mode"], "supports": [], "values": ["active", "auto", "disabled", "inactive", "inherit", "initial", "normal", "unset"], "isInherited": false}, "counter-reset": {"subproperties": ["counter-reset"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "flood-opacity": {"subproperties": ["flood-opacity"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "flex-direction": {"subproperties": ["flex-direction"], "supports": [], "values": ["column", "column-reverse", "inherit", "initial", "row", "row-reverse", "unset"], "isInherited": false}, "-webkit-text-stroke-width": {"subproperties": ["-webkit-text-stroke-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": true}, "font-variant-numeric": {"subproperties": ["font-variant-numeric"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "-webkit-flex-wrap": {"subproperties": ["flex-wrap"], "supports": [], "values": ["inherit", "initial", "nowrap", "unset", "wrap", "wrap-reverse"], "isInherited": false}, "min-height": {"subproperties": ["min-height"], "supports": [6, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "left": {"subproperties": ["left"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-webkit-mask": {"subproperties": ["mask-image", "mask-repeat", "mask-position-x", "mask-position-y", "mask-clip", "mask-origin", "mask-size", "mask-composite", "mask-mode"], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "add", "alpha", "border-box", "content-box", "exclude", "inherit", "initial", "intersect", "linear-gradient", "luminance", "match-source", "no-repeat", "none", "padding-box", "radial-gradient", "repeat", "repeat-x", "repeat-y", "repeating-linear-gradient", "repeating-radial-gradient", "round", "space", "subtract", "unset", "url"], "supports": [4, 5, 6, 8, 11], "isInherited": false}, "stroke-width": {"subproperties": ["stroke-width"], "supports": [6, 7, 8], "values": ["inherit", "initial", "unset"], "isInherited": true}, "-moz-hyphens": {"subproperties": ["hyphens"], "supports": [], "values": ["auto", "inherit", "initial", "manual", "none", "unset"], "isInherited": true}, "background-origin": {"subproperties": ["background-origin"], "supports": [], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "isInherited": false}, "-moz-box-direction": {"subproperties": ["-moz-box-direction"], "supports": [], "values": ["inherit", "initial", "normal", "reverse", "unset"], "isInherited": false}, "border-inline-end-color": {"subproperties": ["border-inline-end-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "marker-offset": {"subproperties": ["marker-offset"], "supports": [6], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-webkit-background-clip": {"subproperties": ["background-clip"], "supports": [], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "text", "unset"], "isInherited": false}, "border-radius": {"subproperties": ["border-top-left-radius", "border-top-right-radius", "border-bottom-right-radius", "border-bottom-left-radius"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "flex": {"subproperties": ["flex-grow", "flex-shrink", "flex-basis"], "supports": [6, 7, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "margin-inline-end": {"subproperties": ["margin-inline-end"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-moz-appearance": {"subproperties": ["-moz-appearance"], "supports": [], "values": ["-moz-gtk-info-bar", "-moz-mac-disclosure-button-closed", "-moz-mac-disclosure-button-open", "-moz-mac-fullscreen-button", "-moz-mac-help-button", "-moz-mac-source-list", "-moz-mac-vibrancy-dark", "-moz-mac-vibrancy-light", "-moz-win-borderless-glass", "-moz-win-browsertabbar-toolbox", "-moz-win-communications-toolbox", "-moz-win-exclude-glass", "-moz-win-glass", "-moz-win-media-toolbox", "-moz-window-button-box", "-moz-window-button-box-maximized", "-moz-window-button-close", "-moz-window-button-maximize", "-moz-window-button-minimize", "-moz-window-button-restore", "-moz-window-frame-bottom", "-moz-window-frame-left", "-moz-window-frame-right", "-moz-window-titlebar", "-moz-window-titlebar-maximized", "button", "button-arrow-down", "button-arrow-next", "button-arrow-previous", "button-arrow-up", "button-bevel", "button-focus", "caret", "checkbox", "checkbox-container", "checkbox-label", "checkmenuitem", "dialog", "dualbutton", "groupbox", "inherit", "initial", "listbox", "listitem", "menuarrow", "menubar", "menucheckbox", "menuimage", "menuitem", "menuitemtext", "menulist", "menulist-button", "menulist-text", "menulist-textfield", "menupopup", "menuradio", "menuseparator", "meterbar", "meterchunk", "none", "number-input", "progressbar", "progressbar-vertical", "progresschunk", "progresschunk-vertical", "radio", "radio-container", "radio-label", "radiomenuitem", "range", "range-thumb", "resizer", "resizerpanel", "scale-horizontal", "scale-vertical", "scalethumb-horizontal", "scalethumb-vertical", "scalethumbend", "scalethumbstart", "scalethumbtick", "scrollbar", "scrollbar-horizontal", "scrollbar-small", "scrollbar-vertical", "scrollbarbutton-down", "scrollbarbutton-left", "scrollbarbutton-right", "scrollbarbutton-up", "scrollbarthumb-horizontal", "scrollbarthumb-vertical", "scrollbartrack-horizontal", "scrollbartrack-vertical", "searchfield", "separator", "spinner", "spinner-downbutton", "spinner-textfield", "spinner-upbutton", "splitter", "statusbar", "statusbarpanel", "tab", "tab-scroll-arrow-back", "tab-scroll-arrow-forward", "tabpanel", "tabpanels", "textfield", "textfield-multiline", "toolbar", "toolbarbutton", "toolbarbutton-dropdown", "toolbargripper", "toolbox", "tooltip", "treeheader", "treeheadercell", "treeheadersortarrow", "treeitem", "treeline", "treetwisty", "treetwistyopen", "treeview", "unset", "window"], "isInherited": false}, "box-decoration-break": {"subproperties": ["box-decoration-break"], "supports": [], "values": ["clone", "inherit", "initial", "slice", "unset"], "isInherited": false}, "text-indent": {"subproperties": ["text-indent"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": true}, "hyphens": {"subproperties": ["hyphens"], "supports": [], "values": ["auto", "inherit", "initial", "manual", "none", "unset"], "isInherited": true}, "-moz-perspective": {"subproperties": ["perspective"], "supports": [6], "values": ["inherit", "initial", "none", "unset"], "isInherited": false}, "-webkit-animation-timing-function": {"subproperties": ["animation-timing-function"], "supports": [10], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "text-transform": {"subproperties": ["text-transform"], "supports": [], "values": ["capitalize", "full-width", "inherit", "initial", "lowercase", "none", "unset", "uppercase"], "isInherited": true}, "font-size": {"subproperties": ["font-size"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "large", "larger", "medium", "small", "smaller", "unset", "x-large", "x-small", "xx-large", "xx-small"], "isInherited": true}, "-webkit-animation-name": {"subproperties": ["animation-name"], "supports": [], "values": ["inherit", "initial", "none", "unset"], "isInherited": false}, "-moz-border-start": {"subproperties": ["border-inline-start-width", "border-inline-start-style", "border-inline-start-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "mask-composite": {"subproperties": ["mask-composite"], "values": ["add", "exclude", "inherit", "initial", "intersect", "subtract", "unset"], "supports": [], "isInherited": false}, "-webkit-text-stroke": {"subproperties": ["-webkit-text-stroke-width", "-webkit-text-stroke-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "hsl", "hsla", "inherit", "initial", "medium", "rgb", "rgba", "thick", "thin", "transparent", "unset"], "isInherited": true}, "padding-top": {"subproperties": ["padding-top"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-webkit-flex-shrink": {"subproperties": ["flex-shrink"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "color-adjust": {"subproperties": ["color-adjust"], "supports": [], "values": ["economy", "exact", "inherit", "initial", "unset"], "isInherited": true}, "grid-template-rows": {"subproperties": ["grid-template-rows"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "content": {"subproperties": ["content"], "supports": [11], "values": ["inherit", "initial", "unset"], "isInherited": false}, "padding-right": {"subproperties": ["padding-right"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-webkit-transform": {"subproperties": ["transform"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "marker-mid": {"subproperties": ["marker-mid"], "supports": [11], "values": ["inherit", "initial", "none", "unset", "url"], "isInherited": true}, "-moz-column-gap": {"subproperties": ["-moz-column-gap"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "normal", "unset"], "isInherited": false}, "-moz-border-start-style": {"subproperties": ["border-inline-start-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "clip-rule": {"subproperties": ["clip-rule"], "supports": [], "values": ["evenodd", "inherit", "initial", "nonzero", "unset"], "isInherited": true}, "font-family": {"subproperties": ["font-family"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "block-size": {"subproperties": ["block-size"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "offset-inline-start": {"subproperties": ["offset-inline-start"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "padding-block-end": {"subproperties": ["padding-block-end"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "transition": {"subproperties": ["transition-property", "transition-duration", "transition-timing-function", "transition-delay"], "supports": [9, 10], "values": ["all", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "none", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "filter": {"subproperties": ["filter"], "supports": [11], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-right-width": {"subproperties": ["border-right-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "-webkit-flex-direction": {"subproperties": ["flex-direction"], "supports": [], "values": ["column", "column-reverse", "inherit", "initial", "row", "row-reverse", "unset"], "isInherited": false}, "-webkit-mask-composite": {"subproperties": ["mask-composite"], "values": ["add", "exclude", "inherit", "initial", "intersect", "subtract", "unset"], "supports": [], "isInherited": false}, "mix-blend-mode": {"subproperties": ["mix-blend-mode"], "supports": [], "values": ["color", "color-burn", "color-dodge", "darken", "difference", "exclusion", "hard-light", "hue", "inherit", "initial", "lighten", "luminosity", "multiply", "normal", "overlay", "saturation", "screen", "soft-light", "unset"], "isInherited": false}, "color-interpolation": {"subproperties": ["color-interpolation"], "supports": [], "values": ["auto", "inherit", "initial", "linearrgb", "srgb", "unset"], "isInherited": true}, "border-top-style": {"subproperties": ["border-top-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "fill-opacity": {"subproperties": ["fill-opacity"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": true}, "marker-start": {"subproperties": ["marker-start"], "supports": [11], "values": ["inherit", "initial", "none", "unset", "url"], "isInherited": true}, "border-bottom-width": {"subproperties": ["border-bottom-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "-moz-column-rule-style": {"subproperties": ["-moz-column-rule-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "clear": {"subproperties": ["clear"], "supports": [], "values": ["both", "inherit", "initial", "inline-end", "inline-start", "left", "none", "right", "unset"], "isInherited": false}, "grid-area": {"subproperties": ["grid-row-start", "grid-column-start", "grid-row-end", "grid-column-end"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "padding-inline-start": {"subproperties": ["padding-inline-start"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-moz-border-end": {"subproperties": ["border-inline-end-width", "border-inline-end-style", "border-inline-end-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "background-clip": {"subproperties": ["background-clip"], "supports": [], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "text", "unset"], "isInherited": false}, "-webkit-text-fill-color": {"subproperties": ["-webkit-text-fill-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": true}, "border-block-start-style": {"subproperties": ["border-block-start-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "top": {"subproperties": ["top"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "border-width": {"subproperties": ["border-top-width", "border-right-width", "border-bottom-width", "border-left-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "max-inline-size": {"subproperties": ["max-inline-size"], "supports": [6, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "calc", "inherit", "initial", "none", "unset"], "isInherited": false}, "border-inline-start-width": {"subproperties": ["border-inline-start-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "-moz-box-flex": {"subproperties": ["-moz-box-flex"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "animation-play-state": {"subproperties": ["animation-play-state"], "supports": [], "values": ["inherit", "initial", "paused", "running", "unset"], "isInherited": false}, "padding": {"subproperties": ["padding-top", "padding-right", "padding-bottom", "padding-left"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "dominant-baseline": {"subproperties": ["dominant-baseline"], "supports": [], "values": ["alphabetic", "auto", "central", "hanging", "ideographic", "inherit", "initial", "mathematical", "middle", "no-change", "reset-size", "text-after-edge", "text-before-edge", "unset", "use-script"], "isInherited": false}, "background-attachment": {"subproperties": ["background-attachment"], "supports": [], "values": ["fixed", "inherit", "initial", "local", "scroll", "unset"], "isInherited": false}, "-webkit-box-sizing": {"subproperties": ["box-sizing"], "supports": [], "values": ["border-box", "content-box", "inherit", "initial", "unset"], "isInherited": false}, "-webkit-box-flex": {"subproperties": ["-moz-box-flex"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "text-orientation": {"subproperties": ["text-orientation"], "supports": [], "values": ["inherit", "initial", "mixed", "sideways", "sideways-right", "unset", "upright"], "isInherited": true}, "-moz-margin-start": {"subproperties": ["margin-inline-start"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "isolation": {"subproperties": ["isolation"], "supports": [], "values": ["auto", "inherit", "initial", "isolate", "unset"], "isInherited": false}, "-moz-border-bottom-colors": {"subproperties": ["-moz-border-bottom-colors"], "supports": [2], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-column-rule-width": {"subproperties": ["-moz-column-rule-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "object-fit": {"subproperties": ["object-fit"], "supports": [], "values": ["contain", "cover", "fill", "inherit", "initial", "none", "scale-down", "unset"], "isInherited": false}, "-webkit-border-bottom-right-radius": {"subproperties": ["border-bottom-right-radius"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-column-count": {"subproperties": ["-moz-column-count"], "supports": [7], "values": ["auto", "inherit", "initial", "unset"], "isInherited": false}, "border-left-width": {"subproperties": ["border-left-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "grid-column-end": {"subproperties": ["grid-column-end"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "background-blend-mode": {"subproperties": ["background-blend-mode"], "supports": [], "values": ["color", "color-burn", "color-dodge", "darken", "difference", "exclusion", "hard-light", "hue", "inherit", "initial", "lighten", "luminosity", "multiply", "normal", "overlay", "saturation", "screen", "soft-light", "unset"], "isInherited": false}, "vertical-align": {"subproperties": ["vertical-align"], "supports": [6, 8], "values": ["-moz-calc", "-moz-middle-with-baseline", "baseline", "bottom", "calc", "inherit", "initial", "middle", "sub", "super", "text-bottom", "text-top", "top", "unset"], "isInherited": false}, "clip": {"subproperties": ["clip"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "grid-auto-rows": {"subproperties": ["grid-auto-rows"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "margin-left": {"subproperties": ["margin-left"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "animation-name": {"subproperties": ["animation-name"], "supports": [], "values": ["inherit", "initial", "none", "unset"], "isInherited": false}, "border-image-source": {"subproperties": ["border-image-source"], "supports": [4, 5, 11], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "isInherited": false}, "border": {"subproperties": ["border-top-width", "border-right-width", "border-bottom-width", "border-left-width", "border-top-style", "border-right-style", "border-bottom-style", "border-left-style", "border-top-color", "border-right-color", "border-bottom-color", "border-left-color", "-moz-border-top-colors", "-moz-border-right-colors", "-moz-border-bottom-colors", "-moz-border-left-colors", "border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "linear-gradient", "medium", "none", "outset", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset", "url"], "isInherited": false}, "-webkit-transition-timing-function": {"subproperties": ["transition-timing-function"], "supports": [10], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "margin-bottom": {"subproperties": ["margin-bottom"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "animation": {"subproperties": ["animation-duration", "animation-timing-function", "animation-delay", "animation-direction", "animation-fill-mode", "animation-iteration-count", "animation-play-state", "animation-name"], "supports": [7, 9, 10], "values": ["alternate", "alternate-reverse", "backwards", "both", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "forwards", "infinite", "inherit", "initial", "linear", "none", "normal", "paused", "reverse", "running", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "font-weight": {"subproperties": ["font-weight"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": true}, "border-block-start-width": {"subproperties": ["border-block-start-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "mask-type": {"subproperties": ["mask-type"], "supports": [], "values": ["alpha", "inherit", "initial", "luminance", "unset"], "isInherited": false}, "margin-block-end": {"subproperties": ["margin-block-end"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "min-inline-size": {"subproperties": ["min-inline-size"], "supports": [6, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "object-position": {"subproperties": ["object-position"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "page-break-after": {"subproperties": ["page-break-after"], "supports": [], "values": ["always", "auto", "avoid", "inherit", "initial", "left", "right", "unset"], "isInherited": false}, "transition-property": {"subproperties": ["transition-property"], "supports": [], "values": ["all", "inherit", "initial", "none", "unset"], "isInherited": false}, "-moz-float-edge": {"subproperties": ["-moz-float-edge"], "supports": [], "values": ["content-box", "inherit", "initial", "margin-box", "unset"], "isInherited": false}, "white-space": {"subproperties": ["white-space"], "supports": [], "values": ["-moz-pre-space", "inherit", "initial", "normal", "nowrap", "pre", "pre-line", "pre-wrap", "unset"], "isInherited": true}, "-moz-binding": {"subproperties": ["-moz-binding"], "supports": [11], "values": ["inherit", "initial", "none", "unset", "url"], "isInherited": false}, "ruby-align": {"subproperties": ["ruby-align"], "supports": [], "values": ["center", "inherit", "initial", "space-around", "space-between", "start", "unset"], "isInherited": true}, "font-kerning": {"subproperties": ["font-kerning"], "supports": [], "values": ["auto", "inherit", "initial", "none", "normal", "unset"], "isInherited": true}, "border-block-end": {"subproperties": ["border-block-end-width", "border-block-end-style", "border-block-end-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "animation-timing-function": {"subproperties": ["animation-timing-function"], "supports": [10], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "-webkit-border-radius": {"subproperties": ["border-top-left-radius", "border-top-right-radius", "border-bottom-right-radius", "border-bottom-left-radius"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "animation-iteration-count": {"subproperties": ["animation-iteration-count"], "supports": [7], "values": ["infinite", "inherit", "initial", "unset"], "isInherited": false}, "-webkit-animation-direction": {"subproperties": ["animation-direction"], "supports": [], "values": ["alternate", "alternate-reverse", "inherit", "initial", "normal", "reverse", "unset"], "isInherited": false}, "justify-self": {"subproperties": ["justify-self"], "supports": [], "values": ["auto", "baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "isInherited": false}, "-moz-border-top-colors": {"subproperties": ["-moz-border-top-colors"], "supports": [2], "values": ["inherit", "initial", "unset"], "isInherited": false}, "transition-timing-function": {"subproperties": ["transition-timing-function"], "supports": [10], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "-moz-transition-duration": {"subproperties": ["transition-duration"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "scroll-snap-coordinate": {"subproperties": ["scroll-snap-coordinate"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-box-orient": {"subproperties": ["-moz-box-orient"], "supports": [], "values": ["block-axis", "horizontal", "inherit", "initial", "inline-axis", "unset", "vertical"], "isInherited": false}, "counter-increment": {"subproperties": ["counter-increment"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-transform-style": {"subproperties": ["transform-style"], "supports": [], "values": ["flat", "inherit", "initial", "preserve-3d", "unset"], "isInherited": false}, "-moz-transition-timing-function": {"subproperties": ["transition-timing-function"], "supports": [10], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "grid-auto-columns": {"subproperties": ["grid-auto-columns"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-align-content": {"subproperties": ["align-content"], "supports": [], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "space-around", "space-between", "space-evenly", "start", "stretch", "unset"], "isInherited": false}, "font": {"subproperties": ["font-family", "font-style", "font-weight", "font-size", "line-height", "font-size-adjust", "font-stretch", "-x-system-font", "font-feature-settings", "font-language-override", "font-kerning", "font-synthesis", "font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position"], "supports": [6, 7, 8], "values": ["-moz-block-height", "-moz-calc", "all-petite-caps", "all-small-caps", "auto", "calc", "condensed", "expanded", "extra-condensed", "extra-expanded", "inherit", "initial", "italic", "large", "larger", "medium", "none", "normal", "oblique", "petite-caps", "semi-condensed", "semi-expanded", "small", "small-caps", "smaller", "sub", "super", "titling-caps", "ultra-condensed", "ultra-expanded", "unicase", "unset", "x-large", "x-small", "xx-large", "xx-small"], "isInherited": true}, "flex-wrap": {"subproperties": ["flex-wrap"], "supports": [], "values": ["inherit", "initial", "nowrap", "unset", "wrap", "wrap-reverse"], "isInherited": false}, "grid-row-start": {"subproperties": ["grid-row-start"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "list-style-image": {"subproperties": ["list-style-image"], "supports": [11], "values": ["inherit", "initial", "none", "unset", "url"], "isInherited": true}, "text-emphasis-position": {"subproperties": ["text-emphasis-position"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "border-right": {"subproperties": ["border-right-width", "border-right-style", "border-right-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "font-style": {"subproperties": ["font-style"], "supports": [], "values": ["inherit", "initial", "italic", "normal", "oblique", "unset"], "isInherited": true}, "box-shadow": {"subproperties": ["box-shadow"], "supports": [2, 6], "values": ["inherit", "initial", "unset"], "isInherited": false}, "align-self": {"subproperties": ["align-self"], "supports": [], "values": ["auto", "baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "isInherited": false}, "text-emphasis-color": {"subproperties": ["text-emphasis-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": true}, "border-bottom": {"subproperties": ["border-bottom-width", "border-bottom-style", "border-bottom-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "border-spacing": {"subproperties": ["border-spacing"], "supports": [6], "values": ["inherit", "initial", "unset"], "isInherited": true}, "-webkit-border-top-right-radius": {"subproperties": ["border-top-right-radius"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "margin-inline-start": {"subproperties": ["margin-inline-start"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "grid-row-end": {"subproperties": ["grid-row-end"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "perspective-origin": {"subproperties": ["perspective-origin"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "page-break-inside": {"subproperties": ["page-break-inside"], "supports": [], "values": ["auto", "avoid", "inherit", "initial", "unset"], "isInherited": false}, "scroll-behavior": {"subproperties": ["scroll-behavior"], "supports": [], "values": ["auto", "inherit", "initial", "smooth", "unset"], "isInherited": false}, "-moz-backface-visibility": {"subproperties": ["backface-visibility"], "supports": [], "values": ["hidden", "inherit", "initial", "unset", "visible"], "isInherited": false}, "-moz-outline-radius": {"subproperties": ["-moz-outline-radius-topleft", "-moz-outline-radius-topright", "-moz-outline-radius-bottomright", "-moz-outline-radius-bottomleft"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "mask-clip": {"subproperties": ["mask-clip"], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "supports": [], "isInherited": false}, "grid-row": {"subproperties": ["grid-row-start", "grid-row-end"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-bottom-right-radius": {"subproperties": ["border-bottom-right-radius"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "line-height": {"subproperties": ["line-height"], "supports": [6, 7, 8], "values": ["-moz-block-height", "-moz-calc", "calc", "inherit", "initial", "normal", "unset"], "isInherited": true}, "stroke-linejoin": {"subproperties": ["stroke-linejoin"], "supports": [], "values": ["bevel", "inherit", "initial", "miter", "round", "unset"], "isInherited": true}, "text-align-last": {"subproperties": ["text-align-last"], "supports": [], "values": ["auto", "center", "end", "inherit", "initial", "justify", "left", "right", "start", "unset"], "isInherited": true}, "word-spacing": {"subproperties": ["word-spacing"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "normal", "unset"], "isInherited": true}, "transform-style": {"subproperties": ["transform-style"], "supports": [], "values": ["flat", "inherit", "initial", "preserve-3d", "unset"], "isInherited": false}, "border-bottom-color": {"subproperties": ["border-bottom-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "font-language-override": {"subproperties": ["font-language-override"], "supports": [], "values": ["inherit", "initial", "normal", "unset"], "isInherited": true}, "-moz-outline-radius-topleft": {"subproperties": ["-moz-outline-radius-topleft"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-image": {"subproperties": ["border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat"], "supports": [4, 5, 6, 7, 8, 11], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "isInherited": false}, "caption-side": {"subproperties": ["caption-side"], "supports": [], "values": ["bottom", "bottom-outside", "inherit", "initial", "left", "right", "top", "top-outside", "unset"], "isInherited": true}, "-webkit-mask-position": {"subproperties": ["mask-position-x", "mask-position-y"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "border-inline-end-width": {"subproperties": ["border-inline-end-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "-webkit-border-image": {"subproperties": ["border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat"], "supports": [4, 5, 6, 7, 8, 11], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "isInherited": false}, "font-synthesis": {"subproperties": ["font-synthesis"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "grid-template": {"subproperties": ["grid-template-areas", "grid-template-rows", "grid-template-columns"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-mask-repeat": {"subproperties": ["mask-repeat"], "values": ["inherit", "initial", "no-repeat", "repeat", "repeat-x", "repeat-y", "round", "space", "unset"], "supports": [], "isInherited": false}, "-webkit-justify-content": {"subproperties": ["justify-content"], "supports": [], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "space-around", "space-between", "space-evenly", "start", "stretch", "unset"], "isInherited": false}, "text-decoration-color": {"subproperties": ["text-decoration-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "color": {"subproperties": ["color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": true}, "-moz-border-end-width": {"subproperties": ["border-inline-end-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "height": {"subproperties": ["height"], "supports": [6, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "margin-right": {"subproperties": ["margin-right"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-webkit-border-bottom-left-radius": {"subproperties": ["border-bottom-left-radius"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-transform": {"subproperties": ["transform"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-bottom-left-radius": {"subproperties": ["border-bottom-left-radius"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "fill-rule": {"subproperties": ["fill-rule"], "supports": [], "values": ["evenodd", "inherit", "initial", "nonzero", "unset"], "isInherited": true}, "min-width": {"subproperties": ["min-width"], "supports": [6, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "empty-cells": {"subproperties": ["empty-cells"], "supports": [], "values": ["hide", "inherit", "initial", "show", "unset"], "isInherited": true}, "direction": {"subproperties": ["direction"], "supports": [], "values": ["inherit", "initial", "ltr", "rtl", "unset"], "isInherited": true}, "clip-path": {"subproperties": ["clip-path"], "supports": [11], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-mask-size": {"subproperties": ["mask-size"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-box-orient": {"subproperties": ["-moz-box-orient"], "supports": [], "values": ["block-axis", "horizontal", "inherit", "initial", "inline-axis", "unset", "vertical"], "isInherited": false}, "z-index": {"subproperties": ["z-index"], "supports": [7], "values": ["auto", "inherit", "initial", "unset"], "isInherited": false}, "background-position-y": {"subproperties": ["background-position-y"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "text-decoration-style": {"subproperties": ["text-decoration-style"], "supports": [], "values": ["-moz-none", "dashed", "dotted", "double", "inherit", "initial", "solid", "unset", "wavy"], "isInherited": false}, "grid-template-areas": {"subproperties": ["grid-template-areas"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-perspective-origin": {"subproperties": ["perspective-origin"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-animation-direction": {"subproperties": ["animation-direction"], "supports": [], "values": ["alternate", "alternate-reverse", "inherit", "initial", "normal", "reverse", "unset"], "isInherited": false}, "font-size-adjust": {"subproperties": ["font-size-adjust"], "supports": [7], "values": ["inherit", "initial", "none", "unset"], "isInherited": true}, "cursor": {"subproperties": ["cursor"], "supports": [11], "values": ["inherit", "initial", "unset"], "isInherited": true}, "margin": {"subproperties": ["margin-top", "margin-right", "margin-bottom", "margin-left"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-webkit-animation": {"subproperties": ["animation-duration", "animation-timing-function", "animation-delay", "animation-direction", "animation-fill-mode", "animation-iteration-count", "animation-play-state", "animation-name"], "supports": [7, 9, 10], "values": ["alternate", "alternate-reverse", "backwards", "both", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "forwards", "infinite", "inherit", "initial", "linear", "none", "normal", "paused", "reverse", "running", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "-moz-control-character-visibility": {"subproperties": ["-moz-control-character-visibility"], "supports": [], "values": ["hidden", "inherit", "initial", "unset", "visible"], "isInherited": true}, "letter-spacing": {"subproperties": ["letter-spacing"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "normal", "unset"], "isInherited": true}, "-moz-transition-delay": {"subproperties": ["transition-delay"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "will-change": {"subproperties": ["will-change"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "transform-origin": {"subproperties": ["transform-origin"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "font-variant-ligatures": {"subproperties": ["font-variant-ligatures"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "padding-block-start": {"subproperties": ["padding-block-start"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-webkit-animation-duration": {"subproperties": ["animation-duration"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-block-end-width": {"subproperties": ["border-block-end-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "-webkit-mask-origin": {"subproperties": ["mask-origin"], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "supports": [], "isInherited": false}, "word-break": {"subproperties": ["word-break"], "supports": [], "values": ["break-all", "inherit", "initial", "keep-all", "normal", "unset"], "isInherited": true}, "table-layout": {"subproperties": ["table-layout"], "supports": [], "values": ["auto", "fixed", "inherit", "initial", "unset"], "isInherited": false}, "text-overflow": {"subproperties": ["text-overflow"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-flex": {"subproperties": ["flex-grow", "flex-shrink", "flex-basis"], "supports": [6, 7, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "grid-auto-flow": {"subproperties": ["grid-auto-flow"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-top-right-radius": {"subproperties": ["border-top-right-radius"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-image-outset": {"subproperties": ["border-image-outset"], "supports": [6, 7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "mask-size": {"subproperties": ["mask-size"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "touch-action": {"subproperties": ["touch-action"], "supports": [], "values": ["auto", "inherit", "initial", "manipulation", "none", "pan-x", "pan-y", "unset"], "isInherited": false}, "border-right-color": {"subproperties": ["border-right-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "backface-visibility": {"subproperties": ["backface-visibility"], "supports": [], "values": ["hidden", "inherit", "initial", "unset", "visible"], "isInherited": false}, "background-image": {"subproperties": ["background-image"], "supports": [4, 5, 11], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "isInherited": false}, "-moz-box-ordinal-group": {"subproperties": ["-moz-box-ordinal-group"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-transition-property": {"subproperties": ["transition-property"], "supports": [], "values": ["all", "inherit", "initial", "none", "unset"], "isInherited": false}, "writing-mode": {"subproperties": ["writing-mode"], "supports": [], "values": ["horizontal-tb", "inherit", "initial", "lr", "lr-tb", "rl", "rl-tb", "sideways-lr", "sideways-rl", "tb", "tb-rl", "unset", "vertical-lr", "vertical-rl"], "isInherited": true}, "stroke-opacity": {"subproperties": ["stroke-opacity"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": true}, "box-sizing": {"subproperties": ["box-sizing"], "supports": [], "values": ["border-box", "content-box", "inherit", "initial", "unset"], "isInherited": false}, "margin-top": {"subproperties": ["margin-top"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "position": {"subproperties": ["position"], "supports": [], "values": ["absolute", "fixed", "inherit", "initial", "relative", "static", "sticky", "unset"], "isInherited": false}, "list-style-position": {"subproperties": ["list-style-position"], "supports": [], "values": ["inherit", "initial", "inside", "outside", "unset"], "isInherited": true}, "-webkit-box-pack": {"subproperties": ["-moz-box-pack"], "supports": [], "values": ["center", "end", "inherit", "initial", "justify", "start", "unset"], "isInherited": false}, "quotes": {"subproperties": ["quotes"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "border-top": {"subproperties": ["border-top-width", "border-top-style", "border-top-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "-moz-animation-delay": {"subproperties": ["animation-delay"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-transition": {"subproperties": ["transition-property", "transition-duration", "transition-timing-function", "transition-delay"], "supports": [9, 10], "values": ["all", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "none", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "-moz-window-dragging": {"subproperties": ["-moz-window-dragging"], "supports": [], "values": ["default", "drag", "inherit", "initial", "no-drag", "unset"], "isInherited": false}, "lighting-color": {"subproperties": ["lighting-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "background-size": {"subproperties": ["background-size"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-border-top-left-radius": {"subproperties": ["border-top-left-radius"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-outline-radius-bottomleft": {"subproperties": ["-moz-outline-radius-bottomleft"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "mask-position-x": {"subproperties": ["mask-position-x"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "mask-position-y": {"subproperties": ["mask-position-y"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "justify-content": {"subproperties": ["justify-content"], "supports": [], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "space-around", "space-between", "space-evenly", "start", "stretch", "unset"], "isInherited": false}, "animation-fill-mode": {"subproperties": ["animation-fill-mode"], "supports": [], "values": ["backwards", "both", "forwards", "inherit", "initial", "none", "unset"], "isInherited": false}, "-webkit-filter": {"subproperties": ["filter"], "supports": [11], "values": ["inherit", "initial", "unset"], "isInherited": false}, "word-wrap": {"subproperties": ["overflow-wrap"], "supports": [], "values": ["break-word", "inherit", "initial", "normal", "unset"], "isInherited": true}, "grid": {"subproperties": ["grid-template-areas", "grid-template-rows", "grid-template-columns", "grid-auto-flow", "grid-auto-rows", "grid-auto-columns", "grid-row-gap", "grid-column-gap"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "background": {"subproperties": ["background-color", "background-image", "background-repeat", "background-attachment", "background-clip", "background-origin", "background-position-x", "background-position-y", "background-size"], "supports": [2, 4, 5, 6, 8, 11], "values": ["COLOR", "-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "border-box", "content-box", "currentColor", "fixed", "hsl", "hsla", "inherit", "initial", "linear-gradient", "local", "no-repeat", "none", "padding-box", "radial-gradient", "repeat", "repeat-x", "repeat-y", "repeating-linear-gradient", "repeating-radial-gradient", "rgb", "rgba", "round", "scroll", "space", "text", "transparent", "unset", "url"], "isInherited": false}, "margin-block-start": {"subproperties": ["margin-block-start"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "grid-column-start": {"subproperties": ["grid-column-start"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "text-align": {"subproperties": ["text-align"], "supports": [], "values": ["-moz-center", "-moz-left", "-moz-right", "center", "end", "inherit", "initial", "justify", "left", "right", "start", "unset"], "isInherited": true}, "marker-end": {"subproperties": ["marker-end"], "supports": [11], "values": ["inherit", "initial", "none", "unset", "url"], "isInherited": true}, "justify-items": {"subproperties": ["justify-items"], "supports": [], "values": ["auto", "baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "isInherited": false}, "mask-position": {"subproperties": ["mask-position-x", "mask-position-y"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-columns": {"subproperties": ["-moz-column-count", "-moz-column-width"], "supports": [6, 7], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-moz-outline-radius-topright": {"subproperties": ["-moz-outline-radius-topright"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "right": {"subproperties": ["right"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-moz-border-left-colors": {"subproperties": ["-moz-border-left-colors"], "supports": [2], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-mask-position-x": {"subproperties": ["mask-position-x"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-transition-duration": {"subproperties": ["transition-duration"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-top-width": {"subproperties": ["border-top-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "bottom": {"subproperties": ["bottom"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "border-block-end-style": {"subproperties": ["border-block-end-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "-webkit-order": {"subproperties": ["order"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-animation-iteration-count": {"subproperties": ["animation-iteration-count"], "supports": [7], "values": ["infinite", "inherit", "initial", "unset"], "isInherited": false}, "-moz-animation-timing-function": {"subproperties": ["animation-timing-function"], "supports": [10], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "background-color": {"subproperties": ["background-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "-webkit-backface-visibility": {"subproperties": ["backface-visibility"], "supports": [], "values": ["hidden", "inherit", "initial", "unset", "visible"], "isInherited": false}, "animation-delay": {"subproperties": ["animation-delay"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "unicode-bidi": {"subproperties": ["unicode-bidi"], "supports": [], "values": ["-moz-isolate", "-moz-isolate-override", "-moz-plaintext", "bidi-override", "embed", "inherit", "initial", "isolate", "isolate-override", "normal", "plaintext", "unset"], "isInherited": false}, "text-shadow": {"subproperties": ["text-shadow"], "supports": [2, 6], "values": ["inherit", "initial", "unset"], "isInherited": true}, "-moz-user-modify": {"subproperties": ["-moz-user-modify"], "supports": [], "values": ["inherit", "initial", "read-only", "read-write", "unset", "write-only"], "isInherited": true}, "-webkit-box-direction": {"subproperties": ["-moz-box-direction"], "supports": [], "values": ["inherit", "initial", "normal", "reverse", "unset"], "isInherited": false}, "image-rendering": {"subproperties": ["image-rendering"], "supports": [], "values": ["-moz-crisp-edges", "auto", "inherit", "initial", "optimizequality", "optimizespeed", "unset"], "isInherited": true}, "border-inline-end": {"subproperties": ["border-inline-end-width", "border-inline-end-style", "border-inline-end-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "grid-gap": {"subproperties": ["grid-row-gap", "grid-column-gap"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-moz-animation-name": {"subproperties": ["animation-name"], "supports": [], "values": ["inherit", "initial", "none", "unset"], "isInherited": false}, "pointer-events": {"subproperties": ["pointer-events"], "supports": [], "values": ["all", "auto", "fill", "inherit", "initial", "none", "painted", "stroke", "unset", "visible", "visiblefill", "visiblepainted", "visiblestroke"], "isInherited": true}, "border-image-width": {"subproperties": ["border-image-width"], "supports": [6, 7, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-inline-start": {"subproperties": ["border-inline-start-width", "border-inline-start-style", "border-inline-start-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "min-block-size": {"subproperties": ["min-block-size"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-webkit-mask-clip": {"subproperties": ["mask-clip"], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "supports": [], "isInherited": false}, "-webkit-mask-image": {"subproperties": ["mask-image"], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "supports": [4, 5, 11], "isInherited": false}, "float": {"subproperties": ["float"], "supports": [], "values": ["inherit", "initial", "inline-end", "inline-start", "left", "none", "right", "unset"], "isInherited": false}, "max-height": {"subproperties": ["max-height"], "supports": [6, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "calc", "inherit", "initial", "none", "unset"], "isInherited": false}, "outline-offset": {"subproperties": ["outline-offset"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-moz-transform-style": {"subproperties": ["transform-style"], "supports": [], "values": ["flat", "inherit", "initial", "preserve-3d", "unset"], "isInherited": false}, "overflow-wrap": {"subproperties": ["overflow-wrap"], "supports": [], "values": ["break-word", "inherit", "initial", "normal", "unset"], "isInherited": true}, "fill": {"subproperties": ["fill"], "supports": [2, 11], "values": ["inherit", "initial", "unset"], "isInherited": true}, "scroll-snap-type": {"subproperties": ["scroll-snap-type-x", "scroll-snap-type-y"], "supports": [], "values": ["inherit", "initial", "mandatory", "none", "proximity", "unset"], "isInherited": false}, "text-emphasis-style": {"subproperties": ["text-emphasis-style"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "transform": {"subproperties": ["transform"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-text-align-last": {"subproperties": ["text-align-last"], "supports": [], "values": ["auto", "center", "end", "inherit", "initial", "justify", "left", "right", "start", "unset"], "isInherited": true}, "width": {"subproperties": ["width"], "supports": [6, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "stroke-miterlimit": {"subproperties": ["stroke-miterlimit"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": true}, "stop-opacity": {"subproperties": ["stop-opacity"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-top-color": {"subproperties": ["border-top-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "background-position": {"subproperties": ["background-position-x", "background-position-y"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "scroll-snap-type-x": {"subproperties": ["scroll-snap-type-x"], "supports": [], "values": ["inherit", "initial", "mandatory", "none", "proximity", "unset"], "isInherited": false}, "scroll-snap-type-y": {"subproperties": ["scroll-snap-type-y"], "supports": [], "values": ["inherit", "initial", "mandatory", "none", "proximity", "unset"], "isInherited": false}, "-moz-box-sizing": {"subproperties": ["box-sizing"], "supports": [], "values": ["border-box", "content-box", "inherit", "initial", "unset"], "isInherited": false}, "offset-block-start": {"subproperties": ["offset-block-start"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-webkit-background-origin": {"subproperties": ["background-origin"], "supports": [], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "isInherited": false}, "-webkit-align-items": {"subproperties": ["align-items"], "supports": [], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "isInherited": false}, "-moz-padding-start": {"subproperties": ["padding-inline-start"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "transition-delay": {"subproperties": ["transition-delay"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-style": {"subproperties": ["border-top-style", "border-right-style", "border-bottom-style", "border-left-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "mask-repeat": {"subproperties": ["mask-repeat"], "values": ["inherit", "initial", "no-repeat", "repeat", "repeat-x", "repeat-y", "round", "space", "unset"], "supports": [], "isInherited": false}, "overflow": {"subproperties": ["overflow-x", "overflow-y"], "supports": [], "values": ["-moz-hidden-unscrollable", "auto", "hidden", "inherit", "initial", "scroll", "unset", "visible"], "isInherited": false}, "mask-origin": {"subproperties": ["mask-origin"], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "supports": [], "isInherited": false}, "-moz-force-broken-image-icon": {"subproperties": ["-moz-force-broken-image-icon"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "grid-template-columns": {"subproperties": ["grid-template-columns"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-align-self": {"subproperties": ["align-self"], "supports": [], "values": ["auto", "baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "isInherited": false}, "-webkit-perspective-origin": {"subproperties": ["perspective-origin"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-block-start": {"subproperties": ["border-block-start-width", "border-block-start-style", "border-block-start-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "display": {"subproperties": ["display"], "supports": [], "values": ["-moz-box", "-moz-deck", "-moz-grid", "-moz-grid-group", "-moz-grid-line", "-moz-groupbox", "-moz-inline-box", "-moz-inline-grid", "-moz-inline-stack", "-moz-popup", "-moz-stack", "-webkit-box", "-webkit-flex", "-webkit-inline-box", "-webkit-inline-flex", "block", "contents", "flex", "grid", "inherit", "initial", "inline", "inline-block", "inline-flex", "inline-grid", "inline-table", "list-item", "none", "ruby", "ruby-base", "ruby-base-container", "ruby-text", "ruby-text-container", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", "table-row-group", "unset"], "isInherited": false}, "-webkit-box-ordinal-group": {"subproperties": ["-moz-box-ordinal-group"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-column-width": {"subproperties": ["-moz-column-width"], "supports": [6], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "border-color": {"subproperties": ["border-top-color", "border-right-color", "border-bottom-color", "border-left-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "-webkit-flex-basis": {"subproperties": ["flex-basis"], "supports": [6, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "stroke-dashoffset": {"subproperties": ["stroke-dashoffset"], "supports": [6, 7, 8], "values": ["inherit", "initial", "unset"], "isInherited": true}, "-moz-transform-origin": {"subproperties": ["transform-origin"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-text-size-adjust": {"subproperties": ["-moz-text-size-adjust"], "supports": [], "values": ["auto", "inherit", "initial", "none", "unset"], "isInherited": true}, "border-left-color": {"subproperties": ["border-left-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "overflow-y": {"subproperties": ["overflow-y"], "supports": [], "values": ["-moz-hidden-unscrollable", "auto", "hidden", "inherit", "initial", "scroll", "unset", "visible"], "isInherited": false}, "overflow-x": {"subproperties": ["overflow-x"], "supports": [], "values": ["-moz-hidden-unscrollable", "auto", "hidden", "inherit", "initial", "scroll", "unset", "visible"], "isInherited": false}, "-moz-user-select": {"subproperties": ["-moz-user-select"], "supports": [], "values": ["-moz-all", "-moz-none", "-moz-text", "all", "auto", "element", "elements", "inherit", "initial", "none", "text", "toggle", "tri-state", "unset"], "isInherited": false}, "-moz-column-rule": {"subproperties": ["-moz-column-rule-width", "-moz-column-rule-style", "-moz-column-rule-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "-moz-outline-radius-bottomright": {"subproperties": ["-moz-outline-radius-bottomright"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-column-rule-color": {"subproperties": ["-moz-column-rule-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "-moz-transition": {"subproperties": ["transition-property", "transition-duration", "transition-timing-function", "transition-delay"], "supports": [9, 10], "values": ["all", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "none", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "opacity": {"subproperties": ["opacity"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-perspective": {"subproperties": ["perspective"], "supports": [6], "values": ["inherit", "initial", "none", "unset"], "isInherited": false}, "-webkit-text-stroke-color": {"subproperties": ["-webkit-text-stroke-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": true}, "align-content": {"subproperties": ["align-content"], "supports": [], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "space-around", "space-between", "space-evenly", "start", "stretch", "unset"], "isInherited": false}, "scroll-snap-points-y": {"subproperties": ["scroll-snap-points-y"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-transition-property": {"subproperties": ["transition-property"], "supports": [], "values": ["all", "inherit", "initial", "none", "unset"], "isInherited": false}, "border-bottom-style": {"subproperties": ["border-bottom-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "-moz-animation-play-state": {"subproperties": ["animation-play-state"], "supports": [], "values": ["inherit", "initial", "paused", "running", "unset"], "isInherited": false}, "mask": {"subproperties": ["mask-image", "mask-repeat", "mask-position-x", "mask-position-y", "mask-clip", "mask-origin", "mask-size", "mask-composite", "mask-mode"], "supports": [4, 5, 6, 8, 11], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "add", "alpha", "border-box", "content-box", "exclude", "inherit", "initial", "intersect", "linear-gradient", "luminance", "match-source", "no-repeat", "none", "padding-box", "radial-gradient", "repeat", "repeat-x", "repeat-y", "repeating-linear-gradient", "repeating-radial-gradient", "round", "space", "subtract", "unset", "url"], "isInherited": false}, "background-position-x": {"subproperties": ["background-position-x"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "stop-color": {"subproperties": ["stop-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "border-block-end-color": {"subproperties": ["border-block-end-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "stroke-dasharray": {"subproperties": ["stroke-dasharray"], "supports": [6, 7, 8], "values": ["inherit", "initial", "unset"], "isInherited": true}, "border-inline-start-color": {"subproperties": ["border-inline-start-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}};
 
 /**
  * A list of the pseudo elements.
  */
 exports.PSEUDO_ELEMENTS = [":after", ":before", ":backdrop", ":first-letter", ":first-line", ":-moz-selection", ":-moz-focus-inner", ":-moz-focus-outer", ":-moz-list-bullet", ":-moz-list-number", ":-moz-math-anonymous", ":-moz-progress-bar", ":-moz-range-track", ":-moz-range-progress", ":-moz-range-thumb", ":-moz-meter-bar", ":-moz-placeholder", ":placeholder", ":-moz-color-swatch"];
 
 /**
  * A list of the preferences keys for whether a CSS property is enabled or not. This is
--- a/dom/events/ContentEventHandler.cpp
+++ b/dom/events/ContentEventHandler.cpp
@@ -303,18 +303,17 @@ ContentEventHandler::Init(WidgetQueryCon
     if (composition) {
       uint32_t compositionStart = composition->NativeOffsetOfStartComposition();
       if (NS_WARN_IF(!aEvent->mInput.MakeOffsetAbsolute(compositionStart))) {
         return NS_ERROR_FAILURE;
       }
     } else {
       LineBreakType lineBreakType = GetLineBreakType(aEvent);
       uint32_t selectionStart = 0;
-      rv = GetFlatTextLengthBefore(mFirstSelectedRange,
-                                   &selectionStart, lineBreakType);
+      rv = GetStartOffset(mFirstSelectedRange, &selectionStart, lineBreakType);
       if (NS_WARN_IF(NS_FAILED(rv))) {
         return NS_ERROR_FAILURE;
       }
       if (NS_WARN_IF(!aEvent->mInput.MakeOffsetAbsolute(selectionStart))) {
         return NS_ERROR_FAILURE;
       }
     }
   }
@@ -1304,18 +1303,18 @@ ContentEventHandler::OnQuerySelectedText
       !nsContentUtils::ContentIsDescendantOf(endNode, mRootContent)) {
     return NS_ERROR_NOT_AVAILABLE;
   }
 
   NS_ASSERTION(aEvent->mReply.mString.IsEmpty(),
                "The reply string must be empty");
 
   LineBreakType lineBreakType = GetLineBreakType(aEvent);
-  rv = GetFlatTextLengthBefore(mFirstSelectedRange,
-                               &aEvent->mReply.mOffset, lineBreakType);
+  rv = GetStartOffset(mFirstSelectedRange,
+                      &aEvent->mReply.mOffset, lineBreakType);
   NS_ENSURE_SUCCESS(rv, rv);
 
   nsCOMPtr<nsINode> anchorNode, focusNode;
   int32_t anchorOffset, focusOffset;
   if (mSelection->RangeCount()) {
     // If there is only one selection range, the anchor/focus node and offset
     // are the information of the range.  Therefore, we have the direction
     // information.
@@ -2435,18 +2434,18 @@ ContentEventHandler::OnQueryCaretRect(Wi
 
   // When the selection is collapsed and the queried offset is current caret
   // position, we should return the "real" caret rect.
   if (mSelection->IsCollapsed()) {
     nsRect caretRect;
     nsIFrame* caretFrame = nsCaret::GetGeometry(mSelection, &caretRect);
     if (caretFrame) {
       uint32_t offset;
-      rv = GetFlatTextLengthBefore(mFirstSelectedRange,
-                                   &offset, GetLineBreakType(aEvent));
+      rv = GetStartOffset(mFirstSelectedRange,
+                          &offset, GetLineBreakType(aEvent));
       NS_ENSURE_SUCCESS(rv, rv);
       if (offset == aEvent->mInput.mOffset) {
         rv = ConvertToRootRelativeOffset(caretFrame, caretRect);
         NS_ENSURE_SUCCESS(rv, rv);
         nscoord appUnitsPerDevPixel =
           caretFrame->PresContext()->AppUnitsPerDevPixel();
         aEvent->mReply.mRect = LayoutDeviceIntRect::FromUnknownRect(
           caretRect.ToOutsidePixels(appUnitsPerDevPixel));
@@ -2693,71 +2692,72 @@ ContentEventHandler::GetFlatTextLengthIn
     *aLength = 0;
     return NS_OK;
   }
 
   // Don't create nsContentIterator instance until it's really necessary since
   // destroying without initializing causes unexpected NS_ASSERTION() call.
   nsCOMPtr<nsIContentIterator> iter;
 
+  // Working with ContentIterator, we may need to adjust the end position for
+  // including it forcibly.
+  NodePosition endPosition(aEndPosition);
+
   // This may be called for retrieving the text of removed nodes.  Even in this
   // case, the node thinks it's still in the tree because UnbindFromTree() will
   // be called after here.  However, the node was already removed from the
   // array of children of its parent.  So, be careful to handle this case.
   if (aIsRemovingNode) {
     DebugOnly<nsIContent*> parent = aStartPosition.mNode->GetParent();
     MOZ_ASSERT(parent && parent->IndexOf(aStartPosition.mNode) == -1,
       "At removing the node, the node shouldn't be in the array of children "
       "of its parent");
-    MOZ_ASSERT(aStartPosition.mNode == aEndPosition.mNode,
+    MOZ_ASSERT(aStartPosition.mNode == endPosition.mNode,
       "At removing the node, start and end node should be same");
     MOZ_ASSERT(aStartPosition.mOffset == 0,
       "When the node is being removed, the start offset should be 0");
-    MOZ_ASSERT(static_cast<uint32_t>(aEndPosition.mOffset) ==
-                 aEndPosition.mNode->GetChildCount(),
+    MOZ_ASSERT(static_cast<uint32_t>(endPosition.mOffset) ==
+                 endPosition.mNode->GetChildCount(),
       "When the node is being removed, the end offset should be child count");
     iter = NS_NewPreContentIterator();
     nsresult rv = iter->Init(aStartPosition.mNode);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
   } else {
     RefPtr<nsRange> prev = new nsRange(aRootContent);
     nsresult rv = aStartPosition.SetToRangeStart(prev);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
     // When the end position is immediately after non-root element's open tag,
     // we need to include a line break caused by the open tag.
-    NodePosition endPosition;
-    if (aEndPosition.mNode != aRootContent &&
-        aEndPosition.IsImmediatelyAfterOpenTag()) {
-      if (aEndPosition.mNode->HasChildren()) {
-        // When the end node has some children, move the end position to the
-        // start of its first child.
-        nsINode* firstChild = aEndPosition.mNode->GetFirstChild();
+    if (endPosition.mNode != aRootContent &&
+        endPosition.IsImmediatelyAfterOpenTag()) {
+      if (endPosition.mNode->HasChildren()) {
+        // When the end node has some children, move the end position to before
+        // the open tag of its first child.
+        nsINode* firstChild = endPosition.mNode->GetFirstChild();
         if (NS_WARN_IF(!firstChild)) {
           return NS_ERROR_FAILURE;
         }
-        endPosition = NodePosition(firstChild, 0);
+        endPosition = NodePositionBefore(firstChild, 0);
       } else {
         // When the end node is empty, move the end position after the node.
-        nsIContent* parentContent = aEndPosition.mNode->GetParent();
+        nsIContent* parentContent = endPosition.mNode->GetParent();
         if (NS_WARN_IF(!parentContent)) {
           return NS_ERROR_FAILURE;
         }
-        int32_t indexInParent = parentContent->IndexOf(aEndPosition.mNode);
+        int32_t indexInParent = parentContent->IndexOf(endPosition.mNode);
         if (NS_WARN_IF(indexInParent < 0)) {
           return NS_ERROR_FAILURE;
         }
-        endPosition = NodePosition(parentContent, indexInParent + 1);
+        endPosition = NodePositionBefore(parentContent, indexInParent + 1);
       }
-    } else {
-      endPosition = aEndPosition;
     }
 
     if (endPosition.OffsetIsValid()) {
       // Offset is within node's length; set end of range to that offset
       rv = endPosition.SetToRangeEnd(prev);
       if (NS_WARN_IF(NS_FAILED(rv))) {
         return rv;
       }
@@ -2795,43 +2795,48 @@ ContentEventHandler::GetFlatTextLengthIn
     }
     if (!node->IsContent()) {
       continue;
     }
     nsIContent* content = node->AsContent();
 
     if (node->IsNodeOfType(nsINode::eTEXT)) {
       // Note: our range always starts from offset 0
-      if (node == aEndPosition.mNode) {
+      if (node == endPosition.mNode) {
         *aLength += GetTextLength(content, aLineBreakType,
-                                  aEndPosition.mOffset);
+                                  endPosition.mOffset);
       } else {
         *aLength += GetTextLength(content, aLineBreakType);
       }
     } else if (ShouldBreakLineBefore(content, aRootContent)) {
       // If the start position is start of this node but doesn't include the
       // open tag, don't append the line break length.
       if (node == aStartPosition.mNode && !aStartPosition.IsBeforeOpenTag()) {
         continue;
       }
+      // If the end position is before the open tag, don't append the line
+      // break length.
+      if (node == endPosition.mNode && endPosition.IsBeforeOpenTag()) {
+        continue;
+      }
       *aLength += GetBRLength(aLineBreakType);
     }
   }
   return NS_OK;
 }
 
 nsresult
-ContentEventHandler::GetFlatTextLengthBefore(nsRange* aRange,
-                                             uint32_t* aOffset,
-                                             LineBreakType aLineBreakType)
+ContentEventHandler::GetStartOffset(nsRange* aRange,
+                                    uint32_t* aOffset,
+                                    LineBreakType aLineBreakType)
 {
   MOZ_ASSERT(aRange);
   return GetFlatTextLengthInRange(
            NodePosition(mRootContent, 0),
-           NodePositionBefore(aRange->GetStartParent(), aRange->StartOffset()),
+           NodePosition(aRange->GetStartParent(), aRange->StartOffset()),
            mRootContent, aOffset, aLineBreakType);
 }
 
 nsresult
 ContentEventHandler::AdjustCollapsedRangeMaybeIntoTextNode(nsRange* aRange)
 {
   MOZ_ASSERT(aRange);
   MOZ_ASSERT(aRange->Collapsed());
--- a/dom/events/ContentEventHandler.h
+++ b/dom/events/ContentEventHandler.h
@@ -247,20 +247,22 @@ protected:
   // elements causes "\n" (or "\r\n"), see also ShouldBreakLineBefore().
   nsresult GenerateFlatTextContent(nsIContent* aContent,
                                    nsAFlatString& aString,
                                    LineBreakType aLineBreakType);
   // Get the contents of aRange as plain text.
   nsresult GenerateFlatTextContent(nsRange* aRange,
                                    nsAFlatString& aString,
                                    LineBreakType aLineBreakType);
-  // Get the text length before the start position of aRange.
-  nsresult GetFlatTextLengthBefore(nsRange* aRange,
-                                   uint32_t* aOffset,
-                                   LineBreakType aLineBreakType);
+  // Get offset of start of aRange.  Note that the result includes the length
+  // of line breaker caused by the start of aContent because aRange never
+  // includes the line breaker caused by its start node.
+  nsresult GetStartOffset(nsRange* aRange,
+                          uint32_t* aOffset,
+                          LineBreakType aLineBreakType);
   // Check if we should insert a line break before aContent.
   // This should return false only when aContent is an html element which
   // is typically used in a paragraph like <em>.
   static bool ShouldBreakLineBefore(nsIContent* aContent,
                                     nsINode* aRootNode);
   // Get the line breaker length.
   static inline uint32_t GetBRLength(LineBreakType aLineBreakType);
   static LineBreakType GetLineBreakType(WidgetQueryContentEvent* aEvent);
--- a/dom/html/nsGenericHTMLElement.cpp
+++ b/dom/html/nsGenericHTMLElement.cpp
@@ -1509,26 +1509,26 @@ nsGenericHTMLElement::MapImageBorderAttr
   if (borderRightStyle->GetUnit() == eCSSUnit_Null)
     borderRightStyle->SetIntValue(NS_STYLE_BORDER_STYLE_SOLID, eCSSUnit_Enumerated);
   nsCSSValue* borderBottomStyle = aData->ValueForBorderBottomStyle();
   if (borderBottomStyle->GetUnit() == eCSSUnit_Null)
     borderBottomStyle->SetIntValue(NS_STYLE_BORDER_STYLE_SOLID, eCSSUnit_Enumerated);
 
   nsCSSValue* borderLeftColor = aData->ValueForBorderLeftColor();
   if (borderLeftColor->GetUnit() == eCSSUnit_Null)
-    borderLeftColor->SetIntValue(NS_STYLE_COLOR_MOZ_USE_TEXT_COLOR, eCSSUnit_Enumerated);
+    borderLeftColor->SetIntValue(NS_COLOR_CURRENTCOLOR, eCSSUnit_EnumColor);
   nsCSSValue* borderTopColor = aData->ValueForBorderTopColor();
   if (borderTopColor->GetUnit() == eCSSUnit_Null)
-    borderTopColor->SetIntValue(NS_STYLE_COLOR_MOZ_USE_TEXT_COLOR, eCSSUnit_Enumerated);
+    borderTopColor->SetIntValue(NS_COLOR_CURRENTCOLOR, eCSSUnit_EnumColor);
   nsCSSValue* borderRightColor = aData->ValueForBorderRightColor();
   if (borderRightColor->GetUnit() == eCSSUnit_Null)
-    borderRightColor->SetIntValue(NS_STYLE_COLOR_MOZ_USE_TEXT_COLOR, eCSSUnit_Enumerated);
+    borderRightColor->SetIntValue(NS_COLOR_CURRENTCOLOR, eCSSUnit_EnumColor);
   nsCSSValue* borderBottomColor = aData->ValueForBorderBottomColor();
   if (borderBottomColor->GetUnit() == eCSSUnit_Null)
-    borderBottomColor->SetIntValue(NS_STYLE_COLOR_MOZ_USE_TEXT_COLOR, eCSSUnit_Enumerated);
+    borderBottomColor->SetIntValue(NS_COLOR_CURRENTCOLOR, eCSSUnit_EnumColor);
 }
 
 void
 nsGenericHTMLElement::MapBackgroundInto(const nsMappedAttributes* aAttributes,
                                         nsRuleData* aData)
 {
   if (!(aData->mSIDs & NS_STYLE_INHERIT_BIT(Background)))
     return;
--- a/dom/media/MediaDecoder.cpp
+++ b/dom/media/MediaDecoder.cpp
@@ -494,17 +494,16 @@ MediaDecoder::MediaDecoder(MediaDecoderO
   , mCDMProxyPromise(mCDMProxyPromiseHolder.Ensure(__func__))
   , mIgnoreProgressData(false)
   , mInfiniteStream(false)
   , mOwner(aOwner)
   , mFrameStats(new FrameStatistics())
   , mVideoFrameContainer(aOwner->GetVideoFrameContainer())
   , mPlaybackStatistics(new MediaChannelStatistics())
   , mPinnedForSeek(false)
-  , mPausedForPlaybackRateNull(false)
   , mMinimizePreroll(false)
   , mMediaTracksConstructed(false)
   , mFiredMetadataLoaded(false)
   , mElementVisible(!aOwner->IsHidden())
   , mForcedHidden(false)
   , mIsDormant(false)
   , mIsHeuristicDormantSupported(
       Preferences::GetBool("media.decoder.heuristic.dormant.enabled", false))
@@ -789,17 +788,17 @@ MediaDecoder::SetMinimizePrerollUntilPla
 
 nsresult
 MediaDecoder::Play()
 {
   MOZ_ASSERT(NS_IsMainThread());
   UpdateDormantState(false /* aDormantTimeout */, true /* aActivity */);
 
   NS_ASSERTION(mDecoderStateMachine != nullptr, "Should have state machine.");
-  if (mPausedForPlaybackRateNull) {
+  if (mPlaybackRate == 0) {
     return NS_OK;
   }
 
   if (IsEnded()) {
     return Seek(0, SeekTarget::PrevSyncPoint);
   } else if (mPlayState == PLAY_STATE_LOADING) {
     mNextState = PLAY_STATE_PLAYING;
     return NS_OK;
@@ -1517,31 +1516,29 @@ MediaDecoder::SetLoadInBackground(bool a
     mResource->SetLoadInBackground(aLoadInBackground);
   }
 }
 
 void
 MediaDecoder::SetPlaybackRate(double aPlaybackRate)
 {
   MOZ_ASSERT(NS_IsMainThread());
+
+  double oldRate = mPlaybackRate;
   mPlaybackRate = aPlaybackRate;
-  if (mPlaybackRate == 0.0) {
-    mPausedForPlaybackRateNull = true;
+  if (aPlaybackRate == 0) {
     Pause();
     return;
   }
 
-  if (mPausedForPlaybackRateNull) {
-    // Play() uses mPausedForPlaybackRateNull value, so must reset it first
-    mPausedForPlaybackRateNull = false;
-    // If the playbackRate is no longer null, restart the playback, iff the
-    // media was playing.
-    if (!mOwner->GetPaused()) {
-      Play();
-    }
+
+  if (oldRate == 0 && !mOwner->GetPaused()) {
+    // PlaybackRate is no longer null.
+    // Restart the playback if the media was playing.
+    Play();
   }
 
   if (mDecoderStateMachine) {
     mDecoderStateMachine->DispatchSetPlaybackRate(aPlaybackRate);
   }
 }
 
 void
--- a/dom/media/MediaDecoder.h
+++ b/dom/media/MediaDecoder.h
@@ -671,19 +671,16 @@ protected:
   // this estimate is "decode time" (where the "current time" is the
   // time of the last decoded video frame).
   RefPtr<MediaChannelStatistics> mPlaybackStatistics;
 
   // True when our media stream has been pinned. We pin the stream
   // while seeking.
   bool mPinnedForSeek;
 
-  // True if the playback is paused because the playback rate member is 0.0.
-  bool mPausedForPlaybackRateNull;
-
   // Be assigned from media element during the initialization and pass to
   // AudioStream Class.
   dom::AudioChannel mAudioChannel;
 
   // True if the decoder has been directed to minimize its preroll before
   // playback starts. After the first time playback starts, we don't attempt
   // to minimize preroll, as we assume the user is likely to keep playing,
   // or play the media again.
--- a/dom/media/MediaDecoderStateMachine.cpp
+++ b/dom/media/MediaDecoderStateMachine.cpp
@@ -902,38 +902,16 @@ MediaDecoderStateMachine::GetDecodedAudi
     // overlap between 2 adjacent audio samples or when we are playing
     // a chained ogg file.
     return std::max<int64_t>(mDecodedAudioEndTime - GetClock(), 0);
   }
   // MediaSink not started. All audio samples are in the queue.
   return AudioQueue().Duration();
 }
 
-void MediaDecoderStateMachine::DiscardStreamData()
-{
-  MOZ_ASSERT(OnTaskQueue());
-
-  const auto clockTime = GetClock();
-  while (true) {
-    RefPtr<MediaData> a = AudioQueue().PeekFront();
-
-    // If we discard audio samples fed to the stream immediately, we will
-    // keep decoding audio samples till the end and consume a lot of memory.
-    // Therefore we only discard those behind the stream clock to throttle
-    // the decoding speed.
-    // Note we don't discard a sample when |a->mTime == clockTime| because that
-    // will discard the 1st sample when clockTime is still 0.
-    if (a && a->mTime < clockTime) {
-      RefPtr<MediaData> releaseMe = AudioQueue().PopFront();
-      continue;
-    }
-    break;
-  }
-}
-
 bool MediaDecoderStateMachine::HaveEnoughDecodedAudio()
 {
   MOZ_ASSERT(OnTaskQueue());
 
   int64_t ampleAudioUSecs = mAmpleAudioThresholdUsecs * mPlaybackRate;
   if (AudioQueue().GetSize() == 0 ||
       GetDecodedAudioDuration() < ampleAudioUSecs) {
     return false;
@@ -2639,20 +2617,16 @@ void
 MediaDecoderStateMachine::UpdatePlaybackPositionPeriodically()
 {
   MOZ_ASSERT(OnTaskQueue());
 
   if (!IsPlaying()) {
     return;
   }
 
-  if (mAudioCaptured) {
-    DiscardStreamData();
-  }
-
   // Cap the current time to the larger of the audio and video end time.
   // This ensures that if we're running off the system clock, we don't
   // advance the clock to after the media end time.
   if (VideoEndTime() != -1 || AudioEndTime() != -1) {
 
     const int64_t clockTime = GetClock();
     // Skip frames up to the frame at the playback position, and figure out
     // the time remaining until it's time to display the next frame and drop
--- a/dom/media/MediaDecoderStateMachine.h
+++ b/dom/media/MediaDecoderStateMachine.h
@@ -328,18 +328,16 @@ private:
   // Schedules the shared state machine thread to run the state machine.
   void ScheduleStateMachine();
 
   // Invokes ScheduleStateMachine to run in |aMicroseconds| microseconds,
   // unless it's already scheduled to run earlier, in which case the
   // request is discarded.
   void ScheduleStateMachineIn(int64_t aMicroseconds);
 
-  // Discard audio/video data that are already played by MSG.
-  void DiscardStreamData();
   bool HaveEnoughDecodedAudio();
   bool HaveEnoughDecodedVideo();
 
   // True if shutdown process has begun.
   bool IsShutdown() const;
 
   // Returns true if we're currently playing. The decoder monitor must
   // be held.
--- a/dom/media/mediasink/DecodedStream.cpp
+++ b/dom/media/mediasink/DecodedStream.cpp
@@ -31,27 +31,27 @@ struct PlaybackInfoInit {
 };
 
 class DecodedStreamGraphListener : public MediaStreamListener {
 public:
   DecodedStreamGraphListener(MediaStream* aStream,
                              MozPromiseHolder<GenericPromise>&& aPromise)
     : mMutex("DecodedStreamGraphListener::mMutex")
     , mStream(aStream)
-    , mLastOutputTime(aStream->StreamTimeToMicroseconds(aStream->GetCurrentTime()))
   {
     mFinishPromise = Move(aPromise);
   }
 
   void NotifyOutput(MediaStreamGraph* aGraph, GraphTime aCurrentTime) override
   {
     MutexAutoLock lock(mMutex);
     if (mStream) {
-      mLastOutputTime = mStream->StreamTimeToMicroseconds(
-          mStream->GraphTimeToStreamTime(aCurrentTime));
+      int64_t t = mStream->StreamTimeToMicroseconds(
+        mStream->GraphTimeToStreamTime(aCurrentTime));
+      mOnOutput.Notify(t);
     }
   }
 
   void NotifyEvent(MediaStreamGraph* aGraph, MediaStreamGraphEvent event) override
   {
     if (event == MediaStreamGraphEvent::EVENT_FINISHED) {
       nsCOMPtr<nsIRunnable> event =
         NewRunnableMethod(this, &DecodedStreamGraphListener::DoNotifyFinished);
@@ -59,35 +59,35 @@ public:
     }
   }
 
   void DoNotifyFinished()
   {
     mFinishPromise.ResolveIfExists(true, __func__);
   }
 
-  int64_t GetLastOutputTime()
-  {
-    MutexAutoLock lock(mMutex);
-    return mLastOutputTime;
-  }
-
   void Forget()
   {
     MOZ_ASSERT(NS_IsMainThread());
     mFinishPromise.ResolveIfExists(true, __func__);
     MutexAutoLock lock(mMutex);
     mStream = nullptr;
   }
 
+  MediaEventSource<int64_t>& OnOutput()
+  {
+    return mOnOutput;
+  }
+
 private:
+  MediaEventProducer<int64_t> mOnOutput;
+
   Mutex mMutex;
   // Members below are protected by mMutex.
   RefPtr<MediaStream> mStream;
-  int64_t mLastOutputTime; // microseconds
   // Main thread only.
   MozPromiseHolder<GenericPromise> mFinishPromise;
 };
 
 static void
 UpdateStreamSuspended(MediaStream* aStream, bool aBlocking)
 {
   if (NS_IsMainThread()) {
@@ -116,18 +116,18 @@ UpdateStreamSuspended(MediaStream* aStre
  * not connected to streams created by captureStreamUntilEnded.
  */
 class DecodedStreamData {
 public:
   DecodedStreamData(OutputStreamManager* aOutputStreamManager,
                     PlaybackInfoInit&& aInit,
                     MozPromiseHolder<GenericPromise>&& aPromise);
   ~DecodedStreamData();
-  int64_t GetPosition() const;
   void SetPlaying(bool aPlaying);
+  MediaEventSource<int64_t>& OnOutput();
 
   /* The following group of fields are protected by the decoder's monitor
    * and can be read or written on any thread.
    */
   // Count of audio frames written to the stream
   int64_t mAudioFramesWritten;
   // mNextVideoTime is the end timestamp for the last packet sent to the stream.
   // Therefore video packets starting at or after this time need to be copied
@@ -187,20 +187,20 @@ DecodedStreamData::DecodedStreamData(Out
 
 DecodedStreamData::~DecodedStreamData()
 {
   mOutputStreamManager->Disconnect();
   mListener->Forget();
   mStream->Destroy();
 }
 
-int64_t
-DecodedStreamData::GetPosition() const
+MediaEventSource<int64_t>&
+DecodedStreamData::OnOutput()
 {
-  return mListener->GetLastOutputTime();
+  return mListener->OnOutput();
 }
 
 void
 DecodedStreamData::SetPlaying(bool aPlaying)
 {
   if (mPlaying != aPlaying) {
     mPlaying = aPlaying;
     UpdateStreamSuspended(mStream, !mPlaying);
@@ -261,16 +261,17 @@ DecodedStream::OnEnded(TrackType aType)
 
 void
 DecodedStream::Start(int64_t aStartTime, const MediaInfo& aInfo)
 {
   AssertOwnerThread();
   MOZ_ASSERT(mStartTime.isNothing(), "playback already started.");
 
   mStartTime.emplace(aStartTime);
+  mLastOutputTime = 0;
   mInfo = aInfo;
   mPlaying = true;
   ConnectListener();
 
   class R : public Runnable {
     typedef MozPromiseHolder<GenericPromise> Promise;
   public:
     R(PlaybackInfoInit&& aInit, Promise&& aPromise, OutputStreamManager* aManager)
@@ -309,16 +310,18 @@ DecodedStream::Start(int64_t aStartTime,
     aStartTime, aInfo
   };
   nsCOMPtr<nsIRunnable> r = new R(Move(init), Move(promise), mOutputStreamManager);
   nsCOMPtr<nsIThread> mainThread = do_GetMainThread();
   SyncRunnable::DispatchToThread(mainThread, r);
   mData = static_cast<R*>(r.get())->ReleaseData();
 
   if (mData) {
+    mOutputListener = mData->OnOutput().Connect(
+      mOwnerThread, this, &DecodedStream::NotifyOutput);
     mData->SetPlaying(mPlaying);
     SendData();
   }
 }
 
 void
 DecodedStream::Stop()
 {
@@ -352,16 +355,18 @@ void
 DecodedStream::DestroyData(UniquePtr<DecodedStreamData> aData)
 {
   AssertOwnerThread();
 
   if (!aData) {
     return;
   }
 
+  mOutputListener.Disconnect();
+
   DecodedStreamData* data = aData.release();
   nsCOMPtr<nsIRunnable> r = NS_NewRunnableFunction([=] () {
     delete data;
   });
   AbstractThread::MainThread()->Dispatch(r.forget());
 }
 
 void
@@ -686,17 +691,31 @@ DecodedStream::GetPosition(TimeStamp* aT
 {
   AssertOwnerThread();
   // This is only called after MDSM starts playback. So mStartTime is
   // guaranteed to be something.
   MOZ_ASSERT(mStartTime.isSome());
   if (aTimeStamp) {
     *aTimeStamp = TimeStamp::Now();
   }
-  return mStartTime.ref() + (mData ? mData->GetPosition() : 0);
+  return mStartTime.ref() + mLastOutputTime;
+}
+
+void
+DecodedStream::NotifyOutput(int64_t aTime)
+{
+  AssertOwnerThread();
+  mLastOutputTime = aTime;
+
+  // Remove audio samples that have been played by MSG from the queue.
+  RefPtr<MediaData> a = mAudioQueue.PeekFront();
+  for (; a && a->mTime < aTime;) {
+    RefPtr<MediaData> releaseMe = mAudioQueue.PopFront();
+    a = mAudioQueue.PeekFront();
+  }
 }
 
 void
 DecodedStream::ConnectListener()
 {
   AssertOwnerThread();
 
   mAudioPushListener = mAudioQueue.PushEvent().Connect(
--- a/dom/media/mediasink/DecodedStream.h
+++ b/dom/media/mediasink/DecodedStream.h
@@ -67,16 +67,17 @@ protected:
   virtual ~DecodedStream();
 
 private:
   void DestroyData(UniquePtr<DecodedStreamData> aData);
   void AdvanceTracks();
   void SendAudio(double aVolume, bool aIsSameOrigin, const PrincipalHandle& aPrincipalHandle);
   void SendVideo(bool aIsSameOrigin, const PrincipalHandle& aPrincipalHandle);
   void SendData();
+  void NotifyOutput(int64_t aTime);
 
   void AssertOwnerThread() const {
     MOZ_ASSERT(mOwnerThread->IsCurrentThreadIn());
   }
 
   void ConnectListener();
   void DisconnectListener();
 
@@ -96,22 +97,24 @@ private:
 
   bool mPlaying;
   const bool& mSameOrigin; // valid until Shutdown() is called.
   const PrincipalHandle& mPrincipalHandle; // valid until Shutdown() is called.
 
   PlaybackParams mParams;
 
   Maybe<int64_t> mStartTime;
+  int64_t mLastOutputTime = 0; // microseconds
   MediaInfo mInfo;
 
   MediaQueue<MediaData>& mAudioQueue;
   MediaQueue<MediaData>& mVideoQueue;
 
   MediaEventListener mAudioPushListener;
   MediaEventListener mVideoPushListener;
   MediaEventListener mAudioFinishListener;
   MediaEventListener mVideoFinishListener;
+  MediaEventListener mOutputListener;
 };
 
 } // namespace mozilla
 
 #endif // DecodedStream_h_
--- a/gfx/cairo/cairo/src/cairo-dwrite-font.cpp
+++ b/gfx/cairo/cairo/src/cairo-dwrite-font.cpp
@@ -1136,18 +1136,27 @@ cairo_int_status_t
 				       cairo_dwrite_scaled_font_t *scaled_font,
 				       const RECT &area)
 {
     IDWriteGdiInterop *gdiInterop;
     DWriteFactory::Instance()->GetGdiInterop(&gdiInterop);
     IDWriteBitmapRenderTarget *rt;
     HRESULT rv;
 
+    cairo_d2d_surface_t::TextRenderingState renderingState =
+      scaled_font->rendering_mode;
+
+    if ((renderingState == cairo_d2d_surface_t::TEXT_RENDERING_NORMAL ||
+         renderingState == cairo_d2d_surface_t::TEXT_RENDERING_GDI_CLASSIC) &&
+        !surface->base.permit_subpixel_antialiasing) {
+      renderingState = cairo_d2d_surface_t::TEXT_RENDERING_NO_CLEARTYPE;
+    }
+
     IDWriteRenderingParams *params =
-        DWriteFactory::RenderingParams(scaled_font->rendering_mode);
+        DWriteFactory::RenderingParams(renderingState);
 
     rv = gdiInterop->CreateBitmapRenderTarget(surface->dc,
 					      area.right - area.left,
 					      area.bottom - area.top,
 					      &rt);
     if (FAILED(rv)) {
 	if (rv == E_OUTOFMEMORY) {
 	    return (cairo_int_status_t)CAIRO_STATUS_NO_MEMORY;
@@ -1169,17 +1178,17 @@ cairo_int_status_t
     }
     BitBlt(rt->GetMemoryDC(),
 	   0, 0,
 	   area.right - area.left, area.bottom - area.top,
 	   surface->dc,
 	   area.left, area.top, 
 	   SRCCOPY | NOMIRRORBITMAP);
     DWRITE_MEASURING_MODE measureMode; 
-    switch (scaled_font->rendering_mode) {
+    switch (renderingState) {
     case cairo_d2d_surface_t::TEXT_RENDERING_GDI_CLASSIC:
     case cairo_d2d_surface_t::TEXT_RENDERING_NO_CLEARTYPE:
         measureMode = DWRITE_MEASURING_MODE_GDI_CLASSIC;
         break;
     default:
         measureMode = DWRITE_MEASURING_MODE_NATURAL;
         break;
     }
@@ -1272,18 +1281,17 @@ cairo_int_status_t
 	return CAIRO_INT_STATUS_UNSUPPORTED;
 
     /* We can only handle opaque solid color sources */
     if (!_cairo_pattern_is_opaque_solid(source))
 	return CAIRO_INT_STATUS_UNSUPPORTED;
 
     /* We can only handle operator SOURCE or OVER with the destination
      * having no alpha */
-    if ((op != CAIRO_OPERATOR_SOURCE && op != CAIRO_OPERATOR_OVER) ||
-	(dst->format != CAIRO_FORMAT_RGB24))
+    if (op != CAIRO_OPERATOR_SOURCE && op != CAIRO_OPERATOR_OVER)
 	return CAIRO_INT_STATUS_UNSUPPORTED;
 
     /* If we have a fallback mask clip set on the dst, we have
      * to go through the fallback path */
     if (clip != NULL) {
 	if ((dst->flags & CAIRO_WIN32_SURFACE_FOR_PRINTING) == 0) {
 	    cairo_region_t *clip_region;
 	    cairo_int_status_t status;
--- a/gfx/layers/client/ContentClient.cpp
+++ b/gfx/layers/client/ContentClient.cpp
@@ -127,19 +127,33 @@ ContentClientBasic::CreateBuffer(Content
                                  RefPtr<gfx::DrawTarget>* aBlackDT,
                                  RefPtr<gfx::DrawTarget>* aWhiteDT)
 {
   MOZ_ASSERT(!(aFlags & BUFFER_COMPONENT_ALPHA));
   if (aFlags & BUFFER_COMPONENT_ALPHA) {
     gfxDevCrash(LogReason::AlphaWithBasicClient) << "Asking basic content client for component alpha";
   }
 
+  IntSize size(aRect.width, aRect.height);
+#ifdef XP_WIN
+  if (mBackend == BackendType::CAIRO && 
+      (aType == gfxContentType::COLOR || aType == gfxContentType::COLOR_ALPHA)) {
+    RefPtr<gfxASurface> surf =
+      new gfxWindowsSurface(size, aType == gfxContentType::COLOR ? gfxImageFormat::X8R8G8B8_UINT32 :
+                                                                   gfxImageFormat::A8R8G8B8_UINT32);
+    *aBlackDT = gfxPlatform::GetPlatform()->CreateDrawTargetForSurface(surf, size);
+
+    if (*aBlackDT) {
+      return;
+    }
+  }
+#endif
+
   *aBlackDT = gfxPlatform::GetPlatform()->CreateDrawTargetForBackend(
-    mBackend,
-    IntSize(aRect.width, aRect.height),
+    mBackend, size,
     gfxPlatform::GetPlatform()->Optimal2DFormatForContent(aType));
 }
 
 void
 ContentClientRemoteBuffer::DestroyBuffers()
 {
   if (!mTextureClient) {
     return;
--- a/gfx/vr/ovr_capi_dynamic.h
+++ b/gfx/vr/ovr_capi_dynamic.h
@@ -35,30 +35,22 @@
 
 #if defined(_WIN32)
 #define OVR_PFN __cdecl
 #else
 #define OVR_PFN
 #endif
 
 #if !defined(OVR_ALIGNAS)
-#if defined(__GNUC__) && (((__GNUC__ * 100) + __GNUC_MINOR__) >= 408) && (defined(__GXX_EXPERIMENTAL_CXX0X__) || (__cplusplus >= 201103L))
-#define OVR_ALIGNAS(n) alignas(n)
-#elif defined(__clang__) && !defined(__APPLE__) && (((__clang_major__ * 100) + __clang_minor__) >= 300) && (__cplusplus >= 201103L)
-#define OVR_ALIGNAS(n) alignas(n)
-#elif defined(__clang__) && defined(__APPLE__) && (((__clang_major__ * 100) + __clang_minor__) >= 401) && (__cplusplus >= 201103L)
-#define OVR_ALIGNAS(n) alignas(n)
-#elif defined(_MSC_VER) && (_MSC_VER >= 1900)
-#define OVR_ALIGNAS(n) alignas(n)
-#elif defined(__EDG_VERSION__) && (__EDG_VERSION__ >= 408)
-#define OVR_ALIGNAS(n) alignas(n)
-#elif defined(__GNUC__) || defined(__clang__)
+#if defined(__GNUC__) || defined(__clang__)
 #define OVR_ALIGNAS(n) __attribute__((aligned(n)))
 #elif defined(_MSC_VER) || defined(__INTEL_COMPILER)
 #define OVR_ALIGNAS(n) __declspec(align(n))
+#elif defined(__CC_ARM)
+#define OVR_ALIGNAS(n) __align(n)
 #else
 #error Need to define OVR_ALIGNAS
 #endif
 #endif
 
 #if !defined(OVR_UNUSED_STRUCT_PAD)
 #define OVR_UNUSED_STRUCT_PAD(padName, size) char padName[size];
 #endif
--- a/js/src/ctypes/CTypes.cpp
+++ b/js/src/ctypes/CTypes.cpp
@@ -3902,17 +3902,17 @@ BuildTypeName(JSContext* cx, JSObject* t
 
   // Walk the hierarchy of types, outermost to innermost, building up the type
   // string. This consists of the base type, which goes on the left.
   // Derived type modifiers (* and []) build from the inside outward, with
   // pointers on the left and arrays on the right. An excellent description
   // of the rules for building C type declarations can be found at:
   // http://unixwiz.net/techtips/reading-cdecl.html
   TypeCode prevGrouping = CType::GetTypeCode(typeObj), currentGrouping;
-  while (1) {
+  while (true) {
     currentGrouping = CType::GetTypeCode(typeObj);
     switch (currentGrouping) {
     case TYPE_pointer: {
       // Pointer types go on the left.
       PrependString(result, "*");
 
       typeObj = PointerType::GetBaseType(typeObj);
       prevGrouping = currentGrouping;
--- a/js/src/frontend/ParseNode.h
+++ b/js/src/frontend/ParseNode.h
@@ -447,29 +447,29 @@ class ParseNode
     ParseNode(const ParseNode& other) = delete;
     void operator=(const ParseNode& other) = delete;
 
   public:
     ParseNode(ParseNodeKind kind, JSOp op, ParseNodeArity arity)
       : pn_type(kind),
         pn_op(op),
         pn_arity(arity),
-        pn_parens(0),
+        pn_parens(false),
         pn_pos(0, 0),
         pn_next(nullptr)
     {
         MOZ_ASSERT(kind < PNK_LIMIT);
         memset(&pn_u, 0, sizeof pn_u);
     }
 
     ParseNode(ParseNodeKind kind, JSOp op, ParseNodeArity arity, const TokenPos& pos)
       : pn_type(kind),
         pn_op(op),
         pn_arity(arity),
-        pn_parens(0),
+        pn_parens(false),
         pn_pos(pos),
         pn_next(nullptr)
     {
         MOZ_ASSERT(kind < PNK_LIMIT);
         memset(&pn_u, 0, sizeof pn_u);
     }
 
     JSOp getOp() const                     { return JSOp(pn_op); }
--- a/js/src/jit/LIR.h
+++ b/js/src/jit/LIR.h
@@ -1809,17 +1809,18 @@ class LIRGraph
     }
     LBlock* getBlock(size_t i) {
         return &blocks_[i];
     }
     uint32_t numBlockIds() const {
         return mir_.numBlockIds();
     }
     MOZ_MUST_USE bool initBlock(MBasicBlock* mir) {
-        LBlock* lir = new (&blocks_[mir->id()]) LBlock(mir);
+        auto* block = &blocks_[mir->id()];
+        auto* lir = new (block) LBlock(mir);
         return lir->init(mir_.alloc());
     }
     uint32_t getVirtualRegister() {
         numVirtualRegisters_ += VREG_INCREMENT;
         return numVirtualRegisters_;
     }
     uint32_t numVirtualRegisters() const {
         // Virtual registers are 1-based, not 0-based, so add one as a
--- a/js/src/jit/MIR.h
+++ b/js/src/jit/MIR.h
@@ -6175,17 +6175,17 @@ class MAbs
         specialization_ = type;
     }
 
   public:
     INSTRUCTION_HEADER(Abs)
     TRIVIAL_NEW_WRAPPERS
 
     static MAbs* NewAsmJS(TempAllocator& alloc, MDefinition* num, MIRType type) {
-        MAbs* ins = new(alloc) MAbs(num, type);
+        auto* ins = new(alloc) MAbs(num, type);
         if (type == MIRType::Int32)
             ins->implicitTruncate_ = true;
         return ins;
     }
     bool congruentTo(const MDefinition* ins) const override {
         return congruentIfOperandsEqual(ins);
     }
     bool fallible() const;
@@ -6713,17 +6713,17 @@ class MAdd : public MBinaryArithInstruct
 
   public:
     INSTRUCTION_HEADER(Add)
     TRIVIAL_NEW_WRAPPERS
 
     static MAdd* NewAsmJS(TempAllocator& alloc, MDefinition* left, MDefinition* right,
                           MIRType type)
     {
-        MAdd* add = new(alloc) MAdd(left, right);
+        auto* add = new(alloc) MAdd(left, right);
         add->specialization_ = type;
         add->setResultType(type);
         if (type == MIRType::Int32) {
             add->setTruncateKind(Truncate);
             add->setCommutative();
         }
         return add;
     }
@@ -6758,17 +6758,17 @@ class MSub : public MBinaryArithInstruct
 
   public:
     INSTRUCTION_HEADER(Sub)
     TRIVIAL_NEW_WRAPPERS
 
     static MSub* NewAsmJS(TempAllocator& alloc, MDefinition* left, MDefinition* right,
                           MIRType type, bool mustPreserveNaN = false)
     {
-        MSub* sub = new(alloc) MSub(left, right);
+        auto* sub = new(alloc) MSub(left, right);
         sub->specialization_ = type;
         sub->setResultType(type);
         sub->setMustPreserveNaN(mustPreserveNaN);
         if (type == MIRType::Int32)
             sub->setTruncateKind(Truncate);
         return sub;
     }
 
@@ -6936,17 +6936,17 @@ class MDiv : public MBinaryArithInstruct
     }
     static MDiv* New(TempAllocator& alloc, MDefinition* left, MDefinition* right, MIRType type) {
         return new(alloc) MDiv(left, right, type);
     }
     static MDiv* NewAsmJS(TempAllocator& alloc, MDefinition* left, MDefinition* right,
                           MIRType type, bool unsignd, bool trapOnError = false,
                           bool mustPreserveNaN = false)
     {
-        MDiv* div = new(alloc) MDiv(left, right, type);
+        auto* div = new(alloc) MDiv(left, right, type);
         div->unsigned_ = unsignd;
         div->trapOnError_ = trapOnError;
         if (trapOnError)
             div->setGuard(); // not removable because of possible side-effects.
         div->setMustPreserveNaN(mustPreserveNaN);
         if (type == MIRType::Int32)
             div->setTruncateKind(Truncate);
         return div;
@@ -7063,17 +7063,17 @@ class MMod : public MBinaryArithInstruct
   public:
     INSTRUCTION_HEADER(Mod)
     static MMod* New(TempAllocator& alloc, MDefinition* left, MDefinition* right) {
         return new(alloc) MMod(left, right, MIRType::Value);
     }
     static MMod* NewAsmJS(TempAllocator& alloc, MDefinition* left, MDefinition* right,
                           MIRType type, bool unsignd, bool trapOnError = false)
     {
-        MMod* mod = new(alloc) MMod(left, right, type);
+        auto* mod = new(alloc) MMod(left, right, type);
         mod->unsigned_ = unsignd;
         mod->trapOnError_ = trapOnError;
         if (trapOnError)
             mod->setGuard(); // not removable because of possible side-effects.
         if (type == MIRType::Int32)
             mod->setTruncateKind(Truncate);
         return mod;
     }
@@ -8888,17 +8888,17 @@ class MNot
             cacheOperandMightEmulateUndefined(constraints);
     }
 
     void cacheOperandMightEmulateUndefined(CompilerConstraintList* constraints);
 
   public:
     static MNot* NewAsmJS(TempAllocator& alloc, MDefinition* input) {
         MOZ_ASSERT(input->type() == MIRType::Int32 || input->type() == MIRType::Int64);
-        MNot* ins = new(alloc) MNot(input);
+        auto* ins = new(alloc) MNot(input);
         ins->setResultType(MIRType::Int32);
         return ins;
     }
 
     INSTRUCTION_HEADER(Not)
     TRIVIAL_NEW_WRAPPERS
 
     MDefinition* foldsTo(TempAllocator& alloc) override;
@@ -11713,17 +11713,17 @@ class MGetDOMProperty
 
   public:
     INSTRUCTION_HEADER(GetDOMProperty)
     NAMED_OPERANDS((0, object))
 
     static MGetDOMProperty* New(TempAllocator& alloc, const JSJitInfo* info, MDefinition* obj,
                                 MDefinition* guard, MDefinition* globalGuard)
     {
-        MGetDOMProperty* res = new(alloc) MGetDOMProperty(info);
+        auto* res = new(alloc) MGetDOMProperty(info);
         if (!res || !res->init(alloc, obj, guard, globalGuard))
             return nullptr;
         return res;
     }
 
     JSJitGetterOp fun() const {
         return info_->getter;
     }
@@ -11787,17 +11787,17 @@ class MGetDOMMember : public MGetDOMProp
     }
 
   public:
     INSTRUCTION_HEADER(GetDOMMember)
 
     static MGetDOMMember* New(TempAllocator& alloc, const JSJitInfo* info, MDefinition* obj,
                               MDefinition* guard, MDefinition* globalGuard)
     {
-        MGetDOMMember* res = new(alloc) MGetDOMMember(info);
+        auto* res = new(alloc) MGetDOMMember(info);
         if (!res || !res->init(alloc, obj, guard, globalGuard))
             return nullptr;
         return res;
     }
 
     bool possiblyCalls() const override {
         return false;
     }
--- a/js/src/perf/pm_linux.cpp
+++ b/js/src/perf/pm_linux.cpp
@@ -116,18 +116,18 @@ Impl::Impl()
 {
 }
 
 Impl::~Impl()
 {
     // Close all active counter descriptors.  Take care to do the group
     // leader last (this may not be necessary, but it's unclear what
     // happens if you close the group leader out from under a group).
-    for (int i = 0; i < PerfMeasurement::NUM_MEASURABLE_EVENTS; i++) {
-        int fd = this->*(kSlots[i].fd);
+    for (const auto& slot : kSlots) {
+        int fd = this->*(slot.fd);
         if (fd != -1 && fd != group_leader)
             close(fd);
     }
 
     if (group_leader != -1)
         close(group_leader);
 }
 
@@ -135,28 +135,28 @@ EventMask
 Impl::init(EventMask toMeasure)
 {
     MOZ_ASSERT(group_leader == -1);
     if (!toMeasure)
         return EventMask(0);
 
     EventMask measured = EventMask(0);
     struct perf_event_attr attr;
-    for (int i = 0; i < PerfMeasurement::NUM_MEASURABLE_EVENTS; i++) {
-        if (!(toMeasure & kSlots[i].bit))
+    for (const auto& slot : kSlots) {
+        if (!(toMeasure & slot.bit))
             continue;
 
         memset(&attr, 0, sizeof(attr));
         attr.size = sizeof(attr);
 
         // Set the type and config fields to indicate the counter we
         // want to enable.  We want read format 0, and we're not using
         // sampling, so leave those fields unset.
-        attr.type = kSlots[i].type;
-        attr.config = kSlots[i].config;
+        attr.type = slot.type;
+        attr.config = slot.config;
 
         // If this will be the group leader it should start off
         // disabled.  Otherwise it should start off enabled (but blocked
         // on the group leader).
         if (group_leader == -1)
             attr.disabled = 1;
 
         // The rest of the bit fields are really poorly documented.
@@ -170,18 +170,18 @@ Impl::init(EventMask toMeasure)
         int fd = sys_perf_event_open(&attr,
                                      0 /* trace self */,
                                      -1 /* on any cpu */,
                                      group_leader,
                                      0 /* no flags presently defined */);
         if (fd == -1)
             continue;
 
-        measured = EventMask(measured | kSlots[i].bit);
-        this->*(kSlots[i].fd) = fd;
+        measured = EventMask(measured | slot.bit);
+        this->*(slot.fd) = fd;
         if (group_leader == -1)
             group_leader = fd;
     }
     return measured;
 }
 
 void
 Impl::start()
@@ -202,25 +202,25 @@ Impl::stop(PerfMeasurement* counters)
 
     if (!running || group_leader == -1)
         return;
 
     ioctl(group_leader, PERF_EVENT_IOC_DISABLE, 0);
     running = false;
 
     // read out and reset all the counter values
-    for (int i = 0; i < PerfMeasurement::NUM_MEASURABLE_EVENTS; i++) {
-        int fd = this->*(kSlots[i].fd);
+    for (const auto& slot : kSlots) {
+        int fd = this->*(slot.fd);
         if (fd == -1)
             continue;
 
         if (read(fd, buf, sizeof(buf)) == sizeof(uint64_t)) {
             uint64_t cur;
             memcpy(&cur, buf, sizeof(uint64_t));
-            counters->*(kSlots[i].counter) += cur;
+            counters->*(slot.counter) += cur;
         }
 
         // Reset the counter regardless of whether the read did what
         // we expected.
         ioctl(fd, PERF_EVENT_IOC_RESET, 0);
     }
 }
 
@@ -268,21 +268,21 @@ PerfMeasurement::stop()
 {
     if (impl)
         static_cast<Impl*>(impl)->stop(this);
 }
 
 void
 PerfMeasurement::reset()
 {
-    for (int i = 0; i < NUM_MEASURABLE_EVENTS; i++) {
-        if (eventsMeasured & kSlots[i].bit)
-            this->*(kSlots[i].counter) = 0;
+    for (const auto& slot : kSlots) {
+        if (eventsMeasured & slot.bit)
+            this->*(slot.counter) = 0;
         else
-            this->*(kSlots[i].counter) = -1;
+            this->*(slot.counter) = -1;
     }
 }
 
 bool
 PerfMeasurement::canMeasureSomething()
 {
     // Find out if the kernel implements the performance measurement
     // API.  If it doesn't, syscall(__NR_perf_event_open, ...) is
--- a/js/src/vm/TraceLoggingGraph.cpp
+++ b/js/src/vm/TraceLoggingGraph.cpp
@@ -278,25 +278,25 @@ TraceLoggerGraph::~TraceLoggerGraph()
 
         dictFile = nullptr;
     }
 
     if (!failed && treeFile) {
         // Make sure every start entry has a corresponding stop value.
         // We temporarily enable logging for this. Stop doesn't need any extra data,
         // so is safe to do even when we have encountered OOM.
-        enabled = 1;
+        enabled = true;
         while (stack.size() > 1)
             stopEvent(0);
-        enabled = 0;
+        enabled = false;
     }
 
     if (!failed && !flush()) {
         fprintf(stderr, "TraceLogging: Couldn't write the data to disk.\n");
-        enabled = 0;
+        enabled = false;
         failed = true;
     }
 
     if (treeFile) {
         fclose(treeFile);
         treeFile = nullptr;
     }
 
@@ -359,26 +359,26 @@ TraceLoggerGraph::startEvent(uint32_t id
 {
     if (failed || enabled == 0)
         return;
 
     if (!tree.hasSpaceForAdd()) {
         if (tree.size() >= treeSizeFlushLimit() || !tree.ensureSpaceBeforeAdd()) {
             if (!flush()) {
                 fprintf(stderr, "TraceLogging: Couldn't write the data to disk.\n");
-                enabled = 0;
+                enabled = false;
                 failed = true;
                 return;
             }
         }
     }
 
     if (!startEventInternal(id, timestamp)) {
         fprintf(stderr, "TraceLogging: Failed to start an event.\n");
-        enabled = 0;
+        enabled = false;
         failed = true;
         return;
     }
 }
 
 TraceLoggerGraph::StackEntry&
 TraceLoggerGraph::getActiveAncestor()
 {
@@ -457,17 +457,17 @@ TraceLoggerGraph::stopEvent(uint32_t id,
 }
 
 void
 TraceLoggerGraph::stopEvent(uint64_t timestamp)
 {
     if (enabled && stack.lastEntry().active()) {
         if (!updateStop(stack.lastEntry().treeId(), timestamp)) {
             fprintf(stderr, "TraceLogging: Failed to stop an event.\n");
-            enabled = 0;
+            enabled = false;
             failed = true;
             return;
         }
     }
     if (stack.size() == 1) {
         if (!enabled)
             return;
 
--- a/js/xpconnect/src/XPCMaps.h
+++ b/js/xpconnect/src/XPCMaps.h
@@ -29,17 +29,17 @@ class JSObject2WrappedJSMap
 {
     using Map = js::HashMap<JS::Heap<JSObject*>,
                             nsXPCWrappedJS*,
                             js::MovableCellHasher<JS::Heap<JSObject*>>,
                             InfallibleAllocPolicy>;
 
 public:
     static JSObject2WrappedJSMap* newMap(int length) {
-        JSObject2WrappedJSMap* map = new JSObject2WrappedJSMap();
+        auto* map = new JSObject2WrappedJSMap();
         if (!map->mTable.init(length)) {
             // This is a decent estimate of the size of the hash table's
             // entry storage. The |2| is because on average the capacity is
             // twice the requested length.
             NS_ABORT_OOM(length * 2 * sizeof(Map::Entry));
         }
         return map;
     }
@@ -587,17 +587,17 @@ class JSObject2JSObjectMap
 {
     using Map = JS::GCHashMap<JS::Heap<JSObject*>,
                               JS::Heap<JSObject*>,
                               js::MovableCellHasher<JS::Heap<JSObject*>>,
                               js::SystemAllocPolicy>;
 
 public:
     static JSObject2JSObjectMap* newMap(int length) {
-        JSObject2JSObjectMap* map = new JSObject2JSObjectMap();
+        auto* map = new JSObject2JSObjectMap();
         if (!map->mTable.init(length)) {
             // This is a decent estimate of the size of the hash table's
             // entry storage. The |2| is because on average the capacity is
             // twice the requested length.
             NS_ABORT_OOM(length * 2 * sizeof(Map::Entry));
         }
         return map;
     }
--- a/layout/base/nsCSSRendering.cpp
+++ b/layout/base/nsCSSRendering.cpp
@@ -668,19 +668,19 @@ nsCSSRendering::PaintBorder(nsPresContex
 
   nsStyleBorder newStyleBorder(*styleBorder);
   // We could do something fancy to avoid the TrackImage/UntrackImage
   // work, but it doesn't seem worth it.  (We need to call TrackImage
   // since we're not going through nsRuleNode::ComputeBorderData.)
   newStyleBorder.TrackImage(aPresContext);
 
   NS_FOR_CSS_SIDES(side) {
-    newStyleBorder.SetBorderColor(side,
-      aStyleContext->GetVisitedDependentColor(
-        nsCSSProps::SubpropertyEntryFor(eCSSProperty_border_color)[side]));
+    nscolor color = aStyleContext->GetVisitedDependentColor(
+      nsCSSProps::SubpropertyEntryFor(eCSSProperty_border_color)[side]);
+    newStyleBorder.mBorderColor[side] = StyleComplexColor::FromColor(color);
   }
   DrawResult result =
     PaintBorderWithStyleBorder(aPresContext, aRenderingContext, aForFrame,
                                aDirtyRect, aBorderArea, newStyleBorder,
                                aStyleContext, aFlags, aSkipSides);
 
   // We could do something fancy to avoid the TrackImage/UntrackImage
   // work, but it doesn't seem worth it.  (We need to call UntrackImage
@@ -799,23 +799,19 @@ nsCSSRendering::PaintBorderWithStyleBord
   Rect dirtyRect = NSRectToRect(aDirtyRect, twipsPerPixel);
 
   uint8_t borderStyles[4];
   nscolor borderColors[4];
   nsBorderColors *compositeColors[4];
 
   // pull out styles, colors, composite colors
   NS_FOR_CSS_SIDES (i) {
-    bool foreground;
     borderStyles[i] = aStyleBorder.GetBorderStyle(i);
-    aStyleBorder.GetBorderColor(i, borderColors[i], foreground);
+    borderColors[i] = ourColor->CalcComplexColor(aStyleBorder.mBorderColor[i]);
     aStyleBorder.GetCompositeColors(i, &compositeColors[i]);
-
-    if (foreground)
-      borderColors[i] = ourColor->mColor;
   }
 
   PrintAsFormatString(" borderStyles: %d %d %d %d\n", borderStyles[0], borderStyles[1], borderStyles[2], borderStyles[3]);
   //PrintAsFormatString ("bgRadii: %f %f %f %f\n", bgRadii[0], bgRadii[1], bgRadii[2], bgRadii[3]);
 
 #if 0
   // this will draw a transparent red backround underneath the border area
   ColorPattern color(ToDeviceColor(Color(1.f, 0.f, 0.f, 0.5f)));
@@ -871,17 +867,17 @@ nsCSSRendering::PaintOutline(nsPresConte
 {
   nscoord             twipsRadii[8];
 
   // Get our style context's color struct.
   const nsStyleOutline* ourOutline = aStyleContext->StyleOutline();
   MOZ_ASSERT(ourOutline != NS_STYLE_BORDER_STYLE_NONE,
              "shouldn't have created nsDisplayOutline item");
 
-  uint8_t outlineStyle = ourOutline->GetOutlineStyle();
+  uint8_t outlineStyle = ourOutline->mOutlineStyle;
   nscoord width = ourOutline->GetOutlineWidth();
 
   if (width == 0 && outlineStyle != NS_STYLE_BORDER_STYLE_AUTO) {
     // Empty outline
     return;
   }
 
   nsIFrame* bgFrame = nsCSSRendering::FindNonTransparentBackgroundFrame
@@ -1770,26 +1766,23 @@ IsOpaqueBorderEdge(const nsStyleBorder& 
 
   // If we're using a border image, assume it's not fully opaque,
   // because we may not even have the image loaded at this point, and
   // even if we did, checking whether the relevant tile is fully
   // opaque would be too much work.
   if (aBorder.mBorderImageSource.GetType() != eStyleImageType_Null)
     return false;
 
-  nscolor color;
-  bool isForeground;
-  aBorder.GetBorderColor(aSide, color, isForeground);
-
+  StyleComplexColor color = aBorder.mBorderColor[aSide];
   // We don't know the foreground color here, so if it's being used
   // we must assume it might be transparent.
-  if (isForeground)
+  if (!color.IsNumericColor()) {
     return false;
-
-  return NS_GET_A(color) == 255;
+  }
+  return NS_GET_A(color.mColor) == 255;
 }
 
 /**
  * Returns true if all border edges are either missing or opaque.
  */
 static bool
 IsOpaqueBorder(const nsStyleBorder& aBorder)
 {
--- a/layout/generic/nsColumnSetFrame.cpp
+++ b/layout/generic/nsColumnSetFrame.cpp
@@ -90,23 +90,23 @@ nsColumnSetFrame::PaintColumnRule(nsRend
   // the left border. PaintBorder() does all the rendering for us, so we not
   // only save an enormous amount of code but we'll support all the line styles that
   // we support on borders!
   nsStyleBorder border(presContext);
   Sides skipSides;
   if (isVertical) {
     border.SetBorderWidth(NS_SIDE_TOP, ruleWidth);
     border.SetBorderStyle(NS_SIDE_TOP, ruleStyle);
-    border.SetBorderColor(NS_SIDE_TOP, ruleColor);
+    border.mBorderTopColor = StyleComplexColor::FromColor(ruleColor);
     skipSides |= mozilla::eSideBitsLeftRight;
     skipSides |= mozilla::eSideBitsBottom;
   } else {
     border.SetBorderWidth(NS_SIDE_LEFT, ruleWidth);
     border.SetBorderStyle(NS_SIDE_LEFT, ruleStyle);
-    border.SetBorderColor(NS_SIDE_LEFT, ruleColor);
+    border.mBorderLeftColor = StyleComplexColor::FromColor(ruleColor);
     skipSides |= mozilla::eSideBitsTopBottom;
     skipSides |= mozilla::eSideBitsRight;
   }
 
   // Get our content rect as an absolute coordinate, not relative to
   // our parent (which is what the X and Y normally is)
   nsRect contentRect = GetContentRect() - GetRect().TopLeft() + aPt;
   nsSize ruleSize = isVertical ? nsSize(contentRect.width, ruleWidth)
--- a/layout/generic/nsFlexContainerFrame.cpp
+++ b/layout/generic/nsFlexContainerFrame.cpp
@@ -1713,17 +1713,17 @@ FlexItem::FlexItem(ReflowInput& aFlexIte
     // (2) Suppress the ability for flex items to override that with their own
     //     cross-axis alignment. (The legacy box model doesn't support this.)
     // So, each FlexItem simply copies the container's converted "align-items"
     // value and disregards their own "align-self" property.
     const nsStyleXUL* containerStyleXUL = containerRS->mFrame->StyleXUL();
     mAlignSelf = ConvertLegacyStyleToAlignItems(containerStyleXUL);
   } else {
     mAlignSelf = aFlexItemReflowInput.mStylePosition->ComputedAlignSelf(
-                   mFrame->StyleContext()->GetParent());
+                   containerRS->mFrame->StyleContext());
     if (MOZ_LIKELY(mAlignSelf == NS_STYLE_ALIGN_NORMAL)) {
       mAlignSelf = NS_STYLE_ALIGN_STRETCH;
     }
 
     // XXX strip off the <overflow-position> bit until we implement that
     mAlignSelf &= ~NS_STYLE_ALIGN_FLAG_BITS;
   }
 
--- a/layout/generic/nsFrame.cpp
+++ b/layout/generic/nsFrame.cpp
@@ -1794,18 +1794,19 @@ nsFrame::DisplaySelectionOverlay(nsDispl
   aList->AppendNewToTop(new (aBuilder)
     nsDisplaySelectionOverlay(aBuilder, this, selectionValue));
 }
 
 void
 nsFrame::DisplayOutlineUnconditional(nsDisplayListBuilder*   aBuilder,
                                      const nsDisplayListSet& aLists)
 {
-  if (StyleOutline()->GetOutlineStyle() == NS_STYLE_BORDER_STYLE_NONE)
+  if (StyleOutline()->mOutlineStyle == NS_STYLE_BORDER_STYLE_NONE) {
     return;
+  }
 
   aLists.Outlines()->AppendNewToTop(
     new (aBuilder) nsDisplayOutline(aBuilder, this));
 }
 
 void
 nsFrame::DisplayOutline(nsDisplayListBuilder*   aBuilder,
                         const nsDisplayListSet& aLists)
@@ -4842,17 +4843,17 @@ nsRect
 nsIFrame::ComputeTightBounds(DrawTarget* aDrawTarget) const
 {
   return GetVisualOverflowRect();
 }
 
 nsRect
 nsFrame::ComputeSimpleTightBounds(DrawTarget* aDrawTarget) const
 {
-  if (StyleOutline()->GetOutlineStyle() != NS_STYLE_BORDER_STYLE_NONE ||
+  if (StyleOutline()->mOutlineStyle != NS_STYLE_BORDER_STYLE_NONE ||
       StyleBorder()->HasBorder() || !StyleBackground()->IsTransparent() ||
       StyleDisplay()->mAppearance) {
     // Not necessarily tight, due to clipping, negative
     // outline-offset, and lots of other issues, but that's OK
     return GetVisualOverflowRect();
   }
 
   nsRect r(0, 0, 0, 0);
@@ -7965,17 +7966,17 @@ UnionBorderBoxes(nsIFrame* aFrame, bool 
   return u;
 }
 
 static void
 ComputeAndIncludeOutlineArea(nsIFrame* aFrame, nsOverflowAreas& aOverflowAreas,
                              const nsSize& aNewSize)
 {
   const nsStyleOutline* outline = aFrame->StyleOutline();
-  const uint8_t outlineStyle = outline->GetOutlineStyle();
+  const uint8_t outlineStyle = outline->mOutlineStyle;
   if (outlineStyle == NS_STYLE_BORDER_STYLE_NONE) {
     return;
   }
 
   nscoord width = outline->GetOutlineWidth();
   if (width <= 0 && outlineStyle != NS_STYLE_BORDER_STYLE_AUTO) {
     return;
   }
@@ -8675,32 +8676,30 @@ nsIFrame::VerticalAlignEnum() const
 void nsFrame::FillCursorInformationFromStyle(const nsStyleUserInterface* ui,
                                              nsIFrame::Cursor& aCursor)
 {
   aCursor.mCursor = ui->mCursor;
   aCursor.mHaveHotspot = false;
   aCursor.mLoading = false;
   aCursor.mHotspotX = aCursor.mHotspotY = 0.0f;
 
-  for (nsCursorImage *item = ui->mCursorArray,
-                 *item_end = ui->mCursorArray + ui->mCursorArrayLength;
-       item < item_end; ++item) {
+  for (const nsCursorImage& item : ui->mCursorImages) {
     uint32_t status;
-    nsresult rv = item->GetImage()->GetImageStatus(&status);
+    nsresult rv = item.GetImage()->GetImageStatus(&status);
     if (NS_SUCCEEDED(rv)) {
       if (!(status & imgIRequest::STATUS_LOAD_COMPLETE)) {
         // If we are falling back because any cursor before is loading,
         // let the consumer know.
         aCursor.mLoading = true;
       } else if (!(status & imgIRequest::STATUS_ERROR)) {
         // This is the one we want
-        item->GetImage()->GetImage(getter_AddRefs(aCursor.mContainer));
-        aCursor.mHaveHotspot = item->mHaveHotspot;
-        aCursor.mHotspotX = item->mHotspotX;
-        aCursor.mHotspotY = item->mHotspotY;
+        item.GetImage()->GetImage(getter_AddRefs(aCursor.mContainer));
+        aCursor.mHaveHotspot = item.mHaveHotspot;
+        aCursor.mHotspotX = item.mHotspotX;
+        aCursor.mHotspotY = item.mHotspotY;
         break;
       }
     }
   }
 }
 
 NS_IMETHODIMP
 nsFrame::RefreshSizeCache(nsBoxLayoutState& aState)
--- a/layout/generic/nsImageFrame.cpp
+++ b/layout/generic/nsImageFrame.cpp
@@ -1260,19 +1260,17 @@ nsImageFrame::DisplayAltText(nsPresConte
   }
 }
 
 struct nsRecessedBorder : public nsStyleBorder {
   nsRecessedBorder(nscoord aBorderWidth, nsPresContext* aPresContext)
     : nsStyleBorder(aPresContext)
   {
     NS_FOR_CSS_SIDES(side) {
-      // Note: use SetBorderColor here because we want to make sure
-      // the "special" flags are unset.
-      SetBorderColor(side, NS_RGB(0, 0, 0));
+      mBorderColor[side] = StyleComplexColor::FromColor(NS_RGB(0, 0, 0));
       mBorder.Side(side) = aBorderWidth;
       // Note: use SetBorderStyle here because we want to affect
       // mComputedBorder
       SetBorderStyle(side, NS_STYLE_BORDER_STYLE_INSET);
     }
   }
 };
 
--- a/layout/generic/nsTextFrame.cpp
+++ b/layout/generic/nsTextFrame.cpp
@@ -5170,17 +5170,17 @@ nsTextFrame::GetTextDecorations(
         f->GetLogicalBaseline(wm);
       baselineOffset = physicalBlockStartOffset - offset;
     }
 
     nearestBlockFound = nearestBlockFound || firstBlock;
     physicalBlockStartOffset +=
       vertical ? f->GetNormalPosition().x : f->GetNormalPosition().y;
 
-    const uint8_t style = styleText->GetDecorationStyle();
+    const uint8_t style = styleText->mTextDecorationStyle;
     if (textDecorations) {
       nscolor color;
       if (useOverride) {
         color = overrideColor;
       } else if (IsSVGText()) {
         // XXX We might want to do something with text-decoration-color when
         //     painting SVG text, but it's not clear what we should do.  We
         //     at least need SVG text decorations to paint with 'fill' if
@@ -5379,17 +5379,17 @@ nsTextFrame::UnionAdditionalOverflow(nsP
   const gfxFloat appUnitsPerDevUnit = aPresContext->AppUnitsPerDevPixel();
 
   if (IsFloatingFirstLetterChild()) {
     bool inverted = wm.IsLineInverted();
     // The underline/overline drawable area must be contained in the overflow
     // rect when this is in floating first letter frame at *both* modes.
     // In this case, aBlock is the ::first-letter frame.
     uint8_t decorationStyle = aBlock->StyleContext()->
-                                StyleTextReset()->GetDecorationStyle();
+                                StyleTextReset()->mTextDecorationStyle;
     // If the style is none, let's include decoration line rect as solid style
     // since changing the style from none to solid/dotted/dashed doesn't cause
     // reflow.
     if (decorationStyle == NS_STYLE_TEXT_DECORATION_STYLE_NONE) {
       decorationStyle = NS_STYLE_TEXT_DECORATION_STYLE_SOLID;
     }
     nsFontMetrics* fontMetrics = aProvider.GetFontMetrics();
     nscoord underlineOffset, underlineSize;
--- a/layout/inspector/tests/test_bug877690.html
+++ b/layout/inspector/tests/test_bug877690.html
@@ -97,17 +97,17 @@ function do_test() {
       "border-box", "padding-box", "content-box", "border-box", "padding-box", "content-box", "text", "contain",
       "cover", "rgb", "hsl", "rgba", "hsla", "none", "-moz-element", "-moz-image-rect", "url", "linear-gradient",
       "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "-moz-linear-gradient",
       "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient" ];
   ok(testValues(values, expected), "Shorthand property values.");
 
   var prop = "border";
   var values = getCSSValuesForProperty(prop);
-  var expected = [ "-moz-calc", "initial", "unset", "-moz-use-text-color", "aliceblue",
+  var expected = [ "-moz-calc", "initial", "unset", "aliceblue",
       "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet",
       "brown", "burlywood", "cadetblue", "calc", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk",
       "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki",
       "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen",
       "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "dashed", "deeppink",
       "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "dotted", "double", "fill", "firebrick", "floralwhite",
       "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow",
       "groove", "hidden", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "inset", "ivory",
@@ -127,17 +127,17 @@ function do_test() {
       "repeating-radial-gradient", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient",
       "-moz-repeating-radial-gradient" ]
   ok(testValues(values, expected), "Shorthand property values.");
 
   // test keywords only
   var prop = "border-top";
   var values = getCSSValuesForProperty(prop);
   var expected = [ "initial", "inherit", "unset", "thin", "medium", "thick", "none", "hidden", "dotted",
-      "dashed", "solid", "double", "groove", "ridge", "inset", "outset", "-moz-use-text-color",
+      "dashed", "solid", "double", "groove", "ridge", "inset", "outset",
       "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black",
       "blanchedalmond", "blue", "blueviolet", "brown", "burlywood", "cadetblue", "chartreuse",
       "chocolate", "coral", "cornflowerblue", "cornsilk", "crimson", "currentColor", "cyan", "darkblue", "darkcyan",
       "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki", "darkmagenta", "darkolivegreen",
       "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", "darkslateblue", "darkslategray",
       "darkslategrey", "darkturquoise", "darkviolet", "deeppink", "deepskyblue", "dimgray", "dimgrey",
       "dodgerblue", "firebrick", "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite",
       "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", "hotpink", "indianred",
@@ -210,17 +210,17 @@ function do_test() {
   }
   catch(e) {
     // test passed
   }
 
   // test border-image propery, for bug 973345
   var prop = "border-image";
   var values = getCSSValuesForProperty(prop);
-  var expected = [ "-moz-calc", "initial", "unset", "-moz-use-text-color", "aliceblue",
+  var expected = [ "-moz-calc", "initial", "unset", "aliceblue",
       "antiquewhite", "aqua", "aquamarine", "azure", "beige", "bisque", "black", "blanchedalmond", "blue", "blueviolet",
       "brown", "burlywood", "cadetblue", "calc", "chartreuse", "chocolate", "coral", "cornflowerblue", "cornsilk",
       "crimson", "currentColor", "cyan", "darkblue", "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkgrey", "darkkhaki",
       "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen",
       "darkslateblue", "darkslategray", "darkslategrey", "darkturquoise", "darkviolet", "dashed", "deeppink",
       "deepskyblue", "dimgray", "dimgrey", "dodgerblue", "dotted", "double", "fill", "firebrick", "floralwhite",
       "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", "goldenrod", "gray", "grey", "green", "greenyellow",
       "groove", "hidden", "honeydew", "hotpink", "hsl", "hsla", "indianred", "indigo", "inherit", "inset", "ivory",
--- a/layout/reftests/text-decoration/decoration-color-quirks-ref.html
+++ b/layout/reftests/text-decoration/decoration-color-quirks-ref.html
@@ -45,18 +45,18 @@
     here is specified red decoration color but has current color lines</span>,
   and here are current color decoration lines.
 </p>
 <p style="color: blue;">
   This is blue paragraph,
   <span style="font-size:2em;
                color: red;
                text-decoration: underline line-through overline;
-               text-decoration-color: blue;">
-    here is red text with blue decoration lines</span>,
+               text-decoration-color: red;">
+    here is red text with red decoration lines</span>,
   and here is blue text without decoration lines.
 </p>
 <p style="color: blue;">
   This is blue paragraph and decoration color is specified as green,
   <span style="font-size:2em;
                color: red;
                text-decoration: underline line-through overline;
                text-decoration-color: green;">
--- a/layout/reftests/text-decoration/decoration-color-quirks.html
+++ b/layout/reftests/text-decoration/decoration-color-quirks.html
@@ -53,17 +53,17 @@
   and here are current color decoration lines.
 </p>
 <p style="color: blue;">
   This is blue paragraph,
   <span style="font-size:2em;
                color: red;
                text-decoration: underline line-through overline;
                text-decoration-color: inherit;">
-    here is red text with blue decoration lines</span>,
+    here is red text with red decoration lines</span>,
   and here is blue text without decoration lines.
 </p>
 <p style="color: blue;
           text-decoration-color: green;">
   This is blue paragraph and decoration color is specified as green,
   <span style="font-size:2em;
                color: red;
                text-decoration: underline line-through overline;
--- a/layout/reftests/text-decoration/decoration-color-standards-ref.html
+++ b/layout/reftests/text-decoration/decoration-color-standards-ref.html
@@ -47,18 +47,18 @@
     here is specified red decoration color but has current color lines</span>,
   and here are current color decoration lines.
 </p>
 <p style="color: blue;">
   This is blue paragraph,
   <span style="font-size:2em;
                color: red;
                text-decoration: underline line-through overline;
-               text-decoration-color: blue;">
-    here is red text with blue decoration lines</span>,
+               text-decoration-color: red;">
+    here is red text with red decoration lines</span>,
   and here is blue text without decoration lines.
 </p>
 <p style="color: blue;">
   This is blue paragraph and decoration color is specified as green,
   <span style="font-size:2em;
                color: red;
                text-decoration: underline line-through overline;
                text-decoration-color: green;">
--- a/layout/reftests/text-decoration/decoration-color-standards.html
+++ b/layout/reftests/text-decoration/decoration-color-standards.html
@@ -52,17 +52,17 @@
   and here are current color decoration lines.
 </p>
 <p style="color: blue;">
   This is blue paragraph,
   <span style="font-size:2em;
                color: red;
                text-decoration: underline line-through overline;
                text-decoration-color: inherit;">
-    here is red text with blue decoration lines</span>,
+    here is red text with red decoration lines</span>,
   and here is blue text without decoration lines.
 </p>
 <p style="color: blue;
           text-decoration-color: green;">
   This is blue paragraph and decoration color is specified as green,
   <span style="font-size:2em;
                color: red;
                text-decoration: underline line-through overline;
--- a/layout/style/Declaration.cpp
+++ b/layout/style/Declaration.cpp
@@ -745,24 +745,24 @@ Declaration::GetValue(nsCSSPropertyID aP
     case eCSSProperty_column_rule:
     case eCSSProperty_outline: {
       const nsCSSPropertyID* subprops =
         nsCSSProps::SubpropertyEntryFor(aProperty);
       MOZ_ASSERT(StringEndsWith(nsCSSProps::GetStringValue(subprops[2]),
                                 NS_LITERAL_CSTRING("-color")),
                  "third subprop must be the color property");
       const nsCSSValue *colorValue = data->ValueFor(subprops[2]);
-      bool isMozUseTextColor =
-        colorValue->GetUnit() == eCSSUnit_Enumerated &&
-        colorValue->GetIntValue() == NS_STYLE_COLOR_MOZ_USE_TEXT_COLOR;
+      bool isCurrentColor =
+        colorValue->GetUnit() == eCSSUnit_EnumColor &&
+        colorValue->GetIntValue() == NS_COLOR_CURRENTCOLOR;
       if (!AppendValueToString(subprops[0], aValue, aSerialization) ||
           !(aValue.Append(char16_t(' ')),
             AppendValueToString(subprops[1], aValue, aSerialization)) ||
-          // Don't output a third value when it's -moz-use-text-color.
-          !(isMozUseTextColor ||
+          // Don't output a third value when it's currentcolor.
+          !(isCurrentColor ||
             (aValue.Append(char16_t(' ')),
              AppendValueToString(subprops[2], aValue, aSerialization)))) {
         aValue.Truncate();
       }
       break;
     }
     case eCSSProperty_background: {
       GetImageLayerValue(data, aValue, aSerialization,
@@ -999,18 +999,18 @@ Declaration::GetValue(nsCSSPropertyID aP
       AppendValueToString(eCSSProperty_text_decoration_line, aValue,
                           aSerialization);
       if (decorationStyle->GetIntValue() !=
             NS_STYLE_TEXT_DECORATION_STYLE_SOLID) {
         aValue.Append(char16_t(' '));
         AppendValueToString(eCSSProperty_text_decoration_style, aValue,
                             aSerialization);
       }
-      if (decorationColor->GetUnit() != eCSSUnit_Enumerated ||
-          decorationColor->GetIntValue() != NS_STYLE_COLOR_MOZ_USE_TEXT_COLOR) {
+      if (decorationColor->GetUnit() != eCSSUnit_EnumColor ||
+          decorationColor->GetIntValue() != NS_COLOR_CURRENTCOLOR) {
         aValue.Append(char16_t(' '));
         AppendValueToString(eCSSProperty_text_decoration_color, aValue,
                             aSerialization);
       }
       break;
     }
     case eCSSProperty_transition: {
       const nsCSSValue *transProp =
--- a/layout/style/StyleAnimationValue.cpp
+++ b/layout/style/StyleAnimationValue.cpp
@@ -3414,32 +3414,16 @@ StyleAnimationValue::UncomputeValue(nsCS
 template<typename T>
 inline const T&
 StyleDataAtOffset(const void* aStyleStruct, ptrdiff_t aOffset)
 {
   return *reinterpret_cast<const T*>(
     reinterpret_cast<const uint8_t*>(aStyleStruct) + aOffset);
 }
 
-static void
-ExtractBorderColor(nsStyleContext* aStyleContext, const void* aStyleBorder,
-                   mozilla::css::Side aSide,
-                   StyleAnimationValue& aComputedValue)
-{
-  nscolor color;
-  bool foreground;
-  static_cast<const nsStyleBorder*>(aStyleBorder)->
-    GetBorderColor(aSide, color, foreground);
-  if (foreground) {
-    // FIXME: should add test for this
-    color = aStyleContext->StyleColor()->mColor;
-  }
-  aComputedValue.SetColorValue(color);
-}
-
 static bool
 StyleCoordToValue(const nsStyleCoord& aCoord, StyleAnimationValue& aValue)
 {
   switch (aCoord.GetUnit()) {
     case eStyleUnit_Normal:
       aValue.SetNormalValue();
       break;
     case eStyleUnit_Auto:
@@ -3830,56 +3814,16 @@ StyleAnimationValue::ExtractComputedValu
         #undef BORDER_WIDTH_CASE
 
         case eCSSProperty_column_rule_width:
           aComputedValue.SetCoordValue(
             static_cast<const nsStyleColumn*>(styleStruct)->
               GetComputedColumnRuleWidth());
           break;
 
-        case eCSSProperty_border_bottom_color:
-          ExtractBorderColor(aStyleContext, styleStruct, NS_SIDE_BOTTOM,
-                             aComputedValue);
-          break;
-        case eCSSProperty_border_left_color:
-          ExtractBorderColor(aStyleContext, styleStruct, NS_SIDE_LEFT,
-                             aComputedValue);
-          break;
-        case eCSSProperty_border_right_color:
-          ExtractBorderColor(aStyleContext, styleStruct, NS_SIDE_RIGHT,
-                             aComputedValue);
-          break;
-        case eCSSProperty_border_top_color:
-          ExtractBorderColor(aStyleContext, styleStruct, NS_SIDE_TOP,
-                             aComputedValue);
-          break;
-
-        case eCSSProperty_outline_color: {
-          const nsStyleOutline *styleOutline =
-            static_cast<const nsStyleOutline*>(styleStruct);
-          nscolor color;
-          if (!styleOutline->GetOutlineColor(color))
-            color = aStyleContext->StyleColor()->mColor;
-          aComputedValue.SetColorValue(color);
-          break;
-        }
-
-        case eCSSProperty_column_rule_color: {
-          const nsStyleColumn *styleColumn =
-            static_cast<const nsStyleColumn*>(styleStruct);
-          nscolor color;
-          if (styleColumn->mColumnRuleColorIsForeground) {
-            color = aStyleContext->StyleColor()->mColor;
-          } else {
-            color = styleColumn->mColumnRuleColor;
-          }
-          aComputedValue.SetColorValue(color);
-          break;
-        }
-
         case eCSSProperty_column_count: {
           const nsStyleColumn *styleColumn =
             static_cast<const nsStyleColumn*>(styleStruct);
           if (styleColumn->mColumnCount == NS_STYLE_COLUMN_COUNT_AUTO) {
             aComputedValue.SetAutoValue();
           } else {
             aComputedValue.SetIntValue(styleColumn->mColumnCount,
                                        eUnit_Integer);
@@ -3890,37 +3834,16 @@ StyleAnimationValue::ExtractComputedValu
         case eCSSProperty_order: {
           const nsStylePosition *stylePosition =
             static_cast<const nsStylePosition*>(styleStruct);
           aComputedValue.SetIntValue(stylePosition->mOrder,
                                      eUnit_Integer);
           break;
         }
 
-        case eCSSProperty_text_decoration_color: {
-          const nsStyleTextReset *styleTextReset =
-            static_cast<const nsStyleTextReset*>(styleStruct);
-          nscolor color;
-          bool isForeground;
-          styleTextReset->GetDecorationColor(color, isForeground);
-          if (isForeground) {
-            color = aStyleContext->StyleColor()->mColor;
-          }
-          aComputedValue.SetColorValue(color);
-          break;
-        }
-
-        case eCSSProperty_text_decoration_style: {
-          uint8_t decorationStyle =
-            static_cast<const nsStyleTextReset*>(styleStruct)->
-              GetDecorationStyle();
-          aComputedValue.SetIntValue(decorationStyle, eUnit_Enumerated);
-          break;
-        }
-
         case eCSSProperty_border_spacing: {
           const nsStyleTableBorder *styleTableBorder =
             static_cast<const nsStyleTableBorder*>(styleStruct);
           nsAutoPtr<nsCSSValuePair> pair(new nsCSSValuePair);
           nscoordToCSSValue(styleTableBorder->mBorderSpacingCol, pair->mXValue);
           nscoordToCSSValue(styleTableBorder->mBorderSpacingRow, pair->mYValue);
           aComputedValue.SetAndAdoptCSSValuePairValue(pair.forget(),
                                                       eUnit_CSSValuePair);
--- a/layout/style/StyleComplexColor.h
+++ b/layout/style/StyleComplexColor.h
@@ -20,24 +20,18 @@ namespace mozilla {
  * where p is mForegroundRatio. See mozilla::LinearBlendColors for
  * the actual algorithm.
  */
 struct StyleComplexColor
 {
   nscolor mColor;
   uint8_t mForegroundRatio;
 
-  StyleComplexColor() {}
-  StyleComplexColor(nscolor aColor, uint_fast8_t aForegroundRatio)
-    : mColor(aColor), mForegroundRatio(aForegroundRatio) {}
-
-  static StyleComplexColor FromColor(nscolor aColor)
-    { return StyleComplexColor(aColor, 0); }
-  static StyleComplexColor CurrentColor()
-    { return StyleComplexColor(NS_RGBA(0, 0, 0, 0), 255); }
+  static StyleComplexColor FromColor(nscolor aColor) { return {aColor, 0}; }
+  static StyleComplexColor CurrentColor() { return {NS_RGBA(0, 0, 0, 0), 255}; }
 
   bool IsNumericColor() const { return mForegroundRatio == 0; }
   bool IsCurrentColor() const { return mForegroundRatio == 255; }
 
   bool operator==(const StyleComplexColor& aOther) const {
     return mForegroundRatio == aOther.mForegroundRatio &&
            (IsCurrentColor() || mColor == aOther.mColor);
   }
--- a/layout/style/nsCSSKeywordList.h
+++ b/layout/style/nsCSSKeywordList.h
@@ -114,17 +114,16 @@ CSS_KEY(-moz-pre-space, _moz_pre_space)
 CSS_KEY(-moz-pull-down-menu, _moz_pull_down_menu)
 CSS_KEY(-moz-right, _moz_right)
 CSS_KEY(-moz-scrollbars-horizontal, _moz_scrollbars_horizontal)
 CSS_KEY(-moz-scrollbars-none, _moz_scrollbars_none)
 CSS_KEY(-moz-scrollbars-vertical, _moz_scrollbars_vertical)
 CSS_KEY(-moz-stack, _moz_stack)
 CSS_KEY(-moz-text, _moz_text)
 CSS_KEY(-moz-use-system-font, _moz_use_system_font)
-CSS_KEY(-moz-use-text-color, _moz_use_text_color)
 CSS_KEY(-moz-visitedhyperlinktext, _moz_visitedhyperlinktext)
 CSS_KEY(-moz-window, _moz_window)
 CSS_KEY(-moz-workspace, _moz_workspace)
 CSS_KEY(-moz-zoom-in, _moz_zoom_in)
 CSS_KEY(-moz-zoom-out, _moz_zoom_out)
 CSS_KEY(-webkit-box, _webkit_box)
 CSS_KEY(-webkit-flex, _webkit_flex)
 CSS_KEY(-webkit-inline-box, _webkit_inline_box)
--- a/layout/style/nsCSSParser.cpp
+++ b/layout/style/nsCSSParser.cpp
@@ -13401,17 +13401,17 @@ CSSParserImpl::ParseBorderSide(const nsC
 
   if ((found & 1) == 0) { // Provide default border-width
     values[0].SetIntValue(NS_STYLE_BORDER_WIDTH_MEDIUM, eCSSUnit_Enumerated);
   }
   if ((found & 2) == 0) { // Provide default border-style
     values[1].SetIntValue(NS_STYLE_BORDER_STYLE_NONE, eCSSUnit_Enumerated);
   }
   if ((found & 4) == 0) { // text color will be used
-    values[2].SetIntValue(NS_STYLE_COLOR_MOZ_USE_TEXT_COLOR, eCSSUnit_Enumerated);
+    values[2].SetIntValue(NS_COLOR_CURRENTCOLOR, eCSSUnit_EnumColor);
   }
 
   if (aSetAllSides) {
     // Parsing "border" shorthand; set all four sides to the same thing
     for (int32_t index = 0; index < 4; index++) {
       NS_ASSERTION(numProps == 3, "This code needs updating");
       AppendValue(kBorderWidthIDs[index], values[0]);
       AppendValue(kBorderStyleIDs[index], values[1]);
@@ -13474,18 +13474,18 @@ bool
 CSSParserImpl::ParseBorderColors(nsCSSPropertyID aProperty)
 {
   nsCSSValue value;
   // 'inherit', 'initial', 'unset' and 'none' are only allowed on their own
   if (!ParseSingleTokenVariant(value, VARIANT_INHERIT | VARIANT_NONE,
                                nullptr)) {
     nsCSSValueList *cur = value.SetListValue();
     for (;;) {
-      if (ParseVariant(cur->mValue, VARIANT_COLOR | VARIANT_KEYWORD,
-                       nsCSSProps::kBorderColorKTable) != CSSParseResult::Ok) {
+      if (ParseVariant(cur->mValue, VARIANT_COLOR, nullptr) !=
+          CSSParseResult::Ok) {
         return false;
       }
       if (CheckEndProperty()) {
         break;
       }
       cur->mNext = new nsCSSValueList;
       cur = cur->mNext;
     }
@@ -15196,17 +15196,17 @@ CSSParserImpl::ParseOutline()
   nsCSSValue  values[numProps];
   int32_t found = ParseChoice(values, kOutlineIDs, numProps);
   if (found < 1) {
     return false;
   }
 
   // Provide default values
   if ((found & 1) == 0) { // Provide default outline-color
-    values[0].SetIntValue(NS_STYLE_COLOR_MOZ_USE_TEXT_COLOR, eCSSUnit_Enumerated);
+    values[0].SetIntValue(NS_COLOR_CURRENTCOLOR, eCSSUnit_EnumColor);
   }
   if ((found & 2) == 0) { // Provide default outline-style
     values[1].SetIntValue(NS_STYLE_BORDER_STYLE_NONE, eCSSUnit_Enumerated);
   }
   if ((found & 4) == 0) { // Provide default outline-width
     values[2].SetIntValue(NS_STYLE_BORDER_WIDTH_MEDIUM, eCSSUnit_Enumerated);
   }
 
@@ -15306,18 +15306,17 @@ CSSParserImpl::ParseTextDecoration()
     values[0].SetIntValue(NS_STYLE_TEXT_DECORATION_LINE_NONE,
                           eCSSUnit_Enumerated);
   }
   if ((found & 2) == 0) { // Provide default text-decoration-style
     values[1].SetIntValue(NS_STYLE_TEXT_DECORATION_STYLE_SOLID,
                           eCSSUnit_Enumerated);
   }
   if ((found & 4) == 0) { // Provide default text-decoration-color
-    values[2].SetIntValue(NS_STYLE_COLOR_MOZ_USE_TEXT_COLOR,
-                          eCSSUnit_Enumerated);
+    values[2].SetIntValue(NS_COLOR_CURRENTCOLOR, eCSSUnit_EnumColor);
   }
 
   for (int32_t index = 0; index < numProps; index++) {
     AppendValue(kTextDecorationIDs[index], values[index]);
   }
   return true;
 }
 
--- a/layout/style/nsCSSPropList.h
+++ b/layout/style/nsCSSPropList.h
@@ -675,18 +675,18 @@ CSS_PROP_LOGICAL(
     border_block_end_color,
     BorderBlockEndColor,
     CSS_PROPERTY_PARSE_VALUE |
         CSS_PROPERTY_APPLIES_TO_FIRST_LETTER |
         CSS_PROPERTY_LOGICAL |
         CSS_PROPERTY_LOGICAL_BLOCK_AXIS |
         CSS_PROPERTY_LOGICAL_END_EDGE,
     "",
-    VARIANT_HCK,
-    kBorderColorKTable,
+    VARIANT_HC,
+    nullptr,
     BorderColor,
     Border,
     CSS_PROP_NO_OFFSET,
     eStyleAnimType_None)
 CSS_PROP_LOGICAL(
     border-block-end-style,
     border_block_end_style,
     BorderBlockEndStyle,
@@ -730,18 +730,18 @@ CSS_PROP_LOGICAL(
     border-block-start-color,
     border_block_start_color,
     BorderBlockStartColor,
     CSS_PROPERTY_PARSE_VALUE |
         CSS_PROPERTY_APPLIES_TO_FIRST_LETTER |
         CSS_PROPERTY_LOGICAL |
         CSS_PROPERTY_LOGICAL_BLOCK_AXIS,
     "",
-    VARIANT_HCK,
-    kBorderColorKTable,
+    VARIANT_HC,
+    nullptr,
     BorderColor,
     Border,
     CSS_PROP_NO_OFFSET,
     eStyleAnimType_None)
 CSS_PROP_LOGICAL(
     border-block-start-style,
     border_block_start_style,
     BorderBlockStartStyle,
@@ -783,20 +783,20 @@ CSS_PROP_BORDER(
     border-bottom-color,
     border_bottom_color,
     BorderBottomColor,
     CSS_PROPERTY_PARSE_VALUE |
         CSS_PROPERTY_APPLIES_TO_FIRST_LETTER |
         CSS_PROPERTY_IGNORED_WHEN_COLORS_DISABLED |
         CSS_PROPERTY_HASHLESS_COLOR_QUIRK,
     "",
-    VARIANT_HCK,
-    kBorderColorKTable,
-    CSS_PROP_NO_OFFSET,
-    eStyleAnimType_Custom)
+    VARIANT_HC,
+    nullptr,
+    offsetof(nsStyleBorder, mBorderBottomColor),
+    eStyleAnimType_ComplexColor)
 CSS_PROP_BORDER(
     -moz-border-bottom-colors,
     border_bottom_colors,
     CSS_PROP_DOMPROP_PREFIXED(BorderBottomColors),
     CSS_PROPERTY_PARSE_FUNCTION |
         CSS_PROPERTY_APPLIES_TO_FIRST_LETTER |
         CSS_PROPERTY_IGNORED_WHEN_COLORS_DISABLED,
     "",
@@ -946,18 +946,18 @@ CSS_PROP_LOGICAL(
     border-inline-end-color,
     border_inline_end_color,
     BorderInlineEndColor,
     CSS_PROPERTY_PARSE_VALUE |
         CSS_PROPERTY_APPLIES_TO_FIRST_LETTER |
         CSS_PROPERTY_LOGICAL |
         CSS_PROPERTY_LOGICAL_END_EDGE,
     "",
-    VARIANT_HCK,
-    kBorderColorKTable,
+    VARIANT_HC,
+    nullptr,
     BorderColor,
     Border,
     CSS_PROP_NO_OFFSET,
     eStyleAnimType_None)
 CSS_PROP_LOGICAL(
     border-inline-end-style,
     border_inline_end_style,
     BorderInlineEndStyle,
@@ -998,18 +998,18 @@ CSS_PROP_SHORTHAND(
 CSS_PROP_LOGICAL(
     border-inline-start-color,
     border_inline_start_color,
     BorderInlineStartColor,
     CSS_PROPERTY_PARSE_VALUE |
         CSS_PROPERTY_APPLIES_TO_FIRST_LETTER |
         CSS_PROPERTY_LOGICAL,
     "",
-    VARIANT_HCK,
-    kBorderColorKTable,
+    VARIANT_HC,
+    nullptr,
     BorderColor,
     Border,
     CSS_PROP_NO_OFFSET,
     eStyleAnimType_None)
 CSS_PROP_LOGICAL(
     border-inline-start-style,
     border_inline_start_style,
     BorderInlineStartStyle,
@@ -1049,20 +1049,20 @@ CSS_PROP_BORDER(
     border-left-color,
     border_left_color,
     BorderLeftColor,
     CSS_PROPERTY_PARSE_VALUE |
         CSS_PROPERTY_HASHLESS_COLOR_QUIRK |
         CSS_PROPERTY_APPLIES_TO_FIRST_LETTER |
         CSS_PROPERTY_IGNORED_WHEN_COLORS_DISABLED,
     "",
-    VARIANT_HCK,
-    kBorderColorKTable,
-    CSS_PROP_NO_OFFSET,
-    eStyleAnimType_Custom)
+    VARIANT_HC,
+    nullptr,
+    offsetof(nsStyleBorder, mBorderLeftColor),
+    eStyleAnimType_ComplexColor)
 CSS_PROP_BORDER(
     -moz-border-left-colors,
     border_left_colors,
     CSS_PROP_DOMPROP_PREFIXED(BorderLeftColors),
     CSS_PROPERTY_PARSE_FUNCTION |
         CSS_PROPERTY_APPLIES_TO_FIRST_LETTER |
         CSS_PROPERTY_IGNORED_WHEN_COLORS_DISABLED,
     "",
@@ -1111,20 +1111,20 @@ CSS_PROP_BORDER(
     border-right-color,
     border_right_color,
     BorderRightColor,
     CSS_PROPERTY_PARSE_VALUE |
         CSS_PROPERTY_HASHLESS_COLOR_QUIRK |
         CSS_PROPERTY_APPLIES_TO_FIRST_LETTER |
         CSS_PROPERTY_IGNORED_WHEN_COLORS_DISABLED,
     "",
-    VARIANT_HCK,
-    kBorderColorKTable,
-    CSS_PROP_NO_OFFSET,
-    eStyleAnimType_Custom)
+    VARIANT_HC,
+    nullptr,
+    offsetof(nsStyleBorder, mBorderRightColor),
+    eStyleAnimType_ComplexColor)
 CSS_PROP_BORDER(
     -moz-border-right-colors,
     border_right_colors,
     CSS_PROP_DOMPROP_PREFIXED(BorderRightColors),
     CSS_PROPERTY_PARSE_FUNCTION |
         CSS_PROPERTY_APPLIES_TO_FIRST_LETTER |
         CSS_PROPERTY_IGNORED_WHEN_COLORS_DISABLED,
     "",
@@ -1185,20 +1185,20 @@ CSS_PROP_BORDER(
     border-top-color,
     border_top_color,
     BorderTopColor,
     CSS_PROPERTY_PARSE_VALUE |
         CSS_PROPERTY_APPLIES_TO_FIRST_LETTER |
         CSS_PROPERTY_IGNORED_WHEN_COLORS_DISABLED |
         CSS_PROPERTY_HASHLESS_COLOR_QUIRK,
     "",
-    VARIANT_HCK,
-    kBorderColorKTable,
-    CSS_PROP_NO_OFFSET,
-    eStyleAnimType_Custom)
+    VARIANT_HC,
+    nullptr,
+    offsetof(nsStyleBorder, mBorderTopColor),
+    eStyleAnimType_ComplexColor)
 CSS_PROP_BORDER(
     -moz-border-top-colors,
     border_top_colors,
     CSS_PROP_DOMPROP_PREFIXED(BorderTopColors),
     CSS_PROPERTY_PARSE_FUNCTION |
         CSS_PROPERTY_APPLIES_TO_FIRST_LETTER |
         CSS_PROPERTY_IGNORED_WHEN_COLORS_DISABLED,
     "",
@@ -1515,20 +1515,20 @@ CSS_PROP_SHORTHAND(
     "")
 CSS_PROP_COLUMN(
     -moz-column-rule-color,
     column_rule_color,
     CSS_PROP_DOMPROP_PREFIXED(ColumnRuleColor),
     CSS_PROPERTY_PARSE_VALUE |
         CSS_PROPERTY_IGNORED_WHEN_COLORS_DISABLED,
     "",
-    VARIANT_HCK,
-    kBorderColorKTable,
-    CSS_PROP_NO_OFFSET,
-    eStyleAnimType_Custom)
+    VARIANT_HC,
+    nullptr,
+    offsetof(nsStyleColumn, mColumnRuleColor),
+    eStyleAnimType_ComplexColor)
 CSS_PROP_COLUMN(
     -moz-column-rule-style,
     column_rule_style,
     CSS_PROP_DOMPROP_PREFIXED(ColumnRuleStyle),
     CSS_PROPERTY_PARSE_VALUE,
     "",
     VARIANT_HK,
     kBorderStyleKTable,
@@ -3119,20 +3119,20 @@ CSS_PROP_SHORTHAND(
     "")
 CSS_PROP_OUTLINE(
     outline-color,
     outline_color,
     OutlineColor,
     CSS_PROPERTY_PARSE_VALUE |
         CSS_PROPERTY_IGNORED_WHEN_COLORS_DISABLED,
     "",
-    VARIANT_HCK,
-    kOutlineColorKTable,
-    CSS_PROP_NO_OFFSET,
-    eStyleAnimType_Custom)
+    VARIANT_HC,
+    nullptr,
+    offsetof(nsStyleOutline, mOutlineColor),
+    eStyleAnimType_ComplexColor)
 CSS_PROP_OUTLINE(
     outline-offset,
     outline_offset,
     OutlineOffset,
     CSS_PROPERTY_PARSE_VALUE,
     "",
     VARIANT_HL | VARIANT_CALC,
     nullptr,
@@ -3933,20 +3933,20 @@ CSS_PROP_TEXTRESET(
     text-decoration-color,
     text_decoration_color,
     TextDecorationColor,
     CSS_PROPERTY_PARSE_VALUE |
         CSS_PROPERTY_APPLIES_TO_FIRST_LETTER_AND_FIRST_LINE |
         CSS_PROPERTY_APPLIES_TO_PLACEHOLDER |
         CSS_PROPERTY_IGNORED_WHEN_COLORS_DISABLED,
     "",
-    VARIANT_HCK,
-    kBorderColorKTable,
-    CSS_PROP_NO_OFFSET,
-    eStyleAnimType_Custom)
+    VARIANT_HC,
+    nullptr,
+    offsetof(nsStyleTextReset, mTextDecorationColor),
+    eStyleAnimType_ComplexColor)
 CSS_PROP_TEXTRESET(
     text-decoration-line,
     text_decoration_line,
     TextDecorationLine,
     CSS_PROPERTY_PARSE_VALUE |
         CSS_PROPERTY_VALUE_PARSER_FUNCTION |
         CSS_PROPERTY_APPLIES_TO_FIRST_LETTER_AND_FIRST_LINE |
         CSS_PROPERTY_APPLIES_TO_PLACEHOLDER,
@@ -3961,17 +3961,17 @@ CSS_PROP_TEXTRESET(
     TextDecorationStyle,
     CSS_PROPERTY_PARSE_VALUE |
         CSS_PROPERTY_APPLIES_TO_FIRST_LETTER_AND_FIRST_LINE |
         CSS_PROPERTY_APPLIES_TO_PLACEHOLDER,
     "",
     VARIANT_HK,
     kTextDecorationStyleKTable,
     CSS_PROP_NO_OFFSET,
-    eStyleAnimType_Custom)
+    eStyleAnimType_None)
 CSS_PROP_SHORTHAND(
     text-emphasis,
     text_emphasis,
     TextEmphasis,
     CSS_PROPERTY_PARSE_FUNCTION,
     "")
 CSS_PROP_TEXT(
     text-emphasis-color,
--- a/layout/style/nsCSSProps.cpp
+++ b/layout/style/nsCSSProps.cpp
@@ -986,21 +986,16 @@ const KTableEntry nsCSSProps::kBlendMode
 };
 
 const KTableEntry nsCSSProps::kBorderCollapseKTable[] = {
   { eCSSKeyword_collapse,  NS_STYLE_BORDER_COLLAPSE },
   { eCSSKeyword_separate,  NS_STYLE_BORDER_SEPARATE },
   { eCSSKeyword_UNKNOWN,   -1 }
 };
 
-const KTableEntry nsCSSProps::kBorderColorKTable[] = {
-  { eCSSKeyword__moz_use_text_color, NS_STYLE_COLOR_MOZ_USE_TEXT_COLOR },
-  { eCSSKeyword_UNKNOWN, -1 }
-};
-
 const KTableEntry nsCSSProps::kBorderImageRepeatKTable[] = {
   { eCSSKeyword_stretch, NS_STYLE_BORDER_IMAGE_REPEAT_STRETCH },
   { eCSSKeyword_repeat, NS_STYLE_BORDER_IMAGE_REPEAT_REPEAT },
   { eCSSKeyword_round, NS_STYLE_BORDER_IMAGE_REPEAT_ROUND },
   { eCSSKeyword_space, NS_STYLE_BORDER_IMAGE_REPEAT_SPACE },
   { eCSSKeyword_UNKNOWN, -1 }
 };
 
@@ -1806,21 +1801,16 @@ const KTableEntry nsCSSProps::kOutlineSt
   { eCSSKeyword_double, NS_STYLE_BORDER_STYLE_DOUBLE },
   { eCSSKeyword_groove, NS_STYLE_BORDER_STYLE_GROOVE },
   { eCSSKeyword_ridge,  NS_STYLE_BORDER_STYLE_RIDGE },
   { eCSSKeyword_inset,  NS_STYLE_BORDER_STYLE_INSET },
   { eCSSKeyword_outset, NS_STYLE_BORDER_STYLE_OUTSET },
   { eCSSKeyword_UNKNOWN, -1 }
 };
 
-const KTableEntry nsCSSProps::kOutlineColorKTable[] = {
-  { eCSSKeyword__moz_use_text_color, NS_STYLE_COLOR_MOZ_USE_TEXT_COLOR },
-  { eCSSKeyword_UNKNOWN, -1 }
-};
-
 const KTableEntry nsCSSProps::kOverflowKTable[] = {
   { eCSSKeyword_auto, NS_STYLE_OVERFLOW_AUTO },
   { eCSSKeyword_visible, NS_STYLE_OVERFLOW_VISIBLE },
   { eCSSKeyword_hidden, NS_STYLE_OVERFLOW_HIDDEN },
   { eCSSKeyword_scroll, NS_STYLE_OVERFLOW_SCROLL },
   // Deprecated:
   { eCSSKeyword__moz_scrollbars_none, NS_STYLE_OVERFLOW_HIDDEN },
   { eCSSKeyword__moz_scrollbars_horizontal, NS_STYLE_OVERFLOW_SCROLLBARS_HORIZONTAL },
--- a/layout/style/nsCSSProps.h
+++ b/layout/style/nsCSSProps.h
@@ -699,17 +699,16 @@ public:
   static const KTableEntry kImageLayerSizeKTable[];
   static const KTableEntry kImageLayerCompositeKTable[];
   static const KTableEntry kImageLayerModeKTable[];
   // Not const because we modify its entries when the pref
   // "layout.css.background-clip.text" changes:
   static KTableEntry kBackgroundClipKTable[];
   static const KTableEntry kBlendModeKTable[];
   static const KTableEntry kBorderCollapseKTable[];
-  static const KTableEntry kBorderColorKTable[];
   static const KTableEntry kBorderImageRepeatKTable[];
   static const KTableEntry kBorderImageSliceKTable[];
   static const KTableEntry kBorderStyleKTable[];
   static const KTableEntry kBorderWidthKTable[];
   static const KTableEntry kBoxAlignKTable[];
   static const KTableEntry kBoxDecorationBreakKTable[];
   static const KTableEntry kBoxDirectionKTable[];
   static const KTableEntry kBoxOrientKTable[];
@@ -805,17 +804,16 @@ public:
   static const KTableEntry kMathVariantKTable[];
   static const KTableEntry kMathDisplayKTable[];
   static const KTableEntry kContainKTable[];
   static const KTableEntry kContextOpacityKTable[];
   static const KTableEntry kContextPatternKTable[];
   static const KTableEntry kObjectFitKTable[];
   static const KTableEntry kOrientKTable[];
   static const KTableEntry kOutlineStyleKTable[];
-  static const KTableEntry kOutlineColorKTable[];
   static const KTableEntry kOverflowKTable[];
   static const KTableEntry kOverflowSubKTable[];
   static const KTableEntry kOverflowClipBoxKTable[];
   static const KTableEntry kOverflowWrapKTable[];
   static const KTableEntry kPageBreakKTable[];
   static const KTableEntry kPageBreakInsideKTable[];
   static const KTableEntry kPageMarksKTable[];
   static const KTableEntry kPageSizeKTable[];
--- a/layout/style/nsCSSValue.h
+++ b/layout/style/nsCSSValue.h
@@ -370,18 +370,17 @@ struct ComplexColorData
     return !(*this == aOther);
   }
 
   bool IsCurrentColor() const { return mForegroundRatio >= 1.0f; }
   bool IsNumericColor() const { return mForegroundRatio <= 0.0f; }
 
   StyleComplexColor ToComplexColor() const
   {
-    return StyleComplexColor(
-      mColor.ToColor(), ClampColor(mForegroundRatio * 255.0f));
+    return {mColor.ToColor(), ClampColor(mForegroundRatio * 255.0f)};
   }
 };
 
 struct ComplexColorValue final : public ComplexColorData
 {
   // Just redirect any parameter to the data struct.
   template<typename... Args>
   explicit ComplexColorValue(Args&&... aArgs)
--- a/layout/style/nsComputedDOMStyle.cpp
+++ b/layout/style/nsComputedDOMStyle.cpp
@@ -1059,26 +1059,17 @@ nsComputedDOMStyle::DoGetColumnRuleStyle
                                    nsCSSProps::kBorderStyleKTable));
   return val.forget();
 }
 
 already_AddRefed<CSSValue>
 nsComputedDOMStyle::DoGetColumnRuleColor()
 {
   RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
-
-  const nsStyleColumn* column = StyleColumn();
-  nscolor ruleColor;
-  if (column->mColumnRuleColorIsForeground) {
-    ruleColor = StyleColor()->mColor;
-  } else {
-    ruleColor = column->mColumnRuleColor;
-  }
-
-  SetToRGBAColor(val, ruleColor);
+  SetValueFromComplexColor(val, StyleColumn()->mColumnRuleColor);
   return val.forget();
 }
 
 already_AddRefed<CSSValue>
 nsComputedDOMStyle::DoGetContent()
 {
   const nsStyleContent *content = StyleContent();
 
@@ -3299,33 +3290,33 @@ nsComputedDOMStyle::DoGetScrollSnapCoord
 already_AddRefed<CSSValue>
 nsComputedDOMStyle::DoGetOutlineWidth()
 {
   RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
 
   const nsStyleOutline* outline = StyleOutline();
 
   nscoord width;
-  if (outline->GetOutlineStyle() == NS_STYLE_BORDER_STYLE_NONE) {
+  if (outline->mOutlineStyle == NS_STYLE_BORDER_STYLE_NONE) {
     NS_ASSERTION(outline->GetOutlineWidth() == 0, "unexpected width");
     width = 0;
   } else {
     width = outline->GetOutlineWidth();
   }
   val->SetAppUnits(width);
 
   return val.forget();
 }
 
 already_AddRefed<CSSValue>
 nsComputedDOMStyle::DoGetOutlineStyle()
 {
   RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
   val->SetIdent(
-    nsCSSProps::ValueToKeywordEnum(StyleOutline()->GetOutlineStyle(),
+    nsCSSProps::ValueToKeywordEnum(StyleOutline()->mOutlineStyle,
                                    nsCSSProps::kOutlineStyleKTable));
   return val.forget();
 }
 
 already_AddRefed<CSSValue>
 nsComputedDOMStyle::DoGetOutlineOffset()
 {
   RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
@@ -3360,22 +3351,17 @@ nsComputedDOMStyle::DoGetOutlineRadiusTo
   return GetEllipseRadii(StyleOutline()->mOutlineRadius,
                          NS_CORNER_TOP_RIGHT, false);
 }
 
 already_AddRefed<CSSValue>
 nsComputedDOMStyle::DoGetOutlineColor()
 {
   RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
-
-  nscolor color;
-  if (!StyleOutline()->GetOutlineColor(color))
-    color = StyleColor()->mColor;
-
-  SetToRGBAColor(val, color);
+  SetValueFromComplexColor(val, StyleOutline()->mOutlineColor);
   return val.forget();
 }
 
 already_AddRefed<CSSValue>
 nsComputedDOMStyle::GetEllipseRadii(const nsStyleCorners& aRadius,
                                     uint8_t aFullCorner,
                                     bool aIsBorder) // else outline
 {
@@ -3751,52 +3737,41 @@ nsComputedDOMStyle::DoGetTextCombineUpri
 }
 
 already_AddRefed<CSSValue>
 nsComputedDOMStyle::DoGetTextDecoration()
 {
   const nsStyleTextReset* textReset = StyleTextReset();
 
   bool isInitialStyle =
-    textReset->GetDecorationStyle() == NS_STYLE_TEXT_DECORATION_STYLE_SOLID;
-  nscolor color;
-  bool isForegroundColor;
-  textReset->GetDecorationColor(color, isForegroundColor);
-
-  if (isInitialStyle && isForegroundColor) {
+    textReset->mTextDecorationStyle == NS_STYLE_TEXT_DECORATION_STYLE_SOLID;
+  StyleComplexColor color = textReset->mTextDecorationColor;
+
+  if (isInitialStyle && color.IsCurrentColor()) {
     return DoGetTextDecorationLine();
   }
 
   RefPtr<nsDOMCSSValueList> valueList = GetROCSSValueList(false);
 
   valueList->AppendCSSValue(DoGetTextDecorationLine());
   if (!isInitialStyle) {
     valueList->AppendCSSValue(DoGetTextDecorationStyle());
   }
-  if (!isForegroundColor) {
+  if (!color.IsCurrentColor()) {
     valueList->AppendCSSValue(DoGetTextDecorationColor());
   }
 
   return valueList.forget();
 }
 
 already_AddRefed<CSSValue>
 nsComputedDOMStyle::DoGetTextDecorationColor()
 {
   RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
-
-  nscolor color;
-  bool isForeground;
-  StyleTextReset()->GetDecorationColor(color, isForeground);
-  if (isForeground) {
-    color = StyleColor()->mColor;
-  }
-
-  SetToRGBAColor(val, color);
-
+  SetValueFromComplexColor(val, StyleTextReset()->mTextDecorationColor);
   return val.forget();
 }
 
 already_AddRefed<CSSValue>
 nsComputedDOMStyle::DoGetTextDecorationLine()
 {
   RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
 
@@ -3820,17 +3795,17 @@ nsComputedDOMStyle::DoGetTextDecorationL
 }
 
 already_AddRefed<CSSValue>
 nsComputedDOMStyle::DoGetTextDecorationStyle()
 {
   RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
 
   val->SetIdent(
-    nsCSSProps::ValueToKeywordEnum(StyleTextReset()->GetDecorationStyle(),
+    nsCSSProps::ValueToKeywordEnum(StyleTextReset()->mTextDecorationStyle,
                                    nsCSSProps::kTextDecorationStyleKTable));
 
   return val.forget();
 }
 
 already_AddRefed<CSSValue>
 nsComputedDOMStyle::DoGetTextEmphasisColor()
 {
@@ -4154,34 +4129,32 @@ nsComputedDOMStyle::DoGetUnicodeBidi()
 
 already_AddRefed<CSSValue>
 nsComputedDOMStyle::DoGetCursor()
 {
   RefPtr<nsDOMCSSValueList> valueList = GetROCSSValueList(true);
 
   const nsStyleUserInterface *ui = StyleUserInterface();
 
-  for (nsCursorImage *item = ui->mCursorArray,
-         *item_end = ui->mCursorArray + ui->mCursorArrayLength;
-       item < item_end; ++item) {
+  for (const nsCursorImage& item : ui->mCursorImages) {
     RefPtr<nsDOMCSSValueList> itemList = GetROCSSValueList(false);
 
     nsCOMPtr<nsIURI> uri;
-    item->GetImage()->GetURI(getter_AddRefs(uri));
+    item.GetImage()->GetURI(getter_AddRefs(uri));
 
     RefPtr<nsROCSSPrimitiveValue> val = new nsROCSSPrimitiveValue;
     val->SetURI(uri);
     itemList->AppendCSSValue(val.forget());