Bug 1464065 - Avoid unnecessary work in nsIFrame::IsStackingContext() when frame is visually atomic
MozReview-Commit-ID: 3g5PqD65I2p
--- 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 =