diff --git a/layout/base/RestyleManager.cpp b/layout/base/RestyleManager.cpp index ffe7de732daf..3076f5e8538f 100644 --- a/layout/base/RestyleManager.cpp +++ b/layout/base/RestyleManager.cpp @@ -1531,6 +1531,25 @@ RestyleManager::ProcessRestyledFrames(nsStyleChangeList& aChangeList) 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)) {