diff options
author | Attila Bakos (NISZ) <bakos.attilakaroly@nisz.hu> | 2020-10-15 16:45:15 +0200 |
---|---|---|
committer | László Németh <nemeth@numbertext.org> | 2020-10-28 19:09:50 +0100 |
commit | 056933bc55608d0ca061539ae124d7b9386cdb62 (patch) | |
tree | 030633bc052279d3df3d3c68600181499a0b2c86 /sw | |
parent | 2048a5afc9b1c6340cea594c4ead75914b358e74 (diff) |
tdf#137802 sw: fix crash on deleting last paragraph
if the last paragraph of document had a text box
anchored to.
Change-Id: Ibe29a0f37d06223c31f3add0c194e4414f65d5ac
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/104379
Tested-by: László Németh <nemeth@numbertext.org>
Reviewed-by: László Németh <nemeth@numbertext.org>
Diffstat (limited to 'sw')
-rwxr-xr-x | sw/qa/extras/uiwriter/data3/txbx_crash.odt | bin | 0 -> 9369 bytes | |||
-rw-r--r-- | sw/qa/extras/uiwriter/uiwriter3.cxx | 31 | ||||
-rw-r--r-- | sw/source/core/doc/textboxhelper.cxx | 7 |
3 files changed, 37 insertions, 1 deletions
diff --git a/sw/qa/extras/uiwriter/data3/txbx_crash.odt b/sw/qa/extras/uiwriter/data3/txbx_crash.odt Binary files differnew file mode 100755 index 000000000000..0a029da88289 --- /dev/null +++ b/sw/qa/extras/uiwriter/data3/txbx_crash.odt diff --git a/sw/qa/extras/uiwriter/uiwriter3.cxx b/sw/qa/extras/uiwriter/uiwriter3.cxx index a19ceff4c6b2..477652a6369e 100644 --- a/sw/qa/extras/uiwriter/uiwriter3.cxx +++ b/sw/qa/extras/uiwriter/uiwriter3.cxx @@ -1391,6 +1391,37 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf121031) assertXPath(pXmlDoc, "/root/page[1]/body/tab", 1); } +CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, TestTextBoxCrashAfterLineDel) +{ + // Open the desired file + load(DATA_DIRECTORY, "txbx_crash.odt"); + SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument*>(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + + // Get the Writer shell + SwWrtShell* pWrtSh = pTextDoc->GetDocShell()->GetWrtShell(); + CPPUNIT_ASSERT(pWrtSh); + + // Get the format of the shape + const SwFrameFormats& rFrmFormats = *pWrtSh->GetDoc()->GetSpzFrameFormats(); + CPPUNIT_ASSERT(rFrmFormats.size() >= size_t(o3tl::make_unsigned(1))); + SwFrameFormat* pShape = rFrmFormats.front(); + CPPUNIT_ASSERT(pShape); + + // Add a textbox + SwTextBoxHelper::create(pShape); + SwFrameFormat* pTxBxFrm = SwTextBoxHelper::getOtherTextBoxFormat(getShape(1)); + CPPUNIT_ASSERT(pTxBxFrm); + + // remove the last paragraph + auto xCursor = getParagraph(1)->getText()->createTextCursor(); + xCursor->gotoEnd(false); + xCursor->goLeft(3, true); + + // This caused crash before, now it should pass with the patch. + xCursor->setString(OUString()); +} + CPPUNIT_TEST_FIXTURE(SwUiWriterTest3, testTdf96067) { mxComponent = loadFromDesktop("private:factory/swriter", "com.sun.star.text.TextDocument"); diff --git a/sw/source/core/doc/textboxhelper.cxx b/sw/source/core/doc/textboxhelper.cxx index 94f43c61af02..e5b7f82dc94b 100644 --- a/sw/source/core/doc/textboxhelper.cxx +++ b/sw/source/core/doc/textboxhelper.cxx @@ -73,7 +73,12 @@ void SwTextBoxHelper::create(SwFrameFormat* pShape) } catch (uno::Exception&) { - xTextContentAppend->appendTextContent(xTextFrame, uno::Sequence<beans::PropertyValue>()); + // Before the textframe was appended now it is inserted to the begin of the doc in order + // to prevent crash when someone removes the para where the textframe anchored: + uno::Reference<text::XTextCursor> xCursor = xTextDocument->getText()->createTextCursor(); + xCursor->gotoStart(false); + xTextContentAppend->insertTextContentWithProperties( + xTextFrame, uno::Sequence<beans::PropertyValue>(), xCursor->getStart()); } // Link FLY and DRAW formats, so it becomes a text box (needed for syncProperty calls). uno::Reference<text::XTextFrame> xRealTextFrame(xTextFrame, uno::UNO_QUERY); |