sw/CppunitTest_sw_globalfilter.mk | 36 ------------------ sw/qa/extras/globalfilter/globalfilter.cxx | 56 +++++++++++++++++++++++++++++ sw/source/filter/basflt/shellio.cxx | 3 - sw/source/filter/ww8/wrtww8.cxx | 10 +++++ 4 files changed, 67 insertions(+), 38 deletions(-)
New commits: commit a59c4e26abbdd0720d24d3ddc0d6a05a67a31aaf Author: Michael Stahl <mst...@redhat.com> Date: Wed Jun 8 12:31:06 2016 +0200 tdf#97103 sw: fix restoring of SetRedlineMode on DOCX/RTF export In order to prevent ~SwIndexReg asserts, this was changed to restore the redline mode not in MSWordExportBase::ExportDocument() but in SwWriter::Write(). Unfortunately only the DOC export actually uses SwWriter::Write(), so fix the original problem differently by moving the cursors onto a EndNode. The m_pCurPam will be deleted anyway, and the m_pOrigPam usually also will be, and in the case it isn't deleted i hope it's not important :) (regression from 0b037361b890a83a735186b98d5a3cef124027f4) Change-Id: Ib3d0cc32862256fdc4363b6035c190cbbcfe5df3 diff --git a/sw/CppunitTest_sw_globalfilter.mk b/sw/CppunitTest_sw_globalfilter.mk index 6650266..8c48b49 100644 --- a/sw/CppunitTest_sw_globalfilter.mk +++ b/sw/CppunitTest_sw_globalfilter.mk @@ -50,41 +50,7 @@ $(eval $(call gb_CppunitTest_use_api,sw_globalfilter,\ $(eval $(call gb_CppunitTest_use_ure,sw_globalfilter)) $(eval $(call gb_CppunitTest_use_vcl,sw_globalfilter)) -$(eval $(call gb_CppunitTest_use_components,sw_globalfilter,\ - basic/util/sb \ - comphelper/util/comphelp \ - configmgr/source/configmgr \ - dbaccess/util/dba \ - drawinglayer/drawinglayer \ - embeddedobj/util/embobj \ - filter/source/config/cache/filterconfig1 \ - filter/source/storagefilterdetect/storagefd \ - filter/source/textfilterdetect/textfd \ - forms/util/frm \ - framework/util/fwk \ - i18npool/util/i18npool \ - linguistic/source/lng \ - oox/util/oox \ - package/source/xstor/xstor \ - package/util/package2 \ - sax/source/expatwrap/expwrap \ - sfx2/util/sfx \ - svl/source/fsstor/fsstorage \ - svtools/util/svt \ - sw/util/msword \ - sw/util/sw \ - sw/util/swd \ - toolkit/util/tk \ - ucb/source/core/ucb1 \ - ucb/source/ucp/file/ucpfile1 \ - unotools/util/utl \ - unoxml/source/rdf/unordf \ - unoxml/source/service/unoxml \ - uui/util/uui \ - $(if $(filter DESKTOP,$(BUILD_TYPE)),xmlhelp/util/ucpchelp1) \ - writerfilter/util/writerfilter \ - xmloff/util/xo \ -)) +$(eval $(call gb_CppunitTest_use_rdb,sw_globalfilter,services)) $(eval $(call gb_CppunitTest_use_custom_headers,sw_globalfilter,\ officecfg/registry \ diff --git a/sw/qa/extras/globalfilter/globalfilter.cxx b/sw/qa/extras/globalfilter/globalfilter.cxx index 9ce7d1e..5425450 100644 --- a/sw/qa/extras/globalfilter/globalfilter.cxx +++ b/sw/qa/extras/globalfilter/globalfilter.cxx @@ -15,6 +15,8 @@ #include <comphelper/processfactory.hxx> #include <unotxdoc.hxx> #include <docsh.hxx> +#include <IDocumentRedlineAccess.hxx> +#include <IDocumentContentOperations.hxx> #include <doc.hxx> #include <ndgrf.hxx> #include <drawdoc.hxx> @@ -37,6 +39,7 @@ public: #if !defined(_WIN32) void testSkipImages(); #endif + void testRedlineMode(); CPPUNIT_TEST_SUITE(Test); CPPUNIT_TEST(testSwappedOutImageExport); @@ -50,6 +53,7 @@ public: #if !defined(_WIN32) CPPUNIT_TEST(testSkipImages); #endif + CPPUNIT_TEST(testRedlineMode); CPPUNIT_TEST_SUITE_END(); }; @@ -817,6 +821,58 @@ void Test::testSkipImages() } #endif +void Test::testRedlineMode() +{ + const char* aFilterNames[] = { + "writer8", + "Rich Text Format", + "MS Word 97", + "Office Open XML Text", + }; + + mxComponent = loadFromDesktop("private:factory/swriter", "com.sun.star.text.TextDocument"); + SwXTextDocument* pTextDoc = dynamic_cast<SwXTextDocument *>(mxComponent.get()); + CPPUNIT_ASSERT(pTextDoc); + SwDoc* pDoc = pTextDoc->GetDocShell()->GetDoc(); + + SwPaM pam(SwPosition(SwNodeIndex(pDoc->GetNodes().GetEndOfContent(), -1))); + pDoc->getIDocumentContentOperations().InsertString(pam, "foo bar baz"); + + IDocumentRedlineAccess & rIDRA(pDoc->getIDocumentRedlineAccess()); + // enable change tracking + rIDRA.SetRedlineMode(rIDRA.GetRedlineMode() + | nsRedlineMode_t::REDLINE_ON | nsRedlineMode_t::REDLINE_SHOW_DELETE); + + // need a delete redline to trigger mode switching + pam.Move(fnMoveForward, fnGoDoc); + pam.SetMark(); + pam.Move(fnMoveBackward, fnGoDoc); + pDoc->getIDocumentContentOperations().DeleteAndJoin(pam); + + // hide delete redlines + RedlineMode_t const nRedlineMode = + rIDRA.GetRedlineMode() & ~nsRedlineMode_t::REDLINE_SHOW_DELETE; + rIDRA.SetRedlineMode(nRedlineMode); + + for (size_t nFilter = 0; nFilter < SAL_N_ELEMENTS(aFilterNames); ++nFilter) + { + // export the document + uno::Reference<frame::XStorable> xStorable(mxComponent, uno::UNO_QUERY); + + utl::MediaDescriptor aMediaDescriptor; + aMediaDescriptor["FilterName"] <<= OUString::createFromAscii(aFilterNames[nFilter]); + utl::TempFile aTempFile; + aTempFile.EnableKillingFile(); + xStorable->storeToURL(aTempFile.GetURL(), + aMediaDescriptor.getAsConstPropertyValueList()); + + // tdf#97103 check that redline mode is properly restored + CPPUNIT_ASSERT_EQUAL_MESSAGE( + OString(OString("redline mode not restored in ") + aFilterNames[nFilter]).getStr(), + nRedlineMode, rIDRA.GetRedlineMode()); + } +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/source/filter/basflt/shellio.cxx b/sw/source/filter/basflt/shellio.cxx index d0a5429..0961d77 100644 --- a/sw/source/filter/basflt/shellio.cxx +++ b/sw/source/filter/basflt/shellio.cxx @@ -858,7 +858,6 @@ sal_uLong SwWriter::Write( WriterRef& rxWriter, const OUString* pRealFileName ) const bool bOrigPurgeOle = pOutDoc->getIDocumentSettingAccess().get(DocumentSettingId::PURGE_OLE); pOutDoc->getIDocumentSettingAccess().set(DocumentSettingId::PURGE_OLE, false); - const RedlineMode_t nOrigRedlineMode = pOutDoc->getIDocumentRedlineAccess().GetRedlineMode(); sal_uLong nError = 0; if( pMedium ) @@ -888,12 +887,10 @@ sal_uLong SwWriter::Write( WriterRef& rxWriter, const OUString* pRealFileName ) else delete pPam; } - pOutDoc->getIDocumentRedlineAccess().SetRedlineMode(nOrigRedlineMode); } else { delete pPam; // delete the created Pam - pOutDoc->getIDocumentRedlineAccess().SetRedlineMode(nOrigRedlineMode); // Everything was written successfully? Tell the document! if ( !IsError( nError ) && !pDoc ) { diff --git a/sw/source/filter/ww8/wrtww8.cxx b/sw/source/filter/ww8/wrtww8.cxx index d1c073d..bf92ed1 100644 --- a/sw/source/filter/ww8/wrtww8.cxx +++ b/sw/source/filter/ww8/wrtww8.cxx @@ -3134,6 +3134,16 @@ void MSWordExportBase::ExportDocument( bool bWriteAll ) m_pDoc->getIDocumentDrawModelAccess().GetDrawModel()->GetPage( 0 )->RecalcObjOrdNums(); ExportDocument_Impl(); + + // park m_pCurPam in a "safe place" now that document is fully exported + // before toggling redline mode to avoid ~SwIndexReg assert e.g. export + // ooo103014-1.odt to .doc + // park m_pOrigPam as well, as needed for exporting abi9915-1.odt to doc + m_pOrigPam->DeleteMark(); + *m_pOrigPam->GetPoint() = SwPosition(m_pDoc->GetNodes().GetEndOfContent()); + *m_pCurPam = *m_pOrigPam; + + m_pDoc->getIDocumentRedlineAccess().SetRedlineMode(m_nOrigRedlineMode); } bool SwWW8Writer::InitStd97CodecUpdateMedium( ::msfilter::MSCodec_Std97& rCodec ) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits