From c7688ac21f60a89fb1cfdcc5e186d3b65ddd4184 Mon Sep 17 00:00:00 2001 From: Mats Palmgren Date: Thu, 15 Feb 2018 18:38:03 +0100 Subject: [PATCH] Bug 1432853 - Disable 'page-break-inside:avoid' on abs.pos. frames for now. r=dholbert --- layout/generic/nsAbsoluteContainingBlock.cpp | 12 +++--------- layout/generic/nsFrame.cpp | 10 ++++++++++ layout/generic/nsFrame.h | 6 +----- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/layout/generic/nsAbsoluteContainingBlock.cpp b/layout/generic/nsAbsoluteContainingBlock.cpp index 78822b04d0fc..e87e089ca459 100644 --- a/layout/generic/nsAbsoluteContainingBlock.cpp +++ b/layout/generic/nsAbsoluteContainingBlock.cpp @@ -167,17 +167,11 @@ nsAbsoluteContainingBlock::Reflow(nsContainerFrame* aDelegatingFrame, nsReflowStatus kidStatus; ReflowAbsoluteFrame(aDelegatingFrame, aPresContext, aReflowInput, cb, aFlags, kidFrame, kidStatus, aOverflowAreas); + MOZ_ASSERT(!kidStatus.IsInlineBreakBefore(), + "ShouldAvoidBreakInside should prevent this from happening"); nsIFrame* nextFrame = kidFrame->GetNextInFlow(); - if ((kidStatus.IsInlineBreakBefore() || - !kidStatus.IsFullyComplete()) && + if (!kidStatus.IsFullyComplete() && aDelegatingFrame->IsFrameOfType(nsIFrame::eCanContainOverflowContainers)) { - // XXX it's unclear how we should handle 'page-break-inside:avoid' on - // abs.pos. boxes -- ignore it for now by setting the status to - // Incomplete (which will probably fragment it). - if (kidStatus.IsInlineBreakBefore()) { - kidStatus.Reset(); - kidStatus.SetIncomplete(); - } // Need a continuation if (!nextFrame) { nextFrame = diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index 233bb2d0b55c..c1ffdc8624d5 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -9704,6 +9704,16 @@ nsFrame::ConsiderChildOverflow(nsOverflowAreas& aOverflowAreas, aChildFrame->GetPosition()); } +bool +nsFrame::ShouldAvoidBreakInside(const ReflowInput& aReflowInput) const +{ + const auto* disp = StyleDisplay(); + return !aReflowInput.mFlags.mIsTopOfPage && + NS_STYLE_PAGE_BREAK_AVOID == disp->mBreakInside && + !(HasAnyStateBits(NS_FRAME_OUT_OF_FLOW) && IsAbsolutelyPositioned(disp)) && + !GetPrevInFlow(); +} + /** * This function takes a frame that is part of a block-in-inline split, * and _if_ that frame is an anonymous block created by an ib split it diff --git a/layout/generic/nsFrame.h b/layout/generic/nsFrame.h index 1e6cb567e878..cbec963bca2c 100644 --- a/layout/generic/nsFrame.h +++ b/layout/generic/nsFrame.h @@ -473,11 +473,7 @@ public: /** * @return true if we should avoid a page/column break in this frame. */ - bool ShouldAvoidBreakInside(const ReflowInput& aReflowInput) const { - return !aReflowInput.mFlags.mIsTopOfPage && - NS_STYLE_PAGE_BREAK_AVOID == StyleDisplay()->mBreakInside && - !GetPrevInFlow(); - } + bool ShouldAvoidBreakInside(const ReflowInput& aReflowInput) const; #ifdef DEBUG /**