Kaydet (Commit) c922174b authored tarafından Miklos Vajna's avatar Miklos Vajna Kaydeden (comit) Andras Timar

tdf#89165 sw: looping layout in SwHeadFootFrm::FormatSize()

FormatObjsAtFrm() returns false, indicating that the result is not
perfect, and the caller hopes that formatting all children of the frame
again will help. Make sure that in case that assumption turns out to be false, we at
least do not loop.

The loop limit is enough to make the original i#43771 bugdoc still laid
out properly.

(cherry picked from commit 51438e87)

Change-Id: Ife9bd99a628a72edb922d04e05081971b6adf340
Reviewed-on: https://gerrit.libreoffice.org/19407Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarMichael Stahl <mstahl@redhat.com>
(cherry picked from commit 47e8bcd7)
üst c5907e7e
......@@ -2801,6 +2801,11 @@ DECLARE_OOXMLIMPORT_TEST(testTdf90153, "tdf90153.docx")
CPPUNIT_ASSERT_EQUAL(text::TextContentAnchorType_AT_CHARACTER, getProperty<text::TextContentAnchorType>(getShape(1), "AnchorType"));
}
DECLARE_OOXMLIMPORT_TEST(testTdf89165, "tdf89165.docx")
{
// This must not hang in layout
}
#endif
CPPUNIT_PLUGIN_IMPLEMENT();
......
......@@ -246,6 +246,7 @@ void SwHeadFootFrm::FormatSize(SwTwips nUL, const SwBorderAttrs * pAttrs)
pFrm->_InvalidatePos();
aOldFooterPrtPos = Frm().Pos() + Prt().Pos();
}
int nLoopControl = 0;
while( pFrm )
{
pFrm->Calc(getRootFrm()->GetCurrShell()->GetOut());
......@@ -263,9 +264,14 @@ void SwHeadFootFrm::FormatSize(SwTwips nUL, const SwBorderAttrs * pAttrs)
if ( !SwObjectFormatter::FormatObjsAtFrm( *pFrm,
*(pFrm->FindPageFrm()) ) )
{
// restart format with first content
pFrm = Lower();
continue;
if (nLoopControl++ < 20)
{
// restart format with first content
pFrm = Lower();
continue;
}
else
SAL_WARN("sw", "SwHeadFootFrm::FormatSize: loop detection triggered");
}
}
pFrm = pFrm->GetNext();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment