Bug 1374966 - Drop nsChangeHint_UpdateTransformLayer when we also have nsChangeHint_AddOrRemoveTransform; r?heycam
MozReview-Commit-ID: 2eFl7cDXNA
--- 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) &&