merge fx-team to mozilla-central a=merge
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Fri, 16 Sep 2016 12:52:57 +0200
changeset 357670 23cd4d6ba00c1139175eaa82d22b70d1172d76cf
parent 357660 3172114c06cdf084d9e46c394c47e62c672c7259 (current diff)
parent 357669 dd0619214bc367e85630a917a95de4d3db9ed9b6 (diff)
child 357705 f1dbeb5dee22cabc56b2cf25d2eab1435abbf131
push id1324
push usermtabara@mozilla.com
push dateMon, 16 Jan 2017 13:07:44 +0000
treeherdermozilla-release@a01c49833940 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone51.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 fx-team to mozilla-central a=merge
devtools/client/inspector/test/browser_inspector_pane-toggle-04.js
devtools/shared/css-color-db.js
devtools/shared/css-color.js
devtools/shared/css-lexer.js
devtools/shared/css-parsing-utils.js
devtools/shared/css-properties-db.js
devtools/shared/webaudio.js
--- a/.eslintignore
+++ b/.eslintignore
@@ -120,17 +120,16 @@ devtools/server/actors/**
 !devtools/server/actors/styles.js
 !devtools/server/actors/string.js
 !devtools/server/actors/csscoverage.js
 devtools/server/performance/**
 devtools/server/tests/**
 devtools/shared/*.js
 !devtools/shared/async-storage.js
 !devtools/shared/async-utils.js
-!devtools/shared/css-lexer.js
 !devtools/shared/defer.js
 !devtools/shared/event-emitter.js
 !devtools/shared/indentation.js
 !devtools/shared/loader-plugin-raw.jsm
 !devtools/shared/task.js
 devtools/shared/*.jsm
 !devtools/shared/Loader.jsm
 devtools/shared/apps/**
--- a/browser/components/extensions/ext-browserAction.js
+++ b/browser/components/extensions/ext-browserAction.js
@@ -5,17 +5,17 @@
 XPCOMUtils.defineLazyModuleGetter(this, "CustomizableUI",
                                   "resource:///modules/CustomizableUI.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "clearTimeout",
                                   "resource://gre/modules/Timer.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "setTimeout",
                                   "resource://gre/modules/Timer.jsm");
 
 XPCOMUtils.defineLazyGetter(this, "colorUtils", () => {
-  return require("devtools/shared/css-color").colorUtils;
+  return require("devtools/shared/css/color").colorUtils;
 });
 
 Cu.import("resource://devtools/shared/event-emitter.js");
 
 Cu.import("resource://gre/modules/ExtensionUtils.jsm");
 var {
   EventManager,
   IconDetails,
--- a/browser/components/extensions/ext-utils.js
+++ b/browser/components/extensions/ext-utils.js
@@ -13,17 +13,17 @@ XPCOMUtils.defineLazyModuleGetter(this, 
 XPCOMUtils.defineLazyModuleGetter(this, "setTimeout",
                                   "resource://gre/modules/Timer.jsm");
 
 XPCOMUtils.defineLazyServiceGetter(this, "styleSheetService",
                                    "@mozilla.org/content/style-sheet-service;1",
                                    "nsIStyleSheetService");
 
 XPCOMUtils.defineLazyGetter(this, "colorUtils", () => {
-  return require("devtools/shared/css-color").colorUtils;
+  return require("devtools/shared/css/color").colorUtils;
 });
 
 Cu.import("resource://gre/modules/ExtensionUtils.jsm");
 Cu.import("resource://gre/modules/AppConstants.jsm");
 
 const POPUP_LOAD_TIMEOUT_MS = 200;
 
 const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
--- a/browser/extensions/pdfjs/README.mozilla
+++ b/browser/extensions/pdfjs/README.mozilla
@@ -1,3 +1,3 @@
 This is the pdf.js project output, https://github.com/mozilla/pdf.js
 
-Current extension version is: 1.5.437
+Current extension version is: 1.5.464
--- a/browser/extensions/pdfjs/content/PdfJs.jsm
+++ b/browser/extensions/pdfjs/content/PdfJs.jsm
@@ -87,16 +87,17 @@ function initializeDefaultPreferences() 
   "pdfBugEnabled": false,
   "disableRange": false,
   "disableStream": false,
   "disableAutoFetch": false,
   "disableFontFace": false,
   "disableTextLayer": false,
   "useOnlyCssZoom": false,
   "externalLinkTarget": 0,
+  "enhanceTextSelection": false,
   "renderInteractiveForms": false
 }
 
 
   var defaultBranch = Services.prefs.getDefaultBranch(PREF_PREFIX + '.');
   var defaultValue;
   for (var key in DEFAULT_PREFERENCES) {
     defaultValue = DEFAULT_PREFERENCES[key];
--- a/browser/extensions/pdfjs/content/PdfStreamConverter.jsm
+++ b/browser/extensions/pdfjs/content/PdfStreamConverter.jsm
@@ -942,16 +942,18 @@ PdfStreamConverter.prototype = {
     // Change the content type so we don't get stuck in a loop.
     aRequest.setProperty('contentType', aRequest.contentType);
     aRequest.contentType = 'text/html';
     if (isHttpRequest) {
       // We trust PDF viewer, using no CSP
       aRequest.setResponseHeader('Content-Security-Policy', '', false);
       aRequest.setResponseHeader('Content-Security-Policy-Report-Only', '',
                                  false);
+      // The viewer does not need to handle HTTP Refresh header.
+      aRequest.setResponseHeader('Refresh', '', false);
     }
 
     PdfJsTelemetry.onViewerIsUsed();
     PdfJsTelemetry.onDocumentSize(aRequest.contentLength);
 
     // Creating storage for PDF data
     var contentLength = aRequest.contentLength;
     this.dataListener = new PdfDataListener(contentLength);
--- a/browser/extensions/pdfjs/content/PdfjsChromeUtils.jsm
+++ b/browser/extensions/pdfjs/content/PdfjsChromeUtils.jsm
@@ -45,16 +45,17 @@ var DEFAULT_PREFERENCES =
   "pdfBugEnabled": false,
   "disableRange": false,
   "disableStream": false,
   "disableAutoFetch": false,
   "disableFontFace": false,
   "disableTextLayer": false,
   "useOnlyCssZoom": false,
   "externalLinkTarget": 0,
+  "enhanceTextSelection": false,
   "renderInteractiveForms": false
 }
 
 
 var PdfjsChromeUtils = {
   // For security purposes when running remote, we restrict preferences
   // content can access.
   _allowedPrefNames: Object.keys(DEFAULT_PREFERENCES),
--- a/browser/extensions/pdfjs/content/build/pdf.js
+++ b/browser/extensions/pdfjs/content/build/pdf.js
@@ -23,18 +23,18 @@ define('pdfjs-dist/build/pdf', ['exports
     factory(exports);
   } else {
 factory((root.pdfjsDistBuildPdf = {}));
   }
 }(this, function (exports) {
   // Use strict in our context only - users might not want it
   'use strict';
 
-var pdfjsVersion = '1.5.437';
-var pdfjsBuild = 'ca61ccc';
+var pdfjsVersion = '1.5.464';
+var pdfjsBuild = '834a7ff';
 
   var pdfjsFilePath =
     typeof document !== 'undefined' && document.currentScript ?
       document.currentScript.src : null;
 
   var pdfjsLibs = {};
 
   (function pdfjsWrapper() {
@@ -2316,51 +2316,60 @@ var WidgetAnnotationElement = (function 
 })();
 
 /**
  * @class
  * @alias TextWidgetAnnotationElement
  */
 var TextWidgetAnnotationElement = (
     function TextWidgetAnnotationElementClosure() {
+  var TEXT_ALIGNMENT = ['left', 'center', 'right'];
+
   function TextWidgetAnnotationElement(parameters) {
     WidgetAnnotationElement.call(this, parameters);
   }
 
   Util.inherit(TextWidgetAnnotationElement, WidgetAnnotationElement, {
     /**
      * Render the text widget annotation's HTML element in the empty container.
      *
      * @public
      * @memberof TextWidgetAnnotationElement
      * @returns {HTMLSectionElement}
      */
     render: function TextWidgetAnnotationElement_render() {
       this.container.className = 'textWidgetAnnotation';
 
+      var element = null;
       if (this.renderInteractiveForms) {
-        var input = document.createElement('input');
-        input.type = 'text';
-        input.value = this.data.fieldValue;
-
-        this.container.appendChild(input);
+        element = document.createElement('input');
+        element.type = 'text';
+        element.value = this.data.fieldValue;
+
+        if (this.data.maxLen !== null) {
+          element.maxLength = this.data.maxLen;
+        }
       } else {
-        var content = document.createElement('div');
-        content.textContent = this.data.fieldValue;
-        var textAlignment = this.data.textAlignment;
-        content.style.textAlign = ['left', 'center', 'right'][textAlignment];
-        content.style.verticalAlign = 'middle';
-        content.style.display = 'table-cell';
-
-        var font = (this.data.fontRefName ?
-          this.page.commonObjs.getData(this.data.fontRefName) : null);
-        this._setTextStyle(content, font);
-
-        this.container.appendChild(content);
-      }
+        element = document.createElement('div');
+        element.textContent = this.data.fieldValue;
+        element.style.verticalAlign = 'middle';
+        element.style.display = 'table-cell';
+
+        var font = null;
+        if (this.data.fontRefName) {
+          font = this.page.commonObjs.getData(this.data.fontRefName);
+        }
+        this._setTextStyle(element, font);
+      }
+
+      if (this.data.textAlignment !== null) {
+        element.style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment];
+      }
+
+      this.container.appendChild(element);
       return this.container;
     },
 
     /**
      * Apply text styles to the text in the element.
      *
      * @private
      * @param {HTMLDivElement} element
@@ -2884,24 +2893,30 @@ var renderTextLayer = (function renderTe
   var MAX_TEXT_DIVS_TO_RENDER = 100000;
 
   var NonWhitespaceRegexp = /\S/;
 
   function isAllWhitespace(str) {
     return !NonWhitespaceRegexp.test(str);
   }
 
+  // Text layers may contain many thousand div's, and using `styleBuf` avoids
+  // creating many intermediate strings when building their 'style' properties.
+  var styleBuf = ['left: ', 0, 'px; top: ', 0, 'px; font-size: ', 0,
+                  'px; font-family: ', '', ';'];
+
   function appendText(task, geom, styles) {
     // Initialize all used properties to keep the caches monomorphic.
     var textDiv = document.createElement('div');
     var textDivProperties = {
+      style: null,
       angle: 0,
       canvasWidth: 0,
       isWhitespace: false,
-      originalTransform: '',
+      originalTransform: null,
       paddingBottom: 0,
       paddingLeft: 0,
       paddingRight: 0,
       paddingTop: 0,
       scale: 1,
     };
 
     task._textDivs.push(textDiv);
@@ -2929,20 +2944,22 @@ var renderTextLayer = (function renderTe
     var top;
     if (angle === 0) {
       left = tx[4];
       top = tx[5] - fontAscent;
     } else {
       left = tx[4] + (fontAscent * Math.sin(angle));
       top = tx[5] - (fontAscent * Math.cos(angle));
     }
-    textDiv.style.left = left + 'px';
-    textDiv.style.top = top + 'px';
-    textDiv.style.fontSize = fontHeight + 'px';
-    textDiv.style.fontFamily = style.fontFamily;
+    styleBuf[1] = left;
+    styleBuf[3] = top;
+    styleBuf[5] = fontHeight;
+    styleBuf[7] = style.fontFamily;
+    textDivProperties.style = styleBuf.join('');
+    textDiv.setAttribute('style', textDivProperties.style);
 
     textDiv.textContent = geom.str;
     // |fontName| is only used by the Font Inspector. This test will succeed
     // when e.g. the Font Inspector is off but the Stepper is on, but it's
     // not worth the effort to do a more accurate test. We only use `dataset`
     // here to make the font name available for the debugger.
     if (getDefaultSetting('pdfBug')) {
       textDiv.dataset.fontName = geom.fontName;
@@ -3340,17 +3357,16 @@ var renderTextLayer = (function renderTe
     this._textDivs = textDivs || [];
     this._textDivProperties = new WeakMap();
     this._renderingDone = false;
     this._canceled = false;
     this._capability = createPromiseCapability();
     this._renderTimer = null;
     this._bounds = [];
     this._enhanceTextSelection = !!enhanceTextSelection;
-    this._expanded = false;
   }
   TextLayerRenderTask.prototype = {
     get promise() {
       return this._capability.promise;
     },
 
     cancel: function TextLayer_cancel() {
       this._canceled = true;
@@ -3378,59 +3394,66 @@ var renderTextLayer = (function renderTe
         }, timeout);
       }
     },
 
     expandTextDivs: function TextLayer_expandTextDivs(expandDivs) {
       if (!this._enhanceTextSelection || !this._renderingDone) {
         return;
       }
-      if (!this._expanded) {
+      if (this._bounds !== null) {
         expand(this);
-        this._expanded = true;
-        this._bounds.length = 0;
+        this._bounds = null;
       }
 
       for (var i = 0, ii = this._textDivs.length; i < ii; i++) {
         var div = this._textDivs[i];
         var divProperties = this._textDivProperties.get(div);
 
+        if (divProperties.isWhitespace) {
+          continue;
+        }
         if (expandDivs) {
-          var transform = '';
+          var transform = '', padding = '';
 
           if (divProperties.scale !== 1) {
             transform = 'scaleX(' + divProperties.scale + ')';
           }
           if (divProperties.angle !== 0) {
             transform = 'rotate(' + divProperties.angle + 'deg) ' + transform;
           }
           if (divProperties.paddingLeft !== 0) {
-            div.style.paddingLeft =
-              (divProperties.paddingLeft / divProperties.scale) + 'px';
+            padding += ' padding-left: ' +
+              (divProperties.paddingLeft / divProperties.scale) + 'px;';
             transform += ' translateX(' +
               (-divProperties.paddingLeft / divProperties.scale) + 'px)';
           }
           if (divProperties.paddingTop !== 0) {
-            div.style.paddingTop = divProperties.paddingTop + 'px';
+            padding += ' padding-top: ' + divProperties.paddingTop + 'px;';
             transform += ' translateY(' + (-divProperties.paddingTop) + 'px)';
           }
           if (divProperties.paddingRight !== 0) {
-            div.style.paddingRight =
-              (divProperties.paddingRight / divProperties.scale) + 'px';
+            padding += ' padding-right: ' +
+              (divProperties.paddingRight / divProperties.scale) + 'px;';
           }
           if (divProperties.paddingBottom !== 0) {
-            div.style.paddingBottom = divProperties.paddingBottom + 'px';
+            padding += ' padding-bottom: ' +
+              divProperties.paddingBottom + 'px;';
+          }
+
+          if (padding !== '') {
+            div.setAttribute('style', divProperties.style + padding);
           }
           if (transform !== '') {
             CustomStyle.setProp('transform', div, transform);
           }
         } else {
           div.style.padding = 0;
           CustomStyle.setProp('transform', div,
-                              divProperties.originalTransform);
+                              divProperties.originalTransform || '');
         }
       }
     },
   };
 
   /**
    * Starts rendering of the text layer.
    *
@@ -4945,19 +4968,16 @@ var CanvasGraphics = (function CanvasGra
       var property = properties[i];
       if (sourceCtx[property] !== undefined) {
         destCtx[property] = sourceCtx[property];
       }
     }
     if (sourceCtx.setLineDash !== undefined) {
       destCtx.setLineDash(sourceCtx.getLineDash());
       destCtx.lineDashOffset =  sourceCtx.lineDashOffset;
-    } else if (sourceCtx.mozDashOffset !== undefined) {
-      destCtx.mozDash = sourceCtx.mozDash;
-      destCtx.mozDashOffset = sourceCtx.mozDashOffset;
     }
   }
 
   function composeSMaskBackdrop(bytes, r0, g0, b0) {
     var length = bytes.length;
     for (var i = 3; i < length; i += 4) {
       var alpha = bytes[i];
       if (alpha === 0) {
@@ -5203,19 +5223,16 @@ var CanvasGraphics = (function CanvasGra
     setMiterLimit: function CanvasGraphics_setMiterLimit(limit) {
       this.ctx.miterLimit = limit;
     },
     setDash: function CanvasGraphics_setDash(dashArray, dashPhase) {
       var ctx = this.ctx;
       if (ctx.setLineDash !== undefined) {
         ctx.setLineDash(dashArray);
         ctx.lineDashOffset = dashPhase;
-      } else {
-        ctx.mozDash = dashArray;
-        ctx.mozDashOffset = dashPhase;
       }
     },
     setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {
       // Maybe if we one day fully support color spaces this will be important
       // for now we can ignore.
       // TODO set rendering intent?
     },
     setFlatness: function CanvasGraphics_setFlatness(flatness) {
@@ -6648,16 +6665,17 @@ var UnexpectedResponseException = shared
 var UnknownErrorException = sharedUtil.UnknownErrorException;
 var Util = sharedUtil.Util;
 var createPromiseCapability = sharedUtil.createPromiseCapability;
 var error = sharedUtil.error;
 var deprecated = sharedUtil.deprecated;
 var getVerbosityLevel = sharedUtil.getVerbosityLevel;
 var info = sharedUtil.info;
 var isInt = sharedUtil.isInt;
+var isArray = sharedUtil.isArray;
 var isArrayBuffer = sharedUtil.isArrayBuffer;
 var isSameOrigin = sharedUtil.isSameOrigin;
 var loadJpegStream = sharedUtil.loadJpegStream;
 var stringToBytes = sharedUtil.stringToBytes;
 var globalScope = sharedUtil.globalScope;
 var warn = sharedUtil.warn;
 var FontFaceObject = displayFontLoader.FontFaceObject;
 var FontLoader = displayFontLoader.FontLoader;
@@ -7641,16 +7659,94 @@ var PDFWorker = (function PDFWorkerClosu
           callback(window.pdfjsDistBuildPdfWorker.WorkerMessageHandler);
         });
       };
       loader(fakeWorkerFilesLoadedCapability.resolve);
     }
     return fakeWorkerFilesLoadedCapability.promise;
   }
 
+  function FakeWorkerPort(defer) {
+    this._listeners = [];
+    this._defer = defer;
+    this._deferred = Promise.resolve(undefined);
+  }
+  FakeWorkerPort.prototype = {
+    postMessage: function (obj, transfers) {
+      function cloneValue(value) {
+        // Trying to perform a structured clone close to the spec, including
+        // transfers.
+        if (typeof value !== 'object' || value === null) {
+          return value;
+        }
+        if (cloned.has(value)) { // already cloned the object
+          return cloned.get(value);
+        }
+        var result;
+        var buffer;
+        if ((buffer = value.buffer) && isArrayBuffer(buffer)) {
+          // We found object with ArrayBuffer (typed array).
+          var transferable = transfers && transfers.indexOf(buffer) >= 0;
+          if (value === buffer) {
+            // Special case when we are faking typed arrays in compatibility.js.
+            result = value;
+          } else if (transferable) {
+            result = new value.constructor(buffer, value.byteOffset,
+                                           value.byteLength);
+          } else {
+            result = new value.constructor(value);
+          }
+          cloned.set(value, result);
+          return result;
+        }
+        result = isArray(value) ? [] : {};
+        cloned.set(value, result); // adding to cache now for cyclic references
+        // Cloning all value and object properties, however ignoring properties
+        // defined via getter.
+        for (var i in value) {
+          var desc, p = value;
+          while (!(desc = Object.getOwnPropertyDescriptor(p, i))) {
+            p = Object.getPrototypeOf(p);
+          }
+          if (typeof desc.value === 'undefined' ||
+              typeof desc.value === 'function') {
+            continue;
+          }
+          result[i] = cloneValue(desc.value);
+        }
+        return result;
+      }
+
+      if (!this._defer) {
+        this._listeners.forEach(function (listener) {
+          listener.call(this, {data: obj});
+        }, this);
+        return;
+      }
+
+      var cloned = new WeakMap();
+      var e = {data: cloneValue(obj)};
+      this._deferred.then(function () {
+        this._listeners.forEach(function (listener) {
+          listener.call(this, e);
+        }, this);
+      }.bind(this));
+    },
+    addEventListener: function (name, listener) {
+      this._listeners.push(listener);
+    },
+    removeEventListener: function (name, listener) {
+      var i = this._listeners.indexOf(listener);
+      this._listeners.splice(i, 1);
+    },
+    terminate: function () {
+      this._listeners = [];
+    }
+  };
+
   function createCDNWrapper(url) {
     // We will rely on blob URL's property to specify origin.
     // We want this function to fail in case if createObjectURL or Blob do not
     // exist or fail for some reason -- our Worker creation will fail anyway.
     var wrapper = 'importScripts(\'' + url + '\');';
     return URL.createObjectURL(new Blob([wrapper]));
   }
 
@@ -7800,34 +7896,21 @@ var PDFWorker = (function PDFWorkerClosu
       }
 
       setupFakeWorkerGlobal().then(function (WorkerMessageHandler) {
         if (this.destroyed) {
           this._readyCapability.reject(new Error('Worker was destroyed'));
           return;
         }
 
-        // If we don't use a worker, just post/sendMessage to the main thread.
-        var port = {
-          _listeners: [],
-          postMessage: function (obj) {
-            var e = {data: obj};
-            this._listeners.forEach(function (listener) {
-              listener.call(this, e);
-            }, this);
-          },
-          addEventListener: function (name, listener) {
-            this._listeners.push(listener);
-          },
-          removeEventListener: function (name, listener) {
-            var i = this._listeners.indexOf(listener);
-            this._listeners.splice(i, 1);
-          },
-          terminate: function () {}
-        };
+        // We cannot turn on proper fake port simulation (this includes
+        // structured cloning) when typed arrays are not supported. Relying
+        // on a chance that messages will be sent in proper order.
+        var isTypedArraysPresent = Uint8Array !== Float32Array;
+        var port = new FakeWorkerPort(isTypedArraysPresent);
         this._port = port;
 
         // All fake workers use the same port, making id unique.
         var id = 'fake' + (nextFakeWorkerId++);
 
         // If the main thread is our worker, setup the handling for the
         // messages -- the main thread sends to it self.
         var workerHandler = new MessageHandler(id + '_worker', id, port);
--- a/browser/extensions/pdfjs/content/build/pdf.worker.js
+++ b/browser/extensions/pdfjs/content/build/pdf.worker.js
@@ -23,18 +23,18 @@ define('pdfjs-dist/build/pdf.worker', ['
     factory(exports);
   } else {
 factory((root.pdfjsDistBuildPdfWorker = {}));
   }
 }(this, function (exports) {
   // Use strict in our context only - users might not want it
   'use strict';
 
-var pdfjsVersion = '1.5.437';
-var pdfjsBuild = 'ca61ccc';
+var pdfjsVersion = '1.5.464';
+var pdfjsBuild = '834a7ff';
 
   var pdfjsFilePath =
     typeof document !== 'undefined' && document.currentScript ?
       document.currentScript.src : null;
 
   var pdfjsLibs = {};
 
   (function pdfjsWrapper() {
@@ -11223,20 +11223,21 @@ exports.JpegImage = JpegImage;
 (function (root, factory) {
   {
     factory((root.pdfjsCoreJpx = {}), root.pdfjsSharedUtil,
       root.pdfjsCoreArithmeticDecoder);
   }
 }(this, function (exports, sharedUtil, coreArithmeticDecoder) {
 
 var info = sharedUtil.info;
+var warn = sharedUtil.warn;
+var error = sharedUtil.error;
 var log2 = sharedUtil.log2;
 var readUint16 = sharedUtil.readUint16;
 var readUint32 = sharedUtil.readUint32;
-var warn = sharedUtil.warn;
 var ArithmeticDecoder = coreArithmeticDecoder.ArithmeticDecoder;
 
 var JpxImage = (function JpxImageClosure() {
   // Table E.1
   var SubbandsGainLog2 = {
     'LL': 0,
     'LH': 1,
     'HL': 1,
@@ -11268,17 +11269,17 @@ var JpxImage = (function JpxImageClosure
                  readUint32(data, position + 4);
           position += 8;
           headerSize += 8;
         }
         if (lbox === 0) {
           lbox = length - position + headerSize;
         }
         if (lbox < headerSize) {
-          throw new Error('JPX Error: Invalid box field size');
+          error('JPX Error: Invalid box field size');
         }
         var dataLength = lbox - headerSize;
         var jumpDataLength = true;
         switch (tbox) {
           case 0x6A703268: // 'jp2h'
             jumpDataLength = false; // parsing child boxes
             break;
           case 0x636F6C72: // 'colr'
@@ -11346,22 +11347,22 @@ var JpxImage = (function JpxImageClosure
           this.width = Xsiz - XOsiz;
           this.height = Ysiz - YOsiz;
           this.componentsCount = Csiz;
           // Results are always returned as Uint8Arrays
           this.bitsPerComponent = 8;
           return;
         }
       }
-      throw new Error('JPX Error: No size marker found in JPX stream');
+      error('JPX Error: No size marker found in JPX stream');
     },
     parseCodestream: function JpxImage_parseCodestream(data, start, end) {
       var context = {};
+      var doNotRecover = false;
       try {
-        var doNotRecover = false;
         var position = start;
         while (position + 1 < end) {
           var code = readUint16(data, position);
           position += 2;
 
           var length = 0, j, sqcd, spqcds, spqcdSize, scalarExpounded, tile;
           switch (code) {
             case 0xFF4F: // Start of codestream (SOC)
@@ -11414,17 +11415,17 @@ var JpxImage = (function JpxImageClosure
                   spqcdSize = 16;
                   scalarExpounded = false;
                   break;
                 case 2:
                   spqcdSize = 16;
                   scalarExpounded = true;
                   break;
                 default:
-                  throw new Error('JPX Error: Invalid SQcd value ' + sqcd);
+                  throw new Error('Invalid SQcd value ' + sqcd);
               }
               qcd.noQuantization = (spqcdSize === 8);
               qcd.scalarExpounded = scalarExpounded;
               qcd.guardBits = sqcd >> 5;
               spqcds = [];
               while (j < length + position) {
                 var spqcd = {};
                 if (spqcdSize === 8) {
@@ -11466,17 +11467,17 @@ var JpxImage = (function JpxImageClosure
                   spqcdSize = 16;
                   scalarExpounded = false;
                   break;
                 case 2:
                   spqcdSize = 16;
                   scalarExpounded = true;
                   break;
                 default:
-                  throw new Error('JPX Error: Invalid SQcd value ' + sqcd);
+                  throw new Error('Invalid SQcd value ' + sqcd);
               }
               qcc.noQuantization = (spqcdSize === 8);
               qcc.scalarExpounded = scalarExpounded;
               qcc.guardBits = sqcd >> 5;
               spqcds = [];
               while (j < (length + position)) {
                 spqcd = {};
                 if (spqcdSize === 8) {
@@ -11544,17 +11545,17 @@ var JpxImage = (function JpxImageClosure
               if (cod.verticalyStripe) {
                 unsupported.push('verticalyStripe');
               }
               if (cod.predictableTermination) {
                 unsupported.push('predictableTermination');
               }
               if (unsupported.length > 0) {
                 doNotRecover = true;
-                throw new Error('JPX Error: Unsupported COD options (' +
+                throw new Error('Unsupported COD options (' +
                                 unsupported.join(', ') + ')');
               }
               if (context.mainHeader) {
                 context.COD = cod;
               } else {
                 context.currentTile.COD = cod;
                 context.currentTile.COC = [];
               }
@@ -11592,29 +11593,28 @@ var JpxImage = (function JpxImageClosure
             case 0xFF55: // Tile-part lengths, main header (TLM)
             case 0xFF57: // Packet length, main header (PLM)
             case 0xFF58: // Packet length, tile-part header (PLT)
             case 0xFF64: // Comment (COM)
               length = readUint16(data, position);
               // skipping content
               break;
             case 0xFF53: // Coding style component (COC)
-              throw new Error('JPX Error: Codestream code 0xFF53 (COC) is ' +
+              throw new Error('Codestream code 0xFF53 (COC) is ' +
                               'not implemented');
             default:
-              throw new Error('JPX Error: Unknown codestream code: ' +
-                              code.toString(16));
+              throw new Error('Unknown codestream code: ' + code.toString(16));
           }
           position += length;
         }
       } catch (e) {
         if (doNotRecover || this.failOnCorruptedImage) {
-          throw e;
-        } else {
-          warn('Trying to recover from ' + e.message);
+          error('JPX Error: ' + e.message);
+        } else {
+          warn('JPX: Trying to recover from: ' + e.message);
         }
       }
       this.tiles = transformComponents(context);
       this.width = context.SIZ.Xsiz - context.SIZ.XOsiz;
       this.height = context.SIZ.Ysiz - context.SIZ.YOsiz;
       this.componentsCount = context.SIZ.Csiz;
     }
   };
@@ -11854,17 +11854,17 @@ var JpxImage = (function JpxImageClosure
               return packet;
             }
             k = 0;
           }
           i = 0;
         }
         r = 0;
       }
-      throw new Error('JPX Error: Out of packets');
+      error('JPX Error: Out of packets');
     };
   }
   function ResolutionLayerComponentPositionIterator(context) {
     var siz = context.SIZ;
     var tileIndex = context.currentTile.index;
     var tile = context.tiles[tileIndex];
     var layersCount = tile.codingStyleDefaultParameters.layersCount;
     var componentsCount = siz.Csiz;
@@ -11894,17 +11894,17 @@ var JpxImage = (function JpxImageClosure
               return packet;
             }
             k = 0;
           }
           i = 0;
         }
         l = 0;
       }
-      throw new Error('JPX Error: Out of packets');
+      error('JPX Error: Out of packets');
     };
   }
   function ResolutionPositionComponentLayerIterator(context) {
     var siz = context.SIZ;
     var tileIndex = context.currentTile.index;
     var tile = context.tiles[tileIndex];
     var layersCount = tile.codingStyleDefaultParameters.layersCount;
     var componentsCount = siz.Csiz;
@@ -11953,17 +11953,17 @@ var JpxImage = (function JpxImageClosure
               return packet;
             }
             l = 0;
           }
           c = 0;
         }
         p = 0;
       }
-      throw new Error('JPX Error: Out of packets');
+      error('JPX Error: Out of packets');
     };
   }
   function PositionComponentResolutionLayerIterator(context) {
     var siz = context.SIZ;
     var tileIndex = context.currentTile.index;
     var tile = context.tiles[tileIndex];
     var layersCount = tile.codingStyleDefaultParameters.layersCount;
     var componentsCount = siz.Csiz;
@@ -12000,17 +12000,17 @@ var JpxImage = (function JpxImageClosure
               l = 0;
             }
             r = 0;
           }
           c = 0;
         }
         px = 0;
       }
-      throw new Error('JPX Error: Out of packets');
+      error('JPX Error: Out of packets');
     };
   }
   function ComponentPositionResolutionLayerIterator(context) {
     var siz = context.SIZ;
     var tileIndex = context.currentTile.index;
     var tile = context.tiles[tileIndex];
     var layersCount = tile.codingStyleDefaultParameters.layersCount;
     var componentsCount = siz.Csiz;
@@ -12046,17 +12046,17 @@ var JpxImage = (function JpxImageClosure
               l = 0;
             }
             r = 0;
           }
           px = 0;
         }
         py = 0;
       }
-      throw new Error('JPX Error: Out of packets');
+      error('JPX Error: Out of packets');
     };
   }
   function getPrecinctIndexIfExist(
     pxIndex, pyIndex, sizeInImageScale, precinctIterationSizes, resolution) {
     var posX = pxIndex * precinctIterationSizes.minWidth;
     var posY = pyIndex * precinctIterationSizes.minHeight;
     if (posX % sizeInImageScale.width !== 0 ||
         posY % sizeInImageScale.height !== 0) {
@@ -12226,18 +12226,17 @@ var JpxImage = (function JpxImageClosure
         tile.packetsIterator =
           new PositionComponentResolutionLayerIterator(context);
         break;
       case 4:
         tile.packetsIterator =
           new ComponentPositionResolutionLayerIterator(context);
         break;
       default:
-        throw new Error('JPX Error: Unsupported progression order ' +
-                        progressionOrder);
+        error('JPX Error: Unsupported progression order ' + progressionOrder);
     }
   }
   function parseTilePackets(context, data, offset, dataLength) {
     var position = 0;
     var buffer, bufferSize = 0, skipNextBit = false;
     function readBits(count) {
       while (bufferSize < count) {
         var b = data[offset + position];
@@ -13164,17 +13163,17 @@ var JpxImage = (function JpxImageClosure
       checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() {
         var decoder = this.decoder;
         var contexts = this.contexts;
         var symbol = (decoder.readBit(contexts, UNIFORM_CONTEXT) << 3) |
                      (decoder.readBit(contexts, UNIFORM_CONTEXT) << 2) |
                      (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) |
                       decoder.readBit(contexts, UNIFORM_CONTEXT);
         if (symbol !== 0xA) {
-          throw new Error('JPX Error: Invalid segmentation symbol');
+          error('JPX Error: Invalid segmentation symbol');
         }
       }
     };
 
     return BitModel;
   })();
 
   // Section F, Discrete wavelet transformation
@@ -27470,22 +27469,27 @@ var Font = (function FontClosure() {
       }
       this.loadedName = fontName.split('-')[0];
       this.loading = false;
       this.fontType = getFontType(type, subtype);
       return;
     }
 
     // Some fonts might use wrong font types for Type1C or CIDFontType0C
-    if (subtype === 'Type1C' && (type !== 'Type1' && type !== 'MMType1')) {
-      // Some TrueType fonts by mistake claim Type1C
-      if (isTrueTypeFile(file)) {
-        subtype = 'TrueType';
-      } else {
-        type = 'Type1';
+    if (subtype === 'Type1C') {
+      if (type !== 'Type1' && type !== 'MMType1') {
+        // Some TrueType fonts by mistake claim Type1C
+        if (isTrueTypeFile(file)) {
+          subtype = 'TrueType';
+        } else {
+          type = 'Type1';
+        }
+      } else if (isOpenTypeFile(file)) {
+        // Sometimes the type/subtype can be a complete lie (see issue7598.pdf).
+        type = subtype = 'OpenType';
       }
     }
     if (subtype === 'CIDFontType0C' && type !== 'CIDFontType0') {
       type = 'CIDFontType0';
     }
     if (subtype === 'OpenType') {
       type = 'OpenType';
     }
@@ -29153,17 +29157,20 @@ var Font = (function FontClosure() {
             glyphId = cidToGidMap[cid];
           }
 
           if (glyphId >= 0 && glyphId < numGlyphs &&
               hasGlyph(glyphId, charCode, cid)) {
             charCodeToGlyphId[charCode] = glyphId;
           }
         });
-        if (dupFirstEntry) {
+        if (dupFirstEntry && (isCidToGidMapEmpty || !charCodeToGlyphId[0])) {
+          // We don't duplicate the first entry in the `charCodeToGlyphId` map
+          // if the font has a `CIDToGIDMap` which has already mapped the first
+          // entry to a non-zero `glyphId` (fixes issue7544.pdf).
           charCodeToGlyphId[0] = numGlyphs - 1;
         }
       } else {
         // Most of the following logic in this code branch is based on the
         // 9.6.6.4 of the PDF spec.
         var hasEncoding =
           properties.differences.length > 0 || !!properties.baseEncodingName;
         var cmapTable =
@@ -39812,18 +39819,29 @@ var WidgetAnnotation = (function WidgetA
 
   return WidgetAnnotation;
 })();
 
 var TextWidgetAnnotation = (function TextWidgetAnnotationClosure() {
   function TextWidgetAnnotation(params) {
     WidgetAnnotation.call(this, params);
 
-    this.data.textAlignment = Util.getInheritableProperty(params.dict, 'Q');
-    this.data.maxLen = Util.getInheritableProperty(params.dict, 'MaxLen');
+    // Determine the alignment of text in the field.
+    var alignment = Util.getInheritableProperty(params.dict, 'Q');
+    if (!isInt(alignment) || alignment < 0 || alignment > 2) {
+      alignment = null;
+    }
+    this.data.textAlignment = alignment;
+
+    // Determine the maximum length of text in the field.
+    var maximumLength = Util.getInheritableProperty(params.dict, 'MaxLen');
+    if (!isInt(maximumLength) || maximumLength < 0) {
+      maximumLength = null;
+    }
+    this.data.maxLen = maximumLength;
   }
 
   Util.inherit(TextWidgetAnnotation, WidgetAnnotation, {
     getOperatorList: function TextWidgetAnnotation_getOperatorList(evaluator,
                                                                    task) {
       if (this.appearance) {
         return Annotation.prototype.getOperatorList.call(this, evaluator, task);
       }
--- a/browser/extensions/pdfjs/content/web/viewer.js
+++ b/browser/extensions/pdfjs/content/web/viewer.js
@@ -947,16 +947,17 @@ exports.PDFRenderingQueue = PDFRendering
   "pdfBugEnabled": false,
   "disableRange": false,
   "disableStream": false,
   "disableAutoFetch": false,
   "disableFontFace": false,
   "disableTextLayer": false,
   "useOnlyCssZoom": false,
   "externalLinkTarget": 0,
+  "enhanceTextSelection": false,
   "renderInteractiveForms": false
 }
 
   );
 
 function cloneObj(obj) {
   var result = {};
   for (var i in obj) {
@@ -3828,16 +3829,19 @@ exports.PDFThumbnailView = PDFThumbnailV
 var SCROLLBAR_PADDING = uiUtils.SCROLLBAR_PADDING;
 var mozL10n = uiUtils.mozL10n;
 
 /**
  * @typedef {Object} SecondaryToolbarOptions
  * @property {HTMLDivElement} toolbar - Container for the secondary toolbar.
  * @property {HTMLButtonElement} toggleButton - Button to toggle the visibility
  *   of the secondary toolbar.
+ * @property {HTMLDivElement} toolbarButtonContainer - Container where all the
+ *   toolbar buttons are placed. The maximum height of the toolbar is controlled
+ *   dynamically by adjusting the 'max-height' CSS property of this DOM element.
  * @property {HTMLButtonElement} presentationModeButton - Button for entering
  *   presentation mode.
  * @property {HTMLButtonElement} openFileButton - Button to open a file.
  * @property {HTMLButtonElement} printButton - Button to print the document.
  * @property {HTMLButtonElement} downloadButton - Button to download the
  *   document.
  * @property {HTMLLinkElement} viewBookmarkButton - Button to obtain a bookmark
  *   link to the current location in the document.
@@ -3857,21 +3861,23 @@ var mozL10n = uiUtils.mozL10n;
 
 /**
  * @class
  */
 var SecondaryToolbar = (function SecondaryToolbarClosure() {
   /**
    * @constructs SecondaryToolbar
    * @param {SecondaryToolbarOptions} options
+   * @param {HTMLDivElement} mainContainer
    * @param {EventBus} eventBus
    */
-  function SecondaryToolbar(options, eventBus) {
+  function SecondaryToolbar(options, mainContainer, eventBus) {
     this.toolbar = options.toolbar;
     this.toggleButton = options.toggleButton;
+    this.toolbarButtonContainer = options.toolbarButtonContainer;
     this.buttons = [
       { element: options.presentationModeButton, eventName: 'presentationmode',
         close: true },
       { element: options.openFileButton, eventName: 'openfile', close: true },
       { element: options.printButton, eventName: 'print', close: true },
       { element: options.downloadButton, eventName: 'download', close: true },
       { element: options.viewBookmarkButton, eventName: null, close: true },
       { element: options.firstPageButton, eventName: 'firstpage', close: true },
@@ -3881,26 +3887,29 @@ var SecondaryToolbar = (function Seconda
       { element: options.pageRotateCcwButton, eventName: 'rotateccw',
         close: false },
       { element: options.toggleHandToolButton, eventName: 'togglehandtool',
         close: true },
       { element: options.documentPropertiesButton,
         eventName: 'documentproperties', close: true }
     ];
 
+    this.mainContainer = mainContainer;
     this.eventBus = eventBus;
 
     this.opened = false;
+    this.containerHeight = null;
     this.previousContainerHeight = null;
-    this.newContainerHeight = null;
-    this.buttonContainer = this.toolbar.firstElementChild;
 
     // Bind the event listeners for click and hand tool actions.
     this._bindClickListeners();
     this._bindHandToolListener(options.toggleHandToolButton);
+
+    // Bind the event listener for adjusting the 'max-height' of the toolbar.
+    this.eventBus.on('resize', this._setMaxHeight.bind(this));
   }
 
   SecondaryToolbar.prototype = {
     /**
      * @return {boolean}
      */
     get isOpen() {
       return this.opened;
@@ -3913,17 +3922,17 @@ var SecondaryToolbar = (function Seconda
       // All items within the secondary toolbar.
       for (var button in this.buttons) {
         var element = this.buttons[button].element;
         var eventName = this.buttons[button].eventName;
         var close = this.buttons[button].close;
 
         element.addEventListener('click', function (eventName, close) {
           if (eventName !== null) {
-            this.eventBus.dispatch(eventName);
+            this.eventBus.dispatch(eventName, { source: this, });
           }
           if (close) {
             this.close();
           }
         }.bind(this, eventName, close));
       }
     },
 
@@ -3949,16 +3958,18 @@ var SecondaryToolbar = (function Seconda
       }.bind(this));
     },
 
     open: function SecondaryToolbar_open() {
       if (this.opened) {
         return;
       }
       this.opened = true;
+      this._setMaxHeight();
+
       this.toggleButton.classList.add('toggled');
       this.toolbar.classList.remove('hidden');
     },
 
     close: function SecondaryToolbar_close() {
       if (!this.opened) {
         return;
       }
@@ -3970,28 +3981,32 @@ var SecondaryToolbar = (function Seconda
     toggle: function SecondaryToolbar_toggle() {
       if (this.opened) {
         this.close();
       } else {
         this.open();
       }
     },
 
-    setMaxHeight: function SecondaryToolbar_setMaxHeight(container) {
-      if (!container || !this.buttonContainer) {
+    /**
+     * @private
+     */
+    _setMaxHeight: function SecondaryToolbar_setMaxHeight() {
+      if (!this.opened) {
+        return; // Only adjust the 'max-height' if the toolbar is visible.
+      }
+      this.containerHeight = this.mainContainer.clientHeight;
+
+      if (this.containerHeight === this.previousContainerHeight) {
         return;
       }
-      this.newContainerHeight = container.clientHeight;
-      if (this.previousContainerHeight === this.newContainerHeight) {
-        return;
-      }
-      var maxHeight = this.newContainerHeight - SCROLLBAR_PADDING;
-      this.buttonContainer.setAttribute('style',
-        'max-height: ' + maxHeight + 'px;');
-      this.previousContainerHeight = this.newContainerHeight;
+      this.toolbarButtonContainer.setAttribute('style',
+        'max-height: ' + (this.containerHeight - SCROLLBAR_PADDING) + 'px;');
+
+      this.previousContainerHeight = this.containerHeight;
     }
   };
 
   return SecondaryToolbar;
 })();
 
 exports.SecondaryToolbar = SecondaryToolbar;
 }));
@@ -7150,17 +7165,16 @@ var getGlobalEventBus = domEventsLib.get
 
 var DEFAULT_SCALE_DELTA = 1.1;
 var MIN_SCALE = 0.25;
 var MAX_SCALE = 10.0;
 var SCALE_SELECT_CONTAINER_PADDING = 8;
 var SCALE_SELECT_PADDING = 22;
 var PAGE_NUMBER_LOADING_INDICATOR = 'visiblePageIsLoading';
 var DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000;
-var ENHANCE_TEXT_SELECTION = false;
 
 function configure(PDFJS) {
   PDFJS.imageResourcesPath = './images/';
   PDFJS.workerSrc = '../build/pdf.worker.js';
   PDFJS.cMapUrl = '../web/cmaps/';
   PDFJS.cMapPacked = true;
 }
 
@@ -7252,17 +7266,17 @@ var PDFViewerApplication = {
     var viewer = appConfig.viewerContainer;
     this.pdfViewer = new PDFViewer({
       container: container,
       viewer: viewer,
       eventBus: eventBus,
       renderingQueue: pdfRenderingQueue,
       linkService: pdfLinkService,
       downloadManager: downloadManager,
-      enhanceTextSelection: ENHANCE_TEXT_SELECTION,
+      enhanceTextSelection: false,
     });
     pdfRenderingQueue.setViewer(this.pdfViewer);
     pdfLinkService.setViewer(this.pdfViewer);
 
     var thumbnailContainer = appConfig.sidebar.thumbnailView;
     this.pdfThumbnailViewer = new PDFThumbnailViewer({
       container: thumbnailContainer,
       renderingQueue: pdfRenderingQueue,
@@ -7311,17 +7325,17 @@ var PDFViewerApplication = {
       container: container,
       eventBus: this.eventBus,
     });
 
     this.pdfDocumentProperties =
       new PDFDocumentProperties(appConfig.documentProperties);
 
     this.secondaryToolbar =
-      new SecondaryToolbar(appConfig.secondaryToolbar, eventBus);
+      new SecondaryToolbar(appConfig.secondaryToolbar, container, eventBus);
 
     if (this.supportsFullscreen) {
       this.pdfPresentationMode = new PDFPresentationMode({
         container: container,
         viewer: viewer,
         pdfViewer: this.pdfViewer,
         eventBus: this.eventBus,
         contextMenuItems: appConfig.fullscreen
@@ -7364,16 +7378,28 @@ var PDFViewerApplication = {
         self.preferencePdfBugEnabled = value;
       }),
       Preferences.get('showPreviousViewOnLoad').then(function resolved(value) {
         self.preferenceShowPreviousViewOnLoad = value;
       }),
       Preferences.get('defaultZoomValue').then(function resolved(value) {
         self.preferenceDefaultZoomValue = value;
       }),
+      Preferences.get('enhanceTextSelection').then(function resolved(value) {
+        // TODO: Move the initialization and fetching of `Preferences` to occur
+        //       before the various viewer components are initialized.
+        //
+        // This was attempted in: https://github.com/mozilla/pdf.js/pull/7586,
+        // but it had to be backed out since it violated implicit assumptions
+        // about some viewer components being synchronously available.
+        //
+        // NOTE: This hack works since the `enhanceTextSelection` option is not
+        //       needed until `PDFViewer.setDocument` has been called.
+        self.pdfViewer.enhanceTextSelection = value;
+      }),
       Preferences.get('disableTextLayer').then(function resolved(value) {
         if (PDFJS.disableTextLayer === true) {
           return;
         }
         PDFJS.disableTextLayer = value;
       }),
       Preferences.get('disableRange').then(function resolved(value) {
         if (PDFJS.disableRange === true) {
@@ -8634,20 +8660,16 @@ function webViewerResize() {
     } else if (!currentScaleValue) {
       // Normally this shouldn't happen, but if the scale wasn't initialized
       // we set it to the default value in order to prevent any issues.
       // (E.g. the document being rendered with the wrong scale on load.)
       PDFViewerApplication.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE;
     }
     PDFViewerApplication.pdfViewer.update();
   }
-
-  // Set the 'max-height' CSS property of the secondary toolbar.
-  var mainContainer = PDFViewerApplication.appConfig.mainContainer;
-  PDFViewerApplication.secondaryToolbar.setMaxHeight(mainContainer);
 }
 
 window.addEventListener('hashchange', function webViewerHashchange(evt) {
   var hash = document.location.hash.substring(1);
   PDFViewerApplication.eventBus.dispatch('hashchange', {hash: hash});
 });
 
 function webViewerHashchange(e) {
@@ -8684,20 +8706,16 @@ function webViewerLocalized() {
       var select = PDFViewerApplication.appConfig.toolbar.scaleSelect;
       select.setAttribute('style', 'min-width: inherit;');
       var width = select.clientWidth + SCALE_SELECT_CONTAINER_PADDING;
       select.setAttribute('style', 'min-width: ' +
                                    (width + SCALE_SELECT_PADDING) + 'px;');
       container.setAttribute('style', 'min-width: ' + width + 'px; ' +
                                       'max-width: ' + width + 'px;');
     }
-
-    // Set the 'max-height' CSS property of the secondary toolbar.
-    var mainContainer = PDFViewerApplication.appConfig.mainContainer;
-    PDFViewerApplication.secondaryToolbar.setMaxHeight(mainContainer);
   });
 }
 
 function webViewerPresentationMode() {
   PDFViewerApplication.requestPresentationMode();
 }
 function webViewerOpenFile() {
   var openFileInputName = PDFViewerApplication.appConfig.openFileInputName;
@@ -9412,16 +9430,18 @@ function getViewerConfiguration() {
       print: document.getElementById('print'),
       presentationModeButton: document.getElementById('presentationMode'),
       download: document.getElementById('download'),
       viewBookmark: document.getElementById('viewBookmark'),
     },
     secondaryToolbar: {
       toolbar: document.getElementById('secondaryToolbar'),
       toggleButton: document.getElementById('secondaryToolbarToggle'),
+      toolbarButtonContainer:
+        document.getElementById('secondaryToolbarButtonContainer'),
       presentationModeButton:
         document.getElementById('secondaryPresentationMode'),
       openFileButton: document.getElementById('secondaryOpenFile'),
       printButton: document.getElementById('secondaryPrint'),
       downloadButton: document.getElementById('secondaryDownload'),
       viewBookmarkButton: document.getElementById('secondaryViewBookmark'),
       firstPageButton: document.getElementById('firstPage'),
       lastPageButton: document.getElementById('lastPage'),
--- a/build/mach_bootstrap.py
+++ b/build/mach_bootstrap.py
@@ -98,16 +98,17 @@ SEARCH_PATHS = [
     'testing/xpcshell',
     'xpcom/idl-parser',
 ]
 
 # Individual files providing mach commands.
 MACH_MODULES = [
     'addon-sdk/mach_commands.py',
     'build/valgrind/mach_commands.py',
+    'devtools/shared/css/generated/mach_commands.py',
     'dom/bindings/mach_commands.py',
     'dom/media/test/external/mach_commands.py',
     'layout/tools/reftest/mach_commands.py',
     'python/mach_commands.py',
     'python/mach/mach/commands/commandinfo.py',
     'python/mach/mach/commands/settings.py',
     'python/compare-locales/mach_commands.py',
     'python/mozboot/mozboot/mach_commands.py',
--- a/devtools/client/framework/test/browser_toolbox_textbox_context_menu.js
+++ b/devtools/client/framework/test/browser_toolbox_textbox_context_menu.js
@@ -4,16 +4,24 @@
  * 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;
 
+  emptyClipboard();
+
+  // Make sure the focus is predictable.
+  let inspector = toolbox.getPanel("inspector");
+  let onFocus = once(inspector.searchBox, "focus");
+  inspector.searchBox.focus();
+  yield onFocus;
+
   ok(textboxContextMenu, "The textbox context menu is loaded in the toolbox");
 
   let cmdUndo = textboxContextMenu.querySelector("[command=cmd_undo]");
   let cmdDelete = textboxContextMenu.querySelector("[command=cmd_delete]");
   let cmdSelectAll = textboxContextMenu.querySelector("[command=cmd_selectAll]");
   let cmdCut = textboxContextMenu.querySelector("[command=cmd_cut]");
   let cmdCopy = textboxContextMenu.querySelector("[command=cmd_copy]");
   let cmdPaste = textboxContextMenu.querySelector("[command=cmd_paste]");
@@ -21,20 +29,23 @@ add_task(function* () {
   info("Opening context menu");
 
   let onContextMenuPopup = once(textboxContextMenu, "popupshowing");
   textboxContextMenu.openPopupAtScreen(0, 0, true);
   yield onContextMenuPopup;
 
   is(cmdUndo.getAttribute("disabled"), "true", "cmdUndo is disabled");
   is(cmdDelete.getAttribute("disabled"), "true", "cmdDelete is disabled");
-  is(cmdSelectAll.getAttribute("disabled"), "", "cmdSelectAll is enabled");
+  is(cmdSelectAll.getAttribute("disabled"), "true", "cmdSelectAll is disabled");
   is(cmdCut.getAttribute("disabled"), "true", "cmdCut is disabled");
   is(cmdCopy.getAttribute("disabled"), "true", "cmdCopy is disabled");
-  is(cmdPaste.getAttribute("disabled"), "true", "cmdPaste is disabled");
+  if (isWindows()) {
+    // emptyClipboard only works on Windows (666254), assert paste only for this OS.
+    is(cmdPaste.getAttribute("disabled"), "true", "cmdPaste is disabled");
+  }
 
   yield cleanup(toolbox);
 });
 
 function* cleanup(toolbox) {
   yield toolbox.destroy();
   gBrowser.removeCurrentTab();
 }
--- a/devtools/client/framework/test/browser_toolbox_window_reload_target.js
+++ b/devtools/client/framework/test/browser_toolbox_window_reload_target.js
@@ -79,16 +79,17 @@ function testReload(shortcut, docked, to
   let complete = () => {
     gBrowser.selectedBrowser.messageManager.removeMessageListener("devtools:test:load", complete);
     return callback();
   };
   gBrowser.selectedBrowser.messageManager.addMessageListener("devtools:test:load", complete);
 
   description = docked + " devtools with tool " + toolID + ", shortcut #" + shortcut;
   info("Testing reload in " + description);
+  toolbox.win.focus();
   synthesizeKeyShortcut(L10N.getStr(shortcut), toolbox.win);
   reloadsSent++;
 }
 
 function finishUp() {
   toolbox.destroy().then(() => {
     gBrowser.removeCurrentTab();
 
--- a/devtools/client/framework/test/shared-head.js
+++ b/devtools/client/framework/test/shared-head.js
@@ -554,8 +554,25 @@ function loadTelemetryAndRecordLogs() {
 function stopRecordingTelemetryLogs(Telemetry) {
   info("Stopping Telemetry");
   Telemetry.prototype.log = Telemetry.prototype._oldlog;
   Telemetry.prototype.logKeyed = Telemetry.prototype._oldlogKeyed;
   delete Telemetry.prototype._oldlog;
   delete Telemetry.prototype._oldlogKeyed;
   delete Telemetry.prototype.telemetryInfo;
 }
+
+/**
+ * Clean the logical clipboard content. This method only clears the OS clipboard on
+ * Windows (see Bug 666254).
+ */
+function emptyClipboard() {
+  let clipboard = Cc["@mozilla.org/widget/clipboard;1"]
+    .getService(SpecialPowers.Ci.nsIClipboard);
+  clipboard.emptyClipboard(clipboard.kGlobalClipboard);
+}
+
+/**
+ * Check if the current operating system is Windows.
+ */
+function isWindows() {
+  return Services.appinfo.OS === "WINNT";
+}
--- a/devtools/client/inspector/components/inspector-tab-panel.js
+++ b/devtools/client/inspector/components/inspector-tab-panel.js
@@ -7,29 +7,41 @@
 "use strict";
 
 const { DOM, createClass, PropTypes } = require("devtools/client/shared/vendor/react");
 
 // Shortcuts
 const { div } = DOM;
 
 /**
- * Side panel for the Inspector panel.
- * This side panel is using an existing DOM node as a content.
+ * Helper panel component that is using an existing DOM node
+ * as the content. It's used by Sidebar as well as SplitBox
+ * components.
  */
 var InspectorTabPanel = createClass({
   displayName: "InspectorTabPanel",
 
   propTypes: {
+    // ID of the node that should be rendered as the content.
+    id: PropTypes.string.isRequired,
+    // Optional prefix for panel IDs.
+    idPrefix: PropTypes.string,
+    // Optional mount callback
     onMount: PropTypes.func,
   },
 
+  getDefaultProps: function () {
+    return {
+      idPrefix: "",
+    };
+  },
+
   componentDidMount: function () {
     let doc = this.refs.content.ownerDocument;
-    let panel = doc.getElementById("sidebar-panel-" + this.props.id);
+    let panel = doc.getElementById(this.props.idPrefix + this.props.id);
 
     // Append existing DOM node into panel's content.
     this.refs.content.appendChild(panel);
 
     if (this.props.onMount) {
       this.props.onMount(this.refs.content, this.props);
     }
   },
--- 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
@@ -24,27 +24,37 @@ add_task(function* () {
   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]");
   let cmdPaste = searchContextMenu.querySelector("[command=cmd_paste]");
 
   info("Opening context menu");
+
+  emptyClipboard();
+
+  let onFocus = once(searchField, "focus");
+  searchField.focus();
+  yield onFocus;
+
   let onContextMenuPopup = once(searchContextMenu, "popupshowing");
   EventUtils.synthesizeMouse(searchField, 2, 2,
     {type: "contextmenu", button: 2}, win);
   yield onContextMenuPopup;
 
   is(cmdUndo.getAttribute("disabled"), "true", "cmdUndo is disabled");
   is(cmdDelete.getAttribute("disabled"), "true", "cmdDelete is disabled");
-  is(cmdSelectAll.getAttribute("disabled"), "", "cmdSelectAll is enabled");
+  is(cmdSelectAll.getAttribute("disabled"), "true", "cmdSelectAll is disabled");
   is(cmdCut.getAttribute("disabled"), "true", "cmdCut is disabled");
   is(cmdCopy.getAttribute("disabled"), "true", "cmdCopy is disabled");
-  is(cmdPaste.getAttribute("disabled"), "true", "cmdPaste is disabled");
+  if (isWindows()) {
+    // emptyClipboard only works on Windows (666254), assert paste only for this OS.
+    is(cmdPaste.getAttribute("disabled"), "true", "cmdPaste is disabled");
+  }
 
   info("Closing context menu");
   let onContextMenuHidden = once(searchContextMenu, "popuphidden");
   searchContextMenu.hidePopup();
   yield onContextMenuHidden;
 
   info("Copy text in search field using the context menu");
   searchField.value = TEST_INPUT;
--- a/devtools/client/inspector/inspector-panel.js
+++ b/devtools/client/inspector/inspector-panel.js
@@ -30,16 +30,24 @@ const {RuleViewTool} = require("devtools
 const {ToolSidebar} = require("devtools/client/inspector/toolsidebar");
 const {ViewHelpers} = require("devtools/client/shared/widgets/view-helpers");
 const clipboardHelper = require("devtools/shared/platform/clipboard");
 
 const {LocalizationHelper} = require("devtools/shared/l10n");
 const INSPECTOR_L10N = new LocalizationHelper("devtools/locale/inspector.properties");
 const TOOLBOX_L10N = new LocalizationHelper("devtools/locale/toolbox.properties");
 
+// Sidebar dimensions
+const INITIAL_SIDEBAR_SIZE = 350;
+const MIN_SIDEBAR_SIZE = 50;
+
+// If the toolbox width is smaller than given amount of pixels,
+// the sidebar automatically switches from 'landscape' to 'portrait' mode.
+const PORTRAIT_MODE_WIDTH = 700;
+
 /**
  * Represents an open instance of the Inspector for a tab.
  * The inspector controls the breadcrumbs, the markup view, and the sidebar
  * (computed view, rule view, font view and layout view).
  *
  * Events:
  * - ready
  *      Fired when the inspector panel is opened for the first time and ready to
@@ -89,16 +97,19 @@ function InspectorPanel(iframeWindow, to
   this.onNewRoot = this.onNewRoot.bind(this);
   this._onContextMenu = this._onContextMenu.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;
@@ -395,16 +406,108 @@ InspectorPanel.prototype = {
   get ReactDOM() {
     return this._toolbox.ReactDOM;
   },
 
   get browserRequire() {
     return this._toolbox.browserRequire;
   },
 
+  get InspectorTabPanel() {
+    if (!this._InspectorTabPanel) {
+      this._InspectorTabPanel =
+        this.React.createFactory(this.browserRequire(
+        "devtools/client/inspector/components/inspector-tab-panel"));
+    }
+    return this._InspectorTabPanel;
+  },
+
+  /**
+   * 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({
+        id: "inspector-main-content"
+      }),
+      endPanel: this.InspectorTabPanel({
+        id: "inspector-sidebar-container"
+      })
+    });
+
+    this._splitter = this.ReactDOM.render(splitter,
+      this.panelDoc.getElementById("inspector-splitter-box"));
+
+    // 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.
+   */
+  teardownSplitter: function () {
+    this.panelWin.removeEventListener("resize", this.onPanelWindowResize, true);
+
+    this.sidebar.off("show", this.onSidebarShown);
+    this.sidebar.off("hide", this.onSidebarHidden);
+    this.sidebar.off("destroy", this.onSidebarHidden);
+  },
+
+  /**
+   * If Toolbox width is less than 600 px, the splitter changes its mode
+   * to `horizontal` to support portrait view.
+   */
+  onPanelWindowResize: function () {
+    let box = this.panelDoc.getElementById("inspector-splitter-box");
+    this._splitter.setState({
+      vert: (box.clientWidth > PORTRAIT_MODE_WIDTH)
+    });
+  },
+
+  onSidebarShown: function () {
+    let width;
+    let height;
+
+    // Initialize splitter size from preferences.
+    try {
+      width = Services.prefs.getIntPref("devtools.toolsidebar-width.inspector");
+      height = Services.prefs.getIntPref("devtools.toolsidebar-height.inspector");
+    } catch (e) {
+      // Set width and height of the splitter. Only one
+      // value is really useful at a time depending on the current
+      // orientation (vertical/horizontal).
+      // Having both is supported by the splitter component.
+      width = INITIAL_SIDEBAR_SIZE;
+      height = INITIAL_SIDEBAR_SIZE;
+    }
+
+    this._splitter.setState({width, height});
+  },
+
+  onSidebarHidden: function () {
+    // Store the current splitter size to preferences.
+    let state = this._splitter.state;
+    Services.prefs.setIntPref("devtools.toolsidebar-width.inspector", state.width);
+    Services.prefs.setIntPref("devtools.toolsidebar-height.inspector", state.height);
+  },
+
   /**
    * Build the sidebar.
    */
   setupSidebar: function () {
     let tabbox = this.panelDoc.querySelector("#inspector-sidebar");
     this.sidebar = new ToolSidebar(tabbox, this, "inspector", {
       showAllTabsMenu: true
     });
@@ -450,66 +553,23 @@ InspectorPanel.prototype = {
         "fontinspector",
         INSPECTOR_L10N.getStr("inspector.sidebar.fontInspectorTitle"),
         defaultTab == "fontinspector");
 
       this.fontInspector = new FontInspector(this, this.panelWin);
       this.sidebar.toggleTab(true, "fontinspector");
     }
 
-    this.setupSidebarSize();
+    // Setup the splitter before the sidebar is displayed so,
+    // we don't miss any events.
+    this.setupSplitter();
 
     this.sidebar.show(defaultTab);
   },
 
-  /**
-   * Sidebar size is currently driven by vbox.inspector-sidebar-container
-   * element, which is located at the left/bottom side of the side bar splitter.
-   * Its size is changed by the splitter and stored into preferences.
-   * As soon as bug 1260552 is fixed and new HTML based splitter in place
-   * the size can be driven by div.inspector-sidebar element. This element
-   * represents the ToolSidebar and so, the entire logic related to size
-   * persistence can be done inside the ToolSidebar.
-   */
-  setupSidebarSize: function () {
-    let sidePaneContainer = this.panelDoc.querySelector(
-      "#inspector-sidebar-container");
-
-    this.sidebar.on("show", () => {
-      try {
-        sidePaneContainer.width = Services.prefs.getIntPref(
-          "devtools.toolsidebar-width.inspector");
-        sidePaneContainer.height = Services.prefs.getIntPref(
-          "devtools.toolsidebar-height.inspector");
-      } catch (e) {
-        // The default width is the min-width set in CSS
-        // for #inspector-sidebar-container
-        // Set width and height of the sidebar container. Only one
-        // value is really useful at a time depending on the current
-        // toolbox orientation and having both doesn't break anything.
-        sidePaneContainer.width = 450;
-        sidePaneContainer.height = 450;
-      }
-    });
-
-    this.sidebar.on("hide", () => {
-      Services.prefs.setIntPref("devtools.toolsidebar-width.inspector",
-        sidePaneContainer.width);
-      Services.prefs.setIntPref("devtools.toolsidebar-height.inspector",
-        sidePaneContainer.height);
-    });
-
-    this.sidebar.on("destroy", () => {
-      Services.prefs.setIntPref("devtools.toolsidebar-width.inspector",
-        sidePaneContainer.width);
-      Services.prefs.setIntPref("devtools.toolsidebar-height.inspector",
-        sidePaneContainer.height);
-    });
-  },
-
   setupToolbar: function () {
     this.teardownToolbar();
 
     // Setup the sidebar toggle button.
     let SidebarToggle = this.React.createFactory(this.browserRequire(
       "devtools/client/shared/components/sidebar-toggle"));
 
     let sidebarToggle = SidebarToggle({
@@ -793,16 +853,19 @@ InspectorPanel.prototype = {
     let cssPropertiesDestroyer = this._cssPropertiesLoaded.then(({front}) => {
       if (front) {
         front.destroy();
       }
     });
 
     this.sidebar.off("select", this._setDefaultSidebar);
     let sidebarDestroyer = this.sidebar.destroy();
+
+    this.teardownSplitter();
+
     this.sidebar = null;
 
     this.teardownToolbar();
     this.breadcrumbs.destroy();
     this.selection.off("new-node-front", this.onNewSelection);
     this.selection.off("before-new-node-front", this.onBeforeNewSelection);
     this.selection.off("detached-front", this.onDetached);
     let markupDestroyer = this._destroyMarkup();
@@ -1246,17 +1309,18 @@ InspectorPanel.prototype = {
     return destroyPromise;
   },
 
   /**
    * When the pane toggle button is clicked or pressed, toggle the pane, change the button
    * state and tooltip.
    */
   onPaneToggleButtonClicked: function (e) {
-    let sidePaneContainer = this.panelDoc.querySelector("#inspector-sidebar-container");
+    let sidePaneContainer = this.panelDoc.querySelector(
+      "#inspector-splitter-box .controlled");
     let isVisible = !this._sidebarToggle.state.collapsed;
 
     // Make sure the sidebar has width and height attributes before collapsing
     // because ViewHelpers needs it.
     if (isVisible) {
       let rect = sidePaneContainer.getBoundingClientRect();
       if (!sidePaneContainer.hasAttribute("width")) {
         sidePaneContainer.setAttribute("width", rect.width);
--- a/devtools/client/inspector/inspector.xul
+++ b/devtools/client/inspector/inspector.xul
@@ -11,32 +11,35 @@
 <?xml-stylesheet href="chrome://devtools/skin/fonts.css" type="text/css"?>
 <?xml-stylesheet href="chrome://devtools/skin/layout.css" type="text/css"?>
 <?xml-stylesheet href="chrome://devtools/skin/animationinspector.css" type="text/css"?>
 <?xml-stylesheet href="resource://devtools/client/shared/components/sidebar-toggle.css" type="text/css"?>
 <?xml-stylesheet href="resource://devtools/client/shared/components/tabs/tabs.css" type="text/css"?>
 <?xml-stylesheet href="resource://devtools/client/shared/components/tabs/tabbar.css" type="text/css"?>
 <?xml-stylesheet href="resource://devtools/client/inspector/components/side-panel.css" type="text/css"?>
 <?xml-stylesheet href="resource://devtools/client/inspector/components/inspector-tab-panel.css" type="text/css"?>
+<?xml-stylesheet href="resource://devtools/client/shared/components/splitter/split-box.css" type="text/css"?>
 
 <!DOCTYPE window [
   <!ENTITY % inspectorDTD SYSTEM "chrome://devtools/locale/inspector.dtd"> %inspectorDTD;
   <!ENTITY % styleinspectorDTD SYSTEM "chrome://devtools/locale/styleinspector.dtd"> %styleinspectorDTD;
   <!ENTITY % fontinspectorDTD SYSTEM "chrome://devtools/locale/font-inspector.dtd"> %fontinspectorDTD;
   <!ENTITY % layoutviewDTD SYSTEM "chrome://devtools/locale/layoutview.dtd"> %layoutviewDTD;
 ]>
 
 <window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
         xmlns:html="http://www.w3.org/1999/xhtml">
 
   <script type="application/javascript;version=1.8"
           src="chrome://devtools/content/shared/theme-switching.js"/>
 
-  <box flex="1" class="devtools-responsive-container theme-body">
-    <vbox flex="1" class="devtools-main-content">
+  <html:div class="inspector-responsive-container theme-body inspector">
+
+    <!-- Main Panel Content -->
+    <html:div id="inspector-main-content" class="devtools-main-content">
       <html:div id="inspector-toolbar"
         class="devtools-toolbar"
         nowindowdrag="true">
         <html:button id="inspector-element-add-button"
           title="&inspectorAddNode.label;"
           class="devtools-button" />
         <html:div class="devtools-toolbar-spacer" />
         <html:span id="inspector-searchlabel" />
@@ -44,37 +47,41 @@
           <html:input id="inspector-searchbox" class="devtools-searchinput"
                       type="search"
                       placeholder="&inspectorSearchHTML.label3;"/>
           <html:button id="inspector-searchinput-clear" class="devtools-searchinput-clear" tabindex="-1"></html:button>
         </html:div>
         <html:button id="inspector-eyedropper-toggle"
                      title="&inspectorEyeDropper.label;"
                      class="devtools-button command-button-invertable" />
-        <div xmlns="http://www.w3.org/1999/xhtml"
-          id="inspector-sidebar-toggle-box" />
+        <html:div id="inspector-sidebar-toggle-box" />
       </html:div>
-      <vbox flex="1" id="markup-box">
-      </vbox>
+      <html:div id="markup-box" />
       <html:div id="inspector-breadcrumbs-toolbar" class="devtools-toolbar">
         <html:div id="inspector-breadcrumbs" class="breadcrumbs-widget-container"
                   role="group" aria-label="&inspectorBreadcrumbsGroup;" tabindex="0" />
       </html:div>
-    </vbox>
-    <splitter class="devtools-side-splitter"/>
-    <vbox id="inspector-sidebar-container">
-      <!-- Specify the XHTML namespace explicitly
-        otherwise the layout is broken. -->
-      <div xmlns="http://www.w3.org/1999/xhtml"
-           id="inspector-sidebar"
-           hidden="true" />
-    </vbox>
+    </html:div>
+
+    <!-- Splitter -->
+    <html:div
+      xmlns="http://www.w3.org/1999/xhtml"
+      id="inspector-splitter-box">
+    </html:div>
+
+    <!-- Sidebar Container -->
+    <html:div id="inspector-sidebar-container">
+      <html:div
+        xmlns="http://www.w3.org/1999/xhtml"
+        id="inspector-sidebar"
+        hidden="true" />
+    </html:div>
 
     <!-- Sidebar panel definitions -->
-    <html:div xmlns="http://www.w3.org/1999/xhtml" id="tabpanels" style="visibility:collapse">
+    <html:div id="tabpanels" style="visibility:collapse">
       <html:div id="sidebar-panel-ruleview" class="devtools-monospace theme-sidebar inspector-tabpanel">
         <html:div id="ruleview-toolbar-container" class="devtools-toolbar">
           <html:div id="ruleview-toolbar">
             <html:div class="devtools-searchbox has-clear-btn">
               <html:input id="ruleview-searchbox"
                           class="devtools-filterinput devtools-rule-searchbox"
                           type="search"
                           placeholder="&filterStylesPlaceholder;"/>
@@ -213,10 +220,10 @@
         </html:div>
       </html:div>
 
       <html:div id="sidebar-panel-animationinspector" class="devtools-monospace theme-sidebar inspector-tabpanel">
         <html:iframe class="devtools-inspector-tab-frame" />
       </html:div>
     </html:div>
 
-  </box>
+  </html:div>
 </window>
--- a/devtools/client/inspector/rules/models/rule.js
+++ b/devtools/client/inspector/rules/models/rule.js
@@ -7,17 +7,17 @@
 "use strict";
 
 const promise = require("promise");
 const CssLogic = require("devtools/shared/inspector/css-logic");
 const {ELEMENT_STYLE} = require("devtools/shared/specs/styles");
 const {TextProperty} =
       require("devtools/client/inspector/rules/models/text-property");
 const {promiseWarn} = require("devtools/client/inspector/shared/utils");
-const {parseDeclarations} = require("devtools/shared/css-parsing-utils");
+const {parseDeclarations} = require("devtools/shared/css/parsing-utils");
 const Services = require("Services");
 
 const STYLE_INSPECTOR_PROPERTIES = "devtools-shared/locale/styleinspector.properties";
 const {LocalizationHelper} = require("devtools/shared/l10n");
 const STYLE_INSPECTOR_L10N = new LocalizationHelper(STYLE_INSPECTOR_PROPERTIES);
 
 /**
  * Rule is responsible for the following:
--- a/devtools/client/inspector/rules/models/text-property.js
+++ b/devtools/client/inspector/rules/models/text-property.js
@@ -4,17 +4,17 @@
  * 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";
 
 /* eslint-disable mozilla/reject-some-requires */
 const {Cc, Ci} = require("chrome");
 /* eslint-enable mozilla/reject-some-requires */
-const {escapeCSSComment} = require("devtools/shared/css-parsing-utils");
+const {escapeCSSComment} = require("devtools/shared/css/parsing-utils");
 const {getCssProperties} = require("devtools/shared/fronts/css-properties");
 /* eslint-disable mozilla/reject-some-requires */
 const {XPCOMUtils} = require("resource://gre/modules/XPCOMUtils.jsm");
 /* eslint-enable mozilla/reject-some-requires */
 
 XPCOMUtils.defineLazyGetter(this, "domUtils", function () {
   return Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils);
 });
--- a/devtools/client/inspector/rules/test/browser_rules_authored_color.js
+++ b/devtools/client/inspector/rules/test/browser_rules_authored_color.js
@@ -46,17 +46,17 @@ add_task(function* () {
       name: "color",
       value: "rgb(0, 255, 0)"
     });
 
     let spectrum = cPicker.spectrum;
     let onHidden = cPicker.tooltip.once("hidden");
     // Validating the color change ends up updating the rule view twice
     let onRuleViewChanged = waitForNEvents(view, "ruleview-changed", 2);
-    EventUtils.sendKey("RETURN", spectrum.element.ownerDocument.defaultView);
+    focusAndSendKey(spectrum.element.ownerDocument.defaultView, "RETURN");
     yield onHidden;
     yield onRuleViewChanged;
 
     is(getRuleViewPropertyValue(view, "#testid", "color"), color.result,
        "changing the color preserved the unit for " + color.name);
 
     let target = TargetFactory.forTab(tab);
     yield gDevTools.closeToolbox(target);
--- a/devtools/client/inspector/rules/test/browser_rules_colorUnit.js
+++ b/devtools/client/inspector/rules/test/browser_rules_colorUnit.js
@@ -51,15 +51,15 @@ function* basicTest(view, name, result) 
     name: "color",
     value: "rgb(0, 255, 0)"
   });
 
   let spectrum = cPicker.spectrum;
   let onHidden = cPicker.tooltip.once("hidden");
   // Validating the color change ends up updating the rule view twice
   let onRuleViewChanged = waitForNEvents(view, "ruleview-changed", 2);
-  EventUtils.sendKey("RETURN", spectrum.element.ownerDocument.defaultView);
+  focusAndSendKey(spectrum.element.ownerDocument.defaultView, "RETURN");
   yield onHidden;
   yield onRuleViewChanged;
 
   is(getRuleViewPropertyValue(view, "#testid", "color"), result,
      "changing the color used the " + name + " unit");
 }
--- a/devtools/client/inspector/rules/test/browser_rules_colorpicker-and-image-tooltip_01.js
+++ b/devtools/client/inspector/rules/test/browser_rules_colorpicker-and-image-tooltip_01.js
@@ -43,17 +43,17 @@ function* testImageTooltipAfterColorChan
     selector: "body",
     name: "background-image",
     value: 'url("chrome://global/skin/icons/warning-64.png"), linear-gradient(rgb(0, 0, 0), rgb(255, 0, 102) 400px)'
   });
 
   let spectrum = picker.spectrum;
   let onHidden = picker.tooltip.once("hidden");
   let onModifications = ruleView.once("ruleview-changed");
-  EventUtils.sendKey("RETURN", spectrum.element.ownerDocument.defaultView);
+  focusAndSendKey(spectrum.element.ownerDocument.defaultView, "RETURN");
   yield onHidden;
   yield onModifications;
 
   info("Verify again that the image preview tooltip works");
   // After a color change, the property is re-populated, we need to get the new
   // dom node
   url = getRuleViewProperty(ruleView, "body", "background").valueSpan
     .querySelector(".theme-link");
--- a/devtools/client/inspector/rules/test/browser_rules_colorpicker-and-image-tooltip_02.js
+++ b/devtools/client/inspector/rules/test/browser_rules_colorpicker-and-image-tooltip_02.js
@@ -41,17 +41,17 @@ function* testColorChangeIsntRevertedWhe
     name: "background-color",
     value: "rgb(0, 0, 0)"
   });
 
   let spectrum = picker.spectrum;
 
   let onModifications = waitForNEvents(ruleView, "ruleview-changed", 2);
   let onHidden = picker.tooltip.once("hidden");
-  EventUtils.sendKey("RETURN", spectrum.element.ownerDocument.defaultView);
+  focusAndSendKey(spectrum.element.ownerDocument.defaultView, "RETURN");
   yield onHidden;
   yield onModifications;
 
   info("Open the image preview tooltip");
   let value = getRuleViewProperty(ruleView, "body", "background").valueSpan;
   let url = value.querySelector(".theme-link");
   let onShown = ruleView.tooltips.previewTooltip.once("shown");
   let anchor = yield isHoverTooltipTarget(ruleView.tooltips.previewTooltip, url);
--- a/devtools/client/inspector/rules/test/browser_rules_colorpicker-commit-on-ENTER.js
+++ b/devtools/client/inspector/rules/test/browser_rules_colorpicker-commit-on-ENTER.js
@@ -42,17 +42,17 @@ function* testPressingEnterCommitsChange
     "The color swatch's background was updated");
   is(getRuleViewProperty(ruleView, "body", "border").valueSpan.textContent,
     "2em solid rgba(0, 255, 0, 0.5)",
     "The text of the border css property was updated");
 
   let onModified = ruleView.once("ruleview-changed");
   let spectrum = cPicker.spectrum;
   let onHidden = cPicker.tooltip.once("hidden");
-  EventUtils.sendKey("RETURN", spectrum.element.ownerDocument.defaultView);
+  focusAndSendKey(spectrum.element.ownerDocument.defaultView, "RETURN");
   yield onHidden;
   yield onModified;
 
   is((yield getComputedStyleProperty("body", null, "border-left-color")),
     "rgba(0, 255, 0, 0.5)", "The element's border was kept after RETURN");
   is(swatch.style.backgroundColor, "rgba(0, 255, 0, 0.5)",
     "The color swatch's background was kept after RETURN");
   is(getRuleViewProperty(ruleView, "body", "border").valueSpan.textContent,
--- a/devtools/client/inspector/rules/test/browser_rules_cubicbezier-commit-on-ENTER.js
+++ b/devtools/client/inspector/rules/test/browser_rules_cubicbezier-commit-on-ENTER.js
@@ -48,17 +48,17 @@ function* testPressingEnterCommitsChange
   ok(getRuleViewProperty(ruleView, "body", "transition").valueSpan.textContent
     .indexOf("cubic-bezier(") !== -1,
     "The text of the timing-function was updated");
 
   info("Sending RETURN key within the tooltip document");
   // Pressing RETURN ends up doing 2 rule-view updates, one for the preview and
   // one for the commit when the tooltip closes.
   let onRuleViewChanged = waitForNEvents(ruleView, "ruleview-changed", 2);
-  EventUtils.sendKey("RETURN", widget.parent.ownerDocument.defaultView);
+  focusAndSendKey(widget.parent.ownerDocument.defaultView, "RETURN");
   yield onRuleViewChanged;
 
   let style = yield getComputedStyleProperty("body", null,
                                              "transition-timing-function");
   is(style, expected, "The element's timing-function was kept after RETURN");
 
   let ruleViewStyle = getRuleViewProperty(ruleView, "body", "transition")
                       .valueSpan.textContent.indexOf("cubic-bezier(") !== -1;
--- a/devtools/client/inspector/rules/test/browser_rules_cubicbezier-revert-on-ESC.js
+++ b/devtools/client/inspector/rules/test/browser_rules_cubicbezier-revert-on-ESC.js
@@ -89,12 +89,12 @@ function* getRulePropertyValue(name) {
 
 function* escapeTooltip(view) {
   info("Pressing ESCAPE to close the tooltip");
 
   let bezierTooltip = view.tooltips.cubicBezier;
   let widget = yield bezierTooltip.widget;
   let onHidden = bezierTooltip.tooltip.once("hidden");
   let onModifications = view.once("ruleview-changed");
-  EventUtils.sendKey("ESCAPE", widget.parent.ownerDocument.defaultView);
+  focusAndSendKey(widget.parent.ownerDocument.defaultView, "ESCAPE");
   yield onHidden;
   yield onModifications;
 }
--- a/devtools/client/inspector/rules/test/browser_rules_eyedropper.js
+++ b/devtools/client/inspector/rules/test/browser_rules_eyedropper.js
@@ -59,16 +59,18 @@ add_task(function* () {
 
   info("Test that a color can be selected with the eyedropper");
   yield testSelect(view, swatch, inspector, testActor);
 
   let onHidden = tooltip.once("hidden");
   tooltip.hide();
   yield onHidden;
   ok(!tooltip.isVisible(), "color picker tooltip is closed");
+
+  yield waitForTick();
 });
 
 function* testESC(swatch, inspector, testActor) {
   info("Press escape");
   let onCanceled = new Promise(resolve => {
     inspector.inspector.once("color-pick-canceled", resolve);
   });
   yield testActor.synthesizeKey({key: "VK_ESCAPE", options: {}});
--- a/devtools/client/inspector/rules/test/browser_rules_filtereditor-appears-on-swatch-click.js
+++ b/devtools/client/inspector/rules/test/browser_rules_filtereditor-appears-on-swatch-click.js
@@ -24,9 +24,11 @@ add_task(function* () {
   swatch.click();
   yield onRuleViewChanged;
 
   ok(true, "The shown event was emitted after clicking on swatch");
   ok(!inplaceEditor(swatch.parentNode),
   "The inplace editor wasn't shown as a result of the filter swatch click");
 
   yield hideTooltipAndWaitForRuleViewChanged(filterTooltip, view);
+
+  yield waitForTick();
 });
--- 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
@@ -23,27 +23,37 @@ add_task(function* () {
   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]");
   let cmdPaste = searchContextMenu.querySelector("[command=cmd_paste]");
 
   info("Opening context menu");
+
+  emptyClipboard();
+
+  let onFocus = once(searchField, "focus");
+  searchField.focus();
+  yield onFocus;
+
   let onContextMenuPopup = once(searchContextMenu, "popupshowing");
   EventUtils.synthesizeMouse(searchField, 2, 2,
     {type: "contextmenu", button: 2}, win);
   yield onContextMenuPopup;
 
   is(cmdUndo.getAttribute("disabled"), "true", "cmdUndo is disabled");
   is(cmdDelete.getAttribute("disabled"), "true", "cmdDelete is disabled");
-  is(cmdSelectAll.getAttribute("disabled"), "", "cmdSelectAll is enabled");
+  is(cmdSelectAll.getAttribute("disabled"), "true", "cmdSelectAll is disabled");
   is(cmdCut.getAttribute("disabled"), "true", "cmdCut is disabled");
   is(cmdCopy.getAttribute("disabled"), "true", "cmdCopy is disabled");
-  is(cmdPaste.getAttribute("disabled"), "true", "cmdPaste is disabled");
+  if (isWindows()) {
+    // emptyClipboard only works on Windows (666254), assert paste only for this OS.
+    is(cmdPaste.getAttribute("disabled"), "true", "cmdPaste is disabled");
+  }
 
   info("Closing context menu");
   let onContextMenuHidden = once(searchContextMenu, "popuphidden");
   searchContextMenu.hidePopup();
   yield onContextMenuHidden;
 
   info("Copy text in search field using the context menu");
   searchField.value = TEST_INPUT;
--- a/devtools/client/inspector/rules/test/head.js
+++ b/devtools/client/inspector/rules/test/head.js
@@ -809,8 +809,18 @@ function waitForStyleModification(inspec
           resolve();
           return;
         }
       }
     }
     inspector.on("markupmutation", checkForStyleModification);
   });
 }
+
+/**
+ * Make sure window is properly focused before sending a key event.
+ * @param {Window} win
+ * @param {Event} key
+ */
+function focusAndSendKey(win, key) {
+  win.document.documentElement.focus();
+  EventUtils.sendKey(key, win);
+}
--- a/devtools/client/inspector/rules/views/rule-editor.js
+++ b/devtools/client/inspector/rules/views/rule-editor.js
@@ -18,17 +18,17 @@ const {
   promiseWarn
 } = require("devtools/client/inspector/shared/utils");
 const {
   parseDeclarations,
   parsePseudoClassesAndAttributes,
   SELECTOR_ATTRIBUTE,
   SELECTOR_ELEMENT,
   SELECTOR_PSEUDO_CLASS
-} = require("devtools/shared/css-parsing-utils");
+} = require("devtools/shared/css/parsing-utils");
 const promise = require("promise");
 const Services = require("Services");
 const EventEmitter = require("devtools/shared/event-emitter");
 
 const STYLE_INSPECTOR_PROPERTIES = "devtools-shared/locale/styleinspector.properties";
 const {LocalizationHelper} = require("devtools/shared/l10n");
 const STYLE_INSPECTOR_L10N = new LocalizationHelper(STYLE_INSPECTOR_PROPERTIES);
 
--- a/devtools/client/inspector/rules/views/text-property-editor.js
+++ b/devtools/client/inspector/rules/views/text-property-editor.js
@@ -12,17 +12,17 @@ const {
   createChild,
   appendText,
   advanceValidate,
   blurOnMultipleProperties
 } = require("devtools/client/inspector/shared/utils");
 const {
   parseDeclarations,
   parseSingleValue,
-} = require("devtools/shared/css-parsing-utils");
+} = require("devtools/shared/css/parsing-utils");
 const Services = require("Services");
 
 const HTML_NS = "http://www.w3.org/1999/xhtml";
 
 const SHARED_SWATCH_CLASS = "ruleview-swatch";
 const COLOR_SWATCH_CLASS = "ruleview-colorswatch";
 const BEZIER_SWATCH_CLASS = "ruleview-bezierswatch";
 const FILTER_SWATCH_CLASS = "ruleview-filterswatch";
--- a/devtools/client/inspector/shared/utils.js
+++ b/devtools/client/inspector/shared/utils.js
@@ -1,19 +1,19 @@
 /* -*- 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/. */
 
 "use strict";
 
-const {parseDeclarations} = require("devtools/shared/css-parsing-utils");
+const {parseDeclarations} = require("devtools/shared/css/parsing-utils");
 const promise = require("promise");
-const {getCSSLexer} = require("devtools/shared/css-lexer");
+const {getCSSLexer} = require("devtools/shared/css/lexer");
 const {KeyCodes} = require("devtools/client/shared/keycodes");
 
 const HTML_NS = "http://www.w3.org/1999/xhtml";
 
 /**
  * Create a child element with a set of attributes.
  *
  * @param {Element} parent
--- a/devtools/client/inspector/test/browser.ini
+++ b/devtools/client/inspector/test/browser.ini
@@ -125,17 +125,16 @@ subsuite = clipboard
 subsuite = clipboard
 [browser_inspector_menu-04-use-in-console.js]
 [browser_inspector_menu-05-attribute-items.js]
 [browser_inspector_menu-06-other.js]
 [browser_inspector_navigation.js]
 [browser_inspector_pane-toggle-01.js]
 [browser_inspector_pane-toggle-02.js]
 [browser_inspector_pane-toggle-03.js]
-[browser_inspector_pane-toggle-04.js]
 [browser_inspector_pane-toggle-05.js]
 skip-if = os == "mac" # Full keyboard navigation on OSX only works if Full Keyboard Access setting is set to All Control in System Keyboard
 [browser_inspector_picker-stop-on-destroy.js]
 [browser_inspector_picker-stop-on-tool-change.js]
 [browser_inspector_pseudoclass-lock.js]
 [browser_inspector_pseudoclass-menu.js]
 [browser_inspector_reload-01.js]
 [browser_inspector_reload-02.js]
--- a/devtools/client/inspector/test/browser_inspector_breadcrumbs_visibility.js
+++ b/devtools/client/inspector/test/browser_inspector_breadcrumbs_visibility.js
@@ -27,16 +27,20 @@ const NODES = [
   { action: "end", title: NODE_TWO },
   { action: "end", title: NODE_THREE },
   { action: "end", title: NODE_FOUR },
   { action: "end", title: NODE_FIVE },
   { action: "end", title: NODE_SIX }
 ];
 
 add_task(function* () {
+  // This test needs specific initial size of the sidebar.
+  yield pushPref("devtools.toolsidebar-width.inspector", 350);
+  yield pushPref("devtools.toolsidebar-height.inspector", 150);
+
   let { inspector, toolbox } = yield openInspectorForURL(TEST_URI);
 
   // No way to wait for scrolling to end (Bug 1172171)
   // Rather than wait a max time; limit test to instant scroll behavior
   inspector.breadcrumbs.arrowScrollBox.scrollBehavior = "instant";
 
   yield toolbox.switchHost(Toolbox.HostType.WINDOW);
   let hostWindow = toolbox._host._window;
--- a/devtools/client/inspector/test/browser_inspector_pane-toggle-02.js
+++ b/devtools/client/inspector/test/browser_inspector_pane-toggle-02.js
@@ -6,17 +6,18 @@
 // Test that the inspector toggled panel is visible by default, is hidden after
 // clicking on the toggle button and remains expanded/collapsed when switching
 // hosts.
 
 add_task(function* () {
   info("Open the inspector in a side toolbox host");
   let {toolbox, inspector} = yield openInspectorForURL("about:blank", "side");
 
-  let panel = inspector.panelDoc.querySelector("#inspector-sidebar-container");
+  let panel = inspector.panelDoc.querySelector("#inspector-splitter-box .controlled");
+
   let button = inspector.panelDoc.querySelector(".sidebar-toggle");
   ok(!panel.classList.contains("pane-collapsed"), "The panel is in expanded state");
 
   info("Listen to the end of the animation on the sidebar panel");
   let onTransitionEnd = once(panel, "transitionend");
 
   info("Click on the toggle button");
   EventUtils.synthesizeMouseAtCenter(button, {},
--- a/devtools/client/inspector/test/browser_inspector_pane-toggle-03.js
+++ b/devtools/client/inspector/test/browser_inspector_pane-toggle-03.js
@@ -5,17 +5,17 @@
 
 // Test that the toggle button can collapse and expand the inspector side/bottom
 // panel, and that the appropriate attributes are updated in the process.
 
 add_task(function* () {
   let {inspector} = yield openInspectorForURL("about:blank");
 
   let button = inspector.panelDoc.querySelector(".sidebar-toggle");
-  let panel = inspector.panelDoc.querySelector("#inspector-sidebar-container");
+  let panel = inspector.panelDoc.querySelector("#inspector-splitter-box .controlled");
 
   ok(!button.classList.contains("pane-collapsed"), "The button is in expanded state");
 
   info("Listen to the end of the animation on the sidebar panel");
   let onTransitionEnd = once(panel, "transitionend");
 
   info("Click on the toggle button");
   EventUtils.synthesizeMouseAtCenter(button, {},
deleted file mode 100644
--- a/devtools/client/inspector/test/browser_inspector_pane-toggle-04.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/* 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";
-
-let { Toolbox } = require("devtools/client/framework/toolbox");
-
-// Test that the dimensions of the collapsed inspector panel are not modified
-// when switching from horizontal to vertical layout, which is mandatory to make
-// sure the panel remains visually hidden (using negative margins).
-
-add_task(function* () {
-  info("Set temporary preferences to ensure a small sidebar width.");
-  yield new Promise(resolve => {
-    let options = {"set": [
-      ["devtools.toolsidebar-width.inspector", 200]
-    ]};
-    SpecialPowers.pushPrefEnv(options, resolve);
-  });
-
-  let { inspector, toolbox } = yield openInspectorForURL("about:blank");
-  let button = inspector.panelDoc.querySelector(".sidebar-toggle");
-  let panel = inspector.panelDoc.querySelector("#inspector-sidebar-container");
-
-  info("Changing toolbox host to a window.");
-  yield toolbox.switchHost(Toolbox.HostType.WINDOW);
-
-  let hostWindow = toolbox._host._window;
-  let originalWidth = hostWindow.outerWidth;
-  let originalHeight = hostWindow.outerHeight;
-
-  info("Resizing window to switch to the horizontal layout.");
-  hostWindow.resizeTo(800, 300);
-
-  // Check the sidebar is expanded when the test starts.
-  ok(!panel.classList.contains("pane-collapsed"), "The panel is in expanded state");
-
-  info("Collapse the inspector sidebar.");
-  let onTransitionEnd = once(panel, "transitionend");
-  EventUtils.synthesizeMouseAtCenter(button, {},
-    inspector.panelDoc.defaultView);
-  yield onTransitionEnd;
-
-  ok(panel.classList.contains("pane-collapsed"), "The panel is in collapsed state");
-  let currentPanelHeight = panel.getBoundingClientRect().height;
-  let currentPanelMarginBottom = panel.style.marginBottom;
-
-  info("Resizing window to switch to the vertical layout.");
-  hostWindow.resizeTo(300, 800);
-
-  // Check the panel is collapsed, and still has the same dimensions.
-  ok(panel.classList.contains("pane-collapsed"), "The panel is still collapsed");
-  is(panel.getBoundingClientRect().height, currentPanelHeight,
-    "The panel height has not been modified when changing the layout.");
-  is(panel.style.marginBottom, currentPanelMarginBottom,
-    "The panel margin-bottom has not been modified when changing the layout.");
-
-  info("Restoring window original size.");
-  hostWindow.resizeTo(originalWidth, originalHeight);
-});
-
-registerCleanupFunction(function () {
-  // Restore the host type for other tests.
-  Services.prefs.clearUserPref("devtools.toolbox.host");
-});
--- a/devtools/client/inspector/test/browser_inspector_pane-toggle-05.js
+++ b/devtools/client/inspector/test/browser_inspector_pane-toggle-05.js
@@ -5,17 +5,18 @@
 
 /**
 * Test the keyboard navigation for the pane toggle using
 * space and enter
 */
 
 add_task(function* () {
   let {inspector} = yield openInspectorForURL("about:blank", "side");
-  let panel = inspector.panelDoc.querySelector("#inspector-sidebar-container");
+  let panel = inspector.panelDoc.querySelector("#inspector-splitter-box .controlled");
+
   let button = inspector.panelDoc.querySelector(".sidebar-toggle");
 
   ok(!panel.classList.contains("pane-collapsed"), "The panel is in expanded state");
 
   yield togglePane(button, "Press on the toggle button", panel, "VK_RETURN");
   ok(panel.classList.contains("pane-collapsed"), "The panel is in collapsed state");
 
   yield togglePane(button, "Press on the toggle button to expand the panel again",
--- a/devtools/client/inspector/test/browser_inspector_search-filter_context-menu.js
+++ b/devtools/client/inspector/test/browser_inspector_search-filter_context-menu.js
@@ -21,37 +21,47 @@ add_task(function* () {
 
   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]");
   let cmdPaste = searchContextMenu.querySelector("[command=cmd_paste]");
 
+  emptyClipboard();
+
   info("Opening context menu");
+  let onFocus = once(searchBox, "focus");
+  searchBox.focus();
+  yield onFocus;
+
   let onContextMenuPopup = once(searchContextMenu, "popupshowing");
   EventUtils.synthesizeMouse(searchBox, 2, 2,
     {type: "contextmenu", button: 2}, win);
   yield onContextMenuPopup;
 
   is(cmdUndo.getAttribute("disabled"), "true", "cmdUndo is disabled");
   is(cmdDelete.getAttribute("disabled"), "true", "cmdDelete is disabled");
-  is(cmdSelectAll.getAttribute("disabled"), "", "cmdSelectAll is enabled");
+  is(cmdSelectAll.getAttribute("disabled"), "true", "cmdSelectAll is disabled");
   is(cmdCut.getAttribute("disabled"), "true", "cmdCut is disabled");
   is(cmdCopy.getAttribute("disabled"), "true", "cmdCopy is disabled");
-  is(cmdPaste.getAttribute("disabled"), "true", "cmdPaste is disabled");
+  if (isWindows()) {
+    // emptyClipboard only works on Windows (666254), assert paste only for this OS.
+    is(cmdPaste.getAttribute("disabled"), "true", "cmdPaste is disabled");
+  }
 
   info("Closing context menu");
   let onContextMenuHidden = once(searchContextMenu, "popuphidden");
   searchContextMenu.hidePopup();
   yield onContextMenuHidden;
 
   info("Copy text in search field using the context menu");
   searchBox.value = TEST_INPUT;
   searchBox.select();
+  searchBox.focus();
   EventUtils.synthesizeMouse(searchBox, 2, 2,
     {type: "contextmenu", button: 2}, win);
   yield onContextMenuPopup;
   yield waitForClipboardPromise(() => cmdCopy.click(), TEST_INPUT);
   searchContextMenu.hidePopup();
   yield onContextMenuHidden;
 
   info("Reopen context menu and check command properties");
--- a/devtools/client/inspector/toolsidebar.js
+++ b/devtools/client/inspector/toolsidebar.js
@@ -61,22 +61,17 @@ ToolSidebar.prototype = {
     return this._toolPanel.ReactDOM;
   },
 
   get browserRequire() {
     return this._toolPanel.browserRequire;
   },
 
   get InspectorTabPanel() {
-    if (!this._InspectorTabPanel) {
-      this._InspectorTabPanel =
-        this.React.createFactory(this.browserRequire(
-        "devtools/client/inspector/components/inspector-tab-panel"));
-    }
-    return this._InspectorTabPanel;
+    return this._toolPanel.InspectorTabPanel;
   },
 
   // Rendering
 
   render: function () {
     let Tabbar = this.React.createFactory(this.browserRequire(
       "devtools/client/shared/components/tabs/tabbar"));
 
@@ -85,31 +80,39 @@ ToolSidebar.prototype = {
       showAllTabsMenu: true,
       onSelect: this.handleSelectionChange.bind(this),
     });
 
     this._tabbar = this.ReactDOM.render(sidebar, this._tabbox);
   },
 
   addExistingTab: function (id, title, selected) {
-    this._tabbar.addTab(id, title, selected, this.InspectorTabPanel);
+    let panel = this.InspectorTabPanel({
+      id: id,
+      idPrefix: this.TABPANEL_ID_PREFIX,
+      key: id,
+      title: title,
+    });
+
+    this._tabbar.addTab(id, title, selected, panel);
 
     this.emit("new-tab-registered", id);
   },
 
   /**
    * Register a tab. A tab is a document.
    * The document must have a title, which will be used as the name of the tab.
    *
    * @param {string} tab uniq id
    * @param {string} url
    */
   addFrameTab: function (id, title, url, selected) {
     let panel = this.InspectorTabPanel({
       id: id,
+      idPrefix: this.TABPANEL_ID_PREFIX,
       key: id,
       title: title,
       url: url,
       onMount: this.onSidePanelMounted.bind(this),
     });
 
     this._tabbar.addTab(id, title, selected, panel);
 
--- a/devtools/client/performance/modules/widgets/graphs.js
+++ b/devtools/client/performance/modules/widgets/graphs.js
@@ -11,17 +11,17 @@ const { Task } = require("devtools/share
 const { Heritage } = require("devtools/client/shared/widgets/view-helpers");
 const LineGraphWidget = require("devtools/client/shared/widgets/LineGraphWidget");
 const MountainGraphWidget = require("devtools/client/shared/widgets/MountainGraphWidget");
 const { CanvasGraphUtils } = require("devtools/client/shared/widgets/Graphs");
 
 const promise = require("promise");
 const EventEmitter = require("devtools/shared/event-emitter");
 
-const { colorUtils } = require("devtools/shared/css-color");
+const { colorUtils } = require("devtools/shared/css/color");
 const { getColor } = require("devtools/client/shared/theme");
 const ProfilerGlobal = require("devtools/client/performance/modules/global");
 const { MarkersOverview } = require("devtools/client/performance/modules/widgets/markers-overview");
 const { createTierGraphDataFromFrameNode } = require("devtools/client/performance/modules/logic/jit");
 
 /**
  * For line graphs
  */
--- a/devtools/client/performance/modules/widgets/markers-overview.js
+++ b/devtools/client/performance/modules/widgets/markers-overview.js
@@ -7,17 +7,17 @@
  * This file contains the "markers overview" graph, which is a minimap of all
  * the timeline data. Regions inside it may be selected, determining which
  * markers are visible in the "waterfall".
  */
 
 const { Heritage } = require("devtools/client/shared/widgets/view-helpers");
 const { AbstractCanvasGraph } = require("devtools/client/shared/widgets/Graphs");
 
-const { colorUtils } = require("devtools/shared/css-color");
+const { colorUtils } = require("devtools/shared/css/color");
 const { getColor } = require("devtools/client/shared/theme");
 const ProfilerGlobal = require("devtools/client/performance/modules/global");
 const { MarkerBlueprintUtils } = require("devtools/client/performance/modules/marker-blueprint-utils");
 const { TickUtils } = require("devtools/client/performance/modules/widgets/waterfall-ticks");
 const { TIMELINE_BLUEPRINT } = require("devtools/client/performance/modules/markers");
 
 // px
 const OVERVIEW_HEADER_HEIGHT = 14;
--- a/devtools/client/shared/components/moz.build
+++ b/devtools/client/shared/components/moz.build
@@ -1,16 +1,17 @@
 # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 DIRS += [
     'reps',
+    'splitter',
     'tabs',
     'tree'
 ]
 
 DevToolsModules(
     'frame.js',
     'h-split-box.js',
     'notification-box.css',
new file mode 100644
--- /dev/null
+++ b/devtools/client/shared/components/splitter/draggable.js
@@ -0,0 +1,54 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+const React = require("devtools/client/shared/vendor/react");
+const ReactDOM = require("devtools/client/shared/vendor/react-dom");
+const { DOM: dom, PropTypes } = React;
+
+const Draggable = React.createClass({
+  displayName: "Draggable",
+
+  propTypes: {
+    onMove: PropTypes.func.isRequired,
+    onStart: PropTypes.func,
+    onStop: PropTypes.func,
+    style: PropTypes.object,
+    className: PropTypes.string
+  },
+
+  startDragging(ev) {
+    ev.preventDefault();
+    const doc = ReactDOM.findDOMNode(this).ownerDocument;
+    doc.addEventListener("mousemove", this.onMove);
+    doc.addEventListener("mouseup", this.onUp);
+    this.props.onStart && this.props.onStart();
+  },
+
+  onMove(ev) {
+    ev.preventDefault();
+    // Use screen coordinates so, moving mouse over iframes
+    // doesn't mangle (relative) coordinates.
+    this.props.onMove(ev.screenX, ev.screenY);
+  },
+
+  onUp(ev) {
+    ev.preventDefault();
+    const doc = ReactDOM.findDOMNode(this).ownerDocument;
+    doc.removeEventListener("mousemove", this.onMove);
+    doc.removeEventListener("mouseup", this.onUp);
+    this.props.onStop && this.props.onStop();
+  },
+
+  render() {
+    return dom.div({
+      style: this.props.style,
+      className: this.props.className,
+      onMouseDown: this.startDragging
+    });
+  }
+});
+
+module.exports = Draggable;
new file mode 100644
--- /dev/null
+++ b/devtools/client/shared/components/splitter/moz.build
@@ -0,0 +1,11 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DevToolsModules(
+    'draggable.js',
+    'split-box.css',
+    'split-box.js',
+)
new file mode 100644
--- /dev/null
+++ b/devtools/client/shared/components/splitter/split-box.css
@@ -0,0 +1,88 @@
+/* vim:set ts=2 sw=2 sts=2 et: */
+/* 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/. */
+
+.split-box {
+  display: flex;
+  flex: 1;
+  min-width: 0;
+  height: 100%;
+  width: 100%;
+}
+
+.split-box.vert {
+  flex-direction: row;
+}
+
+.split-box.horz {
+  flex-direction: column;
+}
+
+.split-box > .uncontrolled {
+  display: flex;
+  flex: 1;
+  min-width: 0;
+  overflow: auto;
+}
+
+.split-box > .controlled {
+  display: flex;
+  overflow: auto;
+}
+
+.split-box > .splitter {
+  background-image: none;
+  border: 0;
+  border-style: solid;
+  border-color: transparent;
+  background-color: var(--theme-splitter-color);
+  background-clip: content-box;
+  position: relative;
+
+  box-sizing: border-box;
+
+  /* Positive z-index positions the splitter on top of its siblings and makes
+     it clickable on both sides. */
+  z-index: 1;
+}
+
+.split-box.vert > .splitter {
+  min-width: calc(var(--devtools-splitter-inline-start-width) +
+    var(--devtools-splitter-inline-end-width) + 1px);
+
+  border-inline-start-width: var(--devtools-splitter-inline-start-width);
+  border-inline-end-width: var(--devtools-splitter-inline-end-width);
+
+  margin-inline-start: calc(-1 * var(--devtools-splitter-inline-start-width) - 1px);
+  margin-inline-end: calc(-1 * var(--devtools-splitter-inline-end-width));
+
+  cursor: ew-resize;
+}
+
+.split-box.horz > .splitter {
+  min-height: calc(var(--devtools-splitter-top-width) +
+    var(--devtools-splitter-bottom-width) + 1px);
+
+  border-top-width: var(--devtools-splitter-top-width);
+  border-bottom-width: var(--devtools-splitter-bottom-width);
+
+  margin-top: calc(-1 * var(--devtools-splitter-top-width) - 1px);
+  margin-bottom: calc(-1 * var(--devtools-splitter-bottom-width));
+
+  cursor: ns-resize;
+}
+
+.split-box.disabled {
+  pointer-events: none;
+}
+
+/**
+ * Make sure splitter panels are not processing any mouse
+ * events. This is good for performance during splitter
+ * bar dragging.
+ */
+.split-box.dragging > .controlled,
+.split-box.dragging > .uncontrolled {
+  pointer-events: none;
+}
new file mode 100644
--- /dev/null
+++ b/devtools/client/shared/components/splitter/split-box.js
@@ -0,0 +1,207 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+const React = require("devtools/client/shared/vendor/react");
+const ReactDOM = require("devtools/client/shared/vendor/react-dom");
+const Draggable = React.createFactory(require("devtools/client/shared/components/splitter/draggable"));
+const { DOM: dom, PropTypes } = React;
+
+/**
+ * This component represents a Splitter. The splitter supports vertical
+ * as well as horizontal mode.
+ */
+const SplitBox = React.createClass({
+  displayName: "SplitBox",
+
+  propTypes: {
+    // Custom class name. You can use more names separated by a space.
+    className: PropTypes.string,
+    // Initial size of controlled panel.
+    initialSize: PropTypes.number,
+    // Left/top panel
+    startPanel: PropTypes.any,
+    // Min panel size.
+    minSize: PropTypes.number,
+    // Max panel size.
+    maxSize: PropTypes.number,
+    // Right/bottom panel
+    endPanel: PropTypes.any,
+    // True if the right/bottom panel should be controlled.
+    endPanelControl: PropTypes.bool,
+    // Size of the splitter handle bar.
+    splitterSize: PropTypes.number,
+    // True if the splitter bar is vertical (default is vertical).
+    vert: PropTypes.bool
+  },
+
+  getDefaultProps() {
+    return {
+      splitterSize: 5,
+      vert: true,
+      endPanelControl: false
+    };
+  },
+
+  /**
+   * The state stores the current orientation (vertical or horizontal)
+   * and the current size (width/height). All these values can change
+   * during the component's life time.
+   */
+  getInitialState() {
+    return {
+      vert: this.props.vert,
+      width: this.props.initialWidth || this.props.initialSize,
+      height: this.props.initialHeight || this.props.initialSize
+    };
+  },
+
+  // Dragging Events
+
+  /**
+   * Set 'resizing' cursor on entire document during splitter dragging.
+   * This avoids cursor-flickering that happens when the mouse leaves
+   * the splitter bar area (happens frequently).
+   */
+  onStartMove() {
+    const splitBox = ReactDOM.findDOMNode(this);
+    const doc = splitBox.ownerDocument;
+    let defaultCursor = doc.documentElement.style.cursor;
+    doc.documentElement.style.cursor = (this.state.vert ? "ew-resize" : "ns-resize");
+
+    splitBox.classList.add("dragging");
+
+    this.setState({
+      defaultCursor: defaultCursor
+    });
+  },
+
+  onStopMove() {
+    const splitBox = ReactDOM.findDOMNode(this);
+    const doc = splitBox.ownerDocument;
+    doc.documentElement.style.cursor = this.state.defaultCursor;
+
+    splitBox.classList.remove("dragging");
+  },
+
+  /**
+   * Adjust size of the controlled panel. Depending on the current
+   * orientation we either remember the width or height of
+   * the splitter box.
+   */
+  onMove(x, y) {
+    const node = ReactDOM.findDOMNode(this);
+    const doc = node.ownerDocument;
+    const win = doc.defaultView;
+
+    let size;
+    let { endPanelControl } = this.props;
+
+    if (this.state.vert) {
+      // Switch the control flag in case of RTL. Note that RTL
+      // has impact on vertical splitter only.
+      let dir = win.getComputedStyle(doc.documentElement).direction;
+      if (dir == "rtl") {
+        endPanelControl = !endPanelControl;
+      }
+
+      let innerOffset = x - win.mozInnerScreenX;
+      size = endPanelControl ?
+        (node.offsetLeft + node.offsetWidth) - innerOffset :
+        innerOffset - node.offsetLeft;
+
+      this.setState({
+        width: size
+      });
+    } else {
+      let innerOffset = y - win.mozInnerScreenY;
+      size = endPanelControl ?
+        (node.offsetTop + node.offsetHeight) - innerOffset :
+        innerOffset - node.offsetTop;
+
+      this.setState({
+        height: size
+      });
+    }
+  },
+
+  // Rendering
+
+  render() {
+    const vert = this.state.vert;
+    const { startPanel, endPanel, endPanelControl, minSize,
+      maxSize, splitterSize } = this.props;
+
+    let style = Object.assign({}, this.props.style);
+
+    // Calculate class names list.
+    let classNames = ["split-box"];
+    classNames.push(vert ? "vert" : "horz");
+    if (this.props.className) {
+      classNames = classNames.concat(this.props.className.split(" "));
+    }
+
+    let leftPanelStyle;
+    let rightPanelStyle;
+
+    // Set proper size for panels depending on the current state.
+    if (vert) {
+      leftPanelStyle = {
+        maxWidth: endPanelControl ? null : maxSize,
+        minWidth: endPanelControl ? null : minSize,
+        width: endPanelControl ? null : this.state.width
+      };
+      rightPanelStyle = {
+        maxWidth: endPanelControl ? maxSize : null,
+        minWidth: endPanelControl ? minSize : null,
+        width: endPanelControl ? this.state.width : null
+      };
+    } else {
+      leftPanelStyle = {
+        maxHeight: endPanelControl ? null : maxSize,
+        minHeight: endPanelControl ? null : minSize,
+        height: endPanelControl ? null : this.state.height
+      };
+      rightPanelStyle = {
+        maxHeight: endPanelControl ? maxSize : null,
+        minHeight: endPanelControl ? minSize : null,
+        height: endPanelControl ? this.state.height : null
+      };
+    }
+
+    // Calculate splitter size
+    let splitterStyle = {
+      flex: "0 0 " + splitterSize + "px"
+    };
+
+    return (
+      dom.div({
+        className: classNames.join(" "),
+        style: style },
+        startPanel ?
+          dom.div({
+            className: endPanelControl ? "uncontrolled" : "controlled",
+            style: leftPanelStyle},
+            startPanel
+          ) : null,
+        Draggable({
+          className: "splitter",
+          style: splitterStyle,
+          onStart: this.onStartMove,
+          onStop: this.onStopMove,
+          onMove: this.onMove
+        }),
+        endPanel ?
+          dom.div({
+            className: endPanelControl ? "controlled" : "uncontrolled",
+            style: rightPanelStyle},
+            endPanel
+          ) : null
+      )
+    );
+  }
+});
+
+module.exports = SplitBox;
--- a/devtools/client/shared/components/test/mochitest/test_tabs_accessibility.html
+++ b/devtools/client/shared/components/test/mochitest/test_tabs_accessibility.html
@@ -52,17 +52,21 @@ window.onload = Task.async(function* () 
 
     function addTabWithPanel(tabId) {
       // Setup for InspectorTabPanel
       let panel = document.createElement("div");
       panel.id = `sidebar-panel-${tabId}`;
       document.body.appendChild(panel);
 
       return setState(tabbarReact, Object.assign({}, tabbarReact.state, {
-        tabs: tabbarReact.state.tabs.concat({id: `${tabId}`, title: `tab-${tabId}`, panel: InspectorTabPanel}),
+        tabs: tabbarReact.state.tabs.concat({
+          id: `sidebar-panel-${tabId}`,
+          title: `tab-${tabId}`,
+          panel: InspectorTabPanel
+        }),
       }));
     }
   } catch(e) {
     ok(false, "Got an error: " + DevToolsUtils.safeErrorString(e));
   } finally {
     SimpleTest.finish();
   }
 });
--- a/devtools/client/shared/css-angle.js
+++ b/devtools/client/shared/css-angle.js
@@ -5,17 +5,17 @@
 "use strict";
 
 const SPECIALVALUES = new Set([
   "initial",
   "inherit",
   "unset"
 ]);
 
-const {getCSSLexer} = require("devtools/shared/css-lexer");
+const {getCSSLexer} = require("devtools/shared/css/lexer");
 
 /**
  * This module is used to convert between various angle units.
  *
  * Usage:
  *   let {angleUtils} = require("devtools/client/shared/css-angle");
  *   let angle = new angleUtils.CssAngle("180deg");
  *
--- a/devtools/client/shared/output-parser.js
+++ b/devtools/client/shared/output-parser.js
@@ -1,25 +1,25 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
 const {Cc, Ci} = require("chrome");
 const {angleUtils} = require("devtools/client/shared/css-angle");
-const {colorUtils} = require("devtools/shared/css-color");
-const {getCSSLexer} = require("devtools/shared/css-lexer");
+const {colorUtils} = require("devtools/shared/css/color");
+const {getCSSLexer} = require("devtools/shared/css/lexer");
 const EventEmitter = require("devtools/shared/event-emitter");
 const {
   ANGLE_TAKING_FUNCTIONS,
   BEZIER_KEYWORDS,
   COLOR_TAKING_FUNCTIONS,
   CSS_TYPES
-} = require("devtools/shared/css-properties-db");
+} = require("devtools/shared/css/properties-db");
 
 const HTML_NS = "http://www.w3.org/1999/xhtml";
 
 loader.lazyGetter(this, "DOMUtils", function () {
   return Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils);
 });
 
 /**
@@ -35,17 +35,17 @@ loader.lazyGetter(this, "DOMUtils", func
  *   let parser = new OutputParser(document, supportsType);
  *
  *   parser.parseCssProperty("color", "red"); // Returns document fragment.
  *
  * @param {Document} document Used to create DOM nodes.
  * @param {Function} supportsTypes A function that returns a boolean when asked if a css
  * property name supports a given css type.
  * The function is executed like supportsType("color", CSS_TYPES.COLOR) where CSS_TYPES is
- * defined in devtools/shared/css-properties-db.js
+ * defined in devtools/shared/css/properties-db.js
  */
 function OutputParser(document, supportsType) {
   this.parsed = [];
   this.doc = document;
   this.supportsType = supportsType;
   this.colorSwatches = new WeakMap();
   this.angleSwatches = new WeakMap();
   this._onColorSwatchMouseDown = this._onColorSwatchMouseDown.bind(this);
--- a/devtools/client/shared/test/browser_css_color.js
+++ b/devtools/client/shared/test/browser_css_color.js
@@ -1,13 +1,13 @@
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 const TEST_URI = "data:text/html;charset=utf-8,browser_css_color.js";
-var {colorUtils} = require("devtools/shared/css-color");
+var {colorUtils} = require("devtools/shared/css/color");
 var origColorUnit;
 
 add_task(function* () {
   yield addTab("about:blank");
   let [host, win, doc] = yield createHost("bottom", TEST_URI);
 
   info("Creating a test canvas element to test colors");
   let canvas = createTestCanvas(doc);
--- a/devtools/client/shared/test/unit/test_cssColor.js
+++ b/devtools/client/shared/test/unit/test_cssColor.js
@@ -5,17 +5,17 @@
 
 "use strict";
 
 var Cu = Components.utils;
 var Ci = Components.interfaces;
 var Cc = Components.classes;
 
 var {require, loader} = Cu.import("resource://devtools/shared/Loader.jsm", {});
-const {colorUtils} = require("devtools/shared/css-color");
+const {colorUtils} = require("devtools/shared/css/color");
 
 loader.lazyGetter(this, "DOMUtils", function () {
   return Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils);
 });
 
 const CLASSIFY_TESTS = [
   { input: "rgb(255,0,192)", output: "rgb" },
   { input: "RGB(255,0,192)", output: "rgb" },
--- a/devtools/client/shared/test/unit/test_cssColorDatabase.js
+++ b/devtools/client/shared/test/unit/test_cssColorDatabase.js
@@ -8,18 +8,18 @@
 var Cu = Components.utils;
 var Ci = Components.interfaces;
 var Cc = Components.classes;
 
 var {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
 
 const DOMUtils = Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils);
 
-const {colorUtils} = require("devtools/shared/css-color");
-const {cssColors} = require("devtools/shared/css-color-db");
+const {colorUtils} = require("devtools/shared/css/color");
+const {cssColors} = require("devtools/shared/css/color-db");
 
 function isValid(colorName) {
   ok(colorUtils.isValidCSSColor(colorName),
      colorName + " is valid in database");
   ok(DOMUtils.isValidCSSColor(colorName),
      colorName + " is valid in DOMUtils");
 }
 
--- a/devtools/client/shared/test/unit/test_escapeCSSComment.js
+++ b/devtools/client/shared/test/unit/test_escapeCSSComment.js
@@ -1,16 +1,16 @@
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 var Cu = Components.utils;
 const {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
-const {escapeCSSComment, _unescapeCSSComment} = require("devtools/shared/css-parsing-utils");
+const {escapeCSSComment, _unescapeCSSComment} = require("devtools/shared/css/parsing-utils");
 
 const TEST_DATA = [
   {
     input: "simple",
     expected: "simple"
   },
   {
     input: "/* comment */",
--- a/devtools/client/shared/test/unit/test_parseDeclarations.js
+++ b/devtools/client/shared/test/unit/test_parseDeclarations.js
@@ -2,17 +2,17 @@
 /* vim: set ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 var Cu = Components.utils;
 const {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
-const {parseDeclarations, _parseCommentDeclarations} = require("devtools/shared/css-parsing-utils");
+const {parseDeclarations, _parseCommentDeclarations} = require("devtools/shared/css/parsing-utils");
 const {isCssPropertyKnown} = require("devtools/server/actors/css-properties");
 
 const TEST_DATA = [
   // Simple test
   {
     input: "p:v;",
     expected: [{name: "p", value: "v", priority: "", offsets: [0, 4]}]
   },
--- a/devtools/client/shared/test/unit/test_parsePseudoClassesAndAttributes.js
+++ b/devtools/client/shared/test/unit/test_parsePseudoClassesAndAttributes.js
@@ -7,17 +7,17 @@
 
 var Cu = Components.utils;
 const {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
 const {
   parsePseudoClassesAndAttributes,
   SELECTOR_ATTRIBUTE,
   SELECTOR_ELEMENT,
   SELECTOR_PSEUDO_CLASS
-} = require("devtools/shared/css-parsing-utils");
+} = require("devtools/shared/css/parsing-utils");
 
 const TEST_DATA = [
   // Test that a null input throws an exception
   {
     input: null,
     throws: true
   },
   // Test that a undefined input throws an exception
--- a/devtools/client/shared/test/unit/test_parseSingleValue.js
+++ b/devtools/client/shared/test/unit/test_parseSingleValue.js
@@ -2,17 +2,17 @@
 /* vim: set ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 var Cu = Components.utils;
 const {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
-const {parseSingleValue} = require("devtools/shared/css-parsing-utils");
+const {parseSingleValue} = require("devtools/shared/css/parsing-utils");
 const {isCssPropertyKnown} = require("devtools/server/actors/css-properties");
 
 const TEST_DATA = [
   {input: null, throws: true},
   {input: undefined, throws: true},
   {input: "", expected: {value: "", priority: ""}},
   {input: "  \t \t \n\n  ", expected: {value: "", priority: ""}},
   {input: "blue", expected: {value: "blue", priority: ""}},
--- a/devtools/client/shared/test/unit/test_rewriteDeclarations.js
+++ b/devtools/client/shared/test/unit/test_rewriteDeclarations.js
@@ -1,16 +1,16 @@
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 var Cu = Components.utils;
 const {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
-const {RuleRewriter} = require("devtools/shared/css-parsing-utils");
+const {RuleRewriter} = require("devtools/shared/css/parsing-utils");
 const {isCssPropertyKnown} = require("devtools/server/actors/css-properties");
 
 const TEST_DATA = [
   {
     desc: "simple set",
     input: "p:v;",
     instruction: {type: "set", name: "p", value: "N", priority: "",
                   index: 0},
--- a/devtools/client/shared/widgets/CubicBezierWidget.js
+++ b/devtools/client/shared/widgets/CubicBezierWidget.js
@@ -26,17 +26,17 @@
 "use strict";
 
 const EventEmitter = require("devtools/shared/event-emitter");
 const {
   PREDEFINED,
   PRESETS,
   DEFAULT_PRESET_CATEGORY
 } = require("devtools/client/shared/widgets/CubicBezierPresets");
-const {getCSSLexer} = require("devtools/shared/css-lexer");
+const {getCSSLexer} = require("devtools/shared/css/lexer");
 const XHTML_NS = "http://www.w3.org/1999/xhtml";
 
 /**
  * CubicBezier data structure helper
  * Accepts an array of coordinates and exposes a few useful getters
  * @param {Array} coordinates i.e. [.42, 0, .58, 1]
  */
 function CubicBezier(coordinates) {
--- a/devtools/client/shared/widgets/FilterWidget.js
+++ b/devtools/client/shared/widgets/FilterWidget.js
@@ -12,17 +12,17 @@
 const EventEmitter = require("devtools/shared/event-emitter");
 const { Cc, Ci } = require("chrome");
 const XHTML_NS = "http://www.w3.org/1999/xhtml";
 
 const { LocalizationHelper } = require("devtools/shared/l10n");
 const STRINGS_URI = "devtools/locale/filterwidget.properties";
 const L10N = new LocalizationHelper(STRINGS_URI);
 
-const {cssTokenizer} = require("devtools/shared/css-parsing-utils");
+const {cssTokenizer} = require("devtools/shared/css/parsing-utils");
 
 const asyncStorage = require("devtools/shared/async-storage");
 
 loader.lazyGetter(this, "DOMUtils", () => {
   return Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils);
 });
 
 const DEFAULT_FILTER_TYPE = "length";
--- a/devtools/client/shared/widgets/MdnDocsWidget.js
+++ b/devtools/client/shared/widgets/MdnDocsWidget.js
@@ -21,17 +21,17 @@
  * document whose content is taken from MDN. If you want to embed
  * the content in a tooltip, use this in conjunction with Tooltip.js.
  */
 
 "use strict";
 
 const Services = require("Services");
 const defer = require("devtools/shared/defer");
-const {getCSSLexer} = require("devtools/shared/css-lexer");
+const {getCSSLexer} = require("devtools/shared/css/lexer");
 const EventEmitter = require("devtools/shared/event-emitter");
 const {gDevTools} = require("devtools/client/framework/devtools");
 
 const {LocalizationHelper} = require("devtools/shared/l10n");
 const L10N = new LocalizationHelper("devtools/locale/inspector.properties");
 
 const XHTML_NS = "http://www.w3.org/1999/xhtml";
 
--- a/devtools/client/shared/widgets/Tooltip.js
+++ b/devtools/client/shared/widgets/Tooltip.js
@@ -6,17 +6,17 @@
 
 const defer = require("devtools/shared/defer");
 const {Spectrum} = require("devtools/client/shared/widgets/Spectrum");
 const {CubicBezierWidget} =
       require("devtools/client/shared/widgets/CubicBezierWidget");
 const {CSSFilterEditorWidget} = require("devtools/client/shared/widgets/FilterWidget");
 const {TooltipToggle} = require("devtools/client/shared/widgets/tooltip/TooltipToggle");
 const EventEmitter = require("devtools/shared/event-emitter");
-const {colorUtils} = require("devtools/shared/css-color");
+const {colorUtils} = require("devtools/shared/css/color");
 const Heritage = require("sdk/core/heritage");
 const {HTMLTooltip} = require("devtools/client/shared/widgets/HTMLTooltip");
 const {KeyShortcuts} = require("devtools/client/shared/key-shortcuts");
 const {Task} = require("devtools/shared/task");
 const {KeyCodes} = require("devtools/client/shared/keycodes");
 
 const XHTML_NS = "http://www.w3.org/1999/xhtml";
 const ESCAPE_KEYCODE = KeyCodes.DOM_VK_ESCAPE;
--- a/devtools/client/sourceeditor/css-autocompleter.js
+++ b/devtools/client/sourceeditor/css-autocompleter.js
@@ -1,16 +1,16 @@
 /* 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";
 
 /* eslint-disable complexity */
-const {cssTokenizer, cssTokenizerWithLineColumn} = require("devtools/shared/css-parsing-utils");
+const {cssTokenizer, cssTokenizerWithLineColumn} = require("devtools/shared/css/parsing-utils");
 const {getClientCssProperties} = require("devtools/shared/fronts/css-properties");
 
 /**
  * Here is what this file (+ css-parsing-utils.js) do.
  *
  * The main objective here is to provide as much suggestions to the user editing
  * a stylesheet in Style Editor. The possible things that can be suggested are:
  *  - CSS property names
--- a/devtools/client/themes/inspector.css
+++ b/devtools/client/themes/inspector.css
@@ -6,19 +6,57 @@
 :root {
   --eyedropper-image: url(images/command-eyedropper.svg);
 }
 
 .theme-firebug {
   --eyedropper-image: url(images/firebug/command-eyedropper.svg);
 }
 
+/* Make sure to hide scroll bars for the parent window */
+window {
+  overflow: hidden;
+}
+
+/* The main Inspector panel container. */
+.inspector-responsive-container {
+  height: 100vh;
+}
+
+/* The main panel layout. This area consists of a toolbar, markup view
+  and breadcrumbs bar. */
+.devtools-main-content {
+  /* Subtract 1 pixel from the panel height. It's puzzling why this
+    is needed, but if not presented the entire Inspector panel
+    content jumps 1 pixel up when the Toolbox is opened. */
+  height: calc(100% - 1px);
+  display: flex;
+  flex-direction: column;
+  flex: 1 1 auto;
+}
+
+/* Inspector Panel Splitter */
+
+#inspector-splitter-box {
+  height: 100vh;
+  width: 100%;
+}
+
+/* Minimum width for the Inspector main (uncontrolled) area. */
+#inspector-splitter-box .uncontrolled {
+  min-width: 275px;
+}
+
+#inspector-splitter-box .controlled.pane-collapsed {
+  visibility: collapse;
+}
+
 /* Use flex layout for the Inspector toolbar. For now, it's done
    specifically for the Inspector toolbar since general rule applied
-   on .devtools-toolbar breaks breadcrubs and also toolbars in other
+   on .devtools-toolbar breaks breadcrumbs and also toolbars in other
    panels (e.g. webconsole, debugger), these are not ready for HTML
    layout yet. */
 #inspector-toolbar.devtools-toolbar {
   display: flex;
 }
 
 #inspector-toolbar.devtools-toolbar .devtools-toolbar-spacer {
   flex-grow: 1;
@@ -119,18 +157,19 @@
   font: message-box;
 }
 
 /* Set the minimum width for the side bar so, all tabs are
   properly visible. The value can be decreased when bug 1281789
   is fixed and the all-tabs-menu is available again. */
 #inspector-sidebar-container {
   overflow: hidden;
-  min-width: 300px;
+  min-width: 50px;
   position: relative;
+  height: 100%;
 }
 
 #inspector-sidebar {
   position: absolute;
   top: 0;
   bottom: 0;
   left: 0;
   right: 0;
@@ -144,8 +183,21 @@
 /* "no results" warning message displayed in the ruleview and in the computed view */
 
 #ruleview-no-results,
 #computedview-no-results {
   color: var(--theme-body-color-inactive);
   text-align: center;
   margin: 5px;
 }
+
+/* Markup Box */
+
+#markup-box {
+  width: 100%;
+  flex: 1 1 auto;
+}
+
+#markup-box > iframe {
+  height: 100%;
+  width: 100%;
+}
+
--- a/devtools/server/actors/css-properties.js
+++ b/devtools/server/actors/css-properties.js
@@ -12,18 +12,18 @@ loader.lazyGetter(this, "DOMUtils", () =
 
 loader.lazyGetter(this, "appInfo", () => {
   return Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo);
 });
 
 const protocol = require("devtools/shared/protocol");
 const { ActorClassWithSpec, Actor } = protocol;
 const { cssPropertiesSpec } = require("devtools/shared/specs/css-properties");
-const { CSS_PROPERTIES, CSS_TYPES } = require("devtools/shared/css-properties-db");
-const { cssColors } = require("devtools/shared/css-color-db");
+const { CSS_PROPERTIES, CSS_TYPES } = require("devtools/shared/css/properties-db");
+const { cssColors } = require("devtools/shared/css/color-db");
 
 exports.CssPropertiesActor = ActorClassWithSpec(cssPropertiesSpec, {
   typeName: "cssProperties",
 
   initialize(conn, parent) {
     Actor.prototype.initialize.call(this, conn);
     this.parent = parent;
   },
--- a/devtools/server/actors/highlighters/eye-dropper.js
+++ b/devtools/server/actors/highlighters/eye-dropper.js
@@ -7,17 +7,17 @@
 // content page.
 // It basically displays a magnifier that tracks mouse moves and shows a magnified version
 // of the page. On click, it samples the color at the pixel being hovered.
 
 const {Ci, Cc} = require("chrome");
 const {CanvasFrameAnonymousContentHelper, createNode} = require("./utils/markup");
 const Services = require("Services");
 const EventEmitter = require("devtools/shared/event-emitter");
-const {rgbToHsl, rgbToColorName} = require("devtools/shared/css-color").colorUtils;
+const {rgbToHsl, rgbToColorName} = require("devtools/shared/css/color").colorUtils;
 const {getCurrentZoom, getFrameOffsets} = require("devtools/shared/layout/utils");
 
 loader.lazyGetter(this, "clipboardHelper",
   () => Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper));
 loader.lazyGetter(this, "l10n",
   () => Services.strings.createBundle("chrome://devtools/locale/eyedropper.properties"));
 
 const ZOOM_LEVEL_PREF = "devtools.eyedropper.zoom";
--- a/devtools/server/actors/styles.js
+++ b/devtools/server/actors/styles.js
@@ -4,17 +4,17 @@
 
 "use strict";
 
 const {Cc, Ci} = require("chrome");
 const promise = require("promise");
 const protocol = require("devtools/shared/protocol");
 const {LongStringActor} = require("devtools/server/actors/string");
 const {getDefinedGeometryProperties} = require("devtools/server/actors/highlighters/geometry-editor");
-const {parseDeclarations} = require("devtools/shared/css-parsing-utils");
+const {parseDeclarations} = require("devtools/shared/css/parsing-utils");
 const {isCssPropertyKnown} = require("devtools/server/actors/css-properties");
 const {Task} = require("devtools/shared/task");
 const events = require("sdk/event/core");
 
 // This will also add the "stylesheet" actor type for protocol.js to recognize
 const {UPDATE_PRESERVING_RULES, UPDATE_GENERAL} = require("devtools/server/actors/stylesheets");
 const {pageStyleSpec, styleRuleSpec, ELEMENT_STYLE} = require("devtools/shared/specs/styles");
 
--- a/devtools/server/css-logic.js
+++ b/devtools/server/css-logic.js
@@ -30,17 +30,17 @@
 "use strict";
 
 const { Cc, Ci, Cu } = require("chrome");
 const DevToolsUtils = require("devtools/shared/DevToolsUtils");
 const { getRootBindingParent } = require("devtools/shared/layout/utils");
 const nodeConstants = require("devtools/shared/dom-node-constants");
 const {l10n, isContentStylesheet, shortSource, FILTER, STATUS} = require("devtools/shared/inspector/css-logic");
 
-loader.lazyRequireGetter(this, "CSSLexer", "devtools/shared/css-lexer");
+loader.lazyRequireGetter(this, "CSSLexer", "devtools/shared/css/lexer");
 
 /**
  * @param {function} isInherited A function that determines if the CSS property
  *                   is inherited.
  */
 function CssLogic(isInherited) {
   // The cache of examined CSS properties.
   this._isInherited = isInherited;
--- a/devtools/server/tests/mochitest/test_css-properties_02.html
+++ b/devtools/server/tests/mochitest/test_css-properties_02.html
@@ -9,17 +9,17 @@ Bug 1265798 - Replace inIDOMUtils.cssPro
   <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
   <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css">
   <script type="application/javascript;version=1.8" src="inspector-helpers.js"></script>
   <script type="application/javascript;version=1.8">
 window.onload = function() {
   const { initCssProperties, getCssProperties } =
     require("devtools/shared/fronts/css-properties");
 
-  const { CSS_PROPERTIES_DB } = require("devtools/shared/css-properties-db");
+  const { CSS_PROPERTIES_DB } = require("devtools/shared/css/properties-db");
 
   function promiseAttachUrl (url) {
     return new Promise((resolve, reject) => {
       attachURL(url, function(err, client, tab, doc) {
         if (err) {
           return reject(err);
         }
         resolve({client, tab, doc});
rename from devtools/shared/css-color-db.js
rename to devtools/shared/css/color-db.js
rename from devtools/shared/css-color.js
rename to devtools/shared/css/color.js
--- a/devtools/shared/css-color.js
+++ b/devtools/shared/css/color.js
@@ -1,34 +1,34 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
 const Services = require("Services");
 
-const {getCSSLexer} = require("devtools/shared/css-lexer");
-const {cssColors} = require("devtools/shared/css-color-db");
+const {getCSSLexer} = require("devtools/shared/css/lexer");
+const {cssColors} = require("devtools/shared/css/color-db");
 
 const COLOR_UNIT_PREF = "devtools.defaultColorUnit";
 
 const SPECIALVALUES = new Set([
   "currentcolor",
   "initial",
   "inherit",
   "transparent",
   "unset"
 ]);
 
 /**
  * This module is used to convert between various color types.
  *
  * Usage:
- *   let {colorUtils} = require("devtools/shared/css-color");
+ *   let {colorUtils} = require("devtools/shared/css/color");
  *   let color = new colorUtils.CssColor("red");
  *
  *   color.authored === "red"
  *   color.hasAlpha === false
  *   color.valid === true
  *   color.transparent === false // transparent has a special status.
  *   color.name === "red"        // returns hex when no name available.
  *   color.hex === "#f00"        // returns shortHex when available else returns
new file mode 100644
--- /dev/null
+++ b/devtools/shared/css/generated/generate-properties-db.js
@@ -0,0 +1,49 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+"use strict";
+
+/*
+ * This is an xpcshell script that runs to generate a static list of CSS properties
+ * as known by the platform. It is run from ./mach_commands.py by running
+ * `mach devtools-css-db`.
+ */
+var {require} = Components.utils.import("resource://devtools/shared/Loader.jsm", {});
+var {generateCssProperties} = require("devtools/server/actors/css-properties");
+
+// Output JSON
+dump(JSON.stringify({
+  cssProperties: cssProperties(),
+  pseudoElements: pseudoElements()
+}));
+
+/*
+ * A list of CSS Properties and their various characteristics. This is used on the
+ * client-side when the CssPropertiesActor is not found, or when the client and server
+ * are the same version. A single property takes the form:
+ *
+ *  "animation": {
+ *    "isInherited": false,
+ *    "supports": [ 7, 9, 10 ]
+ *  }
+ */
+function cssProperties() {
+  const properties = generateCssProperties();
+  for (let key in properties) {
+    // Ignore OS-specific properties
+    if (key.indexOf("-moz-osx-") !== -1) {
+      properties[key] = undefined;
+    }
+  }
+  return properties;
+}
+
+/**
+ * The list of all CSS Pseudo Elements.
+ */
+function pseudoElements() {
+  const {classes: Cc, interfaces: Ci} = Components;
+  const domUtils = Cc["@mozilla.org/inspector/dom-utils;1"]
+                             .getService(Ci.inIDOMUtils);
+  return domUtils.getCSSPseudoElementNames();
+}
new file mode 100644
--- /dev/null
+++ b/devtools/shared/css/generated/mach_commands.py
@@ -0,0 +1,111 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+"""
+This script implements the `mach devtools-css-db` command. It runs the C preprocessor
+on the CSS properties header file to get the list of preferences associated with
+a specific property, and it runs an xpcshell script that uses inIDOMUtils to query
+the CSS properties used by the browser. This information is used to generate the
+properties-db.js file.
+"""
+
+import json
+import os
+import sys
+import string
+import subprocess
+from mozbuild import shellutil
+from mozbuild.base import (
+    MozbuildObject,
+    MachCommandBase,
+)
+from mach.decorators import (
+    CommandProvider,
+    Command,
+)
+
+def resolve_path(start, relativePath):
+    """Helper to resolve a path from a start, and a relative path"""
+    return os.path.normpath(os.path.join(start, relativePath))
+
+@CommandProvider
+class MachCommands(MachCommandBase):
+    @Command(
+        'devtools-css-db', category='post-build',
+        description='Rebuild the devtool\'s static css properties database.')
+    def generate_css_db(self):
+        """Generate the static css properties database for devtools and write it to file."""
+
+        print("Re-generating the css properties database...")
+        preferences = self.get_preferences()
+        db = self.get_properties_db_from_xpcshell()
+
+        self.output_template({
+            'preferences': json.dumps(preferences),
+            'cssProperties': json.dumps(db['cssProperties']),
+            'pseudoElements': json.dumps(db['pseudoElements'])})
+
+    def get_preferences(self):
+        """Get all of the preferences associated with enabling and disabling a property."""
+        # Build the command to run the preprocessor on PythonCSSProps.h
+        headerPath = resolve_path(self.topsrcdir, 'layout/style/PythonCSSProps.h')
+
+        cpp = self.substs['CPP']
+
+        if not cpp:
+            print("Unable to find the cpp program. Please do a full, non-artifact")
+            print("build and try this again.")
+            sys.exit(1)
+
+        cmd = shellutil.split(cpp)
+        cmd += shellutil.split(self.substs['ACDEFINES'])
+        cmd.append(headerPath)
+
+        # The preprocessed list takes the following form:
+        # [ (name, prop, id, flags, pref, proptype), ... ]
+        preprocessed = eval(subprocess.check_output(cmd))
+
+        # Map this list
+        # (name, prop, id, flags, pref, proptype) => (name, pref)
+        preferences = [
+            (name, pref)
+            for name, prop, id, flags, pref, proptype in preprocessed
+            if 'CSS_PROPERTY_INTERNAL' not in flags]
+
+        return preferences
+
+    def get_properties_db_from_xpcshell(self):
+        """Generate the static css properties db for devtools from an xpcshell script."""
+        build = MozbuildObject.from_environment()
+
+        # Get the paths
+        script_path = resolve_path(self.topsrcdir,
+            'devtools/shared/css/generated/generate-properties-db.js')
+        browser_path = resolve_path(self.topobjdir, 'dist/bin/browser')
+        xpcshell_path = build.get_binary_path(what='xpcshell')
+        print(browser_path)
+
+        # Run the xcpshell script, and set the appdir flag to the browser path so that
+        # we have the proper dependencies for requiring the loader.
+        contents = subprocess.check_output([xpcshell_path, '-a', browser_path,
+                                            script_path])
+        return json.loads(contents)
+
+    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:
+            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:
+            destination.write(preamble + contents)
+
+        print('The database was successfully generated at ' + destination_path)
new file mode 100644
--- /dev/null
+++ b/devtools/shared/css/generated/moz.build
@@ -0,0 +1,9 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DevToolsModules(
+    'properties-db.js',
+)
new file mode 100644
--- /dev/null
+++ b/devtools/shared/css/generated/properties-db.js
@@ -0,0 +1,32 @@
+/* THIS IS AN AUTOGENERATED FILE.  DO NOT EDIT */
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+"use strict";
+
+/**
+ * This file is automatically generated by `mach devtools-css-db`. It contains
+ * a static list of CSS properties that can be computed by Gecko. The actual script
+ * 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": {"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", "grayscale", "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": {"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": {"values": ["infinite", "inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "font-feature-settings": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "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": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "scroll-snap-destination": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-font-language-override": {"values": ["inherit", "initial", "normal", "unset"], "supports": [], "isInherited": true}, "text-emphasis": {"values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": true}, "grid-row-gap": {"values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "font-variant-east-asian": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "outline-width": {"values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "-webkit-flex-flow": {"values": ["column", "column-reverse", "inherit", "initial", "nowrap", "row", "row-reverse", "unset", "wrap", "wrap-reverse"], "supports": [], "isInherited": false}, "grid-column-gap": {"values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "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": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "list-style-type": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "padding-inline-end": {"values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-animation": {"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": {"values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "page-break-before": {"values": ["always", "auto", "avoid", "inherit", "initial", "left", "right", "unset"], "supports": [], "isInherited": false}, "flood-color": {"values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "text-anchor": {"values": ["end", "inherit", "initial", "middle", "start", "unset"], "supports": [], "isInherited": true}, "-moz-box-pack": {"values": ["center", "end", "inherit", "initial", "justify", "start", "unset"], "supports": [], "isInherited": false}, "-webkit-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": {"values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "padding-left": {"values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-tab-size": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": true}, "perspective": {"values": ["inherit", "initial", "none", "unset"], "supports": [6], "isInherited": false}, "max-block-size": {"values": ["-moz-calc", "calc", "inherit", "initial", "none", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-animation-play-state": {"values": ["inherit", "initial", "paused", "running", "unset"], "supports": [], "isInherited": false}, "-moz-column-fill": {"values": ["auto", "balance", "inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-moz-stack-sizing": {"values": ["ignore", "inherit", "initial", "stretch-to-fit", "unset"], "supports": [], "isInherited": false}, "border-image-repeat": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "font-variant-position": {"values": ["inherit", "initial", "normal", "sub", "super", "unset"], "supports": [], "isInherited": true}, "border-right-style": {"values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "-moz-box-align": {"values": ["baseline", "center", "end", "inherit", "initial", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "border-left-style": {"values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "flex-flow": {"values": ["column", "column-reverse", "inherit", "initial", "nowrap", "row", "row-reverse", "unset", "wrap", "wrap-reverse"], "supports": [], "isInherited": false}, "outline-color": {"values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "font-variant-alternates": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "mask-mode": {"supports": [], "values": ["alpha", "inherit", "initial", "luminance", "match-source", "unset"], "isInherited": false}, "flex-grow": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "-moz-font-feature-settings": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "-webkit-box-shadow": {"values": ["inherit", "initial", "unset"], "supports": [2, 6], "isInherited": false}, "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": {"values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "grid-column": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "image-orientation": {"values": ["inherit", "initial", "unset"], "supports": [1], "isInherited": true}, "animation-duration": {"values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "-moz-animation-fill-mode": {"values": ["backwards", "both", "forwards", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "-moz-user-input": {"values": ["auto", "disabled", "enabled", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": true}, "-webkit-animation-delay": {"values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "shape-rendering": {"values": ["auto", "crispedges", "geometricprecision", "inherit", "initial", "optimizespeed", "unset"], "supports": [], "isInherited": true}, "flex-shrink": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "text-rendering": {"values": ["auto", "geometricprecision", "inherit", "initial", "optimizelegibility", "optimizespeed", "unset"], "supports": [], "isInherited": true}, "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": {"values": ["collapse", "inherit", "initial", "separate", "unset"], "supports": [], "isInherited": true}, "text-combine-upright": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "offset-block-end": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-border-start-color": {"values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "marker": {"values": ["inherit", "initial", "none", "unset", "url"], "supports": [11], "isInherited": true}, "-webkit-mask-position-y": {"supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "outline-style": {"values": ["auto", "dashed", "dotted", "double", "groove", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "color-interpolation-filters": {"values": ["auto", "inherit", "initial", "linearrgb", "srgb", "unset"], "supports": [], "isInherited": true}, "-moz-padding-end": {"values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "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": {"values": ["block", "horizontal", "inherit", "initial", "inline", "unset", "vertical"], "supports": [], "isInherited": false}, "font-variant": {"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": {"values": ["backwards", "both", "forwards", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "-moz-animation-duration": {"values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "border-left": {"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": {"values": ["collapse", "hidden", "inherit", "initial", "unset", "visible"], "supports": [], "isInherited": true}, "-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": {"values": ["border-box", "fill-box", "inherit", "initial", "unset", "view-box"], "supports": [], "isInherited": false}, "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": {"values": ["both", "horizontal", "inherit", "initial", "none", "unset", "vertical"], "supports": [], "isInherited": false}, "offset-inline-end": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "paint-order": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "stroke-linecap": {"values": ["butt", "inherit", "initial", "round", "square", "unset"], "supports": [], "isInherited": true}, "animation-direction": {"values": ["alternate", "alternate-reverse", "inherit", "initial", "normal", "reverse", "unset"], "supports": [], "isInherited": false}, "border-top-left-radius": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-box-align": {"values": ["baseline", "center", "end", "inherit", "initial", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "-moz-text-size-adjust": {"values": ["auto", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": true}, "list-style": {"values": ["inherit", "initial", "inside", "none", "outside", "unset", "url"], "supports": [11], "isInherited": true}, "stroke": {"values": ["inherit", "initial", "unset"], "supports": [2, 11], "isInherited": true}, "text-decoration-line": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-webkit-background-size": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "padding-bottom": {"values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "border-image-slice": {"values": ["inherit", "initial", "unset"], "supports": [7, 8], "isInherited": false}, "-webkit-transition-delay": {"values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "background-repeat": {"values": ["inherit", "initial", "no-repeat", "repeat", "repeat-x", "repeat-y", "round", "space", "unset"], "supports": [], "isInherited": false}, "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": {"values": ["inherit", "initial", "unset"], "supports": [2], "isInherited": false}, "-moz-image-region": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "-webkit-transform-origin": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "vector-effect": {"values": ["inherit", "initial", "non-scaling-stroke", "none", "unset"], "supports": [], "isInherited": false}, "-moz-margin-end": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-border-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, 6, 7, 8, 11], "isInherited": false}, "-moz-border-end-color": {"values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "ruby-position": {"values": ["inherit", "initial", "over", "under", "unset"], "supports": [], "isInherited": true}, "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": {"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": {"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": {"values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "order": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "ime-mode": {"values": ["active", "auto", "disabled", "inactive", "inherit", "initial", "normal", "unset"], "supports": [], "isInherited": false}, "counter-reset": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "flood-opacity": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "flex-direction": {"values": ["column", "column-reverse", "inherit", "initial", "row", "row-reverse", "unset"], "supports": [], "isInherited": false}, "-webkit-text-stroke-width": {"values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": true}, "font-variant-numeric": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "-webkit-flex-wrap": {"values": ["inherit", "initial", "nowrap", "unset", "wrap", "wrap-reverse"], "supports": [], "isInherited": false}, "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": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-mask": {"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": {"values": ["inherit", "initial", "unset"], "supports": [6, 7, 8], "isInherited": true}, "-moz-hyphens": {"values": ["auto", "inherit", "initial", "manual", "none", "unset"], "supports": [], "isInherited": true}, "background-origin": {"values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "supports": [], "isInherited": false}, "-moz-box-direction": {"values": ["inherit", "initial", "normal", "reverse", "unset"], "supports": [], "isInherited": false}, "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": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6], "isInherited": false}, "-webkit-background-clip": {"values": ["border-box", "content-box", "inherit", "initial", "padding-box", "text", "unset"], "supports": [], "isInherited": false}, "border-radius": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "flex": {"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": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-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": {"values": ["clone", "inherit", "initial", "slice", "unset"], "supports": [], "isInherited": false}, "text-indent": {"values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": true}, "hyphens": {"values": ["auto", "inherit", "initial", "manual", "none", "unset"], "supports": [], "isInherited": true}, "-moz-perspective": {"values": ["inherit", "initial", "none", "unset"], "supports": [6], "isInherited": false}, "-webkit-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": {"values": ["capitalize", "full-width", "inherit", "initial", "lowercase", "none", "unset", "uppercase"], "supports": [], "isInherited": true}, "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": {"values": ["inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "-moz-border-start": {"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": {"supports": [], "values": ["add", "exclude", "inherit", "initial", "intersect", "subtract", "unset"], "isInherited": false}, "-webkit-text-stroke": {"values": ["COLOR", "-moz-calc", "calc", "currentColor", "hsl", "hsla", "inherit", "initial", "medium", "rgb", "rgba", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": true}, "padding-top": {"values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-flex-shrink": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "color-adjust": {"values": ["economy", "exact", "inherit", "initial", "unset"], "supports": [], "isInherited": true}, "grid-template-rows": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "content": {"values": ["inherit", "initial", "unset"], "supports": [11], "isInherited": false}, "padding-right": {"values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-transform": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "marker-mid": {"values": ["inherit", "initial", "none", "unset", "url"], "supports": [11], "isInherited": true}, "-moz-column-gap": {"values": ["-moz-calc", "calc", "inherit", "initial", "normal", "unset"], "supports": [6], "isInherited": false}, "-moz-border-start-style": {"values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "clip-rule": {"values": ["evenodd", "inherit", "initial", "nonzero", "unset"], "supports": [], "isInherited": true}, "font-family": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "block-size": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "offset-inline-start": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "padding-block-end": {"values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "transition": {"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": {"values": ["inherit", "initial", "unset"], "supports": [11], "isInherited": false}, "border-right-width": {"values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "-webkit-flex-direction": {"values": ["column", "column-reverse", "inherit", "initial", "row", "row-reverse", "unset"], "supports": [], "isInherited": false}, "-webkit-mask-composite": {"supports": [], "values": ["add", "exclude", "inherit", "initial", "intersect", "subtract", "unset"], "isInherited": false}, "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": {"values": ["auto", "inherit", "initial", "linearrgb", "srgb", "unset"], "supports": [], "isInherited": true}, "border-top-style": {"values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "fill-opacity": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": true}, "marker-start": {"values": ["inherit", "initial", "none", "unset", "url"], "supports": [11], "isInherited": true}, "border-bottom-width": {"values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "-moz-column-rule-style": {"values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "clear": {"values": ["both", "inherit", "initial", "inline-end", "inline-start", "left", "none", "right", "unset"], "supports": [], "isInherited": false}, "grid-area": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "padding-inline-start": {"values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-border-end": {"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": {"values": ["border-box", "content-box", "inherit", "initial", "padding-box", "text", "unset"], "supports": [], "isInherited": false}, "-webkit-text-fill-color": {"values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": true}, "border-block-start-style": {"values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "top": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "border-width": {"values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "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": {"values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "-moz-box-flex": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "animation-play-state": {"values": ["inherit", "initial", "paused", "running", "unset"], "supports": [], "isInherited": false}, "padding": {"values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "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": {"values": ["fixed", "inherit", "initial", "local", "scroll", "unset"], "supports": [], "isInherited": false}, "-webkit-box-sizing": {"values": ["border-box", "content-box", "inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-webkit-box-flex": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "text-orientation": {"values": ["inherit", "initial", "mixed", "sideways", "sideways-right", "unset", "upright"], "supports": [], "isInherited": true}, "-moz-margin-start": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "isolation": {"values": ["auto", "inherit", "initial", "isolate", "unset"], "supports": [], "isInherited": false}, "-moz-border-bottom-colors": {"values": ["inherit", "initial", "unset"], "supports": [2], "isInherited": false}, "-moz-column-rule-width": {"values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "scroll-snap-type-y": {"values": ["inherit", "initial", "mandatory", "none", "proximity", "unset"], "supports": [], "isInherited": false}, "-webkit-border-bottom-right-radius": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-column-count": {"values": ["auto", "inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "border-left-width": {"values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "grid-column-end": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "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": {"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": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "grid-auto-rows": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "margin-left": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "animation-name": {"values": ["inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "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": {"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": {"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": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "animation": {"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": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": true}, "border-block-start-width": {"values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "mask-type": {"values": ["alpha", "inherit", "initial", "luminance", "unset"], "supports": [], "isInherited": false}, "margin-block-end": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "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": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "page-break-after": {"values": ["always", "auto", "avoid", "inherit", "initial", "left", "right", "unset"], "supports": [], "isInherited": false}, "transition-property": {"values": ["all", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "-moz-float-edge": {"values": ["content-box", "inherit", "initial", "margin-box", "unset"], "supports": [], "isInherited": false}, "white-space": {"values": ["-moz-pre-space", "inherit", "initial", "normal", "nowrap", "pre", "pre-line", "pre-wrap", "unset"], "supports": [], "isInherited": true}, "-moz-binding": {"values": ["inherit", "initial", "none", "unset", "url"], "supports": [11], "isInherited": false}, "ruby-align": {"values": ["center", "inherit", "initial", "space-around", "space-between", "start", "unset"], "supports": [], "isInherited": true}, "font-kerning": {"values": ["auto", "inherit", "initial", "none", "normal", "unset"], "supports": [], "isInherited": true}, "border-block-end": {"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": {"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": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "animation-iteration-count": {"values": ["infinite", "inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "-webkit-animation-direction": {"values": ["alternate", "alternate-reverse", "inherit", "initial", "normal", "reverse", "unset"], "supports": [], "isInherited": false}, "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": {"values": ["inherit", "initial", "unset"], "supports": [2], "isInherited": false}, "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": {"values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "scroll-snap-coordinate": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-box-orient": {"values": ["block-axis", "horizontal", "inherit", "initial", "inline-axis", "unset", "vertical"], "supports": [], "isInherited": false}, "counter-increment": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-webkit-transform-style": {"values": ["flat", "inherit", "initial", "preserve-3d", "unset"], "supports": [], "isInherited": false}, "-moz-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": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-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": {"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": {"values": ["inherit", "initial", "nowrap", "unset", "wrap", "wrap-reverse"], "supports": [], "isInherited": false}, "grid-row-start": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "list-style-image": {"values": ["inherit", "initial", "none", "unset", "url"], "supports": [11], "isInherited": true}, "text-emphasis-position": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "border-right": {"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": {"values": ["inherit", "initial", "italic", "normal", "oblique", "unset"], "supports": [], "isInherited": true}, "box-shadow": {"values": ["inherit", "initial", "unset"], "supports": [2, 6], "isInherited": false}, "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": {"values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": true}, "border-bottom": {"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": {"values": ["inherit", "initial", "unset"], "supports": [6], "isInherited": true}, "-webkit-border-top-right-radius": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "margin-inline-start": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "grid-row-end": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "perspective-origin": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "page-break-inside": {"values": ["auto", "avoid", "inherit", "initial", "unset"], "supports": [], "isInherited": false}, "scroll-behavior": {"values": ["auto", "inherit", "initial", "smooth", "unset"], "supports": [], "isInherited": false}, "-moz-backface-visibility": {"values": ["hidden", "inherit", "initial", "unset", "visible"], "supports": [], "isInherited": false}, "-moz-outline-radius": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "mask-clip": {"supports": [], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "isInherited": false}, "grid-row": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "border-bottom-right-radius": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "line-height": {"values": ["-moz-block-height", "-moz-calc", "calc", "inherit", "initial", "normal", "unset"], "supports": [6, 7, 8], "isInherited": true}, "stroke-linejoin": {"values": ["bevel", "inherit", "initial", "miter", "round", "unset"], "supports": [], "isInherited": true}, "text-align-last": {"values": ["auto", "center", "end", "inherit", "initial", "justify", "left", "right", "start", "unset"], "supports": [], "isInherited": true}, "word-spacing": {"values": ["-moz-calc", "calc", "inherit", "initial", "normal", "unset"], "supports": [6, 8], "isInherited": true}, "transform-style": {"values": ["flat", "inherit", "initial", "preserve-3d", "unset"], "supports": [], "isInherited": false}, "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": {"values": ["inherit", "initial", "normal", "unset"], "supports": [], "isInherited": true}, "-moz-outline-radius-topleft": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "border-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, 6, 7, 8, 11], "isInherited": false}, "caption-side": {"values": ["bottom", "bottom-outside", "inherit", "initial", "left", "right", "top", "top-outside", "unset"], "supports": [], "isInherited": true}, "-webkit-mask-position": {"supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-inline-end-width": {"values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "-webkit-border-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, 6, 7, 8, 11], "isInherited": false}, "font-synthesis": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "grid-template": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-mask-repeat": {"supports": [], "values": ["inherit", "initial", "no-repeat", "repeat", "repeat-x", "repeat-y", "round", "space", "unset"], "isInherited": false}, "-webkit-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": {"values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "color": {"values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": true}, "-moz-border-end-width": {"values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "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": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-border-bottom-left-radius": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-transform": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "border-bottom-left-radius": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "fill-rule": {"values": ["evenodd", "inherit", "initial", "nonzero", "unset"], "supports": [], "isInherited": true}, "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": {"values": ["hide", "inherit", "initial", "show", "unset"], "supports": [], "isInherited": true}, "direction": {"values": ["inherit", "initial", "ltr", "rtl", "unset"], "supports": [], "isInherited": true}, "clip-path": {"values": ["inherit", "initial", "unset"], "supports": [11], "isInherited": false}, "-webkit-mask-size": {"supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-box-orient": {"values": ["block-axis", "horizontal", "inherit", "initial", "inline-axis", "unset", "vertical"], "supports": [], "isInherited": false}, "z-index": {"values": ["auto", "inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "background-position-y": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "text-decoration-style": {"values": ["-moz-none", "dashed", "dotted", "double", "inherit", "initial", "solid", "unset", "wavy"], "supports": [], "isInherited": false}, "grid-template-areas": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-moz-perspective-origin": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-animation-direction": {"values": ["alternate", "alternate-reverse", "inherit", "initial", "normal", "reverse", "unset"], "supports": [], "isInherited": false}, "font-size-adjust": {"values": ["inherit", "initial", "none", "unset"], "supports": [7], "isInherited": true}, "cursor": {"values": ["inherit", "initial", "unset"], "supports": [11], "isInherited": true}, "margin": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-animation": {"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": {"values": ["hidden", "inherit", "initial", "unset", "visible"], "supports": [], "isInherited": true}, "letter-spacing": {"values": ["-moz-calc", "calc", "inherit", "initial", "normal", "unset"], "supports": [6], "isInherited": true}, "-moz-transition-delay": {"values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "will-change": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "transform-origin": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "font-variant-ligatures": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "padding-block-start": {"values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-animation-duration": {"values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "border-block-end-width": {"values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "-webkit-mask-origin": {"supports": [], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "isInherited": false}, "word-break": {"values": ["break-all", "inherit", "initial", "keep-all", "normal", "unset"], "supports": [], "isInherited": true}, "table-layout": {"values": ["auto", "fixed", "inherit", "initial", "unset"], "supports": [], "isInherited": false}, "text-overflow": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-webkit-flex": {"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": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "border-top-right-radius": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "border-image-outset": {"values": ["inherit", "initial", "unset"], "supports": [6, 7], "isInherited": false}, "mask-size": {"supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "touch-action": {"values": ["auto", "inherit", "initial", "manipulation", "none", "pan-x", "pan-y", "unset"], "supports": [], "isInherited": false}, "border-right-color": {"values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "backface-visibility": {"values": ["hidden", "inherit", "initial", "unset", "visible"], "supports": [], "isInherited": false}, "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": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "-webkit-transition-property": {"values": ["all", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "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": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": true}, "box-sizing": {"values": ["border-box", "content-box", "inherit", "initial", "unset"], "supports": [], "isInherited": false}, "margin-top": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "position": {"values": ["absolute", "fixed", "inherit", "initial", "relative", "static", "sticky", "unset"], "supports": [], "isInherited": false}, "list-style-position": {"values": ["inherit", "initial", "inside", "outside", "unset"], "supports": [], "isInherited": true}, "-webkit-box-pack": {"values": ["center", "end", "inherit", "initial", "justify", "start", "unset"], "supports": [], "isInherited": false}, "quotes": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "border-top": {"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": {"values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "-webkit-transition": {"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": {"values": ["default", "drag", "inherit", "initial", "no-drag", "unset"], "supports": [], "isInherited": false}, "lighting-color": {"values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "background-size": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-border-top-left-radius": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-outline-radius-bottomleft": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "mask-position-x": {"supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "mask-position-y": {"supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "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": {"values": ["backwards", "both", "forwards", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "-webkit-filter": {"values": ["inherit", "initial", "unset"], "supports": [11], "isInherited": false}, "word-wrap": {"values": ["break-word", "inherit", "initial", "normal", "unset"], "supports": [], "isInherited": true}, "grid": {"values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "background": {"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": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "grid-column-start": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "text-align": {"values": ["-moz-center", "-moz-left", "-moz-right", "center", "end", "inherit", "initial", "justify", "left", "right", "start", "unset"], "supports": [], "isInherited": true}, "marker-end": {"values": ["inherit", "initial", "none", "unset", "url"], "supports": [11], "isInherited": true}, "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": {"supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-columns": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 7], "isInherited": false}, "-moz-outline-radius-topright": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "right": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-border-left-colors": {"values": ["inherit", "initial", "unset"], "supports": [2], "isInherited": false}, "-webkit-mask-position-x": {"supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-transition-duration": {"values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "border-top-width": {"values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "bottom": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "border-block-end-style": {"values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "-webkit-order": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "-moz-animation-iteration-count": {"values": ["infinite", "inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "-moz-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": {"values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "-webkit-backface-visibility": {"values": ["hidden", "inherit", "initial", "unset", "visible"], "supports": [], "isInherited": false}, "animation-delay": {"values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "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": {"values": ["inherit", "initial", "unset"], "supports": [2, 6], "isInherited": true}, "-moz-user-modify": {"values": ["inherit", "initial", "read-only", "read-write", "unset", "write-only"], "supports": [], "isInherited": true}, "-webkit-box-direction": {"values": ["inherit", "initial", "normal", "reverse", "unset"], "supports": [], "isInherited": false}, "image-rendering": {"values": ["-moz-crisp-edges", "auto", "inherit", "initial", "optimizequality", "optimizespeed", "unset"], "supports": [], "isInherited": true}, "border-inline-end": {"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": {"values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-animation-name": {"values": ["inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "pointer-events": {"values": ["all", "auto", "fill", "inherit", "initial", "none", "painted", "stroke", "unset", "visible", "visiblefill", "visiblepainted", "visiblestroke"], "supports": [], "isInherited": true}, "border-image-width": {"values": ["inherit", "initial", "unset"], "supports": [6, 7, 8], "isInherited": false}, "border-inline-start": {"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": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-mask-clip": {"supports": [], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "isInherited": false}, "-webkit-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": {"values": ["inherit", "initial", "inline-end", "inline-start", "left", "none", "right", "unset"], "supports": [], "isInherited": false}, "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": {"values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6], "isInherited": false}, "-moz-transform-style": {"values": ["flat", "inherit", "initial", "preserve-3d", "unset"], "supports": [], "isInherited": false}, "overflow-wrap": {"values": ["break-word", "inherit", "initial", "normal", "unset"], "supports": [], "isInherited": true}, "fill": {"values": ["inherit", "initial", "unset"], "supports": [2, 11], "isInherited": true}, "scroll-snap-type": {"values": ["inherit", "initial", "mandatory", "none", "proximity", "unset"], "supports": [], "isInherited": false}, "text-emphasis-style": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "transform": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-moz-text-align-last": {"values": ["auto", "center", "end", "inherit", "initial", "justify", "left", "right", "start", "unset"], "supports": [], "isInherited": true}, "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": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": true}, "stop-opacity": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "border-top-color": {"values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "background-position": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "scroll-snap-type-x": {"values": ["inherit", "initial", "mandatory", "none", "proximity", "unset"], "supports": [], "isInherited": false}, "object-fit": {"values": ["contain", "cover", "fill", "inherit", "initial", "none", "scale-down", "unset"], "supports": [], "isInherited": false}, "-moz-box-sizing": {"values": ["border-box", "content-box", "inherit", "initial", "unset"], "supports": [], "isInherited": false}, "offset-block-start": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-background-origin": {"values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "supports": [], "isInherited": false}, "-webkit-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": {"values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "transition-delay": {"values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "border-style": {"values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "mask-repeat": {"supports": [], "values": ["inherit", "initial", "no-repeat", "repeat", "repeat-x", "repeat-y", "round", "space", "unset"], "isInherited": false}, "overflow": {"values": ["-moz-hidden-unscrollable", "auto", "hidden", "inherit", "initial", "scroll", "unset", "visible"], "supports": [], "isInherited": false}, "mask-origin": {"supports": [], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "isInherited": false}, "-moz-force-broken-image-icon": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "grid-template-columns": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-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": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "border-block-start": {"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": {"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": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "-moz-column-width": {"values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6], "isInherited": false}, "border-color": {"values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "-webkit-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": {"values": ["inherit", "initial", "unset"], "supports": [6, 7, 8], "isInherited": true}, "-moz-transform-origin": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-text-size-adjust": {"values": ["auto", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": true}, "border-left-color": {"values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "overflow-y": {"values": ["-moz-hidden-unscrollable", "auto", "hidden", "inherit", "initial", "scroll", "unset", "visible"], "supports": [], "isInherited": false}, "overflow-x": {"values": ["-moz-hidden-unscrollable", "auto", "hidden", "inherit", "initial", "scroll", "unset", "visible"], "supports": [], "isInherited": false}, "-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": {"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": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-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": {"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": {"values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "-webkit-perspective": {"values": ["inherit", "initial", "none", "unset"], "supports": [6], "isInherited": false}, "-webkit-text-stroke-color": {"values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": true}, "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": {"values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-moz-transition-property": {"values": ["all", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "border-bottom-style": {"values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "-moz-animation-play-state": {"values": ["inherit", "initial", "paused", "running", "unset"], "supports": [], "isInherited": false}, "mask": {"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": {"values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "stop-color": {"values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "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": {"values": ["inherit", "initial", "unset"], "supports": [6, 7, 8], "isInherited": true}, "border-inline-start-color": {"values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "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
+ * exposed for testing purposes.
+ */
+exports.PREFERENCES = [["align-content", ""], ["align-items", ""], ["align-self", ""], ["all", "layout.css.all-shorthand.enabled"], ["animation", ""], ["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", ""], ["background-attachment", ""], ["background-blend-mode", "layout.css.background-blend-mode.enabled"], ["background-clip", ""], ["background-color", ""], ["background-image", ""], ["background-origin", ""], ["background-position", ""], ["background-position-x", ""], ["background-position-y", ""], ["background-repeat", ""], ["background-size", ""], ["-moz-binding", ""], ["block-size", "layout.css.vertical-text.enabled"], ["border", ""], ["border-block-end", "layout.css.vertical-text.enabled"], ["border-block-end-color", "layout.css.vertical-text.enabled"], ["border-block-end-style", "layout.css.vertical-text.enabled"], ["border-block-end-width", "layout.css.vertical-text.enabled"], ["border-block-start", "layout.css.vertical-text.enabled"], ["border-block-start-color", "layout.css.vertical-text.enabled"], ["border-block-start-style", "layout.css.vertical-text.enabled"], ["border-block-start-width", "layout.css.vertical-text.enabled"], ["border-bottom", ""], ["border-bottom-color", ""], ["-moz-border-bottom-colors", ""], ["border-bottom-left-radius", ""], ["border-bottom-right-radius", ""], ["border-bottom-style", ""], ["border-bottom-width", ""], ["border-collapse", ""], ["border-color", ""], ["border-image", ""], ["border-image-outset", ""], ["border-image-repeat", ""], ["border-image-slice", ""], ["border-image-source", ""], ["border-image-width", ""], ["border-inline-end", ""], ["border-inline-end-color", ""], ["border-inline-end-style", ""], ["border-inline-end-width", ""], ["border-inline-start", ""], ["border-inline-start-color", ""], ["border-inline-start-style", ""], ["border-inline-start-width", ""], ["border-left", ""], ["border-left-color", ""], ["-moz-border-left-colors", ""], ["border-left-style", ""], ["border-left-width", ""], ["border-radius", ""], ["border-right", ""], ["border-right-color", ""], ["-moz-border-right-colors", ""], ["border-right-style", ""], ["border-right-width", ""], ["border-spacing", ""], ["border-style", ""], ["border-top", ""], ["border-top-color", ""], ["-moz-border-top-colors", ""], ["border-top-left-radius", ""], ["border-top-right-radius", ""], ["border-top-style", ""], ["border-top-width", ""], ["border-width", ""], ["bottom", ""], ["-moz-box-align", ""], ["box-decoration-break", "layout.css.box-decoration-break.enabled"], ["-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", "layout.css.color-adjust.enabled"], ["color-interpolation", ""], ["color-interpolation-filters", ""], ["-moz-column-count", ""], ["-moz-column-fill", ""], ["-moz-column-gap", ""], ["-moz-column-rule", ""], ["-moz-column-rule-color", ""], ["-moz-column-rule-style", ""], ["-moz-column-rule-width", ""], ["-moz-column-width", ""], ["-moz-columns", ""], ["contain", "layout.css.contain.enabled"], ["content", ""], ["counter-increment", ""], ["counter-reset", ""], ["cursor", ""], ["direction", ""], ["display", ""], ["dominant-baseline", ""], ["empty-cells", ""], ["fill", ""], ["fill-opacity", ""], ["fill-rule", ""], ["filter", ""], ["flex", ""], ["flex-basis", ""], ["flex-direction", ""], ["flex-flow", ""], ["flex-grow", ""], ["flex-shrink", ""], ["flex-wrap", ""], ["float", ""], ["-moz-float-edge", ""], ["flood-color", ""], ["flood-opacity", ""], ["font", ""], ["font-family", ""], ["font-feature-settings", ""], ["font-kerning", ""], ["font-language-override", ""], ["font-size", ""], ["font-size-adjust", ""], ["font-stretch", ""], ["font-style", ""], ["font-synthesis", ""], ["font-variant", ""], ["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", "layout.css.grid.enabled"], ["grid-area", "layout.css.grid.enabled"], ["grid-auto-columns", "layout.css.grid.enabled"], ["grid-auto-flow", "layout.css.grid.enabled"], ["grid-auto-rows", "layout.css.grid.enabled"], ["grid-column", "layout.css.grid.enabled"], ["grid-column-end", "layout.css.grid.enabled"], ["grid-column-gap", "layout.css.grid.enabled"], ["grid-column-start", "layout.css.grid.enabled"], ["grid-gap", "layout.css.grid.enabled"], ["grid-row", "layout.css.grid.enabled"], ["grid-row-end", "layout.css.grid.enabled"], ["grid-row-gap", "layout.css.grid.enabled"], ["grid-row-start", "layout.css.grid.enabled"], ["grid-template", "layout.css.grid.enabled"], ["grid-template-areas", "layout.css.grid.enabled"], ["grid-template-columns", "layout.css.grid.enabled"], ["grid-template-rows", "layout.css.grid.enabled"], ["height", ""], ["hyphens", ""], ["initial-letter", "layout.css.initial-letter.enabled"], ["image-orientation", "layout.css.image-orientation.enabled"], ["-moz-image-region", ""], ["image-rendering", ""], ["ime-mode", ""], ["inline-size", "layout.css.vertical-text.enabled"], ["isolation", "layout.css.isolation.enabled"], ["justify-content", ""], ["justify-items", ""], ["justify-self", ""], ["left", ""], ["letter-spacing", ""], ["lighting-color", ""], ["line-height", ""], ["list-style", ""], ["list-style-image", ""], ["list-style-position", ""], ["list-style-type", ""], ["margin", ""], ["margin-block-end", "layout.css.vertical-text.enabled"], ["margin-block-start", "layout.css.vertical-text.enabled"], ["margin-bottom", ""], ["margin-inline-end", ""], ["margin-inline-start", ""], ["margin-left", ""], ["margin-right", ""], ["margin-top", ""], ["marker", ""], ["marker-end", ""], ["marker-mid", ""], ["marker-offset", ""], ["marker-start", ""], ["mask", ""], ["mask-clip", ""], ["mask-composite", ""], ["mask-image", ""], ["mask-mode", ""], ["mask-origin", ""], ["mask-position", ""], ["mask-position-x", ""], ["mask-position-y", ""], ["mask-repeat", ""], ["mask-size", ""], ["mask-type", "layout.css.masking.enabled"], ["max-block-size", "layout.css.vertical-text.enabled"], ["max-height", ""], ["max-inline-size", "layout.css.vertical-text.enabled"], ["max-width", ""], ["min-block-size", "layout.css.vertical-text.enabled"], ["min-height", ""], ["min-inline-size", "layout.css.vertical-text.enabled"], ["min-width", ""], ["mix-blend-mode", "layout.css.mix-blend-mode.enabled"], ["object-fit", "layout.css.object-fit-and-position.enabled"], ["object-position", "layout.css.object-fit-and-position.enabled"], ["offset-block-end", "layout.css.vertical-text.enabled"], ["offset-block-start", "layout.css.vertical-text.enabled"], ["offset-inline-end", "layout.css.vertical-text.enabled"], ["offset-inline-start", "layout.css.vertical-text.enabled"], ["opacity", ""], ["order", ""], ["-moz-orient", ""], ["-moz-osx-font-smoothing", "layout.css.osx-font-smoothing.enabled"], ["outline", ""], ["outline-color", ""], ["outline-offset", ""], ["-moz-outline-radius", ""], ["-moz-outline-radius-bottomleft", ""], ["-moz-outline-radius-bottomright", ""], ["-moz-outline-radius-topleft", ""], ["-moz-outline-radius-topright", ""], ["outline-style", ""], ["outline-width", ""], ["overflow", ""], ["overflow-clip-box", "layout.css.overflow-clip-box.enabled"], ["overflow-x", ""], ["overflow-y", ""], ["padding", ""], ["padding-block-end", "layout.css.vertical-text.enabled"], ["padding-block-start", "layout.css.vertical-text.enabled"], ["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", "svg.paint-order.enabled"], ["perspective", ""], ["perspective-origin", ""], ["pointer-events", ""], ["position", ""], ["quotes", ""], ["resize", ""], ["right", ""], ["ruby-align", ""], ["ruby-position", ""], ["scroll-behavior", "layout.css.scroll-behavior.property-enabled"], ["scroll-snap-coordinate", "layout.css.scroll-snap.enabled"], ["scroll-snap-destination", "layout.css.scroll-snap.enabled"], ["scroll-snap-points-x", "layout.css.scroll-snap.enabled"], ["scroll-snap-points-y", "layout.css.scroll-snap.enabled"], ["scroll-snap-type", "layout.css.scroll-snap.enabled"], ["scroll-snap-type-x", "layout.css.scroll-snap.enabled"], ["scroll-snap-type-y", "layout.css.scroll-snap.enabled"], ["shape-outside", "layout.css.shape-outside.enabled"], ["shape-rendering", ""], ["-moz-stack-sizing", ""], ["stop-color", ""], ["stop-opacity", ""], ["stroke", ""], ["stroke-dasharray", ""], ["stroke-dashoffset", ""], ["stroke-linecap", ""], ["stroke-linejoin", ""], ["stroke-miterlimit", ""], ["stroke-opacity", ""], ["stroke-width", ""], ["-moz-tab-size", ""], ["table-layout", ""], ["text-align", ""], ["text-align-last", ""], ["text-anchor", ""], ["text-combine-upright", "layout.css.text-combine-upright.enabled"], ["text-decoration", ""], ["text-decoration-color", ""], ["text-decoration-line", ""], ["text-decoration-style", ""], ["text-emphasis", ""], ["text-emphasis-color", ""], ["text-emphasis-position", ""], ["text-emphasis-style", ""], ["-webkit-text-fill-color", "layout.css.prefixes.webkit"], ["text-indent", ""], ["text-orientation", "layout.css.vertical-text.enabled"], ["text-overflow", ""], ["text-rendering", ""], ["text-shadow", ""], ["-moz-text-size-adjust", ""], ["-webkit-text-stroke", "layout.css.prefixes.webkit"], ["-webkit-text-stroke-color", "layout.css.prefixes.webkit"], ["-webkit-text-stroke-width", "layout.css.prefixes.webkit"], ["text-transform", ""], ["top", ""], ["touch-action", "layout.css.touch_action.enabled"], ["transform", ""], ["-moz-transform", "layout.css.prefixes.transforms"], ["transform-box", "svg.transform-box.enabled"], ["transform-origin", ""], ["transform-style", ""], ["transition", ""], ["transition-delay", ""], ["transition-duration", ""], ["transition-property", ""], ["transition-timing-function", ""], ["unicode-bidi", ""], ["-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", ""], ["word-break", ""], ["word-spacing", ""], ["overflow-wrap", ""], ["writing-mode", "layout.css.vertical-text.enabled"], ["z-index", ""], ["word-wrap", ""], ["-moz-transform-origin", "layout.css.prefixes.transforms"], ["-moz-perspective-origin", "layout.css.prefixes.transforms"], ["-moz-perspective", "layout.css.prefixes.transforms"], ["-moz-transform-style", "layout.css.prefixes.transforms"], ["-moz-backface-visibility", "layout.css.prefixes.transforms"], ["-moz-border-image", "layout.css.prefixes.border-image"], ["-moz-transition", "layout.css.prefixes.transitions"], ["-moz-transition-delay", "layout.css.prefixes.transitions"], ["-moz-transition-duration", "layout.css.prefixes.transitions"], ["-moz-transition-property", "layout.css.prefixes.transitions"], ["-moz-transition-timing-function", "layout.css.prefixes.transitions"], ["-moz-animation", "layout.css.prefixes.animations"], ["-moz-animation-delay", "layout.css.prefixes.animations"], ["-moz-animation-direction", "layout.css.prefixes.animations"], ["-moz-animation-duration", "layout.css.prefixes.animations"], ["-moz-animation-fill-mode", "layout.css.prefixes.animations"], ["-moz-animation-iteration-count", "layout.css.prefixes.animations"], ["-moz-animation-name", "layout.css.prefixes.animations"], ["-moz-animation-play-state", "layout.css.prefixes.animations"], ["-moz-animation-timing-function", "layout.css.prefixes.animations"], ["-moz-box-sizing", "layout.css.prefixes.box-sizing"], ["-moz-font-feature-settings", "layout.css.prefixes.font-features"], ["-moz-font-language-override", "layout.css.prefixes.font-features"], ["-moz-padding-end", ""], ["-moz-padding-start", ""], ["-moz-margin-end", ""], ["-moz-margin-start", ""], ["-moz-border-end", ""], ["-moz-border-end-color", ""], ["-moz-border-end-style", ""], ["-moz-border-end-width", ""], ["-moz-border-start", ""], ["-moz-border-start-color", ""], ["-moz-border-start-style", ""], ["-moz-border-start-width", ""], ["-moz-hyphens", ""], ["-moz-text-align-last", ""], ["-webkit-animation", "layout.css.prefixes.webkit"], ["-webkit-animation-delay", "layout.css.prefixes.webkit"], ["-webkit-animation-direction", "layout.css.prefixes.webkit"], ["-webkit-animation-duration", "layout.css.prefixes.webkit"], ["-webkit-animation-fill-mode", "layout.css.prefixes.webkit"], ["-webkit-animation-iteration-count", "layout.css.prefixes.webkit"], ["-webkit-animation-name", "layout.css.prefixes.webkit"], ["-webkit-animation-play-state", "layout.css.prefixes.webkit"], ["-webkit-animation-timing-function", "layout.css.prefixes.webkit"], ["-webkit-filter", "layout.css.prefixes.webkit"], ["-webkit-text-size-adjust", "layout.css.prefixes.webkit"], ["-webkit-transform", "layout.css.prefixes.webkit"], ["-webkit-transform-origin", "layout.css.prefixes.webkit"], ["-webkit-transform-style", "layout.css.prefixes.webkit"], ["-webkit-backface-visibility", "layout.css.prefixes.webkit"], ["-webkit-perspective", "layout.css.prefixes.webkit"], ["-webkit-perspective-origin", "layout.css.prefixes.webkit"], ["-webkit-transition", "layout.css.prefixes.webkit"], ["-webkit-transition-delay", "layout.css.prefixes.webkit"], ["-webkit-transition-duration", "layout.css.prefixes.webkit"], ["-webkit-transition-property", "layout.css.prefixes.webkit"], ["-webkit-transition-timing-function", "layout.css.prefixes.webkit"], ["-webkit-border-radius", "layout.css.prefixes.webkit"], ["-webkit-border-top-left-radius", "layout.css.prefixes.webkit"], ["-webkit-border-top-right-radius", "layout.css.prefixes.webkit"], ["-webkit-border-bottom-left-radius", "layout.css.prefixes.webkit"], ["-webkit-border-bottom-right-radius", "layout.css.prefixes.webkit"], ["-webkit-background-clip", "layout.css.prefixes.webkit"], ["-webkit-background-origin", "layout.css.prefixes.webkit"], ["-webkit-background-size", "layout.css.prefixes.webkit"], ["-webkit-border-image", "layout.css.prefixes.webkit"], ["-webkit-box-shadow", "layout.css.prefixes.webkit"], ["-webkit-box-sizing", "layout.css.prefixes.webkit"], ["-webkit-box-flex", "layout.css.prefixes.webkit"], ["-webkit-box-ordinal-group", "layout.css.prefixes.webkit"], ["-webkit-box-orient", "layout.css.prefixes.webkit"], ["-webkit-box-direction", "layout.css.prefixes.webkit"], ["-webkit-box-align", "layout.css.prefixes.webkit"], ["-webkit-box-pack", "layout.css.prefixes.webkit"], ["-webkit-flex-direction", "layout.css.prefixes.webkit"], ["-webkit-flex-wrap", "layout.css.prefixes.webkit"], ["-webkit-flex-flow", "layout.css.prefixes.webkit"], ["-webkit-order", "layout.css.prefixes.webkit"], ["-webkit-flex", "layout.css.prefixes.webkit"], ["-webkit-flex-grow", "layout.css.prefixes.webkit"], ["-webkit-flex-shrink", "layout.css.prefixes.webkit"], ["-webkit-flex-basis", "layout.css.prefixes.webkit"], ["-webkit-justify-content", "layout.css.prefixes.webkit"], ["-webkit-align-items", "layout.css.prefixes.webkit"], ["-webkit-align-self", "layout.css.prefixes.webkit"], ["-webkit-align-content", "layout.css.prefixes.webkit"], ["-webkit-user-select", "layout.css.prefixes.webkit"], ["-webkit-mask", "layout.css.prefixes.webkit"], ["-webkit-mask-clip", "layout.css.prefixes.webkit"], ["-webkit-mask-composite", "layout.css.prefixes.webkit"], ["-webkit-mask-image", "layout.css.prefixes.webkit"], ["-webkit-mask-origin", "layout.css.prefixes.webkit"], ["-webkit-mask-position", "layout.css.prefixes.webkit"], ["-webkit-mask-position-x", "layout.css.prefixes.webkit"], ["-webkit-mask-position-y", "layout.css.prefixes.webkit"], ["-webkit-mask-repeat", "layout.css.prefixes.webkit"], ["-webkit-mask-size", "layout.css.prefixes.webkit"]];
+
+/* eslint-enable max-len */
new file mode 100644
--- /dev/null
+++ b/devtools/shared/css/generated/properties-db.js.in
@@ -0,0 +1,30 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+"use strict";
+
+/**
+ * This file is automatically generated by `mach devtools-css-db`. It contains
+ * a static list of CSS properties that can be computed by Gecko. The actual script
+ * 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 = ${cssProperties};
+
+/**
+ * A list of the pseudo elements.
+ */
+exports.PSEUDO_ELEMENTS = ${pseudoElements};
+
+/**
+ * A list of the preferences keys for whether a CSS property is enabled or not. This is
+ * exposed for testing purposes.
+ */
+exports.PREFERENCES = ${preferences};
+
+/* eslint-enable max-len */
rename from devtools/shared/css-lexer.js
rename to devtools/shared/css/lexer.js
new file mode 100644
--- /dev/null
+++ b/devtools/shared/css/moz.build
@@ -0,0 +1,17 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += [
+    'generated',
+]
+
+DevToolsModules(
+    'color-db.js',
+    'color.js',
+    'lexer.js',
+    'parsing-utils.js',
+    'properties-db.js',
+)
rename from devtools/shared/css-parsing-utils.js
rename to devtools/shared/css/parsing-utils.js
--- a/devtools/shared/css-parsing-utils.js
+++ b/devtools/shared/css/parsing-utils.js
@@ -10,17 +10,17 @@
 // RuleRewriter - rewrite CSS rule text
 // parsePseudoClassesAndAttributes - parse selector and extract
 //     pseudo-classes
 // parseSingleValue - parse a single CSS property value
 
 "use strict";
 
 const promise = require("promise");
-const {getCSSLexer} = require("devtools/shared/css-lexer");
+const {getCSSLexer} = require("devtools/shared/css/lexer");
 const {Task} = require("devtools/shared/task");
 
 const SELECTOR_ATTRIBUTE = exports.SELECTOR_ATTRIBUTE = 1;
 const SELECTOR_ELEMENT = exports.SELECTOR_ELEMENT = 2;
 const SELECTOR_PSEUDO_CLASS = exports.SELECTOR_PSEUDO_CLASS = 3;
 
 // Used to test whether a newline appears anywhere in some text.
 const NEWLINE_RX = /[\r\n]/;
rename from devtools/shared/css-properties-db.js
rename to devtools/shared/css/properties-db.js
--- a/devtools/shared/css-properties-db.js
+++ b/devtools/shared/css/properties-db.js
@@ -5,16 +5,18 @@
 "use strict";
 
 /**
  * This file contains static lists of CSS properties and values. Some of the small lists
  * are edited manually, while the larger ones are generated by a script. The comments
  * above each list indicates how it should be updated.
  */
 
+const { CSS_PROPERTIES, PSEUDO_ELEMENTS } = require("devtools/shared/css/generated/properties-db");
+
 /**
  * All CSS types that properties can support. This list can be manually edited.
  */
 exports.CSS_TYPES = {
   "ANGLE": 1,
   "COLOR": 2,
   "FREQUENCY": 3,
   "GRADIENT": 4,
@@ -46,58 +48,30 @@ exports.COLOR_TAKING_FUNCTIONS = ["linea
  */
 exports.ANGLE_TAKING_FUNCTIONS = ["linear-gradient", "-moz-linear-gradient",
                                   "repeating-linear-gradient",
                                   "-moz-repeating-linear-gradient", "rotate", "rotateX",
                                   "rotateY", "rotateZ", "rotate3d", "skew", "skewX",
                                   "skewY", "hue-rotate"];
 
 /**
- * The list of all CSS Pseudo Elements. This list MUST be automatically generated.
+ * The list of all CSS Pseudo Elements.
  *
- * The following script will copy the pseudo-elements to your clipboard if run from the
- * Browser Console, which can be launched from Tools -> Web Developer -> Browser Console.
-
-var domUtils = Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils);
-var json = JSON.stringify(domUtils.getCSSPseudoElementNames(), null, 0);
-copy(`exports.PSEUDO_ELEMENTS = ${json};\n`);
-console.log("The PSEUDO_ELEMENTS have been copied to your clipboard.")
+ * This list can be updated with `mach devtools-css-db`.
  */
-
-/*eslint-disable */
-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"];
-/*eslint-enable */
+exports.PSEUDO_ELEMENTS = PSEUDO_ELEMENTS;
 
 /**
  * A list of CSS Properties and their various characteristics. This is used on the
  * client-side when the CssPropertiesActor is not found, or when the client and server
  * are the same version. A single property takes the form:
  *
  *  "animation": {
  *    "isInherited": false,
  *    "supports": [ 7, 9, 10 ]
  *  }
- *
- * The following script will copy the CSS properties to your clipboard if run from the
- * Browser Console, which can be launched from Tools -> Web Developer -> Browser Console.
-
-var {require} = Components.utils.import("resource://devtools/shared/Loader.jsm", {});
-var {generateCssProperties} = require("devtools/server/actors/css-properties");
-var cssProperties = generateCssProperties();
-for (var key in cssProperties) {
-  // Ignore OS-specific properties
-  if (key.indexOf('-moz-osx-') !== -1) {
-    cssProperties[key] = undefined;
-  }
-}
-var json = JSON.stringify(cssProperties, null, 0);
-copy(`exports.CSS_PROPERTIES = ${json};\n`);
-console.log("The CSS_PROPERTIES have been copied to your clipboard.");
  */
-
-/*eslint-disable */
-exports.CSS_PROPERTIES = {"align-content":{"isInherited":false,"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"]},"align-items":{"isInherited":false,"supports":[],"values":["baseline","center","end","flex-end","flex-start","inherit","initial","last-baseline","left","normal","right","self-end","self-start","start","stretch","unset"]},"align-self":{"isInherited":false,"supports":[],"values":["auto","baseline","center","end","flex-end","flex-start","inherit","initial","last-baseline","left","normal","right","self-end","self-start","start","stretch","unset"]},"animation-delay":{"isInherited":false,"supports":[9],"values":["inherit","initial","unset"]},"animation-direction":{"isInherited":false,"supports":[],"values":["alternate","alternate-reverse","inherit","initial","normal","reverse","unset"]},"animation-duration":{"isInherited":false,"supports":[9],"values":["inherit","initial","unset"]},"animation-fill-mode":{"isInherited":false,"supports":[],"values":["backwards","both","forwards","inherit","initial","none","unset"]},"animation-iteration-count":{"isInherited":false,"supports":[7],"values":["infinite","inherit","initial","unset"]},"animation-name":{"isInherited":false,"supports":[],"values":["inherit","initial","none","unset"]},"animation-play-state":{"isInherited":false,"supports":[],"values":["inherit","initial","paused","running","unset"]},"animation-timing-function":{"isInherited":false,"supports":[10],"values":["cubic-bezier","ease","ease-in","ease-in-out","ease-out","inherit","initial","linear","step-end","step-start","steps","unset"]},"-moz-appearance":{"isInherited":false,"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"]},"backface-visibility":{"isInherited":false,"supports":[],"values":["hidden","inherit","initial","unset","visible"]},"background-attachment":{"isInherited":false,"supports":[],"values":["fixed","inherit","initial","local","scroll","unset"]},"background-blend-mode":{"isInherited":false,"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"]},"background-clip":{"isInherited":false,"supports":[],"values":["border-box","content-box","inherit","initial","padding-box","text","unset"]},"background-color":{"isInherited":false,"supports":[2],"values":["COLOR","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"background-image":{"isInherited":false,"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"]},"background-origin":{"isInherited":false,"supports":[],"values":["border-box","content-box","inherit","initial","padding-box","unset"]},"background-position-x":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"background-position-y":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"background-repeat":{"isInherited":false,"supports":[],"values":["inherit","initial","no-repeat","repeat","repeat-x","repeat-y","round","space","unset"]},"background-size":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"-moz-binding":{"isInherited":false,"supports":[11],"values":["inherit","initial","none","unset","url"]},"block-size":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"border-block-end-color":{"isInherited":false,"supports":[2],"values":["COLOR","-moz-use-text-color","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"border-block-end-style":{"isInherited":false,"supports":[],"values":["dashed","dotted","double","groove","hidden","inherit","initial","inset","none","outset","ridge","solid","unset"]},"border-block-end-width":{"isInherited":false,"supports":[6],"values":["-moz-calc","calc","inherit","initial","medium","thick","thin","unset"]},"border-block-start-color":{"isInherited":false,"supports":[2],"values":["COLOR","-moz-use-text-color","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"border-block-start-style":{"isInherited":false,"supports":[],"values":["dashed","dotted","double","groove","hidden","inherit","initial","inset","none","outset","ridge","solid","unset"]},"border-block-start-width":{"isInherited":false,"supports":[6],"values":["-moz-calc","calc","inherit","initial","medium","thick","thin","unset"]},"border-bottom-color":{"isInherited":false,"supports":[2],"values":["COLOR","-moz-use-text-color","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"-moz-border-bottom-colors":{"isInherited":false,"supports":[2],"values":["inherit","initial","unset"]},"border-bottom-left-radius":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"border-bottom-right-radius":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"border-bottom-style":{"isInherited":false,"supports":[],"values":["dashed","dotted","double","groove","hidden","inherit","initial","inset","none","outset","ridge","solid","unset"]},"border-bottom-width":{"isInherited":false,"supports":[6],"values":["-moz-calc","calc","inherit","initial","medium","thick","thin","unset"]},"border-collapse":{"isInherited":true,"supports":[],"values":["collapse","inherit","initial","separate","unset"]},"border-image-outset":{"isInherited":false,"supports":[6,7],"values":["inherit","initial","unset"]},"border-image-repeat":{"isInherited":false,"supports":[],"values":["inherit","initial","unset"]},"border-image-slice":{"isInherited":false,"supports":[7,8],"values":["inherit","initial","unset"]},"border-image-source":{"isInherited":false,"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"]},"border-image-width":{"isInherited":false,"supports":[6,7,8],"values":["inherit","initial","unset"]},"border-inline-end-color":{"isInherited":false,"supports":[2],"values":["COLOR","-moz-use-text-color","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"border-inline-end-style":{"isInherited":false,"supports":[],"values":["dashed","dotted","double","groove","hidden","inherit","initial","inset","none","outset","ridge","solid","unset"]},"border-inline-end-width":{"isInherited":false,"supports":[6],"values":["-moz-calc","calc","inherit","initial","medium","thick","thin","unset"]},"border-inline-start-color":{"isInherited":false,"supports":[2],"values":["COLOR","-moz-use-text-color","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"border-inline-start-style":{"isInherited":false,"supports":[],"values":["dashed","dotted","double","groove","hidden","inherit","initial","inset","none","outset","ridge","solid","unset"]},"border-inline-start-width":{"isInherited":false,"supports":[6],"values":["-moz-calc","calc","inherit","initial","medium","thick","thin","unset"]},"border-left-color":{"isInherited":false,"supports":[2],"values":["COLOR","-moz-use-text-color","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"-moz-border-left-colors":{"isInherited":false,"supports":[2],"values":["inherit","initial","unset"]},"border-left-style":{"isInherited":false,"supports":[],"values":["dashed","dotted","double","groove","hidden","inherit","initial","inset","none","outset","ridge","solid","unset"]},"border-left-width":{"isInherited":false,"supports":[6],"values":["-moz-calc","calc","inherit","initial","medium","thick","thin","unset"]},"border-right-color":{"isInherited":false,"supports":[2],"values":["COLOR","-moz-use-text-color","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"-moz-border-right-colors":{"isInherited":false,"supports":[2],"values":["inherit","initial","unset"]},"border-right-style":{"isInherited":false,"supports":[],"values":["dashed","dotted","double","groove","hidden","inherit","initial","inset","none","outset","ridge","solid","unset"]},"border-right-width":{"isInherited":false,"supports":[6],"values":["-moz-calc","calc","inherit","initial","medium","thick","thin","unset"]},"border-spacing":{"isInherited":true,"supports":[6],"values":["inherit","initial","unset"]},"border-top-color":{"isInherited":false,"supports":[2],"values":["COLOR","-moz-use-text-color","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"-moz-border-top-colors":{"isInherited":false,"supports":[2],"values":["inherit","initial","unset"]},"border-top-left-radius":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"border-top-right-radius":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"border-top-style":{"isInherited":false,"supports":[],"values":["dashed","dotted","double","groove","hidden","inherit","initial","inset","none","outset","ridge","solid","unset"]},"border-top-width":{"isInherited":false,"supports":[6],"values":["-moz-calc","calc","inherit","initial","medium","thick","thin","unset"]},"bottom":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"-moz-box-align":{"isInherited":false,"supports":[],"values":["baseline","center","end","inherit","initial","start","stretch","unset"]},"box-decoration-break":{"isInherited":false,"supports":[],"values":["clone","inherit","initial","slice","unset"]},"-moz-box-direction":{"isInherited":false,"supports":[],"values":["inherit","initial","normal","reverse","unset"]},"-moz-box-flex":{"isInherited":false,"supports":[7],"values":["inherit","initial","unset"]},"-moz-box-ordinal-group":{"isInherited":false,"supports":[7],"values":["inherit","initial","unset"]},"-moz-box-orient":{"isInherited":false,"supports":[],"values":["block-axis","horizontal","inherit","initial","inline-axis","unset","vertical"]},"-moz-box-pack":{"isInherited":false,"supports":[],"values":["center","end","inherit","initial","justify","start","unset"]},"box-shadow":{"isInherited":false,"supports":[2,6],"values":["inherit","initial","unset"]},"box-sizing":{"isInherited":false,"supports":[],"values":["border-box","content-box","inherit","initial","unset"]},"caption-side":{"isInherited":true,"supports":[],"values":["bottom","bottom-outside","inherit","initial","left","right","top","top-outside","unset"]},"clear":{"isInherited":false,"supports":[],"values":["both","inherit","initial","inline-end","inline-start","left","none","right","unset"]},"clip":{"isInherited":false,"supports":[],"values":["inherit","initial","unset"]},"clip-path":{"isInherited":false,"supports":[11],"values":["inherit","initial","unset"]},"clip-rule":{"isInherited":true,"supports":[],"values":["evenodd","inherit","initial","nonzero","unset"]},"color":{"isInherited":true,"supports":[2],"values":["COLOR","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"color-adjust":{"isInherited":true,"supports":[],"values":["economy","exact","inherit","initial","unset"]},"color-interpolation":{"isInherited":true,"supports":[],"values":["auto","inherit","initial","linearrgb","srgb","unset"]},"color-interpolation-filters":{"isInherited":true,"supports":[],"values":["auto","inherit","initial","linearrgb","srgb","unset"]},"-moz-column-count":{"isInherited":false,"supports":[7],"values":["auto","inherit","initial","unset"]},"-moz-column-fill":{"isInherited":false,"supports":[],"values":["auto","balance","inherit","initial","unset"]},"-moz-column-gap":{"isInherited":false,"supports":[6],"values":["-moz-calc","calc","inherit","initial","normal","unset"]},"-moz-column-rule-color":{"isInherited":false,"supports":[2],"values":["COLOR","-moz-use-text-color","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"-moz-column-rule-style":{"isInherited":false,"supports":[],"values":["dashed","dotted","double","groove","hidden","inherit","initial","inset","none","outset","ridge","solid","unset"]},"-moz-column-rule-width":{"isInherited":false,"supports":[6],"values":["-moz-calc","calc","inherit","initial","medium","thick","thin","unset"]},"-moz-column-width":{"isInherited":false,"supports":[6],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"content":{"isInherited":false,"supports":[11],"values":["inherit","initial","unset"]},"-moz-control-character-visibility":{"isInherited":true,"supports":[],"values":["hidden","inherit","initial","unset","visible"]},"counter-increment":{"isInherited":false,"supports":[],"values":["inherit","initial","unset"]},"counter-reset":{"isInherited":false,"supports":[],"values":["inherit","initial","unset"]},"cursor":{"isInherited":true,"supports":[11],"values":["inherit","initial","unset"]},"direction":{"isInherited":true,"supports":[],"values":["inherit","initial","ltr","rtl","unset"]},"display":{"isInherited":false,"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"]},"dominant-baseline":{"isInherited":false,"supports":[],"values":["alphabetic","auto","central","hanging","ideographic","inherit","initial","mathematical","middle","no-change","reset-size","text-after-edge","text-before-edge","unset","use-script"]},"empty-cells":{"isInherited":true,"supports":[],"values":["hide","inherit","initial","show","unset"]},"fill":{"isInherited":true,"supports":[2,11],"values":["inherit","initial","unset"]},"fill-opacity":{"isInherited":true,"supports":[7],"values":["inherit","initial","unset"]},"fill-rule":{"isInherited":true,"supports":[],"values":["evenodd","inherit","initial","nonzero","unset"]},"filter":{"isInherited":false,"supports":[11],"values":["inherit","initial","unset"]},"flex-basis":{"isInherited":false,"supports":[6,8],"values":["-moz-available","-moz-calc","-moz-fit-content","-moz-max-content","-moz-min-content","auto","calc","inherit","initial","unset"]},"flex-direction":{"isInherited":false,"supports":[],"values":["column","column-reverse","inherit","initial","row","row-reverse","unset"]},"flex-grow":{"isInherited":false,"supports":[7],"values":["inherit","initial","unset"]},"flex-shrink":{"isInherited":false,"supports":[7],"values":["inherit","initial","unset"]},"flex-wrap":{"isInherited":false,"supports":[],"values":["inherit","initial","nowrap","unset","wrap","wrap-reverse"]},"float":{"isInherited":false,"supports":[],"values":["inherit","initial","inline-end","inline-start","left","none","right","unset"]},"-moz-float-edge":{"isInherited":false,"supports":[],"values":["content-box","inherit","initial","margin-box","unset"]},"flood-color":{"isInherited":false,"supports":[2],"values":["COLOR","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"flood-opacity":{"isInherited":false,"supports":[7],"values":["inherit","initial","unset"]},"font-family":{"isInherited":true,"supports":[],"values":["inherit","initial","unset"]},"font-feature-settings":{"isInherited":true,"supports":[],"values":["inherit","initial","unset"]},"font-kerning":{"isInherited":true,"supports":[],"values":["auto","inherit","initial","none","normal","unset"]},"font-language-override":{"isInherited":true,"supports":[],"values":["inherit","initial","normal","unset"]},"font-size":{"isInherited":true,"supports":[6,8],"values":["-moz-calc","calc","inherit","initial","large","larger","medium","small","smaller","unset","x-large","x-small","xx-large","xx-small"]},"font-size-adjust":{"isInherited":true,"supports":[7],"values":["inherit","initial","none","unset"]},"font-stretch":{"isInherited":true,"supports":[],"values":["condensed","expanded","extra-condensed","extra-expanded","inherit","initial","normal","semi-condensed","semi-expanded","ultra-condensed","ultra-expanded","unset"]},"font-style":{"isInherited":true,"supports":[],"values":["inherit","initial","italic","normal","oblique","unset"]},"font-synthesis":{"isInherited":true,"supports":[],"values":["inherit","initial","unset"]},"font-variant-alternates":{"isInherited":true,"supports":[],"values":["inherit","initial","unset"]},"font-variant-caps":{"isInherited":true,"supports":[],"values":["all-petite-caps","all-small-caps","inherit","initial","normal","petite-caps","small-caps","titling-caps","unicase","unset"]},"font-variant-east-asian":{"isInherited":true,"supports":[],"values":["inherit","initial","unset"]},"font-variant-ligatures":{"isInherited":true,"supports":[],"values":["inherit","initial","unset"]},"font-variant-numeric":{"isInherited":true,"supports":[],"values":["inherit","initial","unset"]},"font-variant-position":{"isInherited":true,"supports":[],"values":["inherit","initial","normal","sub","super","unset"]},"font-weight":{"isInherited":true,"supports":[7],"values":["inherit","initial","unset"]},"-moz-force-broken-image-icon":{"isInherited":false,"supports":[7],"values":["inherit","initial","unset"]},"grid-auto-columns":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"grid-auto-flow":{"isInherited":false,"supports":[],"values":["inherit","initial","unset"]},"grid-auto-rows":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"grid-column-end":{"isInherited":false,"supports":[7],"values":["inherit","initial","unset"]},"grid-column-gap":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","calc","inherit","initial","unset"]},"grid-column-start":{"isInherited":false,"supports":[7],"values":["inherit","initial","unset"]},"grid-row-end":{"isInherited":false,"supports":[7],"values":["inherit","initial","unset"]},"grid-row-gap":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","calc","inherit","initial","unset"]},"grid-row-start":{"isInherited":false,"supports":[7],"values":["inherit","initial","unset"]},"grid-template-areas":{"isInherited":false,"supports":[],"values":["inherit","initial","unset"]},"grid-template-columns":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"grid-template-rows":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"height":{"isInherited":false,"supports":[6,8],"values":["-moz-available","-moz-calc","-moz-fit-content","-moz-max-content","-moz-min-content","auto","calc","inherit","initial","unset"]},"hyphens":{"isInherited":true,"supports":[],"values":["auto","inherit","initial","manual","none","unset"]},"image-orientation":{"isInherited":true,"supports":[1],"values":["inherit","initial","unset"]},"-moz-image-region":{"isInherited":true,"supports":[],"values":["inherit","initial","unset"]},"image-rendering":{"isInherited":true,"supports":[],"values":["-moz-crisp-edges","auto","inherit","initial","optimizequality","optimizespeed","unset"]},"ime-mode":{"isInherited":false,"supports":[],"values":["active","auto","disabled","inactive","inherit","initial","normal","unset"]},"inline-size":{"isInherited":false,"supports":[6,8],"values":["-moz-available","-moz-calc","-moz-fit-content","-moz-max-content","-moz-min-content","auto","calc","inherit","initial","unset"]},"isolation":{"isInherited":false,"supports":[],"values":["auto","inherit","initial","isolate","unset"]},"justify-content":{"isInherited":false,"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"]},"justify-items":{"isInherited":false,"supports":[],"values":["auto","baseline","center","end","flex-end","flex-start","inherit","initial","last-baseline","left","normal","right","self-end","self-start","start","stretch","unset"]},"justify-self":{"isInherited":false,"supports":[],"values":["auto","baseline","center","end","flex-end","flex-start","inherit","initial","last-baseline","left","normal","right","self-end","self-start","start","stretch","unset"]},"left":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"letter-spacing":{"isInherited":true,"supports":[6],"values":["-moz-calc","calc","inherit","initial","normal","unset"]},"lighting-color":{"isInherited":false,"supports":[2],"values":["COLOR","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"line-height":{"isInherited":true,"supports":[6,7,8],"values":["-moz-block-height","-moz-calc","calc","inherit","initial","normal","unset"]},"list-style-image":{"isInherited":true,"supports":[11],"values":["inherit","initial","none","unset","url"]},"list-style-position":{"isInherited":true,"supports":[],"values":["inherit","initial","inside","outside","unset"]},"list-style-type":{"isInherited":true,"supports":[],"values":["inherit","initial","unset"]},"margin-block-end":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"margin-block-start":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"margin-bottom":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"margin-inline-end":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"margin-inline-start":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"margin-left":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"margin-right":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"margin-top":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"marker-end":{"isInherited":true,"supports":[11],"values":["inherit","initial","none","unset","url"]},"marker-mid":{"isInherited":true,"supports":[11],"values":["inherit","initial","none","unset","url"]},"marker-offset":{"isInherited":false,"supports":[6],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"marker-start":{"isInherited":true,"supports":[11],"values":["inherit","initial","none","unset","url"]},"mask-clip":{"isInherited":false,"values":["border-box","content-box","inherit","initial","padding-box","unset"],"supports":[]},"mask-composite":{"isInherited":false,"values":["add","exclude","inherit","initial","intersect","subtract","unset"],"supports":[]},"mask-image":{"isInherited":false,"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]},"mask-mode":{"isInherited":false,"values":["alpha","inherit","initial","luminance","match-source","unset"],"supports":[]},"mask-origin":{"isInherited":false,"values":["border-box","content-box","inherit","initial","padding-box","unset"],"supports":[]},"mask-position-x":{"isInherited":false,"values":["inherit","initial","unset"],"supports":[6,8]},"mask-position-y":{"isInherited":false,"values":["inherit","initial","unset"],"supports":[6,8]},"mask-repeat":{"isInherited":false,"values":["inherit","initial","no-repeat","repeat","repeat-x","repeat-y","round","space","unset"],"supports":[]},"mask-size":{"isInherited":false,"values":["inherit","initial","unset"],"supports":[6,8]},"mask-type":{"isInherited":false,"supports":[],"values":["alpha","inherit","initial","luminance","unset"]},"max-block-size":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","calc","inherit","initial","none","unset"]},"max-height":{"isInherited":false,"supports":[6,8],"values":["-moz-available","-moz-calc","-moz-fit-content","-moz-max-content","-moz-min-content","calc","inherit","initial","none","unset"]},"max-inline-size":{"isInherited":false,"supports":[6,8],"values":["-moz-available","-moz-calc","-moz-fit-content","-moz-max-content","-moz-min-content","calc","inherit","initial","none","unset"]},"max-width":{"isInherited":false,"supports":[6,8],"values":["-moz-available","-moz-calc","-moz-fit-content","-moz-max-content","-moz-min-content","calc","inherit","initial","none","unset"]},"min-block-size":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"min-height":{"isInherited":false,"supports":[6,8],"values":["-moz-available","-moz-calc","-moz-fit-content","-moz-max-content","-moz-min-content","auto","calc","inherit","initial","unset"]},"min-inline-size":{"isInherited":false,"supports":[6,8],"values":["-moz-available","-moz-calc","-moz-fit-content","-moz-max-content","-moz-min-content","auto","calc","inherit","initial","unset"]},"min-width":{"isInherited":false,"supports":[6,8],"values":["-moz-available","-moz-calc","-moz-fit-content","-moz-max-content","-moz-min-content","auto","calc","inherit","initial","unset"]},"mix-blend-mode":{"isInherited":false,"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"]},"object-fit":{"isInherited":false,"supports":[],"values":["contain","cover","fill","inherit","initial","none","scale-down","unset"]},"object-position":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"offset-block-end":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"offset-block-start":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"offset-inline-end":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"offset-inline-start":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"opacity":{"isInherited":false,"supports":[7],"values":["inherit","initial","unset"]},"order":{"isInherited":false,"supports":[7],"values":["inherit","initial","unset"]},"-moz-orient":{"isInherited":false,"supports":[],"values":["block","horizontal","inherit","initial","inline","unset","vertical"]},"outline-color":{"isInherited":false,"supports":[2],"values":["COLOR","-moz-use-text-color","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"outline-offset":{"isInherited":false,"supports":[6],"values":["-moz-calc","calc","inherit","initial","unset"]},"-moz-outline-radius-bottomleft":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"-moz-outline-radius-bottomright":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"-moz-outline-radius-topleft":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"-moz-outline-radius-topright":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"outline-style":{"isInherited":false,"supports":[],"values":["auto","dashed","dotted","double","groove","inherit","initial","inset","none","outset","ridge","solid","unset"]},"outline-width":{"isInherited":false,"supports":[6],"values":["-moz-calc","calc","inherit","initial","medium","thick","thin","unset"]},"overflow-x":{"isInherited":false,"supports":[],"values":["-moz-hidden-unscrollable","auto","hidden","inherit","initial","scroll","unset","visible"]},"overflow-y":{"isInherited":false,"supports":[],"values":["-moz-hidden-unscrollable","auto","hidden","inherit","initial","scroll","unset","visible"]},"padding-block-end":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","calc","inherit","initial","unset"]},"padding-block-start":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","calc","inherit","initial","unset"]},"padding-bottom":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","calc","inherit","initial","unset"]},"padding-inline-end":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","calc","inherit","initial","unset"]},"padding-inline-start":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","calc","inherit","initial","unset"]},"padding-left":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","calc","inherit","initial","unset"]},"padding-right":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","calc","inherit","initial","unset"]},"padding-top":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","calc","inherit","initial","unset"]},"page-break-after":{"isInherited":false,"supports":[],"values":["always","auto","avoid","inherit","initial","left","right","unset"]},"page-break-before":{"isInherited":false,"supports":[],"values":["always","auto","avoid","inherit","initial","left","right","unset"]},"page-break-inside":{"isInherited":false,"supports":[],"values":["auto","avoid","inherit","initial","unset"]},"paint-order":{"isInherited":true,"supports":[],"values":["inherit","initial","unset"]},"perspective":{"isInherited":false,"supports":[6],"values":["inherit","initial","none","unset"]},"perspective-origin":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"pointer-events":{"isInherited":true,"supports":[],"values":["all","auto","fill","inherit","initial","none","painted","stroke","unset","visible","visiblefill","visiblepainted","visiblestroke"]},"position":{"isInherited":false,"supports":[],"values":["absolute","fixed","inherit","initial","relative","static","sticky","unset"]},"quotes":{"isInherited":true,"supports":[],"values":["inherit","initial","unset"]},"resize":{"isInherited":false,"supports":[],"values":["both","horizontal","inherit","initial","none","unset","vertical"]},"right":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"ruby-align":{"isInherited":true,"supports":[],"values":["center","inherit","initial","space-around","space-between","start","unset"]},"ruby-position":{"isInherited":true,"supports":[],"values":["inherit","initial","over","under","unset"]},"scroll-behavior":{"isInherited":false,"supports":[],"values":["auto","inherit","initial","smooth","unset"]},"scroll-snap-coordinate":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"scroll-snap-destination":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"scroll-snap-points-x":{"isInherited":false,"supports":[],"values":["inherit","initial","unset"]},"scroll-snap-points-y":{"isInherited":false,"supports":[],"values":["inherit","initial","unset"]},"scroll-snap-type-x":{"isInherited":false,"supports":[],"values":["inherit","initial","mandatory","none","proximity","unset"]},"scroll-snap-type-y":{"isInherited":false,"supports":[],"values":["inherit","initial","mandatory","none","proximity","unset"]},"shape-rendering":{"isInherited":true,"supports":[],"values":["auto","crispedges","geometricprecision","inherit","initial","optimizespeed","unset"]},"-moz-stack-sizing":{"isInherited":false,"supports":[],"values":["ignore","inherit","initial","stretch-to-fit","unset"]},"stop-color":{"isInherited":false,"supports":[2],"values":["COLOR","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"stop-opacity":{"isInherited":false,"supports":[7],"values":["inherit","initial","unset"]},"stroke":{"isInherited":true,"supports":[2,11],"values":["inherit","initial","unset"]},"stroke-dasharray":{"isInherited":true,"supports":[6,7,8],"values":["inherit","initial","unset"]},"stroke-dashoffset":{"isInherited":true,"supports":[6,7,8],"values":["inherit","initial","unset"]},"stroke-linecap":{"isInherited":true,"supports":[],"values":["butt","inherit","initial","round","square","unset"]},"stroke-linejoin":{"isInherited":true,"supports":[],"values":["bevel","inherit","initial","miter","round","unset"]},"stroke-miterlimit":{"isInherited":true,"supports":[7],"values":["inherit","initial","unset"]},"stroke-opacity":{"isInherited":true,"supports":[7],"values":["inherit","initial","unset"]},"stroke-width":{"isInherited":true,"supports":[6,7,8],"values":["inherit","initial","unset"]},"-moz-tab-size":{"isInherited":true,"supports":[7],"values":["inherit","initial","unset"]},"table-layout":{"isInherited":false,"supports":[],"values":["auto","fixed","inherit","initial","unset"]},"text-align":{"isInherited":true,"supports":[],"values":["-moz-center","-moz-left","-moz-right","center","end","inherit","initial","justify","left","right","start","unset"]},"text-align-last":{"isInherited":true,"supports":[],"values":["auto","center","end","inherit","initial","justify","left","right","start","unset"]},"text-anchor":{"isInherited":true,"supports":[],"values":["end","inherit","initial","middle","start","unset"]},"text-combine-upright":{"isInherited":true,"supports":[],"values":["inherit","initial","unset"]},"text-decoration-color":{"isInherited":false,"supports":[2],"values":["COLOR","-moz-use-text-color","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"text-decoration-line":{"isInherited":false,"supports":[],"values":["inherit","initial","unset"]},"text-decoration-style":{"isInherited":false,"supports":[],"values":["-moz-none","dashed","dotted","double","inherit","initial","solid","unset","wavy"]},"text-emphasis-color":{"isInherited":true,"supports":[2],"values":["COLOR","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"text-emphasis-position":{"isInherited":true,"supports":[],"values":["inherit","initial","unset"]},"text-emphasis-style":{"isInherited":true,"supports":[],"values":["inherit","initial","unset"]},"-webkit-text-fill-color":{"isInherited":true,"supports":[2],"values":["COLOR","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"text-indent":{"isInherited":true,"supports":[6,8],"values":["-moz-calc","calc","inherit","initial","unset"]},"text-orientation":{"isInherited":true,"supports":[],"values":["inherit","initial","mixed","sideways","sideways-right","unset","upright"]},"text-overflow":{"isInherited":false,"supports":[],"values":["inherit","initial","unset"]},"text-rendering":{"isInherited":true,"supports":[],"values":["auto","geometricprecision","inherit","initial","optimizelegibility","optimizespeed","unset"]},"text-shadow":{"isInherited":true,"supports":[2,6],"values":["inherit","initial","unset"]},"-moz-text-size-adjust":{"isInherited":true,"supports":[],"values":["auto","inherit","initial","none","unset"]},"-webkit-text-stroke-color":{"isInherited":true,"supports":[2],"values":["COLOR","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"-webkit-text-stroke-width":{"isInherited":true,"supports":[6],"values":["-moz-calc","calc","inherit","initial","medium","thick","thin","unset"]},"text-transform":{"isInherited":true,"supports":[],"values":["capitalize","full-width","inherit","initial","lowercase","none","unset","uppercase"]},"top":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"touch-action":{"isInherited":false,"supports":[],"values":["auto","inherit","initial","manipulation","none","pan-x","pan-y","unset"]},"transform":{"isInherited":false,"supports":[],"values":["inherit","initial","unset"]},"transform-box":{"isInherited":false,"supports":[],"values":["border-box","fill-box","inherit","initial","unset","view-box"]},"transform-origin":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"transform-style":{"isInherited":false,"supports":[],"values":["flat","inherit","initial","preserve-3d","unset"]},"transition-delay":{"isInherited":false,"supports":[9],"values":["inherit","initial","unset"]},"transition-duration":{"isInherited":false,"supports":[9],"values":["inherit","initial","unset"]},"transition-property":{"isInherited":false,"supports":[],"values":["all","inherit","initial","none","unset"]},"transition-timing-function":{"isInherited":false,"supports":[10],"values":["cubic-bezier","ease","ease-in","ease-in-out","ease-out","inherit","initial","linear","step-end","step-start","steps","unset"]},"unicode-bidi":{"isInherited":false,"supports":[],"values":["-moz-isolate","-moz-isolate-override","-moz-plaintext","bidi-override","embed","inherit","initial","isolate","isolate-override","normal","plaintext","unset"]},"-moz-user-focus":{"isInherited":true,"supports":[],"values":["ignore","inherit","initial","none","normal","select-after","select-all","select-before","select-menu","select-same","unset"]},"-moz-user-input":{"isInherited":true,"supports":[],"values":["auto","disabled","enabled","inherit","initial","none","unset"]},"-moz-user-modify":{"isInherited":true,"supports":[],"values":["inherit","initial","read-only","read-write","unset","write-only"]},"-moz-user-select":{"isInherited":false,"supports":[],"values":["-moz-all","-moz-none","-moz-text","all","auto","element","elements","inherit","initial","none","text","toggle","tri-state","unset"]},"vector-effect":{"isInherited":false,"supports":[],"values":["inherit","initial","non-scaling-stroke","none","unset"]},"vertical-align":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","-moz-middle-with-baseline","baseline","bottom","calc","inherit","initial","middle","sub","super","text-bottom","text-top","top","unset"]},"visibility":{"isInherited":true,"supports":[],"values":["collapse","hidden","inherit","initial","unset","visible"]},"white-space":{"isInherited":true,"supports":[],"values":["-moz-pre-space","inherit","initial","normal","nowrap","pre","pre-line","pre-wrap","unset"]},"width":{"isInherited":false,"supports":[6,8],"values":["-moz-available","-moz-calc","-moz-fit-content","-moz-max-content","-moz-min-content","auto","calc","inherit","initial","unset"]},"will-change":{"isInherited":false,"supports":[],"values":["inherit","initial","unset"]},"-moz-window-dragging":{"isInherited":false,"supports":[],"values":["default","drag","inherit","initial","no-drag","unset"]},"word-break":{"isInherited":true,"supports":[],"values":["break-all","inherit","initial","keep-all","normal","unset"]},"word-spacing":{"isInherited":true,"supports":[6,8],"values":["-moz-calc","calc","inherit","initial","normal","unset"]},"overflow-wrap":{"isInherited":true,"supports":[],"values":["break-word","inherit","initial","normal","unset"]},"writing-mode":{"isInherited":true,"supports":[],"values":["horizontal-tb","inherit","initial","lr","lr-tb","rl","rl-tb","sideways-lr","sideways-rl","tb","tb-rl","unset","vertical-lr","vertical-rl"]},"z-index":{"isInherited":false,"supports":[7],"values":["auto","inherit","initial","unset"]},"all":{"isInherited":false,"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-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","grayscale","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"]},"animation":{"isInherited":false,"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"]},"background":{"isInherited":false,"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"]},"background-position":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"border":{"isInherited":false,"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","-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"]},"border-block-end":{"isInherited":false,"supports":[2,6],"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"]},"border-block-start":{"isInherited":false,"supports":[2,6],"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"]},"border-bottom":{"isInherited":false,"supports":[2,6],"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"]},"border-color":{"isInherited":false,"supports":[2],"values":["COLOR","-moz-use-text-color","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"border-image":{"isInherited":false,"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"]},"border-inline-end":{"isInherited":false,"supports":[2,6],"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"]},"border-inline-start":{"isInherited":false,"supports":[2,6],"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"]},"border-left":{"isInherited":false,"supports":[2,6],"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"]},"border-radius":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"border-right":{"isInherited":false,"supports":[2,6],"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"]},"border-style":{"isInherited":false,"supports":[],"values":["dashed","dotted","double","groove","hidden","inherit","initial","inset","none","outset","ridge","solid","unset"]},"border-top":{"isInherited":false,"supports":[2,6],"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"]},"border-width":{"isInherited":false,"supports":[6],"values":["-moz-calc","calc","inherit","initial","medium","thick","thin","unset"]},"-moz-column-rule":{"isInherited":false,"supports":[2,6],"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"]},"-moz-columns":{"isInherited":false,"supports":[6,7],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"flex":{"isInherited":false,"supports":[6,7,8],"values":["-moz-available","-moz-calc","-moz-fit-content","-moz-max-content","-moz-min-content","auto","calc","inherit","initial","unset"]},"flex-flow":{"isInherited":false,"supports":[],"values":["column","column-reverse","inherit","initial","nowrap","row","row-reverse","unset","wrap","wrap-reverse"]},"font":{"isInherited":true,"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"]},"font-variant":{"isInherited":true,"supports":[],"values":["all-petite-caps","all-small-caps","inherit","initial","normal","petite-caps","small-caps","sub","super","titling-caps","unicase","unset"]},"grid":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","calc","inherit","initial","unset"]},"grid-area":{"isInherited":false,"supports":[7],"values":["inherit","initial","unset"]},"grid-column":{"isInherited":false,"supports":[7],"values":["inherit","initial","unset"]},"grid-gap":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","calc","inherit","initial","unset"]},"grid-row":{"isInherited":false,"supports":[7],"values":["inherit","initial","unset"]},"grid-template":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"list-style":{"isInherited":true,"supports":[11],"values":["inherit","initial","inside","none","outside","unset","url"]},"margin":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"marker":{"isInherited":true,"supports":[11],"values":["inherit","initial","none","unset","url"]},"mask":{"isInherited":false,"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"]},"mask-position":{"isInherited":false,"values":["inherit","initial","unset"],"supports":[6,8]},"outline":{"isInherited":false,"supports":[2,6],"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"]},"-moz-outline-radius":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"overflow":{"isInherited":false,"supports":[],"values":["-moz-hidden-unscrollable","auto","hidden","inherit","initial","scroll","unset","visible"]},"padding":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","calc","inherit","initial","unset"]},"scroll-snap-type":{"isInherited":false,"supports":[],"values":["inherit","initial","mandatory","none","proximity","unset"]},"text-decoration":{"isInherited":false,"supports":[2],"values":["COLOR","-moz-none","-moz-use-text-color","currentColor","dashed","dotted","double","hsl","hsla","inherit","initial","rgb","rgba","solid","transparent","unset","wavy"]},"text-emphasis":{"isInherited":true,"supports":[2],"values":["COLOR","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"-webkit-text-stroke":{"isInherited":true,"supports":[2,6],"values":["COLOR","-moz-calc","calc","currentColor","hsl","hsla","inherit","initial","medium","rgb","rgba","thick","thin","transparent","unset"]},"-moz-transform":{"isInherited":false,"supports":[],"values":["inherit","initial","unset"]},"transition":{"isInherited":false,"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"]},"word-wrap":{"isInherited":true,"supports":[],"values":["break-word","inherit","initial","normal","unset"]},"-moz-transform-origin":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"-moz-perspective-origin":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"-moz-perspective":{"isInherited":false,"supports":[6],"values":["inherit","initial","none","unset"]},"-moz-transform-style":{"isInherited":false,"supports":[],"values":["flat","inherit","initial","preserve-3d","unset"]},"-moz-backface-visibility":{"isInherited":false,"supports":[],"values":["hidden","inherit","initial","unset","visible"]},"-moz-border-image":{"isInherited":false,"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"]},"-moz-transition":{"isInherited":false,"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"]},"-moz-transition-delay":{"isInherited":false,"supports":[9],"values":["inherit","initial","unset"]},"-moz-transition-duration":{"isInherited":false,"supports":[9],"values":["inherit","initial","unset"]},"-moz-transition-property":{"isInherited":false,"supports":[],"values":["all","inherit","initial","none","unset"]},"-moz-transition-timing-function":{"isInherited":false,"supports":[10],"values":["cubic-bezier","ease","ease-in","ease-in-out","ease-out","inherit","initial","linear","step-end","step-start","steps","unset"]},"-moz-animation":{"isInherited":false,"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"]},"-moz-animation-delay":{"isInherited":false,"supports":[9],"values":["inherit","initial","unset"]},"-moz-animation-direction":{"isInherited":false,"supports":[],"values":["alternate","alternate-reverse","inherit","initial","normal","reverse","unset"]},"-moz-animation-duration":{"isInherited":false,"supports":[9],"values":["inherit","initial","unset"]},"-moz-animation-fill-mode":{"isInherited":false,"supports":[],"values":["backwards","both","forwards","inherit","initial","none","unset"]},"-moz-animation-iteration-count":{"isInherited":false,"supports":[7],"values":["infinite","inherit","initial","unset"]},"-moz-animation-name":{"isInherited":false,"supports":[],"values":["inherit","initial","none","unset"]},"-moz-animation-play-state":{"isInherited":false,"supports":[],"values":["inherit","initial","paused","running","unset"]},"-moz-animation-timing-function":{"isInherited":false,"supports":[10],"values":["cubic-bezier","ease","ease-in","ease-in-out","ease-out","inherit","initial","linear","step-end","step-start","steps","unset"]},"-moz-box-sizing":{"isInherited":false,"supports":[],"values":["border-box","content-box","inherit","initial","unset"]},"-moz-font-feature-settings":{"isInherited":true,"supports":[],"values":["inherit","initial","unset"]},"-moz-font-language-override":{"isInherited":true,"supports":[],"values":["inherit","initial","normal","unset"]},"-moz-padding-end":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","calc","inherit","initial","unset"]},"-moz-padding-start":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","calc","inherit","initial","unset"]},"-moz-margin-end":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"-moz-margin-start":{"isInherited":false,"supports":[6,8],"values":["-moz-calc","auto","calc","inherit","initial","unset"]},"-moz-border-end":{"isInherited":false,"supports":[2,6],"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"]},"-moz-border-end-color":{"isInherited":false,"supports":[2],"values":["COLOR","-moz-use-text-color","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"-moz-border-end-style":{"isInherited":false,"supports":[],"values":["dashed","dotted","double","groove","hidden","inherit","initial","inset","none","outset","ridge","solid","unset"]},"-moz-border-end-width":{"isInherited":false,"supports":[6],"values":["-moz-calc","calc","inherit","initial","medium","thick","thin","unset"]},"-moz-border-start":{"isInherited":false,"supports":[2,6],"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"]},"-moz-border-start-color":{"isInherited":false,"supports":[2],"values":["COLOR","-moz-use-text-color","currentColor","hsl","hsla","inherit","initial","rgb","rgba","transparent","unset"]},"-moz-border-start-style":{"isInherited":false,"supports":[],"values":["dashed","dotted","double","groove","hidden","inherit","initial","inset","none","outset","ridge","solid","unset"]},"-moz-border-start-width":{"isInherited":false,"supports":[6],"values":["-moz-calc","calc","inherit","initial","medium","thick","thin","unset"]},"-moz-hyphens":{"isInherited":true,"supports":[],"values":["auto","inherit","initial","manual","none","unset"]},"-moz-text-align-last":{"isInherited":true,"supports":[],"values":["auto","center","end","inherit","initial","justify","left","right","start","unset"]},"-webkit-animation":{"isInherited":false,"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"]},"-webkit-animation-delay":{"isInherited":false,"supports":[9],"values":["inherit","initial","unset"]},"-webkit-animation-direction":{"isInherited":false,"supports":[],"values":["alternate","alternate-reverse","inherit","initial","normal","reverse","unset"]},"-webkit-animation-duration":{"isInherited":false,"supports":[9],"values":["inherit","initial","unset"]},"-webkit-animation-fill-mode":{"isInherited":false,"supports":[],"values":["backwards","both","forwards","inherit","initial","none","unset"]},"-webkit-animation-iteration-count":{"isInherited":false,"supports":[7],"values":["infinite","inherit","initial","unset"]},"-webkit-animation-name":{"isInherited":false,"supports":[],"values":["inherit","initial","none","unset"]},"-webkit-animation-play-state":{"isInherited":false,"supports":[],"values":["inherit","initial","paused","running","unset"]},"-webkit-animation-timing-function":{"isInherited":false,"supports":[10],"values":["cubic-bezier","ease","ease-in","ease-in-out","ease-out","inherit","initial","linear","step-end","step-start","steps","unset"]},"-webkit-filter":{"isInherited":false,"supports":[11],"values":["inherit","initial","unset"]},"-webkit-text-size-adjust":{"isInherited":true,"supports":[],"values":["auto","inherit","initial","none","unset"]},"-webkit-transform":{"isInherited":false,"supports":[],"values":["inherit","initial","unset"]},"-webkit-transform-origin":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"-webkit-transform-style":{"isInherited":false,"supports":[],"values":["flat","inherit","initial","preserve-3d","unset"]},"-webkit-backface-visibility":{"isInherited":false,"supports":[],"values":["hidden","inherit","initial","unset","visible"]},"-webkit-perspective":{"isInherited":false,"supports":[6],"values":["inherit","initial","none","unset"]},"-webkit-perspective-origin":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"-webkit-transition":{"isInherited":false,"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"]},"-webkit-transition-delay":{"isInherited":false,"supports":[9],"values":["inherit","initial","unset"]},"-webkit-transition-duration":{"isInherited":false,"supports":[9],"values":["inherit","initial","unset"]},"-webkit-transition-property":{"isInherited":false,"supports":[],"values":["all","inherit","initial","none","unset"]},"-webkit-transition-timing-function":{"isInherited":false,"supports":[10],"values":["cubic-bezier","ease","ease-in","ease-in-out","ease-out","inherit","initial","linear","step-end","step-start","steps","unset"]},"-webkit-border-radius":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"-webkit-border-top-left-radius":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"-webkit-border-top-right-radius":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"-webkit-border-bottom-left-radius":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"-webkit-border-bottom-right-radius":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"-webkit-background-clip":{"isInherited":false,"supports":[],"values":["border-box","content-box","inherit","initial","padding-box","text","unset"]},"-webkit-background-origin":{"isInherited":false,"supports":[],"values":["border-box","content-box","inherit","initial","padding-box","unset"]},"-webkit-background-size":{"isInherited":false,"supports":[6,8],"values":["inherit","initial","unset"]},"-webkit-border-image":{"isInherited":false,"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"]},"-webkit-box-shadow":{"isInherited":false,"supports":[2,6],"values":["inherit","initial","unset"]},"-webkit-box-sizing":{"isInherited":false,"supports":[],"values":["border-box","content-box","inherit","initial","unset"]},"-webkit-box-flex":{"isInherited":false,"supports":[7],"values":["inherit","initial","unset"]},"-webkit-box-ordinal-group":{"isInherited":false,"supports":[7],"values":["inherit","initial","unset"]},"-webkit-box-orient":{"isInherited":false,"supports":[],"values":["block-axis","horizontal","inherit","initial","inline-axis","unset","vertical"]},"-webkit-box-direction":{"isInherited":false,"supports":[],"values":["inherit","initial","normal","reverse","unset"]},"-webkit-box-align":{"isInherited":false,"supports":[],"values":["baseline","center","end","inherit","initial","start","stretch","unset"]},"-webkit-box-pack":{"isInherited":false,"supports":[],"values":["center","end","inherit","initial","justify","start","unset"]},"-webkit-flex-direction":{"isInherited":false,"supports":[],"values":["column","column-reverse","inherit","initial","row","row-reverse","unset"]},"-webkit-flex-wrap":{"isInherited":false,"supports":[],"values":["inherit","initial","nowrap","unset","wrap","wrap-reverse"]},"-webkit-flex-flow":{"isInherited":false,"supports":[],"values":["column","column-reverse","inherit","initial","nowrap","row","row-reverse","unset","wrap","wrap-reverse"]},"-webkit-order":{"isInherited":false,"supports":[7],"values":["inherit","initial","unset"]},"-webkit-flex":{"isInherited":false,"supports":[6,7,8],"values":["-moz-available","-moz-calc","-moz-fit-content","-moz-max-content","-moz-min-content","auto","calc","inherit","initial","unset"]},"-webkit-flex-grow":{"isInherited":false,"supports":[7],"values":["inherit","initial","unset"]},"-webkit-flex-shrink":{"isInherited":false,"supports":[7],"values":["inherit","initial","unset"]},"-webkit-flex-basis":{"isInherited":false,"supports":[6,8],"values":["-moz-available","-moz-calc","-moz-fit-content","-moz-max-content","-moz-min-content","auto","calc","inherit","initial","unset"]},"-webkit-justify-content":{"isInherited":false,"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"]},"-webkit-align-items":{"isInherited":false,"supports":[],"values":["baseline","center","end","flex-end","flex-start","inherit","initial","last-baseline","left","normal","right","self-end","self-start","start","stretch","unset"]},"-webkit-align-self":{"isInherited":false,"supports":[],"values":["auto","baseline","center","end","flex-end","flex-start","inherit","initial","last-baseline","left","normal","right","self-end","self-start","start","stretch","unset"]},"-webkit-align-content":{"isInherited":false,"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"]},"-webkit-user-select":{"isInherited":false,"supports":[],"values":["-moz-all","-moz-none","-moz-text","all","auto","element","elements","inherit","initial","none","text","toggle","tri-state","unset"]},"-webkit-mask":{"isInherited":false,"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]},"-webkit-mask-clip":{"isInherited":false,"values":["border-box","content-box","inherit","initial","padding-box","unset"],"supports":[]},"-webkit-mask-composite":{"isInherited":false,"values":["add","exclude","inherit","initial","intersect","subtract","unset"],"supports":[]},"-webkit-mask-image":{"isInherited":false,"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]},"-webkit-mask-origin":{"isInherited":false,"values":["border-box","content-box","inherit","initial","padding-box","unset"],"supports":[]},"-webkit-mask-position":{"isInherited":false,"values":["inherit","initial","unset"],"supports":[6,8]},"-webkit-mask-position-x":{"isInherited":false,"values":["inherit","initial","unset"],"supports":[6,8]},"-webkit-mask-position-y":{"isInherited":false,"values":["inherit","initial","unset"],"supports":[6,8]},"-webkit-mask-repeat":{"isInherited":false,"values":["inherit","initial","no-repeat","repeat","repeat-x","repeat-y","round","space","unset"],"supports":[]},"-webkit-mask-size":{"isInherited":false,"values":["inherit","initial","unset"],"supports":[6,8]}};
-/*eslint-enable */
+exports.CSS_PROPERTIES = CSS_PROPERTIES;
 
 exports.CSS_PROPERTIES_DB = {
-  properties: exports.CSS_PROPERTIES,
-  pseudoElements: exports.PSEUDO_ELEMENTS
+  properties: CSS_PROPERTIES,
+  pseudoElements: PSEUDO_ELEMENTS
 };
--- a/devtools/shared/fronts/css-properties.js
+++ b/devtools/shared/fronts/css-properties.js
@@ -1,18 +1,18 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 "use strict";
 
 const { FrontClassWithSpec, Front } = require("devtools/shared/protocol");
 const { cssPropertiesSpec } = require("devtools/shared/specs/css-properties");
 const { Task } = require("devtools/shared/task");
-const { CSS_PROPERTIES_DB } = require("devtools/shared/css-properties-db");
-const { cssColors } = require("devtools/shared/css-color-db");
+const { CSS_PROPERTIES_DB } = require("devtools/shared/css/properties-db");
+const { cssColors } = require("devtools/shared/css/color-db");
 
 /**
  * Build up a regular expression that matches a CSS variable token. This is an
  * ident token that starts with two dashes "--".
  *
  * https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
  */
 var NON_ASCII = "[^\\x00-\\x7F]";
@@ -86,17 +86,17 @@ CssProperties.prototype = {
    * @return {Boolean}
    */
   isInherited(property) {
     return this.properties[property] && this.properties[property].isInherited;
   },
 
   /**
    * Checks if the property supports the given CSS type.
-   * CSS types should come from devtools/shared/css-properties-db.js' CSS_TYPES.
+   * CSS types should come from devtools/shared/css/properties-db.js' CSS_TYPES.
    *
    * @param {String} property The property to be checked.
    * @param {Number} type One of the type values from CSS_TYPES.
    * @return {Boolean}
    */
   supportsType(property, type) {
     return this.properties[property] && this.properties[property].supports.includes(type);
   },
--- a/devtools/shared/fronts/styles.js
+++ b/devtools/shared/fronts/styles.js
@@ -12,17 +12,17 @@ const {
 } = require("devtools/shared/protocol");
 const {
   pageStyleSpec,
   styleRuleSpec
 } = require("devtools/shared/specs/styles");
 const promise = require("promise");
 const { Task } = require("devtools/shared/task");
 const { Class } = require("sdk/core/heritage");
-const { RuleRewriter } = require("devtools/shared/css-parsing-utils");
+const { RuleRewriter } = require("devtools/shared/css/parsing-utils");
 
 /**
  * PageStyleFront, the front object for the PageStyleActor
  */
 const PageStyleFront = FrontClassWithSpec(pageStyleSpec, {
   initialize: function (conn, form, ctx, detail) {
     Front.prototype.initialize.call(this, conn, form, ctx, detail);
     this.inspector = this.parent();
--- a/devtools/shared/inspector/css-logic.js
+++ b/devtools/shared/inspector/css-logic.js
@@ -36,17 +36,17 @@
  * styling information in the page, and present this to the user in a way that
  * helps them understand:
  * - why their expectations may not have been fulfilled
  * - how browsers process CSS
  * @constructor
  */
 
 const Services = require("Services");
-const CSSLexer = require("devtools/shared/css-lexer");
+const CSSLexer = require("devtools/shared/css/lexer");
 const {LocalizationHelper} = require("devtools/shared/l10n");
 const styleInspectorL10N =
   new LocalizationHelper("devtools-shared/locale/styleinspector.properties");
 
 /**
  * Special values for filter, in addition to an href these values can be used
  */
 exports.FILTER = {
--- a/devtools/shared/moz.build
+++ b/devtools/shared/moz.build
@@ -5,16 +5,17 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 include('../templates.mozbuild')
 
 DIRS += [
     'acorn',
     'apps',
     'client',
+    'css',
     'discovery',
     'fronts',
     'gcli',
     'heapsnapshot',
     'inspector',
     'jsbeautify',
     'layout',
     'locales',
@@ -40,21 +41,16 @@ XPCSHELL_TESTS_MANIFESTS += ['tests/unit
 
 JAR_MANIFESTS += ['jar.mn']
 
 DevToolsModules(
     'async-storage.js',
     'async-utils.js',
     'builtin-modules.js',
     'content-observer.js',
-    'css-color-db.js',
-    'css-color.js',
-    'css-lexer.js',
-    'css-parsing-utils.js',
-    'css-properties-db.js',
     'defer.js',
     'deprecated-sync-thenables.js',
     'DevToolsUtils.js',
     'dom-node-constants.js',
     'dom-node-filter-constants.js',
     'event-emitter.js',
     'flags.js',
     'indentation.js',
--- a/devtools/shared/tests/unit/test_css-properties-db.js
+++ b/devtools/shared/tests/unit/test_css-properties-db.js
@@ -1,48 +1,156 @@
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
-// Test that the devtool's client-side css-properties-db matches the values on the
-// platform.
+/**
+ * Test that the devtool's client-side CSS properties database is in sync with the values
+ * on the platform. If they are not, then `mach generate-css-db` needs to be run to
+ * make everything up to date. Nightly, aurora, beta, and release may have different
+ * preferences for what CSS values are enabled. The static CSS properties database can
+ * be slightly different from the target platform as long as there is a preference that
+ * exists that turns off that CSS property.
+ */
 
 "use strict";
 
 const DOMUtils = Components.classes["@mozilla.org/inspector/dom-utils;1"]
                            .getService(Components.interfaces.inIDOMUtils);
 
-const {PSEUDO_ELEMENTS, CSS_PROPERTIES} = require("devtools/shared/css-properties-db");
+const {PSEUDO_ELEMENTS, CSS_PROPERTIES, PREFERENCES} = require("devtools/shared/css/generated/properties-db");
 const {generateCssProperties} = require("devtools/server/actors/css-properties");
+const { Preferences } = require("resource://gre/modules/Preferences.jsm");
 
 function run_test() {
-  // Check that the platform and client match for pseudo elements.
-  deepEqual(PSEUDO_ELEMENTS, DOMUtils.getCSSPseudoElementNames(),
-            "If this assertion fails, then the client side CSS pseudo elements list in " +
-            "devtools is out of date with the pseudo elements on the platform. To fix " +
-            "this assertion open devtools/shared/css-properties-db.js and follow the " +
-            "instructions above the CSS_PSEUDO_ELEMENTS on how to re-generate the list.");
+  const propertiesErrorMessage = "If this assertion fails, then the client side CSS " +
+                                 "properties list in devtools is out of sync with the " +
+                                 "CSS properties on the platform. To fix this " +
+                                 "assertion run `mach generate-css-db` to re-generate " +
+                                 "the client side properties.";
 
-  const propertiesErrorMessage = "If this assertion fails, then the client side CSS " +
-                                 "properties list in devtools is out of date with the " +
-                                 "CSS properties on the platform. To fix this " +
-                                 "assertion open devtools/shared/css-properties-db.js " +
-                                 "and follow the instructions above the CSS_PROPERTIES " +
-                                 "on how to re-generate the list.";
+  // Check that the platform and client match for pseudo elements.
+  deepEqual(PSEUDO_ELEMENTS, DOMUtils.getCSSPseudoElementNames(), `The pseudo elements ` +
+            `match on the client and platform. ${propertiesErrorMessage}`);
 
-  // Check that the platform and client match for CSS properties. Enumerate each property
-  // to aid in debugging.
+  /**
+   * Check that the platform and client match for the details on their CSS properties.
+   * Enumerate each property to aid in debugging. Sometimes these properties don't
+   * completely agree due to differences in preferences. Check the currently set
+   * preference for that property to see if it's enabled.
+   */
   const platformProperties = generateCssProperties();
+
   for (let propertyName in CSS_PROPERTIES) {
     const platformProperty = platformProperties[propertyName];
     const clientProperty = CSS_PROPERTIES[propertyName];
-    deepEqual(platformProperty, clientProperty,
-      `Client and server match for "${propertyName}". ${propertiesErrorMessage}\n`);
+    const deepEqual = isJsonDeepEqual(platformProperty, clientProperty);
+
+    if (deepEqual) {
+      ok(true, `The static database and platform match for "${propertyName}".`);
+    } else {
+      const prefMessage = `The static database and platform do not match ` +
+                          `for "${propertyName}".`;
+      if (getPreference(propertyName) === false) {
+        ok(true, `${prefMessage} However, there is a preference for disabling this ` +
+                 `property on the current build.`);
+      } else {
+        ok(false, `${prefMessage} ${propertiesErrorMessage}`);
+      }
+    }
+  }
+
+  /**
+   * Check that the list of properties on the platform and client are the same. If
+   * they are not, check that there may be preferences that are disabling them on the
+   * target platform.
+   */
+  const mismatches = getKeyMismatches(platformProperties, CSS_PROPERTIES)
+    // Filter out OS-specific properties.
+    .filter(name => name.indexOf("-moz-osx-") === -1);
+
+  if (mismatches.length === 0) {
+    ok(true, "No client and platform CSS property database mismatches were found.");
+  }
+
+  mismatches.forEach(propertyName => {
+    if (getPreference(propertyName) === false) {
+      ok(true, `The static database and platform do not agree on the property ` +
+               `"${propertyName}" This is ok because it is currently disabled through ` +
+               `a preference.`);
+    } else {
+      ok(false, `The static database and platform do not agree on the property ` +
+                `"${propertyName}" ${propertiesErrorMessage}`);
+    }
+  });
+}
+
+/**
+ * Check JSON-serializable objects for deep equality.
+ */
+function isJsonDeepEqual(a, b) {
+  // Handle primitives.
+  if (a === b) {
+    return true;
   }
 
-  // Filter out OS-specific properties.
-  const platformPropertyNames = Object.keys(platformProperties).filter(
-    name => name.indexOf("-moz-osx-") === -1);
-  const clientPlatformNames = Object.keys(CSS_PROPERTIES);
+  // Handle arrays.
+  if (Array.isArray(a) && Array.isArray(b)) {
+    if (a.length !== b.length) {
+      return false;
+    }
+    for (let i = 0; i < a.length; i++) {
+      if (!isJsonDeepEqual(a[i], b[i])) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  // Handle objects
+  if (typeof a === "object" && typeof b === "object") {
+    for (let key in a) {
+      if (!isJsonDeepEqual(a[key], b[key])) {
+        return false;
+      }
+    }
+
+    return Object.keys(a).length === Object.keys(b).length;
+  }
+
+  // Not something handled by these cases, therefore not equal.
+  return false;
+}
 
-  deepEqual(platformPropertyNames, clientPlatformNames,
-        `The client side CSS properties database names match those found on the ` +
-        `platform. ${propertiesErrorMessage}`);
+/**
+ * Get the preference value of whether this property is enabled. Returns an empty string
+ * if no preference exists.
+ *
+ * @param {String} propertyName
+ * @return {Boolean|undefined}
+ */
+function getPreference(propertyName) {
+  const preference = PREFERENCES.find(([prefPropertyName, preferenceKey]) => {
+    return prefPropertyName === propertyName && !!preferenceKey;
+  });
+
+  if (preference) {
+    return Preferences.get(preference[1]);
+  }
+  return undefined;
 }
+
+/**
+ * Take the keys of two objects, and return the ones that don't match.
+ *
+ * @param {Object} a
+ * @param {Object} b
+ * @return {Array} keys
+ */
+function getKeyMismatches(a, b) {
+  const aNames = Object.keys(a);
+  const bNames = Object.keys(b);
+  const aMismatches = aNames.filter(key => !bNames.includes(key));
+  const bMismatches = bNames.filter(key => {
+    return !aNames.includes(key) && !aMismatches.includes(name);
+  });
+
+  return aMismatches.concat(bMismatches);
+}
--- a/devtools/shared/tests/unit/test_csslexer.js
+++ b/devtools/shared/tests/unit/test_csslexer.js
@@ -4,17 +4,17 @@
  */
 
 // This file is a copy of layout/style/test/test_csslexer.js, modified
 // to use both our pure-JS lexer and the DOMUtils lexer for
 // cross-checking.
 
 "use strict";
 
-const jsLexer = require("devtools/shared/css-lexer");
+const jsLexer = require("devtools/shared/css/lexer");
 const domutils = Components.classes["@mozilla.org/inspector/dom-utils;1"]
                            .getService(Components.interfaces.inIDOMUtils);
 
 // An object that acts like a CSSLexer but verifies that the DOM lexer
 // and the JS lexer do the same thing.
 function DoubleLexer(input) {
   do_print("DoubleLexer input: " + input);
   this.domLexer = domutils.getCSSLexer(input);
deleted file mode 100644