void nsInlineFrame::ReflowInlineFrame(nsPresContext* aPresContext, const ReflowInput& aReflowInput, InlineReflowInput& irs, nsIFrame* aFrame, nsReflowStatus& aStatus) { nsLineLayout* lineLayout = aReflowInput.mLineLayout; bool reflowingFirstLetter = lineLayout->GetFirstLetterStyleOK(); bool pushedFrame; aStatus.Reset(); lineLayout->ReflowFrame(aFrame, aStatus, nullptr, pushedFrame); if (aStatus.IsInlineBreakBefore()) { if (aFrame != mFrames.FirstChild()) { // Change break-before status into break-after since we have // already placed at least one child frame. This preserves the // break-type so that it can be propagated upward. StyleClear oldBreakType = aStatus.BreakType(); aStatus.Reset(); aStatus.SetIncomplete(); aStatus.SetInlineLineBreakAfter(oldBreakType); PushFrames(aPresContext, aFrame, irs.mPrevFrame, irs); } else { // Preserve reflow status when breaking-before our first child // and propagate it upward without modification. } return; } // Create a next-in-flow if needed. if (!aStatus.IsFullyComplete()) { CreateNextInFlow(aFrame); } if (aStatus.IsInlineBreakAfter()) { nsIFrame* nextFrame = aFrame->GetNextSibling(); if (nextFrame) { aStatus.SetIncomplete(); PushFrames(aPresContext, nextFrame, aFrame, irs); } else { // We must return an incomplete status if there are more child // frames remaining in a next-in-flow that follows this frame. nsInlineFrame* nextInFlow = static_cast<nsInlineFrame*>(GetNextInFlow()); while (nextInFlow) { if (nextInFlow->mFrames.NotEmpty()) { aStatus.SetIncomplete(); break; } nextInFlow = static_cast<nsInlineFrame*>(nextInFlow->GetNextInFlow()); } } return; } if (!aStatus.IsFullyComplete() && !reflowingFirstLetter) { nsIFrame* nextFrame = aFrame->GetNextSibling(); if (nextFrame) { PushFrames(aPresContext, nextFrame, aFrame, irs); } } }