Bug 1022553 - Attempt to introduce a stylesheet type for XBL documents. r?bz draft
authorJared Wein <jwein@mozilla.com>
Wed, 28 Jun 2017 18:36:11 -0700
changeset 601694 4224d406a129a563e047e552fa4c4b4249212e22
parent 601693 72a94ca28495e704663facdfa98ba662e6d61b9b
child 635381 6c3d48aba31252bdf10042d6ea7f9fbe896ae3c5
push id66192
push userbmo:jaws@mozilla.com
push dateThu, 29 Jun 2017 01:37:41 +0000
reviewersbz
bugs1022553
milestone56.0a1
Bug 1022553 - Attempt to introduce a stylesheet type for XBL documents. r?bz This patch adds a stylesheet type of XblDoc. I put it next to SheetType::Doc in the cascade, which I think is correct but I'm not sure about. After building with this patch, I'm seeing a segfault at nsRuleNode.cpp line 1979 ('while (*curr != aNode)'). Perhaps I missed incrementing another counter or I missed updating another area of code that will need to know about this new SheetType? MozReview-Commit-ID: CkiWumt6Tt2
dom/xbl/nsXBLPrototypeResources.cpp
layout/style/SheetType.h
layout/style/nsRuleNode.cpp
layout/style/nsStyleSet.cpp
layout/style/nsStyleStruct.h
--- a/dom/xbl/nsXBLPrototypeResources.cpp
+++ b/dom/xbl/nsXBLPrototypeResources.cpp
@@ -154,17 +154,17 @@ nsXBLPrototypeResources::GatherRuleProce
   for (StyleSheet* sheet : mStyleSheetList) {
     MOZ_ASSERT(sheet->IsGecko(),
                "GatherRuleProcessor must only be called for "
                "nsXBLPrototypeResources objects with Gecko-flavored style "
                "backends");
     sheets.AppendElement(sheet->AsGecko());
   }
   mRuleProcessor = new nsCSSRuleProcessor(Move(sheets),
-                                          SheetType::Doc,
+                                          SheetType::XblDoc,
                                           nullptr,
                                           mRuleProcessor);
 }
 
 void
 nsXBLPrototypeResources::ComputeServoStyleSet(nsPresContext* aPresContext)
 {
   mServoStyleSet.reset(new ServoStyleSet());
--- a/layout/style/SheetType.h
+++ b/layout/style/SheetType.h
@@ -17,16 +17,17 @@ namespace mozilla {
 //
 // Be sure to update NS_RULE_NODE_LEVEL_MASK when changing the number
 // of sheet types; static assertions enforce this.
 enum class SheetType : uint8_t {
   Agent, // CSS
   User, // CSS
   PresHint,
   Doc, // CSS
+  XblDoc, // CSS
   ScopedDoc,
   StyleAttr,
   Override, // CSS
   Animation,
   Transition,
 
   Count,
   Unknown = 0xff
--- a/layout/style/nsRuleNode.cpp
+++ b/layout/style/nsRuleNode.cpp
@@ -10635,16 +10635,17 @@ nsRuleNode::HasAuthorSpecifiedRules(nsSt
                 values[i]->GetUnit() != eCSSUnit_Dummy && // see above
                 values[i]->GetUnit() != eCSSUnit_DummyInherit) {
               // If author colors are not allowed, only claim to have
               // author-specified rules if we're looking at a non-color
               // property or if we're looking at the background color and it's
               // set to transparent.  Anything else should get set to a dummy
               // value instead.
               if (aAuthorColorsAllowed ||
+                  ruleData.mLevel == SheetType::XblDoc ||
                   !nsCSSProps::PropHasFlags(properties[i],
                      CSS_PROPERTY_IGNORED_WHEN_COLORS_DISABLED) ||
                   (properties[i] == eCSSProperty_background_color &&
                    !values[i]->IsNonTransparentColor())) {
                 return true;
               }
 
               values[i]->SetDummyValue();
--- a/layout/style/nsStyleSet.cpp
+++ b/layout/style/nsStyleSet.cpp
@@ -1480,16 +1480,17 @@ struct CascadeLevel {
   nsRestyleHint mLevelReplacementHint;
 };
 
 static const CascadeLevel gCascadeLevels[] = {
   { SheetType::Agent,            false, false, nsRestyleHint(0) },
   { SheetType::User,             false, false, nsRestyleHint(0) },
   { SheetType::PresHint,         false, false, nsRestyleHint(0) },
   { SheetType::Doc,              false, false, nsRestyleHint(0) },
+  { SheetType::XblDoc,           false, false, nsRestyleHint(0) },
   { SheetType::ScopedDoc,        false, false, nsRestyleHint(0) },
   { SheetType::StyleAttr,        false, true,  eRestyle_StyleAttribute |
                                                eRestyle_StyleAttribute_Animations },
   { SheetType::Override,         false, false, nsRestyleHint(0) },
   { SheetType::Animation,        false, false, eRestyle_CSSAnimations },
   { SheetType::ScopedDoc,        true,  false, nsRestyleHint(0) },
   { SheetType::Doc,              true,  false, nsRestyleHint(0) },
   { SheetType::StyleAttr,        true,  false, eRestyle_StyleAttribute |
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -98,18 +98,18 @@ class ImageTracker;
 // See nsStyleContext::GetPseudoEnum
 #define NS_STYLE_CONTEXT_TYPE_SHIFT        37
 
 // Additional bits for nsRuleNode's mDependentBits:
 #define NS_RULE_NODE_IS_ANIMATION_RULE      0x01000000
 // Free bit                                 0x02000000
 #define NS_RULE_NODE_USED_DIRECTLY          0x04000000
 #define NS_RULE_NODE_IS_IMPORTANT           0x08000000
-#define NS_RULE_NODE_LEVEL_MASK             0xf0000000
-#define NS_RULE_NODE_LEVEL_SHIFT            28
+#define NS_RULE_NODE_LEVEL_MASK             0xe0000000
+#define NS_RULE_NODE_LEVEL_SHIFT            24
 
 // Additional bits for nsRuleNode's mNoneBits:
 #define NS_RULE_NODE_HAS_ANIMATION_DATA     0x80000000
 
 static_assert(int(mozilla::SheetType::Count) - 1 <=
                 (NS_RULE_NODE_LEVEL_MASK >> NS_RULE_NODE_LEVEL_SHIFT),
               "NS_RULE_NODE_LEVEL_MASK cannot fit SheetType");