summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2017-07-06 14:07:45 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2017-08-24 11:28:58 +0200
commited7c4c96a999bb2ef5eeced7588da5d3845d2b7d (patch)
tree9cd384d6f119c33f957aa3fed0594b98a652214b
parentba4c9af309e97338f4e2929d6dba12c92c1a4bfc (diff)
i#61225 sw: fix layout loop with growable single-column sections
Commit 6ade80cf142664e78954c7544534e9436ceb90c7 (tdf#108524 sw: allow move of frame inside section without columns, 2017-06-16) relaxed lcl_IsInSectionDirectly() used in SwFrame::IsMoveable() to allow move for all section frame contents if it has a single column. That looked safe, as the multiple column case was already allowed. There is one situation where this still causes a problem: when the section has a single column and the section frame is growable -- as in that case we should grow the section frame, not move the contents. So go back to unconditionally allowing multi-column section contents and allow single-column section contents only in case the section frame is now growable. With this, ooo61225-1.sxw from the crashtesting corpus can be opened again without a layout loop. Reviewed-on: https://gerrit.libreoffice.org/39653 Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk> Tested-by: Jenkins <ci@libreoffice.org> (cherry picked from commit 972fbddf80510f7daaf2128dbfda01c0e7535020) Conflicts: sw/qa/extras/odfimport/odfimport.cxx Change-Id: Ib2d3702a33da8e62b9bbf468d558ae16db8aa94b
-rw-r--r--sw/qa/extras/odfimport/data/i61225.sxwbin0 -> 53844 bytes
-rw-r--r--sw/qa/extras/odfimport/odfimport.cxx8
-rw-r--r--sw/source/core/layout/findfrm.cxx9
3 files changed, 15 insertions, 2 deletions
diff --git a/sw/qa/extras/odfimport/data/i61225.sxw b/sw/qa/extras/odfimport/data/i61225.sxw
new file mode 100644
index 000000000000..4f43541995c3
--- /dev/null
+++ b/sw/qa/extras/odfimport/data/i61225.sxw
Binary files differ
diff --git a/sw/qa/extras/odfimport/odfimport.cxx b/sw/qa/extras/odfimport/odfimport.cxx
index 065cf787aaa8..a72d6a54c546 100644
--- a/sw/qa/extras/odfimport/odfimport.cxx
+++ b/sw/qa/extras/odfimport/odfimport.cxx
@@ -637,5 +637,13 @@ DECLARE_ODFIMPORT_TEST(testTdf96113, "tdf96113.odt")
CPPUNIT_ASSERT_EQUAL(sal_Int32(0x00ff00), getProperty<sal_Int32>(getShape(1), "BackColor"));
}
+DECLARE_ODFIMPORT_TEST(testI61225, "i61225.sxw")
+{
+ // Part of ooo61225-1.sxw from crashtesting.
+
+ // This never returned.
+ calcLayout();
+}
+
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/layout/findfrm.cxx b/sw/source/core/layout/findfrm.cxx
index fb5854a80c9c..3ad50a012d13 100644
--- a/sw/source/core/layout/findfrm.cxx
+++ b/sw/source/core/layout/findfrm.cxx
@@ -1257,10 +1257,15 @@ void SwFrame::InvalidateNextPrtArea()
/// but not if it sits in a table which itself sits in a section.
static bool lcl_IsInSectionDirectly( const SwFrame *pUp )
{
+ bool bSeenColumn = false;
+
while( pUp )
{
- if( pUp->IsSctFrame() )
- return true;
+ if( pUp->IsColumnFrame() )
+ bSeenColumn = true;
+ else if( pUp->IsSctFrame() )
+ // Allow move of frame in case our only column is not growable.
+ return bSeenColumn || !static_cast<const SwSectionFrame*>(pUp)->Growable();
else if( pUp->IsTabFrame() )
return false;
pUp = pUp->GetUpper();