sw/source/core/layout/objectformattertxtfrm.cxx | 40 +++++++++++++++--------- 1 file changed, 25 insertions(+), 15 deletions(-)
New commits: commit 3726c6e22d5cc9934f17cb73b3b5b5144eca2452 Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Mon Nov 2 14:54:36 2020 +0000 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Tue Nov 3 09:55:05 2020 +0100 extract cleanup piece to its own function this is from a failed campaign against tdf#122894 Change-Id: I639d65394cadca6ca70613dfd13691fd7b5f5104 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105191 Tested-by: Caolán McNamara <caol...@redhat.com> Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/sw/source/core/layout/objectformattertxtfrm.cxx b/sw/source/core/layout/objectformattertxtfrm.cxx index 3836c138f79d..2109835ba841 100644 --- a/sw/source/core/layout/objectformattertxtfrm.cxx +++ b/sw/source/core/layout/objectformattertxtfrm.cxx @@ -665,6 +665,30 @@ bool SwObjectFormatterTextFrame::CheckMovedFwdCondition( return bAnchorIsMovedForward; } +static void CleanupEmptyFootnoteFrame(SwFrame* pLowerFrame) +{ + // Calc on a SwTextFrame in a footnote can move it to the next page - + // deletion of the SwFootnoteFrame was disabled with SwFrameDeleteGuard + // but now we have to clean up empty footnote frames to prevent crashes. + // Note: check it at this level, not lower: both container and footnote + // can be deleted at the same time! + if (pLowerFrame->IsFootnoteContFrame()) + { + for (SwFrame * pFootnote = pLowerFrame->GetLower(); pFootnote; ) + { + assert(pFootnote->IsFootnoteFrame()); + SwFrame *const pNextNote = pFootnote->GetNext(); + if (!pFootnote->IsDeleteForbidden() && !pFootnote->GetLower() && !pFootnote->IsColLocked() && + !static_cast<SwFootnoteFrame*>(pFootnote)->IsBackMoveLocked()) + { + pFootnote->Cut(); + SwFrame::DestroyFrame(pFootnote); + } + pFootnote = pNextNote; + } + } +} + // #i40140# - helper method to format layout frames used by // method <SwObjectFormatterTextFrame::FormatAnchorFrameForCheckMoveFwd()> // #i44049# - format till a certain lower frame, if provided. @@ -694,21 +718,7 @@ static void lcl_FormatContentOfLayoutFrame( SwLayoutFrame* pLayFrame, // Note: check it at this level, not lower: both container and footnote // can be deleted at the same time! SwFrame *const pNext = pLowerFrame->GetNext(); - if (pLowerFrame->IsFootnoteContFrame()) - { - for (SwFrame * pFootnote = pLowerFrame->GetLower(); pFootnote; ) - { - assert(pFootnote->IsFootnoteFrame()); - SwFrame *const pNextNote = pFootnote->GetNext(); - if (!pFootnote->IsDeleteForbidden() && !pFootnote->GetLower() && !pFootnote->IsColLocked() && - !static_cast<SwFootnoteFrame*>(pFootnote)->IsBackMoveLocked()) - { - pFootnote->Cut(); - SwFrame::DestroyFrame(pFootnote); - } - pFootnote = pNextNote; - } - } + CleanupEmptyFootnoteFrame(pLowerFrame); pLowerFrame = pNext; } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits