Bug 1374966 - Drop nsChangeHint_UpdateTransformLayer when we also have nsChangeHint_AddOrRemoveTransform; r?heycam draft
authorBrian Birtles <birtles@gmail.com>
Thu, 27 Jul 2017 12:05:47 +0900
changeset 616478 e65d560a3bf8e4d69aed7f6493206dbc58d847ad
parent 614015 5928d905c0bc0b28f5488b236444c7d7991cf8d4
child 639484 b74ad3c0f08dec7ad93f4e17809b3c2b34d2a8f9
push id70696
push userbbirtles@mozilla.com
push dateThu, 27 Jul 2017 03:06:33 +0000
reviewersheycam
bugs1374966
milestone56.0a1
Bug 1374966 - Drop nsChangeHint_UpdateTransformLayer when we also have nsChangeHint_AddOrRemoveTransform; r?heycam MozReview-Commit-ID: 2eFl7cDXNA
layout/base/RestyleManager.cpp
--- a/layout/base/RestyleManager.cpp
+++ b/layout/base/RestyleManager.cpp
@@ -1526,16 +1526,35 @@ RestyleManager::ProcessRestyledFrames(ns
 
       if (!(frame->GetStateBits() & NS_FRAME_MAY_BE_TRANSFORMED)) {
         // Frame can not be transformed, and thus a change in transform will
         // have no effect and we should not use the
         // nsChangeHint_UpdatePostTransformOverflow hint.
         hint &= ~nsChangeHint_UpdatePostTransformOverflow;
       }
 
+      if (hint & nsChangeHint_AddOrRemoveTransform) {
+        // When dropping a running transform animation we will first add an
+        // nsChangeHint_UpdateTransformLayer hint as part of the animation-only
+        // restyle. During the subsequent regular restyle, if the animation was
+        // the only reason the element had any transform applied, we will add
+        // nsChangeHint_AddOrRemoveTransform as part of the regular restyle.
+        //
+        // With the Gecko backend, these two change hints are processed
+        // after each restyle but when using the Servo backend they accumulate
+        // and are processed together after we have already removed the
+        // transform as part of the regular restyle. Since we don't actually
+        // need the nsChangeHint_UpdateTransformLayer hint if we already have
+        // a nsChangeHint_AddOrRemoveTransform hint, and since we
+        // will fail an assertion in ApplyRenderingChangeToTree if we try
+        // specify nsChangeHint_UpdateTransformLayer but don't have any
+        // transform style, we just drop the unneeded hint here.
+        hint &= ~nsChangeHint_UpdateTransformLayer;
+      }
+
       if (hint & nsChangeHint_UpdateEffects) {
         for (nsIFrame* cont = frame; cont;
              cont = nsLayoutUtils::GetNextContinuationOrIBSplitSibling(cont)) {
           nsSVGEffects::UpdateEffects(cont);
         }
       }
       if ((hint & nsChangeHint_InvalidateRenderingObservers) ||
           ((hint & nsChangeHint_UpdateOpacityLayer) &&