Bug 686281 - Expands will-change of a shorthand prop to longhand ones; r=dbaron.
--- a/layout/style/nsRuleNode.cpp
+++ b/layout/style/nsRuleNode.cpp
@@ -6084,21 +6084,35 @@ nsRuleNode::ComputeDisplayData(void* aSt
if (buffer.EqualsLiteral("scroll-position")) {
display->mWillChangeBitField |= NS_STYLE_WILL_CHANGE_SCROLL;
}
nsCSSProperty prop =
nsCSSProps::LookupProperty(buffer,
nsCSSProps::eEnabledForAllContent);
if (prop != eCSSProperty_UNKNOWN &&
- prop != eCSSPropertyExtra_variable &&
- nsCSSProps::PropHasFlags(prop,
- CSS_PROPERTY_CREATES_STACKING_CONTEXT))
- {
- display->mWillChangeBitField |= NS_STYLE_WILL_CHANGE_STACKING_CONTEXT;
+ prop != eCSSPropertyExtra_variable) {
+ // If the property given is a shorthand, it indicates the expectation
+ // for all the longhands the shorthand expands to.
+ if (nsCSSProps::IsShorthand(prop)) {
+ for (const nsCSSProperty* shorthands =
+ nsCSSProps::SubpropertyEntryFor(prop);
+ *shorthands != eCSSProperty_UNKNOWN; ++shorthands) {
+ if (nsCSSProps::PropHasFlags(*shorthands,
+ CSS_PROPERTY_CREATES_STACKING_CONTEXT)) {
+ display->mWillChangeBitField |=
+ NS_STYLE_WILL_CHANGE_STACKING_CONTEXT;
+ break;
+ }
+ }
+ } else if (nsCSSProps::PropHasFlags(prop,
+ CSS_PROPERTY_CREATES_STACKING_CONTEXT)) {
+ display->mWillChangeBitField |=
+ NS_STYLE_WILL_CHANGE_STACKING_CONTEXT;
+ }
}
}
}
break;
}
case eCSSUnit_Inherit:
display->mWillChange = parentDisplay->mWillChange;