diff --git a/sw/qa/extras/uiwriter/data2/try2.fodt b/sw/qa/extras/uiwriter/data2/try2.fodt new file mode 100644 index 000000000000..624a75a85ea9 --- /dev/null +++ b/sw/qa/extras/uiwriter/data2/try2.fodt @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Unknown Author + 2020-10-12T19:26:19 + + + + + + + Unknown Author + 2020-10-12T19:26:26 + + + + + A + xxxxxxxxxxxxxxxxxxx + yy + + + diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx b/sw/qa/extras/uiwriter/uiwriter2.cxx index 334698e7c693..25015b50e3c5 100644 --- a/sw/qa/extras/uiwriter/uiwriter2.cxx +++ b/sw/qa/extras/uiwriter/uiwriter2.cxx @@ -305,6 +305,48 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testRedlineInHiddenSection) CPPUNIT_ASSERT(pNode->GetNodes()[pNode->GetIndex() + 4]->IsEndNode()); } +CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testRedlineSplitContentNode) +{ + load(DATA_DIRECTORY, "try2.fodt"); + SwXTextDocument* pTextDoc = dynamic_cast(mxComponent.get()); + SwWrtShell* const pWrtShell = pTextDoc->GetDocShell()->GetWrtShell(); + + SwViewOption aViewOptions(*pWrtShell->GetViewOptions()); + // these are required so that IsBlank() is true + aViewOptions.SetBlank(true); + aViewOptions.SetViewMetaChars(true); + pWrtShell->ApplyViewOptions(aViewOptions); + + // enable redlining + dispatchCommand(mxComponent, ".uno:TrackChanges", {}); + // hide + dispatchCommand(mxComponent, ".uno:ShowTrackedChanges", {}); + + SwDocShell* const pDocShell = pTextDoc->GetDocShell(); + SwDoc* const pDoc = pDocShell->GetDoc(); + CPPUNIT_ASSERT_MESSAGE("redlining should be on", + pDoc->getIDocumentRedlineAccess().IsRedlineOn()); + CPPUNIT_ASSERT_MESSAGE( + "redlines should be visible", + IDocumentRedlineAccess::IsShowChanges(pDoc->getIDocumentRedlineAccess().GetRedlineFlags())); + + sw::UndoManager& rUndoManager = pDoc->GetUndoManager(); + + pWrtShell->CalcLayout(); + pWrtShell->Right(CRSR_SKIP_CHARS, /*bSelect=*/false, 18, /*bBasicCall=*/false); + pWrtShell->SplitNode(true); + rUndoManager.Undo(); + // crashed + pWrtShell->SplitNode(true); + rUndoManager.Undo(); + rUndoManager.Redo(); + rUndoManager.Undo(); + rUndoManager.Redo(); + rUndoManager.Undo(); + pWrtShell->SplitNode(true); + rUndoManager.Undo(); +} + CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testTdf132236) { load(DATA_DIRECTORY, "tdf132236.odt"); diff --git a/sw/source/core/text/txtfrm.cxx b/sw/source/core/text/txtfrm.cxx index 0178f275e540..ed04a3e42c47 100644 --- a/sw/source/core/text/txtfrm.cxx +++ b/sw/source/core/text/txtfrm.cxx @@ -1906,7 +1906,6 @@ void UpdateMergedParaForMove(sw::MergedPara & rMerged, } if (nLastEnd != rNode.Len()) // without nLen, string yet to be removed { - assert(rNode.Len() == 0 || nLastEnd < nSourceEnd); if (nLastEnd < nSourceEnd) { deleted.emplace_back(std::max(nLastEnd, nSourceStart), nSourceEnd); diff --git a/sw/source/core/txtnode/ndtxt.cxx b/sw/source/core/txtnode/ndtxt.cxx index f62ca8ea33ff..00032f256242 100644 --- a/sw/source/core/txtnode/ndtxt.cxx +++ b/sw/source/core/txtnode/ndtxt.cxx @@ -447,9 +447,7 @@ SwTextNode *SwTextNode::SplitContentNode(const SwPosition & rPos, { // optimization for SplitNode: If a split is at the end of a node then // move the frames from the current to the new one and create new ones - // for the current one. As a result, no need for recreating the layout. - - LockModify(); // disable notifications + // for the current one. // If fly frames are moved, they don't need to destroy their layout // frames. Set a flag that is checked in SwTextFlyCnt::SetAnchor. @@ -557,28 +555,6 @@ SwTextNode *SwTextNode::SplitContentNode(const SwPosition & rPos, SetInCache( false ); } - UnlockModify(); // enable notify again - - // If there is an accessible layout we must call modify even - // with length zero, because we have to notify about the changed - // text node. - const SwRootFrame *pRootFrame; - if ( (nTextLen != nSplitPos) || - ( (pRootFrame = pNode->GetDoc().getIDocumentLayoutAccess().GetCurrentLayout()) != nullptr && - pRootFrame->IsAnyShellAccessible() ) ) - { - // tell the frames that something was "deleted" at the end - if( 1 == nTextLen - nSplitPos ) - { - SwDelChr aHint( nSplitPos ); - pNode->NotifyClients( nullptr, &aHint ); - } - else - { - SwDelText aHint( nSplitPos, nTextLen - nSplitPos ); - pNode->NotifyClients( nullptr, &aHint ); - } - } if ( HasHints() ) { MoveTextAttr_To_AttrSet();