Bug 1235566 - Respect will-change: background-position. r?dbaron draft
authorMarkus Stange <mstange@themasta.com>
Tue, 29 Dec 2015 15:49:34 +0100
changeset 317905 e38e02aae6a6ee0343eade84279dd8f5e198aa43
parent 317904 da4e142492f70bd3bd199f41dc4fd0fc3ab4e990
child 317906 b581dbcaf8b221cd215fbdf3e2d0745dde32aa82
push id8779
push usermstange@themasta.com
push dateTue, 29 Dec 2015 16:30:22 +0000
reviewersdbaron
bugs1235566
milestone46.0a1
Bug 1235566 - Respect will-change: background-position. r?dbaron
layout/base/ActiveLayerTracker.cpp
layout/style/nsRuleNode.cpp
layout/style/nsStyleConsts.h
--- a/layout/base/ActiveLayerTracker.cpp
+++ b/layout/base/ActiveLayerTracker.cpp
@@ -414,16 +414,22 @@ ActiveLayerTracker::IsStyleAnimated(nsDi
       (!aBuilder || aBuilder->IsInWillChangeBudget(aFrame, aFrame->GetSize()))) {
     return true;
   }
   if ((aFrame->StyleDisplay()->mWillChangeBitField & NS_STYLE_WILL_CHANGE_OPACITY) &&
       aProperty == eCSSProperty_opacity &&
       (!aBuilder || aBuilder->IsInWillChangeBudget(aFrame, aFrame->GetSize()))) {
     return true;
   }
+  if ((aFrame->StyleDisplay()->mWillChangeBitField & NS_STYLE_WILL_CHANGE_BACKGROUND_POS) &&
+      (aProperty == eCSSProperty_background_position_x ||
+       aProperty == eCSSProperty_background_position_y) &&
+      (!aBuilder || aBuilder->IsInWillChangeBudget(aFrame, aFrame->GetSize()))) {
+    return true;
+  }
 
   LayerActivity* layerActivity = GetLayerActivity(aFrame);
   if (layerActivity) {
     LayerActivity::ActivityIndex activityIndex = LayerActivity::GetActivityIndexForProperty(aProperty);
     if (layerActivity->mRestyleCounts[activityIndex] >= 2) {
       return true;
     }
     if (CheckScrollInducedActivity(layerActivity, activityIndex, aBuilder)) {
--- a/layout/style/nsRuleNode.cpp
+++ b/layout/style/nsRuleNode.cpp
@@ -6092,16 +6092,22 @@ nsRuleNode::ComputeDisplayData(void* aSt
           display->mWillChangeBitField |= NS_STYLE_WILL_CHANGE_TRANSFORM;
         }
         if (buffer.EqualsLiteral("opacity")) {
           display->mWillChangeBitField |= NS_STYLE_WILL_CHANGE_OPACITY;
         }
         if (buffer.EqualsLiteral("scroll-position")) {
           display->mWillChangeBitField |= NS_STYLE_WILL_CHANGE_SCROLL;
         }
+        if (buffer.EqualsLiteral("background") ||
+            buffer.EqualsLiteral("background-position") ||
+            buffer.EqualsLiteral("background-position-x") ||
+            buffer.EqualsLiteral("background-position-y")) {
+          display->mWillChangeBitField |= NS_STYLE_WILL_CHANGE_BACKGROUND_POS;
+        }
 
         nsCSSProperty prop =
           nsCSSProps::LookupProperty(buffer,
                                      nsCSSProps::eEnabledForAllContent);
         if (prop != eCSSProperty_UNKNOWN &&
             prop != eCSSPropertyExtra_variable) {
           if (nsCSSProps::PropHasFlags(prop,
                 CSS_PROPERTY_CREATES_STACKING_CONTEXT)) {
--- a/layout/style/nsStyleConsts.h
+++ b/layout/style/nsStyleConsts.h
@@ -240,16 +240,17 @@ enum class StyleBoxSizing : uint8_t {
 
 // See nsStyleDisplay
 #define NS_STYLE_WILL_CHANGE_STACKING_CONTEXT   (1<<0)
 #define NS_STYLE_WILL_CHANGE_TRANSFORM          (1<<1)
 #define NS_STYLE_WILL_CHANGE_SCROLL             (1<<2)
 #define NS_STYLE_WILL_CHANGE_OPACITY            (1<<3)
 #define NS_STYLE_WILL_CHANGE_FIXPOS_CB          (1<<4)
 #define NS_STYLE_WILL_CHANGE_ABSPOS_CB          (1<<5)
+#define NS_STYLE_WILL_CHANGE_BACKGROUND_POS     (1<<5)
 
 // See AnimationEffectReadOnly.webidl
 // and mozilla/dom/AnimationEffectReadOnlyBinding.h
 namespace dom {
 enum class PlaybackDirection : uint32_t;
 enum class FillMode : uint32_t;
 }