Merge mozilla-central to fx-team
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Fri, 30 Sep 2016 12:09:37 +0200
changeset 315971 afe79b010d138c608f5490572e3303647b452d74
parent 315745 5bf0ee1a10f44ef12f13bfe03f58726feffa59a1 (current diff)
parent 315970 5ffed033557e5b6f9694123f1948f867f913ede3 (diff)
child 315972 364027ef5febd20776beea1e14c7bccefacab8f1
push id20634
push usercbook@mozilla.com
push dateFri, 30 Sep 2016 10:10:13 +0000
treeherderfx-team@afe79b010d13 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone52.0a1
Merge mozilla-central to fx-team
devtools/client/responsive.html/test/browser/head.js
dom/presentation/PresentationServiceBase.cpp
testing/mochitest/cc-analyzer.js
testing/talos/talos/tests/scroll/scroll-test.js
testing/talos/talos/tests/scroll/scroll.js
--- a/.eslintignore
+++ b/.eslintignore
@@ -97,17 +97,17 @@ devtools/client/shared/webgl-utils.js
 devtools/client/shared/developer-toolbar.js
 devtools/client/shared/components/test/**
 devtools/client/shared/redux/middleware/test/**
 devtools/client/shared/test/**
 !devtools/client/shared/test/test-actor-registry.js
 devtools/client/shared/widgets/*.jsm
 devtools/client/sourceeditor/test/*.js
 devtools/client/webaudioeditor/**
-devtools/client/webconsole/**
+#devtools/client/webconsole/**
 !devtools/client/webconsole/panel.js
 !devtools/client/webconsole/jsterm.js
 !devtools/client/webconsole/console-commands.js
 devtools/client/webide/**
 !devtools/client/webide/components/webideCli.js
 devtools/server/*.js
 devtools/server/*.jsm
 !devtools/server/child.js
--- a/.flake8
+++ b/.flake8
@@ -1,3 +1,5 @@
 [flake8]
+# See http://pep8.readthedocs.io/en/latest/intro.html#configuration
+ignore = E121, E123, E126, E133, E226, E241, E242, E704, W503, E402
 max-line-length = 99
 filename = *.py, +.lint
--- a/Makefile.in
+++ b/Makefile.in
@@ -167,18 +167,24 @@ install-manifests: $(addprefix install-,
 ifneq (,$(filter FasterMake+RecursiveMake,$(BUILD_BACKENDS)))
 install-manifests: faster
 .PHONY: faster
 faster: install-dist/idl
 	$(MAKE) -C faster FASTER_RECURSIVE_MAKE=1
 endif
 
 .PHONY: tup
-tup: install-manifests buildid.h source-repo.h
+tup:
+	$(call BUILDSTATUS,TIERS make tup)
+	$(call BUILDSTATUS,TIER_START make)
+	$(MAKE) install-manifests buildid.h source-repo.h
+	$(call BUILDSTATUS,TIER_FINISH make)
+	$(call BUILDSTATUS,TIER_START tup)
 	@$(TUP) $(if $(findstring s,$(filter-out --%,$(MAKEFLAGS))),,--verbose)
+	$(call BUILDSTATUS,TIER_FINISH tup)
 
 # process_install_manifest needs to be invoked with --no-remove when building
 # js as standalone because automated builds are building nspr separately and
 # that would remove the resulting files.
 # Eventually, a standalone js build would just be able to build nspr itself,
 # removing the need for the former.
 ifdef JS_STANDALONE
 NO_REMOVE=1
--- a/accessible/base/AccEvent.h
+++ b/accessible/base/AccEvent.h
@@ -5,16 +5,17 @@
 
 #ifndef _AccEvent_H_
 #define _AccEvent_H_
 
 #include "nsIAccessibleEvent.h"
 
 #include "mozilla/a11y/Accessible.h"
 
+class nsEventShell;
 namespace mozilla {
 
 namespace dom {
 class Selection;
 }
 
 namespace a11y {
 
@@ -126,16 +127,17 @@ protected:
 
   bool mIsFromUserInput;
   uint32_t mEventType;
   EEventRule mEventRule;
   RefPtr<Accessible> mAccessible;
 
   friend class EventQueue;
   friend class EventTree;
+  friend class ::nsEventShell;
 };
 
 
 /**
  * Accessible state change event.
  */
 class AccStateChangeEvent: public AccEvent
 {
@@ -285,17 +287,20 @@ public:
   virtual unsigned int GetEventGroups() const override
   {
     return AccMutationEvent::GetEventGroups() | (1U << eShowEvent);
   }
 
   uint32_t InsertionIndex() const { return mInsertionIndex; }
 
 private:
+  nsTArray<RefPtr<AccHideEvent>> mPrecedingEvents;
   uint32_t mInsertionIndex;
+
+  friend class EventTree;
 };
 
 
 /**
  * Class for reorder accessible event. Takes care about
  */
 class AccReorderEvent : public AccEvent
 {
--- a/accessible/base/EventTree.cpp
+++ b/accessible/base/EventTree.cpp
@@ -149,16 +149,34 @@ TreeMutation::PrefixLog(void* aData, Acc
 }
 #endif
 
 
 ////////////////////////////////////////////////////////////////////////////////
 // EventTree
 
 void
+EventTree::Shown(Accessible* aChild)
+{
+  RefPtr<AccShowEvent> ev = new AccShowEvent(aChild);
+  Controller(aChild)->WithdrawPrecedingEvents(&ev->mPrecedingEvents);
+  Mutated(ev);
+}
+
+void
+EventTree::Hidden(Accessible* aChild, bool aNeedsShutdown)
+{
+  RefPtr<AccHideEvent> ev = new AccHideEvent(aChild, aNeedsShutdown);
+  if (!aNeedsShutdown) {
+    Controller(aChild)->StorePrecedingEvent(ev);
+  }
+  Mutated(ev);
+}
+
+void
 EventTree::Process(const RefPtr<DocAccessible>& aDeathGrip)
 {
   while (mFirst) {
     // Skip a node and its subtree if its container is not in the document.
     if (mFirst->mContainer->IsInDocument()) {
       mFirst->Process(aDeathGrip);
       if (aDeathGrip->IsDefunct()) {
         return;
@@ -172,20 +190,29 @@ EventTree::Process(const RefPtr<DocAcces
   MOZ_ASSERT(!mContainer || !mContainer->IsDefunct(),
              "Processing events for defunct container");
   MOZ_ASSERT(!mFireReorder || mContainer, "No target for reorder event");
 
   // Fire mutation events.
   uint32_t eventsCount = mDependentEvents.Length();
   for (uint32_t jdx = 0; jdx < eventsCount; jdx++) {
     AccMutationEvent* mtEvent = mDependentEvents[jdx];
-    MOZ_ASSERT(mtEvent->mEventRule != AccEvent::eDoNotEmit,
-               "The event shouldn't be presented in the tree");
     MOZ_ASSERT(mtEvent->Document(), "No document for event target");
 
+    // Fire all hide events that has to be fired before this show event.
+    if (mtEvent->IsShow()) {
+      AccShowEvent* showEv = downcast_accEvent(mtEvent);
+      for (uint32_t i = 0; i < showEv->mPrecedingEvents.Length(); i++) {
+        nsEventShell::FireEvent(showEv->mPrecedingEvents[i]);
+        if (aDeathGrip->IsDefunct()) {
+          return;
+        }
+      }
+    }
+
     nsEventShell::FireEvent(mtEvent);
     if (aDeathGrip->IsDefunct()) {
       return;
     }
 
     if (mtEvent->mTextChangeEvent) {
       nsEventShell::FireEvent(mtEvent->mTextChangeEvent);
       if (aDeathGrip->IsDefunct()) {
@@ -410,23 +437,32 @@ EventTree::Log(uint32_t aLevel) const
   for (uint32_t i = 0; i < aLevel; i++) {
     printf("  ");
   }
   logging::AccessibleInfo("container", mContainer);
 
   for (uint32_t i = 0; i < mDependentEvents.Length(); i++) {
     AccMutationEvent* ev = mDependentEvents[i];
     if (ev->IsShow()) {
-      for (uint32_t i = 0; i < aLevel; i++) {
+      for (uint32_t i = 0; i < aLevel + 1; i++) {
         printf("  ");
       }
       logging::AccessibleInfo("shown", ev->mAccessible);
+
+      AccShowEvent* showEv = downcast_accEvent(ev);
+      for (uint32_t i = 0; i < showEv->mPrecedingEvents.Length(); i++) {
+        for (uint32_t j = 0; j < aLevel + 1; j++) {
+          printf("  ");
+        }
+        logging::AccessibleInfo("preceding",
+                                showEv->mPrecedingEvents[i]->mAccessible);
+      }
     }
     else {
-      for (uint32_t i = 0; i < aLevel; i++) {
+      for (uint32_t i = 0; i < aLevel + 1; i++) {
         printf("  ");
       }
       logging::AccessibleInfo("hidden", ev->mAccessible);
     }
   }
 
   if (mFirst) {
     mFirst->Log(aLevel + 1);
--- a/accessible/base/EventTree.h
+++ b/accessible/base/EventTree.h
@@ -62,27 +62,19 @@ class EventTree final {
 public:
   EventTree() :
     mFirst(nullptr), mNext(nullptr), mContainer(nullptr), mFireReorder(false) { }
   explicit EventTree(Accessible* aContainer, bool aFireReorder) :
     mFirst(nullptr), mNext(nullptr), mContainer(aContainer),
     mFireReorder(aFireReorder) { }
   ~EventTree() { Clear(); }
 
-  void Shown(Accessible* aChild)
-  {
-    RefPtr<AccShowEvent> ev = new AccShowEvent(aChild);
-    Mutated(ev);
-  }
+  void Shown(Accessible* aChild);
 
-  void Hidden(Accessible* aChild, bool aNeedsShutdown = true)
-  {
-    RefPtr<AccHideEvent> ev = new AccHideEvent(aChild, aNeedsShutdown);
-    Mutated(ev);
-  }
+  void Hidden(Accessible* aChild, bool aNeedsShutdown = true);
 
   /**
    * Return an event tree node for the given accessible.
    */
   const EventTree* Find(const Accessible* aContainer) const;
 
 #ifdef A11Y_LOG
   void Log(uint32_t aLevel = UINT32_MAX) const;
@@ -104,16 +96,19 @@ private:
 
   UniquePtr<EventTree> mFirst;
   UniquePtr<EventTree> mNext;
 
   Accessible* mContainer;
   nsTArray<RefPtr<AccMutationEvent>> mDependentEvents;
   bool mFireReorder;
 
+  static NotificationController* Controller(Accessible* aAcc)
+    { return aAcc->Document()->Controller(); }
+
   friend class NotificationController;
 };
 
 
 } // namespace a11y
 } // namespace mozilla
 
 #endif // mozilla_a11y_EventQueue_h_
--- a/accessible/base/NotificationController.cpp
+++ b/accessible/base/NotificationController.cpp
@@ -21,16 +21,20 @@ using namespace mozilla::a11y;
 // NotificationCollector
 ////////////////////////////////////////////////////////////////////////////////
 
 NotificationController::NotificationController(DocAccessible* aDocument,
                                                nsIPresShell* aPresShell) :
   EventQueue(aDocument), mObservingState(eNotObservingRefresh),
   mPresShell(aPresShell)
 {
+#ifdef DEBUG
+  mMoveGuardOnStack = false;
+#endif
+
   // Schedule initial accessible tree construction.
   ScheduleProcessing();
 }
 
 NotificationController::~NotificationController()
 {
   NS_ASSERTION(!mDocument, "Controller wasn't shutdown properly!");
   if (mDocument)
--- a/accessible/base/NotificationController.h
+++ b/accessible/base/NotificationController.h
@@ -127,16 +127,39 @@ public:
   }
 
   /**
    * Returns existing event tree for the given the accessible or creates one if
    * it doesn't exists yet.
    */
   EventTree* QueueMutation(Accessible* aContainer);
 
+  class MoveGuard final {
+  public:
+    explicit MoveGuard(NotificationController* aController) :
+      mController(aController)
+    {
+#ifdef DEBUG
+      MOZ_ASSERT(!mController->mMoveGuardOnStack,
+                 "Move guard is on stack already!");
+      mController->mMoveGuardOnStack = true;
+#endif
+    }
+    ~MoveGuard() {
+#ifdef DEBUG
+      MOZ_ASSERT(mController->mMoveGuardOnStack, "No move guard on stack!");
+      mController->mMoveGuardOnStack = false;
+#endif
+      mController->mPrecedingEvents.Clear();
+    }
+
+  private:
+    NotificationController* mController;
+  };
+
 #ifdef A11Y_LOG
   const EventTree& RootEventTree() const { return mEventTree; };
 #endif
 
   /**
    * Schedule binding the child document to the tree of this document.
    */
   void ScheduleChildDocBinding(DocAccessible* aDocument);
@@ -242,16 +265,36 @@ protected:
 
 private:
   NotificationController(const NotificationController&);
   NotificationController& operator = (const NotificationController&);
 
   // nsARefreshObserver
   virtual void WillRefresh(mozilla::TimeStamp aTime) override;
 
+  /**
+   * Set and returns a hide event, paired with a show event, for the move.
+   */
+  void WithdrawPrecedingEvents(nsTArray<RefPtr<AccHideEvent>>* aEvs)
+  {
+    if (mPrecedingEvents.Length() > 0) {
+      aEvs->AppendElements(mozilla::Move(mPrecedingEvents));
+    }
+  }
+  void StorePrecedingEvent(AccHideEvent* aEv)
+  {
+    MOZ_ASSERT(mMoveGuardOnStack, "No move guard on stack!");
+    mPrecedingEvents.AppendElement(aEv);
+  }
+  void StorePrecedingEvents(nsTArray<RefPtr<AccHideEvent>>&& aEvs)
+  {
+    MOZ_ASSERT(mMoveGuardOnStack, "No move guard on stack!");
+    mPrecedingEvents.InsertElementsAt(0, aEvs);
+  }
+
 private:
   /**
    * Indicates whether we're waiting on an event queue processing from our
    * notification controller to flush events.
    */
   enum eObservingState {
     eNotObservingRefresh,
     eRefreshObserving,
@@ -315,14 +358,27 @@ private:
    * Holds all scheduled relocations.
    */
   nsTArray<RefPtr<Accessible> > mRelocations;
 
   /**
    * Holds all mutation events.
    */
   EventTree mEventTree;
+
+  /**
+   * A temporary collection of hide events that should be fired before related
+   * show event. Used by EventTree.
+   */
+  nsTArray<RefPtr<AccHideEvent>> mPrecedingEvents;
+
+#ifdef DEBUG
+  bool mMoveGuardOnStack;
+#endif
+
+  friend class MoveGuard;
+  friend class EventTree;
 };
 
 } // namespace a11y
 } // namespace mozilla
 
 #endif // mozilla_a11y_NotificationController_h_
--- a/accessible/base/TextAttrs.cpp
+++ b/accessible/base/TextAttrs.cpp
@@ -711,23 +711,19 @@ TextAttrsMgr::AutoGeneratedTextAttr::
 ////////////////////////////////////////////////////////////////////////////////
 // TextDecorTextAttr
 ////////////////////////////////////////////////////////////////////////////////
 
 TextAttrsMgr::TextDecorValue::
   TextDecorValue(nsIFrame* aFrame)
 {
   const nsStyleTextReset* textReset = aFrame->StyleTextReset();
-  mStyle = textReset->GetDecorationStyle();
-
-  bool isForegroundColor = false;
-  textReset->GetDecorationColor(mColor, isForegroundColor);
-  if (isForegroundColor)
-    mColor = aFrame->StyleColor()->mColor;
-
+  mStyle = textReset->mTextDecorationStyle;
+  mColor = aFrame->StyleColor()->
+    CalcComplexColor(textReset->mTextDecorationColor);
   mLine = textReset->mTextDecorationLine &
     (NS_STYLE_TEXT_DECORATION_LINE_UNDERLINE |
      NS_STYLE_TEXT_DECORATION_LINE_LINE_THROUGH);
 }
 
 TextAttrsMgr::TextDecorTextAttr::
   TextDecorTextAttr(nsIFrame* aRootFrame, nsIFrame* aFrame) :
   TTextAttr<TextDecorValue>(!aFrame)
--- a/accessible/base/nsEventShell.cpp
+++ b/accessible/base/nsEventShell.cpp
@@ -14,17 +14,17 @@ using namespace mozilla::a11y;
 
 ////////////////////////////////////////////////////////////////////////////////
 // nsEventShell
 ////////////////////////////////////////////////////////////////////////////////
 
 void
 nsEventShell::FireEvent(AccEvent* aEvent)
 {
-  if (!aEvent)
+  if (!aEvent || aEvent->mEventRule == AccEvent::eDoNotEmit)
     return;
 
   Accessible* accessible = aEvent->GetAccessible();
   NS_ENSURE_TRUE_VOID(accessible);
 
   nsINode* node = accessible->GetNode();
   if (node) {
     sEventTargetNode = node;
@@ -38,16 +38,17 @@ nsEventShell::FireEvent(AccEvent* aEvent
     GetAccService()->GetStringEventType(aEvent->GetEventType(), type);
     logging::MsgEntry("type: %s", NS_ConvertUTF16toUTF8(type).get());
     logging::AccessibleInfo("target", aEvent->GetAccessible());
     logging::MsgEnd();
   }
 #endif
 
   accessible->HandleAccEvent(aEvent);
+  aEvent->mEventRule = AccEvent::eDoNotEmit;
 
   sEventTargetNode = nullptr;
 }
 
 void
 nsEventShell::FireEvent(uint32_t aEventType, Accessible* aAccessible,
                         EIsFromUserInput aIsFromUserInput)
 {
--- a/accessible/generic/DocAccessible.cpp
+++ b/accessible/generic/DocAccessible.cpp
@@ -2175,16 +2175,18 @@ DocAccessible::MoveChild(Accessible* aCh
 #endif
 
   // If the child was taken from from an ARIA owns element.
   if (aChild->IsRelocated()) {
     nsTArray<RefPtr<Accessible> >* children = mARIAOwnsHash.Get(curParent);
     children->RemoveElement(aChild);
   }
 
+  NotificationController::MoveGuard mguard(mNotificationController);
+
   if (curParent == aNewParent) {
     MOZ_ASSERT(aChild->IndexInParent() != aIdxInParent, "No move case");
     curParent->MoveChild(aIdxInParent, aChild);
 
 #ifdef A11Y_LOG
     logging::TreeInfo("move child: parent tree after",
                       logging::eVerbose, curParent);
 #endif
--- a/accessible/tests/mochitest/events/test_coalescence.html
+++ b/accessible/tests/mochitest/events/test_coalescence.html
@@ -496,17 +496,17 @@
      * <div id="t7_c">
      *   <div id="t7_c_directchild">ha</div>
      *   <div><div id="t7_c_grandchild">ha</div></div>
      * </div>
      */
     function test7()
     {
       this.eventSeq = [
-        new todo_invokerChecker(EVENT_HIDE, getNode('t7_c')),
+        new invokerChecker(EVENT_HIDE, getNode('t7_c')),
         new invokerChecker(EVENT_SHOW, getNode('t7_c')),
         new invokerChecker(EVENT_REORDER, getNode('t7')),
         new unexpectedInvokerChecker(EVENT_REORDER, getNode('t7_c_directchild')),
         new unexpectedInvokerChecker(EVENT_REORDER, getNode('t7_c_grandchild')),
         new unexpectedInvokerChecker(EVENT_SHOW, () => getNode('t7_c_directchild').firstChild),
         new unexpectedInvokerChecker(EVENT_SHOW, () => getNode('t7_c_grandchild').firstChild)
       ];
 
@@ -517,21 +517,57 @@
         getNode('t7_moveplace').setAttribute('aria-owns', 't7_c');
       };
 
       this.getID = function test7_getID() {
         return "Show child accessibles and then hide their container";
       };
     }
 
+    /**
+     * Move a node by aria-owns from right to left in the tree, so that
+     * the eventing looks this way:
+     * reorder for 't8_c1'
+     *   hide for 't8_c1_child'
+     *   show for 't8_c2_moved'
+     * reorder for 't8_c2'
+     *   hide for 't8_c2_moved'
+     *
+     * The hide event should be delivered before the paired show event.
+     */
+    function test8()
+    {
+      this.eventSeq = [
+        new invokerChecker(EVENT_HIDE, getNode('t8_c1_child')),
+        new invokerChecker(EVENT_HIDE, 't8_c2_moved'),
+        new invokerChecker(EVENT_SHOW, 't8_c2_moved'),
+        new invokerChecker(EVENT_REORDER, 't8_c1'),
+        new invokerChecker(EVENT_REORDER, 't8_c2')
+      ];
+
+      this.invoke = function test8_invoke()
+      {
+        // Remove a node from 't8_c1' container to give the event tree a
+        // desired structure (the 't8_c1' container node goes first in the event
+        // tree)
+        getNode('t8_c1_child').remove();
+        // then move 't8_c2_moved' from 't8_c2' to 't8_c1'.
+        getNode('t8_c1').setAttribute('aria-owns', 't8_c2_moved');
+      };
+
+      this.getID = function test8_getID() {
+        return "Move a node by aria-owns to left within the tree";
+      };
+    }
+
     ////////////////////////////////////////////////////////////////////////////
     // Do tests.
 
     //gA11yEventDumpToConsole = true; // debug stuff
-    //enableLogging("tree,eventTree,verbose");
+    //enableLogging("eventTree");
 
     var gQueue = null;
     function doTests()
     {
       gQueue = new eventQueue();
 
       gQueue.push(new removeChildNParent("option1", "select1"));
       gQueue.push(new removeParentNChild("option2", "select2"));
@@ -550,16 +586,17 @@
       gQueue.push(new showParentNAddChild("select12", true));
 
       gQueue.push(new removeGrandChildrenNHideParent("t1_child1", "t1_child2", "t1_parent"));
       gQueue.push(new test3());
       gQueue.push(new test4());
       gQueue.push(new test5());
       gQueue.push(new test6());
       gQueue.push(new test7());
+      gQueue.push(new test8());
 
       gQueue.invoke(); // Will call SimpleTest.finish();
     }
 
     SimpleTest.waitForExplicitFinish();
     addA11yLoadEvent(doTests);
   </script>
 </head>
@@ -576,17 +613,16 @@
      href="https://bugzilla.mozilla.org/show_bug.cgi?id=570275">
     Mozilla Bug 570275
   </a>
 
   <p id="display"></p>
   <div id="content" style="display: none"></div>
   <pre id="test">
   </pre>
-  <div id="eventdump"></div>
 
   <div id="testContainer">
     <select id="select1">
       <option id="option1">option</option>
     </select>
     <select id="select2">
       <option id="option2">option</option>
     </select>
@@ -651,10 +687,17 @@
 
   <div id="t7">
     <div id="t7_moveplace"></div>
     <div id="t7_c">
       <div><div id="t7_c_grandchild"></div></div>
       <div id="t7_c_directchild"></div>
     </div>
   </div>
+
+  <div id="t8">
+    <div id="t8_c1"><div id="t8_c1_child"></div></div>
+    <div id="t8_c2">
+      <div id="t8_c2_moved"></div>
+    </div>
+  </div>
 </body>
 </html>
--- a/accessible/tests/mochitest/treeupdate/test_ariaowns.html
+++ b/accessible/tests/mochitest/treeupdate/test_ariaowns.html
@@ -68,20 +68,20 @@
       {
         return "Change @aria-owns attribute";
       }
     }
 
     function removeARIAOwns()
     {
       this.eventSeq = [
+        new invokerChecker(EVENT_HIDE, getNode("t1_subdiv")),
         new invokerChecker(EVENT_SHOW, getNode("t1_subdiv")),
         new invokerChecker(EVENT_HIDE, getNode("t1_button")),
         new invokerChecker(EVENT_SHOW, getNode("t1_button")),
-        new invokerChecker(EVENT_HIDE, getNode("t1_subdiv")),
         new invokerChecker(EVENT_REORDER, getNode("t1_container"))
       ];
 
       this.invoke = function removeARIAOwns_invoke()
       {
         getNode("t1_container").removeAttribute("aria-owns");
       }
 
@@ -137,18 +137,18 @@
       {
         return "Set @aria-owns attribute";
       }
     }
 
     function addIdToARIAOwns()
     {
       this.eventSeq = [
+        new invokerChecker(EVENT_HIDE, getNode("t1_group")),
         new invokerChecker(EVENT_SHOW, getNode("t1_group")),
-        new invokerChecker(EVENT_HIDE, getNode("t1_group")),
         new invokerChecker(EVENT_REORDER, document)
       ];
 
       this.invoke = function addIdToARIAOwns_invoke()
       {
         getNode("t1_container").
           setAttribute("aria-owns", "t1_button t1_subdiv t1_group");
       }
@@ -270,18 +270,18 @@
       {
         return "Remove ID from ARIA owned element";
       }
     }
 
     function setId()
     {
       this.eventSeq = [
+        new invokerChecker(EVENT_HIDE, getNode("t1_grouptmp")),
         new invokerChecker(EVENT_SHOW, getNode("t1_grouptmp")),
-        new invokerChecker(EVENT_HIDE, getNode("t1_grouptmp")),
         new invokerChecker(EVENT_REORDER, document)
       ];
 
       this.invoke = function setId_invoke()
       {
         getNode("t1_grouptmp").setAttribute("id", "t1_group");
       }
 
--- a/addon-sdk/source/lib/sdk/panel.js
+++ b/addon-sdk/source/lib/sdk/panel.js
@@ -8,17 +8,17 @@
 module.metadata = {
   "stability": "stable",
   "engines": {
     "Firefox": "*",
     "SeaMonkey": "*"
   }
 };
 
-const { Ci } = require("chrome");
+const { Cu, Ci } = require("chrome");
 const { setTimeout } = require('./timers');
 const { Class } = require("./core/heritage");
 const { merge } = require("./util/object");
 const { WorkerHost } = require("./content/utils");
 const { Worker } = require("./deprecated/sync-worker");
 const { Disposable } = require("./core/disposable");
 const { WeakReference } = require('./core/reference');
 const { contract: loaderContract } = require("./content/loader");
@@ -106,42 +106,83 @@ var workers = new WeakMap();
 var styles = new WeakMap();
 
 const viewFor = (panel) => views.get(panel);
 const modelFor = (panel) => models.get(panel);
 const panelFor = (view) => panels.get(view);
 const workerFor = (panel) => workers.get(panel);
 const styleFor = (panel) => styles.get(panel);
 
-// Utility function takes `panel` instance and makes sure it will be
-// automatically hidden as soon as other panel is shown.
-var setupAutoHide = new function() {
-  let refs = new WeakMap();
+function getPanelFromWeakRef(weakRef) {
+  if (!weakRef) {
+    return null;
+  }
+  let panel = weakRef.get();
+  if (!panel) {
+    return null;
+  }
+  if (isDisposed(panel)) {
+    return null;
+  }
+  return panel;
+}
 
-  return function setupAutoHide(panel) {
-    // Create system event listener that reacts to any panel showing and
-    // hides given `panel` if it's not the one being shown.
-    function listener({subject}) {
-      // It could be that listener is not GC-ed in the same cycle as
-      // panel in such case we remove listener manually.
-      let view = viewFor(panel);
-      if (!view) systemEvents.off("popupshowing", listener);
-      else if (subject !== view) panel.hide();
+var SinglePanelManager = {
+  visiblePanel: null,
+  enqueuedPanel: null,
+  enqueuedPanelCallback: null,
+  // Calls |callback| with no arguments when the panel may be shown.
+  requestOpen: function(panelToOpen, callback) {
+    let currentPanel = getPanelFromWeakRef(SinglePanelManager.visiblePanel);
+    if (currentPanel || SinglePanelManager.enqueuedPanel) {
+      SinglePanelManager.enqueuedPanel = Cu.getWeakReference(panelToOpen);
+      SinglePanelManager.enqueuedPanelCallback = callback;
+      if (currentPanel && currentPanel.isShowing) {
+        currentPanel.hide();
+      }
+    } else {
+      SinglePanelManager.notifyPanelCanOpen(panelToOpen, callback);
     }
-
-    // system event listener is intentionally weak this way we'll allow GC
-    // to claim panel if it's no longer referenced by an add-on code. This also
-    // helps minimizing cleanup required on unload.
-    systemEvents.on("popupshowing", listener);
-    // To make sure listener is not claimed by GC earlier than necessary we
-    // associate it with `panel` it's associated with. This way it won't be
-    // GC-ed earlier than `panel` itself.
-    refs.set(panel, listener);
+  },
+  notifyPanelCanOpen: function(panel, callback) {
+    let view = viewFor(panel);
+    // Can't pass an arrow function as the event handler because we need to be
+    // able to call |removeEventListener| later.
+    view.addEventListener("popuphidden", SinglePanelManager.onVisiblePanelHidden, true);
+    view.addEventListener("popupshown", SinglePanelManager.onVisiblePanelShown, false);
+    SinglePanelManager.enqueuedPanel = null;
+    SinglePanelManager.enqueuedPanelCallback = null;
+    SinglePanelManager.visiblePanel = Cu.getWeakReference(panel);
+    callback();
+  },
+  onVisiblePanelShown: function(event) {
+    let panel = panelFor(event.target);
+    if (SinglePanelManager.enqueuedPanel) {
+      // Another panel started waiting for |panel| to close before |panel| was
+      // even done opening.
+      panel.hide();
+    }
+  },
+  onVisiblePanelHidden: function(event) {
+    let view = event.target;
+    let panel = panelFor(view);
+    let currentPanel = getPanelFromWeakRef(SinglePanelManager.visiblePanel);
+    if (currentPanel && currentPanel != panel) {
+      return;
+    }
+    SinglePanelManager.visiblePanel = null;
+    view.removeEventListener("popuphidden", SinglePanelManager.onVisiblePanelHidden, true);
+    view.removeEventListener("popupshown", SinglePanelManager.onVisiblePanelShown, false);
+    let nextPanel = getPanelFromWeakRef(SinglePanelManager.enqueuedPanel);
+    let nextPanelCallback = SinglePanelManager.enqueuedPanelCallback;
+    if (nextPanel) {
+      SinglePanelManager.notifyPanelCanOpen(nextPanel, nextPanelCallback);
+    }
   }
-}
+};
 
 const Panel = Class({
   implements: [
     // Generate accessors for the validated properties that update model on
     // set and return values from model on get.
     panelContract.properties(modelFor),
     EventTarget,
     Disposable,
@@ -173,18 +214,16 @@ const Panel = Class({
     views.set(this, view);
 
     // Load panel content.
     domPanel.setURL(view, model.contentURL);
 
     // Allow context menu
     domPanel.allowContextMenu(view, model.contextMenu);
 
-    setupAutoHide(this);
-
     // Setup listeners.
     setListeners(this, options);
     let worker = new Worker(stripListeners(options));
     workers.set(this, worker);
 
     // pipe events from worker to a panel.
     pipe(worker, this);
   },
@@ -257,45 +296,47 @@ const Panel = Class({
 
   /* Public API: Panel.isShowing */
   get isShowing() {
     return !isDisposed(this) && domPanel.isOpen(viewFor(this));
   },
 
   /* Public API: Panel.show */
   show: function show(options={}, anchor) {
-    if (options instanceof Ci.nsIDOMElement) {
-      [anchor, options] = [options, null];
-    }
+    SinglePanelManager.requestOpen(this, () => {
+      if (options instanceof Ci.nsIDOMElement) {
+        [anchor, options] = [options, null];
+      }
 
-    if (anchor instanceof Ci.nsIDOMElement) {
-      console.warn(
-        "Passing a DOM node to Panel.show() method is an unsupported " +
-        "feature that will be soon replaced. " +
-        "See: https://bugzilla.mozilla.org/show_bug.cgi?id=878877"
-      );
-    }
+      if (anchor instanceof Ci.nsIDOMElement) {
+        console.warn(
+          "Passing a DOM node to Panel.show() method is an unsupported " +
+          "feature that will be soon replaced. " +
+          "See: https://bugzilla.mozilla.org/show_bug.cgi?id=878877"
+        );
+      }
 
-    let model = modelFor(this);
-    let view = viewFor(this);
-    let anchorView = getNodeView(anchor || options.position || model.position);
+      let model = modelFor(this);
+      let view = viewFor(this);
+      let anchorView = getNodeView(anchor || options.position || model.position);
 
-    options = merge({
-      position: model.position,
-      width: model.width,
-      height: model.height,
-      defaultWidth: model.defaultWidth,
-      defaultHeight: model.defaultHeight,
-      focus: model.focus,
-      contextMenu: model.contextMenu
-    }, displayContract(options));
+      options = merge({
+        position: model.position,
+        width: model.width,
+        height: model.height,
+        defaultWidth: model.defaultWidth,
+        defaultHeight: model.defaultHeight,
+        focus: model.focus,
+        contextMenu: model.contextMenu
+      }, displayContract(options));
 
-    if (!isDisposed(this))
-      domPanel.show(view, options, anchorView);
-
+      if (!isDisposed(this)) {
+        domPanel.show(view, options, anchorView);
+      }
+    });
     return this;
   },
 
   /* Public API: Panel.hide */
   hide: function hide() {
     // Quit immediately if panel is disposed or there is no state change.
     domPanel.close(viewFor(this));
 
--- a/addon-sdk/source/test/test-panel.js
+++ b/addon-sdk/source/test/test-panel.js
@@ -292,18 +292,21 @@ exports["test Hide Before Show"] = funct
       hideCalled = true;
     }
   });
   panel1.show();
   panel1.hide();
 
   let panel2 = Panel({
     onShow: function () {
-      assert.ok(!showCalled, 'should not emit show');
-      assert.ok(!hideCalled, 'should not emit hide');
+      if (showCalled) {
+        assert.ok(hideCalled, 'should not emit show without also emitting hide');
+      } else {
+        assert.ok(!hideCalled, 'should not emit hide without also emitting show');
+      }
       panel1.destroy();
       panel2.destroy();
       done();
     },
   });
   panel2.show();
 };
 
--- a/browser/base/content/browser-places.js
+++ b/browser/base/content/browser-places.js
@@ -255,22 +255,36 @@ var StarUI = {
         }
         parent = parent.parentNode;
       }
       if (parent) {
         this._anchorToolbarButton = parent;
         parent.setAttribute("open", "true");
       }
     }
-    this.panel.openPopup(aAnchorElement, aPosition);
+    let panel = this.panel;
+    let target = panel;
+    if (target.parentNode) {
+      // By targeting the panel's parent and using a capturing listener, we
+      // can have our listener called before others waiting for the panel to
+      // be shown (which probably expect the panel to be fully initialized)
+      target = target.parentNode;
+    }
+    target.addEventListener("popupshown", function shownListener(event) {
+      if (event.target == panel) {
+        target.removeEventListener("popupshown", shownListener, true);
 
-    gEditItemOverlay.initPanel({ node: aNode
-                               , hiddenRows: ["description", "location",
-                                              "loadInSidebar", "keyword"]
-                               , focusedElement: "preferred" });
+        gEditItemOverlay.initPanel({ node: aNode
+                                   , hiddenRows: ["description", "location",
+                                                  "loadInSidebar", "keyword"]
+                                   , focusedElement: "preferred"});
+      }
+    }, true);
+
+    this.panel.openPopup(aAnchorElement, aPosition);
   }),
 
   panelShown:
   function SU_panelShown(aEvent) {
     if (aEvent.target == this.panel) {
       if (this._element("editBookmarkPanelContent").hidden) {
         // Note this isn't actually used anymore, we should remove this
         // once we decide not to bring back the page bookmarked notification
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -3300,16 +3300,21 @@ var PrintPreviewListener = {
   getSimplifiedSourceBrowser: function () {
     return this._simplifyPageTab ?
       gBrowser.getBrowserForTab(this._simplifyPageTab) : null;
   },
   getNavToolbox: function () {
     return gNavToolbox;
   },
   onEnter: function () {
+    // We might have accidentally switched tabs since the user invoked print
+    // preview
+    if (gBrowser.selectedTab != this._printPreviewTab) {
+      gBrowser.selectedTab = this._printPreviewTab;
+    }
     gInPrintPreviewMode = true;
     this._toggleAffectedChrome();
   },
   onExit: function () {
     gBrowser.selectedTab = this._tabBeforePrintPreview;
     this._tabBeforePrintPreview = null;
     gInPrintPreviewMode = false;
     this._toggleAffectedChrome();
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -3044,16 +3044,19 @@
       </method>
 
       <property name="selectedTab">
         <getter>
           return this.mCurrentTab;
         </getter>
         <setter>
           <![CDATA[
+          if (gNavToolbox.collapsed) {
+            return this.mTabBox.selectedTab;
+          }
           // Update the tab
           this.mTabBox.selectedTab = val;
           return val;
           ]]>
         </setter>
       </property>
 
       <property name="selectedBrowser"
@@ -5984,17 +5987,18 @@
         }
       ]]></handler>
 
       <handler event="click"><![CDATA[
         if (event.button != 1)
           return;
 
         if (event.target.localName == "tab") {
-          this.tabbrowser.removeTab(event.target, {animate: true, byMouse: true});
+          this.tabbrowser.removeTab(event.target, {animate: true,
+                byMouse: event.mozInputSource == MouseEvent.MOZ_SOURCE_MOUSE});
         } else if (event.originalTarget.localName == "box") {
           // The user middleclicked an open space on the tabstrip. This could
           // be because they intend to open a new tab, but it could also be
           // because they just removed a tab and they now middleclicked on the
           // resulting space while that tab is closing. In that case, we don't
           // want to open a tab. So if we're removing one or more tabs, and
           // the tab click is before the end of the last visible tab, we do
           // nothing.
@@ -6406,17 +6410,18 @@
        element (in both cases, when they are anonymous nodes of <tabbrowser>).
   -->
   <binding id="tabbrowser-close-tab-button"
            extends="chrome://global/content/bindings/toolbarbutton.xml#toolbarbutton-image">
     <handlers>
       <handler event="click" button="0"><![CDATA[
         var bindingParent = document.getBindingParent(this);
         var tabContainer = bindingParent.parentNode;
-        tabContainer.tabbrowser.removeTab(bindingParent, {animate: true, byMouse: true});
+        tabContainer.tabbrowser.removeTab(bindingParent, {animate: true,
+                byMouse: event.mozInputSource == MouseEvent.MOZ_SOURCE_MOUSE});
         // This enables double-click protection for the tab container
         // (see tabbrowser-tabs 'click' handler).
         tabContainer._blockDblClick = true;
       ]]></handler>
 
       <handler event="dblclick" button="0" phase="capturing">
         // for the one-close-button case
         event.stopPropagation();
--- a/browser/base/content/test/general/browser.ini
+++ b/browser/base/content/test/general/browser.ini
@@ -127,16 +127,17 @@ support-files =
   !/toolkit/mozapps/extensions/test/xpinstall/amosigned.xpi
   !/toolkit/mozapps/extensions/test/xpinstall/corrupt.xpi
   !/toolkit/mozapps/extensions/test/xpinstall/incompatible.xpi
   !/toolkit/mozapps/extensions/test/xpinstall/installtrigger.html
   !/toolkit/mozapps/extensions/test/xpinstall/redirect.sjs
   !/toolkit/mozapps/extensions/test/xpinstall/restartless-unsigned.xpi
   !/toolkit/mozapps/extensions/test/xpinstall/restartless.xpi
   !/toolkit/mozapps/extensions/test/xpinstall/theme.xpi
+  !/toolkit/mozapps/extensions/test/xpinstall/slowinstall.sjs
 
 [browser_aboutAccounts.js]
 skip-if = os == "linux" # Bug 958026
 support-files =
   content_aboutAccounts.js
 [browser_aboutCertError.js]
 [browser_aboutNetError.js]
 [browser_aboutSupport_newtab_security_state.js]
--- a/browser/base/content/test/general/browser_bug553455.js
+++ b/browser/base/content/test/general/browser_bug553455.js
@@ -5,1154 +5,1147 @@
 const TESTROOT = "http://example.com/browser/toolkit/mozapps/extensions/test/xpinstall/";
 const TESTROOT2 = "http://example.org/browser/toolkit/mozapps/extensions/test/xpinstall/";
 const SECUREROOT = "https://example.com/browser/toolkit/mozapps/extensions/test/xpinstall/";
 const XPINSTALL_URL = "chrome://mozapps/content/xpinstall/xpinstallConfirm.xul";
 const PREF_INSTALL_REQUIREBUILTINCERTS = "extensions.install.requireBuiltInCerts";
 const PROGRESS_NOTIFICATION = "addon-progress";
 
 const { REQUIRE_SIGNING } = Cu.import("resource://gre/modules/addons/AddonConstants.jsm", {});
+const { Task } = Cu.import("resource://gre/modules/Task.jsm");
 
 var rootDir = getRootDirectory(gTestPath);
 var path = rootDir.split('/');
 var chromeName = path[0] + '//' + path[2];
 var croot = chromeName + "/content/browser/toolkit/mozapps/extensions/test/xpinstall/";
 var jar = getJar(croot);
 if (jar) {
   var tmpdir = extractJarToTmp(jar);
   croot = 'file://' + tmpdir.path + '/';
 }
 const CHROMEROOT = croot;
 
 var gApp = document.getElementById("bundle_brand").getString("brandShortName");
 var gVersion = Services.appinfo.version;
 
-function get_observer_topic(aNotificationId) {
+function getObserverTopic(aNotificationId) {
   let topic = aNotificationId;
   if (topic == "xpinstall-disabled")
     topic = "addon-install-disabled";
   else if (topic == "addon-progress")
     topic = "addon-install-started";
   else if (topic == "addon-install-restart")
     topic = "addon-install-complete";
   return topic;
 }
 
-function wait_for_progress_notification(aCallback, aExpectedCount = 1) {
-  wait_for_notification(PROGRESS_NOTIFICATION, aCallback, aExpectedCount, "popupshowing");
+function waitForProgressNotification(aPanelOpen = false, aExpectedCount = 1) {
+  return Task.spawn(function* () {
+    let notificationId = PROGRESS_NOTIFICATION;
+    info("Waiting for " + notificationId + " notification");
+
+    let topic = getObserverTopic(notificationId);
+
+    let observerPromise = new Promise(resolve => {
+      Services.obs.addObserver(function observer(aSubject, aTopic, aData) {
+        // Ignore the progress notification unless that is the notification we want
+        if (notificationId != PROGRESS_NOTIFICATION &&
+            aTopic == getObserverTopic(PROGRESS_NOTIFICATION)) {
+          return;
+        }
+        Services.obs.removeObserver(observer, topic);
+        resolve();
+      }, topic, false);
+    });
+
+    let panelEventPromise;
+    if (aPanelOpen) {
+      panelEventPromise = Promise.resolve();
+    } else {
+      panelEventPromise = new Promise(resolve => {
+        PopupNotifications.panel.addEventListener("popupshowing", function eventListener() {
+          PopupNotifications.panel.removeEventListener("popupshowing", eventListener);
+          resolve();
+        });
+      });
+    }
+
+    yield observerPromise;
+    yield panelEventPromise;
+
+    info("Saw a notification");
+    ok(PopupNotifications.isPanelOpen, "Panel should be open");
+    is(PopupNotifications.panel.childNodes.length, aExpectedCount, "Should be the right number of notifications");
+    if (PopupNotifications.panel.childNodes.length) {
+      let nodes = Array.from(PopupNotifications.panel.childNodes);
+      let notification = nodes.find(n => n.id == notificationId + "-notification");
+      ok(notification, `Should have seen the right notification`);
+    }
+
+    return PopupNotifications.panel;
+  });
 }
 
-function wait_for_notification(aId, aCallback, aExpectedCount = 1, aEvent = "popupshown") {
-  info("Waiting for " + aId + " notification");
+function waitForNotification(aId, aExpectedCount = 1) {
+  return Task.spawn(function* () {
+    info("Waiting for " + aId + " notification");
 
-  let topic = get_observer_topic(aId);
-  function observer(aSubject, aTopic, aData) {
-    // Ignore the progress notification unless that is the notification we want
-    if (aId != PROGRESS_NOTIFICATION &&
-        aTopic == get_observer_topic(PROGRESS_NOTIFICATION))
-      return;
-
-    Services.obs.removeObserver(observer, topic);
+    let topic = getObserverTopic(aId);
 
-    if (PopupNotifications.isPanelOpen)
-      executeSoon(verify);
-    else
-      PopupNotifications.panel.addEventListener(aEvent, event_listener);
-  }
+    let observerPromise = new Promise(resolve => {
+      Services.obs.addObserver(function observer(aSubject, aTopic, aData) {
+        // Ignore the progress notification unless that is the notification we want
+        if (aId != PROGRESS_NOTIFICATION &&
+            aTopic == getObserverTopic(PROGRESS_NOTIFICATION)) {
+          return;
+        }
+        Services.obs.removeObserver(observer, topic);
+        resolve();
+      }, topic, false);
+    });
 
-  function event_listener() {
-    // Ignore the progress notification unless that is the notification we want
-    if (aId != PROGRESS_NOTIFICATION &&
-        PopupNotifications.panel.childNodes[0].id == PROGRESS_NOTIFICATION + "-notification")
-      return;
+    let panelEventPromise = new Promise(resolve => {
+      PopupNotifications.panel.addEventListener("PanelUpdated", function eventListener(e) {
+        // Skip notifications that are not the one that we are supposed to be looking for
+        if (e.detail.indexOf(aId) == -1) {
+          return;
+        }
+        PopupNotifications.panel.removeEventListener("PanelUpdated", eventListener);
+        resolve();
+      });
+    });
 
-    PopupNotifications.panel.removeEventListener(aEvent, event_listener);
+    yield observerPromise;
+    yield panelEventPromise;
 
-    verify();
-  }
-
-  function verify() {
     info("Saw a notification");
     ok(PopupNotifications.isPanelOpen, "Panel should be open");
     is(PopupNotifications.panel.childNodes.length, aExpectedCount, "Should be the right number of notifications");
     if (PopupNotifications.panel.childNodes.length) {
       let nodes = Array.from(PopupNotifications.panel.childNodes);
       let notification = nodes.find(n => n.id == aId + "-notification");
-      ok(notification, "Should have seen the right notification");
+      ok(notification, `Should have seen the right notification`);
     }
-    aCallback(PopupNotifications.panel);
-  }
 
-  Services.obs.addObserver(observer, topic, false);
-}
-
-function wait_for_notification_close(aCallback) {
-  info("Waiting for notification to close");
-  PopupNotifications.panel.addEventListener("popuphidden", function() {
-    PopupNotifications.panel.removeEventListener("popuphidden", arguments.callee, false);
-    executeSoon(aCallback);
-  }, false);
+    return PopupNotifications.panel;
+  });
 }
 
-function wait_for_install_dialog(aCallback) {
-  if (Preferences.get("xpinstall.customConfirmationUI", false)) {
-    wait_for_notification("addon-install-confirmation", function(aPanel) {
-      aCallback();
-    });
-    return;
-  }
-
-  info("Waiting for install dialog");
-
-  Services.wm.addListener({
-    onOpenWindow: function(aXULWindow) {
-      info("Install dialog opened, waiting for focus");
-      Services.wm.removeListener(this);
-
-      var domwindow = aXULWindow.QueryInterface(Ci.nsIInterfaceRequestor)
-                                .getInterface(Ci.nsIDOMWindow);
-      waitForFocus(function() {
-        info("Saw install dialog");
-        is(domwindow.document.location.href, XPINSTALL_URL, "Should have seen the right window open");
-
-        // Override the countdown timer on the accept button
-        var button = domwindow.document.documentElement.getButton("accept");
-        button.disabled = false;
-
-        aCallback();
-      }, domwindow);
-    },
-
-    onCloseWindow: function(aXULWindow) {
-    },
-
-    onWindowTitleChange: function(aXULWindow, aNewTitle) {
-    }
+function waitForNotificationClose() {
+  return new Promise(resolve => {
+    info("Waiting for notification to close");
+    PopupNotifications.panel.addEventListener("popuphidden", function listener() {
+      PopupNotifications.panel.removeEventListener("popuphidden", listener, false);
+      resolve();
+    }, false);
   });
 }
 
-function remove_tab_and_run_next_test() {
-  let eventCount = 0;
-  let nextTest = () => {
-    if (++eventCount == 2) {
-      runNextTest();
+function waitForInstallDialog() {
+  return Task.spawn(function* () {
+    if (Preferences.get("xpinstall.customConfirmationUI", false)) {
+      yield waitForNotification("addon-install-confirmation");
+      return;
     }
-  }
-  wait_for_notification_close(nextTest);
-  BrowserTestUtils.removeTab(gBrowser.selectedTab).then(nextTest);
+
+    info("Waiting for install dialog");
+
+    yield new Promise(resolve => {
+      Services.wm.addListener({
+        onOpenWindow: function(aXULWindow) {
+          Services.wm.removeListener(this);
+          resolve();
+        },
+        onCloseWindow: function(aXULWindow) {
+        },
+        onWindowTitleChange: function(aXULWindow, aNewTitle) {
+        }
+      });
+    });
+    info("Install dialog opened, waiting for focus");
+
+    let domwindow = aXULWindow.QueryInterface(Ci.nsIInterfaceRequestor)
+                              .getInterface(Ci.nsIDOMWindow);
+    yield new Promise(resolve => {
+      waitForFocus(function() {
+        resolve();
+      }, domwindow);
+    });
+    info("Saw install dialog");
+    is(domwindow.document.location.href, XPINSTALL_URL, "Should have seen the right window open");
+
+    // Override the countdown timer on the accept button
+    let button = domwindow.document.documentElement.getButton("accept");
+    button.disabled = false;
+
+    return;
+  });
 }
 
-function accept_install_dialog() {
+function removeTab() {
+  return Promise.all([
+    waitForNotificationClose(),
+    BrowserTestUtils.removeTab(gBrowser.selectedTab)
+  ]);
+}
+
+function acceptInstallDialog() {
   if (Preferences.get("xpinstall.customConfirmationUI", false)) {
     document.getElementById("addon-install-confirmation-accept").click();
   } else {
     let win = Services.wm.getMostRecentWindow("Addons:Install");
     win.document.documentElement.acceptDialog();
   }
 }
 
-function cancel_install_dialog() {
+function cancelInstallDialog() {
   if (Preferences.get("xpinstall.customConfirmationUI", false)) {
     document.getElementById("addon-install-confirmation-cancel").click();
   } else {
     let win = Services.wm.getMostRecentWindow("Addons:Install");
     win.document.documentElement.cancelDialog();
   }
 }
 
-function wait_for_single_notification(aCallback) {
-  function inner_waiter() {
-    info("Waiting for single notification");
-    // Notification should never close while we wait
-    ok(PopupNotifications.isPanelOpen, "Notification should still be open");
-    if (PopupNotifications.panel.childNodes.length == 2) {
-      executeSoon(inner_waiter);
-      return;
+function waitForSingleNotification(aCallback) {
+  return Task.spawn(function* () {
+    while (PopupNotifications.panel.childNodes.length == 2) {
+      yield new Promise(resolve => executeSoon(resolve));
+
+      info("Waiting for single notification");
+      // Notification should never close while we wait
+      ok(PopupNotifications.isPanelOpen, "Notification should still be open");
     }
-
-    aCallback();
-  }
-
-  executeSoon(inner_waiter);
+  });
 }
 
-function setup_redirect(aSettings) {
+function setupRedirect(aSettings) {
   var url = "https://example.com/browser/toolkit/mozapps/extensions/test/xpinstall/redirect.sjs?mode=setup";
   for (var name in aSettings) {
     url += "&" + name + "=" + aSettings[name];
   }
 
   var req = new XMLHttpRequest();
   req.open("GET", url, false);
   req.send(null);
 }
 
-var TESTS = [
-function test_disabled_install() {
-  Services.prefs.setBoolPref("xpinstall.enabled", false);
+function getInstalls() {
+  return new Promise(resolve => {
+    AddonManager.getAllInstalls(installs => resolve(installs));
+  });
+}
 
-  // Wait for the disabled notification
-  wait_for_notification("xpinstall-disabled", function(aPanel) {
-    let notification = aPanel.childNodes[0];
+var TESTS = [
+function test_disabledInstall() {
+  return Task.spawn(function* () {
+    Services.prefs.setBoolPref("xpinstall.enabled", false);
+
+    let notificationPromise = waitForNotification("xpinstall-disabled");
+    let triggers = encodeURIComponent(JSON.stringify({
+      "XPI": "amosigned.xpi"
+    }));
+    BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    let panel = yield notificationPromise;
+
+    let notification = panel.childNodes[0];
     is(notification.button.label, "Enable", "Should have seen the right button");
     is(notification.getAttribute("label"),
        "Software installation is currently disabled. Click Enable and try again.");
 
-    wait_for_notification_close(function() {
-      try {
-        ok(Services.prefs.getBoolPref("xpinstall.enabled"), "Installation should be enabled");
-      }
-      catch (e) {
-        ok(false, "xpinstall.enabled should be set");
-      }
-
-      BrowserTestUtils.removeTab(gBrowser.selectedTab).then(() => {
-        AddonManager.getAllInstalls(function(aInstalls) {
-          is(aInstalls.length, 0, "Shouldn't be any pending installs");
-
-          runNextTest();
-        });
-      });
-    });
-
+    let closePromise = waitForNotificationClose();
     // Click on Enable
     EventUtils.synthesizeMouseAtCenter(notification.button, {});
-  });
+    yield closePromise;
 
-  var triggers = encodeURIComponent(JSON.stringify({
-    "XPI": "amosigned.xpi"
-  }));
-  BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    try {
+      ok(Services.prefs.getBoolPref("xpinstall.enabled"), "Installation should be enabled");
+    }
+    catch (e) {
+      ok(false, "xpinstall.enabled should be set");
+    }
+
+    yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
+    let installs = yield getInstalls();
+    is(installs.length, 0, "Shouldn't be any pending installs");
+  });
 },
 
-function test_blocked_install() {
-  // Wait for the blocked notification
-  wait_for_notification("addon-install-blocked", function(aPanel) {
-    let notification = aPanel.childNodes[0];
+function test_blockedInstall() {
+  return Task.spawn(function* () {
+    let notificationPromise = waitForNotification("addon-install-blocked");
+    let triggers = encodeURIComponent(JSON.stringify({
+      "XPI": "amosigned.xpi"
+    }));
+    BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    let panel = yield notificationPromise;
+
+    let notification = panel.childNodes[0];
     is(notification.button.label, "Allow", "Should have seen the right button");
     is(notification.getAttribute("origin"), "example.com",
        "Should have seen the right origin host");
     is(notification.getAttribute("label"),
        gApp + " prevented this site from asking you to install software on your computer.",
        "Should have seen the right message");
 
-    // Wait for the install confirmation dialog
-    wait_for_install_dialog(function() {
-      // Wait for the complete notification
-      wait_for_notification("addon-install-restart", function(aPanel) {
-        let notification = aPanel.childNodes[0];
-        is(notification.button.label, "Restart Now", "Should have seen the right button");
-        is(notification.getAttribute("label"),
-           "XPI Test will be installed after you restart " + gApp + ".",
-           "Should have seen the right message");
-
-        AddonManager.getAllInstalls(function(aInstalls) {
-        is(aInstalls.length, 1, "Should be one pending install");
-          aInstalls[0].cancel();
-
-          remove_tab_and_run_next_test();
-        });
-      });
-
-      accept_install_dialog();
-    });
-
+    let dialogPromise = waitForInstallDialog();
     // Click on Allow
     EventUtils.synthesizeMouse(notification.button, 20, 10, {});
-
     // Notification should have changed to progress notification
     ok(PopupNotifications.isPanelOpen, "Notification should still be open");
-    notification = aPanel.childNodes[0];
+    notification = panel.childNodes[0];
     is(notification.id, "addon-progress-notification", "Should have seen the progress notification");
-  });
+    yield dialogPromise;
+
+    notificationPromise = waitForNotification("addon-install-restart");
+    acceptInstallDialog();
+    panel = yield notificationPromise;
 
-  var triggers = encodeURIComponent(JSON.stringify({
-    "XPI": "amosigned.xpi"
-  }));
-  BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    notification = panel.childNodes[0];
+    is(notification.button.label, "Restart Now", "Should have seen the right button");
+    is(notification.getAttribute("label"),
+       "XPI Test will be installed after you restart " + gApp + ".",
+       "Should have seen the right message");
+
+    let installs = yield getInstalls();
+    is(installs.length, 1, "Should be one pending install");
+    installs[0].cancel();
+    yield removeTab();
+  });
 },
 
-function test_whitelisted_install() {
-  var originalTab = gBrowser.selectedTab;
-  var tab;
-
-  // Wait for the progress notification
-  wait_for_progress_notification(function(aPanel) {
+function test_whitelistedInstall() {
+  return Task.spawn(function* () {
+    let originalTab = gBrowser.selectedTab;
+    let tab;
     gBrowser.selectedTab = originalTab;
+    let pm = Services.perms;
+    pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
-    // Wait for the install confirmation dialog
-    wait_for_install_dialog(function() {
+    let progressPromise = waitForProgressNotification();
+    let dialogPromise = waitForInstallDialog();
+    let triggers = encodeURIComponent(JSON.stringify({
+      "XPI": "amosigned.xpi"
+    }));
+    BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?"
+      + triggers).then(newTab => tab = newTab);
+    yield progressPromise;
+    yield dialogPromise;
+    yield BrowserTestUtils.waitForCondition(() => !!tab, "tab should be present");
 
-      BrowserTestUtils.waitForCondition(() => !!tab, "tab should be present").then(() => {
-        is(gBrowser.selectedTab, tab,
-           "tab selected in response to the addon-install-confirmation notification");
+    is(gBrowser.selectedTab, tab,
+       "tab selected in response to the addon-install-confirmation notification");
 
-        // Wait for the complete notification
-        wait_for_notification("addon-install-restart", function(aPanel) {
-          let notification = aPanel.childNodes[0];
-          is(notification.button.label, "Restart Now", "Should have seen the right button");
-          is(notification.getAttribute("label"),
+    let notificationPromise = waitForNotification("addon-install-restart");
+    acceptInstallDialog();
+    let panel = yield notificationPromise;
+
+    let notification = panel.childNodes[0];
+    is(notification.button.label, "Restart Now", "Should have seen the right button");
+    is(notification.getAttribute("label"),
              "XPI Test will be installed after you restart " + gApp + ".",
              "Should have seen the right message");
 
-          AddonManager.getAllInstalls(function(aInstalls) {
-            is(aInstalls.length, 1, "Should be one pending install");
-            aInstalls[0].cancel();
-
-            Services.perms.remove(makeURI("http://example.com/"), "install");
-            remove_tab_and_run_next_test();
-          });
-        });
+    let installs = yield getInstalls();
+    is(installs.length, 1, "Should be one pending install");
+    installs[0].cancel();
 
-        accept_install_dialog();
-      });
-    });
+    Services.perms.remove(makeURI("http://example.com/"), "install");
+    yield removeTab();
   });
-
-  var pm = Services.perms;
-  pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
-
-  var triggers = encodeURIComponent(JSON.stringify({
-    "XPI": "amosigned.xpi"
-  }));
-
-  BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?"
-    + triggers).then(newTab => tab = newTab);
 },
 
-function test_failed_download() {
-  // Wait for the progress notification
-  wait_for_progress_notification(function(aPanel) {
-    // Wait for the failed notification
-    wait_for_notification("addon-install-failed", function(aPanel) {
-      let notification = aPanel.childNodes[0];
-      is(notification.getAttribute("label"),
-         "The add-on could not be downloaded because of a connection failure.",
-         "Should have seen the right message");
+function test_failedDownload() {
+  return Task.spawn(function* () {
+    let pm = Services.perms;
+    pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
-      Services.perms.remove(makeURI("http://example.com/"), "install");
-      remove_tab_and_run_next_test();
-    });
-  });
+    let progressPromise = waitForProgressNotification();
+    let failPromise = waitForNotification("addon-install-failed");
+    let triggers = encodeURIComponent(JSON.stringify({
+      "XPI": "missing.xpi"
+    }));
+    BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    yield progressPromise;
+    let panel = yield failPromise;
 
-  var pm = Services.perms;
-  pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
+    let notification = panel.childNodes[0];
+    is(notification.getAttribute("label"),
+       "The add-on could not be downloaded because of a connection failure.",
+       "Should have seen the right message");
 
-  var triggers = encodeURIComponent(JSON.stringify({
-    "XPI": "missing.xpi"
-  }));
-  BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    Services.perms.remove(makeURI("http://example.com/"), "install");
+    yield removeTab();
+  });
 },
 
-function test_corrupt_file() {
-  // Wait for the progress notification
-  wait_for_progress_notification(function(aPanel) {
-    // Wait for the failed notification
-    wait_for_notification("addon-install-failed", function(aPanel) {
-      let notification = aPanel.childNodes[0];
-      is(notification.getAttribute("label"),
-         "The add-on downloaded from this site could not be installed " +
-         "because it appears to be corrupt.",
-         "Should have seen the right message");
+function test_corruptFile() {
+  return Task.spawn(function* () {
+    let pm = Services.perms;
+    pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
-      Services.perms.remove(makeURI("http://example.com/"), "install");
-      remove_tab_and_run_next_test();
-    });
-  });
+    let progressPromise = waitForProgressNotification();
+    let failPromise = waitForNotification("addon-install-failed");
+    let triggers = encodeURIComponent(JSON.stringify({
+      "XPI": "corrupt.xpi"
+    }));
+    BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    yield progressPromise;
+    let panel = yield failPromise;
 
-  var pm = Services.perms;
-  pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
+    let notification = panel.childNodes[0];
+    is(notification.getAttribute("label"),
+       "The add-on downloaded from this site could not be installed " +
+       "because it appears to be corrupt.",
+       "Should have seen the right message");
 
-  var triggers = encodeURIComponent(JSON.stringify({
-    "XPI": "corrupt.xpi"
-  }));
-  BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    Services.perms.remove(makeURI("http://example.com/"), "install");
+    yield removeTab();
+  });
 },
 
 function test_incompatible() {
-  // Wait for the progress notification
-  wait_for_progress_notification(function(aPanel) {
-    // Wait for the failed notification
-    wait_for_notification("addon-install-failed", function(aPanel) {
-      let notification = aPanel.childNodes[0];
-      is(notification.getAttribute("label"),
-         "XPI Test could not be installed because it is not compatible with " +
-         gApp + " " + gVersion + ".",
-         "Should have seen the right message");
+  return Task.spawn(function* () {
+    let pm = Services.perms;
+    pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
-      Services.perms.remove(makeURI("http://example.com/"), "install");
-      remove_tab_and_run_next_test();
-    });
-  });
+    let progressPromise = waitForProgressNotification();
+    let failPromise = waitForNotification("addon-install-failed");
+    let triggers = encodeURIComponent(JSON.stringify({
+      "XPI": "incompatible.xpi"
+    }));
+    BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    yield progressPromise;
+    let panel = yield failPromise;
 
-  var pm = Services.perms;
-  pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
+    let notification = panel.childNodes[0];
+    is(notification.getAttribute("label"),
+       "XPI Test could not be installed because it is not compatible with " +
+       gApp + " " + gVersion + ".",
+       "Should have seen the right message");
 
-  var triggers = encodeURIComponent(JSON.stringify({
-    "XPI": "incompatible.xpi"
-  }));
-  BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    Services.perms.remove(makeURI("http://example.com/"), "install");
+    yield removeTab();
+  });
 },
 
 function test_restartless() {
-  // Wait for the progress notification
-  wait_for_progress_notification(function(aPanel) {
-    // Wait for the install confirmation dialog
-    wait_for_install_dialog(function() {
-      // Wait for the complete notification
-      wait_for_notification("addon-install-complete", function(aPanel) {
-        let notification = aPanel.childNodes[0];
-        is(notification.getAttribute("label"),
-           "XPI Test has been installed successfully.",
-           "Should have seen the right message");
+  return Task.spawn(function* () {
+    let pm = Services.perms;
+    pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
-        AddonManager.getAllInstalls(function(aInstalls) {
-          is(aInstalls.length, 0, "Should be no pending installs");
+    let progressPromise = waitForProgressNotification();
+    let dialogPromise = waitForInstallDialog();
+    let triggers = encodeURIComponent(JSON.stringify({
+      "XPI": "restartless.xpi"
+    }));
+    gBrowser.selectedTab = gBrowser.addTab();
+    gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
+    yield progressPromise;
+    yield dialogPromise;
 
-          AddonManager.getAddonByID("restartless-xpi@tests.mozilla.org", function(aAddon) {
-            aAddon.uninstall();
+    let notificationPromise = waitForNotification("addon-install-complete");
+    acceptInstallDialog();
+    let panel = yield notificationPromise;
 
-            Services.perms.remove(makeURI("http://example.com/"), "install");
-            wait_for_notification_close(runNextTest);
-            gBrowser.removeTab(gBrowser.selectedTab);
-          });
-        });
+    let notification = panel.childNodes[0];
+    is(notification.getAttribute("label"),
+       "XPI Test has been installed successfully.",
+       "Should have seen the right message");
+
+    let installs = yield getInstalls();
+    is(installs.length, 0, "Should be no pending installs");
+
+    let addon = yield new Promise(resolve => {
+      AddonManager.getAddonByID("restartless-xpi@tests.mozilla.org", addon => {
+        resolve(addon);
       });
+    });
+    addon.uninstall();
 
-      accept_install_dialog();
-    });
+    Services.perms.remove(makeURI("http://example.com/"), "install");
+
+    let closePromise = waitForNotificationClose();
+    gBrowser.removeTab(gBrowser.selectedTab);
+    yield closePromise;
   });
-
-  var pm = Services.perms;
-  pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
-
-  var triggers = encodeURIComponent(JSON.stringify({
-    "XPI": "restartless.xpi"
-  }));
-  gBrowser.selectedTab = gBrowser.addTab();
-  gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
 },
 
 function test_multiple() {
-  // Wait for the progress notification
-  wait_for_progress_notification(function(aPanel) {
-    // Wait for the install confirmation dialog
-    wait_for_install_dialog(function() {
-      // Wait for the complete notification
-      wait_for_notification("addon-install-restart", function(aPanel) {
-        let notification = aPanel.childNodes[0];
-        is(notification.button.label, "Restart Now", "Should have seen the right button");
-        is(notification.getAttribute("label"),
-           "2 add-ons will be installed after you restart " + gApp + ".",
-           "Should have seen the right message");
+  return Task.spawn(function* () {
+    let pm = Services.perms;
+    pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
-        AddonManager.getAllInstalls(function(aInstalls) {
-          is(aInstalls.length, 1, "Should be one pending install");
-          aInstalls[0].cancel();
+    let progressPromise = waitForProgressNotification();
+    let dialogPromise = waitForInstallDialog();
+    let triggers = encodeURIComponent(JSON.stringify({
+      "Unsigned XPI": "amosigned.xpi",
+      "Restartless XPI": "restartless.xpi"
+    }));
+    BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    let panel = yield progressPromise;
+    yield dialogPromise;
 
-          AddonManager.getAddonByID("restartless-xpi@tests.mozilla.org", function(aAddon) {
-            aAddon.uninstall();
+    let notificationPromise = waitForNotification("addon-install-restart");
+    acceptInstallDialog();
+    yield notificationPromise;
 
-            Services.perms.remove(makeURI("http://example.com/"), "install");
-            remove_tab_and_run_next_test();
-          });
-        });
+    let notification = panel.childNodes[0];
+    is(notification.button.label, "Restart Now", "Should have seen the right button");
+    is(notification.getAttribute("label"),
+       "2 add-ons will be installed after you restart " + gApp + ".",
+       "Should have seen the right message");
+
+    let installs = yield getInstalls();
+    is(installs.length, 1, "Should be one pending install");
+    installs[0].cancel();
+
+    let addon = yield new Promise(resolve => {
+      AddonManager.getAddonByID("restartless-xpi@tests.mozilla.org", function (addon) {
+        resolve(addon);
       });
-
-      accept_install_dialog();
     });
+    addon.uninstall();
+    Services.perms.remove(makeURI("http://example.com/"), "install");
+    yield removeTab();
   });
-
-  var pm = Services.perms;
-  pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
-
-  var triggers = encodeURIComponent(JSON.stringify({
-    "Unsigned XPI": "amosigned.xpi",
-    "Restartless XPI": "restartless.xpi"
-  }));
-  BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
 },
 
 function test_sequential() {
-  // This test is only relevant if using the new doorhanger UI
-  if (!Preferences.get("xpinstall.customConfirmationUI", false)) {
-    runNextTest();
-    return;
-  }
-
-  // Wait for the progress notification
-  wait_for_progress_notification(function(aPanel) {
-    // Wait for the install confirmation dialog
-    wait_for_install_dialog(function() {
-      // Wait for the progress notification
-
-      // Should see the right add-on
-      let container = document.getElementById("addon-install-confirmation-content");
-      is(container.childNodes.length, 1, "Should be one item listed");
-      is(container.childNodes[0].firstChild.getAttribute("value"), "XPI Test", "Should have the right add-on");
+  return Task.spawn(function* () {
+    // This test is only relevant if using the new doorhanger UI
+    if (!Preferences.get("xpinstall.customConfirmationUI", false)) {
+      return;
+    }
+    let pm = Services.perms;
+    pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
-      wait_for_progress_notification(function(aPanel) {
-        // Should still have the right add-on in the confirmation notification
-        is(container.childNodes.length, 1, "Should be one item listed");
-        is(container.childNodes[0].firstChild.getAttribute("value"), "XPI Test", "Should have the right add-on");
+    let progressPromise = waitForProgressNotification();
+    let dialogPromise = waitForInstallDialog();
+    let triggers = encodeURIComponent(JSON.stringify({
+      "Restartless XPI": "restartless.xpi"
+    }));
+    BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    yield progressPromise;
+    yield dialogPromise;
 
-        // Wait for the install to complete, we won't see a new confirmation
-        // notification
-        Services.obs.addObserver(function observer() {
-          Services.obs.removeObserver(observer, "addon-install-confirmation");
+    // Should see the right add-on
+    let container = document.getElementById("addon-install-confirmation-content");
+    is(container.childNodes.length, 1, "Should be one item listed");
+    is(container.childNodes[0].firstChild.getAttribute("value"), "XPI Test", "Should have the right add-on");
 
-          // Make sure browser-addons.js executes first
-          executeSoon(function () {
-            // Should have dropped the progress notification
-            is(PopupNotifications.panel.childNodes.length, 1, "Should be the right number of notifications");
-            is(PopupNotifications.panel.childNodes[0].id, "addon-install-confirmation-notification",
-               "Should only be showing one install confirmation");
+    progressPromise = waitForProgressNotification(true, 2);
+    triggers = encodeURIComponent(JSON.stringify({
+      "Theme XPI": "theme.xpi"
+    }));
+    gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
+    yield progressPromise;
+
+    // Should still have the right add-on in the confirmation notification
+    is(container.childNodes.length, 1, "Should be one item listed");
+    is(container.childNodes[0].firstChild.getAttribute("value"), "XPI Test", "Should have the right add-on");
 
-            // Should still have the right add-on in the confirmation notification
-            is(container.childNodes.length, 1, "Should be one item listed");
-            is(container.childNodes[0].firstChild.getAttribute("value"), "XPI Test", "Should have the right add-on");
-
-            cancel_install_dialog();
+    // Wait for the install to complete, we won't see a new confirmation
+    // notification
+    yield new Promise(resolve => {
+      Services.obs.addObserver(function observer() {
+        Services.obs.removeObserver(observer, "addon-install-confirmation");
+        resolve();
+      }, "addon-install-confirmation", false);
+    });
 
-            ok(PopupNotifications.isPanelOpen, "Panel should still be open");
-            is(PopupNotifications.panel.childNodes.length, 1, "Should be the right number of notifications");
-            is(PopupNotifications.panel.childNodes[0].id, "addon-install-confirmation-notification",
-               "Should still have an install confirmation open");
+    // Make sure browser-addons.js executes first
+    yield new Promise(resolve => executeSoon(resolve));
 
-            // Should have the next add-on's confirmation dialog
-            is(container.childNodes.length, 1, "Should be one item listed");
-            is(container.childNodes[0].firstChild.getAttribute("value"), "Theme Test", "Should have the right add-on");
-
-            Services.perms.remove(makeURI("http://example.com"), "install");
-            wait_for_notification_close(() => {
-              BrowserTestUtils.removeTab(gBrowser.selectedTab).then(runNextTest);
-            });
+    // Should have dropped the progress notification
+    is(PopupNotifications.panel.childNodes.length, 1, "Should be the right number of notifications");
+    is(PopupNotifications.panel.childNodes[0].id, "addon-install-confirmation-notification",
+       "Should only be showing one install confirmation");
 
-            cancel_install_dialog();
-          });
-        }, "addon-install-confirmation", false);
-      }, 2);
+    // Should still have the right add-on in the confirmation notification
+    is(container.childNodes.length, 1, "Should be one item listed");
+    is(container.childNodes[0].firstChild.getAttribute("value"), "XPI Test", "Should have the right add-on");
+
+    cancelInstallDialog();
+
+    ok(PopupNotifications.isPanelOpen, "Panel should still be open");
+    is(PopupNotifications.panel.childNodes.length, 1, "Should be the right number of notifications");
+    is(PopupNotifications.panel.childNodes[0].id, "addon-install-confirmation-notification",
+       "Should still have an install confirmation open");
 
-      var triggers = encodeURIComponent(JSON.stringify({
-        "Theme XPI": "theme.xpi"
-      }));
-      gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
-    });
-  });
+    // Should have the next add-on's confirmation dialog
+    is(container.childNodes.length, 1, "Should be one item listed");
+    is(container.childNodes[0].firstChild.getAttribute("value"), "Theme Test", "Should have the right add-on");
 
-  var pm = Services.perms;
-  pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
-
-  var triggers = encodeURIComponent(JSON.stringify({
-    "Restartless XPI": "restartless.xpi"
-  }));
-  BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    Services.perms.remove(makeURI("http://example.com"), "install");
+    let closePromise = waitForNotificationClose();
+    cancelInstallDialog();
+    yield closePromise;
+    yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
+  });
 },
 
-function test_someunverified() {
-  // This test is only relevant if using the new doorhanger UI and allowing
-  // unsigned add-ons
-  if (!Preferences.get("xpinstall.customConfirmationUI", false) ||
-      Preferences.get("xpinstall.signatures.required", true) ||
-      REQUIRE_SIGNING) {
-    runNextTest();
-    return;
-  }
+function test_someUnverified() {
+  return Task.spawn(function* () {
+    // This test is only relevant if using the new doorhanger UI and allowing
+    // unsigned add-ons
+    if (!Preferences.get("xpinstall.customConfirmationUI", false) ||
+        Preferences.get("xpinstall.signatures.required", true) ||
+        REQUIRE_SIGNING) {
+      return;
+    }
+    let pm = Services.perms;
+    pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
-  // Wait for the progress notification
-  wait_for_progress_notification(function(aPanel) {
-    // Wait for the install confirmation dialog
-    wait_for_install_dialog(function() {
-      let notification = document.getElementById("addon-install-confirmation-notification");
-      let message = notification.getAttribute("label");
-      is(message, "Caution: This site would like to install 2 add-ons in " + gApp +
-         ", some of which are unverified. Proceed at your own risk.",
-         "Should see the right message");
+    let progressPromise = waitForProgressNotification();
+    let dialogPromise = waitForInstallDialog();
+    let triggers = encodeURIComponent(JSON.stringify({
+      "Extension XPI": "restartless-unsigned.xpi",
+      "Theme XPI": "theme.xpi"
+    }));
+    BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    yield progressPromise;
+    yield dialogPromise;
 
-      let container = document.getElementById("addon-install-confirmation-content");
-      is(container.childNodes.length, 2, "Should be two items listed");
-      is(container.childNodes[0].firstChild.getAttribute("value"), "XPI Test", "Should have the right add-on");
-      is(container.childNodes[0].lastChild.getAttribute("class"),
-         "addon-install-confirmation-unsigned", "Should have the unverified marker");
-      is(container.childNodes[1].firstChild.getAttribute("value"), "Theme Test", "Should have the right add-on");
-      is(container.childNodes[1].childNodes.length, 1, "Shouldn't have the unverified marker");
+    let notification = document.getElementById("addon-install-confirmation-notification");
+    let message = notification.getAttribute("label");
+    is(message, "Caution: This site would like to install 2 add-ons in " + gApp +
+       ", some of which are unverified. Proceed at your own risk.",
+       "Should see the right message");
 
-      // Wait for the complete notification
-      wait_for_notification("addon-install-restart", function(aPanel) {
-        AddonManager.getAddonsByIDs(["restartless-xpi@tests.mozilla.org",
-                                     "theme-xpi@tests.mozilla.org"], function([a, t]) {
-          a.uninstall();
-          // Installing a new theme tries to switch to it, switch back to the
-          // default theme.
-          t.userDisabled = true;
-          t.uninstall();
+    let container = document.getElementById("addon-install-confirmation-content");
+    is(container.childNodes.length, 2, "Should be two items listed");
+    is(container.childNodes[0].firstChild.getAttribute("value"), "XPI Test", "Should have the right add-on");
+    is(container.childNodes[0].lastChild.getAttribute("class"),
+       "addon-install-confirmation-unsigned", "Should have the unverified marker");
+    is(container.childNodes[1].firstChild.getAttribute("value"), "Theme Test", "Should have the right add-on");
+    is(container.childNodes[1].childNodes.length, 1, "Shouldn't have the unverified marker");
 
-          Services.perms.remove(makeURI("http://example.com/"), "install");
-          remove_tab_and_run_next_test();
-        });
+    let notificationPromise = waitForNotification("addon-install-restart");
+    acceptInstallDialog();
+    yield notificationPromise;
+
+    let [addon, theme] = yield new Promise(resolve => {
+      AddonManager.getAddonsByIDs(["restartless-xpi@tests.mozilla.org",
+                                  "theme-xpi@tests.mozilla.org"],
+                                  function(addons) {
+        resolve(addons);
       });
-
-      accept_install_dialog();
     });
-  });
+    addon.uninstall();
+    // Installing a new theme tries to switch to it, switch back to the
+    // default theme.
+    theme.userDisabled = true;
+    theme.uninstall();
 
-  var pm = Services.perms;
-  pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
-
-  var triggers = encodeURIComponent(JSON.stringify({
-    "Extension XPI": "restartless-unsigned.xpi",
-    "Theme XPI": "theme.xpi"
-  }));
-  BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    Services.perms.remove(makeURI("http://example.com/"), "install");
+    yield removeTab();
+  });
 },
 
-function test_allunverified() {
-  // This test is only relevant if using the new doorhanger UI and allowing
-  // unsigned add-ons
-  if (!Preferences.get("xpinstall.customConfirmationUI", false) ||
-      Preferences.get("xpinstall.signatures.required", true) ||
-      REQUIRE_SIGNING) {
-    runNextTest();
-    return;
-  }
+function test_allUnverified() {
+  return Task.spawn(function* () {
+    // This test is only relevant if using the new doorhanger UI and allowing
+    // unsigned add-ons
+    if (!Preferences.get("xpinstall.customConfirmationUI", false) ||
+        Preferences.get("xpinstall.signatures.required", true) ||
+        REQUIRE_SIGNING) {
+      return;
+    }
+    let pm = Services.perms;
+    pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
-  // Wait for the progress notification
-  wait_for_progress_notification(function(aPanel) {
-    // Wait for the install confirmation dialog
-    wait_for_install_dialog(function() {
-      let notification = document.getElementById("addon-install-confirmation-notification");
-      let message = notification.getAttribute("label");
-      is(message, "Caution: This site would like to install an unverified add-on in " + gApp + ". Proceed at your own risk.");
+    let progressPromise = waitForProgressNotification();
+    let dialogPromise = waitForInstallDialog();
+    let triggers = encodeURIComponent(JSON.stringify({
+      "Extension XPI": "restartless-unsigned.xpi"
+    }));
+    BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    yield progressPromise;
+    yield dialogPromise;
 
-      let container = document.getElementById("addon-install-confirmation-content");
-      is(container.childNodes.length, 1, "Should be one item listed");
-      is(container.childNodes[0].firstChild.getAttribute("value"), "XPI Test", "Should have the right add-on");
-      is(container.childNodes[0].childNodes.length, 1, "Shouldn't have the unverified marker");
+    let notification = document.getElementById("addon-install-confirmation-notification");
+    let message = notification.getAttribute("label");
+    is(message, "Caution: This site would like to install an unverified add-on in " + gApp + ". Proceed at your own risk.");
 
-      // Wait for the complete notification
-      wait_for_notification("addon-install-complete", function(aPanel) {
-        AddonManager.getAddonByID("restartless-xpi@tests.mozilla.org", function(aAddon) {
-          aAddon.uninstall();
+    let container = document.getElementById("addon-install-confirmation-content");
+    is(container.childNodes.length, 1, "Should be one item listed");
+    is(container.childNodes[0].firstChild.getAttribute("value"), "XPI Test", "Should have the right add-on");
+    is(container.childNodes[0].childNodes.length, 1, "Shouldn't have the unverified marker");
 
-          Services.perms.remove(makeURI("http://example.com/"), "install");
-          remove_tab_and_run_next_test();
-        });
+    let notificationPromise = waitForNotification("addon-install-complete");
+    acceptInstallDialog();
+    yield notificationPromise;
+
+    let addon = yield new Promise(resolve => {
+      AddonManager.getAddonByID("restartless-xpi@tests.mozilla.org", function(addon) {
+        resolve(addon);
       });
+    });
+    addon.uninstall();
 
-      accept_install_dialog();
-    });
+    Services.perms.remove(makeURI("http://example.com/"), "install");
+    yield removeTab();
   });
-
-  var pm = Services.perms;
-  pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
-
-  var triggers = encodeURIComponent(JSON.stringify({
-    "Extension XPI": "restartless-unsigned.xpi"
-  }));
-  BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
 },
 
 function test_url() {
-  // Wait for the progress notification
-  wait_for_progress_notification(function(aPanel) {
-    // Wait for the install confirmation dialog
-    wait_for_install_dialog(function() {
-      // Wait for the complete notification
-      wait_for_notification("addon-install-restart", function(aPanel) {
-        let notification = aPanel.childNodes[0];
-        is(notification.button.label, "Restart Now", "Should have seen the right button");
-        is(notification.getAttribute("label"),
-           "XPI Test will be installed after you restart " + gApp + ".",
-           "Should have seen the right message");
+  return Task.spawn(function* () {
+    let progressPromise = waitForProgressNotification();
+    let dialogPromise = waitForInstallDialog();
+    gBrowser.selectedTab = gBrowser.addTab("about:blank");
+    yield BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
+    gBrowser.loadURI(TESTROOT + "amosigned.xpi");
+    yield progressPromise;
+    yield dialogPromise;
 
-        AddonManager.getAllInstalls(function(aInstalls) {
-          is(aInstalls.length, 1, "Should be one pending install");
-          aInstalls[0].cancel();
-
-          remove_tab_and_run_next_test();
-        });
-      });
+    let notificationPromise = waitForNotification("addon-install-restart");
+    acceptInstallDialog();
+    let panel = yield notificationPromise;
 
-      accept_install_dialog();
-    });
-  });
+    let notification = panel.childNodes[0];
+    is(notification.button.label, "Restart Now", "Should have seen the right button");
+    is(notification.getAttribute("label"),
+       "XPI Test will be installed after you restart " + gApp + ".",
+       "Should have seen the right message");
 
-  gBrowser.selectedTab = gBrowser.addTab("about:blank");
-  BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser).then(() => {
-    gBrowser.loadURI(TESTROOT + "amosigned.xpi");
+    let installs = yield getInstalls();
+    is(installs.length, 1, "Should be one pending install");
+    installs[0].cancel();
+
+    yield removeTab();
   });
 },
 
-function test_localfile() {
-  // Wait for the install to fail
-  Services.obs.addObserver(function() {
-    Services.obs.removeObserver(arguments.callee, "addon-install-failed");
+function test_localFile() {
+  return Task.spawn(function* () {
+    let cr = Components.classes["@mozilla.org/chrome/chrome-registry;1"]
+                       .getService(Components.interfaces.nsIChromeRegistry);
+    let path;
+    try {
+      path = cr.convertChromeURL(makeURI(CHROMEROOT + "corrupt.xpi")).spec;
+    } catch (ex) {
+      path = CHROMEROOT + "corrupt.xpi";
+    }
+
+    let failPromise = new Promise(resolve => {
+      Services.obs.addObserver(function observer() {
+        Services.obs.removeObserver(observer, "addon-install-failed");
+        resolve();
+      }, "addon-install-failed", false);
+    });
+    gBrowser.selectedTab = gBrowser.addTab("about:blank");
+    yield BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
+    gBrowser.loadURI(path);
+    yield failPromise;
 
     // Wait for the browser code to add the failure notification
-    wait_for_single_notification(function() {
-      let notification = PopupNotifications.panel.childNodes[0];
-      is(notification.id, "addon-install-failed-notification", "Should have seen the install fail");
-      is(notification.getAttribute("label"),
-         "This add-on could not be installed because it appears to be corrupt.",
-         "Should have seen the right message");
-
-      remove_tab_and_run_next_test();
-    });
-  }, "addon-install-failed", false);
+    yield waitForSingleNotification();
 
-  var cr = Components.classes["@mozilla.org/chrome/chrome-registry;1"]
-                     .getService(Components.interfaces.nsIChromeRegistry);
-  try {
-    var path = cr.convertChromeURL(makeURI(CHROMEROOT + "corrupt.xpi")).spec;
-  } catch (ex) {
+    let notification = PopupNotifications.panel.childNodes[0];
+    is(notification.id, "addon-install-failed-notification", "Should have seen the install fail");
+    is(notification.getAttribute("label"),
+       "This add-on could not be installed because it appears to be corrupt.",
+       "Should have seen the right message");
+
+    yield removeTab();
+  });
     path = CHROMEROOT + "corrupt.xpi";
-  }
-  gBrowser.selectedTab = gBrowser.addTab("about:blank");
-  BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser).then(() => {
-    gBrowser.loadURI(path);
-  });
 },
 
-function test_tabclose() {
-  if (!Preferences.get("xpinstall.customConfirmationUI", false)) {
-    runNextTest();
-    return;
-  }
-
-  // Wait for the progress notification
-  wait_for_progress_notification(aPanel => {
-    // Wait for the install confirmation dialog
-    wait_for_install_dialog(() => {
-      AddonManager.getAllInstalls(aInstalls => {
-        is(aInstalls.length, 1, "Should be one pending install");
+function test_tabClose() {
+  return Task.spawn(function* () {
+    if (!Preferences.get("xpinstall.customConfirmationUI", false)) {
+      runNextTest();
+      return;
+    }
 
-        let eventCount = 0;
-        let nextTest = () => {
-          if (++eventCount == 2) {
-            runNextTest();
-          }
-        }
+    let progressPromise = waitForProgressNotification();
+    let dialogPromise = waitForInstallDialog();
+    gBrowser.selectedTab = gBrowser.addTab("about:blank");
+    yield BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
+    gBrowser.loadURI(TESTROOT + "amosigned.xpi");
+    yield progressPromise;
+    yield dialogPromise;
 
-        wait_for_notification_close(() => {
-          AddonManager.getAllInstalls(aInstalls => {
-            is(aInstalls.length, 0, "Should be no pending install since the tab is closed");
-            nextTest();
-          });
-        });
+    let installs = yield getInstalls();
+    is(installs.length, 1, "Should be one pending install");
 
-        BrowserTestUtils.removeTab(gBrowser.selectedTab).then(nextTest);
-      });
-    });
-  });
+    let closePromise = waitForNotificationClose();
+    yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
+    yield closePromise;
 
-  gBrowser.selectedTab = gBrowser.addTab("about:blank");
-  BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser).then(() => {
-    gBrowser.loadURI(TESTROOT + "amosigned.xpi");
+    installs = yield getInstalls();
+    is(installs.length, 0, "Should be no pending install since the tab is closed");
   });
 },
 
 // Add-ons should be cancelled and the install notification destroyed when
 // navigating to a new origin
-function test_tabnavigate() {
-  if (!Preferences.get("xpinstall.customConfirmationUI", false)) {
-    runNextTest();
-    return;
-  }
-
-  // Wait for the progress notification
-  wait_for_progress_notification(aPanel => {
-    // Wait for the install confirmation dialog
-    wait_for_install_dialog(() => {
-      wait_for_notification_close(() => {
-        AddonManager.getAllInstalls(aInstalls => {
-          is(aInstalls.length, 0, "Should be no pending install");
+function test_tabNavigate() {
+  return Task.spawn(function* () {
+    if (!Preferences.get("xpinstall.customConfirmationUI", false)) {
+      return;
+    }
+    let pm = Services.perms;
+    pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
-          Services.perms.remove(makeURI("http://example.com/"), "install");
-          loadPromise.then(() => {
-            BrowserTestUtils.removeTab(gBrowser.selectedTab).then(runNextTest);
-          });
-        });
-      });
+    let progressPromise = waitForProgressNotification();
+    let dialogPromise = waitForInstallDialog();
+    let triggers = encodeURIComponent(JSON.stringify({
+      "Extension XPI": "amosigned.xpi"
+    }));
+    BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    yield progressPromise;
+    yield dialogPromise;
 
-      let loadPromise = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
-      gBrowser.loadURI("about:blank");
-    });
-  });
+    let closePromise = waitForNotificationClose();
+    let loadPromise = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
+    gBrowser.loadURI("about:blank");
+    yield closePromise;
 
-  var pm = Services.perms;
-  pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
+    let installs = yield getInstalls();
+    is(installs.length, 0, "Should be no pending install");
 
-  var triggers = encodeURIComponent(JSON.stringify({
-    "Extension XPI": "amosigned.xpi"
-  }));
-  BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    Services.perms.remove(makeURI("http://example.com/"), "install");
+    yield loadPromise;
+    yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
+  });
 },
 
-function test_urlbar() {
-  wait_for_notification("addon-install-origin-blocked", function(aPanel) {
-    let notification = aPanel.childNodes[0];
-
-    is(notification.button.label, "", "Button to allow install should be hidden.");
-
-    remove_tab_and_run_next_test();
-  });
-
-  gBrowser.selectedTab = gBrowser.addTab("about:blank");
-  BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser).then(() => {
+function test_urlBar() {
+  return Task.spawn(function* () {
+    let notificationPromise = waitForNotification("addon-install-origin-blocked");
+    gBrowser.selectedTab = gBrowser.addTab("about:blank");
+    yield BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
     gURLBar.value = TESTROOT + "amosigned.xpi";
     gURLBar.focus();
     EventUtils.synthesizeKey("VK_RETURN", {});
+    let panel = yield notificationPromise;
+
+    let notification = panel.childNodes[0];
+    is(notification.button.label, "", "Button to allow install should be hidden.");
+    yield removeTab();
   });
 },
 
-function test_wronghost() {
-  gBrowser.selectedTab = gBrowser.addTab();
+function test_wrongHost() {
+  return Task.spawn(function* () {
+    let requestedUrl = TESTROOT2 + "enabled.html";
+    gBrowser.selectedTab = gBrowser.addTab();
+
+    let loadedPromise = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser, false, requestedUrl);
+    gBrowser.loadURI(TESTROOT2 + "enabled.html");
+    yield loadedPromise;
 
-  let requestedUrl = TESTROOT2 + "enabled.html";
-  BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser, false, requestedUrl).then(() => {
-    // Wait for the progress notification
-    wait_for_progress_notification(function(aPanel) {
-      // Wait for the complete notification
-      wait_for_notification("addon-install-failed", function(aPanel) {
-        let notification = aPanel.childNodes[0];
-        is(notification.getAttribute("label"),
-           "The add-on downloaded from this site could not be installed " +
-           "because it appears to be corrupt.",
-           "Should have seen the right message");
+    let progressPromise = waitForProgressNotification();
+    let notificationPromise = waitForNotification("addon-install-failed");
+    gBrowser.loadURI(TESTROOT + "corrupt.xpi");
+    yield progressPromise;
+    let panel = yield notificationPromise;
 
-        remove_tab_and_run_next_test();
-      });
-    });
+    let notification = panel.childNodes[0];
+    is(notification.getAttribute("label"),
+       "The add-on downloaded from this site could not be installed " +
+       "because it appears to be corrupt.",
+       "Should have seen the right message");
 
-    gBrowser.loadURI(TESTROOT + "corrupt.xpi");
+    yield removeTab();
   });
-  gBrowser.loadURI(TESTROOT2 + "enabled.html");
 },
 
 function test_reload() {
-  // Wait for the progress notification
-  wait_for_progress_notification(function(aPanel) {
-    // Wait for the install confirmation dialog
-    wait_for_install_dialog(function() {
-      // Wait for the complete notification
-      wait_for_notification("addon-install-restart", function(aPanel) {
-        let notification = aPanel.childNodes[0];
-        is(notification.button.label, "Restart Now", "Should have seen the right button");
-        is(notification.getAttribute("label"),
-           "XPI Test will be installed after you restart " + gApp + ".",
-           "Should have seen the right message");
+  return Task.spawn(function* () {
+    let pm = Services.perms;
+    pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
-        function test_fail() {
-          ok(false, "Reloading should not have hidden the notification");
-        }
+    let progressPromise = waitForProgressNotification();
+    let dialogPromise = waitForInstallDialog();
+    let triggers = encodeURIComponent(JSON.stringify({
+      "Unsigned XPI": "amosigned.xpi"
+    }));
+    BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    yield progressPromise;
+    yield dialogPromise;
 
-        PopupNotifications.panel.addEventListener("popuphiding", test_fail, false);
-
-        let requestedUrl = TESTROOT2 + "enabled.html";
-        BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser, false, requestedUrl).then(() => {
-          PopupNotifications.panel.removeEventListener("popuphiding", test_fail, false);
+    let notificationPromise = waitForNotification("addon-install-restart");
+    acceptInstallDialog();
+    let panel = yield notificationPromise;
 
-          AddonManager.getAllInstalls(function(aInstalls) {
-            is(aInstalls.length, 1, "Should be one pending install");
-            aInstalls[0].cancel();
-
-            Services.perms.remove(makeURI("http://example.com/"), "install");
-            remove_tab_and_run_next_test();
-          });
-        });
-        gBrowser.loadURI(TESTROOT2 + "enabled.html");
-      });
+    let notification = panel.childNodes[0];
+    is(notification.button.label, "Restart Now", "Should have seen the right button");
+    is(notification.getAttribute("label"),
+       "XPI Test will be installed after you restart " + gApp + ".",
+       "Should have seen the right message");
 
-      accept_install_dialog();
-    });
-  });
+    function testFail() {
+      ok(false, "Reloading should not have hidden the notification");
+    }
+    PopupNotifications.panel.addEventListener("popuphiding", testFail, false);
+    let requestedUrl = TESTROOT2 + "enabled.html";
+    let loadedPromise = BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser, false, requestedUrl);
+    gBrowser.loadURI(TESTROOT2 + "enabled.html");
+    yield loadedPromise;
+    PopupNotifications.panel.removeEventListener("popuphiding", testFail, false);
 
-  var pm = Services.perms;
-  pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
+    let installs = yield getInstalls();
+    is(installs.length, 1, "Should be one pending install");
+    installs[0].cancel();
 
-  var triggers = encodeURIComponent(JSON.stringify({
-    "Unsigned XPI": "amosigned.xpi"
-  }));
-  BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    Services.perms.remove(makeURI("http://example.com/"), "install");
+    yield removeTab();
+  });
 },
 
 function test_theme() {
-  // Wait for the progress notification
-  wait_for_progress_notification(function(aPanel) {
-    // Wait for the install confirmation dialog
-    wait_for_install_dialog(function() {
-      // Wait for the complete notification
-      wait_for_notification("addon-install-restart", function(aPanel) {
-        let notification = aPanel.childNodes[0];
-        is(notification.button.label, "Restart Now", "Should have seen the right button");
-        is(notification.getAttribute("label"),
-           "Theme Test will be installed after you restart " + gApp + ".",
-           "Should have seen the right message");
+  return Task.spawn(function* () {
+    let pm = Services.perms;
+    pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
-        AddonManager.getAddonByID("{972ce4c6-7e08-4474-a285-3208198ce6fd}", function(aAddon) {
-          ok(aAddon.userDisabled, "Should be switching away from the default theme.");
-          // Undo the pending theme switch
-          aAddon.userDisabled = false;
+    let progressPromise = waitForProgressNotification();
+    let dialogPromise = waitForInstallDialog();
+    let triggers = encodeURIComponent(JSON.stringify({
+      "Theme XPI": "theme.xpi"
+    }));
+    BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    yield progressPromise;
+    yield dialogPromise;
+
+    let notificationPromise = waitForNotification("addon-install-restart");
+    acceptInstallDialog();
+    let panel = yield notificationPromise;
 
-          AddonManager.getAddonByID("theme-xpi@tests.mozilla.org", function(aAddon) {
-            isnot(aAddon, null, "Test theme will have been installed");
-            aAddon.uninstall();
-
-            Services.perms.remove(makeURI("http://example.com/"), "install");
-            remove_tab_and_run_next_test();
-          });
-        });
-      });
+    let notification = panel.childNodes[0];
+    is(notification.button.label, "Restart Now", "Should have seen the right button");
+    is(notification.getAttribute("label"),
+       "Theme Test will be installed after you restart " + gApp + ".",
+       "Should have seen the right message");
 
-      accept_install_dialog();
+    let addon = yield new Promise(resolve => {
+      AddonManager.getAddonByID("{972ce4c6-7e08-4474-a285-3208198ce6fd}", function(addon) {
+        resolve(addon);
+      });
     });
-  });
+    ok(addon.userDisabled, "Should be switching away from the default theme.");
+    // Undo the pending theme switch
+    addon.userDisabled = false;
 
-  var pm = Services.perms;
-  pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
+    addon = yield new Promise(resolve => {
+      AddonManager.getAddonByID("theme-xpi@tests.mozilla.org", function(addon) {
+        resolve(addon);
+      });
+    });
+    isnot(addon, null, "Test theme will have been installed");
+    addon.uninstall();
 
-  var triggers = encodeURIComponent(JSON.stringify({
-    "Theme XPI": "theme.xpi"
-  }));
-  BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    Services.perms.remove(makeURI("http://example.com/"), "install");
+    yield removeTab();
+  });
 },
 
-function test_renotify_blocked() {
-  // Wait for the blocked notification
-  wait_for_notification("addon-install-blocked", function(aPanel) {
-    let notification = aPanel.childNodes[0];
+function test_renotifyBlocked() {
+  return Task.spawn(function* () {
+    let notificationPromise = waitForNotification("addon-install-blocked");
+    let triggers = encodeURIComponent(JSON.stringify({
+      "XPI": "amosigned.xpi"
+    }));
+    BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    let panel = yield notificationPromise;
 
-    wait_for_notification_close(function () {
-      info("Timeouts after this probably mean bug 589954 regressed");
-      executeSoon(function () {
-        wait_for_notification("addon-install-blocked", function(aPanel) {
-          AddonManager.getAllInstalls(function(aInstalls) {
-            is(aInstalls.length, 2, "Should be two pending installs");
+    let closePromise = waitForNotificationClose();
+    // hide the panel (this simulates the user dismissing it)
+    panel.hidePopup();
+    yield closePromise;
 
-            let eventCount = 0;
-            let nextTest = () => {
-              if (++eventCount == 2) {
-                runNextTest();
-              }
-            }
+    info("Timeouts after this probably mean bug 589954 regressed");
 
-            wait_for_notification_close(() => {
-              AddonManager.getAllInstalls(function(aInstalls) {
-                is(aInstalls.length, 0, "Should have cancelled the installs");
-                nextTest();
-              });
-            });
+    yield new Promise(resolve => executeSoon(resolve));
 
-            info("Closing browser tab");
-            BrowserTestUtils.removeTab(gBrowser.selectedTab).then(nextTest);
-          });
-        });
+    notificationPromise = waitForNotification("addon-install-blocked");
+    gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
+    yield notificationPromise;
 
-        gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
-      });
-    });
+    let installs = yield getInstalls();
+    is(installs.length, 2, "Should be two pending installs");
 
-    // hide the panel (this simulates the user dismissing it)
-    aPanel.hidePopup();
-  });
+    closePromise = waitForNotificationClose();
+    yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
+    yield closePromise;
 
-  var triggers = encodeURIComponent(JSON.stringify({
-    "XPI": "amosigned.xpi"
-  }));
-  BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    installs = yield getInstalls();
+    is(installs.length, 0, "Should have cancelled the installs");
+  });
 },
 
-function test_renotify_installed() {
-  // Wait for the progress notification
-  wait_for_progress_notification(function(aPanel) {
-    // Wait for the install confirmation dialog
-    wait_for_install_dialog(function() {
-      // Wait for the complete notification
-      wait_for_notification("addon-install-restart", function(aPanel) {
-        // Dismiss the notification
-        wait_for_notification_close(function () {
-          // Install another
-          executeSoon(function () {
-            // Wait for the progress notification
-            wait_for_progress_notification(function(aPanel) {
-              // Wait for the install confirmation dialog
-              wait_for_install_dialog(function() {
-                info("Timeouts after this probably mean bug 589954 regressed");
+function test_renotifyInstalled() {
+  return Task.spawn(function* () {
+    let pm = Services.perms;
+    pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
 
-                // Wait for the complete notification
-                wait_for_notification("addon-install-restart", function(aPanel) {
-                  AddonManager.getAllInstalls(function(aInstalls) {
-                  is(aInstalls.length, 1, "Should be one pending installs");
-                    aInstalls[0].cancel();
+    let progressPromise = waitForProgressNotification();
+    let dialogPromise = waitForInstallDialog();
+    let triggers = encodeURIComponent(JSON.stringify({
+      "XPI": "amosigned.xpi"
+    }));
+    BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    yield progressPromise;
+    yield dialogPromise;
+
+    // Wait for the complete notification
+    let notificationPromise = waitForNotification("addon-install-restart");
+    acceptInstallDialog();
+    let panel = yield notificationPromise;
+
+    let closePromise = waitForNotificationClose();
+    // hide the panel (this simulates the user dismissing it)
+    panel.hidePopup();
+    yield closePromise;
 
-                    Services.perms.remove(makeURI("http://example.com/"), "install");
-                    remove_tab_and_run_next_test();
-                  });
-                });
+    // Install another
+    yield new Promise(resolve => executeSoon(resolve));
 
-                accept_install_dialog();
-              });
-            });
+    progressPromise = waitForProgressNotification();
+    dialogPromise = waitForInstallDialog();
+    gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
+    yield progressPromise;
+    yield dialogPromise;
 
-            gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
-          });
-        });
+    info("Timeouts after this probably mean bug 589954 regressed");
 
-        // hide the panel (this simulates the user dismissing it)
-        aPanel.hidePopup();
-      });
-
-      accept_install_dialog();
-    });
-  });
+    // Wait for the complete notification
+    notificationPromise = waitForNotification("addon-install-restart");
+    acceptInstallDialog();
+    yield notificationPromise;
 
-  var pm = Services.perms;
-  pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
+    let installs = yield getInstalls();
+    is(installs.length, 1, "Should be one pending installs");
+    installs[0].cancel();
 
-  var triggers = encodeURIComponent(JSON.stringify({
-    "XPI": "amosigned.xpi"
-  }));
-  BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    Services.perms.remove(makeURI("http://example.com/"), "install");
+    yield removeTab();
+  });
 },
 
 function test_cancel() {
-  function complete_install(callback) {
-    let url = TESTROOT + "slowinstall.sjs?continue=true"
-    NetUtil.asyncFetch({
-      uri: url,
-      loadUsingSystemPrincipal: true
-    }, callback || (() => {}));
-  }
+  return Task.spawn(function* () {
+    function complete_install(callback) {
+      let url = TESTROOT + "slowinstall.sjs?continue=true"
+      NetUtil.asyncFetch({
+        uri: url,
+        loadUsingSystemPrincipal: true
+      }, callback || (() => {}));
+    }
 
-  // Wait for the progress notification
-  wait_for_notification(PROGRESS_NOTIFICATION, function(aPanel) {
-    let notification = aPanel.childNodes[0];
+    let pm = Services.perms;
+    pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
+
+    let notificationPromise = waitForNotification(PROGRESS_NOTIFICATION);
+    let triggers = encodeURIComponent(JSON.stringify({
+      "XPI": "slowinstall.sjs?file=amosigned.xpi"
+    }));
+    BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
+    let panel = yield notificationPromise;
+
+    let notification = panel.childNodes[0];
     // Close the notification
     let anchor = document.getElementById("addons-notification-icon");
     anchor.click();
     // Reopen the notification
     anchor.click();
 
     ok(PopupNotifications.isPanelOpen, "Notification should still be open");
     is(PopupNotifications.panel.childNodes.length, 1, "Should be only one notification");
-    notification = aPanel.childNodes[0];
+    notification = panel.childNodes[0];
     is(notification.id, "addon-progress-notification", "Should have seen the progress notification");
     let button = document.getElementById("addon-progress-cancel");
 
-    // Wait for the install to fully cancel
+    // Cancel the download
     let install = notification.notification.options.installs[0];
-    install.addListener({
-      onDownloadCancelled: function() {
-        install.removeListener(this);
+    let cancelledPromise = new Promise(resolve => {
+      install.addListener({
+        onDownloadCancelled: function() {
+          install.removeListener(this);
+          resolve();
+        }
+      });
+    });
+    EventUtils.synthesizeMouseAtCenter(button, {});
+    yield cancelledPromise;
 
-        executeSoon(function() {
-          ok(!PopupNotifications.isPanelOpen, "Notification should be closed");
+    yield new Promise(resolve => executeSoon(resolve));
 
-          AddonManager.getAllInstalls(function(aInstalls) {
-            is(aInstalls.length, 0, "Should be no pending install");
+    ok(!PopupNotifications.isPanelOpen, "Notification should be closed");
+
+    let installs = yield getInstalls();
+    is(installs.length, 0, "Should be no pending install");
 
-            Services.perms.remove(makeURI("http://example.com/"), "install");
-            BrowserTestUtils.removeTab(gBrowser.selectedTab).then(runNextTest);
-          });
-        });
-      }
+    Services.perms.remove(makeURI("http://example.com/"), "install");
+    yield BrowserTestUtils.removeTab(gBrowser.selectedTab);
+  });
+},
+
+function test_failedSecurity() {
+  return Task.spawn(function* () {
+    Services.prefs.setBoolPref(PREF_INSTALL_REQUIREBUILTINCERTS, false);
+    setupRedirect({
+      "Location": TESTROOT + "amosigned.xpi"
     });
 
-    // Cancel the download
-    EventUtils.synthesizeMouseAtCenter(button, {});
-  });
-
-  var pm = Services.perms;
-  pm.add(makeURI("http://example.com/"), "install", pm.ALLOW_ACTION);
+    let notificationPromise = waitForNotification("addon-install-blocked");
+    let triggers = encodeURIComponent(JSON.stringify({
+      "XPI": "redirect.sjs?mode=redirect"
+    }));
+    BrowserTestUtils.openNewForegroundTab(gBrowser, SECUREROOT + "installtrigger.html?" + triggers);
+    let panel = yield notificationPromise;
 
-  var triggers = encodeURIComponent(JSON.stringify({
-    "XPI": "slowinstall.sjs?file=amosigned.xpi"
-  }));
-  BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
-},
-
-function test_failed_security() {
-  Services.prefs.setBoolPref(PREF_INSTALL_REQUIREBUILTINCERTS, false);
-
-  setup_redirect({
-    "Location": TESTROOT + "amosigned.xpi"
-  });
-
-  // Wait for the blocked notification
-  wait_for_notification("addon-install-blocked", function(aPanel) {
-    let notification = aPanel.childNodes[0];
-
+    let notification = panel.childNodes[0];
     // Click on Allow
     EventUtils.synthesizeMouse(notification.button, 20, 10, {});
 
     // Notification should have changed to progress notification
     ok(PopupNotifications.isPanelOpen, "Notification should still be open");
     is(PopupNotifications.panel.childNodes.length, 1, "Should be only one notification");
-    notification = aPanel.childNodes[0];
+    notification = panel.childNodes[0];
     is(notification.id, "addon-progress-notification", "Should have seen the progress notification");
 
     // Wait for it to fail
-    Services.obs.addObserver(function() {
-      Services.obs.removeObserver(arguments.callee, "addon-install-failed");
-
-      // Allow the browser code to add the failure notification and then wait
-      // for the progress notification to dismiss itself
-      wait_for_single_notification(function() {
-        is(PopupNotifications.panel.childNodes.length, 1, "Should be only one notification");
-        notification = aPanel.childNodes[0];
-        is(notification.id, "addon-install-failed-notification", "Should have seen the install fail");
+    yield new Promise(resolve => {
+      Services.obs.addObserver(function observer() {
+        Services.obs.removeObserver(observer, "addon-install-failed");
+        resolve();
+      }, "addon-install-failed", false);
+    });
 
-        Services.prefs.setBoolPref(PREF_INSTALL_REQUIREBUILTINCERTS, true);
-        remove_tab_and_run_next_test();
-      });
-    }, "addon-install-failed", false);
+    // Allow the browser code to add the failure notification and then wait
+    // for the progress notification to dismiss itself
+    yield waitForSingleNotification();
+    is(PopupNotifications.panel.childNodes.length, 1, "Should be only one notification");
+    notification = panel.childNodes[0];
+    is(notification.id, "addon-install-failed-notification", "Should have seen the install fail");
+
+    Services.prefs.setBoolPref(PREF_INSTALL_REQUIREBUILTINCERTS, true);
+    yield removeTab();
   });
-
-  var triggers = encodeURIComponent(JSON.stringify({
-    "XPI": "redirect.sjs?mode=redirect"
-  }));
-  BrowserTestUtils.openNewForegroundTab(gBrowser, SECUREROOT + "installtrigger.html?" + triggers);
 }
 ];
 
 var gTestStart = null;
 
-function runNextTest() {
-  if (gTestStart)
-    info("Test part took " + (Date.now() - gTestStart) + "ms");
-
-  ok(!PopupNotifications.isPanelOpen, "Notification should be closed");
-
-  AddonManager.getAllInstalls(function(aInstalls) {
-    is(aInstalls.length, 0, "Should be no active installs");
-
-    if (TESTS.length == 0) {
-      finish();
-      return;
-    }
-
-    info("Running " + TESTS[0].name);
-    gTestStart = Date.now();
-    TESTS.shift()();
-  });
-}
-
 var XPInstallObserver = {
   observe: function (aSubject, aTopic, aData) {
     var installInfo = aSubject.QueryInterface(Components.interfaces.amIWebInstallInfo);
     info("Observed " + aTopic + " for " + installInfo.installs.length + " installs");
     installInfo.installs.forEach(function(aInstall) {
       info("Install of " + aInstall.sourceURI.spec + " was in state " + aInstall.state);
     });
   }
 };
 
-function test() {
+add_task(function* () {
   requestLongerTimeout(4);
-  waitForExplicitFinish();
 
   Services.prefs.setBoolPref("extensions.logging.enabled", true);
   Services.prefs.setBoolPref("extensions.strictCompatibility", true);
   Services.prefs.setBoolPref("extensions.install.requireSecureOrigin", false);
   Services.prefs.setIntPref("security.dialog_enable_delay", 0);
 
   Services.obs.addObserver(XPInstallObserver, "addon-install-started", false);
   Services.obs.addObserver(XPInstallObserver, "addon-install-blocked", false);
@@ -1175,10 +1168,26 @@ function test() {
     Services.prefs.clearUserPref("security.dialog_enable_delay");
 
     Services.obs.removeObserver(XPInstallObserver, "addon-install-started");
     Services.obs.removeObserver(XPInstallObserver, "addon-install-blocked");
     Services.obs.removeObserver(XPInstallObserver, "addon-install-failed");
     Services.obs.removeObserver(XPInstallObserver, "addon-install-complete");
   });
 
-  runNextTest();
-}
+  for (let i = 0; i < TESTS.length; ++i) {
+    if (gTestStart)
+      info("Test part took " + (Date.now() - gTestStart) + "ms");
+
+    ok(!PopupNotifications.isPanelOpen, "Notification should be closed");
+
+    let installs = yield new Promise(resolve => {
+      AddonManager.getAllInstalls(function(aInstalls) {
+        resolve(aInstalls);
+      });
+    });
+
+    is(installs.length, 0, "Should be no active installs");
+    info("Running " + TESTS[i].name);
+    gTestStart = Date.now();
+    yield TESTS[i]();
+  }
+});
--- a/browser/base/content/test/general/browser_misused_characters_in_strings.js
+++ b/browser/base/content/test/general/browser_misused_characters_in_strings.js
@@ -103,16 +103,20 @@ let gWhitelist = [{
   }, {
     file: "pocket.properties",
     key: "tos",
     type: "double-quote"
   }, {
     file: "pocket.properties",
     key: "tos",
     type: "apostrophe"
+  }, {
+    file: "aboutNetworking.dtd",
+    key: "aboutNetworking.logTutorial",
+    type: "single-quote"
   }
 ];
 
 var moduleLocation = gTestPath.replace(/\/[^\/]*$/i, "/parsingTestHelpers.jsm");
 var {generateURIsFromDirTree} = Cu.import(moduleLocation, {});
 
 /**
  * Check if an error should be ignored due to matching one of the whitelist
--- a/browser/base/content/test/popupNotifications/browser_popupNotification_checkbox.js
+++ b/browser/base/content/test/popupNotifications/browser_popupNotification_checkbox.js
@@ -20,16 +20,24 @@ function checkCheckbox(checkbox, label, 
 
 function checkMainAction(notification, disabled=false) {
   let mainAction = notification.button;
   let warningLabel = document.getAnonymousElementByAttribute(notification, "class", "popup-notification-warning");
   is(warningLabel.hidden, !disabled, "Warning label should be shown");
   is(mainAction.disabled, disabled, "MainAction should be disabled");
 }
 
+function promiseElementVisible(element) {
+  // HTMLElement.offsetParent is null when the element is not visisble
+  // (or if the element has |position: fixed|). See:
+  // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent
+  return BrowserTestUtils.waitForCondition(() => element.offsetParent !== null,
+                                          "Waiting for element to be visible");
+}
+
 var gNotification;
 
 var tests = [
   // Test that passing the checkbox field shows the checkbox.
   { id: "show_checkbox",
     run: function () {
       this.notifyObj = new BasicNotification(this.id);
       this.notifyObj.options.checkbox = {
@@ -70,21 +78,22 @@ var tests = [
     run: function () {
       this.notifyObj = new BasicNotification(this.id);
       this.notifyObj.mainAction.callback = ({checkboxChecked}) => this.mainActionChecked = checkboxChecked;
       this.notifyObj.options.checkbox = {
         label: "This is a checkbox",
       };
       gNotification = showNotification(this.notifyObj);
     },
-    onShown: function (popup) {
+    onShown: function* (popup) {
       checkPopup(popup, this.notifyObj);
       let notification = popup.childNodes[0];
       let checkbox = notification.checkbox;
       checkCheckbox(checkbox, "This is a checkbox");
+      yield promiseElementVisible(checkbox);
       EventUtils.synthesizeMouseAtCenter(checkbox, {});
       checkCheckbox(checkbox, "This is a checkbox", true);
       triggerMainCommand(popup);
     },
     onHidden: function () {
       is(this.mainActionChecked, true, "mainAction callback is passed the correct checkbox value");
     }
   },
@@ -98,21 +107,22 @@ var tests = [
         accessKey: "T",
         callback: ({checkboxChecked}) => this.secondaryActionChecked = checkboxChecked,
       }];
       this.notifyObj.options.checkbox = {
         label: "This is a checkbox",
       };
       gNotification = showNotification(this.notifyObj);
     },
-    onShown: function (popup) {
+    onShown: function* (popup) {
       checkPopup(popup, this.notifyObj);
       let notification = popup.childNodes[0];
       let checkbox = notification.checkbox;
       checkCheckbox(checkbox, "This is a checkbox");
+      yield promiseElementVisible(checkbox);
       EventUtils.synthesizeMouseAtCenter(checkbox, {});
       checkCheckbox(checkbox, "This is a checkbox", true);
       triggerSecondaryCommand(popup, 0);
     },
     onHidden: function () {
       is(this.secondaryActionChecked, true, "secondaryAction callback is passed the correct checkbox value");
     }
   },
@@ -125,21 +135,22 @@ var tests = [
         label: "This is a checkbox",
         checkedState: {
           disableMainAction: true,
           warningLabel: "Testing disable",
         },
       };
       gNotification = showNotification(this.notifyObj);
     },
-    onShown: function (popup) {
+    onShown: function* (popup) {
       checkPopup(popup, this.notifyObj);
       let notification = popup.childNodes[0];
       let checkbox = notification.checkbox;
       checkCheckbox(checkbox, "This is a checkbox");
+      yield promiseElementVisible(checkbox);
       EventUtils.synthesizeMouseAtCenter(checkbox, {});
       dismissNotification(popup);
     },
     onHidden: function (popup) {
       let icon = document.getElementById("default-notification-icon");
       EventUtils.synthesizeMouseAtCenter(icon, {});
       let notification = popup.childNodes[0];
       let checkbox = notification.checkbox;
@@ -162,25 +173,26 @@ var tests = [
             checked: checked,
             [state]: {
               disableMainAction: true,
               warningLabel: "Testing disable",
             },
           };
           gNotification = showNotification(this.notifyObj);
         },
-        onShown: function (popup) {
+        onShown: function* (popup) {
           checkPopup(popup, this.notifyObj);
           let notification = popup.childNodes[0];
           let checkbox = notification.checkbox;
           let disabled = (state === "checkedState" && checked) ||
                          (state === "uncheckedState" && !checked);
 
           checkCheckbox(checkbox, "This is a checkbox", checked);
           checkMainAction(notification, disabled);
+          yield promiseElementVisible(checkbox);
           EventUtils.synthesizeMouseAtCenter(checkbox, {});
           checkCheckbox(checkbox, "This is a checkbox", !checked);
           checkMainAction(notification, !disabled);
           EventUtils.synthesizeMouseAtCenter(checkbox, {});
           checkCheckbox(checkbox, "This is a checkbox", checked);
           checkMainAction(notification, disabled);
 
           // Unblock the main command if it's currently disabled.
--- a/browser/base/content/test/urlbar/browser_locationBarCommand.js
+++ b/browser/base/content/test/urlbar/browser_locationBarCommand.js
@@ -36,17 +36,21 @@ add_task(function* shift_left_click_test
   info("Running test: Shift left click");
 
   let newWindowPromise = BrowserTestUtils.waitForNewWindow();
   triggerCommand(true, {shiftKey: true});
   let win = yield newWindowPromise;
 
   // Wait for the initial browser to load.
   let browser = win.gBrowser.selectedBrowser;
-  yield BrowserTestUtils.browserLoaded(browser);
+  let destinationURL = "http://" + TEST_VALUE + "/";
+  yield Promise.all([
+    BrowserTestUtils.browserLoaded(browser),
+    BrowserTestUtils.waitForLocationChange(win.gBrowser, destinationURL)
+  ]);
 
   info("URL should be loaded in a new window");
   is(gURLBar.value, "", "Urlbar reverted to original value");
   yield promiseCheckChildNoFocusedElement(gBrowser.selectedBrowser);
   is(document.activeElement, gBrowser.selectedBrowser, "Content window should be focused");
   is(win.gURLBar.textValue, TEST_VALUE, "New URL is loaded in new window");
 
   // Cleanup.
--- a/browser/components/customizableui/CustomizableWidgets.jsm
+++ b/browser/components/customizableui/CustomizableWidgets.jsm
@@ -461,16 +461,19 @@ const CustomizableWidgets = [
       appendTo.appendChild(messageLabel);
       return messageLabel;
     },
     _appendClient: function (client, attachFragment) {
       let doc = attachFragment.ownerDocument;
       // Create the element for the remote client.
       let clientItem = doc.createElementNS(kNSXUL, "label");
       clientItem.setAttribute("itemtype", "client");
+      let window = doc.defaultView;
+      clientItem.setAttribute("tooltiptext",
+        window.gSyncUI.formatLastSyncDate(new Date(client.lastModified)));
       clientItem.textContent = client.name;
 
       attachFragment.appendChild(clientItem);
 
       if (client.tabs.length == 0) {
         let label = this._appendMessageLabel("notabsforclientlabel", attachFragment);
         label.setAttribute("class", "PanelUI-remotetabs-notabsforclient-label");
       } else {
--- a/browser/components/customizableui/test/browser_981418-widget-onbeforecreated-handler.js
+++ b/browser/components/customizableui/test/browser_981418-widget-onbeforecreated-handler.js
@@ -40,22 +40,25 @@ add_task(function* testAddOnBeforeCreate
   ok(onBeforeCreatedCalled, "onBeforeCreated should have been called");
 
   let widgetNode = document.getElementById(kWidgetId);
   ok(widgetNode, "Widget should exist");
   if (widgetNode) {
     try {
       widgetNode.click();
 
+      let tempPanel = document.getElementById("customizationui-widget-panel");
+      let panelShownPromise = promisePanelElementShown(window, tempPanel);
+
       let shownTimeout = setTimeout(() => viewShownDeferred.reject("Panel not shown within 20s"), 20000);
       yield viewShownDeferred.promise;
+      yield panelShownPromise;
       clearTimeout(shownTimeout);
       ok(true, "Found view shown");
 
-      let tempPanel = document.getElementById("customizationui-widget-panel");
       let panelHiddenPromise = promisePanelElementHidden(window, tempPanel);
       tempPanel.hidePopup();
       yield panelHiddenPromise;
 
       CustomizableUI.addWidgetToArea(kWidgetId, CustomizableUI.AREA_PANEL);
       yield PanelUI.show();
 
       viewShownDeferred = Promise.defer();
--- a/browser/components/customizableui/test/browser_988072_sidebar_events.js
+++ b/browser/components/customizableui/test/browser_988072_sidebar_events.js
@@ -77,19 +77,21 @@ function compareList(original, displayed
     compareElements(displayed[i], original[i]);
   }
 }
 
 var showSidebarPopup = Task.async(function*() {
   let button = document.getElementById("sidebar-button");
   let subview = document.getElementById("PanelUI-sidebar");
 
+  let popupShownPromise = BrowserTestUtils.waitForEvent(document, "popupshown");
+
   let subviewShownPromise = subviewShown(subview);
   EventUtils.synthesizeMouseAtCenter(button, {});
-  return subviewShownPromise;
+  return Promise.all([subviewShownPromise, popupShownPromise]);
 });
 
 // Check the sidebar widget shows the default items
 add_task(function*() {
   addWidget();
 
   yield showSidebarPopup();
 
--- a/browser/components/extensions/ext-tabs.js
+++ b/browser/components/extensions/ext-tabs.js
@@ -3,17 +3,18 @@
 "use strict";
 
 XPCOMUtils.defineLazyServiceGetter(this, "aboutNewTabService",
                                    "@mozilla.org/browser/aboutnewtab-service;1",
                                    "nsIAboutNewTabService");
 
 XPCOMUtils.defineLazyModuleGetter(this, "MatchPattern",
                                   "resource://gre/modules/MatchPattern.jsm");
-
+XPCOMUtils.defineLazyModuleGetter(this, "PromiseUtils",
+                                  "resource://gre/modules/PromiseUtils.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "Services",
                                   "resource://gre/modules/Services.jsm");
 
 Cu.import("resource://gre/modules/ExtensionUtils.jsm");
 
 var {
   EventManager,
   ignoreEvent,
@@ -237,42 +238,62 @@ let tabListener = {
     let windowId = WindowManager.getId(tab.ownerGlobal);
     let tabId = TabManager.getId(tab);
 
     this.emit("tab-removed", {tab, tabId, windowId, isWindowClosing});
   },
 
   tabReadyInitialized: false,
   tabReadyPromises: new WeakMap(),
+  initializingTabs: new WeakSet(),
 
   initTabReady() {
     if (!this.tabReadyInitialized) {
       AllWindowEvents.addListener("progress", this);
 
       this.tabReadyInitialized = true;
     }
   },
 
   onLocationChange(browser, webProgress, request, locationURI, flags) {
     if (webProgress.isTopLevel) {
       let gBrowser = browser.ownerGlobal.gBrowser;
       let tab = gBrowser.getTabForBrowser(browser);
 
+      // Now we are certain that the first page in the tab was loaded.
+      this.initializingTabs.delete(tab);
+
+      // browser.innerWindowID is now set, resolve the promises if any.
       let deferred = this.tabReadyPromises.get(tab);
       if (deferred) {
         deferred.resolve(tab);
         this.tabReadyPromises.delete(tab);
       }
     }
   },
 
+  /**
+   * Returns a promise that resolves when the tab is ready.
+   * Tabs created via the `tabs.create` method are "ready" once the location
+   * changed to the requested URL. Other tabs are always assumed to be ready.
+   *
+   * @param {XULElement} tab The <tab> element.
+   * @returns {Promise} Resolves with the given tab once ready.
+   */
   awaitTabReady(tab) {
-    return new Promise((resolve, reject) => {
-      this.tabReadyPromises.set(tab, {resolve, reject});
-    });
+    let deferred = this.tabReadyPromises.get(tab);
+    if (!deferred) {
+      deferred = PromiseUtils.defer();
+      if (!this.initializingTabs.has(tab) && tab.linkedBrowser.innerWindowID) {
+        deferred.resolve(tab);
+      } else {
+        this.tabReadyPromises.set(tab, deferred);
+      }
+    }
+    return deferred.promise;
   },
 };
 
 extensions.registerSchemaAPI("tabs", "addon_parent", context => {
   let {extension} = context;
   let self = {
     tabs: {
       onActivated: new WindowEventManager(context, "tabs.onActivated", "TabSelect", (fire, event) => {
@@ -533,28 +554,28 @@ extensions.registerSchemaAPI("tabs", "ad
           if (createProperties.index !== null) {
             window.gBrowser.moveTabTo(tab, createProperties.index);
           }
 
           if (createProperties.pinned) {
             window.gBrowser.pinTab(tab);
           }
 
-          if (!createProperties.url || createProperties.url.startsWith("about:")) {
+          if (createProperties.url && !createProperties.url.startsWith("about:")) {
             // We can't wait for a location change event for about:newtab,
             // since it may be pre-rendered, in which case its initial
             // location change event has already fired.
-            return tab;
+
+            // Mark the tab as initializing, so that operations like
+            // `executeScript` wait until the requested URL is loaded in
+            // the tab before dispatching messages to the inner window
+            // that contains the URL we're attempting to load.
+            tabListener.initializingTabs.add(tab);
           }
 
-          // Wait for the first location change event, so that operations
-          // like `executeScript` are dispatched to the inner window that
-          // contains the URL we're attempting to load.
-          return tabListener.awaitTabReady(tab);
-        }).then(tab => {
           return TabManager.convert(extension, tab);
         });
       },
 
       remove: function(tabs) {
         if (!Array.isArray(tabs)) {
           tabs = [tabs];
         }
@@ -712,75 +733,75 @@ extensions.registerSchemaAPI("tabs", "ad
         if (!extension.hasPermission("<all_urls>")) {
           return Promise.reject({message: "The <all_urls> permission is required to use the captureVisibleTab API"});
         }
 
         let window = windowId == null ?
           WindowManager.topWindow :
           WindowManager.getWindow(windowId, context);
 
-        let browser = window.gBrowser.selectedBrowser;
-        let recipient = {
-          innerWindowID: browser.innerWindowID,
-        };
+        let tab = window.gBrowser.selectedTab;
+        return tabListener.awaitTabReady(tab).then(() => {
+          let browser = tab.linkedBrowser;
+          let recipient = {
+            innerWindowID: browser.innerWindowID,
+          };
 
-        if (!options) {
-          options = {};
-        }
-        if (options.format == null) {
-          options.format = "png";
-        }
-        if (options.quality == null) {
-          options.quality = 92;
-        }
+          if (!options) {
+            options = {};
+          }
+          if (options.format == null) {
+            options.format = "png";
+          }
+          if (options.quality == null) {
+            options.quality = 92;
+          }
 
-        let message = {
-          options,
-          width: browser.clientWidth,
-          height: browser.clientHeight,
-        };
+          let message = {
+            options,
+            width: browser.clientWidth,
+            height: browser.clientHeight,
+          };
 
-        return context.sendMessage(browser.messageManager, "Extension:Capture",
-                                   message, {recipient});
+          return context.sendMessage(browser.messageManager, "Extension:Capture",
+                                     message, {recipient});
+        });
       },
 
       detectLanguage: function(tabId) {
         let tab = tabId !== null ? TabManager.getTab(tabId, context) : TabManager.activeTab;
 
-        let browser = tab.linkedBrowser;
-        let recipient = {innerWindowID: browser.innerWindowID};
+        return tabListener.awaitTabReady(tab).then(() => {
+          let browser = tab.linkedBrowser;
+          let recipient = {innerWindowID: browser.innerWindowID};
 
-        return context.sendMessage(browser.messageManager, "Extension:DetectLanguage",
-                                   {}, {recipient});
+          return context.sendMessage(browser.messageManager, "Extension:DetectLanguage",
+                                     {}, {recipient});
+        });
       },
 
       // Used to executeScript, insertCSS and removeCSS.
       _execute: function(tabId, details, kind, method) {
         let tab = tabId !== null ? TabManager.getTab(tabId, context) : TabManager.activeTab;
-        let mm = tab.linkedBrowser.messageManager;
 
         let options = {
           js: [],
           css: [],
           remove_css: method == "removeCSS",
         };
 
         // We require a `code` or a `file` property, but we can't accept both.
         if ((details.code === null) == (details.file === null)) {
           return Promise.reject({message: `${method} requires either a 'code' or a 'file' property, but not both`});
         }
 
         if (details.frameId !== null && details.allFrames) {
           return Promise.reject({message: `'frameId' and 'allFrames' are mutually exclusive`});
         }
 
-        let recipient = {
-          innerWindowID: tab.linkedBrowser.innerWindowID,
-        };
-
         if (TabManager.for(extension).hasActiveTabPermission(tab)) {
           // If we have the "activeTab" permission for this tab, ignore
           // the host whitelist.
           options.matchesHost = ["<all_urls>"];
         } else {
           options.matchesHost = extension.whiteListedHosts.serialize();
         }
 
@@ -804,17 +825,24 @@ extensions.registerSchemaAPI("tabs", "ad
           options.match_about_blank = details.matchAboutBlank;
         }
         if (details.runAt !== null) {
           options.run_at = details.runAt;
         } else {
           options.run_at = "document_idle";
         }
 
-        return context.sendMessage(mm, "Extension:Execute", {options}, {recipient});
+        return tabListener.awaitTabReady(tab).then(() => {
+          let browser = tab.linkedBrowser;
+          let recipient = {
+            innerWindowID: browser.innerWindowID,
+          };
+
+          return context.sendMessage(browser.messageManager, "Extension:Execute", {options}, {recipient});
+        });
       },
 
       executeScript: function(tabId, details) {
         return self.tabs._execute(tabId, details, "js", "executeScript");
       },
 
       insertCSS: function(tabId, details) {
         return self.tabs._execute(tabId, details, "css", "insertCSS").then(() => {});
--- a/browser/components/extensions/test/browser/browser_ext_runtime_openOptionsPage.js
+++ b/browser/components/extensions/test/browser/browser_ext_runtime_openOptionsPage.js
@@ -1,16 +1,26 @@
 /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set sts=2 sw=2 et tw=80: */
 "use strict";
 
+requestLongerTimeout(2);
+
+function add_tasks(task) {
+  add_task(task.bind(null, {embedded: false}));
+
+  add_task(task.bind(null, {embedded: true}));
+}
+
 function* loadExtension(options) {
   let extension = ExtensionTestUtils.loadExtension({
     useAddonManager: "temporary",
 
+    embedded: options.embedded,
+
     manifest: Object.assign({
       "permissions": ["tabs"],
     }, options.manifest),
 
     files: {
       "options.html": `<!DOCTYPE html>
         <html>
           <head>
@@ -32,20 +42,22 @@ function* loadExtension(options) {
     background: options.background,
   });
 
   yield extension.startup();
 
   return extension;
 }
 
-add_task(function* test_inline_options() {
+add_tasks(function* test_inline_options(extraOptions) {
+  info(`Test options opened inline (${JSON.stringify(extraOptions)})`);
+
   let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, "http://example.com/");
 
-  let extension = yield loadExtension({
+  let extension = yield loadExtension(Object.assign({}, extraOptions, {
     manifest: {
       applications: {gecko: {id: "inline_options@tests.mozilla.org"}},
       "options_ui": {
         "page": "options.html",
       },
     },
 
     background: function() {
@@ -118,28 +130,30 @@ add_task(function* test_inline_options()
         return browser.tabs.remove(tab.id);
       }).then(() => {
         browser.test.notifyPass("options-ui");
       }).catch(error => {
         browser.test.log(`Error: ${error} :: ${error.stack}`);
         browser.test.notifyFail("options-ui");
       });
     },
-  });
+  }));
 
   yield extension.awaitFinish("options-ui");
   yield extension.unload();
 
   yield BrowserTestUtils.removeTab(tab);
 });
 
-add_task(function* test_tab_options() {
+add_tasks(function* test_tab_options(extraOptions) {
+  info(`Test options opened in a tab (${JSON.stringify(extraOptions)})`);
+
   let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, "http://example.com/");
 
-  let extension = yield loadExtension({
+  let extension = yield loadExtension(Object.assign({}, extraOptions, {
     manifest: {
       applications: {gecko: {id: "tab_options@tests.mozilla.org"}},
       "options_ui": {
         "page": "options.html",
         "open_in_tab": true,
       },
     },
 
@@ -216,26 +230,28 @@ add_task(function* test_tab_options() {
         return browser.tabs.remove(tab.id);
       }).then(() => {
         browser.test.notifyPass("options-ui-tab");
       }).catch(error => {
         browser.test.log(`Error: ${error} :: ${error.stack}`);
         browser.test.notifyFail("options-ui-tab");
       });
     },
-  });
+  }));
 
   yield extension.awaitFinish("options-ui-tab");
   yield extension.unload();
 
   yield BrowserTestUtils.removeTab(tab);
 });
 
-add_task(function* test_options_no_manifest() {
-  let extension = yield loadExtension({
+add_tasks(function* test_options_no_manifest(extraOptions) {
+  info(`Test with no manifest key (${JSON.stringify(extraOptions)})`);
+
+  let extension = yield loadExtension(Object.assign({}, extraOptions, {
     manifest: {
       applications: {gecko: {id: "no_options@tests.mozilla.org"}},
     },
 
     background: function() {
       browser.test.log("Try to open options page when not specified in the manifest.");
 
       browser.runtime.openOptionsPage().then(
@@ -251,13 +267,13 @@ add_task(function* test_options_no_manif
         }
       ).then(() => {
         browser.test.notifyPass("options-no-manifest");
       }).catch(error => {
         browser.test.log(`Error: ${error} :: ${error.stack}`);
         browser.test.notifyFail("options-no-manifest");
       });
     },
-  });
+  }));
 
   yield extension.awaitFinish("options-no-manifest");
   yield extension.unload();
 });
--- a/browser/components/places/content/editBookmarkOverlay.js
+++ b/browser/components/places/content/editBookmarkOverlay.js
@@ -172,16 +172,28 @@ var gEditItemOverlay = {
    *          - hiddenRows (Strings array): list of rows to be hidden regardless
    *            of the item edited. Possible values: "title", "location",
    *            "description", "keyword", "loadInSidebar", "feedLocation",
    *            "siteLocation", folderPicker"
    */
   initPanel(aInfo) {
     if (typeof(aInfo) != "object" || aInfo === null)
       throw new Error("aInfo must be an object.");
+    if ("node" in aInfo) {
+      try {
+        aInfo.node.type;
+      } catch (e) {
+        // If the lazy loader for |type| generates an exception, it means that
+        // this bookmark could not be loaded. This sometimes happens when tests
+        // create a bookmark by clicking the bookmark star, then try to cleanup
+        // before the bookmark panel has finished opening. Either way, if we
+        // cannot retrieve the bookmark information, we cannot open the panel.
+        return;
+      }
+    }
 
     // For sanity ensure that the implementer has uninited the panel before
     // trying to init it again, or we could end up leaking due to observers.
     if (this.initialized)
       this.uninitPanel(false);
 
     let { itemId, itemGuid, isItem,
           isURI, uri, title,
new file mode 100644
--- /dev/null
+++ b/browser/config/mozconfigs/linux32/artifact
@@ -0,0 +1,9 @@
+MOZ_AUTOMATION_BUILD_SYMBOLS=0
+MOZ_AUTOMATION_L10N_CHECK=0
+
+. "$topsrcdir/browser/config/mozconfigs/linux32/common-opt"
+. "$topsrcdir/build/mozconfig.common.override"
+
+ac_add_options --enable-artifact-builds
+unset CC
+unset CXX
new file mode 100644
--- /dev/null
+++ b/browser/config/mozconfigs/macosx64/artifact
@@ -0,0 +1,7 @@
+MOZ_AUTOMATION_BUILD_SYMBOLS=0
+MOZ_AUTOMATION_L10N_CHECK=0
+
+. "$topsrcdir/build/macosx/mozconfig.common"
+. "$topsrcdir/build/mozconfig.common.override"
+
+ac_add_options --enable-artifact-builds
new file mode 100644
--- /dev/null
+++ b/browser/config/mozconfigs/win32/artifact
@@ -0,0 +1,9 @@
+MOZ_AUTOMATION_BUILD_SYMBOLS=0
+MOZ_AUTOMATION_L10N_CHECK=0
+
+. "$topsrcdir/browser/config/mozconfigs/common"
+. "$topsrcdir/build/mozconfig.win-common"
+. "$topsrcdir/build/win32/mozconfig.vs-latest"
+. "$topsrcdir/build/mozconfig.common.override"
+
+ac_add_options --enable-artifact-builds
new file mode 100644
--- /dev/null
+++ b/browser/config/mozconfigs/win64/artifact
@@ -0,0 +1,10 @@
+MOZ_AUTOMATION_BUILD_SYMBOLS=0
+MOZ_AUTOMATION_L10N_CHECK=0
+
+. "$topsrcdir/browser/config/mozconfigs/win64/common-win64"
+. "$topsrcdir/browser/config/mozconfigs/common"
+. "$topsrcdir/build/mozconfig.win-common"
+. "$topsrcdir/build/win64/mozconfig.vs-latest"
+. "$topsrcdir/build/mozconfig.common.override"
+
+ac_add_options --enable-artifact-builds
--- a/browser/extensions/pocket/content/main.js
+++ b/browser/extensions/pocket/content/main.js
@@ -124,17 +124,17 @@ var pktUI = (function() {
 
     // -- Panel UI -- //
 
     /**
      * Show the sign-up panel
      */
     function showSignUp() {
         // AB test: Direct logged-out users to tab vs panel
-        if (pktApi.getSignupPanelTabTestVariant() == 'tab')
+        if (pktApi.getSignupPanelTabTestVariant() == 'v2')
         {
             let site = Services.prefs.getCharPref("extensions.pocket.site");
             openTabWithUrl('https://' + site + '/firefox_learnmore?s=ffi&t=autoredirect&tv=page_learnmore&src=ff_ext', true);
 
             // force the panel closed before it opens
             getPanel().hidePopup();
 
             return;
--- a/browser/extensions/pocket/content/pktApi.jsm
+++ b/browser/extensions/pocket/content/pktApi.jsm
@@ -605,17 +605,17 @@ var pktApi = (function() {
             error: options.error
         });
     }
 
     /**
      * Helper function to get current signup AB group the user is in
      */
     function getSignupPanelTabTestVariant() {
-        return getMultipleTestOption('panelSignUp', {control: 2, v1: 7, v2: 1 })
+        return getMultipleTestOption('panelSignUp', {control: 1, v1: 2, v2: 7 })
     }
 
     function getMultipleTestOption(testName, testOptions) {
         // Get the test from preferences if we've already assigned the user to a test
         var settingName = 'test.' + testName;
         var assignedValue = getSetting(settingName);
         var valArray = [];
 
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/en-GB/pocket.properties
@@ -0,0 +1,43 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+addtags = Add Tags
+alreadyhaveacct = Already a Pocket user?
+continueff = Continue with Firefox
+errorgeneric = There was an error when trying to save to Pocket.
+learnmore = Learn More
+loginnow = Log in
+maxtaglength = Tags are limited to 25 characters
+mustbeconnected = You must be connected to the Internet in order to save to Pocket. Please check your connection and try again.
+onlylinkssaved = Only links can be saved
+pagenotsaved = Page Not Saved
+pageremoved = Page Removed
+pagesaved = Saved to Pocket
+processingremove = Removing Page…
+processingtags = Adding tags…
+removepage = Remove Page
+save = Save
+saving = Saving…
+signupemail = Sign up with email
+signuptosave = Sign up for Pocket. It’s free.
+suggestedtags = Suggested Tags
+tagline = Save articles and videos from Firefox to view in Pocket on any device, any time.
+taglinestory_one = Click the Pocket Button to save any article, video or page from Firefox.
+taglinestory_two = View in Pocket on any device, any time.
+tagssaved = Tags Added
+tos = By continuing, you agree to Pocket’s <a href="%1$S" target="_blank">Terms of Service</a> and <a href="%2$S" target="_blank">Privacy Policy</a>
+tryitnow = Try It Now
+signinfirefox = Sign in with Firefox
+signupfirefox = Sign up with Firefox
+viewlist = View List
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = Save to Pocket
+saveToPocketCmd.label = Save Page to Pocket
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = Save Link to Pocket
+saveLinkToPocketCmd.accesskey = o
+pocketMenuitem.label = View Pocket List
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/es-AR/pocket.properties
@@ -0,0 +1,43 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+addtags = Agregar etiquetas
+alreadyhaveacct = ¿Ya es un usuario de Pocket?
+continueff = Continuar con Firefox
+errorgeneric = Hubo un error al tratar de guardar en Pocket.
+learnmore = Conocer más
+loginnow = Ingresar
+maxtaglength = Las etiquetas están limitadas a 25 caracteres
+mustbeconnected = Debe estar conectado a Internet para poder guardar en Pocket. Verifique la conexión e intente nuevamente.
+onlylinkssaved = Solamente pueden guardarle enlaces
+pagenotsaved = Página no guardada
+pageremoved = Página eliminada
+pagesaved = Guardado en Pocket
+processingremove = Eliminando página…
+processingtags = Agregando etiquetas…
+removepage = Eliminar página
+save = Guardar
+saving = Guardando…
+signupemail = Ingresar con correo electrónico
+signuptosave = Registrarse en Pocket. En grátis.
+suggestedtags = Etiquetas sugeridas
+tagline = Guardar artículos y videos desde Firefox para ver en Pocket en cualquier dispositivo en cualquier momento.
+taglinestory_one = Clic en el botón Pocket para guardar cualquier artículo, video o página desde Firefox.
+taglinestory_two = Ver en Pocket en cualquier dispositivo en cualquier momento.
+tagssaved = Etiquetas agregadas
+tos = Al continuar acepta los <a href="%1$S" target="_blank">términos de servicio</a> y la <a href="%2$S" target="_blank">política de privacidad</a> de Pocket
+tryitnow = Probalo ahora
+signinfirefox = Ingresar con Firefox
+signupfirefox = Registrarse con Firefox
+viewlist = Ver lista
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = Guardar en Pocket
+saveToPocketCmd.label = Guardar página en Pocket
+saveToPocketCmd.accesskey = G
+saveLinkToPocketCmd.label = Guardar enlace en Pocket
+saveLinkToPocketCmd.accesskey = o
+pocketMenuitem.label = Ver lista de Pocket
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/gu-IN/pocket.properties
@@ -0,0 +1,43 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+addtags = ટૅગ્સ ઉમેરો
+alreadyhaveacct = પહેલેથી જ એક પોકેટ વપરાશકર્તા છો?
+continueff = ફાયરફોક્સ સાથે ચાલુ રાખો
+errorgeneric = પોકેટ સાચવી રાખવા માટે પ્રયાસ હતો ત્યારે એક ભૂલ હતી.
+learnmore = વધુ શીખો
+loginnow = પ્રવેશ કરો
+maxtaglength = ટૅગ્સ 25 અક્ષરો સુધી મર્યાદિત છે
+mustbeconnected = તમે પોકેટ પર સેવ કરવા માટે ઇન્ટરનેટ સાથે જોડાયેલ હોવા જ જોઈએ. કૃપા કરીને તમારા જોડાણ તપાસ કરો અને ફરીથી પ્રયત્ન કરો.
+onlylinkssaved = માત્ર લિંક્સ સાચવી શકાય છે
+pagenotsaved = પૃષ્ઠ સાચવેલા નથી
+pageremoved = પૃષ્ઠ દૂર
+pagesaved = પોકેટ પર સાચવ્યું
+processingremove = પૃષ્ઠ દૂર કરી રહ્યા છીએ…
+processingtags = ટૅગ્સ ઉમેરી રહ્યું છે…
+removepage = પૃષ્ઠ દૂર
+save = સાચવો
+saving = સાચવી રહ્યું છે…
+signupemail = ઇમેઇલ સાથે સાઇનઅપ
+signuptosave = પોકેટ માટે સાઇન અપ કરો. તે મફત છે.
+suggestedtags = સૂચવેલ ટૅગ્સ
+tagline = કોઈપણ ઉપકરણ, કોઈ પણ સમય પર પોકેટ માં જોવા માટે ફાયરફોક્સ ના લેખો અને વીડિયો સાચવો.
+taglinestory_one = ફાયરફોક્સ એક લેખ, વિડિઓ અથવા પાનું સેવ કરવા પોકેટ બટન પર ક્લિક કરો.
+taglinestory_two = કોઈપણ ઉપકરણ, કોઈ પણ સમય પર પોકેટ માં જુઓ.
+tagssaved = ટૅગ્સ ઉમેર્યું
+tos = ચાલુ કરવાથી, તમે પોકેટ માટેની <a href="%1$S" target="_blank">સેવાની શરતો</a> અને <a href="%2$S" target="_blank">ગોપનીયતા નીતિ</a>સંમત થશો
+tryitnow = અત્યારે પ્રયાસ કરો
+signinfirefox = ફાયરફોક્સ સાથે ચાલુ રાખો
+signupfirefox = ફાયરફોક્સ સાથે સાઇન અપ કરો
+viewlist = યાદી જુઓ
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = પોકેટ
+pocket-button.tooltiptext = પોકેટ પર સાચવો
+saveToPocketCmd.label = પોકેટ પર પૃષ્ઠ સાચવો
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = પોકેટ પર લિંક સાચવો
+saveLinkToPocketCmd.accesskey = o
+pocketMenuitem.label = જુઓ પોકેટની યાદી
--- a/browser/extensions/pocket/locale/jar.mn
+++ b/browser/extensions/pocket/locale/jar.mn
@@ -1,30 +1,33 @@
 #filter substitution
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 # These are used for the big if statement, as the preprocessor can't handle
 # dashes.
 #define bn_BD bn-BD
+#define en_GB en-GB
 #define en_US en-US
+#define es_AR es-AR
 #define es_CL es-CL
 #define es_ES es-ES
 #define es_MX es-MX
 #define fy_NL fy-NL
+#define gu_IN gu-IN
 #define nn_NO nn-NO
 #define pt_BR pt-BR
 #define pt_PT pt-PT
 #define sv_SE sv-SE
 #define zh_CN zh-CN
 #define zh_TW zh-TW
 
 [features/firefox@getpocket.com] @AB_CD@.jar:
 % locale pocket @AB_CD@ %locale/@AB_CD@/
   # For locales we support, include the file from the locale's directory in the
   # source tree.
   # For other locales (and en-US) fallback to the en-US directory.
-#if AB_CD == ast || AB_CD == az || AB_CD == bg || AB_CD == bn_BD || AB_CD == cs || AB_CD == da || AB_CD == de || AB_CD == dsb || AB_CD == en_US || AB_CD == es_CL || AB_CD == es_ES || AB_CD == es_MX || AB_CD == et || AB_CD == fi || AB_CD == fr || AB_CD == fy_NL || AB_CD == hr || AB_CD == hsb || AB_CD == hu || AB_CD == it || AB_CD == ja || AB_CD == kab || AB_CD == lv || AB_CD == nl || AB_CD == nn_NO || AB_CD == or || AB_CD == pt_BR || AB_CD == pt_PT || AB_CD == rm || AB_CD == ro || AB_CD == ru || AB_CD == sk || AB_CD == sl || AB_CD == sq || AB_CD == sr || AB_CD == sv_SE || AB_CD == te || AB_CD == th || AB_CD == tr || AB_CD == uk || AB_CD == zh_CN || AB_CD == zh_TW
+#if AB_CD == ast || AB_CD == az || AB_CD == bg || AB_CD == bn_BD || AB_CD == cs || AB_CD == da || AB_CD == de || AB_CD == dsb || AB_CD == en_GB || AB_CD == en_US || AB_CD == es_AR || AB_CD == es_CL || AB_CD == es_ES || AB_CD == es_MX || AB_CD == et || AB_CD == fi || AB_CD == fr || AB_CD == fy_NL || AB_CD == gu_IN || AB_CD == hr || AB_CD == hsb || AB_CD == hu || AB_CD == it || AB_CD == ja || AB_CD == ka || AB_CD == kab || AB_CD == lt || AB_CD == lv || AB_CD == mr || AB_CD == ms || AB_CD == nl || AB_CD == nn_NO || AB_CD == or || AB_CD == pl || AB_CD == pt_BR || AB_CD == pt_PT || AB_CD == rm || AB_CD == ro || AB_CD == ru || AB_CD == sk || AB_CD == sl || AB_CD == sq || AB_CD == sr || AB_CD == sv_SE || AB_CD == te || AB_CD == th || AB_CD == tr || AB_CD == uk || AB_CD == zh_CN || AB_CD == zh_TW
   locale/@AB_CD@/                (@AB_CD@/*)
 #else
   locale/@AB_CD@/                (en-US/*)
 #endif
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/ka/pocket.properties
@@ -0,0 +1,43 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+addtags = იარლიყების დამატება
+alreadyhaveacct = უკვე იყენებთ Pocket-ს?
+continueff = Firefox-ით გაგრძელება
+errorgeneric = Pocket-ში შენახვისას დაფიქსირდა შეცდომა.
+learnmore = დაწვრილებით
+loginnow = შესვლა
+maxtaglength = იარლიყები შეზღუდულია 25 ასომდე
+mustbeconnected = Pocket-ში შესანახად საჭიროა ინტერნეთთან კავშირი. გთხოვთ შეამოწმეთ თქვენი კავშირი და ხელახლა ცადეთ.
+onlylinkssaved = შესაძლებელია მხოლოდ ბმულების შენახვა
+pagenotsaved = გვერდი არ შეინახა
+pageremoved = გვერდი წაიშალა
+pagesaved = შეინახა Pocket-ში
+processingremove = იშლება გვერდი…
+processingtags = ემატება იარლიყები…
+removepage = გვერდის წაშლა
+save = შენახვა
+saving = ინახება…
+signupemail = რეგისტრაცია ელ-ფოსტით
+signuptosave = დარეგისტრირდით Pocket-ზე. ეს უფასოა.
+suggestedtags = შემოთავაზებული იარლიყები
+tagline = შეინახეთ სტატიები და ვიდეობეი Firefox-იდან მათ Pocket-ში სანახავად ნებისმიერ მოწყობილობაზე, ნებისმიერ დროს.
+taglinestory_one = Firefox-იდან ნებისმიერი სტატიის, ვიდეოს ან გვერდის შესანახად დააწკაპეთ Pocket-ის ღილაკს.
+taglinestory_two = დაათვალიერეთ Pocket-ში ნებისმიერ მოწყობილობაზე, ნებისმიერ დროს.
+tagssaved = იარლიყები დაემატა
+tos = გაგრძელების შემთხვევაში თქვენ ეთანხმებით Pocket-ის <a href="%1$S" target="_blank">მომსახურების პირობებს</a> და <a href="%2$S" target="_blank">პრივატულობის პოლიტიკას</a>
+tryitnow = სცადეთ ახლავე
+signinfirefox = შესვლა Firefox-ით
+signupfirefox = რეგისრაცია Firefox-ით
+viewlist = სიის ნახვა
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = Pocket-ში შენახვა
+saveToPocketCmd.label = გვერდის შენახვა Pocket-ში
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = ბმულის შენახვა Pocket-ში
+saveLinkToPocketCmd.accesskey = o
+pocketMenuitem.label = Pocket სიის ნახვა
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/lt/pocket.properties
@@ -0,0 +1,43 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+addtags = Pridėkite gairių
+alreadyhaveacct = Jau naudojatės „Pocket“?
+continueff = Tęsti su „Firefox“
+errorgeneric = Bandant išsaugoti į „Pocket“ įvyko klaida.
+learnmore = Sužinokite daugiau
+loginnow = Prisijungti
+maxtaglength = Gaires gali sudaryti iki 25 simbolių
+mustbeconnected = Norėdami saugoti į „Pocket“, turite būti prisijungę prie interneto. Prašome patikrinti savo ryšį ir bandyti vėl.
+onlylinkssaved = Išsaugoti galima tik nuorodas
+pagenotsaved = Tinklalapis neišsaugotas
+pageremoved = Tinklalapis pašalintas
+pagesaved = Išsaugota į „Pocket“
+processingremove = Šalinamas tinklalapis…
+processingtags = Pridedamos gairės…
+removepage = Pašalinti tinklalapį
+save = Išsaugoti
+saving = Išsaugoma…
+signupemail = Prisijungti su el. paštu
+signuptosave = Pradėkite naudotis „Pocket“. Tai nemokama.
+suggestedtags = Siūlomos gairės
+tagline = Išsaugokite straipsnius bei vaizdo įrašus iš „Firefox“ norėdami juos peržiūrėti bet kokiame įrenginyje su „Pocket“, bet kuriuo metu.
+taglinestory_one = Spustelėkite „Pocket“ mygtuką norėdami išsaugoti bet kokį straipsnį, vaizdo įrašą ar tinklalapį iš „Firefox“.
+taglinestory_two = Peržiūrėkite bet kokiame įrenginyje su „Pocket“, bet kuriuo metu.
+tagssaved = Gairės pridėtos
+tos = Tęsdami sutinkate su „Pocket“ <a href="%1$S" target="_blank">paslaugos teikimo sąlygomis</a> bei <a href="%2$S" target="_blank">privatumo nuostatais</a>
+tryitnow = Išbandykite dabar
+signinfirefox = Prisijungti su „Firefox“
+signupfirefox = Prisijungti su „Firefox“
+viewlist = Peržiūrėti sąrašą
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = Išsaugoti į „Pocket“
+saveToPocketCmd.label = Išsaugoti tinklalapį į „Pocket“
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = Išsaugoti saitą į „Pocket“
+saveLinkToPocketCmd.accesskey = o
+pocketMenuitem.label = Peržiūrėti „Pocket“ sąrašą
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/mr/pocket.properties
@@ -0,0 +1,43 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+addtags = टॅग जोडा
+alreadyhaveacct = आधीपासून Pocket वापरताय?
+continueff = Firefox सोबत पुढे चला
+errorgeneric = Pocket मध्ये जतन करताना त्रुटी आली.
+learnmore = अधिक जाणून घ्या
+loginnow = लॉग इन
+maxtaglength = टॅग्ज साठी 25 वर्णांची मर्यादा आहे
+mustbeconnected = Pocket मध्ये साठविण्यासाठी आपले इंटरनेट चालू असणे आवश्यक आहे. कृपया आपली जोडणी तपासा आणि पुन्हा प्रयत्न करा.
+onlylinkssaved = फक्त दुवे जतन केले जाऊ शकतात
+pagenotsaved = पृष्ठ जतन झाले नाही
+pageremoved = पृष्ठ काढले गेले
+pagesaved = Pocket मध्ये जतन झाले
+processingremove = पृष्ठ काढून टाकत आहे...
+processingtags = टॅग्ज जोडत आहे…
+removepage = पृष्ठ काढून टाका
+save = जतन करा
+saving = जतन करत आहे...
+signupemail = ईमेलसह साईन अप करा
+signuptosave = Pocket साठी साईन अप करा. हे मोफत आहे.
+suggestedtags = सूचविलेले टॅग्स
+tagline = Firefox मधील नोंदी आणि व्हिडीओ कुठल्याही साधनावर केंव्हाही Pocket मध्ये पाहण्यासाठी साठवा.
+taglinestory_one = Firefox वरील कोणताही लेख, व्हिडिओ किंवा पृष्ठ जतन करण्यासाठी Pocket बटणावर क्लिक करा.
+taglinestory_two = कधीही कुठल्याही साधनावर Pocket मध्ये पाहा.
+tagssaved = टॅग्स जोडले
+tos = सुरु ठेवुन, आपण Pocketच्या <a href="%1$S" target="_blank">सेवेच्या अटी</a> आणि <a href="%2$S" target="_blank">गोपनीयता धोरणांशी</a> सहमत आहात
+tryitnow = आत्ताच वापरुन पाहा
+signinfirefox = Firefox सह साइन इन करा
+signupfirefox = Firefox सह साईन अप करा
+viewlist = यादी पहा
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = Pocket मध्ये जतन करा
+saveToPocketCmd.label = पृष्ठ Pocket मध्ये जतन करा
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = दुवा Pocket मध्ये संकलित करा
+saveLinkToPocketCmd.accesskey = o
+pocketMenuitem.label = पॉकेट सूची पहा
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/ms/pocket.properties
@@ -0,0 +1,43 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+addtags = Tambah Tag
+alreadyhaveacct = Sudah menjadi pengguna Poket?
+continueff = Teruskan dengan Firefox
+errorgeneric = Ada ralat semasa cuba menyimpan ke Pocket.
+learnmore = Ketahui Selanjutnya
+loginnow = Log masuk
+maxtaglength = Tag dihadkan hanya 25 aksara
+mustbeconnected = Anda mesti ada sambungan Internet untuk menyimpan ke Pocket. Sila periksa sambungan anda dan cuba lagi.
+onlylinkssaved = Hanya pautan boleh disimpan
+pagenotsaved = Halaman Tidak Disimpan
+pageremoved = Halaman Dialih keluar
+pagesaved = Disimpan ke Pocket
+processingremove = Sedang mengalih keluar Halaman…
+processingtags = Sedang menambah tag…
+removepage = Alih keluar Halaman
+save = Simpan
+saving = Sedang menyimpan…
+signupemail = Daftar dengan e-mel
+signuptosave = Daftar masuk ke Pocket. Percuma.
+suggestedtags = Tag Disyorkan
+tagline = Simpan artikel dan video dari Firefox untuk dilihat dalam Pocket pada apa jua peranti pada bila-bila masa.
+taglinestory_one = Klik butang Pocket untuk menyimpan apa jua artikel, video atau halaman daripada Firefox.
+taglinestory_two = Papar dalam Pocket dalam mana-mana peranti, bila-bila masa saja.
+tagssaved = Tag Ditambah
+tos = Dengan meneruskan, anda setuju dengan <a href="%1$S" target="_blank">Terma Perkhidmatan</a> Pocket dan <a href="%2$S" target="_blank">Polisi Privasi</a>
+tryitnow = Cubanya Sekarang
+signinfirefox = Daftar masuk Firefox
+signupfirefox = Daftar dengan Firefox
+viewlist = Senarai Paparan
+
+# LOCALIZATION NOTE(pocket-button.label, pocket-button.tooltiptext, saveToPocketCmd.label, saveLinkToPocketCmd.label, pocketMenuitem.label):
+# "Pocket" is a brand name.
+pocket-button.label = Pocket
+pocket-button.tooltiptext = Simpan ke Pocket
+saveToPocketCmd.label = Simpan Halaman ke Pocket
+saveToPocketCmd.accesskey = k
+saveLinkToPocketCmd.label = Simpan Pautan ke Pocket
+saveLinkToPocketCmd.accesskey = o
+pocketMenuitem.label = Papar Senarai Pocket
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pocket/locale/pl/pocket.properties
@@ -0,0 +1,48 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+taglinestory_one=Kliknij przycisk Pocket, aby wysłać dowolny artykuł, film lub stronę z Firefoksa.
+taglinestory_two=Czytaj z Pocket o dowolnej porze na dowolnym urządzeniu.
+learnmore=Więcej informacji
+
+signuptosave=Utwórz konto w Pocket. Jest darmowe.
+signupfirefox=Utwórz konto z Firefoksem
+signupemail=Utwórz konto z adresem e-mail
+alreadyhaveacct=Masz już konto Pocket?
+loginnow=Zaloguj się
+
+tos=Kontynuując, wyrażasz zgodę na <a href="%1$S" target="_blank">warunki korzystania z usługi</a> i <a href="%2$S" target="_blank">politykę prywatności</a>
+tryitnow=Wypróbuj teraz
+
+continueff=Kontynuuj z kontem Firefoksa
+signinfirefox=Zaloguj się z Firefoksem
+viewlist=Otwórz w Pocket
+
+removepage=Usuń stronę
+processingremove=Usuwanie strony…
+pageremoved=Usunięto stronę
+
+save=Wyślij
+saving=Wysyłanie…
+pagesaved=Wysłano do Pocket
+
+addtags=Etykiety
+processingtags=Wysyłanie etykiet…
+tagssaved=Wysłano etykiety
+maxtaglength=Etykiety są ograniczone do 25 znaków
+suggestedtags=Sugerowane etykiety
+tagline=Wysyłaj artykuły i filmy z Firefoksa do Pocket, aby wyświetlić je o dowolnej porze na dowolnym urządzeniu.
+
+errorgeneric=Wystąpił błąd podczas wysyłania do Pocket.
+mustbeconnected=Połączenie z Internetem jest konieczne do przesyłania do Pocket. Proszę sprawdzić połączenie i spróbować ponownie.
+onlylinkssaved=Tylko odnośniki mogą być przesyłane
+pagenotsaved=Nie przesłano strony
+
+pocket-button.label=Pocket
+pocket-button.tooltiptext=Wyślij do Pocket
+saveToPocketCmd.label=Wyślij stronę do Pocket
+saveToPocketCmd.accesskey=s
+saveLinkToPocketCmd.label=Wyślij odnośnik do Pocket
+saveLinkToPocketCmd.accesskey=o
+pocketMenuitem.label=Wysłane do Pocket
--- a/browser/themes/osx/syncedtabs/sidebar.css
+++ b/browser/themes/osx/syncedtabs/sidebar.css
@@ -107,17 +107,17 @@ html {
 .search-box {
   -moz-appearance: searchfield;
   padding: 1px;
   font-size: 12px;
   cursor: text;
   margin: 4px 8px 10px;
   border-width: 3px;
   border-style: solid;
-  border-color: -moz-use-text-color;
+  border-color: currentcolor;
   border-image: none;
   -moz-border-top-colors: transparent #888 #000;
   -moz-border-right-colors: transparent #FFF #000;
   -moz-border-bottom-colors: transparent #FFF #000;
   -moz-border-left-colors: transparent #888 #000;
   border-top-right-radius: 2px;
   border-bottom-left-radius: 2px;
   background-color: #FFF;
--- a/build/moz.configure/init.configure
+++ b/build/moz.configure/init.configure
@@ -811,10 +811,8 @@ add_old_configure_assignment('PKG_CONFIG
 # Bug 1278542: This function is a workaround to resolve
 # |android_ndk_include|'s dependency on 'gonkdir.' The
 # actual implementation is located in b2g/moz.configure.
 # Remove this function as soon as 'android_ndk_include'
 # depends on 'target.'
 @dependable
 def gonkdir():
     return None
-
-include(include_project_configure)
--- a/build/mozconfig.cache
+++ b/build/mozconfig.cache
@@ -77,18 +77,21 @@ elif test -z "$CCACHE_DIR" -a -z "$SCCAC
                 master=dummy.usw1.mozilla.com
                 ;;
             us-west-2)
                 master=dummy.usw2.mozilla.com
                 ;;
             esac
         fi
     fi
+fi
 
-
+# if platform hasn't been determined from buildprops, and we're on windows,
+# it must be set to prevent adding ac_add_options --with-ccache below
+if test -z "$platform"; then
     # set platform based on the SYSTEMROOT env var
     case "${SYSTEMROOT}" in
     *Windows)
         platform=windows
         ;;
     esac
 fi
 
--- a/caps/nsScriptSecurityManager.cpp
+++ b/caps/nsScriptSecurityManager.cpp
@@ -648,47 +648,16 @@ EqualOrSubdomain(nsIURI* aProbeArg, nsIU
             return false;
         }
         NS_ENSURE_SUCCESS(rv, false);
         rv = probe->SetHost(newHost);
         NS_ENSURE_SUCCESS(rv, false);
     }
 }
 
-static bool
-AllSchemesMatch(nsIURI* aURI, nsIURI* aOtherURI)
-{
-    auto stringComparator = nsCaseInsensitiveCStringComparator();
-    nsCOMPtr<nsIURI> currentURI = aURI;
-    nsCOMPtr<nsIURI> currentOtherURI = aOtherURI;
-    while (currentURI && currentOtherURI) {
-        nsAutoCString scheme, otherScheme;
-        currentURI->GetScheme(scheme);
-        currentOtherURI->GetScheme(otherScheme);
-        if (!scheme.Equals(otherScheme, stringComparator)) {
-            return false;
-        }
-        nsCOMPtr<nsINestedURI> nestedURI = do_QueryInterface(currentURI);
-        nsCOMPtr<nsINestedURI> nestedOtherURI = do_QueryInterface(currentOtherURI);
-        // If neither are nested and all schemes have matched so far
-        // (or we would have bailed already), we're the same:
-        if (!nestedURI && !nestedOtherURI) {
-            return true;
-        }
-        // If one is nested and the other not, they're not equal:
-        if (!nestedURI != !nestedOtherURI) {
-            return false;
-        }
-        // At this stage, both are still nested URIs, so let's play again:
-        nestedURI->GetInnerURI(getter_AddRefs(currentURI));
-        nestedOtherURI->GetInnerURI(getter_AddRefs(currentOtherURI));
-    }
-    return false;
-}
-
 NS_IMETHODIMP
 nsScriptSecurityManager::CheckLoadURIWithPrincipal(nsIPrincipal* aPrincipal,
                                                    nsIURI *aTargetURI,
                                                    uint32_t aFlags)
 {
     NS_PRECONDITION(aPrincipal, "CheckLoadURIWithPrincipal must have a principal");
     // If someone passes a flag that we don't understand, we should
     // fail, because they may need a security check that we don't
@@ -801,63 +770,60 @@ nsScriptSecurityManager::CheckLoadURIWit
     bool targetIsViewSource = false;
 
     if (sourceScheme.LowerCaseEqualsLiteral(NS_NULLPRINCIPAL_SCHEME)) {
         // A null principal can target its own URI.
         if (sourceURI == aTargetURI) {
             return NS_OK;
         }
     }
-    else if (AllSchemesMatch(sourceURI, aTargetURI) ||
-             (sViewSourceReachableFromInner &&
-              sourceScheme.EqualsIgnoreCase(targetScheme.get()) &&
-              NS_SUCCEEDED(aTargetURI->SchemeIs("view-source", &targetIsViewSource)) &&
-              targetIsViewSource))
+    else if (sViewSourceReachableFromInner &&
+             sourceScheme.EqualsIgnoreCase(targetScheme.get()) &&
+             NS_SUCCEEDED(aTargetURI->SchemeIs("view-source", &targetIsViewSource)) &&
+             targetIsViewSource)
     {
-        // every scheme can access another URI from the same scheme,
-        // as long as they don't represent null principals...
-        // Or they don't require an special permission to do so
-        // See bug#773886
-        rv = NS_URIChainHasFlags(targetBaseURI,
-                                 nsIProtocolHandler::URI_CROSS_ORIGIN_NEEDS_WEBAPPS_PERM,
-                                 &hasFlags);
-        NS_ENSURE_SUCCESS(rv, rv);
-
-        if (hasFlags) {
-            // Let apps load the whitelisted theme resources even if they don't
-            // have the webapps-manage permission but have the themeable one.
-            // Resources from the theme origin are also allowed to load from
-            // the theme origin (eg. stylesheets using images from the theme).
-            auto themeOrigin = Preferences::GetCString("b2g.theme.origin");
-            if (themeOrigin) {
-                nsAutoCString targetOrigin;
-                nsPrincipal::GetOriginForURI(targetBaseURI, targetOrigin);
-                if (targetOrigin.Equals(themeOrigin)) {
-                    nsAutoCString pOrigin;
-                    aPrincipal->GetOrigin(pOrigin);
-                    return nsContentUtils::IsExactSitePermAllow(aPrincipal, "themeable") ||
-                           pOrigin.Equals(themeOrigin)
-                        ? NS_OK : NS_ERROR_DOM_BAD_URI;
-                }
-            }
-            // In this case, we allow opening only if the source and target URIS
-            // are on the same domain, or the opening URI has the webapps
-            // permision granted
-            if (!SecurityCompareURIs(sourceBaseURI, targetBaseURI) &&
-                !nsContentUtils::IsExactSitePermAllow(aPrincipal, WEBAPPS_PERM_NAME)) {
-                return NS_ERROR_DOM_BAD_URI;
-            }
-        }
+        // exception for foo: linking to view-source:foo for reftests...
         return NS_OK;
     }
 
-    // If the schemes don't match, the policy is specified by the protocol
-    // flags on the target URI.
-    return CheckLoadURIFlags(sourceURI, aTargetURI, sourceBaseURI,
-                             targetBaseURI, aFlags);
+    // If we get here, check all the schemes can link to each other, from the top down:
+    nsCaseInsensitiveCStringComparator stringComparator;
+    nsCOMPtr<nsIURI> currentURI = sourceURI;
+    nsCOMPtr<nsIURI> currentOtherURI = aTargetURI;
+    while (currentURI && currentOtherURI) {
+        nsAutoCString scheme, otherScheme;
+        currentURI->GetScheme(scheme);
+        currentOtherURI->GetScheme(otherScheme);
+
+        // If schemes are not equal, check if the URI flags of the current
+        // target URI allow the current source URI to link to it.
+        // The policy is specified by the protocol flags on both URIs.
+        if (!scheme.Equals(otherScheme, stringComparator)) {
+            return CheckLoadURIFlags(currentURI, currentOtherURI,
+                                     sourceBaseURI, targetBaseURI, aFlags);
+        }
+        // Otherwise... check if we can nest another level:
+        nsCOMPtr<nsINestedURI> nestedURI = do_QueryInterface(currentURI);
+        nsCOMPtr<nsINestedURI> nestedOtherURI = do_QueryInterface(currentOtherURI);
+
+        // If schemes match and neither URI is nested further, we're OK.
+        if (!nestedURI && !nestedOtherURI) {
+            return NS_OK;
+        }
+        // If one is nested and the other isn't, something is wrong.
+        if (!nestedURI != !nestedOtherURI) {
+            return NS_ERROR_DOM_BAD_URI;
+        }
+        // Otherwise, both should be nested and we'll go through the loop again.
+        nestedURI->GetInnerURI(getter_AddRefs(currentURI));
+        nestedOtherURI->GetInnerURI(getter_AddRefs(currentOtherURI));
+    }
+
+    // We should never get here. We should always return from inside the loop.
+    return NS_ERROR_DOM_BAD_URI;
 }
 
 /**
  * Helper method to check whether the target URI and its innermost ("base") URI
  * has protocol flags that should stop it from being loaded by the source URI
  * (and/or the source URI's innermost ("base") URI), taking into account any
  * nsIScriptSecurityManager flags originally passed to
  * CheckLoadURIWithPrincipal and friends.
@@ -1198,16 +1164,17 @@ nsScriptSecurityManager::GetAppCodebaseP
 }
 
 NS_IMETHODIMP
 nsScriptSecurityManager::
   GetLoadContextCodebasePrincipal(nsIURI* aURI,
                                   nsILoadContext* aLoadContext,
                                   nsIPrincipal** aPrincipal)
 {
+  NS_ENSURE_STATE(aLoadContext);
   DocShellOriginAttributes docShellAttrs;
   bool result = aLoadContext->GetOriginAttributes(docShellAttrs);;
   NS_ENSURE_TRUE(result, NS_ERROR_FAILURE);
 
   PrincipalOriginAttributes attrs;
   attrs.InheritFromDocShellToDoc(docShellAttrs, aURI);
 
   nsresult rv = MaybeSetAddonIdFromURI(attrs, aURI);
--- a/caps/tests/mochitest/browser_checkloaduri.js
+++ b/caps/tests/mochitest/browser_checkloaduri.js
@@ -10,45 +10,51 @@ const URLs = new Map([
   // - whether the URI can be created at all (some protocol handlers will
   //   refuse to create certain variants)
     ["http://www.example2.com", true, true, true],
     ["feed:http://www.example2.com", false, false, true],
     ["https://www.example2.com", true, true, true],
     ["chrome://foo/content/bar.xul", false, false, true],
     ["feed:chrome://foo/content/bar.xul", false, false, false],
     ["view-source:http://www.example2.com", false, false, true],
+    ["view-source:https://www.example2.com", false, false, true],
     ["view-source:feed:http://www.example2.com", false, false, true],
     ["feed:view-source:http://www.example2.com", false, false, false],
     ["data:text/html,Hi", true, false, true],
+    ["view-source:data:text/html,Hi", false, false, true],
     ["javascript:alert('hi')", true, false, true],
   ]],
   ["feed:http://www.example.com", [
     ["http://www.example2.com", true, true, true],
     ["feed:http://www.example2.com", true, true, true],
     ["https://www.example2.com", true, true, true],
-    ["feed:https://www.example2.com", false, false, true],
+    ["feed:https://www.example2.com", true, true, true],
     ["chrome://foo/content/bar.xul", false, false, true],
     ["feed:chrome://foo/content/bar.xul", false, false, false],
     ["view-source:http://www.example2.com", false, false, true],
+    ["view-source:https://www.example2.com", false, false, true],
     ["view-source:feed:http://www.example2.com", false, false, true],
     ["feed:view-source:http://www.example2.com", false, false, false],
     ["data:text/html,Hi", true, false, true],
+    ["view-source:data:text/html,Hi", false, false, true],
     ["javascript:alert('hi')", true, false, true],
   ]],
   ["view-source:http://www.example.com", [
     ["http://www.example2.com", true, true, true],
     ["feed:http://www.example2.com", false, false, true],
     ["https://www.example2.com", true, true, true],
     ["feed:https://www.example2.com", false, false, true],
     ["chrome://foo/content/bar.xul", false, false, true],
     ["feed:chrome://foo/content/bar.xul", false, false, false],
     ["view-source:http://www.example2.com", true, true, true],
+    ["view-source:https://www.example2.com", true, true, true],
     ["view-source:feed:http://www.example2.com", false, false, true],
     ["feed:view-source:http://www.example2.com", false, false, false],
     ["data:text/html,Hi", true, false, true],
+    ["view-source:data:text/html,Hi", true, false, true],
     ["javascript:alert('hi')", true, false, true],
   ]],
 ]);
 
 function testURL(source, target, canLoad, canLoadWithoutInherit, canCreate, flags) {
   let threw = false;
   let targetURI;
   try {
--- a/devtools/client/framework/devtools-browser.js
+++ b/devtools/client/framework/devtools-browser.js
@@ -136,16 +136,20 @@ var gDevToolsBrowser = exports.gDevTools
         break;
       case "nsPref:changed":
         if (prefName.endsWith("enabled")) {
           for (let win of this._trackedBrowserWindows) {
             this.updateCommandAvailability(win);
           }
         }
         break;
+      case "domwindowopened":
+        let win = subject.QueryInterface(Ci.nsIDOMEventTarget);
+        win.addEventListener("DOMContentLoaded", this, { once: true });
+        break;
     }
   },
 
   _prefObserverRegistered: false,
 
   ensurePrefObserver: function () {
     if (!this._prefObserverRegistered) {
       this._prefObserverRegistered = true;
@@ -397,42 +401,59 @@ var gDevToolsBrowser = exports.gDevTools
    * Move WebIDE widget to the navbar
    */
    // Used by webide.js
   moveWebIDEWidgetInNavbar: function () {
     CustomizableUI.addWidgetToArea("webide-button", CustomizableUI.AREA_NAVBAR);
   },
 
   /**
+   * Starts setting up devtools on a given browser window. This method is
+   * called on DOMContentLoaded, so earlier than registerBrowserWindow which
+   * is called after delayed-startup notification. This method should only do
+   * what has to be done early. Otherwise devtools should be initialized lazily
+   * to prevent overloading Firefox startup.
+   *
+   * @param {ChromeWindow} window
+   *        The window to which devtools should be hooked to.
+   */
+  _onBrowserWindowLoaded: function (win) {
+    // This method is called for all top level window, only consider firefox
+    // windows
+    if (!win.gBrowser || !win.location.href.endsWith("browser.xul")) {
+      return;
+    }
+    BrowserMenus.addMenus(win.document);
+    win.addEventListener("unload", this);
+  },
+
+  /**
    * Add this DevTools's presence to a browser window's document
    *
-   * @param {XULDocument} doc
-   *        The document to which devtools should be hooked to.
+   * @param {ChromeWindow} win
+   *        The window to which devtools should be hooked to.
    */
   _registerBrowserWindow: function (win) {
     if (gDevToolsBrowser._trackedBrowserWindows.has(win)) {
       return;
     }
     gDevToolsBrowser._trackedBrowserWindows.add(win);
 
-    BrowserMenus.addMenus(win.document);
-
     // Register the Developer widget in the Hamburger menu or navbar
     // only once menus are registered as it depends on it.
     gDevToolsBrowser.installDeveloperWidget();
 
     // Inject lazily DeveloperToolbar on the chrome window
     loader.lazyGetter(win, "DeveloperToolbar", function () {
       let { DeveloperToolbar } = require("devtools/client/shared/developer-toolbar");
       return new DeveloperToolbar(win);
     });
 
     this.updateCommandAvailability(win);
     this.ensurePrefObserver();
-    win.addEventListener("unload", this);
 
     let tabContainer = win.gBrowser.tabContainer;
     tabContainer.addEventListener("TabSelect", this, false);
     tabContainer.addEventListener("TabOpen", this, false);
     tabContainer.addEventListener("TabClose", this, false);
     tabContainer.addEventListener("TabPinned", this, false);
     tabContainer.addEventListener("TabUnpinned", this, false);
   },
@@ -619,23 +640,26 @@ var gDevToolsBrowser = exports.gDevTools
   /**
    * Called on browser unload to remove menu entries, toolboxes and event
    * listeners from the closed browser window.
    *
    * @param  {XULWindow} win
    *         The window containing the menu entry
    */
   _forgetBrowserWindow: function (win) {
+    // _forgetBrowserWindow can only be called once for each window, but
+    // _registerBrowserWindow may not have been called. Instead, only
+    // _onBrowserWindowLoaded was and we only need to revert that.
+    win.removeEventListener("unload", this);
+    BrowserMenus.removeMenus(win.document);
+
     if (!gDevToolsBrowser._trackedBrowserWindows.has(win)) {
       return;
     }
     gDevToolsBrowser._trackedBrowserWindows.delete(win);
-    win.removeEventListener("unload", this);
-
-    BrowserMenus.removeMenus(win.document);
 
     // Destroy toolboxes for closed window
     for (let [target, toolbox] of gDevTools._toolboxes) {
       if (toolbox.win.top == win) {
         toolbox.destroy();
       }
     }
 
@@ -674,16 +698,19 @@ var gDevToolsBrowser = exports.gDevTools
         this._tabStats.histOpen.push(open);
         this._tabStats.histPinned.push(pinned);
         this._tabStats.peakOpen = Math.max(open, this._tabStats.peakOpen);
         this._tabStats.peakPinned = Math.max(pinned, this._tabStats.peakPinned);
         break;
       case "TabSelect":
         gDevToolsBrowser._updateMenuCheckbox();
         break;
+      case "DOMContentLoaded":
+        gDevToolsBrowser._onBrowserWindowLoaded(event.target.defaultView);
+        break;
       case "unload":
         // top-level browser window unload
         gDevToolsBrowser._forgetBrowserWindow(event.target.defaultView);
         break;
     }
   },
 
   _pingTelemetry: function () {
@@ -703,16 +730,17 @@ var gDevToolsBrowser = exports.gDevTools
     this._telemetry.log(TABS_PINNED_AVG_HISTOGRAM, mean(tabStats.histPinned));
   },
 
   /**
    * All browser windows have been closed, tidy up remaining objects.
    */
   destroy: function () {
     Services.prefs.removeObserver("devtools.", gDevToolsBrowser);
+    Services.ww.unregisterNotification(gDevToolsBrowser);
     Services.obs.removeObserver(gDevToolsBrowser, "browser-delayed-startup-finished");
     Services.obs.removeObserver(gDevToolsBrowser.destroy, "quit-application");
 
     gDevToolsBrowser._pingTelemetry();
     gDevToolsBrowser._telemetry = null;
 
     for (let win of gDevToolsBrowser._trackedBrowserWindows) {
       gDevToolsBrowser._forgetBrowserWindow(win);
@@ -735,24 +763,26 @@ gDevTools.on("tool-unregistered", functi
   }
   gDevToolsBrowser._removeToolFromWindows(toolId);
 });
 
 gDevTools.on("toolbox-ready", gDevToolsBrowser._updateMenuCheckbox);
 gDevTools.on("toolbox-destroyed", gDevToolsBrowser._updateMenuCheckbox);
 
 Services.obs.addObserver(gDevToolsBrowser.destroy, "quit-application", false);
+Services.ww.registerNotification(gDevToolsBrowser);
 Services.obs.addObserver(gDevToolsBrowser, "browser-delayed-startup-finished", false);
 
 // Fake end of browser window load event for all already opened windows
 // that is already fully loaded.
 let enumerator = Services.wm.getEnumerator(gDevTools.chromeWindowType);
 while (enumerator.hasMoreElements()) {
   let win = enumerator.getNext();
   if (win.gBrowserInit && win.gBrowserInit.delayedStartupFinished) {
+    gDevToolsBrowser._onBrowserWindowLoaded(win);
     gDevToolsBrowser._registerBrowserWindow(win);
   }
 }
 
 // Watch for module loader unload. Fires when the tools are reloaded.
 unload(function () {
   gDevToolsBrowser.destroy();
 });
--- a/devtools/client/preferences/devtools.js
+++ b/devtools/client/preferences/devtools.js
@@ -345,11 +345,15 @@ pref("devtools.telemetry.tools.opened.ve
 // Enable the JSON View tool (an inspector for application/json documents) on
 // Nightly and Dev. Edition.
 #ifdef RELEASE_BUILD
 pref("devtools.jsonview.enabled", false);
 #else
 pref("devtools.jsonview.enabled", true);
 #endif
 
-// Disable the HTML responsive design tool by default.  Currently disabled until
-// ready to replace the legacy XUL version.
+// Enable the HTML responsive design tool in Nightly only.  Disabled by default for all
+// other channels.
+#ifdef NIGHTLY_BUILD
+pref("devtools.responsive.html.enabled", true);
+#else
 pref("devtools.responsive.html.enabled", false);
+#endif
--- a/devtools/client/responsive.html/index.js
+++ b/devtools/client/responsive.html/index.js
@@ -105,19 +105,19 @@ window.addInitialViewport = contentURI =
  * Called by manager.js when tests want to check the viewport size.
  */
 window.getViewportSize = () => {
   let { width, height } = bootstrap.store.getState().viewports[0];
   return { width, height };
 };
 
 /**
- * Called by manager.js to set viewport size from GCLI.
+ * Called by manager.js to set viewport size from tests, GCLI, etc.
  */
-window.setViewportSize = (width, height) => {
+window.setViewportSize = ({ width, height }) => {
   try {
     bootstrap.dispatch(resizeViewport(0, width, height));
   } catch (e) {
     console.error(e);
   }
 };
 
 /**
--- a/devtools/client/responsive.html/manager.js
+++ b/devtools/client/responsive.html/manager.js
@@ -167,17 +167,17 @@ const ResponsiveUIManager = exports.Resp
    * @param args
    *        The GCLI command arguments.
    */
   handleGcliCommand(window, tab, command, args) {
     let completed;
     switch (command) {
       case "resize to":
         completed = this.openIfNeeded(window, tab, { command: true });
-        this.activeTabs.get(tab).setViewportSize(args.width, args.height);
+        this.activeTabs.get(tab).setViewportSize(args);
         break;
       case "resize on":
         completed = this.openIfNeeded(window, tab, { command: true });
         break;
       case "resize off":
         completed = this.closeIfNeeded(window, tab, { command: true });
         break;
       case "resize toggle":
@@ -484,21 +484,21 @@ ResponsiveUI.prototype = {
   /**
    * Helper for tests. Assumes a single viewport for now.
    */
   getViewportSize() {
     return this.toolWindow.getViewportSize();
   },
 
   /**
-   * Helper for tests. Assumes a single viewport for now.
+   * Helper for tests, GCLI, etc. Assumes a single viewport for now.
    */
-  setViewportSize: Task.async(function* (width, height) {
+  setViewportSize: Task.async(function* (size) {
     yield this.inited;
-    this.toolWindow.setViewportSize(width, height);
+    this.toolWindow.setViewportSize(size);
   }),
 
   /**
    * Helper for tests/reloading the viewport. Assumes a single viewport for now.
    */
   getViewportBrowser() {
     return this.toolWindow.getViewportBrowser();
   },
--- a/devtools/client/responsive.html/reducers/viewports.js
+++ b/devtools/client/responsive.html/reducers/viewports.js
@@ -44,16 +44,23 @@ let reducers = {
   },
 
   [RESIZE_VIEWPORT](viewports, { id, width, height }) {
     return viewports.map(viewport => {
       if (viewport.id !== id) {
         return viewport;
       }
 
+      if (!width) {
+        width = viewport.width;
+      }
+      if (!height) {
+        height = viewport.height;
+      }
+
       return Object.assign({}, viewport, {
         width,
         height,
       });
     });
   },
 
   [ROTATE_VIEWPORT](viewports, { id }) {
--- a/devtools/client/responsive.html/test/browser/head.js
+++ b/devtools/client/responsive.html/test/browser/head.js
@@ -161,17 +161,17 @@ function waitForViewportResizeTo(ui, wid
 }
 
 var setViewportSize = Task.async(function* (ui, manager, width, height) {
   let size = ui.getViewportSize();
   info(`Current size: ${size.width} x ${size.height}, ` +
        `set to: ${width} x ${height}`);
   if (size.width != width || size.height != height) {
     let resized = waitForViewportResizeTo(ui, width, height);
-    ui.setViewportSize(width, height);
+    ui.setViewportSize({ width, height });
     yield resized;
   }
 });
 
 function getElRect(selector, win) {
   let el = win.document.querySelector(selector);
   return el.getBoundingClientRect();
 }
--- a/devtools/client/responsivedesign/responsivedesign.jsm
+++ b/devtools/client/responsivedesign/responsivedesign.jsm
@@ -57,28 +57,28 @@ var Manager = {
    *
    * @param aWindow the main window.
    * @param aTab the tab targeted.
    */
   toggle: function (aWindow, aTab) {
     if (this.isActiveForTab(aTab)) {
       ActiveTabs.get(aTab).close();
     } else {
-      this.runIfNeeded(aWindow, aTab);
+      this.openIfNeeded(aWindow, aTab);
     }
   },
 
   /**
    * Launches the responsive mode.
    *
    * @param aWindow the main window.
    * @param aTab the tab targeted.
    * @returns {ResponsiveUI} the instance of ResponsiveUI for the current tab.
    */
-  runIfNeeded: Task.async(function* (aWindow, aTab) {
+  openIfNeeded: Task.async(function* (aWindow, aTab) {
     let ui;
     if (!this.isActiveForTab(aTab)) {
       ui = new ResponsiveUI(aWindow, aTab);
       yield ui.inited;
     } else {
       ui = this.getResponsiveUIForTab(aTab);
     }
     return ui;
@@ -106,40 +106,42 @@ var Manager = {
    * @param aWindow the browser window.
    * @param aTab the tab targeted.
    * @param aCommand the command name.
    * @param aArgs command arguments.
    */
   handleGcliCommand: Task.async(function* (aWindow, aTab, aCommand, aArgs) {
     switch (aCommand) {
       case "resize to":
-        let ui = yield this.runIfNeeded(aWindow, aTab);
-        ui.setSize(aArgs.width, aArgs.height);
+        let ui = yield this.openIfNeeded(aWindow, aTab);
+        ui.setViewportSize(aArgs);
         break;
       case "resize on":
-        this.runIfNeeded(aWindow, aTab);
+        this.openIfNeeded(aWindow, aTab);
         break;
       case "resize off":
         if (this.isActiveForTab(aTab)) {
           yield ActiveTabs.get(aTab).close();
         }
         break;
       case "resize toggle":
         this.toggle(aWindow, aTab);
       default:
     }
   })
 };
 
 EventEmitter.decorate(Manager);
 
-// If the experimental HTML UI is enabled, delegate the ResponsiveUIManager API
-// over to that tool instead.  Performing this delegation here allows us to
-// contain the pref check to a single place.
-if (Services.prefs.getBoolPref("devtools.responsive.html.enabled")) {
+// If the new HTML RDM UI is enabled and e10s is enabled by default (e10s is required for
+// the new HTML RDM UI to function), delegate the ResponsiveUIManager API over to that
+// tool instead.  Performing this delegation here allows us to contain the pref check to a
+// single place.
+if (Services.prefs.getBoolPref("devtools.responsive.html.enabled") &&
+    Services.appinfo.browserTabsRemoteAutostart) {
   let { ResponsiveUIManager } =
     require("devtools/client/responsive.html/manager");
   this.ResponsiveUIManager = ResponsiveUIManager;
 } else {
   this.ResponsiveUIManager = Manager;
 }
 
 var defaultPresets = [
@@ -412,17 +414,17 @@ ResponsiveUI.prototype = {
       this.mm.addMessageListener(message, listener);
     });
   },
 
   /**
    * Emit an event when the content has been resized. Only used in tests.
    */
   onContentResize: function (msg) {
-    ResponsiveUIManager.emit("contentResize", {
+    ResponsiveUIManager.emit("content-resize", {
       tab: this.tab,
       width: msg.data.width,
       height: msg.data.height,
     });
   },
 
   /**
    * Handle events
@@ -438,16 +440,20 @@ ResponsiveUI.prototype = {
           this.checkMenus();
         } else if (!this.mainWindow.gBrowser.selectedTab.responsiveUI) {
           this.unCheckMenus();
         }
         break;
     }
   },
 
+  getViewportBrowser() {
+    return this.browser;
+  },
+
   /**
    * Check the menu items.
    */
   checkMenus: function RUI_checkMenus() {
     this.chromeDoc.getElementById("menu_responsiveUI").setAttribute("checked", "true");
   },
 
   /**
@@ -668,17 +674,20 @@ ResponsiveUI.prototype = {
       this.currentPresetKey = this.customPreset.key;
       this.menulist.selectedItem = menuitem;
     }
 
     let w = this.customPreset.width = parseInt(value[1], 10);
     let h = this.customPreset.height = parseInt(value[2], 10);
 
     this.saveCustomSize();
-    this.setSize(w, h);
+    this.setViewportSize({
+      width: w,
+      height: h,
+    });
   },
 
   /**
    * Build the presets list and append it to the menupopup.
    *
    * @param aParent menupopup.
    */
   registerPresets: function RUI_registerPresets(aParent) {
@@ -750,21 +759,19 @@ ResponsiveUI.prototype = {
         this.addbutton.hidden = true;
         this.removebutton.hidden = false;
       }
     }
   },
 
   /**
    * Apply a preset.
-   *
-   * @param aPreset preset to apply.
    */
-  loadPreset: function RUI_loadPreset(aPreset) {
-    this.setSize(aPreset.width, aPreset.height);
+  loadPreset(preset) {
+    this.setViewportSize(preset);
   },
 
   /**
    * Add a preset to the list and the memory
    */
   addPreset: function RUI_addPreset() {
     let w = this.customPreset.width;
     let h = this.customPreset.height;
@@ -840,30 +847,36 @@ ResponsiveUI.prototype = {
 
     this.customPreset.width = w;
     this.customPreset.height = h;
     let menuitem = this.customMenuitem;
     this.setMenuLabel(menuitem, this.customPreset);
     this.menulist.selectedItem = menuitem;
     this.currentPresetKey = this.customPreset.key;
 
-    this.setSize(w, h);
+    this.setViewportSize({
+      width: w,
+      height: h,
+    });
 
     this.savePresets();
   },
 
   /**
    * Swap width and height.
    */
   rotate: function RUI_rotate() {
     let selectedPreset = this.menuitems.get(this.selectedItem);
     let width = this.rotateValue ? selectedPreset.height : selectedPreset.width;
     let height = this.rotateValue ? selectedPreset.width : selectedPreset.height;
 
-    this.setSize(height, width);
+    this.setViewportSize({
+      width: height,
+      height: width,
+    });
 
     if (selectedPreset.custom) {
       this.saveCustomSize();
     } else {
       this.rotateValue = !this.rotateValue;
       this.saveCurrentPreset();
     }
   },
@@ -994,25 +1007,26 @@ ResponsiveUI.prototype = {
     let height = Number(this.stack.style.minHeight.replace("px", ""));
     return {
       width,
       height,
     };
   },
 
   /**
-   * Change the size of the browser.
-   *
-   * @param aWidth width of the browser.
-   * @param aHeight height of the browser.
+   * Change the size of the viewport.
    */
-  setSize: function RUI_setSize(aWidth, aHeight) {
-    debug(`SET SIZE TO ${aWidth} x ${aHeight}`);
-    this.setWidth(aWidth);
-    this.setHeight(aHeight);
+  setViewportSize({ width, height }) {
+    debug(`SET SIZE TO ${width} x ${height}`);
+    if (width) {
+      this.setWidth(width);
+    }
+    if (height) {
+      this.setHeight(height);
+    }
   },
 
   setWidth: function RUI_setWidth(aWidth) {
     aWidth = Math.min(Math.max(aWidth, MIN_WIDTH), MAX_WIDTH);
     this.stack.style.maxWidth = this.stack.style.minWidth = aWidth + "px";
 
     if (!this.ignoreX)
       this.resizeBarH.setAttribute("left", Math.round(aWidth / 2));
@@ -1117,17 +1131,17 @@ ResponsiveUI.prototype = {
     }
 
     if (height < MIN_HEIGHT) {
       height = MIN_HEIGHT;
     } else {
       this.lastScreenY = screenY;
     }
 
-    this.setSize(width, height);
+    this.setViewportSize({ width, height });
   },
 
   /**
    * Stop End resizing
    */
   stopResizing: function RUI_stopResizing() {
     this.container.style.pointerEvents = "auto";
 
--- a/devtools/client/responsivedesign/test/browser_responsiveui.js
+++ b/devtools/client/responsivedesign/test/browser_responsiveui.js
@@ -106,17 +106,17 @@ function* testManualMouseResize(rdm, man
     mouseMoveParams.ctrlKey = true;
   } else {
     x += 20; y += 10;
   }
 
   EventUtils.synthesizeMouse(rdm.resizer, x, y, mouseMoveParams, window);
   EventUtils.synthesizeMouse(rdm.resizer, x, y, {type: "mouseup"}, window);
 
-  yield once(manager, "contentResize");
+  yield once(manager, "content-resize");
 
   let expectedWidth = initialWidth + 20;
   let expectedHeight = initialHeight + 10;
   info("initial width: " + initialWidth);
   info("initial height: " + initialHeight);
 
   yield verifyResize(rdm, expectedWidth, expectedHeight);
 }
@@ -133,17 +133,17 @@ function* testResizeUsingCustomInput(rdm
   // While typing, the size should not change
   let currentSize = yield getSizing();
   is(currentSize.width, initialWidth, "Typing shouldn't change the width");
   is(currentSize.height, initialHeight, "Typing shouldn't change the height");
 
   // Only the `change` event must change the size
   EventUtils.synthesizeKey("VK_RETURN", {});
 
-  yield once(manager, "contentResize");
+  yield once(manager, "content-resize");
 
   yield verifyResize(rdm, expectedWidth, expectedHeight);
 }
 
 function* testInvalidUserInput(rdm) {
   let {width: initialWidth, height: initialHeight} = yield getSizing();
   let index = rdm.menulist.selectedIndex;
   let expectedValue = initialWidth + "\u00D7" + initialHeight;
@@ -167,17 +167,17 @@ function* testInvalidUserInput(rdm) {
 }
 
 function* testRotate(rdm, manager) {
   yield setSize(rdm, manager, 100, 200);
 
   let {width: initialWidth, height: initialHeight} = yield getSizing();
   rdm.rotate();
 
-  yield once(manager, "contentResize");
+  yield once(manager, "content-resize");
 
   let newSize = yield getSizing();
   is(newSize.width, initialHeight, "The width should now be the height.");
   is(newSize.height, initialWidth, "The height should now be the width.");
 
   let label = rdm.menulist.firstChild.firstChild.getAttribute("label");
   let [width, height] = extractSizeFromString(label);
   is(width, initialHeight, "Width in label should be updated");
--- a/devtools/client/responsivedesign/test/browser_responsiveui_window_close.js
+++ b/devtools/client/responsivedesign/test/browser_responsiveui_window_close.js
@@ -7,17 +7,17 @@ add_task(function* () {
   let newWindowPromise = BrowserTestUtils.waitForNewWindow();
   window.open("about:blank", "_blank");
   let newWindow = yield newWindowPromise;
 
   newWindow.focus();
   yield once(newWindow.gBrowser, "load", true);
 
   let tab = newWindow.gBrowser.selectedTab;
-  yield ResponsiveUIManager.runIfNeeded(newWindow, tab);
+  yield ResponsiveUIManager.openIfNeeded(newWindow, tab);
 
   // Close the window on a tab with an active responsive design UI and
   // wait for the UI to gracefully shutdown.  This has leaked the window
   // in the past.
   ok(ResponsiveUIManager.isActiveForTab(tab),
      "ResponsiveUI should be active for tab when the window is closed");
   let offPromise = once(ResponsiveUIManager, "off");
   yield BrowserTestUtils.closeWindow(newWindow);
--- a/devtools/client/responsivedesign/test/browser_responsiveuiaddcustompreset.js
+++ b/devtools/client/responsivedesign/test/browser_responsiveuiaddcustompreset.js
@@ -41,20 +41,23 @@ add_task(function* () {
      "selected item shouldn't change after add preset and cancel");
   is(presetCount, rdm.presets.length,
      "number of presets shouldn't change after add preset and cancel");
 
   // Adds the custom preset with "Testing preset"
   Services.prompt.value = "Testing preset";
   Services.prompt.returnBool = true;
 
-  let resized = once(manager, "contentResize");
+  let resized = once(manager, "content-resize");
   let customHeight = 123, customWidth = 456;
   rdm.startResizing({});
-  rdm.setSize(customWidth, customHeight);
+  rdm.setViewportSize({
+    width: customWidth,
+    height: customHeight,
+  });
   rdm.stopResizing({});
 
   rdm.addbutton.doCommand();
   yield resized;
 
   yield closeRDM(rdm);
 
   ({rdm} = yield openRDM(tab));
--- a/devtools/client/responsivedesign/test/head.js
+++ b/devtools/client/responsivedesign/test/head.js
@@ -8,18 +8,21 @@ let testDir = gTestPath.substr(0, gTestP
 let sharedHeadURI = testDir + "../../../framework/test/shared-head.js";
 Services.scriptloader.loadSubScript(sharedHeadURI, this);
 
 // Import the GCLI test helper
 let gcliHelpersURI = testDir + "../../../commandline/test/helpers.js";
 Services.scriptloader.loadSubScript(gcliHelpersURI, this);
 
 flags.testing = true;
+Services.prefs.setBoolPref("devtools.responsive.html.enabled", false);
+
 registerCleanupFunction(() => {
   flags.testing = false;
+  Services.prefs.clearUserPref("devtools.responsive.html.enabled");
   Services.prefs.clearUserPref("devtools.responsiveUI.currentPreset");
   Services.prefs.clearUserPref("devtools.responsiveUI.customHeight");
   Services.prefs.clearUserPref("devtools.responsiveUI.customWidth");
   Services.prefs.clearUserPref("devtools.responsiveUI.presets");
   Services.prefs.clearUserPref("devtools.responsiveUI.rotate");
 });
 
 SimpleTest.requestCompleteLog();
@@ -32,17 +35,17 @@ const { ResponsiveUIManager } = Cu.impor
  * @param {method} The method to use to open the RDM (values: menu, keyboard)
  * @return {rdm, manager} Returns the RUI instance and the manager
  */
 var openRDM = Task.async(function* (tab = gBrowser.selectedTab,
                                    method = "menu") {
   let manager = ResponsiveUIManager;
 
   let opened = once(manager, "on");
-  let resized = once(manager, "contentResize");
+  let resized = once(manager, "content-resize");
   if (method == "menu") {
     document.getElementById("menu_responsiveUI").doCommand();
   } else {
     synthesizeKeyFromKeyTag(document.getElementById("key_responsiveUI"));
   }
   yield opened;
 
   let rdm = manager.getResponsiveUIForTab(tab);
@@ -63,17 +66,17 @@ var openRDM = Task.async(function* (tab 
  * @param {rdm} ResponsiveUI instance for the tab
  */
 var closeRDM = Task.async(function* (rdm) {
   let manager = ResponsiveUIManager;
   if (!rdm) {
     rdm = manager.getResponsiveUIForTab(gBrowser.selectedTab);
   }
   let closed = once(manager, "off");
-  let resized = once(manager, "contentResize");
+  let resized = once(manager, "content-resize");
   rdm.close();
   yield resized;
   yield closed;
 });
 
 /**
  * Open the toolbox, with the inspector tool visible.
  * @return a promise that resolves when the inspector is ready
@@ -264,36 +267,36 @@ var selectNode = Task.async(function* (s
 });
 
 function waitForResizeTo(manager, width, height) {
   return new Promise(resolve => {
     let onResize = (_, data) => {
       if (data.width != width || data.height != height) {
         return;
       }
-      manager.off("contentResize", onResize);
-      info(`Got contentResize to ${width} x ${height}`);
+      manager.off("content-resize", onResize);
+      info(`Got content-resize to ${width} x ${height}`);
       resolve();
     };
-    info(`Waiting for contentResize to ${width} x ${height}`);
-    manager.on("contentResize", onResize);
+    info(`Waiting for content-resize to ${width} x ${height}`);
+    manager.on("content-resize", onResize);
   });
 }
 
 var setPresetIndex = Task.async(function* (rdm, manager, index) {
   info(`Current preset: ${rdm.menulist.selectedIndex}, change to: ${index}`);
   if (rdm.menulist.selectedIndex != index) {
-    let resized = once(manager, "contentResize");
+    let resized = once(manager, "content-resize");
     rdm.menulist.selectedIndex = index;
     yield resized;
   }
 });
 
 var setSize = Task.async(function* (rdm, manager, width, height) {
   let size = rdm.getSize();
   info(`Current size: ${size.width} x ${size.height}, ` +
        `set to: ${width} x ${height}`);
   if (size.width != width || size.height != height) {
     let resized = waitForResizeTo(manager, width, height);
-    rdm.setSize(width, height);
+    rdm.setViewportSize({ width, height });
     yield resized;
   }
 });
--- a/devtools/client/styleeditor/StyleEditorUI.jsm
+++ b/devtools/client/styleeditor/StyleEditorUI.jsm
@@ -956,25 +956,18 @@ StyleEditorUI.prototype = {
    *
    * @param  {object} options
    *         Object with width or/and height properties.
    */
   _launchResponsiveMode: Task.async(function* (options = {}) {
     let tab = this._target.tab;
     let win = this._target.tab.ownerDocument.defaultView;
 
-    yield ResponsiveUIManager.runIfNeeded(win, tab);
-    if (options.width && options.height) {
-      ResponsiveUIManager.getResponsiveUIForTab(tab).setSize(options.width,
-                                                             options.height);
-    } else if (options.width) {
-      ResponsiveUIManager.getResponsiveUIForTab(tab).setWidth(options.width);
-    } else if (options.height) {
-      ResponsiveUIManager.getResponsiveUIForTab(tab).setHeight(options.height);
-    }
+    yield ResponsiveUIManager.openIfNeeded(win, tab);
+    ResponsiveUIManager.getResponsiveUIForTab(tab).setViewportSize(options);
   }),
 
   /**
    * Jump cursor to the editor for a stylesheet and line number for a rule.
    *
    * @param  {object} location
    *         Location object with 'line', 'column', and 'source' properties.
    */
--- a/devtools/client/styleeditor/test/browser.ini
+++ b/devtools/client/styleeditor/test/browser.ini
@@ -51,16 +51,17 @@ support-files =
   doc_xulpage.xul
   sync.html
   utf-16.css
   !/devtools/client/commandline/test/helpers.js
   !/devtools/client/framework/test/shared-head.js
   !/devtools/client/inspector/shared/test/head.js
   !/devtools/client/inspector/test/head.js
   !/devtools/client/inspector/test/shared-head.js
+  !/devtools/client/responsive.html/test/browser/devices.json
   !/devtools/client/shared/test/test-actor-registry.js
   !/devtools/client/shared/test/test-actor.js
 
 [browser_styleeditor_autocomplete.js]
 [browser_styleeditor_autocomplete-disabled.js]
 [browser_styleeditor_bom.js]
 [browser_styleeditor_bug_740541_iframes.js]
 [browser_styleeditor_bug_851132_middle_click.js]
--- a/devtools/client/styleeditor/test/browser_styleeditor_media_sidebar.js
+++ b/devtools/client/styleeditor/test/browser_styleeditor_media_sidebar.js
@@ -5,19 +5,19 @@
 "use strict";
 
 // https rather than chrome to improve coverage
 const TESTCASE_URI = TEST_BASE_HTTPS + "media-rules.html";
 const MEDIA_PREF = "devtools.styleeditor.showMediaSidebar";
 
 const RESIZE = 300;
 const LABELS = ["not all", "all", "(max-width: 400px)",
-                "(min-height: 200px) and (max-height: 250px)",
+                "(min-height: 300px) and (max-height: 320px)",
                 "(max-width: 600px)"];
-const LINE_NOS = [1, 7, 19, 25, 30];
+const LINE_NOS = [1, 7, 19, 25, 31];
 const NEW_RULE = "\n@media (max-width: 600px) { div { color: blue; } }";
 
 waitForExplicitFinish();
 
 add_task(function* () {
   let { ui } = yield openStyleEditorForURL(TESTCASE_URI);
 
   is(ui.editors.length, 2, "correct number of editors");
--- a/devtools/client/styleeditor/test/browser_styleeditor_media_sidebar_links.js
+++ b/devtools/client/styleeditor/test/browser_styleeditor_media_sidebar_links.js
@@ -2,31 +2,40 @@
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 /* Tests responsive mode links for
  * @media sidebar width and height related conditions */
 
+const asyncStorage = require("devtools/shared/async-storage");
+Services.prefs.setCharPref("devtools.devices.url",
+  "http://example.com/browser/devtools/client/responsive.html/test/browser/devices.json");
+
+registerCleanupFunction(() => {
+  Services.prefs.clearUserPref("devtools.devices.url");
+  asyncStorage.removeItem("devtools.devices.url_cache");
+});
+
 const mgr = "resource://devtools/client/responsivedesign/responsivedesign.jsm";
 const {ResponsiveUIManager} = Cu.import(mgr, {});
 const TESTCASE_URI = TEST_BASE_HTTPS + "media-rules.html";
 const responsiveModeToggleClass = ".media-responsive-mode-toggle";
 
 add_task(function* () {
   let {ui} = yield openStyleEditorForURL(TESTCASE_URI);
 
   let editor = ui.editors[1];
   yield openEditor(editor);
 
   let tab = gBrowser.selectedTab;
   testNumberOfLinks(editor);
   yield testMediaLink(editor, tab, ui, 2, "width", 400);
-  yield testMediaLink(editor, tab, ui, 3, "height", 200);
+  yield testMediaLink(editor, tab, ui, 3, "height", 300);
 
   yield closeRDM(tab, ui);
   doFinalChecks(editor);
 });
 
 function testNumberOfLinks(editor) {
   let sidebar = editor.details.querySelector(".stylesheet-sidebar");
   let conditions = sidebar.querySelectorAll(".media-rule-condition");
@@ -42,41 +51,42 @@ function testNumberOfLinks(editor) {
        "There should be 2 responsive mode links in the media rule");
 }
 
 function* testMediaLink(editor, tab, ui, itemIndex, type, value) {
   let sidebar = editor.details.querySelector(".stylesheet-sidebar");
   let conditions = sidebar.querySelectorAll(".media-rule-condition");
 
   let onMediaChange = once(ui, "media-list-changed");
-  let onContentResize = waitForResizeTo(ResponsiveUIManager, type, value);
 
   info("Launching responsive mode");
   conditions[itemIndex].querySelector(responsiveModeToggleClass).click();
 
-  ResponsiveUIManager.getResponsiveUIForTab(tab).transitionsEnabled = false;
+  let rdmUI = ResponsiveUIManager.getResponsiveUIForTab(tab);
+  let onContentResize = waitForResizeTo(rdmUI, type, value);
+  rdmUI.transitionsEnabled = false;
 
   info("Waiting for the @media list to update");
   yield onMediaChange;
   yield onContentResize;
 
   ok(ResponsiveUIManager.isActiveForTab(tab),
     "Responsive mode should be active.");
   conditions = sidebar.querySelectorAll(".media-rule-condition");
   ok(!conditions[itemIndex].classList.contains("media-condition-unmatched"),
      "media rule should now be matched after responsive mode is active");
 
-  let dimension = (yield getSizing())[type];
+  let dimension = (yield getSizing(rdmUI))[type];
   is(dimension, value, `${type} should be properly set.`);
 }
 
 function* closeRDM(tab, ui) {
   info("Closing responsive mode");
   ResponsiveUIManager.toggle(window, tab);
-  let onMediaChange = once(ui, "media-list-changed");
+  let onMediaChange = waitForNEvents(ui, "media-list-changed", 2);
   yield once(ResponsiveUIManager, "off");
   yield onMediaChange;
   ok(!ResponsiveUIManager.isActiveForTab(tab),
      "Responsive mode should no longer be active.");
 }
 
 function doFinalChecks(editor) {
   let sidebar = editor.details.querySelector(".stylesheet-sidebar");
@@ -84,33 +94,41 @@ function doFinalChecks(editor) {
   conditions = sidebar.querySelectorAll(".media-rule-condition");
   ok(conditions[2].classList.contains("media-condition-unmatched"),
      "The width condition should now be unmatched");
   ok(conditions[3].classList.contains("media-condition-unmatched"),
      "The height condition should now be unmatched");
 }
 
 /* Helpers */
-function waitForResizeTo(manager, type, value) {
+function waitForResizeTo(rdmUI, type, value) {
   return new Promise(resolve => {
     let onResize = (_, data) => {
       if (data[type] != value) {
         return;
       }
-      manager.off("contentResize", onResize);
-      info(`Got contentResize to a ${type} of ${value}`);
+      ResponsiveUIManager.off("content-resize", onResize);
+      if (rdmUI.off) {
+        rdmUI.off("content-resize", onResize);
+      }
+      info(`Got content-resize to a ${type} of ${value}`);
       resolve();
     };
-    info(`Waiting for contentResize to a ${type} of ${value}`);
-    manager.on("contentResize", onResize);
+    info(`Waiting for content-resize to a ${type} of ${value}`);
+    // Old RDM emits on manager
+    ResponsiveUIManager.on("content-resize", onResize);
+    // New RDM emits on ui
+    if (rdmUI.on) {
+      rdmUI.on("content-resize", onResize);
+    }
   });
 }
 
-function* getSizing() {
-  let browser = gBrowser.selectedBrowser;
+function* getSizing(rdmUI) {
+  let browser = rdmUI.getViewportBrowser();
   let sizing = yield ContentTask.spawn(browser, {}, function* () {
     return {
       width: content.innerWidth,
       height: content.innerHeight
     };
   });
   return sizing;
 }
--- a/devtools/client/styleeditor/test/media-rules.css
+++ b/devtools/client/styleeditor/test/media-rules.css
@@ -17,13 +17,13 @@ div {
 }
 
 @media (max-width: 400px) {
   div {
     color: green;
   }
 }
 
-@media (min-height: 200px) and (max-height: 250px) {
+@media (min-height: 300px) and (max-height: 320px) {
   div {
     color: orange;
   }
-}
\ No newline at end of file
+}
--- a/devtools/client/webconsole/test/browser_console_variables_view_dom_nodes.js
+++ b/devtools/client/webconsole/test/browser_console_variables_view_dom_nodes.js
@@ -3,54 +3,57 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 // Test that ensures DOM nodes are rendered correctly in VariablesView.
 
 "use strict";
 
 function test() {
-  const TEST_URI = 'data:text/html;charset=utf-8,                           \
-                    <html>                                                  \
-                      <head>                                                \
-                        <title>Test for DOM nodes in variables view</title> \
-                      </head>                                               \
-                      <body>                                                \
-                        <div></div>                                         \
-                        <div id="testID"></div>                             \
-                        <div class="single-class"></div>                    \
-                        <div class="multiple-classes another-class"></div>  \
-                        <div class="class-and-id" id="class-and-id"></div>  \
-                        <div class="multiple-classes-and-id another-class"  \
-                             id="multiple-classes-and-id"></div>            \
-                        <div class="   whitespace-start"></div>             \
-                        <div class="whitespace-end     "></div>             \
-                        <div class="multiple    spaces"></div>              \
-                      </body>                                               \
-                    </html>';
+  const TEST_URI = `
+    data:text/html;charset=utf-8,
+    <html>
+      <head>
+        <title>Test for DOM nodes in variables view</title>
+      </head>
+      <body>
+        <div></div>
+        <div id="testID"></div>
+        <div class="single-class"></div>
+        <div class="multiple-classes another-class"></div>
+        <div class="class-and-id" id="class-and-id"></div>
+        <div class="multiple-classes-and-id another-class"
+          id="multiple-classes-and-id"></div>
+        <div class="   whitespace-start"></div>
+        <div class="whitespace-end     "></div>
+        <div class="multiple    spaces"></div>
+      </body>
+    </html>
+`;
 
   Task.spawn(runner).then(finishTest);
 
   function* runner() {
     const {tab} = yield loadTab(TEST_URI);
     const hud = yield openConsole(tab);
     const jsterm = hud.jsterm;
 
     let deferred = promise.defer();
-    jsterm.once("variablesview-fetched", (_, aVar) => deferred.resolve(aVar));
+    jsterm.once("variablesview-fetched", (_, val) => deferred.resolve(val));
     jsterm.execute("inspect(document.querySelectorAll('div'))");
 
     let variableScope = yield deferred.promise;
     ok(variableScope, "Variables view opened");
 
     yield findVariableViewProperties(variableScope, [
       { name: "0", value: "<div>"},
       { name: "1", value: "<div#testID>"},
       { name: "2", value: "<div.single-class>"},
       { name: "3", value: "<div.multiple-classes.another-class>"},
       { name: "4", value: "<div#class-and-id.class-and-id>"},
-      { name: "5", value: "<div#multiple-classes-and-id.multiple-classes-and-id.another-class>"},
+      { name: "5", value: "<div#multiple-classes-and-id." +
+                          "multiple-classes-and-id.another-class>"},
       { name: "6", value: "<div.whitespace-start>"},
       { name: "7", value: "<div.whitespace-end>"},
       { name: "8", value: "<div.multiple.spaces>"},
     ], { webconsole: hud});
   }
 }
--- a/devtools/shared/css/generated/mach_commands.py
+++ b/devtools/shared/css/generated/mach_commands.py
@@ -107,18 +107,18 @@ class MachCommands(MachCommandBase):
 
     def output_template(self, substitutions):
         """Output a the properties-db.js from a template."""
         js_template_path = resolve_path(self.topsrcdir,
             'devtools/shared/css/generated/properties-db.js.in')
         destination_path = resolve_path(self.topsrcdir,
             'devtools/shared/css/generated/properties-db.js')
 
-        with open(js_template_path, 'r') as handle:
+        with open(js_template_path, 'rb') as handle:
             js_template = handle.read()
 
         preamble = '/* THIS IS AN AUTOGENERATED FILE.  DO NOT EDIT */\n\n'
         contents = string.Template(js_template).substitute(substitutions)
 
-        with open(destination_path, 'w') as destination:
+        with open(destination_path, 'wb') as destination:
             destination.write(preamble + contents)
 
         print('The database was successfully generated at ' + destination_path)
--- a/devtools/shared/css/generated/properties-db.js
+++ b/devtools/shared/css/generated/properties-db.js
@@ -11,17 +11,17 @@
  * to generate these files can be found at devtools/shared/css/generate-properties-db.js.
  */
 
 /* eslint-disable max-len */
 
 /**
  * A list of CSS Properties and their various characteristics.
  */
-exports.CSS_PROPERTIES = {"all": {"subproperties": ["align-content", "align-items", "align-self", "animation-delay", "animation-direction", "animation-duration", "animation-fill-mode", "animation-iteration-count", "animation-name", "animation-play-state", "animation-timing-function", "-moz-appearance", "backface-visibility", "background-attachment", "background-blend-mode", "background-clip", "background-color", "background-image", "background-origin", "background-position-x", "background-position-y", "background-repeat", "background-size", "-moz-binding", "block-size", "border-block-end-color", "border-block-end-style", "border-block-end-width", "border-block-start-color", "border-block-start-style", "border-block-start-width", "border-bottom-color", "-moz-border-bottom-colors", "border-bottom-left-radius", "border-bottom-right-radius", "border-bottom-style", "border-bottom-width", "border-collapse", "border-image-outset", "border-image-repeat", "border-image-slice", "border-image-source", "border-image-width", "border-inline-end-color", "border-inline-end-style", "border-inline-end-width", "border-inline-start-color", "border-inline-start-style", "border-inline-start-width", "border-left-color", "-moz-border-left-colors", "border-left-style", "border-left-width", "border-right-color", "-moz-border-right-colors", "border-right-style", "border-right-width", "border-spacing", "border-top-color", "-moz-border-top-colors", "border-top-left-radius", "border-top-right-radius", "border-top-style", "border-top-width", "bottom", "-moz-box-align", "box-decoration-break", "-moz-box-direction", "-moz-box-flex", "-moz-box-ordinal-group", "-moz-box-orient", "-moz-box-pack", "box-shadow", "box-sizing", "caption-side", "clear", "clip", "clip-path", "clip-rule", "color", "color-adjust", "color-interpolation", "color-interpolation-filters", "-moz-column-count", "-moz-column-fill", "-moz-column-gap", "-moz-column-rule-color", "-moz-column-rule-style", "-moz-column-rule-width", "-moz-column-width", "contain", "content", "-moz-control-character-visibility", "counter-increment", "counter-reset", "cursor", "display", "dominant-baseline", "empty-cells", "fill", "fill-opacity", "fill-rule", "filter", "flex-basis", "flex-direction", "flex-grow", "flex-shrink", "flex-wrap", "float", "-moz-float-edge", "flood-color", "flood-opacity", "font-family", "font-feature-settings", "font-kerning", "font-language-override", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-synthesis", "font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position", "font-weight", "-moz-force-broken-image-icon", "grid-auto-columns", "grid-auto-flow", "grid-auto-rows", "grid-column-end", "grid-column-gap", "grid-column-start", "grid-row-end", "grid-row-gap", "grid-row-start", "grid-template-areas", "grid-template-columns", "grid-template-rows", "height", "hyphens", "initial-letter", "image-orientation", "-moz-image-region", "image-rendering", "ime-mode", "inline-size", "isolation", "justify-content", "justify-items", "justify-self", "left", "letter-spacing", "lighting-color", "line-height", "list-style-image", "list-style-position", "list-style-type", "margin-block-end", "margin-block-start", "margin-bottom", "margin-inline-end", "margin-inline-start", "margin-left", "margin-right", "margin-top", "marker-end", "marker-mid", "marker-offset", "marker-start", "mask-clip", "mask-composite", "mask-image", "mask-mode", "mask-origin", "mask-position-x", "mask-position-y", "mask-repeat", "mask-size", "mask-type", "max-block-size", "max-height", "max-inline-size", "max-width", "min-block-size", "-moz-min-font-size-ratio", "min-height", "min-inline-size", "min-width", "mix-blend-mode", "object-fit", "object-position", "offset-block-end", "offset-block-start", "offset-inline-end", "offset-inline-start", "opacity", "order", "-moz-orient", "-moz-osx-font-smoothing", "outline-color", "outline-offset", "-moz-outline-radius-bottomleft", "-moz-outline-radius-bottomright", "-moz-outline-radius-topleft", "-moz-outline-radius-topright", "outline-style", "outline-width", "overflow-clip-box", "overflow-x", "overflow-y", "padding-block-end", "padding-block-start", "padding-bottom", "padding-inline-end", "padding-inline-start", "padding-left", "padding-right", "padding-top", "page-break-after", "page-break-before", "page-break-inside", "paint-order", "perspective", "perspective-origin", "pointer-events", "position", "quotes", "resize", "right", "ruby-align", "ruby-position", "scroll-behavior", "scroll-snap-coordinate", "scroll-snap-destination", "scroll-snap-points-x", "scroll-snap-points-y", "scroll-snap-type-x", "scroll-snap-type-y", "shape-outside", "shape-rendering", "-moz-stack-sizing", "stop-color", "stop-opacity", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "-x-system-font", "-moz-tab-size", "table-layout", "text-align", "text-align-last", "text-anchor", "text-combine-upright", "text-decoration-color", "text-decoration-line", "text-decoration-style", "text-emphasis-color", "text-emphasis-position", "text-emphasis-style", "-webkit-text-fill-color", "text-indent", "text-orientation", "text-overflow", "text-rendering", "text-shadow", "-moz-text-size-adjust", "-webkit-text-stroke-color", "-webkit-text-stroke-width", "text-transform", "top", "-moz-top-layer", "touch-action", "transform", "transform-box", "transform-origin", "transform-style", "transition-delay", "transition-duration", "transition-property", "transition-timing-function", "-moz-user-focus", "-moz-user-input", "-moz-user-modify", "-moz-user-select", "vector-effect", "vertical-align", "visibility", "white-space", "width", "will-change", "-moz-window-dragging", "-moz-window-shadow", "word-break", "word-spacing", "overflow-wrap", "writing-mode", "z-index"], "values": ["COLOR", "-moz-all", "-moz-available", "-moz-block-height", "-moz-box", "-moz-calc", "-moz-center", "-moz-crisp-edges", "-moz-deck", "-moz-element", "-moz-fit-content", "-moz-grid", "-moz-grid-group", "-moz-grid-line", "-moz-groupbox", "-moz-gtk-info-bar", "-moz-hidden-unscrollable", "-moz-image-rect", "-moz-inline-box", "-moz-inline-grid", "-moz-inline-stack", "-moz-left", "-moz-linear-gradient", "-moz-mac-disclosure-button-closed", "-moz-mac-disclosure-button-open", "-moz-mac-fullscreen-button", "-moz-mac-help-button", "-moz-mac-source-list", "-moz-mac-vibrancy-dark", "-moz-mac-vibrancy-light", "-moz-max-content", "-moz-middle-with-baseline", "-moz-min-content", "-moz-none", "-moz-popup", "-moz-pre-space", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "-moz-right", "-moz-stack", "-moz-text", "-moz-use-text-color", "-moz-win-borderless-glass", "-moz-win-browsertabbar-toolbox", "-moz-win-communications-toolbox", "-moz-win-exclude-glass", "-moz-win-glass", "-moz-win-media-toolbox", "-moz-window-button-box", "-moz-window-button-box-maximized", "-moz-window-button-close", "-moz-window-button-maximize", "-moz-window-button-minimize", "-moz-window-button-restore", "-moz-window-frame-bottom", "-moz-window-frame-left", "-moz-window-frame-right", "-moz-window-titlebar", "-moz-window-titlebar-maximized", "-webkit-box", "-webkit-flex", "-webkit-inline-box", "-webkit-inline-flex", "absolute", "active", "add", "all", "all-petite-caps", "all-small-caps", "alpha", "alphabetic", "alternate", "alternate-reverse", "always", "auto", "avoid", "backwards", "balance", "baseline", "bevel", "block", "block-axis", "border-box", "both", "bottom", "bottom-outside", "break-all", "break-word", "butt", "button", "button-arrow-down", "button-arrow-next", "button-arrow-previous", "button-arrow-up", "button-bevel", "button-focus", "calc", "capitalize", "caret", "center", "central", "checkbox", "checkbox-container", "checkbox-label", "checkmenuitem", "clone", "collapse", "color", "color-burn", "color-dodge", "column", "column-reverse", "condensed", "contain", "content-box", "contents", "cover", "crispedges", "cubic-bezier", "currentColor", "darken", "dashed", "default", "dialog", "difference", "disabled", "dotted", "double", "drag", "dualbutton", "ease", "ease-in", "ease-in-out", "ease-out", "economy", "element", "elements", "enabled", "end", "evenodd", "exact", "exclude", "exclusion", "expanded", "extra-condensed", "extra-expanded", "fill", "fill-box", "fixed", "flat", "flex", "flex-end", "flex-start", "forwards", "full-width", "geometricprecision", "grid", "groove", "groupbox", "hanging", "hard-light", "hidden", "hide", "horizontal", "horizontal-tb", "hsl", "hsla", "hue", "ideographic", "ignore", "inactive", "infinite", "inherit", "initial", "inline", "inline-axis", "inline-block", "inline-end", "inline-flex", "inline-grid", "inline-start", "inline-table", "inset", "inside", "intersect", "isolate", "italic", "justify", "keep-all", "large", "larger", "last-baseline", "left", "lighten", "linear", "linear-gradient", "linearrgb", "list-item", "listbox", "listitem", "local", "lowercase", "lr", "lr-tb", "luminance", "luminosity", "mandatory", "manipulation", "manual", "margin-box", "match-source", "mathematical", "medium", "menuarrow", "menubar", "menucheckbox", "menuimage", "menuitem", "menuitemtext", "menulist", "menulist-button", "menulist-text", "menulist-textfield", "menupopup", "menuradio", "menuseparator", "meterbar", "meterchunk", "middle", "miter", "mixed", "multiply", "no-change", "no-drag", "no-repeat", "non-scaling-stroke", "none", "nonzero", "normal", "nowrap", "number-input", "oblique", "optimizelegibility", "optimizequality", "optimizespeed", "outset", "outside", "over", "overlay", "padding-box", "painted", "pan-x", "pan-y", "paused", "petite-caps", "pre", "pre-line", "pre-wrap", "preserve-3d", "progressbar", "progressbar-vertical", "progresschunk", "progresschunk-vertical", "proximity", "radial-gradient", "radio", "radio-container", "radio-label", "radiomenuitem", "range", "range-thumb", "read-only", "read-write", "relative", "repeat", "repeat-x", "repeat-y", "repeating-linear-gradient", "repeating-radial-gradient", "reset-size", "resizer", "resizerpanel", "reverse", "rgb", "rgba", "ridge", "right", "rl", "rl-tb", "round", "row", "row-reverse", "ruby", "ruby-base", "ruby-base-container", "ruby-text", "ruby-text-container", "running", "saturation", "scale-down", "scale-horizontal", "scale-vertical", "scalethumb-horizontal", "scalethumb-vertical", "scalethumbend", "scalethumbstart", "scalethumbtick", "screen", "scroll", "scrollbar", "scrollbar-horizontal", "scrollbar-small", "scrollbar-vertical", "scrollbarbutton-down", "scrollbarbutton-left", "scrollbarbutton-right", "scrollbarbutton-up", "scrollbarthumb-horizontal", "scrollbarthumb-vertical", "scrollbartrack-horizontal", "scrollbartrack-vertical", "searchfield", "select-after", "select-all", "select-before", "select-menu", "select-same", "self-end", "self-start", "semi-condensed", "semi-expanded", "separate", "separator", "show", "sideways", "sideways-lr", "sideways-right", "sideways-rl", "slice", "small", "small-caps", "smaller", "smooth", "soft-light", "solid", "space", "space-around", "space-between", "space-evenly", "spinner", "spinner-downbutton", "spinner-textfield", "spinner-upbutton", "splitter", "square", "srgb", "start", "static", "statusbar", "statusbarpanel", "step-end", "step-start", "steps", "sticky", "stretch", "stretch-to-fit", "stroke", "sub", "subtract", "super", "tab", "tab-scroll-arrow-back", "tab-scroll-arrow-forward", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", "table-row-group", "tabpanel", "tabpanels", "tb", "tb-rl", "text", "text-after-edge", "text-before-edge", "text-bottom", "text-top", "textfield", "textfield-multiline", "thick", "thin", "titling-caps", "toggle", "toolbar", "toolbarbutton", "toolbarbutton-dropdown", "toolbargripper", "toolbox", "tooltip", "top", "top-outside", "transparent", "treeheader", "treeheadercell", "treeheadersortarrow", "treeitem", "treeline", "treetwisty", "treetwistyopen", "treeview", "tri-state", "ultra-condensed", "ultra-expanded", "under", "unicase", "unset", "uppercase", "upright", "url", "use-script", "vertical", "vertical-lr", "vertical-rl", "view-box", "visible", "visiblefill", "visiblepainted", "visiblestroke", "wavy", "window", "wrap", "wrap-reverse", "write-only", "x-large", "x-small", "xx-large", "xx-small"], "supports": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11], "isInherited": false}, "mask-image": {"subproperties": ["mask-image"], "supports": [4, 5, 11], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "isInherited": false}, "-webkit-animation-iteration-count": {"subproperties": ["animation-iteration-count"], "values": ["infinite", "inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "font-feature-settings": {"subproperties": ["font-feature-settings"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "border-block-start-color": {"subproperties": ["border-block-start-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "-webkit-flex-grow": {"subproperties": ["flex-grow"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "scroll-snap-destination": {"subproperties": ["scroll-snap-destination"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-font-language-override": {"subproperties": ["font-language-override"], "values": ["inherit", "initial", "normal", "unset"], "supports": [], "isInherited": true}, "text-emphasis": {"subproperties": ["text-emphasis-style", "text-emphasis-color"], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": true}, "grid-row-gap": {"subproperties": ["grid-row-gap"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "font-variant-east-asian": {"subproperties": ["font-variant-east-asian"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "outline-width": {"subproperties": ["outline-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "-webkit-flex-flow": {"subproperties": ["flex-direction", "flex-wrap"], "values": ["column", "column-reverse", "inherit", "initial", "nowrap", "row", "row-reverse", "unset", "wrap", "wrap-reverse"], "supports": [], "isInherited": false}, "grid-column-gap": {"subproperties": ["grid-column-gap"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "border-inline-start-style": {"subproperties": ["border-inline-start-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "scroll-snap-points-x": {"subproperties": ["scroll-snap-points-x"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "list-style-type": {"subproperties": ["list-style-type"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "padding-inline-end": {"subproperties": ["padding-inline-end"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-animation": {"subproperties": ["animation-duration", "animation-timing-function", "animation-delay", "animation-direction", "animation-fill-mode", "animation-iteration-count", "animation-play-state", "animation-name"], "values": ["alternate", "alternate-reverse", "backwards", "both", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "forwards", "infinite", "inherit", "initial", "linear", "none", "normal", "paused", "reverse", "running", "step-end", "step-start", "steps", "unset"], "supports": [7, 9, 10], "isInherited": false}, "-moz-border-start-width": {"subproperties": ["border-inline-start-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "page-break-before": {"subproperties": ["page-break-before"], "values": ["always", "auto", "avoid", "inherit", "initial", "left", "right", "unset"], "supports": [], "isInherited": false}, "flood-color": {"subproperties": ["flood-color"], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "text-anchor": {"subproperties": ["text-anchor"], "values": ["end", "inherit", "initial", "middle", "start", "unset"], "supports": [], "isInherited": true}, "-moz-box-pack": {"subproperties": ["-moz-box-pack"], "values": ["center", "end", "inherit", "initial", "justify", "start", "unset"], "supports": [], "isInherited": false}, "-webkit-user-select": {"subproperties": ["-moz-user-select"], "values": ["-moz-all", "-moz-none", "-moz-text", "all", "auto", "element", "elements", "inherit", "initial", "none", "text", "toggle", "tri-state", "unset"], "supports": [], "isInherited": false}, "-moz-border-end-style": {"subproperties": ["border-inline-end-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "padding-left": {"subproperties": ["padding-left"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-tab-size": {"subproperties": ["-moz-tab-size"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": true}, "perspective": {"subproperties": ["perspective"], "values": ["inherit", "initial", "none", "unset"], "supports": [6], "isInherited": false}, "max-block-size": {"subproperties": ["max-block-size"], "values": ["-moz-calc", "calc", "inherit", "initial", "none", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-animation-play-state": {"subproperties": ["animation-play-state"], "values": ["inherit", "initial", "paused", "running", "unset"], "supports": [], "isInherited": false}, "-moz-column-fill": {"subproperties": ["-moz-column-fill"], "values": ["auto", "balance", "inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-moz-stack-sizing": {"subproperties": ["-moz-stack-sizing"], "values": ["ignore", "inherit", "initial", "stretch-to-fit", "unset"], "supports": [], "isInherited": false}, "border-image-repeat": {"subproperties": ["border-image-repeat"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "font-variant-position": {"subproperties": ["font-variant-position"], "values": ["inherit", "initial", "normal", "sub", "super", "unset"], "supports": [], "isInherited": true}, "border-right-style": {"subproperties": ["border-right-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "-moz-box-align": {"subproperties": ["-moz-box-align"], "values": ["baseline", "center", "end", "inherit", "initial", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "border-left-style": {"subproperties": ["border-left-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "flex-flow": {"subproperties": ["flex-direction", "flex-wrap"], "values": ["column", "column-reverse", "inherit", "initial", "nowrap", "row", "row-reverse", "unset", "wrap", "wrap-reverse"], "supports": [], "isInherited": false}, "outline-color": {"subproperties": ["outline-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "font-variant-alternates": {"subproperties": ["font-variant-alternates"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "mask-mode": {"subproperties": ["mask-mode"], "supports": [], "values": ["alpha", "inherit", "initial", "luminance", "match-source", "unset"], "isInherited": false}, "flex-grow": {"subproperties": ["flex-grow"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "-moz-font-feature-settings": {"subproperties": ["font-feature-settings"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "-webkit-box-shadow": {"subproperties": ["box-shadow"], "values": ["inherit", "initial", "unset"], "supports": [2, 6], "isInherited": false}, "max-width": {"subproperties": ["max-width"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "calc", "inherit", "initial", "none", "unset"], "supports": [6, 8], "isInherited": false}, "border-inline-end-style": {"subproperties": ["border-inline-end-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "grid-column": {"subproperties": ["grid-column-start", "grid-column-end"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "image-orientation": {"subproperties": ["image-orientation"], "values": ["inherit", "initial", "unset"], "supports": [1], "isInherited": true}, "animation-duration": {"subproperties": ["animation-duration"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "-moz-animation-fill-mode": {"subproperties": ["animation-fill-mode"], "values": ["backwards", "both", "forwards", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "-moz-user-input": {"subproperties": ["-moz-user-input"], "values": ["auto", "disabled", "enabled", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": true}, "-webkit-animation-delay": {"subproperties": ["animation-delay"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "shape-rendering": {"subproperties": ["shape-rendering"], "values": ["auto", "crispedges", "geometricprecision", "inherit", "initial", "optimizespeed", "unset"], "supports": [], "isInherited": true}, "flex-shrink": {"subproperties": ["flex-shrink"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "text-rendering": {"subproperties": ["text-rendering"], "values": ["auto", "geometricprecision", "inherit", "initial", "optimizelegibility", "optimizespeed", "unset"], "supports": [], "isInherited": true}, "align-items": {"subproperties": ["align-items"], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "border-collapse": {"subproperties": ["border-collapse"], "values": ["collapse", "inherit", "initial", "separate", "unset"], "supports": [], "isInherited": true}, "text-combine-upright": {"subproperties": ["text-combine-upright"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "offset-block-end": {"subproperties": ["offset-block-end"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-border-start-color": {"subproperties": ["border-inline-start-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "marker": {"subproperties": ["marker-start", "marker-mid", "marker-end"], "values": ["inherit", "initial", "none", "unset", "url"], "supports": [11], "isInherited": true}, "-webkit-mask-position-y": {"subproperties": ["mask-position-y"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "outline-style": {"subproperties": ["outline-style"], "values": ["auto", "dashed", "dotted", "double", "groove", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "color-interpolation-filters": {"subproperties": ["color-interpolation-filters"], "values": ["auto", "inherit", "initial", "linearrgb", "srgb", "unset"], "supports": [], "isInherited": true}, "-moz-padding-end": {"subproperties": ["padding-inline-end"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "font-stretch": {"subproperties": ["font-stretch"], "values": ["condensed", "expanded", "extra-condensed", "extra-expanded", "inherit", "initial", "normal", "semi-condensed", "semi-expanded", "ultra-condensed", "ultra-expanded", "unset"], "supports": [], "isInherited": true}, "-moz-orient": {"subproperties": ["-moz-orient"], "values": ["block", "horizontal", "inherit", "initial", "inline", "unset", "vertical"], "supports": [], "isInherited": false}, "font-variant": {"subproperties": ["font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position"], "values": ["all-petite-caps", "all-small-caps", "inherit", "initial", "normal", "petite-caps", "small-caps", "sub", "super", "titling-caps", "unicase", "unset"], "supports": [], "isInherited": true}, "-webkit-animation-fill-mode": {"subproperties": ["animation-fill-mode"], "values": ["backwards", "both", "forwards", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "-moz-animation-duration": {"subproperties": ["animation-duration"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "border-left": {"subproperties": ["border-left-width", "border-left-style", "border-left-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "visibility": {"subproperties": ["visibility"], "values": ["collapse", "hidden", "inherit", "initial", "unset", "visible"], "supports": [], "isInherited": true}, "-moz-user-focus": {"subproperties": ["-moz-user-focus"], "values": ["ignore", "inherit", "initial", "none", "normal", "select-after", "select-all", "select-before", "select-menu", "select-same", "unset"], "supports": [], "isInherited": true}, "transform-box": {"subproperties": ["transform-box"], "values": ["border-box", "fill-box", "inherit", "initial", "unset", "view-box"], "supports": [], "isInherited": false}, "font-variant-caps": {"subproperties": ["font-variant-caps"], "values": ["all-petite-caps", "all-small-caps", "inherit", "initial", "normal", "petite-caps", "small-caps", "titling-caps", "unicase", "unset"], "supports": [], "isInherited": true}, "resize": {"subproperties": ["resize"], "values": ["both", "horizontal", "inherit", "initial", "none", "unset", "vertical"], "supports": [], "isInherited": false}, "offset-inline-end": {"subproperties": ["offset-inline-end"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "paint-order": {"subproperties": ["paint-order"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "stroke-linecap": {"subproperties": ["stroke-linecap"], "values": ["butt", "inherit", "initial", "round", "square", "unset"], "supports": [], "isInherited": true}, "animation-direction": {"subproperties": ["animation-direction"], "values": ["alternate", "alternate-reverse", "inherit", "initial", "normal", "reverse", "unset"], "supports": [], "isInherited": false}, "border-top-left-radius": {"subproperties": ["border-top-left-radius"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-box-align": {"subproperties": ["-moz-box-align"], "values": ["baseline", "center", "end", "inherit", "initial", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "-moz-text-size-adjust": {"subproperties": ["-moz-text-size-adjust"], "values": ["auto", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": true}, "list-style": {"subproperties": ["list-style-type", "list-style-image", "list-style-position"], "values": ["inherit", "initial", "inside", "none", "outside", "unset", "url"], "supports": [11], "isInherited": true}, "stroke": {"subproperties": ["stroke"], "values": ["inherit", "initial", "unset"], "supports": [2, 11], "isInherited": true}, "text-decoration-line": {"subproperties": ["text-decoration-line"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-webkit-background-size": {"subproperties": ["background-size"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "padding-bottom": {"subproperties": ["padding-bottom"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "border-image-slice": {"subproperties": ["border-image-slice"], "values": ["inherit", "initial", "unset"], "supports": [7, 8], "isInherited": false}, "-webkit-transition-delay": {"subproperties": ["transition-delay"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "background-repeat": {"subproperties": ["background-repeat"], "values": ["inherit", "initial", "no-repeat", "repeat", "repeat-x", "repeat-y", "round", "space", "unset"], "supports": [], "isInherited": false}, "flex-basis": {"subproperties": ["flex-basis"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-border-right-colors": {"subproperties": ["-moz-border-right-colors"], "values": ["inherit", "initial", "unset"], "supports": [2], "isInherited": false}, "-moz-image-region": {"subproperties": ["-moz-image-region"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "-webkit-transform-origin": {"subproperties": ["transform-origin"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "vector-effect": {"subproperties": ["vector-effect"], "values": ["inherit", "initial", "non-scaling-stroke", "none", "unset"], "supports": [], "isInherited": false}, "-moz-margin-end": {"subproperties": ["margin-inline-end"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-border-image": {"subproperties": ["border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat"], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "supports": [4, 5, 6, 7, 8, 11], "isInherited": false}, "-moz-border-end-color": {"subproperties": ["border-inline-end-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "ruby-position": {"subproperties": ["ruby-position"], "values": ["inherit", "initial", "over", "under", "unset"], "supports": [], "isInherited": true}, "inline-size": {"subproperties": ["inline-size"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "outline": {"subproperties": ["outline-width", "outline-style", "outline-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "auto", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "text-decoration": {"subproperties": ["text-decoration-color", "text-decoration-line", "text-decoration-style"], "values": ["COLOR", "-moz-none", "-moz-use-text-color", "currentColor", "dashed", "dotted", "double", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "solid", "transparent", "unset", "wavy"], "supports": [2], "isInherited": false}, "transition-duration": {"subproperties": ["transition-duration"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "order": {"subproperties": ["order"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "ime-mode": {"subproperties": ["ime-mode"], "values": ["active", "auto", "disabled", "inactive", "inherit", "initial", "normal", "unset"], "supports": [], "isInherited": false}, "counter-reset": {"subproperties": ["counter-reset"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "flood-opacity": {"subproperties": ["flood-opacity"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "flex-direction": {"subproperties": ["flex-direction"], "values": ["column", "column-reverse", "inherit", "initial", "row", "row-reverse", "unset"], "supports": [], "isInherited": false}, "-webkit-text-stroke-width": {"subproperties": ["-webkit-text-stroke-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": true}, "font-variant-numeric": {"subproperties": ["font-variant-numeric"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "-webkit-flex-wrap": {"subproperties": ["flex-wrap"], "values": ["inherit", "initial", "nowrap", "unset", "wrap", "wrap-reverse"], "supports": [], "isInherited": false}, "min-height": {"subproperties": ["min-height"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "left": {"subproperties": ["left"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-mask": {"subproperties": ["mask-image", "mask-repeat", "mask-position-x", "mask-position-y", "mask-clip", "mask-origin", "mask-size", "mask-composite", "mask-mode"], "supports": [4, 5, 6, 8, 11], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "add", "alpha", "border-box", "content-box", "exclude", "inherit", "initial", "intersect", "linear-gradient", "luminance", "match-source", "no-repeat", "none", "padding-box", "radial-gradient", "repeat", "repeat-x", "repeat-y", "repeating-linear-gradient", "repeating-radial-gradient", "round", "space", "subtract", "unset", "url"], "isInherited": false}, "stroke-width": {"subproperties": ["stroke-width"], "values": ["inherit", "initial", "unset"], "supports": [6, 7, 8], "isInherited": true}, "-moz-hyphens": {"subproperties": ["hyphens"], "values": ["auto", "inherit", "initial", "manual", "none", "unset"], "supports": [], "isInherited": true}, "background-origin": {"subproperties": ["background-origin"], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "supports": [], "isInherited": false}, "-moz-box-direction": {"subproperties": ["-moz-box-direction"], "values": ["inherit", "initial", "normal", "reverse", "unset"], "supports": [], "isInherited": false}, "border-inline-end-color": {"subproperties": ["border-inline-end-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "marker-offset": {"subproperties": ["marker-offset"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6], "isInherited": false}, "-webkit-background-clip": {"subproperties": ["background-clip"], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "text", "unset"], "supports": [], "isInherited": false}, "border-radius": {"subproperties": ["border-top-left-radius", "border-top-right-radius", "border-bottom-right-radius", "border-bottom-left-radius"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "flex": {"subproperties": ["flex-grow", "flex-shrink", "flex-basis"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 7, 8], "isInherited": false}, "margin-inline-end": {"subproperties": ["margin-inline-end"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-appearance": {"subproperties": ["-moz-appearance"], "values": ["-moz-gtk-info-bar", "-moz-mac-disclosure-button-closed", "-moz-mac-disclosure-button-open", "-moz-mac-fullscreen-button", "-moz-mac-help-button", "-moz-mac-source-list", "-moz-mac-vibrancy-dark", "-moz-mac-vibrancy-light", "-moz-win-borderless-glass", "-moz-win-browsertabbar-toolbox", "-moz-win-communications-toolbox", "-moz-win-exclude-glass", "-moz-win-glass", "-moz-win-media-toolbox", "-moz-window-button-box", "-moz-window-button-box-maximized", "-moz-window-button-close", "-moz-window-button-maximize", "-moz-window-button-minimize", "-moz-window-button-restore", "-moz-window-frame-bottom", "-moz-window-frame-left", "-moz-window-frame-right", "-moz-window-titlebar", "-moz-window-titlebar-maximized", "button", "button-arrow-down", "button-arrow-next", "button-arrow-previous", "button-arrow-up", "button-bevel", "button-focus", "caret", "checkbox", "checkbox-container", "checkbox-label", "checkmenuitem", "dialog", "dualbutton", "groupbox", "inherit", "initial", "listbox", "listitem", "menuarrow", "menubar", "menucheckbox", "menuimage", "menuitem", "menuitemtext", "menulist", "menulist-button", "menulist-text", "menulist-textfield", "menupopup", "menuradio", "menuseparator", "meterbar", "meterchunk", "none", "number-input", "progressbar", "progressbar-vertical", "progresschunk", "progresschunk-vertical", "radio", "radio-container", "radio-label", "radiomenuitem", "range", "range-thumb", "resizer", "resizerpanel", "scale-horizontal", "scale-vertical", "scalethumb-horizontal", "scalethumb-vertical", "scalethumbend", "scalethumbstart", "scalethumbtick", "scrollbar", "scrollbar-horizontal", "scrollbar-small", "scrollbar-vertical", "scrollbarbutton-down", "scrollbarbutton-left", "scrollbarbutton-right", "scrollbarbutton-up", "scrollbarthumb-horizontal", "scrollbarthumb-vertical", "scrollbartrack-horizontal", "scrollbartrack-vertical", "searchfield", "separator", "spinner", "spinner-downbutton", "spinner-textfield", "spinner-upbutton", "splitter", "statusbar", "statusbarpanel", "tab", "tab-scroll-arrow-back", "tab-scroll-arrow-forward", "tabpanel", "tabpanels", "textfield", "textfield-multiline", "toolbar", "toolbarbutton", "toolbarbutton-dropdown", "toolbargripper", "toolbox", "tooltip", "treeheader", "treeheadercell", "treeheadersortarrow", "treeitem", "treeline", "treetwisty", "treetwistyopen", "treeview", "unset", "window"], "supports": [], "isInherited": false}, "box-decoration-break": {"subproperties": ["box-decoration-break"], "values": ["clone", "inherit", "initial", "slice", "unset"], "supports": [], "isInherited": false}, "text-indent": {"subproperties": ["text-indent"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": true}, "hyphens": {"subproperties": ["hyphens"], "values": ["auto", "inherit", "initial", "manual", "none", "unset"], "supports": [], "isInherited": true}, "-moz-perspective": {"subproperties": ["perspective"], "values": ["inherit", "initial", "none", "unset"], "supports": [6], "isInherited": false}, "-webkit-animation-timing-function": {"subproperties": ["animation-timing-function"], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "supports": [10], "isInherited": false}, "text-transform": {"subproperties": ["text-transform"], "values": ["capitalize", "full-width", "inherit", "initial", "lowercase", "none", "unset", "uppercase"], "supports": [], "isInherited": true}, "font-size": {"subproperties": ["font-size"], "values": ["-moz-calc", "calc", "inherit", "initial", "large", "larger", "medium", "small", "smaller", "unset", "x-large", "x-small", "xx-large", "xx-small"], "supports": [6, 8], "isInherited": true}, "-webkit-animation-name": {"subproperties": ["animation-name"], "values": ["inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "-moz-border-start": {"subproperties": ["border-inline-start-width", "border-inline-start-style", "border-inline-start-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "mask-composite": {"subproperties": ["mask-composite"], "supports": [], "values": ["add", "exclude", "inherit", "initial", "intersect", "subtract", "unset"], "isInherited": false}, "-webkit-text-stroke": {"subproperties": ["-webkit-text-stroke-width", "-webkit-text-stroke-color"], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "hsl", "hsla", "inherit", "initial", "medium", "rgb", "rgba", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": true}, "padding-top": {"subproperties": ["padding-top"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-flex-shrink": {"subproperties": ["flex-shrink"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "color-adjust": {"subproperties": ["color-adjust"], "values": ["economy", "exact", "inherit", "initial", "unset"], "supports": [], "isInherited": true}, "grid-template-rows": {"subproperties": ["grid-template-rows"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "content": {"subproperties": ["content"], "values": ["inherit", "initial", "unset"], "supports": [11], "isInherited": false}, "padding-right": {"subproperties": ["padding-right"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-transform": {"subproperties": ["transform"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "marker-mid": {"subproperties": ["marker-mid"], "values": ["inherit", "initial", "none", "unset", "url"], "supports": [11], "isInherited": true}, "-moz-column-gap": {"subproperties": ["-moz-column-gap"], "values": ["-moz-calc", "calc", "inherit", "initial", "normal", "unset"], "supports": [6], "isInherited": false}, "-moz-border-start-style": {"subproperties": ["border-inline-start-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "clip-rule": {"subproperties": ["clip-rule"], "values": ["evenodd", "inherit", "initial", "nonzero", "unset"], "supports": [], "isInherited": true}, "font-family": {"subproperties": ["font-family"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "block-size": {"subproperties": ["block-size"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "offset-inline-start": {"subproperties": ["offset-inline-start"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "padding-block-end": {"subproperties": ["padding-block-end"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "transition": {"subproperties": ["transition-property", "transition-duration", "transition-timing-function", "transition-delay"], "values": ["all", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "none", "step-end", "step-start", "steps", "unset"], "supports": [9, 10], "isInherited": false}, "filter": {"subproperties": ["filter"], "values": ["inherit", "initial", "unset"], "supports": [11], "isInherited": false}, "border-right-width": {"subproperties": ["border-right-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "-webkit-flex-direction": {"subproperties": ["flex-direction"], "values": ["column", "column-reverse", "inherit", "initial", "row", "row-reverse", "unset"], "supports": [], "isInherited": false}, "-webkit-mask-composite": {"subproperties": ["mask-composite"], "supports": [], "values": ["add", "exclude", "inherit", "initial", "intersect", "subtract", "unset"], "isInherited": false}, "mix-blend-mode": {"subproperties": ["mix-blend-mode"], "values": ["color", "color-burn", "color-dodge", "darken", "difference", "exclusion", "hard-light", "hue", "inherit", "initial", "lighten", "luminosity", "multiply", "normal", "overlay", "saturation", "screen", "soft-light", "unset"], "supports": [], "isInherited": false}, "color-interpolation": {"subproperties": ["color-interpolation"], "values": ["auto", "inherit", "initial", "linearrgb", "srgb", "unset"], "supports": [], "isInherited": true}, "border-top-style": {"subproperties": ["border-top-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "fill-opacity": {"subproperties": ["fill-opacity"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": true}, "marker-start": {"subproperties": ["marker-start"], "values": ["inherit", "initial", "none", "unset", "url"], "supports": [11], "isInherited": true}, "border-bottom-width": {"subproperties": ["border-bottom-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "-moz-column-rule-style": {"subproperties": ["-moz-column-rule-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "clear": {"subproperties": ["clear"], "values": ["both", "inherit", "initial", "inline-end", "inline-start", "left", "none", "right", "unset"], "supports": [], "isInherited": false}, "grid-area": {"subproperties": ["grid-row-start", "grid-column-start", "grid-row-end", "grid-column-end"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "padding-inline-start": {"subproperties": ["padding-inline-start"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-border-end": {"subproperties": ["border-inline-end-width", "border-inline-end-style", "border-inline-end-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "background-clip": {"subproperties": ["background-clip"], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "text", "unset"], "supports": [], "isInherited": false}, "-webkit-text-fill-color": {"subproperties": ["-webkit-text-fill-color"], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": true}, "border-block-start-style": {"subproperties": ["border-block-start-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "top": {"subproperties": ["top"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "border-width": {"subproperties": ["border-top-width", "border-right-width", "border-bottom-width", "border-left-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "max-inline-size": {"subproperties": ["max-inline-size"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "calc", "inherit", "initial", "none", "unset"], "supports": [6, 8], "isInherited": false}, "border-inline-start-width": {"subproperties": ["border-inline-start-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "-moz-box-flex": {"subproperties": ["-moz-box-flex"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "animation-play-state": {"subproperties": ["animation-play-state"], "values": ["inherit", "initial", "paused", "running", "unset"], "supports": [], "isInherited": false}, "padding": {"subproperties": ["padding-top", "padding-right", "padding-bottom", "padding-left"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "dominant-baseline": {"subproperties": ["dominant-baseline"], "values": ["alphabetic", "auto", "central", "hanging", "ideographic", "inherit", "initial", "mathematical", "middle", "no-change", "reset-size", "text-after-edge", "text-before-edge", "unset", "use-script"], "supports": [], "isInherited": false}, "background-attachment": {"subproperties": ["background-attachment"], "values": ["fixed", "inherit", "initial", "local", "scroll", "unset"], "supports": [], "isInherited": false}, "-webkit-box-sizing": {"subproperties": ["box-sizing"], "values": ["border-box", "content-box", "inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-webkit-box-flex": {"subproperties": ["-moz-box-flex"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "text-orientation": {"subproperties": ["text-orientation"], "values": ["inherit", "initial", "mixed", "sideways", "sideways-right", "unset", "upright"], "supports": [], "isInherited": true}, "-moz-margin-start": {"subproperties": ["margin-inline-start"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "isolation": {"subproperties": ["isolation"], "values": ["auto", "inherit", "initial", "isolate", "unset"], "supports": [], "isInherited": false}, "-moz-border-bottom-colors": {"subproperties": ["-moz-border-bottom-colors"], "values": ["inherit", "initial", "unset"], "supports": [2], "isInherited": false}, "-moz-column-rule-width": {"subproperties": ["-moz-column-rule-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "scroll-snap-type-y": {"subproperties": ["scroll-snap-type-y"], "values": ["inherit", "initial", "mandatory", "none", "proximity", "unset"], "supports": [], "isInherited": false}, "-webkit-border-bottom-right-radius": {"subproperties": ["border-bottom-right-radius"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-column-count": {"subproperties": ["-moz-column-count"], "values": ["auto", "inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "border-left-width": {"subproperties": ["border-left-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "grid-column-end": {"subproperties": ["grid-column-end"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "background-blend-mode": {"subproperties": ["background-blend-mode"], "values": ["color", "color-burn", "color-dodge", "darken", "difference", "exclusion", "hard-light", "hue", "inherit", "initial", "lighten", "luminosity", "multiply", "normal", "overlay", "saturation", "screen", "soft-light", "unset"], "supports": [], "isInherited": false}, "vertical-align": {"subproperties": ["vertical-align"], "values": ["-moz-calc", "-moz-middle-with-baseline", "baseline", "bottom", "calc", "inherit", "initial", "middle", "sub", "super", "text-bottom", "text-top", "top", "unset"], "supports": [6, 8], "isInherited": false}, "clip": {"subproperties": ["clip"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "grid-auto-rows": {"subproperties": ["grid-auto-rows"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "margin-left": {"subproperties": ["margin-left"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "animation-name": {"subproperties": ["animation-name"], "values": ["inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "border-image-source": {"subproperties": ["border-image-source"], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "supports": [4, 5, 11], "isInherited": false}, "border": {"subproperties": ["border-top-width", "border-right-width", "border-bottom-width", "border-left-width", "border-top-style", "border-right-style", "border-bottom-style", "border-left-style", "border-top-color", "border-right-color", "border-bottom-color", "border-left-color", "-moz-border-top-colors", "-moz-border-right-colors", "-moz-border-bottom-colors", "-moz-border-left-colors", "border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat"], "values": ["COLOR", "-moz-calc", "-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "linear-gradient", "medium", "none", "outset", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset", "url"], "supports": [2, 6], "isInherited": false}, "-webkit-transition-timing-function": {"subproperties": ["transition-timing-function"], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "supports": [10], "isInherited": false}, "margin-bottom": {"subproperties": ["margin-bottom"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "animation": {"subproperties": ["animation-duration", "animation-timing-function", "animation-delay", "animation-direction", "animation-fill-mode", "animation-iteration-count", "animation-play-state", "animation-name"], "values": ["alternate", "alternate-reverse", "backwards", "both", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "forwards", "infinite", "inherit", "initial", "linear", "none", "normal", "paused", "reverse", "running", "step-end", "step-start", "steps", "unset"], "supports": [7, 9, 10], "isInherited": false}, "font-weight": {"subproperties": ["font-weight"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": true}, "border-block-start-width": {"subproperties": ["border-block-start-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "mask-type": {"subproperties": ["mask-type"], "values": ["alpha", "inherit", "initial", "luminance", "unset"], "supports": [], "isInherited": false}, "margin-block-end": {"subproperties": ["margin-block-end"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "min-inline-size": {"subproperties": ["min-inline-size"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "object-position": {"subproperties": ["object-position"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "page-break-after": {"subproperties": ["page-break-after"], "values": ["always", "auto", "avoid", "inherit", "initial", "left", "right", "unset"], "supports": [], "isInherited": false}, "transition-property": {"subproperties": ["transition-property"], "values": ["all", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "-moz-float-edge": {"subproperties": ["-moz-float-edge"], "values": ["content-box", "inherit", "initial", "margin-box", "unset"], "supports": [], "isInherited": false}, "white-space": {"subproperties": ["white-space"], "values": ["-moz-pre-space", "inherit", "initial", "normal", "nowrap", "pre", "pre-line", "pre-wrap", "unset"], "supports": [], "isInherited": true}, "-moz-binding": {"subproperties": ["-moz-binding"], "values": ["inherit", "initial", "none", "unset", "url"], "supports": [11], "isInherited": false}, "ruby-align": {"subproperties": ["ruby-align"], "values": ["center", "inherit", "initial", "space-around", "space-between", "start", "unset"], "supports": [], "isInherited": true}, "font-kerning": {"subproperties": ["font-kerning"], "values": ["auto", "inherit", "initial", "none", "normal", "unset"], "supports": [], "isInherited": true}, "border-block-end": {"subproperties": ["border-block-end-width", "border-block-end-style", "border-block-end-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "animation-timing-function": {"subproperties": ["animation-timing-function"], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "supports": [10], "isInherited": false}, "-webkit-border-radius": {"subproperties": ["border-top-left-radius", "border-top-right-radius", "border-bottom-right-radius", "border-bottom-left-radius"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "animation-iteration-count": {"subproperties": ["animation-iteration-count"], "values": ["infinite", "inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "-webkit-animation-direction": {"subproperties": ["animation-direction"], "values": ["alternate", "alternate-reverse", "inherit", "initial", "normal", "reverse", "unset"], "supports": [], "isInherited": false}, "justify-self": {"subproperties": ["justify-self"], "values": ["auto", "baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "-moz-border-top-colors": {"subproperties": ["-moz-border-top-colors"], "values": ["inherit", "initial", "unset"], "supports": [2], "isInherited": false}, "transition-timing-function": {"subproperties": ["transition-timing-function"], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "supports": [10], "isInherited": false}, "-moz-transition-duration": {"subproperties": ["transition-duration"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "scroll-snap-coordinate": {"subproperties": ["scroll-snap-coordinate"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-box-orient": {"subproperties": ["-moz-box-orient"], "values": ["block-axis", "horizontal", "inherit", "initial", "inline-axis", "unset", "vertical"], "supports": [], "isInherited": false}, "counter-increment": {"subproperties": ["counter-increment"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-webkit-transform-style": {"subproperties": ["transform-style"], "values": ["flat", "inherit", "initial", "preserve-3d", "unset"], "supports": [], "isInherited": false}, "-moz-transition-timing-function": {"subproperties": ["transition-timing-function"], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "supports": [10], "isInherited": false}, "grid-auto-columns": {"subproperties": ["grid-auto-columns"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-align-content": {"subproperties": ["align-content"], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "space-around", "space-between", "space-evenly", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "font": {"subproperties": ["font-family", "font-style", "font-weight", "font-size", "line-height", "font-size-adjust", "font-stretch", "-x-system-font", "font-feature-settings", "font-language-override", "font-kerning", "font-synthesis", "font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position"], "values": ["-moz-block-height", "-moz-calc", "all-petite-caps", "all-small-caps", "auto", "calc", "condensed", "expanded", "extra-condensed", "extra-expanded", "inherit", "initial", "italic", "large", "larger", "medium", "none", "normal", "oblique", "petite-caps", "semi-condensed", "semi-expanded", "small", "small-caps", "smaller", "sub", "super", "titling-caps", "ultra-condensed", "ultra-expanded", "unicase", "unset", "x-large", "x-small", "xx-large", "xx-small"], "supports": [6, 7, 8], "isInherited": true}, "flex-wrap": {"subproperties": ["flex-wrap"], "values": ["inherit", "initial", "nowrap", "unset", "wrap", "wrap-reverse"], "supports": [], "isInherited": false}, "grid-row-start": {"subproperties": ["grid-row-start"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "list-style-image": {"subproperties": ["list-style-image"], "values": ["inherit", "initial", "none", "unset", "url"], "supports": [11], "isInherited": true}, "text-emphasis-position": {"subproperties": ["text-emphasis-position"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "border-right": {"subproperties": ["border-right-width", "border-right-style", "border-right-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "font-style": {"subproperties": ["font-style"], "values": ["inherit", "initial", "italic", "normal", "oblique", "unset"], "supports": [], "isInherited": true}, "box-shadow": {"subproperties": ["box-shadow"], "values": ["inherit", "initial", "unset"], "supports": [2, 6], "isInherited": false}, "align-self": {"subproperties": ["align-self"], "values": ["auto", "baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "text-emphasis-color": {"subproperties": ["text-emphasis-color"], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": true}, "border-bottom": {"subproperties": ["border-bottom-width", "border-bottom-style", "border-bottom-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "border-spacing": {"subproperties": ["border-spacing"], "values": ["inherit", "initial", "unset"], "supports": [6], "isInherited": true}, "-webkit-border-top-right-radius": {"subproperties": ["border-top-right-radius"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "margin-inline-start": {"subproperties": ["margin-inline-start"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "grid-row-end": {"subproperties": ["grid-row-end"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "perspective-origin": {"subproperties": ["perspective-origin"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "page-break-inside": {"subproperties": ["page-break-inside"], "values": ["auto", "avoid", "inherit", "initial", "unset"], "supports": [], "isInherited": false}, "scroll-behavior": {"subproperties": ["scroll-behavior"], "values": ["auto", "inherit", "initial", "smooth", "unset"], "supports": [], "isInherited": false}, "-moz-backface-visibility": {"subproperties": ["backface-visibility"], "values": ["hidden", "inherit", "initial", "unset", "visible"], "supports": [], "isInherited": false}, "-moz-outline-radius": {"subproperties": ["-moz-outline-radius-topleft", "-moz-outline-radius-topright", "-moz-outline-radius-bottomright", "-moz-outline-radius-bottomleft"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "mask-clip": {"subproperties": ["mask-clip"], "supports": [], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "isInherited": false}, "grid-row": {"subproperties": ["grid-row-start", "grid-row-end"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "border-bottom-right-radius": {"subproperties": ["border-bottom-right-radius"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "line-height": {"subproperties": ["line-height"], "values": ["-moz-block-height", "-moz-calc", "calc", "inherit", "initial", "normal", "unset"], "supports": [6, 7, 8], "isInherited": true}, "stroke-linejoin": {"subproperties": ["stroke-linejoin"], "values": ["bevel", "inherit", "initial", "miter", "round", "unset"], "supports": [], "isInherited": true}, "text-align-last": {"subproperties": ["text-align-last"], "values": ["auto", "center", "end", "inherit", "initial", "justify", "left", "right", "start", "unset"], "supports": [], "isInherited": true}, "word-spacing": {"subproperties": ["word-spacing"], "values": ["-moz-calc", "calc", "inherit", "initial", "normal", "unset"], "supports": [6, 8], "isInherited": true}, "transform-style": {"subproperties": ["transform-style"], "values": ["flat", "inherit", "initial", "preserve-3d", "unset"], "supports": [], "isInherited": false}, "border-bottom-color": {"subproperties": ["border-bottom-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "font-language-override": {"subproperties": ["font-language-override"], "values": ["inherit", "initial", "normal", "unset"], "supports": [], "isInherited": true}, "-moz-outline-radius-topleft": {"subproperties": ["-moz-outline-radius-topleft"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "border-image": {"subproperties": ["border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat"], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "supports": [4, 5, 6, 7, 8, 11], "isInherited": false}, "caption-side": {"subproperties": ["caption-side"], "values": ["bottom", "bottom-outside", "inherit", "initial", "left", "right", "top", "top-outside", "unset"], "supports": [], "isInherited": true}, "-webkit-mask-position": {"subproperties": ["mask-position-x", "mask-position-y"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-inline-end-width": {"subproperties": ["border-inline-end-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "-webkit-border-image": {"subproperties": ["border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat"], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "supports": [4, 5, 6, 7, 8, 11], "isInherited": false}, "font-synthesis": {"subproperties": ["font-synthesis"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "grid-template": {"subproperties": ["grid-template-areas", "grid-template-rows", "grid-template-columns"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-mask-repeat": {"subproperties": ["mask-repeat"], "supports": [], "values": ["inherit", "initial", "no-repeat", "repeat", "repeat-x", "repeat-y", "round", "space", "unset"], "isInherited": false}, "-webkit-justify-content": {"subproperties": ["justify-content"], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "space-around", "space-between", "space-evenly", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "text-decoration-color": {"subproperties": ["text-decoration-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "color": {"subproperties": ["color"], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": true}, "-moz-border-end-width": {"subproperties": ["border-inline-end-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "height": {"subproperties": ["height"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "margin-right": {"subproperties": ["margin-right"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-border-bottom-left-radius": {"subproperties": ["border-bottom-left-radius"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-transform": {"subproperties": ["transform"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "border-bottom-left-radius": {"subproperties": ["border-bottom-left-radius"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "fill-rule": {"subproperties": ["fill-rule"], "values": ["evenodd", "inherit", "initial", "nonzero", "unset"], "supports": [], "isInherited": true}, "min-width": {"subproperties": ["min-width"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "empty-cells": {"subproperties": ["empty-cells"], "values": ["hide", "inherit", "initial", "show", "unset"], "supports": [], "isInherited": true}, "direction": {"subproperties": ["direction"], "values": ["inherit", "initial", "ltr", "rtl", "unset"], "supports": [], "isInherited": true}, "clip-path": {"subproperties": ["clip-path"], "values": ["inherit", "initial", "unset"], "supports": [11], "isInherited": false}, "-webkit-mask-size": {"subproperties": ["mask-size"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-box-orient": {"subproperties": ["-moz-box-orient"], "values": ["block-axis", "horizontal", "inherit", "initial", "inline-axis", "unset", "vertical"], "supports": [], "isInherited": false}, "z-index": {"subproperties": ["z-index"], "values": ["auto", "inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "background-position-y": {"subproperties": ["background-position-y"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "text-decoration-style": {"subproperties": ["text-decoration-style"], "values": ["-moz-none", "dashed", "dotted", "double", "inherit", "initial", "solid", "unset", "wavy"], "supports": [], "isInherited": false}, "grid-template-areas": {"subproperties": ["grid-template-areas"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-moz-perspective-origin": {"subproperties": ["perspective-origin"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-animation-direction": {"subproperties": ["animation-direction"], "values": ["alternate", "alternate-reverse", "inherit", "initial", "normal", "reverse", "unset"], "supports": [], "isInherited": false}, "font-size-adjust": {"subproperties": ["font-size-adjust"], "values": ["inherit", "initial", "none", "unset"], "supports": [7], "isInherited": true}, "cursor": {"subproperties": ["cursor"], "values": ["inherit", "initial", "unset"], "supports": [11], "isInherited": true}, "margin": {"subproperties": ["margin-top", "margin-right", "margin-bottom", "margin-left"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-animation": {"subproperties": ["animation-duration", "animation-timing-function", "animation-delay", "animation-direction", "animation-fill-mode", "animation-iteration-count", "animation-play-state", "animation-name"], "values": ["alternate", "alternate-reverse", "backwards", "both", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "forwards", "infinite", "inherit", "initial", "linear", "none", "normal", "paused", "reverse", "running", "step-end", "step-start", "steps", "unset"], "supports": [7, 9, 10], "isInherited": false}, "-moz-control-character-visibility": {"subproperties": ["-moz-control-character-visibility"], "values": ["hidden", "inherit", "initial", "unset", "visible"], "supports": [], "isInherited": true}, "letter-spacing": {"subproperties": ["letter-spacing"], "values": ["-moz-calc", "calc", "inherit", "initial", "normal", "unset"], "supports": [6], "isInherited": true}, "-moz-transition-delay": {"subproperties": ["transition-delay"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "will-change": {"subproperties": ["will-change"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "transform-origin": {"subproperties": ["transform-origin"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "font-variant-ligatures": {"subproperties": ["font-variant-ligatures"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "padding-block-start": {"subproperties": ["padding-block-start"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-animation-duration": {"subproperties": ["animation-duration"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "border-block-end-width": {"subproperties": ["border-block-end-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "-webkit-mask-origin": {"subproperties": ["mask-origin"], "supports": [], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "isInherited": false}, "word-break": {"subproperties": ["word-break"], "values": ["break-all", "inherit", "initial", "keep-all", "normal", "unset"], "supports": [], "isInherited": true}, "table-layout": {"subproperties": ["table-layout"], "values": ["auto", "fixed", "inherit", "initial", "unset"], "supports": [], "isInherited": false}, "text-overflow": {"subproperties": ["text-overflow"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-webkit-flex": {"subproperties": ["flex-grow", "flex-shrink", "flex-basis"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 7, 8], "isInherited": false}, "grid-auto-flow": {"subproperties": ["grid-auto-flow"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "border-top-right-radius": {"subproperties": ["border-top-right-radius"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "border-image-outset": {"subproperties": ["border-image-outset"], "values": ["inherit", "initial", "unset"], "supports": [6, 7], "isInherited": false}, "mask-size": {"subproperties": ["mask-size"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "touch-action": {"subproperties": ["touch-action"], "values": ["auto", "inherit", "initial", "manipulation", "none", "pan-x", "pan-y", "unset"], "supports": [], "isInherited": false}, "border-right-color": {"subproperties": ["border-right-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "backface-visibility": {"subproperties": ["backface-visibility"], "values": ["hidden", "inherit", "initial", "unset", "visible"], "supports": [], "isInherited": false}, "background-image": {"subproperties": ["background-image"], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "supports": [4, 5, 11], "isInherited": false}, "-moz-box-ordinal-group": {"subproperties": ["-moz-box-ordinal-group"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "-webkit-transition-property": {"subproperties": ["transition-property"], "values": ["all", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "writing-mode": {"subproperties": ["writing-mode"], "values": ["horizontal-tb", "inherit", "initial", "lr", "lr-tb", "rl", "rl-tb", "sideways-lr", "sideways-rl", "tb", "tb-rl", "unset", "vertical-lr", "vertical-rl"], "supports": [], "isInherited": true}, "stroke-opacity": {"subproperties": ["stroke-opacity"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": true}, "box-sizing": {"subproperties": ["box-sizing"], "values": ["border-box", "content-box", "inherit", "initial", "unset"], "supports": [], "isInherited": false}, "margin-top": {"subproperties": ["margin-top"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "position": {"subproperties": ["position"], "values": ["absolute", "fixed", "inherit", "initial", "relative", "static", "sticky", "unset"], "supports": [], "isInherited": false}, "list-style-position": {"subproperties": ["list-style-position"], "values": ["inherit", "initial", "inside", "outside", "unset"], "supports": [], "isInherited": true}, "-webkit-box-pack": {"subproperties": ["-moz-box-pack"], "values": ["center", "end", "inherit", "initial", "justify", "start", "unset"], "supports": [], "isInherited": false}, "quotes": {"subproperties": ["quotes"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "border-top": {"subproperties": ["border-top-width", "border-top-style", "border-top-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "-moz-animation-delay": {"subproperties": ["animation-delay"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "-webkit-transition": {"subproperties": ["transition-property", "transition-duration", "transition-timing-function", "transition-delay"], "values": ["all", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "none", "step-end", "step-start", "steps", "unset"], "supports": [9, 10], "isInherited": false}, "-moz-window-dragging": {"subproperties": ["-moz-window-dragging"], "values": ["default", "drag", "inherit", "initial", "no-drag", "unset"], "supports": [], "isInherited": false}, "lighting-color": {"subproperties": ["lighting-color"], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "background-size": {"subproperties": ["background-size"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-border-top-left-radius": {"subproperties": ["border-top-left-radius"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-outline-radius-bottomleft": {"subproperties": ["-moz-outline-radius-bottomleft"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "mask-position-x": {"subproperties": ["mask-position-x"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "mask-position-y": {"subproperties": ["mask-position-y"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "justify-content": {"subproperties": ["justify-content"], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "space-around", "space-between", "space-evenly", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "animation-fill-mode": {"subproperties": ["animation-fill-mode"], "values": ["backwards", "both", "forwards", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "-webkit-filter": {"subproperties": ["filter"], "values": ["inherit", "initial", "unset"], "supports": [11], "isInherited": false}, "word-wrap": {"subproperties": ["overflow-wrap"], "values": ["break-word", "inherit", "initial", "normal", "unset"], "supports": [], "isInherited": true}, "grid": {"subproperties": ["grid-template-areas", "grid-template-rows", "grid-template-columns", "grid-auto-flow", "grid-auto-rows", "grid-auto-columns", "grid-row-gap", "grid-column-gap"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "background": {"subproperties": ["background-color", "background-image", "background-repeat", "background-attachment", "background-clip", "background-origin", "background-position-x", "background-position-y", "background-size"], "values": ["COLOR", "-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "border-box", "content-box", "currentColor", "fixed", "hsl", "hsla", "inherit", "initial", "linear-gradient", "local", "no-repeat", "none", "padding-box", "radial-gradient", "repeat", "repeat-x", "repeat-y", "repeating-linear-gradient", "repeating-radial-gradient", "rgb", "rgba", "round", "scroll", "space", "text", "transparent", "unset", "url"], "supports": [2, 4, 5, 6, 8, 11], "isInherited": false}, "margin-block-start": {"subproperties": ["margin-block-start"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "grid-column-start": {"subproperties": ["grid-column-start"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "text-align": {"subproperties": ["text-align"], "values": ["-moz-center", "-moz-left", "-moz-right", "center", "end", "inherit", "initial", "justify", "left", "right", "start", "unset"], "supports": [], "isInherited": true}, "marker-end": {"subproperties": ["marker-end"], "values": ["inherit", "initial", "none", "unset", "url"], "supports": [11], "isInherited": true}, "justify-items": {"subproperties": ["justify-items"], "values": ["auto", "baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "mask-position": {"subproperties": ["mask-position-x", "mask-position-y"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-columns": {"subproperties": ["-moz-column-count", "-moz-column-width"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 7], "isInherited": false}, "-moz-outline-radius-topright": {"subproperties": ["-moz-outline-radius-topright"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "right": {"subproperties": ["right"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-border-left-colors": {"subproperties": ["-moz-border-left-colors"], "values": ["inherit", "initial", "unset"], "supports": [2], "isInherited": false}, "-webkit-mask-position-x": {"subproperties": ["mask-position-x"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-transition-duration": {"subproperties": ["transition-duration"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "border-top-width": {"subproperties": ["border-top-width"], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "supports": [6], "isInherited": false}, "bottom": {"subproperties": ["bottom"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "border-block-end-style": {"subproperties": ["border-block-end-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "-webkit-order": {"subproperties": ["order"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "-moz-animation-iteration-count": {"subproperties": ["animation-iteration-count"], "values": ["infinite", "inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "-moz-animation-timing-function": {"subproperties": ["animation-timing-function"], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "supports": [10], "isInherited": false}, "background-color": {"subproperties": ["background-color"], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "-webkit-backface-visibility": {"subproperties": ["backface-visibility"], "values": ["hidden", "inherit", "initial", "unset", "visible"], "supports": [], "isInherited": false}, "animation-delay": {"subproperties": ["animation-delay"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "unicode-bidi": {"subproperties": ["unicode-bidi"], "values": ["-moz-isolate", "-moz-isolate-override", "-moz-plaintext", "bidi-override", "embed", "inherit", "initial", "isolate", "isolate-override", "normal", "plaintext", "unset"], "supports": [], "isInherited": false}, "text-shadow": {"subproperties": ["text-shadow"], "values": ["inherit", "initial", "unset"], "supports": [2, 6], "isInherited": true}, "-moz-user-modify": {"subproperties": ["-moz-user-modify"], "values": ["inherit", "initial", "read-only", "read-write", "unset", "write-only"], "supports": [], "isInherited": true}, "-webkit-box-direction": {"subproperties": ["-moz-box-direction"], "values": ["inherit", "initial", "normal", "reverse", "unset"], "supports": [], "isInherited": false}, "image-rendering": {"subproperties": ["image-rendering"], "values": ["-moz-crisp-edges", "auto", "inherit", "initial", "optimizequality", "optimizespeed", "unset"], "supports": [], "isInherited": true}, "border-inline-end": {"subproperties": ["border-inline-end-width", "border-inline-end-style", "border-inline-end-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "grid-gap": {"subproperties": ["grid-row-gap", "grid-column-gap"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-animation-name": {"subproperties": ["animation-name"], "values": ["inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "pointer-events": {"subproperties": ["pointer-events"], "values": ["all", "auto", "fill", "inherit", "initial", "none", "painted", "stroke", "unset", "visible", "visiblefill", "visiblepainted", "visiblestroke"], "supports": [], "isInherited": true}, "border-image-width": {"subproperties": ["border-image-width"], "values": ["inherit", "initial", "unset"], "supports": [6, 7, 8], "isInherited": false}, "border-inline-start": {"subproperties": ["border-inline-start-width", "border-inline-start-style", "border-inline-start-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "min-block-size": {"subproperties": ["min-block-size"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-mask-clip": {"subproperties": ["mask-clip"], "supports": [], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "isInherited": false}, "-webkit-mask-image": {"subproperties": ["mask-image"], "supports": [4, 5, 11], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "isInherited": false}, "float": {"subproperties": ["float"], "values": ["inherit", "initial", "inline-end", "inline-start", "left", "none", "right", "unset"], "supports": [], "isInherited": false}, "max-height": {"subproperties": ["max-height"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "calc", "inherit", "initial", "none", "unset"], "supports": [6, 8], "isInherited": false}, "outline-offset": {"subproperties": ["outline-offset"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6], "isInherited": false}, "-moz-transform-style": {"subproperties": ["transform-style"], "values": ["flat", "inherit", "initial", "preserve-3d", "unset"], "supports": [], "isInherited": false}, "overflow-wrap": {"subproperties": ["overflow-wrap"], "values": ["break-word", "inherit", "initial", "normal", "unset"], "supports": [], "isInherited": true}, "fill": {"subproperties": ["fill"], "values": ["inherit", "initial", "unset"], "supports": [2, 11], "isInherited": true}, "scroll-snap-type": {"subproperties": ["scroll-snap-type-x", "scroll-snap-type-y"], "values": ["inherit", "initial", "mandatory", "none", "proximity", "unset"], "supports": [], "isInherited": false}, "text-emphasis-style": {"subproperties": ["text-emphasis-style"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": true}, "transform": {"subproperties": ["transform"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-moz-text-align-last": {"subproperties": ["text-align-last"], "values": ["auto", "center", "end", "inherit", "initial", "justify", "left", "right", "start", "unset"], "supports": [], "isInherited": true}, "width": {"subproperties": ["width"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "stroke-miterlimit": {"subproperties": ["stroke-miterlimit"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": true}, "stop-opacity": {"subproperties": ["stop-opacity"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "border-top-color": {"subproperties": ["border-top-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "background-position": {"subproperties": ["background-position-x", "background-position-y"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "scroll-snap-type-x": {"subproperties": ["scroll-snap-type-x"], "values": ["inherit", "initial", "mandatory", "none", "proximity", "unset"], "supports": [], "isInherited": false}, "object-fit": {"subproperties": ["object-fit"], "values": ["contain", "cover", "fill", "inherit", "initial", "none", "scale-down", "unset"], "supports": [], "isInherited": false}, "-moz-box-sizing": {"subproperties": ["box-sizing"], "values": ["border-box", "content-box", "inherit", "initial", "unset"], "supports": [], "isInherited": false}, "offset-block-start": {"subproperties": ["offset-block-start"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-background-origin": {"subproperties": ["background-origin"], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "supports": [], "isInherited": false}, "-webkit-align-items": {"subproperties": ["align-items"], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "-moz-padding-start": {"subproperties": ["padding-inline-start"], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "transition-delay": {"subproperties": ["transition-delay"], "values": ["inherit", "initial", "unset"], "supports": [9], "isInherited": false}, "border-style": {"subproperties": ["border-top-style", "border-right-style", "border-bottom-style", "border-left-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "mask-repeat": {"subproperties": ["mask-repeat"], "supports": [], "values": ["inherit", "initial", "no-repeat", "repeat", "repeat-x", "repeat-y", "round", "space", "unset"], "isInherited": false}, "overflow": {"subproperties": ["overflow-x", "overflow-y"], "values": ["-moz-hidden-unscrollable", "auto", "hidden", "inherit", "initial", "scroll", "unset", "visible"], "supports": [], "isInherited": false}, "mask-origin": {"subproperties": ["mask-origin"], "supports": [], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "isInherited": false}, "-moz-force-broken-image-icon": {"subproperties": ["-moz-force-broken-image-icon"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "grid-template-columns": {"subproperties": ["grid-template-columns"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-align-self": {"subproperties": ["align-self"], "values": ["auto", "baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "-webkit-perspective-origin": {"subproperties": ["perspective-origin"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "border-block-start": {"subproperties": ["border-block-start-width", "border-block-start-style", "border-block-start-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "display": {"subproperties": ["display"], "values": ["-moz-box", "-moz-deck", "-moz-grid", "-moz-grid-group", "-moz-grid-line", "-moz-groupbox", "-moz-inline-box", "-moz-inline-grid", "-moz-inline-stack", "-moz-popup", "-moz-stack", "-webkit-box", "-webkit-flex", "-webkit-inline-box", "-webkit-inline-flex", "block", "contents", "flex", "grid", "inherit", "initial", "inline", "inline-block", "inline-flex", "inline-grid", "inline-table", "list-item", "none", "ruby", "ruby-base", "ruby-base-container", "ruby-text", "ruby-text-container", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", "table-row-group", "unset"], "supports": [], "isInherited": false}, "-webkit-box-ordinal-group": {"subproperties": ["-moz-box-ordinal-group"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "-moz-column-width": {"subproperties": ["-moz-column-width"], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "supports": [6], "isInherited": false}, "border-color": {"subproperties": ["border-top-color", "border-right-color", "border-bottom-color", "border-left-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "-webkit-flex-basis": {"subproperties": ["flex-basis"], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "stroke-dashoffset": {"subproperties": ["stroke-dashoffset"], "values": ["inherit", "initial", "unset"], "supports": [6, 7, 8], "isInherited": true}, "-moz-transform-origin": {"subproperties": ["transform-origin"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-text-size-adjust": {"subproperties": ["-moz-text-size-adjust"], "values": ["auto", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": true}, "border-left-color": {"subproperties": ["border-left-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "overflow-y": {"subproperties": ["overflow-y"], "values": ["-moz-hidden-unscrollable", "auto", "hidden", "inherit", "initial", "scroll", "unset", "visible"], "supports": [], "isInherited": false}, "overflow-x": {"subproperties": ["overflow-x"], "values": ["-moz-hidden-unscrollable", "auto", "hidden", "inherit", "initial", "scroll", "unset", "visible"], "supports": [], "isInherited": false}, "-moz-user-select": {"subproperties": ["-moz-user-select"], "values": ["-moz-all", "-moz-none", "-moz-text", "all", "auto", "element", "elements", "inherit", "initial", "none", "text", "toggle", "tri-state", "unset"], "supports": [], "isInherited": false}, "-moz-column-rule": {"subproperties": ["-moz-column-rule-width", "-moz-column-rule-style", "-moz-column-rule-color"], "values": ["COLOR", "-moz-calc", "-moz-use-text-color", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "supports": [2, 6], "isInherited": false}, "-moz-outline-radius-bottomright": {"subproperties": ["-moz-outline-radius-bottomright"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-column-rule-color": {"subproperties": ["-moz-column-rule-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "-moz-transition": {"subproperties": ["transition-property", "transition-duration", "transition-timing-function", "transition-delay"], "values": ["all", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "none", "step-end", "step-start", "steps", "unset"], "supports": [9, 10], "isInherited": false}, "opacity": {"subproperties": ["opacity"], "values": ["inherit", "initial", "unset"], "supports": [7], "isInherited": false}, "-webkit-perspective": {"subproperties": ["perspective"], "values": ["inherit", "initial", "none", "unset"], "supports": [6], "isInherited": false}, "-webkit-text-stroke-color": {"subproperties": ["-webkit-text-stroke-color"], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": true}, "align-content": {"subproperties": ["align-content"], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "space-around", "space-between", "space-evenly", "start", "stretch", "unset"], "supports": [], "isInherited": false}, "scroll-snap-points-y": {"subproperties": ["scroll-snap-points-y"], "values": ["inherit", "initial", "unset"], "supports": [], "isInherited": false}, "-moz-transition-property": {"subproperties": ["transition-property"], "values": ["all", "inherit", "initial", "none", "unset"], "supports": [], "isInherited": false}, "border-bottom-style": {"subproperties": ["border-bottom-style"], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "supports": [], "isInherited": false}, "-moz-animation-play-state": {"subproperties": ["animation-play-state"], "values": ["inherit", "initial", "paused", "running", "unset"], "supports": [], "isInherited": false}, "mask": {"subproperties": ["mask-image", "mask-repeat", "mask-position-x", "mask-position-y", "mask-clip", "mask-origin", "mask-size", "mask-composite", "mask-mode"], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "add", "alpha", "border-box", "content-box", "exclude", "inherit", "initial", "intersect", "linear-gradient", "luminance", "match-source", "no-repeat", "none", "padding-box", "radial-gradient", "repeat", "repeat-x", "repeat-y", "repeating-linear-gradient", "repeating-radial-gradient", "round", "space", "subtract", "unset", "url"], "supports": [4, 5, 6, 8, 11], "isInherited": false}, "background-position-x": {"subproperties": ["background-position-x"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "stop-color": {"subproperties": ["stop-color"], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "border-block-end-color": {"subproperties": ["border-block-end-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}, "stroke-dasharray": {"subproperties": ["stroke-dasharray"], "values": ["inherit", "initial", "unset"], "supports": [6, 7, 8], "isInherited": true}, "border-inline-start-color": {"subproperties": ["border-inline-start-color"], "values": ["COLOR", "-moz-use-text-color", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "supports": [2], "isInherited": false}};
+exports.CSS_PROPERTIES = {"all": {"subproperties": ["align-content", "align-items", "align-self", "animation-delay", "animation-direction", "animation-duration", "animation-fill-mode", "animation-iteration-count", "animation-name", "animation-play-state", "animation-timing-function", "-moz-appearance", "backface-visibility", "background-attachment", "background-blend-mode", "background-clip", "background-color", "background-image", "background-origin", "background-position-x", "background-position-y", "background-repeat", "background-size", "-moz-binding", "block-size", "border-block-end-color", "border-block-end-style", "border-block-end-width", "border-block-start-color", "border-block-start-style", "border-block-start-width", "border-bottom-color", "-moz-border-bottom-colors", "border-bottom-left-radius", "border-bottom-right-radius", "border-bottom-style", "border-bottom-width", "border-collapse", "border-image-outset", "border-image-repeat", "border-image-slice", "border-image-source", "border-image-width", "border-inline-end-color", "border-inline-end-style", "border-inline-end-width", "border-inline-start-color", "border-inline-start-style", "border-inline-start-width", "border-left-color", "-moz-border-left-colors", "border-left-style", "border-left-width", "border-right-color", "-moz-border-right-colors", "border-right-style", "border-right-width", "border-spacing", "border-top-color", "-moz-border-top-colors", "border-top-left-radius", "border-top-right-radius", "border-top-style", "border-top-width", "bottom", "-moz-box-align", "box-decoration-break", "-moz-box-direction", "-moz-box-flex", "-moz-box-ordinal-group", "-moz-box-orient", "-moz-box-pack", "box-shadow", "box-sizing", "caption-side", "clear", "clip", "clip-path", "clip-rule", "color", "color-adjust", "color-interpolation", "color-interpolation-filters", "-moz-column-count", "-moz-column-fill", "-moz-column-gap", "-moz-column-rule-color", "-moz-column-rule-style", "-moz-column-rule-width", "-moz-column-width", "contain", "content", "-moz-control-character-visibility", "counter-increment", "counter-reset", "cursor", "display", "dominant-baseline", "empty-cells", "fill", "fill-opacity", "fill-rule", "filter", "flex-basis", "flex-direction", "flex-grow", "flex-shrink", "flex-wrap", "float", "-moz-float-edge", "flood-color", "flood-opacity", "font-family", "font-feature-settings", "font-kerning", "font-language-override", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-synthesis", "font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position", "font-weight", "-moz-force-broken-image-icon", "grid-auto-columns", "grid-auto-flow", "grid-auto-rows", "grid-column-end", "grid-column-gap", "grid-column-start", "grid-row-end", "grid-row-gap", "grid-row-start", "grid-template-areas", "grid-template-columns", "grid-template-rows", "height", "hyphens", "initial-letter", "image-orientation", "-moz-image-region", "image-rendering", "ime-mode", "inline-size", "isolation", "justify-content", "justify-items", "justify-self", "left", "letter-spacing", "lighting-color", "line-height", "list-style-image", "list-style-position", "list-style-type", "margin-block-end", "margin-block-start", "margin-bottom", "margin-inline-end", "margin-inline-start", "margin-left", "margin-right", "margin-top", "marker-end", "marker-mid", "marker-offset", "marker-start", "mask-clip", "mask-composite", "mask-image", "mask-mode", "mask-origin", "mask-position-x", "mask-position-y", "mask-repeat", "mask-size", "mask-type", "max-block-size", "max-height", "max-inline-size", "max-width", "min-block-size", "-moz-min-font-size-ratio", "min-height", "min-inline-size", "min-width", "mix-blend-mode", "object-fit", "object-position", "offset-block-end", "offset-block-start", "offset-inline-end", "offset-inline-start", "opacity", "order", "-moz-orient", "-moz-osx-font-smoothing", "outline-color", "outline-offset", "-moz-outline-radius-bottomleft", "-moz-outline-radius-bottomright", "-moz-outline-radius-topleft", "-moz-outline-radius-topright", "outline-style", "outline-width", "overflow-clip-box", "overflow-x", "overflow-y", "padding-block-end", "padding-block-start", "padding-bottom", "padding-inline-end", "padding-inline-start", "padding-left", "padding-right", "padding-top", "page-break-after", "page-break-before", "page-break-inside", "paint-order", "perspective", "perspective-origin", "pointer-events", "position", "quotes", "resize", "right", "ruby-align", "ruby-position", "scroll-behavior", "scroll-snap-coordinate", "scroll-snap-destination", "scroll-snap-points-x", "scroll-snap-points-y", "scroll-snap-type-x", "scroll-snap-type-y", "shape-outside", "shape-rendering", "-moz-stack-sizing", "stop-color", "stop-opacity", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "-x-system-font", "-moz-tab-size", "table-layout", "text-align", "text-align-last", "text-anchor", "text-combine-upright", "text-decoration-color", "text-decoration-line", "text-decoration-style", "text-emphasis-color", "text-emphasis-position", "text-emphasis-style", "-webkit-text-fill-color", "text-indent", "text-orientation", "text-overflow", "text-rendering", "text-shadow", "-moz-text-size-adjust", "-webkit-text-stroke-color", "-webkit-text-stroke-width", "text-transform", "top", "-moz-top-layer", "touch-action", "transform", "transform-box", "transform-origin", "transform-style", "transition-delay", "transition-duration", "transition-property", "transition-timing-function", "-moz-user-focus", "-moz-user-input", "-moz-user-modify", "-moz-user-select", "vector-effect", "vertical-align", "visibility", "white-space", "width", "will-change", "-moz-window-dragging", "-moz-window-shadow", "word-break", "word-spacing", "overflow-wrap", "writing-mode", "z-index"], "supports": [1, 2, 4, 5, 6, 7, 8, 9, 10, 11], "values": ["COLOR", "-moz-all", "-moz-available", "-moz-block-height", "-moz-box", "-moz-calc", "-moz-center", "-moz-crisp-edges", "-moz-deck", "-moz-element", "-moz-fit-content", "-moz-grid", "-moz-grid-group", "-moz-grid-line", "-moz-groupbox", "-moz-gtk-info-bar", "-moz-hidden-unscrollable", "-moz-image-rect", "-moz-inline-box", "-moz-inline-grid", "-moz-inline-stack", "-moz-left", "-moz-linear-gradient", "-moz-mac-disclosure-button-closed", "-moz-mac-disclosure-button-open", "-moz-mac-fullscreen-button", "-moz-mac-help-button", "-moz-mac-source-list", "-moz-mac-vibrancy-dark", "-moz-mac-vibrancy-light", "-moz-max-content", "-moz-middle-with-baseline", "-moz-min-content", "-moz-none", "-moz-popup", "-moz-pre-space", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "-moz-right", "-moz-stack", "-moz-text", "-moz-win-borderless-glass", "-moz-win-browsertabbar-toolbox", "-moz-win-communications-toolbox", "-moz-win-exclude-glass", "-moz-win-glass", "-moz-win-media-toolbox", "-moz-window-button-box", "-moz-window-button-box-maximized", "-moz-window-button-close", "-moz-window-button-maximize", "-moz-window-button-minimize", "-moz-window-button-restore", "-moz-window-frame-bottom", "-moz-window-frame-left", "-moz-window-frame-right", "-moz-window-titlebar", "-moz-window-titlebar-maximized", "-webkit-box", "-webkit-flex", "-webkit-inline-box", "-webkit-inline-flex", "absolute", "active", "add", "all", "all-petite-caps", "all-small-caps", "alpha", "alphabetic", "alternate", "alternate-reverse", "always", "auto", "avoid", "backwards", "balance", "baseline", "bevel", "block", "block-axis", "border-box", "both", "bottom", "bottom-outside", "break-all", "break-word", "butt", "button", "button-arrow-down", "button-arrow-next", "button-arrow-previous", "button-arrow-up", "button-bevel", "button-focus", "calc", "capitalize", "caret", "center", "central", "checkbox", "checkbox-container", "checkbox-label", "checkmenuitem", "clone", "collapse", "color", "color-burn", "color-dodge", "column", "column-reverse", "condensed", "contain", "content-box", "contents", "cover", "crispedges", "cubic-bezier", "currentColor", "darken", "dashed", "default", "dialog", "difference", "disabled", "dotted", "double", "drag", "dualbutton", "ease", "ease-in", "ease-in-out", "ease-out", "economy", "element", "elements", "enabled", "end", "evenodd", "exact", "exclude", "exclusion", "expanded", "extra-condensed", "extra-expanded", "fill", "fill-box", "fixed", "flat", "flex", "flex-end", "flex-start", "forwards", "full-width", "geometricprecision", "grid", "groove", "groupbox", "hanging", "hard-light", "hidden", "hide", "horizontal", "horizontal-tb", "hsl", "hsla", "hue", "ideographic", "ignore", "inactive", "infinite", "inherit", "initial", "inline", "inline-axis", "inline-block", "inline-end", "inline-flex", "inline-grid", "inline-start", "inline-table", "inset", "inside", "intersect", "isolate", "italic", "justify", "keep-all", "large", "larger", "last-baseline", "left", "lighten", "linear", "linear-gradient", "linearrgb", "list-item", "listbox", "listitem", "local", "lowercase", "lr", "lr-tb", "luminance", "luminosity", "mandatory", "manipulation", "manual", "margin-box", "match-source", "mathematical", "medium", "menuarrow", "menubar", "menucheckbox", "menuimage", "menuitem", "menuitemtext", "menulist", "menulist-button", "menulist-text", "menulist-textfield", "menupopup", "menuradio", "menuseparator", "meterbar", "meterchunk", "middle", "miter", "mixed", "multiply", "no-change", "no-drag", "no-repeat", "non-scaling-stroke", "none", "nonzero", "normal", "nowrap", "number-input", "oblique", "optimizelegibility", "optimizequality", "optimizespeed", "outset", "outside", "over", "overlay", "padding-box", "painted", "pan-x", "pan-y", "paused", "petite-caps", "pre", "pre-line", "pre-wrap", "preserve-3d", "progressbar", "progressbar-vertical", "progresschunk", "progresschunk-vertical", "proximity", "radial-gradient", "radio", "radio-container", "radio-label", "radiomenuitem", "range", "range-thumb", "read-only", "read-write", "relative", "repeat", "repeat-x", "repeat-y", "repeating-linear-gradient", "repeating-radial-gradient", "reset-size", "resizer", "resizerpanel", "reverse", "rgb", "rgba", "ridge", "right", "rl", "rl-tb", "round", "row", "row-reverse", "ruby", "ruby-base", "ruby-base-container", "ruby-text", "ruby-text-container", "running", "saturation", "scale-down", "scale-horizontal", "scale-vertical", "scalethumb-horizontal", "scalethumb-vertical", "scalethumbend", "scalethumbstart", "scalethumbtick", "screen", "scroll", "scrollbar", "scrollbar-horizontal", "scrollbar-small", "scrollbar-vertical", "scrollbarbutton-down", "scrollbarbutton-left", "scrollbarbutton-right", "scrollbarbutton-up", "scrollbarthumb-horizontal", "scrollbarthumb-vertical", "scrollbartrack-horizontal", "scrollbartrack-vertical", "searchfield", "select-after", "select-all", "select-before", "select-menu", "select-same", "self-end", "self-start", "semi-condensed", "semi-expanded", "separate", "separator", "show", "sideways", "sideways-lr", "sideways-right", "sideways-rl", "slice", "small", "small-caps", "smaller", "smooth", "soft-light", "solid", "space", "space-around", "space-between", "space-evenly", "spinner", "spinner-downbutton", "spinner-textfield", "spinner-upbutton", "splitter", "square", "srgb", "start", "static", "statusbar", "statusbarpanel", "step-end", "step-start", "steps", "sticky", "stretch", "stretch-to-fit", "stroke", "sub", "subtract", "super", "tab", "tab-scroll-arrow-back", "tab-scroll-arrow-forward", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", "table-row-group", "tabpanel", "tabpanels", "tb", "tb-rl", "text", "text-after-edge", "text-before-edge", "text-bottom", "text-top", "textfield", "textfield-multiline", "thick", "thin", "titling-caps", "toggle", "toolbar", "toolbarbutton", "toolbarbutton-dropdown", "toolbargripper", "toolbox", "tooltip", "top", "top-outside", "transparent", "treeheader", "treeheadercell", "treeheadersortarrow", "treeitem", "treeline", "treetwisty", "treetwistyopen", "treeview", "tri-state", "ultra-condensed", "ultra-expanded", "under", "unicase", "unset", "uppercase", "upright", "url", "use-script", "vertical", "vertical-lr", "vertical-rl", "view-box", "visible", "visiblefill", "visiblepainted", "visiblestroke", "wavy", "window", "wrap", "wrap-reverse", "write-only", "x-large", "x-small", "xx-large", "xx-small"], "isInherited": false}, "mask-image": {"subproperties": ["mask-image"], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "supports": [4, 5, 11], "isInherited": false}, "-webkit-animation-iteration-count": {"subproperties": ["animation-iteration-count"], "supports": [7], "values": ["infinite", "inherit", "initial", "unset"], "isInherited": false}, "font-feature-settings": {"subproperties": ["font-feature-settings"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "border-block-start-color": {"subproperties": ["border-block-start-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "-webkit-flex-grow": {"subproperties": ["flex-grow"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "scroll-snap-destination": {"subproperties": ["scroll-snap-destination"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-font-language-override": {"subproperties": ["font-language-override"], "supports": [], "values": ["inherit", "initial", "normal", "unset"], "isInherited": true}, "text-emphasis": {"subproperties": ["text-emphasis-style", "text-emphasis-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": true}, "grid-row-gap": {"subproperties": ["grid-row-gap"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "font-variant-east-asian": {"subproperties": ["font-variant-east-asian"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "outline-width": {"subproperties": ["outline-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "-webkit-flex-flow": {"subproperties": ["flex-direction", "flex-wrap"], "supports": [], "values": ["column", "column-reverse", "inherit", "initial", "nowrap", "row", "row-reverse", "unset", "wrap", "wrap-reverse"], "isInherited": false}, "grid-column-gap": {"subproperties": ["grid-column-gap"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "border-inline-start-style": {"subproperties": ["border-inline-start-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "scroll-snap-points-x": {"subproperties": ["scroll-snap-points-x"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "list-style-type": {"subproperties": ["list-style-type"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "padding-inline-end": {"subproperties": ["padding-inline-end"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-moz-animation": {"subproperties": ["animation-duration", "animation-timing-function", "animation-delay", "animation-direction", "animation-fill-mode", "animation-iteration-count", "animation-play-state", "animation-name"], "supports": [7, 9, 10], "values": ["alternate", "alternate-reverse", "backwards", "both", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "forwards", "infinite", "inherit", "initial", "linear", "none", "normal", "paused", "reverse", "running", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "-moz-border-start-width": {"subproperties": ["border-inline-start-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "page-break-before": {"subproperties": ["page-break-before"], "supports": [], "values": ["always", "auto", "avoid", "inherit", "initial", "left", "right", "unset"], "isInherited": false}, "flood-color": {"subproperties": ["flood-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "text-anchor": {"subproperties": ["text-anchor"], "supports": [], "values": ["end", "inherit", "initial", "middle", "start", "unset"], "isInherited": true}, "-moz-box-pack": {"subproperties": ["-moz-box-pack"], "supports": [], "values": ["center", "end", "inherit", "initial", "justify", "start", "unset"], "isInherited": false}, "-webkit-user-select": {"subproperties": ["-moz-user-select"], "supports": [], "values": ["-moz-all", "-moz-none", "-moz-text", "all", "auto", "element", "elements", "inherit", "initial", "none", "text", "toggle", "tri-state", "unset"], "isInherited": false}, "-moz-border-end-style": {"subproperties": ["border-inline-end-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "padding-left": {"subproperties": ["padding-left"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-moz-tab-size": {"subproperties": ["-moz-tab-size"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": true}, "perspective": {"subproperties": ["perspective"], "supports": [6], "values": ["inherit", "initial", "none", "unset"], "isInherited": false}, "max-block-size": {"subproperties": ["max-block-size"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "none", "unset"], "isInherited": false}, "-webkit-animation-play-state": {"subproperties": ["animation-play-state"], "supports": [], "values": ["inherit", "initial", "paused", "running", "unset"], "isInherited": false}, "-moz-column-fill": {"subproperties": ["-moz-column-fill"], "supports": [], "values": ["auto", "balance", "inherit", "initial", "unset"], "isInherited": false}, "-moz-stack-sizing": {"subproperties": ["-moz-stack-sizing"], "supports": [], "values": ["ignore", "inherit", "initial", "stretch-to-fit", "unset"], "isInherited": false}, "border-image-repeat": {"subproperties": ["border-image-repeat"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "font-variant-position": {"subproperties": ["font-variant-position"], "supports": [], "values": ["inherit", "initial", "normal", "sub", "super", "unset"], "isInherited": true}, "border-right-style": {"subproperties": ["border-right-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "-moz-box-align": {"subproperties": ["-moz-box-align"], "supports": [], "values": ["baseline", "center", "end", "inherit", "initial", "start", "stretch", "unset"], "isInherited": false}, "border-left-style": {"subproperties": ["border-left-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "flex-flow": {"subproperties": ["flex-direction", "flex-wrap"], "supports": [], "values": ["column", "column-reverse", "inherit", "initial", "nowrap", "row", "row-reverse", "unset", "wrap", "wrap-reverse"], "isInherited": false}, "outline-color": {"subproperties": ["outline-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "font-variant-alternates": {"subproperties": ["font-variant-alternates"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "mask-mode": {"subproperties": ["mask-mode"], "values": ["alpha", "inherit", "initial", "luminance", "match-source", "unset"], "supports": [], "isInherited": false}, "flex-grow": {"subproperties": ["flex-grow"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-font-feature-settings": {"subproperties": ["font-feature-settings"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "-webkit-box-shadow": {"subproperties": ["box-shadow"], "supports": [2, 6], "values": ["inherit", "initial", "unset"], "isInherited": false}, "max-width": {"subproperties": ["max-width"], "supports": [6, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "calc", "inherit", "initial", "none", "unset"], "isInherited": false}, "border-inline-end-style": {"subproperties": ["border-inline-end-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "grid-column": {"subproperties": ["grid-column-start", "grid-column-end"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "image-orientation": {"subproperties": ["image-orientation"], "supports": [1], "values": ["inherit", "initial", "unset"], "isInherited": true}, "animation-duration": {"subproperties": ["animation-duration"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-animation-fill-mode": {"subproperties": ["animation-fill-mode"], "supports": [], "values": ["backwards", "both", "forwards", "inherit", "initial", "none", "unset"], "isInherited": false}, "-moz-user-input": {"subproperties": ["-moz-user-input"], "supports": [], "values": ["auto", "disabled", "enabled", "inherit", "initial", "none", "unset"], "isInherited": true}, "-webkit-animation-delay": {"subproperties": ["animation-delay"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "shape-rendering": {"subproperties": ["shape-rendering"], "supports": [], "values": ["auto", "crispedges", "geometricprecision", "inherit", "initial", "optimizespeed", "unset"], "isInherited": true}, "flex-shrink": {"subproperties": ["flex-shrink"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "text-rendering": {"subproperties": ["text-rendering"], "supports": [], "values": ["auto", "geometricprecision", "inherit", "initial", "optimizelegibility", "optimizespeed", "unset"], "isInherited": true}, "align-items": {"subproperties": ["align-items"], "supports": [], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "isInherited": false}, "border-collapse": {"subproperties": ["border-collapse"], "supports": [], "values": ["collapse", "inherit", "initial", "separate", "unset"], "isInherited": true}, "text-combine-upright": {"subproperties": ["text-combine-upright"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "offset-block-end": {"subproperties": ["offset-block-end"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-moz-border-start-color": {"subproperties": ["border-inline-start-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "marker": {"subproperties": ["marker-start", "marker-mid", "marker-end"], "supports": [11], "values": ["inherit", "initial", "none", "unset", "url"], "isInherited": true}, "-webkit-mask-position-y": {"subproperties": ["mask-position-y"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "outline-style": {"subproperties": ["outline-style"], "supports": [], "values": ["auto", "dashed", "dotted", "double", "groove", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "color-interpolation-filters": {"subproperties": ["color-interpolation-filters"], "supports": [], "values": ["auto", "inherit", "initial", "linearrgb", "srgb", "unset"], "isInherited": true}, "-moz-padding-end": {"subproperties": ["padding-inline-end"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "font-stretch": {"subproperties": ["font-stretch"], "supports": [], "values": ["condensed", "expanded", "extra-condensed", "extra-expanded", "inherit", "initial", "normal", "semi-condensed", "semi-expanded", "ultra-condensed", "ultra-expanded", "unset"], "isInherited": true}, "-moz-orient": {"subproperties": ["-moz-orient"], "supports": [], "values": ["block", "horizontal", "inherit", "initial", "inline", "unset", "vertical"], "isInherited": false}, "font-variant": {"subproperties": ["font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position"], "supports": [], "values": ["all-petite-caps", "all-small-caps", "inherit", "initial", "normal", "petite-caps", "small-caps", "sub", "super", "titling-caps", "unicase", "unset"], "isInherited": true}, "-webkit-animation-fill-mode": {"subproperties": ["animation-fill-mode"], "supports": [], "values": ["backwards", "both", "forwards", "inherit", "initial", "none", "unset"], "isInherited": false}, "-moz-animation-duration": {"subproperties": ["animation-duration"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-left": {"subproperties": ["border-left-width", "border-left-style", "border-left-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "visibility": {"subproperties": ["visibility"], "supports": [], "values": ["collapse", "hidden", "inherit", "initial", "unset", "visible"], "isInherited": true}, "-moz-user-focus": {"subproperties": ["-moz-user-focus"], "supports": [], "values": ["ignore", "inherit", "initial", "none", "normal", "select-after", "select-all", "select-before", "select-menu", "select-same", "unset"], "isInherited": true}, "transform-box": {"subproperties": ["transform-box"], "supports": [], "values": ["border-box", "fill-box", "inherit", "initial", "unset", "view-box"], "isInherited": false}, "font-variant-caps": {"subproperties": ["font-variant-caps"], "supports": [], "values": ["all-petite-caps", "all-small-caps", "inherit", "initial", "normal", "petite-caps", "small-caps", "titling-caps", "unicase", "unset"], "isInherited": true}, "resize": {"subproperties": ["resize"], "supports": [], "values": ["both", "horizontal", "inherit", "initial", "none", "unset", "vertical"], "isInherited": false}, "offset-inline-end": {"subproperties": ["offset-inline-end"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "paint-order": {"subproperties": ["paint-order"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "text-decoration-line": {"subproperties": ["text-decoration-line"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "animation-direction": {"subproperties": ["animation-direction"], "supports": [], "values": ["alternate", "alternate-reverse", "inherit", "initial", "normal", "reverse", "unset"], "isInherited": false}, "border-top-left-radius": {"subproperties": ["border-top-left-radius"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-box-align": {"subproperties": ["-moz-box-align"], "supports": [], "values": ["baseline", "center", "end", "inherit", "initial", "start", "stretch", "unset"], "isInherited": false}, "-moz-text-size-adjust": {"subproperties": ["-moz-text-size-adjust"], "supports": [], "values": ["auto", "inherit", "initial", "none", "unset"], "isInherited": true}, "list-style": {"subproperties": ["list-style-type", "list-style-image", "list-style-position"], "supports": [11], "values": ["inherit", "initial", "inside", "none", "outside", "unset", "url"], "isInherited": true}, "stroke": {"subproperties": ["stroke"], "supports": [2, 11], "values": ["inherit", "initial", "unset"], "isInherited": true}, "stroke-linecap": {"subproperties": ["stroke-linecap"], "supports": [], "values": ["butt", "inherit", "initial", "round", "square", "unset"], "isInherited": true}, "-webkit-background-size": {"subproperties": ["background-size"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "padding-bottom": {"subproperties": ["padding-bottom"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "border-image-slice": {"subproperties": ["border-image-slice"], "supports": [7, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-transition-delay": {"subproperties": ["transition-delay"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "background-repeat": {"subproperties": ["background-repeat"], "supports": [], "values": ["inherit", "initial", "no-repeat", "repeat", "repeat-x", "repeat-y", "round", "space", "unset"], "isInherited": false}, "flex-basis": {"subproperties": ["flex-basis"], "supports": [6, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-moz-border-right-colors": {"subproperties": ["-moz-border-right-colors"], "supports": [2], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-image-region": {"subproperties": ["-moz-image-region"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "-webkit-transform-origin": {"subproperties": ["transform-origin"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "vector-effect": {"subproperties": ["vector-effect"], "supports": [], "values": ["inherit", "initial", "non-scaling-stroke", "none", "unset"], "isInherited": false}, "-moz-margin-end": {"subproperties": ["margin-inline-end"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-moz-border-image": {"subproperties": ["border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat"], "supports": [4, 5, 6, 7, 8, 11], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "isInherited": false}, "-moz-border-end-color": {"subproperties": ["border-inline-end-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "ruby-position": {"subproperties": ["ruby-position"], "supports": [], "values": ["inherit", "initial", "over", "under", "unset"], "isInherited": true}, "inline-size": {"subproperties": ["inline-size"], "supports": [6, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "outline": {"subproperties": ["outline-width", "outline-style", "outline-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "auto", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "text-decoration": {"subproperties": ["text-decoration-color", "text-decoration-line", "text-decoration-style"], "supports": [2], "values": ["COLOR", "-moz-none", "currentColor", "dashed", "dotted", "double", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "solid", "transparent", "unset", "wavy"], "isInherited": false}, "transition-duration": {"subproperties": ["transition-duration"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "order": {"subproperties": ["order"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "ime-mode": {"subproperties": ["ime-mode"], "supports": [], "values": ["active", "auto", "disabled", "inactive", "inherit", "initial", "normal", "unset"], "isInherited": false}, "counter-reset": {"subproperties": ["counter-reset"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "flood-opacity": {"subproperties": ["flood-opacity"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "flex-direction": {"subproperties": ["flex-direction"], "supports": [], "values": ["column", "column-reverse", "inherit", "initial", "row", "row-reverse", "unset"], "isInherited": false}, "-webkit-text-stroke-width": {"subproperties": ["-webkit-text-stroke-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": true}, "font-variant-numeric": {"subproperties": ["font-variant-numeric"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "-webkit-flex-wrap": {"subproperties": ["flex-wrap"], "supports": [], "values": ["inherit", "initial", "nowrap", "unset", "wrap", "wrap-reverse"], "isInherited": false}, "min-height": {"subproperties": ["min-height"], "supports": [6, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "left": {"subproperties": ["left"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-webkit-mask": {"subproperties": ["mask-image", "mask-repeat", "mask-position-x", "mask-position-y", "mask-clip", "mask-origin", "mask-size", "mask-composite", "mask-mode"], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "add", "alpha", "border-box", "content-box", "exclude", "inherit", "initial", "intersect", "linear-gradient", "luminance", "match-source", "no-repeat", "none", "padding-box", "radial-gradient", "repeat", "repeat-x", "repeat-y", "repeating-linear-gradient", "repeating-radial-gradient", "round", "space", "subtract", "unset", "url"], "supports": [4, 5, 6, 8, 11], "isInherited": false}, "stroke-width": {"subproperties": ["stroke-width"], "supports": [6, 7, 8], "values": ["inherit", "initial", "unset"], "isInherited": true}, "-moz-hyphens": {"subproperties": ["hyphens"], "supports": [], "values": ["auto", "inherit", "initial", "manual", "none", "unset"], "isInherited": true}, "background-origin": {"subproperties": ["background-origin"], "supports": [], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "isInherited": false}, "-moz-box-direction": {"subproperties": ["-moz-box-direction"], "supports": [], "values": ["inherit", "initial", "normal", "reverse", "unset"], "isInherited": false}, "border-inline-end-color": {"subproperties": ["border-inline-end-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "marker-offset": {"subproperties": ["marker-offset"], "supports": [6], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-webkit-background-clip": {"subproperties": ["background-clip"], "supports": [], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "text", "unset"], "isInherited": false}, "border-radius": {"subproperties": ["border-top-left-radius", "border-top-right-radius", "border-bottom-right-radius", "border-bottom-left-radius"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "flex": {"subproperties": ["flex-grow", "flex-shrink", "flex-basis"], "supports": [6, 7, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "margin-inline-end": {"subproperties": ["margin-inline-end"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-moz-appearance": {"subproperties": ["-moz-appearance"], "supports": [], "values": ["-moz-gtk-info-bar", "-moz-mac-disclosure-button-closed", "-moz-mac-disclosure-button-open", "-moz-mac-fullscreen-button", "-moz-mac-help-button", "-moz-mac-source-list", "-moz-mac-vibrancy-dark", "-moz-mac-vibrancy-light", "-moz-win-borderless-glass", "-moz-win-browsertabbar-toolbox", "-moz-win-communications-toolbox", "-moz-win-exclude-glass", "-moz-win-glass", "-moz-win-media-toolbox", "-moz-window-button-box", "-moz-window-button-box-maximized", "-moz-window-button-close", "-moz-window-button-maximize", "-moz-window-button-minimize", "-moz-window-button-restore", "-moz-window-frame-bottom", "-moz-window-frame-left", "-moz-window-frame-right", "-moz-window-titlebar", "-moz-window-titlebar-maximized", "button", "button-arrow-down", "button-arrow-next", "button-arrow-previous", "button-arrow-up", "button-bevel", "button-focus", "caret", "checkbox", "checkbox-container", "checkbox-label", "checkmenuitem", "dialog", "dualbutton", "groupbox", "inherit", "initial", "listbox", "listitem", "menuarrow", "menubar", "menucheckbox", "menuimage", "menuitem", "menuitemtext", "menulist", "menulist-button", "menulist-text", "menulist-textfield", "menupopup", "menuradio", "menuseparator", "meterbar", "meterchunk", "none", "number-input", "progressbar", "progressbar-vertical", "progresschunk", "progresschunk-vertical", "radio", "radio-container", "radio-label", "radiomenuitem", "range", "range-thumb", "resizer", "resizerpanel", "scale-horizontal", "scale-vertical", "scalethumb-horizontal", "scalethumb-vertical", "scalethumbend", "scalethumbstart", "scalethumbtick", "scrollbar", "scrollbar-horizontal", "scrollbar-small", "scrollbar-vertical", "scrollbarbutton-down", "scrollbarbutton-left", "scrollbarbutton-right", "scrollbarbutton-up", "scrollbarthumb-horizontal", "scrollbarthumb-vertical", "scrollbartrack-horizontal", "scrollbartrack-vertical", "searchfield", "separator", "spinner", "spinner-downbutton", "spinner-textfield", "spinner-upbutton", "splitter", "statusbar", "statusbarpanel", "tab", "tab-scroll-arrow-back", "tab-scroll-arrow-forward", "tabpanel", "tabpanels", "textfield", "textfield-multiline", "toolbar", "toolbarbutton", "toolbarbutton-dropdown", "toolbargripper", "toolbox", "tooltip", "treeheader", "treeheadercell", "treeheadersortarrow", "treeitem", "treeline", "treetwisty", "treetwistyopen", "treeview", "unset", "window"], "isInherited": false}, "box-decoration-break": {"subproperties": ["box-decoration-break"], "supports": [], "values": ["clone", "inherit", "initial", "slice", "unset"], "isInherited": false}, "text-indent": {"subproperties": ["text-indent"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": true}, "hyphens": {"subproperties": ["hyphens"], "supports": [], "values": ["auto", "inherit", "initial", "manual", "none", "unset"], "isInherited": true}, "-moz-perspective": {"subproperties": ["perspective"], "supports": [6], "values": ["inherit", "initial", "none", "unset"], "isInherited": false}, "-webkit-animation-timing-function": {"subproperties": ["animation-timing-function"], "supports": [10], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "text-transform": {"subproperties": ["text-transform"], "supports": [], "values": ["capitalize", "full-width", "inherit", "initial", "lowercase", "none", "unset", "uppercase"], "isInherited": true}, "font-size": {"subproperties": ["font-size"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "large", "larger", "medium", "small", "smaller", "unset", "x-large", "x-small", "xx-large", "xx-small"], "isInherited": true}, "-webkit-animation-name": {"subproperties": ["animation-name"], "supports": [], "values": ["inherit", "initial", "none", "unset"], "isInherited": false}, "-moz-border-start": {"subproperties": ["border-inline-start-width", "border-inline-start-style", "border-inline-start-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "mask-composite": {"subproperties": ["mask-composite"], "values": ["add", "exclude", "inherit", "initial", "intersect", "subtract", "unset"], "supports": [], "isInherited": false}, "-webkit-text-stroke": {"subproperties": ["-webkit-text-stroke-width", "-webkit-text-stroke-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "hsl", "hsla", "inherit", "initial", "medium", "rgb", "rgba", "thick", "thin", "transparent", "unset"], "isInherited": true}, "padding-top": {"subproperties": ["padding-top"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-webkit-flex-shrink": {"subproperties": ["flex-shrink"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "color-adjust": {"subproperties": ["color-adjust"], "supports": [], "values": ["economy", "exact", "inherit", "initial", "unset"], "isInherited": true}, "grid-template-rows": {"subproperties": ["grid-template-rows"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "content": {"subproperties": ["content"], "supports": [11], "values": ["inherit", "initial", "unset"], "isInherited": false}, "padding-right": {"subproperties": ["padding-right"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-webkit-transform": {"subproperties": ["transform"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "marker-mid": {"subproperties": ["marker-mid"], "supports": [11], "values": ["inherit", "initial", "none", "unset", "url"], "isInherited": true}, "-moz-column-gap": {"subproperties": ["-moz-column-gap"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "normal", "unset"], "isInherited": false}, "-moz-border-start-style": {"subproperties": ["border-inline-start-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "clip-rule": {"subproperties": ["clip-rule"], "supports": [], "values": ["evenodd", "inherit", "initial", "nonzero", "unset"], "isInherited": true}, "font-family": {"subproperties": ["font-family"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "block-size": {"subproperties": ["block-size"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "offset-inline-start": {"subproperties": ["offset-inline-start"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "padding-block-end": {"subproperties": ["padding-block-end"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "transition": {"subproperties": ["transition-property", "transition-duration", "transition-timing-function", "transition-delay"], "supports": [9, 10], "values": ["all", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "none", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "filter": {"subproperties": ["filter"], "supports": [11], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-right-width": {"subproperties": ["border-right-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "-webkit-flex-direction": {"subproperties": ["flex-direction"], "supports": [], "values": ["column", "column-reverse", "inherit", "initial", "row", "row-reverse", "unset"], "isInherited": false}, "-webkit-mask-composite": {"subproperties": ["mask-composite"], "values": ["add", "exclude", "inherit", "initial", "intersect", "subtract", "unset"], "supports": [], "isInherited": false}, "mix-blend-mode": {"subproperties": ["mix-blend-mode"], "supports": [], "values": ["color", "color-burn", "color-dodge", "darken", "difference", "exclusion", "hard-light", "hue", "inherit", "initial", "lighten", "luminosity", "multiply", "normal", "overlay", "saturation", "screen", "soft-light", "unset"], "isInherited": false}, "color-interpolation": {"subproperties": ["color-interpolation"], "supports": [], "values": ["auto", "inherit", "initial", "linearrgb", "srgb", "unset"], "isInherited": true}, "border-top-style": {"subproperties": ["border-top-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "fill-opacity": {"subproperties": ["fill-opacity"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": true}, "marker-start": {"subproperties": ["marker-start"], "supports": [11], "values": ["inherit", "initial", "none", "unset", "url"], "isInherited": true}, "border-bottom-width": {"subproperties": ["border-bottom-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "-moz-column-rule-style": {"subproperties": ["-moz-column-rule-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "clear": {"subproperties": ["clear"], "supports": [], "values": ["both", "inherit", "initial", "inline-end", "inline-start", "left", "none", "right", "unset"], "isInherited": false}, "grid-area": {"subproperties": ["grid-row-start", "grid-column-start", "grid-row-end", "grid-column-end"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "padding-inline-start": {"subproperties": ["padding-inline-start"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-moz-border-end": {"subproperties": ["border-inline-end-width", "border-inline-end-style", "border-inline-end-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "background-clip": {"subproperties": ["background-clip"], "supports": [], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "text", "unset"], "isInherited": false}, "-webkit-text-fill-color": {"subproperties": ["-webkit-text-fill-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": true}, "border-block-start-style": {"subproperties": ["border-block-start-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "top": {"subproperties": ["top"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "border-width": {"subproperties": ["border-top-width", "border-right-width", "border-bottom-width", "border-left-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "max-inline-size": {"subproperties": ["max-inline-size"], "supports": [6, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "calc", "inherit", "initial", "none", "unset"], "isInherited": false}, "border-inline-start-width": {"subproperties": ["border-inline-start-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "-moz-box-flex": {"subproperties": ["-moz-box-flex"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "animation-play-state": {"subproperties": ["animation-play-state"], "supports": [], "values": ["inherit", "initial", "paused", "running", "unset"], "isInherited": false}, "padding": {"subproperties": ["padding-top", "padding-right", "padding-bottom", "padding-left"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "dominant-baseline": {"subproperties": ["dominant-baseline"], "supports": [], "values": ["alphabetic", "auto", "central", "hanging", "ideographic", "inherit", "initial", "mathematical", "middle", "no-change", "reset-size", "text-after-edge", "text-before-edge", "unset", "use-script"], "isInherited": false}, "background-attachment": {"subproperties": ["background-attachment"], "supports": [], "values": ["fixed", "inherit", "initial", "local", "scroll", "unset"], "isInherited": false}, "-webkit-box-sizing": {"subproperties": ["box-sizing"], "supports": [], "values": ["border-box", "content-box", "inherit", "initial", "unset"], "isInherited": false}, "-webkit-box-flex": {"subproperties": ["-moz-box-flex"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "text-orientation": {"subproperties": ["text-orientation"], "supports": [], "values": ["inherit", "initial", "mixed", "sideways", "sideways-right", "unset", "upright"], "isInherited": true}, "-moz-margin-start": {"subproperties": ["margin-inline-start"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "isolation": {"subproperties": ["isolation"], "supports": [], "values": ["auto", "inherit", "initial", "isolate", "unset"], "isInherited": false}, "-moz-border-bottom-colors": {"subproperties": ["-moz-border-bottom-colors"], "supports": [2], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-column-rule-width": {"subproperties": ["-moz-column-rule-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "object-fit": {"subproperties": ["object-fit"], "supports": [], "values": ["contain", "cover", "fill", "inherit", "initial", "none", "scale-down", "unset"], "isInherited": false}, "-webkit-border-bottom-right-radius": {"subproperties": ["border-bottom-right-radius"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-column-count": {"subproperties": ["-moz-column-count"], "supports": [7], "values": ["auto", "inherit", "initial", "unset"], "isInherited": false}, "border-left-width": {"subproperties": ["border-left-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "grid-column-end": {"subproperties": ["grid-column-end"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "background-blend-mode": {"subproperties": ["background-blend-mode"], "supports": [], "values": ["color", "color-burn", "color-dodge", "darken", "difference", "exclusion", "hard-light", "hue", "inherit", "initial", "lighten", "luminosity", "multiply", "normal", "overlay", "saturation", "screen", "soft-light", "unset"], "isInherited": false}, "vertical-align": {"subproperties": ["vertical-align"], "supports": [6, 8], "values": ["-moz-calc", "-moz-middle-with-baseline", "baseline", "bottom", "calc", "inherit", "initial", "middle", "sub", "super", "text-bottom", "text-top", "top", "unset"], "isInherited": false}, "clip": {"subproperties": ["clip"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "grid-auto-rows": {"subproperties": ["grid-auto-rows"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "margin-left": {"subproperties": ["margin-left"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "animation-name": {"subproperties": ["animation-name"], "supports": [], "values": ["inherit", "initial", "none", "unset"], "isInherited": false}, "border-image-source": {"subproperties": ["border-image-source"], "supports": [4, 5, 11], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "isInherited": false}, "border": {"subproperties": ["border-top-width", "border-right-width", "border-bottom-width", "border-left-width", "border-top-style", "border-right-style", "border-bottom-style", "border-left-style", "border-top-color", "border-right-color", "border-bottom-color", "border-left-color", "-moz-border-top-colors", "-moz-border-right-colors", "-moz-border-bottom-colors", "-moz-border-left-colors", "border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "linear-gradient", "medium", "none", "outset", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset", "url"], "isInherited": false}, "-webkit-transition-timing-function": {"subproperties": ["transition-timing-function"], "supports": [10], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "margin-bottom": {"subproperties": ["margin-bottom"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "animation": {"subproperties": ["animation-duration", "animation-timing-function", "animation-delay", "animation-direction", "animation-fill-mode", "animation-iteration-count", "animation-play-state", "animation-name"], "supports": [7, 9, 10], "values": ["alternate", "alternate-reverse", "backwards", "both", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "forwards", "infinite", "inherit", "initial", "linear", "none", "normal", "paused", "reverse", "running", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "font-weight": {"subproperties": ["font-weight"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": true}, "border-block-start-width": {"subproperties": ["border-block-start-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "mask-type": {"subproperties": ["mask-type"], "supports": [], "values": ["alpha", "inherit", "initial", "luminance", "unset"], "isInherited": false}, "margin-block-end": {"subproperties": ["margin-block-end"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "min-inline-size": {"subproperties": ["min-inline-size"], "supports": [6, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "object-position": {"subproperties": ["object-position"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "page-break-after": {"subproperties": ["page-break-after"], "supports": [], "values": ["always", "auto", "avoid", "inherit", "initial", "left", "right", "unset"], "isInherited": false}, "transition-property": {"subproperties": ["transition-property"], "supports": [], "values": ["all", "inherit", "initial", "none", "unset"], "isInherited": false}, "-moz-float-edge": {"subproperties": ["-moz-float-edge"], "supports": [], "values": ["content-box", "inherit", "initial", "margin-box", "unset"], "isInherited": false}, "white-space": {"subproperties": ["white-space"], "supports": [], "values": ["-moz-pre-space", "inherit", "initial", "normal", "nowrap", "pre", "pre-line", "pre-wrap", "unset"], "isInherited": true}, "-moz-binding": {"subproperties": ["-moz-binding"], "supports": [11], "values": ["inherit", "initial", "none", "unset", "url"], "isInherited": false}, "ruby-align": {"subproperties": ["ruby-align"], "supports": [], "values": ["center", "inherit", "initial", "space-around", "space-between", "start", "unset"], "isInherited": true}, "font-kerning": {"subproperties": ["font-kerning"], "supports": [], "values": ["auto", "inherit", "initial", "none", "normal", "unset"], "isInherited": true}, "border-block-end": {"subproperties": ["border-block-end-width", "border-block-end-style", "border-block-end-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "animation-timing-function": {"subproperties": ["animation-timing-function"], "supports": [10], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "-webkit-border-radius": {"subproperties": ["border-top-left-radius", "border-top-right-radius", "border-bottom-right-radius", "border-bottom-left-radius"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "animation-iteration-count": {"subproperties": ["animation-iteration-count"], "supports": [7], "values": ["infinite", "inherit", "initial", "unset"], "isInherited": false}, "-webkit-animation-direction": {"subproperties": ["animation-direction"], "supports": [], "values": ["alternate", "alternate-reverse", "inherit", "initial", "normal", "reverse", "unset"], "isInherited": false}, "justify-self": {"subproperties": ["justify-self"], "supports": [], "values": ["auto", "baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "isInherited": false}, "-moz-border-top-colors": {"subproperties": ["-moz-border-top-colors"], "supports": [2], "values": ["inherit", "initial", "unset"], "isInherited": false}, "transition-timing-function": {"subproperties": ["transition-timing-function"], "supports": [10], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "-moz-transition-duration": {"subproperties": ["transition-duration"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "scroll-snap-coordinate": {"subproperties": ["scroll-snap-coordinate"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-box-orient": {"subproperties": ["-moz-box-orient"], "supports": [], "values": ["block-axis", "horizontal", "inherit", "initial", "inline-axis", "unset", "vertical"], "isInherited": false}, "counter-increment": {"subproperties": ["counter-increment"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-transform-style": {"subproperties": ["transform-style"], "supports": [], "values": ["flat", "inherit", "initial", "preserve-3d", "unset"], "isInherited": false}, "-moz-transition-timing-function": {"subproperties": ["transition-timing-function"], "supports": [10], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "grid-auto-columns": {"subproperties": ["grid-auto-columns"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-align-content": {"subproperties": ["align-content"], "supports": [], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "space-around", "space-between", "space-evenly", "start", "stretch", "unset"], "isInherited": false}, "font": {"subproperties": ["font-family", "font-style", "font-weight", "font-size", "line-height", "font-size-adjust", "font-stretch", "-x-system-font", "font-feature-settings", "font-language-override", "font-kerning", "font-synthesis", "font-variant-alternates", "font-variant-caps", "font-variant-east-asian", "font-variant-ligatures", "font-variant-numeric", "font-variant-position"], "supports": [6, 7, 8], "values": ["-moz-block-height", "-moz-calc", "all-petite-caps", "all-small-caps", "auto", "calc", "condensed", "expanded", "extra-condensed", "extra-expanded", "inherit", "initial", "italic", "large", "larger", "medium", "none", "normal", "oblique", "petite-caps", "semi-condensed", "semi-expanded", "small", "small-caps", "smaller", "sub", "super", "titling-caps", "ultra-condensed", "ultra-expanded", "unicase", "unset", "x-large", "x-small", "xx-large", "xx-small"], "isInherited": true}, "flex-wrap": {"subproperties": ["flex-wrap"], "supports": [], "values": ["inherit", "initial", "nowrap", "unset", "wrap", "wrap-reverse"], "isInherited": false}, "grid-row-start": {"subproperties": ["grid-row-start"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "list-style-image": {"subproperties": ["list-style-image"], "supports": [11], "values": ["inherit", "initial", "none", "unset", "url"], "isInherited": true}, "text-emphasis-position": {"subproperties": ["text-emphasis-position"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "border-right": {"subproperties": ["border-right-width", "border-right-style", "border-right-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "font-style": {"subproperties": ["font-style"], "supports": [], "values": ["inherit", "initial", "italic", "normal", "oblique", "unset"], "isInherited": true}, "box-shadow": {"subproperties": ["box-shadow"], "supports": [2, 6], "values": ["inherit", "initial", "unset"], "isInherited": false}, "align-self": {"subproperties": ["align-self"], "supports": [], "values": ["auto", "baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "isInherited": false}, "text-emphasis-color": {"subproperties": ["text-emphasis-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": true}, "border-bottom": {"subproperties": ["border-bottom-width", "border-bottom-style", "border-bottom-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "border-spacing": {"subproperties": ["border-spacing"], "supports": [6], "values": ["inherit", "initial", "unset"], "isInherited": true}, "-webkit-border-top-right-radius": {"subproperties": ["border-top-right-radius"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "margin-inline-start": {"subproperties": ["margin-inline-start"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "grid-row-end": {"subproperties": ["grid-row-end"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "perspective-origin": {"subproperties": ["perspective-origin"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "page-break-inside": {"subproperties": ["page-break-inside"], "supports": [], "values": ["auto", "avoid", "inherit", "initial", "unset"], "isInherited": false}, "scroll-behavior": {"subproperties": ["scroll-behavior"], "supports": [], "values": ["auto", "inherit", "initial", "smooth", "unset"], "isInherited": false}, "-moz-backface-visibility": {"subproperties": ["backface-visibility"], "supports": [], "values": ["hidden", "inherit", "initial", "unset", "visible"], "isInherited": false}, "-moz-outline-radius": {"subproperties": ["-moz-outline-radius-topleft", "-moz-outline-radius-topright", "-moz-outline-radius-bottomright", "-moz-outline-radius-bottomleft"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "mask-clip": {"subproperties": ["mask-clip"], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "supports": [], "isInherited": false}, "grid-row": {"subproperties": ["grid-row-start", "grid-row-end"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-bottom-right-radius": {"subproperties": ["border-bottom-right-radius"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "line-height": {"subproperties": ["line-height"], "supports": [6, 7, 8], "values": ["-moz-block-height", "-moz-calc", "calc", "inherit", "initial", "normal", "unset"], "isInherited": true}, "stroke-linejoin": {"subproperties": ["stroke-linejoin"], "supports": [], "values": ["bevel", "inherit", "initial", "miter", "round", "unset"], "isInherited": true}, "text-align-last": {"subproperties": ["text-align-last"], "supports": [], "values": ["auto", "center", "end", "inherit", "initial", "justify", "left", "right", "start", "unset"], "isInherited": true}, "word-spacing": {"subproperties": ["word-spacing"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "normal", "unset"], "isInherited": true}, "transform-style": {"subproperties": ["transform-style"], "supports": [], "values": ["flat", "inherit", "initial", "preserve-3d", "unset"], "isInherited": false}, "border-bottom-color": {"subproperties": ["border-bottom-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "font-language-override": {"subproperties": ["font-language-override"], "supports": [], "values": ["inherit", "initial", "normal", "unset"], "isInherited": true}, "-moz-outline-radius-topleft": {"subproperties": ["-moz-outline-radius-topleft"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-image": {"subproperties": ["border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat"], "supports": [4, 5, 6, 7, 8, 11], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "isInherited": false}, "caption-side": {"subproperties": ["caption-side"], "supports": [], "values": ["bottom", "bottom-outside", "inherit", "initial", "left", "right", "top", "top-outside", "unset"], "isInherited": true}, "-webkit-mask-position": {"subproperties": ["mask-position-x", "mask-position-y"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "border-inline-end-width": {"subproperties": ["border-inline-end-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "-webkit-border-image": {"subproperties": ["border-image-source", "border-image-slice", "border-image-width", "border-image-outset", "border-image-repeat"], "supports": [4, 5, 6, 7, 8, 11], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "isInherited": false}, "font-synthesis": {"subproperties": ["font-synthesis"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "grid-template": {"subproperties": ["grid-template-areas", "grid-template-rows", "grid-template-columns"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-mask-repeat": {"subproperties": ["mask-repeat"], "values": ["inherit", "initial", "no-repeat", "repeat", "repeat-x", "repeat-y", "round", "space", "unset"], "supports": [], "isInherited": false}, "-webkit-justify-content": {"subproperties": ["justify-content"], "supports": [], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "space-around", "space-between", "space-evenly", "start", "stretch", "unset"], "isInherited": false}, "text-decoration-color": {"subproperties": ["text-decoration-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "color": {"subproperties": ["color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": true}, "-moz-border-end-width": {"subproperties": ["border-inline-end-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "height": {"subproperties": ["height"], "supports": [6, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "margin-right": {"subproperties": ["margin-right"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-webkit-border-bottom-left-radius": {"subproperties": ["border-bottom-left-radius"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-transform": {"subproperties": ["transform"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-bottom-left-radius": {"subproperties": ["border-bottom-left-radius"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "fill-rule": {"subproperties": ["fill-rule"], "supports": [], "values": ["evenodd", "inherit", "initial", "nonzero", "unset"], "isInherited": true}, "min-width": {"subproperties": ["min-width"], "supports": [6, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "empty-cells": {"subproperties": ["empty-cells"], "supports": [], "values": ["hide", "inherit", "initial", "show", "unset"], "isInherited": true}, "direction": {"subproperties": ["direction"], "supports": [], "values": ["inherit", "initial", "ltr", "rtl", "unset"], "isInherited": true}, "clip-path": {"subproperties": ["clip-path"], "supports": [11], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-mask-size": {"subproperties": ["mask-size"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-box-orient": {"subproperties": ["-moz-box-orient"], "supports": [], "values": ["block-axis", "horizontal", "inherit", "initial", "inline-axis", "unset", "vertical"], "isInherited": false}, "z-index": {"subproperties": ["z-index"], "supports": [7], "values": ["auto", "inherit", "initial", "unset"], "isInherited": false}, "background-position-y": {"subproperties": ["background-position-y"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "text-decoration-style": {"subproperties": ["text-decoration-style"], "supports": [], "values": ["-moz-none", "dashed", "dotted", "double", "inherit", "initial", "solid", "unset", "wavy"], "isInherited": false}, "grid-template-areas": {"subproperties": ["grid-template-areas"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-perspective-origin": {"subproperties": ["perspective-origin"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-animation-direction": {"subproperties": ["animation-direction"], "supports": [], "values": ["alternate", "alternate-reverse", "inherit", "initial", "normal", "reverse", "unset"], "isInherited": false}, "font-size-adjust": {"subproperties": ["font-size-adjust"], "supports": [7], "values": ["inherit", "initial", "none", "unset"], "isInherited": true}, "cursor": {"subproperties": ["cursor"], "supports": [11], "values": ["inherit", "initial", "unset"], "isInherited": true}, "margin": {"subproperties": ["margin-top", "margin-right", "margin-bottom", "margin-left"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-webkit-animation": {"subproperties": ["animation-duration", "animation-timing-function", "animation-delay", "animation-direction", "animation-fill-mode", "animation-iteration-count", "animation-play-state", "animation-name"], "supports": [7, 9, 10], "values": ["alternate", "alternate-reverse", "backwards", "both", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "forwards", "infinite", "inherit", "initial", "linear", "none", "normal", "paused", "reverse", "running", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "-moz-control-character-visibility": {"subproperties": ["-moz-control-character-visibility"], "supports": [], "values": ["hidden", "inherit", "initial", "unset", "visible"], "isInherited": true}, "letter-spacing": {"subproperties": ["letter-spacing"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "normal", "unset"], "isInherited": true}, "-moz-transition-delay": {"subproperties": ["transition-delay"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "will-change": {"subproperties": ["will-change"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "transform-origin": {"subproperties": ["transform-origin"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "font-variant-ligatures": {"subproperties": ["font-variant-ligatures"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "padding-block-start": {"subproperties": ["padding-block-start"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-webkit-animation-duration": {"subproperties": ["animation-duration"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-block-end-width": {"subproperties": ["border-block-end-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "-webkit-mask-origin": {"subproperties": ["mask-origin"], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "supports": [], "isInherited": false}, "word-break": {"subproperties": ["word-break"], "supports": [], "values": ["break-all", "inherit", "initial", "keep-all", "normal", "unset"], "isInherited": true}, "table-layout": {"subproperties": ["table-layout"], "supports": [], "values": ["auto", "fixed", "inherit", "initial", "unset"], "isInherited": false}, "text-overflow": {"subproperties": ["text-overflow"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-flex": {"subproperties": ["flex-grow", "flex-shrink", "flex-basis"], "supports": [6, 7, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "grid-auto-flow": {"subproperties": ["grid-auto-flow"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-top-right-radius": {"subproperties": ["border-top-right-radius"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-image-outset": {"subproperties": ["border-image-outset"], "supports": [6, 7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "mask-size": {"subproperties": ["mask-size"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "touch-action": {"subproperties": ["touch-action"], "supports": [], "values": ["auto", "inherit", "initial", "manipulation", "none", "pan-x", "pan-y", "unset"], "isInherited": false}, "border-right-color": {"subproperties": ["border-right-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "backface-visibility": {"subproperties": ["backface-visibility"], "supports": [], "values": ["hidden", "inherit", "initial", "unset", "visible"], "isInherited": false}, "background-image": {"subproperties": ["background-image"], "supports": [4, 5, 11], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "isInherited": false}, "-moz-box-ordinal-group": {"subproperties": ["-moz-box-ordinal-group"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-transition-property": {"subproperties": ["transition-property"], "supports": [], "values": ["all", "inherit", "initial", "none", "unset"], "isInherited": false}, "writing-mode": {"subproperties": ["writing-mode"], "supports": [], "values": ["horizontal-tb", "inherit", "initial", "lr", "lr-tb", "rl", "rl-tb", "sideways-lr", "sideways-rl", "tb", "tb-rl", "unset", "vertical-lr", "vertical-rl"], "isInherited": true}, "stroke-opacity": {"subproperties": ["stroke-opacity"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": true}, "box-sizing": {"subproperties": ["box-sizing"], "supports": [], "values": ["border-box", "content-box", "inherit", "initial", "unset"], "isInherited": false}, "margin-top": {"subproperties": ["margin-top"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "position": {"subproperties": ["position"], "supports": [], "values": ["absolute", "fixed", "inherit", "initial", "relative", "static", "sticky", "unset"], "isInherited": false}, "list-style-position": {"subproperties": ["list-style-position"], "supports": [], "values": ["inherit", "initial", "inside", "outside", "unset"], "isInherited": true}, "-webkit-box-pack": {"subproperties": ["-moz-box-pack"], "supports": [], "values": ["center", "end", "inherit", "initial", "justify", "start", "unset"], "isInherited": false}, "quotes": {"subproperties": ["quotes"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "border-top": {"subproperties": ["border-top-width", "border-top-style", "border-top-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "-moz-animation-delay": {"subproperties": ["animation-delay"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-transition": {"subproperties": ["transition-property", "transition-duration", "transition-timing-function", "transition-delay"], "supports": [9, 10], "values": ["all", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "none", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "-moz-window-dragging": {"subproperties": ["-moz-window-dragging"], "supports": [], "values": ["default", "drag", "inherit", "initial", "no-drag", "unset"], "isInherited": false}, "lighting-color": {"subproperties": ["lighting-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "background-size": {"subproperties": ["background-size"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-border-top-left-radius": {"subproperties": ["border-top-left-radius"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-outline-radius-bottomleft": {"subproperties": ["-moz-outline-radius-bottomleft"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "mask-position-x": {"subproperties": ["mask-position-x"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "mask-position-y": {"subproperties": ["mask-position-y"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "justify-content": {"subproperties": ["justify-content"], "supports": [], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "space-around", "space-between", "space-evenly", "start", "stretch", "unset"], "isInherited": false}, "animation-fill-mode": {"subproperties": ["animation-fill-mode"], "supports": [], "values": ["backwards", "both", "forwards", "inherit", "initial", "none", "unset"], "isInherited": false}, "-webkit-filter": {"subproperties": ["filter"], "supports": [11], "values": ["inherit", "initial", "unset"], "isInherited": false}, "word-wrap": {"subproperties": ["overflow-wrap"], "supports": [], "values": ["break-word", "inherit", "initial", "normal", "unset"], "isInherited": true}, "grid": {"subproperties": ["grid-template-areas", "grid-template-rows", "grid-template-columns", "grid-auto-flow", "grid-auto-rows", "grid-auto-columns", "grid-row-gap", "grid-column-gap"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "background": {"subproperties": ["background-color", "background-image", "background-repeat", "background-attachment", "background-clip", "background-origin", "background-position-x", "background-position-y", "background-size"], "supports": [2, 4, 5, 6, 8, 11], "values": ["COLOR", "-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "border-box", "content-box", "currentColor", "fixed", "hsl", "hsla", "inherit", "initial", "linear-gradient", "local", "no-repeat", "none", "padding-box", "radial-gradient", "repeat", "repeat-x", "repeat-y", "repeating-linear-gradient", "repeating-radial-gradient", "rgb", "rgba", "round", "scroll", "space", "text", "transparent", "unset", "url"], "isInherited": false}, "margin-block-start": {"subproperties": ["margin-block-start"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "grid-column-start": {"subproperties": ["grid-column-start"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "text-align": {"subproperties": ["text-align"], "supports": [], "values": ["-moz-center", "-moz-left", "-moz-right", "center", "end", "inherit", "initial", "justify", "left", "right", "start", "unset"], "isInherited": true}, "marker-end": {"subproperties": ["marker-end"], "supports": [11], "values": ["inherit", "initial", "none", "unset", "url"], "isInherited": true}, "justify-items": {"subproperties": ["justify-items"], "supports": [], "values": ["auto", "baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "isInherited": false}, "mask-position": {"subproperties": ["mask-position-x", "mask-position-y"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-moz-columns": {"subproperties": ["-moz-column-count", "-moz-column-width"], "supports": [6, 7], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-moz-outline-radius-topright": {"subproperties": ["-moz-outline-radius-topright"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "right": {"subproperties": ["right"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-moz-border-left-colors": {"subproperties": ["-moz-border-left-colors"], "supports": [2], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-mask-position-x": {"subproperties": ["mask-position-x"], "values": ["inherit", "initial", "unset"], "supports": [6, 8], "isInherited": false}, "-webkit-transition-duration": {"subproperties": ["transition-duration"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-top-width": {"subproperties": ["border-top-width"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "medium", "thick", "thin", "unset"], "isInherited": false}, "bottom": {"subproperties": ["bottom"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "border-block-end-style": {"subproperties": ["border-block-end-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "-webkit-order": {"subproperties": ["order"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-animation-iteration-count": {"subproperties": ["animation-iteration-count"], "supports": [7], "values": ["infinite", "inherit", "initial", "unset"], "isInherited": false}, "-moz-animation-timing-function": {"subproperties": ["animation-timing-function"], "supports": [10], "values": ["cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "background-color": {"subproperties": ["background-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "-webkit-backface-visibility": {"subproperties": ["backface-visibility"], "supports": [], "values": ["hidden", "inherit", "initial", "unset", "visible"], "isInherited": false}, "animation-delay": {"subproperties": ["animation-delay"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "unicode-bidi": {"subproperties": ["unicode-bidi"], "supports": [], "values": ["-moz-isolate", "-moz-isolate-override", "-moz-plaintext", "bidi-override", "embed", "inherit", "initial", "isolate", "isolate-override", "normal", "plaintext", "unset"], "isInherited": false}, "text-shadow": {"subproperties": ["text-shadow"], "supports": [2, 6], "values": ["inherit", "initial", "unset"], "isInherited": true}, "-moz-user-modify": {"subproperties": ["-moz-user-modify"], "supports": [], "values": ["inherit", "initial", "read-only", "read-write", "unset", "write-only"], "isInherited": true}, "-webkit-box-direction": {"subproperties": ["-moz-box-direction"], "supports": [], "values": ["inherit", "initial", "normal", "reverse", "unset"], "isInherited": false}, "image-rendering": {"subproperties": ["image-rendering"], "supports": [], "values": ["-moz-crisp-edges", "auto", "inherit", "initial", "optimizequality", "optimizespeed", "unset"], "isInherited": true}, "border-inline-end": {"subproperties": ["border-inline-end-width", "border-inline-end-style", "border-inline-end-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "grid-gap": {"subproperties": ["grid-row-gap", "grid-column-gap"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-moz-animation-name": {"subproperties": ["animation-name"], "supports": [], "values": ["inherit", "initial", "none", "unset"], "isInherited": false}, "pointer-events": {"subproperties": ["pointer-events"], "supports": [], "values": ["all", "auto", "fill", "inherit", "initial", "none", "painted", "stroke", "unset", "visible", "visiblefill", "visiblepainted", "visiblestroke"], "isInherited": true}, "border-image-width": {"subproperties": ["border-image-width"], "supports": [6, 7, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-inline-start": {"subproperties": ["border-inline-start-width", "border-inline-start-style", "border-inline-start-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "min-block-size": {"subproperties": ["min-block-size"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-webkit-mask-clip": {"subproperties": ["mask-clip"], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "supports": [], "isInherited": false}, "-webkit-mask-image": {"subproperties": ["mask-image"], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "inherit", "initial", "linear-gradient", "none", "radial-gradient", "repeating-linear-gradient", "repeating-radial-gradient", "unset", "url"], "supports": [4, 5, 11], "isInherited": false}, "float": {"subproperties": ["float"], "supports": [], "values": ["inherit", "initial", "inline-end", "inline-start", "left", "none", "right", "unset"], "isInherited": false}, "max-height": {"subproperties": ["max-height"], "supports": [6, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "calc", "inherit", "initial", "none", "unset"], "isInherited": false}, "outline-offset": {"subproperties": ["outline-offset"], "supports": [6], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-moz-transform-style": {"subproperties": ["transform-style"], "supports": [], "values": ["flat", "inherit", "initial", "preserve-3d", "unset"], "isInherited": false}, "overflow-wrap": {"subproperties": ["overflow-wrap"], "supports": [], "values": ["break-word", "inherit", "initial", "normal", "unset"], "isInherited": true}, "fill": {"subproperties": ["fill"], "supports": [2, 11], "values": ["inherit", "initial", "unset"], "isInherited": true}, "scroll-snap-type": {"subproperties": ["scroll-snap-type-x", "scroll-snap-type-y"], "supports": [], "values": ["inherit", "initial", "mandatory", "none", "proximity", "unset"], "isInherited": false}, "text-emphasis-style": {"subproperties": ["text-emphasis-style"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": true}, "transform": {"subproperties": ["transform"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-text-align-last": {"subproperties": ["text-align-last"], "supports": [], "values": ["auto", "center", "end", "inherit", "initial", "justify", "left", "right", "start", "unset"], "isInherited": true}, "width": {"subproperties": ["width"], "supports": [6, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "stroke-miterlimit": {"subproperties": ["stroke-miterlimit"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": true}, "stop-opacity": {"subproperties": ["stop-opacity"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-top-color": {"subproperties": ["border-top-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "background-position": {"subproperties": ["background-position-x", "background-position-y"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "scroll-snap-type-x": {"subproperties": ["scroll-snap-type-x"], "supports": [], "values": ["inherit", "initial", "mandatory", "none", "proximity", "unset"], "isInherited": false}, "scroll-snap-type-y": {"subproperties": ["scroll-snap-type-y"], "supports": [], "values": ["inherit", "initial", "mandatory", "none", "proximity", "unset"], "isInherited": false}, "-moz-box-sizing": {"subproperties": ["box-sizing"], "supports": [], "values": ["border-box", "content-box", "inherit", "initial", "unset"], "isInherited": false}, "offset-block-start": {"subproperties": ["offset-block-start"], "supports": [6, 8], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "-webkit-background-origin": {"subproperties": ["background-origin"], "supports": [], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "isInherited": false}, "-webkit-align-items": {"subproperties": ["align-items"], "supports": [], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "isInherited": false}, "-moz-padding-start": {"subproperties": ["padding-inline-start"], "supports": [6, 8], "values": ["-moz-calc", "calc", "inherit", "initial", "unset"], "isInherited": false}, "transition-delay": {"subproperties": ["transition-delay"], "supports": [9], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-style": {"subproperties": ["border-top-style", "border-right-style", "border-bottom-style", "border-left-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "mask-repeat": {"subproperties": ["mask-repeat"], "values": ["inherit", "initial", "no-repeat", "repeat", "repeat-x", "repeat-y", "round", "space", "unset"], "supports": [], "isInherited": false}, "overflow": {"subproperties": ["overflow-x", "overflow-y"], "supports": [], "values": ["-moz-hidden-unscrollable", "auto", "hidden", "inherit", "initial", "scroll", "unset", "visible"], "isInherited": false}, "mask-origin": {"subproperties": ["mask-origin"], "values": ["border-box", "content-box", "inherit", "initial", "padding-box", "unset"], "supports": [], "isInherited": false}, "-moz-force-broken-image-icon": {"subproperties": ["-moz-force-broken-image-icon"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "grid-template-columns": {"subproperties": ["grid-template-columns"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-align-self": {"subproperties": ["align-self"], "supports": [], "values": ["auto", "baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "self-end", "self-start", "start", "stretch", "unset"], "isInherited": false}, "-webkit-perspective-origin": {"subproperties": ["perspective-origin"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "border-block-start": {"subproperties": ["border-block-start-width", "border-block-start-style", "border-block-start-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "display": {"subproperties": ["display"], "supports": [], "values": ["-moz-box", "-moz-deck", "-moz-grid", "-moz-grid-group", "-moz-grid-line", "-moz-groupbox", "-moz-inline-box", "-moz-inline-grid", "-moz-inline-stack", "-moz-popup", "-moz-stack", "-webkit-box", "-webkit-flex", "-webkit-inline-box", "-webkit-inline-flex", "block", "contents", "flex", "grid", "inherit", "initial", "inline", "inline-block", "inline-flex", "inline-grid", "inline-table", "list-item", "none", "ruby", "ruby-base", "ruby-base-container", "ruby-text", "ruby-text-container", "table", "table-caption", "table-cell", "table-column", "table-column-group", "table-footer-group", "table-header-group", "table-row", "table-row-group", "unset"], "isInherited": false}, "-webkit-box-ordinal-group": {"subproperties": ["-moz-box-ordinal-group"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-column-width": {"subproperties": ["-moz-column-width"], "supports": [6], "values": ["-moz-calc", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "border-color": {"subproperties": ["border-top-color", "border-right-color", "border-bottom-color", "border-left-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "-webkit-flex-basis": {"subproperties": ["flex-basis"], "supports": [6, 8], "values": ["-moz-available", "-moz-calc", "-moz-fit-content", "-moz-max-content", "-moz-min-content", "auto", "calc", "inherit", "initial", "unset"], "isInherited": false}, "stroke-dashoffset": {"subproperties": ["stroke-dashoffset"], "supports": [6, 7, 8], "values": ["inherit", "initial", "unset"], "isInherited": true}, "-moz-transform-origin": {"subproperties": ["transform-origin"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-text-size-adjust": {"subproperties": ["-moz-text-size-adjust"], "supports": [], "values": ["auto", "inherit", "initial", "none", "unset"], "isInherited": true}, "border-left-color": {"subproperties": ["border-left-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "overflow-y": {"subproperties": ["overflow-y"], "supports": [], "values": ["-moz-hidden-unscrollable", "auto", "hidden", "inherit", "initial", "scroll", "unset", "visible"], "isInherited": false}, "overflow-x": {"subproperties": ["overflow-x"], "supports": [], "values": ["-moz-hidden-unscrollable", "auto", "hidden", "inherit", "initial", "scroll", "unset", "visible"], "isInherited": false}, "-moz-user-select": {"subproperties": ["-moz-user-select"], "supports": [], "values": ["-moz-all", "-moz-none", "-moz-text", "all", "auto", "element", "elements", "inherit", "initial", "none", "text", "toggle", "tri-state", "unset"], "isInherited": false}, "-moz-column-rule": {"subproperties": ["-moz-column-rule-width", "-moz-column-rule-style", "-moz-column-rule-color"], "supports": [2, 6], "values": ["COLOR", "-moz-calc", "calc", "currentColor", "dashed", "dotted", "double", "groove", "hidden", "hsl", "hsla", "inherit", "initial", "inset", "medium", "none", "outset", "rgb", "rgba", "ridge", "solid", "thick", "thin", "transparent", "unset"], "isInherited": false}, "-moz-outline-radius-bottomright": {"subproperties": ["-moz-outline-radius-bottomright"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-column-rule-color": {"subproperties": ["-moz-column-rule-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "-moz-transition": {"subproperties": ["transition-property", "transition-duration", "transition-timing-function", "transition-delay"], "supports": [9, 10], "values": ["all", "cubic-bezier", "ease", "ease-in", "ease-in-out", "ease-out", "inherit", "initial", "linear", "none", "step-end", "step-start", "steps", "unset"], "isInherited": false}, "opacity": {"subproperties": ["opacity"], "supports": [7], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-webkit-perspective": {"subproperties": ["perspective"], "supports": [6], "values": ["inherit", "initial", "none", "unset"], "isInherited": false}, "-webkit-text-stroke-color": {"subproperties": ["-webkit-text-stroke-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": true}, "align-content": {"subproperties": ["align-content"], "supports": [], "values": ["baseline", "center", "end", "flex-end", "flex-start", "inherit", "initial", "last-baseline", "left", "normal", "right", "space-around", "space-between", "space-evenly", "start", "stretch", "unset"], "isInherited": false}, "scroll-snap-points-y": {"subproperties": ["scroll-snap-points-y"], "supports": [], "values": ["inherit", "initial", "unset"], "isInherited": false}, "-moz-transition-property": {"subproperties": ["transition-property"], "supports": [], "values": ["all", "inherit", "initial", "none", "unset"], "isInherited": false}, "border-bottom-style": {"subproperties": ["border-bottom-style"], "supports": [], "values": ["dashed", "dotted", "double", "groove", "hidden", "inherit", "initial", "inset", "none", "outset", "ridge", "solid", "unset"], "isInherited": false}, "-moz-animation-play-state": {"subproperties": ["animation-play-state"], "supports": [], "values": ["inherit", "initial", "paused", "running", "unset"], "isInherited": false}, "mask": {"subproperties": ["mask-image", "mask-repeat", "mask-position-x", "mask-position-y", "mask-clip", "mask-origin", "mask-size", "mask-composite", "mask-mode"], "supports": [4, 5, 6, 8, 11], "values": ["-moz-element", "-moz-image-rect", "-moz-linear-gradient", "-moz-radial-gradient", "-moz-repeating-linear-gradient", "-moz-repeating-radial-gradient", "add", "alpha", "border-box", "content-box", "exclude", "inherit", "initial", "intersect", "linear-gradient", "luminance", "match-source", "no-repeat", "none", "padding-box", "radial-gradient", "repeat", "repeat-x", "repeat-y", "repeating-linear-gradient", "repeating-radial-gradient", "round", "space", "subtract", "unset", "url"], "isInherited": false}, "background-position-x": {"subproperties": ["background-position-x"], "supports": [6, 8], "values": ["inherit", "initial", "unset"], "isInherited": false}, "stop-color": {"subproperties": ["stop-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "border-block-end-color": {"subproperties": ["border-block-end-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}, "stroke-dasharray": {"subproperties": ["stroke-dasharray"], "supports": [6, 7, 8], "values": ["inherit", "initial", "unset"], "isInherited": true}, "border-inline-start-color": {"subproperties": ["border-inline-start-color"], "supports": [2], "values": ["COLOR", "currentColor", "hsl", "hsla", "inherit", "initial", "rgb", "rgba", "transparent", "unset"], "isInherited": false}};
 
 /**
  * A list of the pseudo elements.
  */
 exports.PSEUDO_ELEMENTS = [":after", ":before", ":backdrop", ":first-letter", ":first-line", ":-moz-selection", ":-moz-focus-inner", ":-moz-focus-outer", ":-moz-list-bullet", ":-moz-list-number", ":-moz-math-anonymous", ":-moz-progress-bar", ":-moz-range-track", ":-moz-range-progress", ":-moz-range-thumb", ":-moz-meter-bar", ":-moz-placeholder", ":placeholder", ":-moz-color-swatch"];
 
 /**
  * A list of the preferences keys for whether a CSS property is enabled or not. This is
--- a/docshell/base/nsDefaultURIFixup.cpp
+++ b/docshell/base/nsDefaultURIFixup.cpp
@@ -907,17 +907,17 @@ nsDefaultURIFixup::KeywordURIFixup(const
              (*iter >= 'A' && *iter <= 'F') ||
              nsCRT::IsAsciiDigit(*iter)))) {
         looksLikeIpv6 = false;
       }
     }
 
     // If we're at the end of the string or this is the first slash,
     // check if the thing before the slash looks like ipv4:
-    if ((iter.size_forward() == 1 ||
+    if ((iterEnd - iter == 1 ||
          (lastSlashLoc == uint32_t(kNotFound) && *iter == '/')) &&
         // Need 2 or 3 dots + only digits
         (foundDots == 2 || foundDots == 3) &&
         // and they should be all that came before now:
         (foundDots + foundDigits == pos ||
          // or maybe there was also exactly 1 colon that came after the last dot,
          // and the digits, dots and colon were all that came before now:
          (foundColons == 1 && firstColonLoc > lastDotLoc &&
--- a/dom/base/BodyUtil.cpp
+++ b/dom/base/BodyUtil.cpp
@@ -75,19 +75,20 @@ public:
   GetText()
   {
     return mDecoded;
   }
 };
 
 // Reads over a CRLF and positions start after it.
 static bool
-PushOverLine(nsACString::const_iterator& aStart)
+PushOverLine(nsACString::const_iterator& aStart,
+	     const nsACString::const_iterator& aEnd)
 {
-  if (*aStart == nsCRT::CR && (aStart.size_forward() > 1) && *(++aStart) == nsCRT::LF) {
+  if (*aStart == nsCRT::CR && (aEnd - aStart > 1) && *(++aStart) == nsCRT::LF) {
     ++aStart; // advance to after CRLF
     return true;
   }
 
   return false;
 }
 
 class MOZ_STACK_CLASS FillFormIterator final
@@ -389,29 +390,29 @@ public:
           if (start != end && *start == '-') {
             // End of data.
             if (!mFormData) {
               mFormData = new FormData();
             }
             return true;
           }
 
-          if (!PushOverLine(start)) {
+          if (!PushOverLine(start, end)) {
             return false;
           }
           mState = PARSE_HEADER;
           break;
 
         case PARSE_HEADER:
           bool emptyHeader;
           if (!ParseHeader(start, end, &emptyHeader)) {
             return false;
           }
 
-          if (emptyHeader && !PushOverLine(start)) {
+          if (emptyHeader && !PushOverLine(start, end)) {
             return false;
           }
 
           mState = emptyHeader ? PARSE_BODY : PARSE_HEADER;
           break;
 
         case PARSE_BODY:
           if (mName.IsVoid()) {
--- a/dom/base/ThirdPartyUtil.cpp
+++ b/dom/base/ThirdPartyUtil.cpp
@@ -116,17 +116,18 @@ ThirdPartyUtil::IsThirdPartyWindow(mozID
   NS_ASSERTION(aResult, "null outparam pointer");
 
   bool result;
 
   // Get the URI of the window, and its base domain.
   nsresult rv;
   nsCOMPtr<nsIURI> currentURI;
   rv = GetURIFromWindow(aWindow, getter_AddRefs(currentURI));
-  NS_ENSURE_SUCCESS(rv, rv);
+  if (NS_FAILED(rv))
+    return rv;
 
   nsCString bottomDomain;
   rv = GetBaseDomain(currentURI, bottomDomain);
   if (NS_FAILED(rv))
     return rv;
 
   if (aURI) {
     // Determine whether aURI is foreign with respect to currentURI.
--- a/dom/base/nsContentUtils.cpp
+++ b/dom/base/nsContentUtils.cpp
@@ -787,33 +787,22 @@ nsContentUtils::InitializeTouchEventTabl
   }
 }
 
 static bool
 Is8bit(const nsAString& aString)
 {
   static const char16_t EIGHT_BIT = char16_t(~0x00FF);
 
-  nsAString::const_iterator done_reading;
-  aString.EndReading(done_reading);
-
-  // for each chunk of |aString|...
-  uint32_t fragmentLength = 0;
-  nsAString::const_iterator iter;
-  for (aString.BeginReading(iter); iter != done_reading;
-       iter.advance(int32_t(fragmentLength))) {
-    fragmentLength = uint32_t(iter.size_forward());
-    const char16_t* c = iter.get();
-    const char16_t* fragmentEnd = c + fragmentLength;
-
-    // for each character in this chunk...
-    while (c < fragmentEnd) {
-      if (*c++ & EIGHT_BIT) {
-        return false;
-      }
+  for (nsAString::const_char_iterator start = aString.BeginReading(),
+         end = aString.EndReading();
+       start != end;
+       ++start) {
+    if (*start & EIGHT_BIT) {
+      return false;
     }
   }
 
   return true;
 }
 
 nsresult
 nsContentUtils::Btoa(const nsAString& aBinaryData,
--- a/dom/base/nsDOMWindowUtils.cpp
+++ b/dom/base/nsDOMWindowUtils.cpp
@@ -3495,16 +3495,29 @@ NS_IMETHODIMP
 nsDOMWindowUtils::GetIsHandlingUserInput(bool* aHandlingUserInput)
 {
   *aHandlingUserInput = EventStateManager::IsHandlingUserInput();
 
   return NS_OK;
 }
 
 NS_IMETHODIMP
+nsDOMWindowUtils::GetMillisSinceLastUserInput(double* aMillisSinceLastUserInput)
+{
+  TimeStamp lastInput = EventStateManager::LatestUserInputStart();
+  if (lastInput.IsNull()) {
+    *aMillisSinceLastUserInput = 0;
+    return NS_OK;
+  }
+
+  *aMillisSinceLastUserInput = (TimeStamp::Now() - lastInput).ToMilliseconds();
+  return NS_OK;
+}
+
+NS_IMETHODIMP
 nsDOMWindowUtils::AllowScriptsToClose()
 {
   nsCOMPtr<nsPIDOMWindowOuter> window = do_QueryReferent(mWindow);
   NS_ENSURE_STATE(window);
   nsGlobalWindow::Cast(window)->AllowScriptsToClose();
   return NS_OK;
 }
 
--- a/dom/base/nsGkAtomList.h
+++ b/dom/base/nsGkAtomList.h
@@ -879,16 +879,17 @@ GK_ATOM(onpairingconsentreq, "onpairingc
 GK_ATOM(onpaste, "onpaste")
 GK_ATOM(onpendingchange, "onpendingchange")
 GK_ATOM(onpichange, "onpichange")
 GK_ATOM(onpicture, "onpicture")
 GK_ATOM(onpointerlockchange, "onpointerlockchange")
 GK_ATOM(onpointerlockerror, "onpointerlockerror")
 GK_ATOM(onpopuphidden, "onpopuphidden")
 GK_ATOM(onpopuphiding, "onpopuphiding")
+GK_ATOM(onpopuppositioned, "onpopuppositioned")
 GK_ATOM(onpopupshowing, "onpopupshowing")
 GK_ATOM(onpopupshown, "onpopupshown")
 GK_ATOM(onposter, "onposter")
 GK_ATOM(onpreviewstatechange, "onpreviewstatechange")
 GK_ATOM(onpullphonebookreq, "onpullphonebookreq")
 GK_ATOM(onpullvcardentryreq, "onpullvcardentryreq")
 GK_ATOM(onpullvcardlistingreq, "onpullvcardlistingreq")
 GK_ATOM(onpush, "onpush")
--- a/dom/base/nsGlobalWindow.cpp
+++ b/dom/base/nsGlobalWindow.cpp
@@ -6680,26 +6680,28 @@ nsGlobalWindow::EnsureReflowFlushAndPain
   }
 
   // Unsuppress painting.
   presShell->UnsuppressPainting();
 }
 
 // static
 void
-nsGlobalWindow::MakeScriptDialogTitle(nsAString &aOutTitle)
-{
+nsGlobalWindow::MakeScriptDialogTitle(nsAString& aOutTitle,
+                                      nsIPrincipal* aSubjectPrincipal)
+{
+  MOZ_ASSERT(aSubjectPrincipal);
+
   aOutTitle.Truncate();
 
   // Try to get a host from the running principal -- this will do the
   // right thing for javascript: and data: documents.
 
-  nsCOMPtr<nsIPrincipal> principal = nsContentUtils::SubjectPrincipal();
   nsCOMPtr<nsIURI> uri;
-  nsresult rv = principal->GetURI(getter_AddRefs(uri));
+  nsresult rv = aSubjectPrincipal->GetURI(getter_AddRefs(uri));
   // Note - The check for the current JSContext here isn't necessarily sensical.
   // It's just designed to preserve existing behavior during a mass-conversion
   // patch.
   if (NS_SUCCEEDED(rv) && uri && nsContentUtils::GetCurrentJSContext()) {
     // remove user:pass for privacy and spoof prevention
 
     nsCOMPtr<nsIURIFixup> fixup(do_GetService(NS_URIFIXUP_CONTRACTID));
     if (fixup) {
@@ -6800,21 +6802,23 @@ nsGlobalWindow::CanMoveResizeWindows(boo
     }
   }
   return true;
 }
 
 bool
 nsGlobalWindow::AlertOrConfirm(bool aAlert,
                                const nsAString& aMessage,
-                               mozilla::ErrorResult& aError)
+                               const Maybe<nsIPrincipal*>& aSubjectPrincipal,
+                               ErrorResult& aError)
 {
   // XXX This method is very similar to nsGlobalWindow::Prompt, make
   // sure any modifications here don't need to happen over there!
   MOZ_ASSERT(IsOuterWindow());
+  MOZ_ASSERT(aSubjectPrincipal.isSome());
 
   if (!AreDialogsEnabled()) {
     // Just silently return.  In the case of alert(), the return value is
     // ignored.  In the case of confirm(), returning false is the same thing as
     // would happen if the user cancels.
     return false;
   }
 
@@ -6823,17 +6827,17 @@ nsGlobalWindow::AlertOrConfirm(bool aAle
   // the whole time a modal dialog is open.
   nsAutoPopupStatePusher popupStatePusher(openAbused, true);
 
   // Before bringing up the window, unsuppress painting and flush
   // pending reflows.
   EnsureReflowFlushAndPaint();
 
   nsAutoString title;
-  MakeScriptDialogTitle(title);
+  MakeScriptDialogTitle(title, aSubjectPrincipal.value());
 
   // Remove non-terminating null characters from the
   // string. See bug #310037.
   nsAutoString final;
   nsContentUtils::StripNullChars(aMessage, final);
 
   nsresult rv;
   nsCOMPtr<nsIPromptFactory> promptFac =
@@ -6876,63 +6880,79 @@ nsGlobalWindow::AlertOrConfirm(bool aAle
                prompt->Alert(title.get(), final.get()) :
                prompt->Confirm(title.get(), final.get(), &result);
   }
 
   return result;
 }
 
 void
-nsGlobalWindow::Alert(mozilla::ErrorResult& aError)
-{
-  MOZ_ASSERT(IsInnerWindow());
-  Alert(EmptyString(), aError);
-}
-
-void
-nsGlobalWindow::AlertOuter(const nsAString& aMessage, mozilla::ErrorResult& aError)
+nsGlobalWindow::Alert(const Maybe<nsIPrincipal*>& aSubjectPrincipal,
+                      ErrorResult& aError)
+{
+  MOZ_ASSERT(IsInnerWindow());
+  Alert(EmptyString(), aSubjectPrincipal, aError);
+}
+
+void
+nsGlobalWindow::AlertOuter(const nsAString& aMessage,
+                           const Maybe<nsIPrincipal*>& aSubjectPrincipal,
+                           ErrorResult& aError)
 {
   MOZ_RELEASE_ASSERT(IsOuterWindow());
-  AlertOrConfirm(/* aAlert = */ true, aMessage, aError);
-}
-
-void
-nsGlobalWindow::Alert(const nsAString& aMessage, mozilla::ErrorResult& aError)
-{
-  FORWARD_TO_OUTER_OR_THROW(AlertOuter, (aMessage, aError), aError, );
+  AlertOrConfirm(/* aAlert = */ true, aMessage, aSubjectPrincipal, aError);
+}
+
+void
+nsGlobalWindow::Alert(const nsAString& aMessage,
+                      const Maybe<nsIPrincipal*>& aSubjectPrincipal,
+                      ErrorResult& aError)
+{
+  FORWARD_TO_OUTER_OR_THROW(AlertOuter, (aMessage, aSubjectPrincipal, aError),
+                            aError, );
 }
 
 bool
-nsGlobalWindow::ConfirmOuter(const nsAString& aMessage, ErrorResult& aError)
+nsGlobalWindow::ConfirmOuter(const nsAString& aMessage,
+                             const Maybe<nsIPrincipal*>& aSubjectPrincipal,
+                             ErrorResult& aError)
 {
   MOZ_RELEASE_ASSERT(IsOuterWindow());
 
-  return AlertOrConfirm(/* aAlert = */ false, aMessage, aError);
+  return AlertOrConfirm(/* aAlert = */ false, aMessage, aSubjectPrincipal,
+                        aError);
 }
 
 bool
-nsGlobalWindow::Confirm(const nsAString& aMessage, ErrorResult& aError)
-{
-  FORWARD_TO_OUTER_OR_THROW(ConfirmOuter, (aMessage, aError), aError, false);
+nsGlobalWindow::Confirm(const nsAString& aMessage,
+                        const Maybe<nsIPrincipal*>& aSubjectPrincipal,
+                        ErrorResult& aError)
+{
+  FORWARD_TO_OUTER_OR_THROW(ConfirmOuter, (aMessage, aSubjectPrincipal, aError),
+                            aError, false);
 }
 
 already_AddRefed<Promise>
 nsGlobalWindow::Fetch(const RequestOrUSVString& aInput,
                       const RequestInit& aInit, ErrorResult& aRv)
 {
   return FetchRequest(this, aInput, aInit, aRv);
 }
 
 void
-nsGlobalWindow::PromptOuter(const nsAString& aMessage, const nsAString& aInitial,
-                            nsAString& aReturn, ErrorResult& aError)
+nsGlobalWindow::PromptOuter(const nsAString& aMessage,
+                            const nsAString& aInitial,
+                            nsAString& aReturn,
+                            const Maybe<nsIPrincipal*>& aSubjectPrincipal,
+                            ErrorResult& aError)
 {
   // XXX This method is very similar to nsGlobalWindow::AlertOrConfirm, make
   // sure any modifications here don't need to happen over there!
   MOZ_RELEASE_ASSERT(IsOuterWindow());
+  MOZ_ASSERT(aSubjectPrincipal.isSome());
 
   SetDOMStringToNull(aReturn);
 
   if (!AreDialogsEnabled()) {
     // Return null, as if the user just canceled the prompt.
     return;
   }
 
@@ -6941,17 +6961,17 @@ nsGlobalWindow::PromptOuter(const nsAStr
   // the whole time a modal dialog is open.
   nsAutoPopupStatePusher popupStatePusher(openAbused, true);
 
   // Before bringing up the window, unsuppress painting and flush
   // pending reflows.
   EnsureReflowFlushAndPaint();
 
   nsAutoString title;
-  MakeScriptDialogTitle(title);
+  MakeScriptDialogTitle(title, aSubjectPrincipal.value());
 
   // Remove non-terminating null characters from the
   // string. See bug #310037.
   nsAutoString fixedMessage, fixedInitial;
   nsContentUtils::StripNullChars(aMessage, fixedMessage);
   nsContentUtils::StripNullChars(aInitial, fixedInitial);
 
   nsresult rv;
@@ -7001,19 +7021,23 @@ nsGlobalWindow::PromptOuter(const nsAStr
 
   if (ok && outValue) {
     aReturn.Assign(outValue);
   }
 }
 
 void
 nsGlobalWindow::Prompt(const nsAString& aMessage, const nsAString& aInitial,
-                       nsAString& aReturn, ErrorResult& aError)
-{
-  FORWARD_TO_OUTER_OR_THROW(PromptOuter, (aMessage, aInitial, aReturn, aError),
+                       nsAString& aReturn,
+                       const Maybe<nsIPrincipal*>& aSubjectPrincipal,
+                       ErrorResult& aError)
+{
+  FORWARD_TO_OUTER_OR_THROW(PromptOuter,
+                            (aMessage, aInitial, aReturn, aSubjectPrincipal,
+                             aError),
                             aError, );
 }
 
 void
 nsGlobalWindow::FocusOuter(ErrorResult& aError)
 {
   MOZ_RELEASE_ASSERT(IsOuterWindow());
 
@@ -8244,19 +8268,21 @@ nsGlobalWindow::CallerInnerWindow()
   nsCOMPtr<nsPIDOMWindowInner> win = do_QueryInterface(global);
   return nsGlobalWindow::Cast(win);
 }
 
 void
 nsGlobalWindow::PostMessageMozOuter(JSContext* aCx, JS::Handle<JS::Value> aMessage,
                                     const nsAString& aTargetOrigin,
                                     JS::Handle<JS::Value> aTransfer,
+                                    const Maybe<nsIPrincipal*>& aSubjectPrincipal,
                                     ErrorResult& aError)
 {
   MOZ_RELEASE_ASSERT(IsOuterWindow());
+  MOZ_ASSERT(aSubjectPrincipal.isSome());
 
   //
   // Window.postMessage is an intentional subversion of the same-origin policy.
   // As such, this code must be particularly careful in the information it
   // exposes to calling code.
   //
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/section-crossDocumentMessages.html
   //
@@ -8328,20 +8354,18 @@ nsGlobalWindow::PostMessageMozOuter(JSCo
       return;
     }
 
     if (NS_FAILED(originURI->SetUserPass(EmptyCString())) ||
         NS_FAILED(originURI->SetPath(EmptyCString()))) {
       return;
     }
 
-    nsCOMPtr<nsIPrincipal> principal = nsContentUtils::SubjectPrincipal();
-    MOZ_ASSERT(principal);
-
-    PrincipalOriginAttributes attrs = BasePrincipal::Cast(principal)->OriginAttributesRef();
+    PrincipalOriginAttributes attrs =
+      BasePrincipal::Cast(aSubjectPrincipal.value())->OriginAttributesRef();
     // Create a nsIPrincipal inheriting the app/browser attributes from the
     // caller.
     providedPrincipal = BasePrincipal::CreateCodebasePrincipal(originURI, attrs);
     if (NS_WARN_IF(!providedPrincipal)) {
       return;
     }
   }
 
@@ -8369,27 +8393,30 @@ nsGlobalWindow::PostMessageMozOuter(JSCo
 
   aError = NS_DispatchToCurrentThread(event);
 }
 
 void
 nsGlobalWindow::PostMessageMoz(JSContext* aCx, JS::Handle<JS::Value> aMessage,
                                const nsAString& aTargetOrigin,
                                JS::Handle<JS::Value> aTransfer,
+                               const Maybe<nsIPrincipal*>& aSubjectPrincipal,
                                ErrorResult& aError)
 {
   FORWARD_TO_OUTER_OR_THROW(PostMessageMozOuter,
-                            (aCx, aMessage, aTargetOrigin, aTransfer, aError),
+                            (aCx, aMessage, aTargetOrigin, aTransfer,
+                             aSubjectPrincipal, aError),
                             aError, );
 }
 
 void
 nsGlobalWindow::PostMessageMoz(JSContext* aCx, JS::Handle<JS::Value> aMessage,
                                const nsAString& aTargetOrigin,
-                               const Optional<Sequence<JS::Value > >& aTransfer,
+                               const Optional<Sequence<JS::Value>>& aTransfer,
+                               const Maybe<nsIPrincipal*>& aSubjectPrincipal,
                                ErrorResult& aError)
 {
   JS::Rooted<JS::Value> transferArray(aCx, JS::UndefinedValue());
   if (aTransfer.WasPassed()) {
     const Sequence<JS::Value >& values = aTransfer.Value();
 
     // The input sequence only comes from the generated bindings code, which
     // ensures it is rooted.
@@ -8398,17 +8425,18 @@ nsGlobalWindow::PostMessageMoz(JSContext
 
     transferArray = JS::ObjectOrNullValue(JS_NewArrayObject(aCx, elements));
     if (transferArray.isNull()) {
       aError.Throw(NS_ERROR_OUT_OF_MEMORY);
       return;
     }
   }
 
-  PostMessageMoz(aCx, aMessage, aTargetOrigin, transferArray, aError);
+  PostMessageMoz(aCx, aMessage, aTargetOrigin, transferArray,
+                 aSubjectPrincipal, aError);
 }
 
 class nsCloseEvent : public Runnable {
 
   RefPtr<nsGlobalWindow> mWindow;
   bool mIndirect;
 
   nsCloseEvent(nsGlobalWindow *aWindow, bool aIndirect)
@@ -9006,42 +9034,45 @@ nsGlobalWindow::CacheXBLPrototypeHandler
     mCachedXBLPrototypeHandlers = new nsJSThingHashtable<nsPtrHashKey<nsXBLPrototypeHandler>, JSObject*>();
     PreserveWrapper(ToSupports(this));
   }
 
   mCachedXBLPrototypeHandlers->Put(aKey, aHandler);
 }
 
 Element*
-nsGlobalWindow::GetFrameElementOuter()
+nsGlobalWindow::GetFrameElementOuter(const Maybe<nsIPrincipal*>& aSubjectPrincipal)
 {
   MOZ_RELEASE_ASSERT(IsOuterWindow());
+  MOZ_ASSERT(aSubjectPrincipal.isSome());
 
   if (!mDocShell || mDocShell->GetIsMozBrowserOrApp()) {
     return nullptr;
   }
 
   // Per HTML5, the frameElement getter returns null in cross-origin situations.
   Element* element = GetRealFrameElementOuter();
   if (!element) {
     return nullptr;
   }
 
-  if (!nsContentUtils::SubjectPrincipal()->
+  if (!aSubjectPrincipal.value()->
          SubsumesConsideringDomain(element->NodePrincipal())) {
     return nullptr;
   }
 
   return element;
 }
 
 Element*
-nsGlobalWindow::GetFrameElement(ErrorResult& aError)
-{
-  FORWARD_TO_OUTER_OR_THROW(GetFrameElementOuter, (), aError, nullptr);
+nsGlobalWindow::GetFrameElement(const Maybe<nsIPrincipal*>& aSubjectPrincipal,
+                                ErrorResult& aError)
+{
+  FORWARD_TO_OUTER_OR_THROW(GetFrameElementOuter, (aSubjectPrincipal), aError,
+                            nullptr);
 }
 
 Element*
 nsGlobalWindow::GetRealFrameElementOuter()
 {
   MOZ_RELEASE_ASSERT(IsOuterWindow());
 
   if (!mDocShell) {
@@ -9203,32 +9234,36 @@ nsGlobalWindow::ConvertDialogOptions(con
         !TokenizeDialogOptions(token, iter, end) ||
         !token.EqualsLiteral(";")) {
       break;
     }
   }
 }
 
 already_AddRefed<nsIVariant>
-nsGlobalWindow::ShowModalDialogOuter(const nsAString& aUrl, nsIVariant* aArgument,
-                                     const nsAString& aOptions, ErrorResult& aError)
+nsGlobalWindow::ShowModalDialogOuter(const nsAString& aUrl,
+                                     nsIVariant* aArgument,
+                                     const nsAString& aOptions,
+                                     const Maybe<nsIPrincipal*>& aSubjectPrincipal,
+                                     ErrorResult& aError)
 {
   MOZ_RELEASE_ASSERT(IsOuterWindow());
+  MOZ_ASSERT(aSubjectPrincipal.isSome());
 
   if (mDoc) {
     mDoc->WarnOnceAbout(nsIDocument::eShowModalDialog);
   }
 
   if (!IsShowModalDialogEnabled()) {
     aError.Throw(NS_ERROR_NOT_AVAILABLE);
     return nullptr;
   }
 
   RefPtr<DialogValueHolder> argHolder =
-    new DialogValueHolder(nsContentUtils::SubjectPrincipal(), aArgument);
+    new DialogValueHolder(aSubjectPrincipal.value(), aArgument);
 
   // Before bringing up the window/dialog, unsuppress painting and flush
   // pending reflows.
   EnsureReflowFlushAndPaint();
 
   if (!AreDialogsEnabled()) {
     // We probably want to keep throwing here; silently doing nothing is a bit
     // weird given the typical use cases of showModalDialog().
@@ -9274,41 +9309,45 @@ nsGlobalWindow::ShowModalDialogOuter(con
   aError = dialog->GetReturnValue(getter_AddRefs(retVal));
   MOZ_ASSERT(!aError.Failed());
 
   return retVal.forget();
 }
 
 already_AddRefed<nsIVariant>
 nsGlobalWindow::ShowModalDialog(const nsAString& aUrl, nsIVariant* aArgument,
-                                const nsAString& aOptions, ErrorResult& aError)
+                                const nsAString& aOptions,
+                                const Maybe<nsIPrincipal*>& aSubjectPrincipal,
+                                ErrorResult& aError)
 {
   FORWARD_TO_OUTER_OR_THROW(ShowModalDialogOuter,
-                            (aUrl, aArgument, aOptions, aError), aError,
-                            nullptr);
+                            (aUrl, aArgument, aOptions, aSubjectPrincipal,
+                             aError), aError, nullptr);
 }
 
 void
 nsGlobalWindow::ShowModalDialog(JSContext* aCx, const nsAString& aUrl,
                                 JS::Handle<JS::Value> aArgument,
                                 const nsAString& aOptions,
                                 JS::MutableHandle<JS::Value> aRetval,
+                                const Maybe<nsIPrincipal*>& aSubjectPrincipal,
                                 ErrorResult& aError)
 {
   MOZ_ASSERT(IsInnerWindow());
 
   nsCOMPtr<nsIVariant> args;
   aError = nsContentUtils::XPConnect()->JSToVariant(aCx,
                                                     aArgument,
                                                     getter_AddRefs(args));
   if (aError.Failed()) {
     return;
   }
 
-  nsCOMPtr<nsIVariant> retVal = ShowModalDialog(aUrl, args, aOptions, aError);
+  nsCOMPtr<nsIVariant> retVal =
+    ShowModalDialog(aUrl, args, aOptions, aSubjectPrincipal, aError);
   if (aError.Failed()) {
     return;
   }
 
   JS::Rooted<JS::Value> result(aCx);
   if (retVal) {
     aError = nsContentUtils::XPConnect()->VariantToJS(aCx,
                                                       FastGetGlobalJSObject(),
@@ -10971,17 +11010,17 @@ nsGlobalWindow::ShowSlowScriptDialog()
   if (Preferences::GetBool("dom.always_stop_slow_scripts")) {
     return KillSlowScript;
   }
 
   // If it isn't safe to run script, then it isn't safe to bring up the prompt
   // (since that spins the event loop). In that (rare) case, we just kill the
   // script and report a warning.
   if (!nsContentUtils::IsSafeToRunScript()) {
-    JS_ReportWarning(cx, "A long running script was terminated");
+    JS_ReportWarningASCII(cx, "A long running script was terminated");
     return KillSlowScript;
   }
 
   // If our document is not active, just kill the script: we've been unloaded
   if (!AsInner()->HasActiveDocument()) {
     return KillSlowScript;
   }
 
@@ -13944,42 +13983,46 @@ NS_INTERFACE_MAP_END_INHERITING(nsGlobal
 
 NS_IMPL_ADDREF_INHERITED(nsGlobalModalWindow, nsGlobalWindow)
 NS_IMPL_RELEASE_INHERITED(nsGlobalModalWindow, nsGlobalWindow)
 
 
 void
 nsGlobalWindow::GetDialogArgumentsOuter(JSContext* aCx,
                                         JS::MutableHandle<JS::Value> aRetval,
+                                        const Maybe<nsIPrincipal*>& aSubjectPrincipal,
                                         ErrorResult& aError)
 {
   MOZ_RELEASE_ASSERT(IsOuterWindow());
+  MOZ_ASSERT(aSubjectPrincipal.isSome());
   MOZ_ASSERT(IsModalContentWindow(),
              "This should only be called on modal windows!");
 
   if (!mDialogArguments) {
     MOZ_ASSERT(mIsClosed, "This window should be closed!");
     aRetval.setUndefined();
     return;
   }
 
   // This does an internal origin check, and returns undefined if the subject
   // does not subsumes the origin of the arguments.
   JS::Rooted<JSObject*> wrapper(aCx, GetWrapper());
   JSAutoCompartment ac(aCx, wrapper);
-  mDialogArguments->Get(aCx, wrapper, nsContentUtils::SubjectPrincipal(),
+  mDialogArguments->Get(aCx, wrapper, aSubjectPrincipal.value(),
                         aRetval, aError);
 }
 
 void
 nsGlobalWindow::GetDialogArguments(JSContext* aCx,
                                    JS::MutableHandle<JS::Value> aRetval,
+                                   const Maybe<nsIPrincipal*>& aSubjectPrincipal,
                                    ErrorResult& aError)
 {
-  FORWARD_TO_OUTER_OR_THROW(GetDialogArgumentsOuter, (aCx, aRetval, aError),
+  FORWARD_TO_OUTER_OR_THROW(GetDialogArgumentsOuter,
+                            (aCx, aRetval, aSubjectPrincipal, aError),
                             aError, );
 }
 
 /* static */ already_AddRefed<nsGlobalModalWindow>
 nsGlobalModalWindow::Create(nsGlobalWindow *aOuterWindow)
 {
   RefPtr<nsGlobalModalWindow> window = new nsGlobalModalWindow(aOuterWindow);
   window->InitWasOffline();
@@ -14009,38 +14052,42 @@ void
 nsGlobalWindow::InitWasOffline()
 {
   mWasOffline = NS_IsOffline() || NS_IsAppOffline(GetPrincipal());
 }
 
 void
 nsGlobalWindow::GetReturnValueOuter(JSContext* aCx,
                                     JS::MutableHandle<JS::Value> aReturnValue,
+                                    const Maybe<nsIPrincipal*>& aSubjectPrincipal,
                                     ErrorResult& aError)
 {
   MOZ_RELEASE_ASSERT(IsOuterWindow());
+  MOZ_ASSERT(aSubjectPrincipal.isSome());
   MOZ_ASSERT(IsModalContentWindow(),
              "This should only be called on modal windows!");
 
   if (mReturnValue) {
     JS::Rooted<JSObject*> wrapper(aCx, GetWrapper());
     JSAutoCompartment ac(aCx, wrapper);
-    mReturnValue->Get(aCx, wrapper, nsContentUtils::SubjectPrincipal(),
+    mReturnValue->Get(aCx, wrapper, aSubjectPrincipal.value(),
                       aReturnValue, aError);
   } else {
     aReturnValue.setUndefined();
   }
 }
 
 void
 nsGlobalWindow::GetReturnValue(JSContext* aCx,
                                JS::MutableHandle<JS::Value> aReturnValue,
+                               const Maybe<nsIPrincipal*>& aSubjectPrincipal,
                                ErrorResult& aError)
 {
-  FORWARD_TO_OUTER_OR_THROW(GetReturnValueOuter, (aCx, aReturnValue, aError),
+  FORWARD_TO_OUTER_OR_THROW(GetReturnValueOuter,
+                            (aCx, aReturnValue, aSubjectPrincipal, aError),
                             aError, );
 }
 
 NS_IMETHODIMP
 nsGlobalModalWindow::GetReturnValue(nsIVariant **aRetVal)
 {
   FORWARD_TO_OUTER_MODAL_CONTENT_WINDOW(GetReturnValue, (aRetVal), NS_OK);
 
@@ -14050,38 +14097,42 @@ nsGlobalModalWindow::GetReturnValue(nsIV
     return NS_OK;
   }
   return mReturnValue->Get(nsContentUtils::SubjectPrincipal(), aRetVal);
 }
 
 void
 nsGlobalWindow::SetReturnValueOuter(JSContext* aCx,
                                     JS::Handle<JS::Value> aReturnValue,
+                                    const Maybe<nsIPrincipal*>& aSubjectPrincipal,
                                     ErrorResult& aError)
 {
   MOZ_RELEASE_ASSERT(IsOuterWindow());
+  MOZ_ASSERT(aSubjectPrincipal.isSome());
   MOZ_ASSERT(IsModalContentWindow(),
              "This should only be called on modal windows!");
 
   nsCOMPtr<nsIVariant> returnValue;
   aError =
     nsContentUtils::XPConnect()->JSToVariant(aCx, aReturnValue,
                                              getter_AddRefs(returnValue));
   if (!aError.Failed()) {
-    mReturnValue = new DialogValueHolder(nsContentUtils::SubjectPrincipal(),
+    mReturnValue = new DialogValueHolder(aSubjectPrincipal.value(),
                                          returnValue);
   }
 }
 
 void
 nsGlobalWindow::SetReturnValue(JSContext* aCx,
                                JS::Handle<JS::Value> aReturnValue,
+                               const Maybe<nsIPrincipal*>& aSubjectPrincipal,
                                ErrorResult& aError)
 {
-  FORWARD_TO_OUTER_OR_THROW(SetReturnValueOuter, (aCx, aReturnValue, aError),
+  FORWARD_TO_OUTER_OR_THROW(SetReturnValueOuter,
+                            (aCx, aReturnValue, aSubjectPrincipal, aError),
                             aError, );
 }
 
 NS_IMETHODIMP
 nsGlobalModalWindow::SetReturnValue(nsIVariant *aRetVal)
 {
   FORWARD_TO_OUTER_MODAL_CONTENT_WINDOW(SetReturnValue, (aRetVal), NS_OK);
 
--- a/dom/base/nsGlobalWindow.h
+++ b/dom/base/nsGlobalWindow.h
@@ -927,18 +927,21 @@ public:
   already_AddRefed<nsPIDOMWindowOuter> GetOpener() override;
   void SetOpener(JSContext* aCx, JS::Handle<JS::Value> aOpener,
                  mozilla::ErrorResult& aError);
   already_AddRefed<nsPIDOMWindowOuter> GetParentOuter();
   already_AddRefed<nsPIDOMWindowOuter> GetParent(mozilla::ErrorResult& aError);
   already_AddRefed<nsPIDOMWindowOuter> GetParent() override;
   nsPIDOMWindowOuter* GetScriptableParent() override;
   nsPIDOMWindowOuter* GetScriptableParentOrNull() override;
-  mozilla::dom::Element* GetFrameElementOuter();
-  mozilla::dom::Element* GetFrameElement(mozilla::ErrorResult& aError);
+  mozilla::dom::Element*
+  GetFrameElementOuter(const mozilla::Maybe<nsIPrincipal*>& aSubjectPrincipal);
+  mozilla::dom::Element*
+  GetFrameElement(const mozilla::Maybe<nsIPrincipal*>& aSubjectPrincipal,
+                  mozilla::ErrorResult& aError);
   already_AddRefed<nsIDOMElement> GetFrameElement() override;
   already_AddRefed<nsPIDOMWindowOuter>
   OpenOuter(const nsAString& aUrl,
             const nsAString& aName,
             const nsAString& aOptions,
             mozilla::ErrorResult& aError);
   already_AddRefed<nsPIDOMWindowOuter>
   Open(const nsAString& aUrl,
@@ -970,42 +973,58 @@ public:
   static bool
   TokenizeDialogOptions(nsAString& aToken, nsAString::const_iterator& aIter,
                         nsAString::const_iterator aEnd);
   static void
   ConvertDialogOptions(const nsAString& aOptions, nsAString& aResult);
 
 protected:
   bool AlertOrConfirm(bool aAlert, const nsAString& aMessage,
+                      const mozilla::Maybe<nsIPrincipal*>& aSubjectPrincipal,
                       mozilla::ErrorResult& aError);
 
 public:
-  void Alert(mozilla::ErrorResult& aError);
-  void AlertOuter(const nsAString& aMessage, mozilla::ErrorResult& aError);
-  void Alert(const nsAString& aMessage, mozilla::ErrorResult& aError);
+  void Alert(const mozilla::Maybe<nsIPrincipal*>& aSubjectPrincipal,
+             mozilla::ErrorResult& aError);
+  void AlertOuter(const nsAString& aMessage,
+                  const mozilla::Maybe<nsIPrincipal*>& aSubjectPrincipal,
+                  mozilla::ErrorResult& aError);
+  void Alert(const nsAString& aMessage,
+             const mozilla::Maybe<nsIPrincipal*>& aSubjectPrincipal,
+             mozilla::ErrorResult& aError);
+  bool ConfirmOuter(const nsAString& aMessage,
+                    const mozilla::Maybe<nsIPrincipal*>& aSubjectPrincipal,
+                    mozilla::ErrorResult& aError);
+  bool Confirm(const nsAString& aMessage,
+               const mozilla::Maybe<nsIPrincipal*>& aSubjectPrincipal,
+               mozilla::ErrorResult& aError);
+  void PromptOuter(const nsAString& aMessage, const nsAString& aInitial,
+                   nsAString& aReturn,
+                   const mozilla::Maybe<nsIPrincipal*>& aSubjectPrincipal,
+                   mozilla::ErrorResult& aError);
+  void Prompt(const nsAString& aMessage, const nsAString& aInitial,
+              nsAString& aReturn,
+              const mozilla::Maybe<nsIPrincipal*>& aSubjectPrincipal,
+              mozilla::ErrorResult& aError);
   already_AddRefed<mozilla::dom::cache::CacheStorage> GetCaches(mozilla::ErrorResult& aRv);
-  bool ConfirmOuter(const nsAString& aMessage, mozilla::ErrorResult& aError);
-  bool Confirm(const nsAString& aMessage, mozilla::ErrorResult& aError);
   already_AddRefed<mozilla::dom::Promise> Fetch(const mozilla::dom::RequestOrUSVString& aInput,
                                                 const mozilla::dom::RequestInit& aInit,
                                                 mozilla::ErrorResult& aRv);
-  void PromptOuter(const nsAString& aMessage, const nsAString& aInitial,
-                   nsAString& aReturn, mozilla::ErrorResult& aError);
-  void Prompt(const nsAString& aMessage, const nsAString& aInitial,
-              nsAString& aReturn, mozilla::ErrorResult& aError);
   void PrintOuter(mozilla::ErrorResult& aError);
   void Print(mozilla::ErrorResult& aError);
   void ShowModalDialog(JSContext* aCx, const nsAString& aUrl,
                        JS::Handle<JS::Value> aArgument,
                        const nsAString& aOptions,
                        JS::MutableHandle<JS::Value> aRetval,
+                       const mozilla::Maybe<nsIPrincipal*>& aSubjectPrincipal,
                        mozilla::ErrorResult& aError);
   void PostMessageMoz(JSContext* aCx, JS::Handle<JS::Value> aMessage,
                       const nsAString& aTargetOrigin,
                       const mozilla::dom::Optional<mozilla::dom::Sequence<JS::Value > >& aTransfer,
+                      const mozilla::Maybe<nsIPrincipal*>& aSubjectPrincipal,
                       mozilla::ErrorResult& aError);
   int32_t SetTimeout(JSContext* aCx, mozilla::dom::Function& aFunction,
                      int32_t aTimeout,
                      const mozilla::dom::Sequence<JS::Value>& aArguments,
                      mozilla::ErrorResult& aError);
   int32_t SetTimeout(JSContext* aCx, const nsAString& aHandler,
                      int32_t aTimeout,
                      const mozilla::dom::Sequence<JS::Value>& /* unused */,
@@ -1240,26 +1259,32 @@ public:
   nsIMessageBroadcaster* GetMessageManager(mozilla::ErrorResult& aError);
   nsIMessageBroadcaster* GetGroupMessageManager(const nsAString& aGroup,
                                                 mozilla::ErrorResult& aError);
   void BeginWindowMove(mozilla::dom::Event& aMouseDownEvent,
                        mozilla::dom::Element* aPanel,
                        mozilla::ErrorResult& aError);
 
   void GetDialogArgumentsOuter(JSContext* aCx, JS::MutableHandle<JS::Value> aRetval,
+                               const mozilla::Maybe<nsIPrincipal*>& aSubjectPrincipal,
                                mozilla::ErrorResult& aError);
   void GetDialogArguments(JSContext* aCx, JS::MutableHandle<JS::Value> aRetval,
+                          const mozilla::Maybe<nsIPrincipal*>& aSubjectPrincipal,
                           mozilla::ErrorResult& aError);
   void GetReturnValueOuter(JSContext* aCx, JS::MutableHandle<JS::Value> aReturnValue,
+                           const mozilla::Maybe<nsIPrincipal*>& aSubjectPrincipal,
                            mozilla::ErrorResult& aError);
   void GetReturnValue(JSContext* aCx, JS::MutableHandle<JS::Value> aReturnValue,
+                      const mozilla::Maybe<nsIPrincipal*>& aSubjectPrincipal,
                       mozilla::ErrorResult& aError);
   void SetReturnValueOuter(JSContext* aCx, JS::Handle<JS::Value> aReturnValue,
+                           const mozilla::Maybe<nsIPrincipal*>& aSubjectPrincipal,
                            mozilla::ErrorResult& aError);
   void SetReturnValue(JSContext* aCx, JS::Handle<JS::Value> aReturnValue,
+                      const mozilla::Maybe<nsIPrincipal*>& aSubjectPrincipal,
                       mozilla::ErrorResult& aError);
 
   void GetInterface(JSContext* aCx, nsIJSID* aIID,
                     JS::MutableHandle<JS::Value> aRetval,
                     mozilla::ErrorResult& aError);
 
   already_AddRefed<nsWindowRoot> GetWindowRootOuter();
   already_AddRefed<nsWindowRoot> GetWindowRoot(mozilla::ErrorResult& aError);
@@ -1540,17 +1565,18 @@ public:
   // Outer windows only.
   // Arguments to this function should have values in app units
   void SetCSSViewportWidthAndHeight(nscoord width, nscoord height);
   // Arguments to this function should have values in device pixels
   nsresult SetDocShellWidthAndHeight(int32_t width, int32_t height);
 
   static bool CanSetProperty(const char *aPrefName);
 
-  static void MakeScriptDialogTitle(nsAString &aOutTitle);
+  static void MakeScriptDialogTitle(nsAString& aOutTitle,
+                                    nsIPrincipal* aSubjectPrincipal);
 
   // Outer windows only.
   bool CanMoveResizeWindows(bool aCallerIsChrome);
 
   // If aDoFlush is true, we'll flush our own layout; otherwise we'll try to
   // just flush our parent and only flush ourselves if we think we need to.
   // Outer windows only.
   mozilla::CSSIntPoint GetScrollXY(bool aDoFlush);
@@ -1671,29 +1697,35 @@ protected:
   // Returns CSS pixels based on primary screen.  Outer windows only.
   mozilla::CSSIntPoint GetScreenXY(mozilla::ErrorResult& aError);
 
   nsGlobalWindow* InnerForSetTimeoutOrInterval(mozilla::ErrorResult& aError);
 
   void PostMessageMozOuter(JSContext* aCx, JS::Handle<JS::Value> aMessage,
                            const nsAString& aTargetOrigin,
                            JS::Handle<JS::Value> aTransfer,
+                           const mozilla::Maybe<nsIPrincipal*>& aSubjectPrincipal,
                            mozilla::ErrorResult& aError);
   void PostMessageMoz(JSContext* aCx, JS::Handle<JS::Value> aMessage,
                       const nsAString& aTargetOrigin,
                       JS::Handle<JS::Value> aTransfer,
+                      const mozilla::Maybe<nsIPrincipal*>& aSubjectPrincipal,
                       mozilla::ErrorResult& aError);
 
   already_AddRefed<nsIVariant>
     ShowModalDialogOuter(const nsAString& aUrl, nsIVariant* aArgument,
-                         const nsAString& aOptions, mozilla::ErrorResult& aError);
+                         const nsAString& aOptions,
+                         const mozilla::Maybe<nsIPrincipal*>& aSubjectPrincipal,
+                         mozilla::ErrorResult& aError);
 
   already_AddRefed<nsIVariant>
     ShowModalDialog(const nsAString& aUrl, nsIVariant* aArgument,
-                    const nsAString& aOptions, mozilla::ErrorResult& aError);
+                    const nsAString& aOptions,