Bug 1464065 - Avoid unnecessary work in nsIFrame::IsStackingContext() when frame is visually atomic draft
authorMiko Mynttinen <mikokm@gmail.com>
Thu, 24 May 2018 15:24:49 +0200
changeset 799328 6af708f3a33cf21205b61693d0f4f55c6f522ccf
parent 798691 d36cd8bdbc5c0df1d1d7a167f5fedb95c3a3648e
push id111010
push userbmo:mikokm@gmail.com
push dateThu, 24 May 2018 13:43:55 +0000
bugs1464065
milestone62.0a1
Bug 1464065 - Avoid unnecessary work in nsIFrame::IsStackingContext() when frame is visually atomic MozReview-Commit-ID: 3g5PqD65I2p
layout/generic/nsFrame.cpp
--- a/layout/generic/nsFrame.cpp
+++ b/layout/generic/nsFrame.cpp
@@ -11004,32 +11004,39 @@ nsIFrame::IsVisuallyAtomic(EffectSet* aE
          aStyleEffects->mMixBlendMode != NS_STYLE_BLEND_NORMAL ||
          nsSVGIntegrationUtils::UsingEffectsForFrame(this);
 }
 
 bool
 nsIFrame::IsStackingContext(const nsStyleDisplay* aStyleDisplay,
                             const nsStylePosition* aStylePosition,
                             bool aIsPositioned,
-                            bool aIsVisuallyAtomic) {
-  return (aIsPositioned && (aStyleDisplay->IsPositionForcingStackingContext() ||
-                           aStylePosition->mZIndex.GetUnit() == eStyleUnit_Integer)) ||
+                            bool aIsVisuallyAtomic)
+{
+  return aIsVisuallyAtomic ||
+         (aIsPositioned && (aStyleDisplay->IsPositionForcingStackingContext() ||
+                            aStylePosition->mZIndex.GetUnit() == eStyleUnit_Integer)) ||
          (aStyleDisplay->mWillChangeBitField & NS_STYLE_WILL_CHANGE_STACKING_CONTEXT) ||
-         aStyleDisplay->mIsolation != NS_STYLE_ISOLATION_AUTO ||
-         aIsVisuallyAtomic;
+         aStyleDisplay->mIsolation != NS_STYLE_ISOLATION_AUTO;
 }
 
 bool
 nsIFrame::IsStackingContext()
 {
   const nsStyleDisplay* disp = StyleDisplay();
-  bool isPositioned = disp->IsAbsPosContainingBlock(this);
-  bool isVisuallyAtomic = IsVisuallyAtomic(EffectSet::GetEffectSet(this),
-                                           disp, StyleEffects());
-  return IsStackingContext(disp, StylePosition(), isPositioned, isVisuallyAtomic);
+  const bool isVisuallyAtomic = IsVisuallyAtomic(EffectSet::GetEffectSet(this),
+                                                 disp, StyleEffects());
+  if (isVisuallyAtomic) {
+    // If this is changed, the function above should be updated as well.
+    return true;
+  }
+
+  const bool isPositioned = disp->IsAbsPosContainingBlock(this);
+  return IsStackingContext(disp, StylePosition(),
+                           isPositioned, isVisuallyAtomic);
 }
 
 static bool
 IsFrameScrolledOutOfView(nsIFrame* aTarget,
                          const nsRect& aTargetRect,
                          nsIFrame* aParent)
 {
   nsIScrollableFrame* scrollableFrame =