diff options
author | Michael Stahl <michael.stahl@allotropia.de> | 2023-08-10 19:04:08 +0200 |
---|---|---|
committer | Michael Stahl <michael.stahl@allotropia.de> | 2023-08-14 15:00:47 +0200 |
commit | fcf6f5550cc7949e94dc74cbcd10a700a225e574 (patch) | |
tree | d700048cdeac0a5743bbf09b407cc9e880c9d22e /sw/source | |
parent | 518fa99dd7693d64a53e404a065090aedc0002b1 (diff) |
tdf#142694 sw: layout: fix infinite loop in SwFrame::PrepareMake()
The problem is that SwFrame::FindNext_() returns itself, because it's a
table frame 401 and its last cell is empty.
There was a nested table in the cell, but during an attempt to split the
outer table 401, the inner table moved backwards.
This is due to code that was added in commit
c9c956f2716c58e2573a9ac07073f712d736ed02, which only checks that the
height of the table frame is 0, but in this case the inner table does
contain a text frame which has never been formatted yet, but still the
table frame's size and print area was set to valid.
Unfortunately adding an obvious !ContainsContent() check to the
condition breaks uiwriter4 testTdf114306_2, the last table is not on
page 4 but on page 5, for no good reason.
So just fix SwFrame::FindNext_(), it should never return "this" anyway.
(somehow regression from commit 53a0a86df6eb5fc64a85ecd03f2e354fd4d8e213)
Change-Id: If043a53c32f175fc560d422c4a4e16d8e8c6ef49
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/155563
Tested-by: Jenkins
Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
Diffstat (limited to 'sw/source')
-rw-r--r-- | sw/source/core/layout/findfrm.cxx | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/sw/source/core/layout/findfrm.cxx b/sw/source/core/layout/findfrm.cxx index ae2c7473baf3..1a98f6cf6747 100644 --- a/sw/source/core/layout/findfrm.cxx +++ b/sw/source/core/layout/findfrm.cxx @@ -945,9 +945,19 @@ SwFrame *SwFrame::FindNext_() ) ) { - pRet = pNxtCnt->IsInTab() ? pNxtCnt->FindTabFrame() - : pNxtCnt; - break; + if (pNxtCnt->IsInTab()) + { + if (!IsTabFrame() || !static_cast<SwLayoutFrame*>(this)->IsAnLower(pNxtCnt)) + { + pRet = pNxtCnt->FindTabFrame(); + break; + } + } + else + { + pRet = pNxtCnt; + break; + } } pNxtCnt = lcl_NextFrame( pNxtCnt ); } |