tdf#114306: Revert commits fixing this issue ( 6.1 only )

Revert "tdf#114306 fix crash caused by special document 2"

This reverts commit d30eefb677b446886f7b5bab6de93d489ba63529.

Revert "tdf#114306 fix crash caused by special document"

This reverts commit e4400f4c4e267f8528df3a7d5a09623c888bd10c.

Revert "tdf#114306 fix unexpected page break in row-spanned table"

This reverts commit 18765b9fa739337d2d891513f6e2fb7c3ce23b50

Change-Id: Ifff799616f12ee428a3f923f6510b20059f5bc71
Reviewed-on: https://gerrit.libreoffice.org/69848
Tested-by: Jenkins
Reviewed-by: Michael Stahl <Michael.Stahl@cib.de>
diff --git a/sw/qa/extras/uiwriter/data/fdo114306.odt b/sw/qa/extras/uiwriter/data/fdo114306.odt
deleted file mode 100755
index 5a7d2f9..0000000
--- a/sw/qa/extras/uiwriter/data/fdo114306.odt
+++ /dev/null
Binary files differ
diff --git a/sw/qa/extras/uiwriter/data/fdo114306_2.odt b/sw/qa/extras/uiwriter/data/fdo114306_2.odt
deleted file mode 100755
index b4bebc5..0000000
--- a/sw/qa/extras/uiwriter/data/fdo114306_2.odt
+++ /dev/null
Binary files differ
diff --git a/sw/qa/extras/uiwriter/uiwriter.cxx b/sw/qa/extras/uiwriter/uiwriter.cxx
index 6d1f2c5..8d0e194 100755
--- a/sw/qa/extras/uiwriter/uiwriter.cxx
+++ b/sw/qa/extras/uiwriter/uiwriter.cxx
@@ -332,8 +332,6 @@
    void testTdf112448();
    void testTdf113790();
    void testTdf108048();
    void testTdf114306();
    void testTdf114306_2();
    void testTdf113481();
    void testTdf115013();
    void testTdf114536();
@@ -528,8 +526,6 @@
    CPPUNIT_TEST(testTdf112448);
    CPPUNIT_TEST(testTdf113790);
    CPPUNIT_TEST(testTdf108048);
    CPPUNIT_TEST(testTdf114306);
    CPPUNIT_TEST(testTdf114306_2);
    CPPUNIT_TEST(testTdf113481);
    CPPUNIT_TEST(testTdf115013);
    CPPUNIT_TEST(testTdf114536);
@@ -5482,30 +5478,6 @@
    CPPUNIT_ASSERT_EQUAL(OUString("Liberation Sans"), getProperty<OUString>(xRun4, "CharFontName"));
}

void SwUiWriterTest::testTdf114306()
{
    load(DATA_DIRECTORY, "fdo114306.odt");
    xmlDocPtr pXmlDoc = parseLayoutDump();

    // There are 2 long paragraphs in cell A1.
    // A part of paragraph 2 should flow over to the second page but
    // *not* the whole paragraph. There should be 2 paragraphs on
    // page 1 and 1 paragraph on page 2.
    assertXPath(pXmlDoc, "/root/page[1]/body/tab[1]/row[1]/cell[1]/txt", 2);
    assertXPath(pXmlDoc, "/root/page[2]/body/tab[1]/row[1]/cell[1]/txt", 1);
}

void SwUiWriterTest::testTdf114306_2()
{
    // tdf#114306 fix unexpected page break in row-spanned table
    // load regression document without writer crash
    load(DATA_DIRECTORY, "fdo114306_2.odt");

    // correct number of pages
    CPPUNIT_ASSERT_EQUAL(4, getPages());
}


// During insert of the document with list inside into the main document inside the list
// we should merge both lists into one, when they have the same list properties
void SwUiWriterTest::testTdf113877()
diff --git a/sw/source/core/layout/findfrm.cxx b/sw/source/core/layout/findfrm.cxx
index b720d99..c327ebf 100644
--- a/sw/source/core/layout/findfrm.cxx
+++ b/sw/source/core/layout/findfrm.cxx
@@ -1340,14 +1340,8 @@
                  _pLayoutFrame->IsInDocBody() ||
                  _pLayoutFrame->IsInFootnote() )
        {
            // If IsMovable() is called before a MoveFwd() the method
            // may return false if there is no NextCellLeaf. If
            // IsMovable() is called before a MoveBwd() the method may
            // return false if there is no PrevCellLeaf.
            if ( _pLayoutFrame->IsInTab() && !IsTabFrame() &&
                 ( !IsContentFrame() || (!const_cast<SwFrame*>(this)->GetNextCellLeaf()
                                      && !const_cast<SwFrame*>(this)->GetPrevCellLeaf()) )
                )
                 ( !IsContentFrame() || !const_cast<SwFrame*>(this)->GetNextCellLeaf() ) )
            {
                bRetVal = false;
            }
diff --git a/sw/source/core/layout/flowfrm.cxx b/sw/source/core/layout/flowfrm.cxx
index 4366c98..34a3258e6 100644
--- a/sw/source/core/layout/flowfrm.cxx
+++ b/sw/source/core/layout/flowfrm.cxx
@@ -2041,19 +2041,14 @@
        const SwLayoutFrame* pUpperFrame = m_rThis.GetUpper();
        while ( pUpperFrame )
        {
            if ( pUpperFrame->IsTabFrame() || pUpperFrame->IsRowFrame() )
            if ( pUpperFrame->IsTabFrame() )
            {
                return false;
            }
            // If the text frame is a follow-section-in-table, that can move
            // backward as well.
            bool bIsFollowSection = pUpperFrame->IsSctFrame() && static_cast<const SwSectionFrame*>(pUpperFrame)->GetPrecede();

            // If the text frame is a follow-in-table, that can move
            // backward as well.
            bool bIsFollow = const_cast<SwLayoutFrame*>(pUpperFrame)->GetPrevCellLeaf();

            if ( ( pUpperFrame->IsColumnFrame() && pUpperFrame->IsInSct() ) || bIsFollowSection || bIsFollow )
            if ( ( pUpperFrame->IsColumnFrame() && pUpperFrame->IsInSct() ) || bIsFollowSection )
            {
                break;
            }
diff --git a/sw/source/core/layout/tabfrm.cxx b/sw/source/core/layout/tabfrm.cxx
index 8e3d9b1..d50e821 100644
--- a/sw/source/core/layout/tabfrm.cxx
+++ b/sw/source/core/layout/tabfrm.cxx
@@ -164,7 +164,7 @@
}

void SwInvalidateAll( SwFrame *pFrame, long nBottom );
static bool lcl_RecalcRow( SwRowFrame* pRow, long nBottom );
static void lcl_RecalcRow( SwRowFrame& rRow, long nBottom );
static bool lcl_ArrangeLowers( SwLayoutFrame *pLay, long lYStart, bool bInva );
// #i26945# - add parameter <_bOnlyRowsAndCells> to control
// that only row and cell frames are formatted.
@@ -290,7 +290,7 @@
    }
}

// Local helper function to shrink all lowers of pRow to 0 height
// Local helper function to shrink all lowers of rRow to 0 height
static void lcl_ShrinkCellsAndAllContent( SwRowFrame& rRow )
{
    SwCellFrame* pCurrMasterCell = static_cast<SwCellFrame*>(rRow.Lower());
@@ -682,7 +682,7 @@
    rLastLine.SetInSplit();

    // Do the recalculation
    lcl_RecalcRow( &rLastLine, LONG_MAX );
    lcl_RecalcRow( rLastLine, LONG_MAX );
    // #115759# - force a format of the last line in order to
    // get the correct height.
    rLastLine.InvalidateSize();
@@ -1567,8 +1567,7 @@
    return bRet;
}

// returns false if pRow is invalid
static bool lcl_RecalcRow( SwRowFrame* pRow, long nBottom )
static void lcl_RecalcRow( SwRowFrame& rRow, long nBottom )
{
    // FME 2007-08-30 #i81146# new loop control
    int nLoopControlRuns_1 = 0;
@@ -1582,14 +1581,14 @@
        int nLoopControlRuns_2 = 0;
        sal_uInt16 nLoopControlStage_2 = 0;

        while( lcl_InnerCalcLayout( pRow, nBottom ) )
        while( lcl_InnerCalcLayout( &rRow, nBottom ) )
        {
            if ( ++nLoopControlRuns_2 > nLoopControlMax )
            {
                SAL_WARN_IF(nLoopControlStage_2 == 0, "sw.layout", "LoopControl_2 in lcl_RecalcRow: Stage 1!");
                SAL_WARN_IF(nLoopControlStage_2 == 1, "sw.layout", "LoopControl_2 in lcl_RecalcRow: Stage 2!!");
                SAL_WARN_IF(nLoopControlStage_2 >= 2, "sw.layout", "LoopControl_2 in lcl_RecalcRow: Stage 3!!!");
                pRow->ValidateThisAndAllLowers( nLoopControlStage_2++ );
                rRow.ValidateThisAndAllLowers( nLoopControlStage_2++ );
                nLoopControlRuns_2 = 0;
                if( nLoopControlStage_2 > 2 )
                    break;
@@ -1602,39 +1601,14 @@
        {
            // #115759# - force another format of the
            // lowers, if at least one of it was invalid.

            // tdf#114306 writer may crash because pRow points to a deleted SwRowFrame
            SwRowFrame* pOriginalRow = pRow;
            OSL_ENSURE(pOriginalRow->GetUpper() && pOriginalRow->GetUpper()->IsTabFrame(), "No table");
            SwTabFrame* pOriginalTab = static_cast<SwTabFrame*>(pRow->GetUpper());

            bCheck = SwContentFrame::CalcLowers( pRow, pRow->GetUpper(), nBottom, true );

            bool bRowStillExists = false;
            SwFrame* pTestRow = pOriginalTab->Lower();

            while (pTestRow)
            {
                if (pTestRow == pRow)
                {
                    bRowStillExists = true;
                    break;
                }
                pTestRow = pTestRow->GetNext();
            }

            if (!bRowStillExists)
            {
                SAL_WARN("sw.layout", "no row anymore at " << pRow);
                return false;
            }
            bCheck = SwContentFrame::CalcLowers( &rRow, rRow.GetUpper(), nBottom, true );

            // NEW TABLES
            // First we calculate the cells with row span of < 1, afterwards
            // all cells with row span of > 1:
            for ( int i = 0; i < 2; ++i )
            {
                SwCellFrame* pCellFrame = static_cast<SwCellFrame*>(pRow->Lower());
                SwCellFrame* pCellFrame = static_cast<SwCellFrame*>(rRow.Lower());
                while ( pCellFrame )
                {
                    const bool bCalc = 0 == i ?
@@ -1660,7 +1634,7 @@
                    SAL_WARN_IF(nLoopControlStage_1 == 0, "sw.layout", "LoopControl_1 in lcl_RecalcRow: Stage 1!");
                    SAL_WARN_IF(nLoopControlStage_1 == 1, "sw.layout", "LoopControl_1 in lcl_RecalcRow: Stage 2!!");
                    SAL_WARN_IF(nLoopControlStage_1 >= 2, "sw.layout", "LoopControl_1 in lcl_RecalcRow: Stage 3!!!");
                    pRow->ValidateThisAndAllLowers( nLoopControlStage_1++ );
                    rRow.ValidateThisAndAllLowers( nLoopControlStage_1++ );
                    nLoopControlRuns_1 = 0;
                    if( nLoopControlStage_1 > 2 )
                        break;
@@ -1670,8 +1644,7 @@
            }
        }
        break;
    } while (true);
    return true;
    } while( true );
}

static void lcl_RecalcTable( SwTabFrame& rTab,
@@ -1686,7 +1659,7 @@
            rNotify.SetLowersComplete( true );
        }
        ::SwInvalidatePositions( pFirstRow, LONG_MAX );
        lcl_RecalcRow( static_cast<SwRowFrame*>(pFirstRow), LONG_MAX );
        lcl_RecalcRow( static_cast<SwRowFrame&>(*pFirstRow), LONG_MAX );
    }
}

@@ -2152,7 +2125,7 @@
                            {
                                ::SwInvalidateAll( pLastLine, LONG_MAX );
                                SetRebuildLastLine( true );
                                lcl_RecalcRow( static_cast<SwRowFrame*>(pLastLine), LONG_MAX );
                                lcl_RecalcRow( static_cast<SwRowFrame&>(*pLastLine), LONG_MAX );
                                SetRebuildLastLine( false );
                            }

@@ -2278,7 +2251,7 @@
                }
                else if (m_bONECalcLowers)
                {
                    lcl_RecalcRow( static_cast<SwRowFrame*>(Lower()), LONG_MAX );
                    lcl_RecalcRow( static_cast<SwRowFrame&>(*Lower()), LONG_MAX );
                    m_bONECalcLowers = false;
                }
            }
@@ -2301,7 +2274,7 @@
            }
            else if (m_bONECalcLowers)
            {
                lcl_RecalcRow( static_cast<SwRowFrame*>(Lower()), LONG_MAX );
                lcl_RecalcRow( static_cast<SwRowFrame&>(*Lower()), LONG_MAX );
                m_bONECalcLowers = false;
            }

@@ -2358,7 +2331,7 @@

            // 1. Try: bTryToSplit = true  => Try to split the row.
            // 2. Try: bTryToSplit = false => Split the table between the rows.
            if ((pFirstNonHeadlineRow && pFirstNonHeadlineRow->GetNext()) || bTryToSplit )
            if ( pFirstNonHeadlineRow->GetNext() || bTryToSplit )
            {
                SwTwips nDeadLine = aRectFnSet.GetPrtBottom(*GetUpper());
                if( IsInSct() || GetUpper()->IsInTab() ) // TABLE IN TABLE)
@@ -2367,11 +2340,7 @@

                {
                    SetInRecalcLowerRow( true );
                    SwRowFrame* pRow = static_cast<SwRowFrame*>(Lower());
                    if (!lcl_RecalcRow(pRow, nDeadLine))
                    {
                        pFirstNonHeadlineRow = GetFirstNonHeadlineRow();
                    }
                    ::lcl_RecalcRow( static_cast<SwRowFrame&>(*Lower()), nDeadLine );
                    SetInRecalcLowerRow( false );
                }
                m_bLowersFormatted = true;
@@ -2471,7 +2440,7 @@
                    // to nDeadLine may not be enough.
                    if ( bSplitError && bTryToSplit ) // no restart if we did not try to split: i72847, i79426
                    {
                        lcl_RecalcRow( static_cast<SwRowFrame*>(Lower()), LONG_MAX );
                        lcl_RecalcRow( static_cast<SwRowFrame&>(*Lower()), LONG_MAX );
                        setFrameAreaPositionValid(false);
                        bTryToSplit = false;
                        continue;
@@ -2512,7 +2481,7 @@
                            // its content.
                            const bool bOldJoinLock =  GetFollow()->IsJoinLocked();
                            GetFollow()->LockJoin();
                            ::lcl_RecalcRow( static_cast<SwRowFrame*>(GetFollow()->Lower()),
                            ::lcl_RecalcRow( static_cast<SwRowFrame&>(*GetFollow()->Lower()),
                                             fnRectX.GetBottom(GetFollow()->GetUpper()->getFrameArea()) );
                            // #i43913#
                            // #i63632# Do not unlock the