Bug 686281 - Expands will-change of a shorthand prop to longhand ones; r=dbaron. draft
authorCJKu <cku@mozilla.com>
Wed, 02 Dec 2015 18:21:11 +0800
changeset 313249 4a576e59d32c6195f737ed41534c563304f4a358
parent 313248 756ddf2fb142918cc06999cc3cced716a3a47a24
child 313250 f2872ff214eaccdc03846f40d2abb62b793da0a9
push id8059
push usercku@mozilla.com
push dateWed, 02 Dec 2015 10:21:42 +0000
reviewersdbaron
bugs686281
milestone45.0a1
Bug 686281 - Expands will-change of a shorthand prop to longhand ones; r=dbaron.
layout/style/nsRuleNode.cpp
--- 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;