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
--- 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");