sw/qa/extras/uiwriter/data2/ole-save-while-edit.odt |binary sw/qa/extras/uiwriter/uiwriter2.cxx | 36 ++++++++++++++++++++ sw/source/uibase/app/docsh.cxx | 8 ++++ 3 files changed, 44 insertions(+)
New commits: commit d33cc4f7edc2ce21a9c5a01a7f5e85cfd324c6d9 Author: Miklos Vajna <[email protected]> AuthorDate: Thu Jul 18 18:03:54 2019 +0200 Commit: Miklos Vajna <[email protected]> CommitDate: Fri Jul 19 02:10:03 2019 +0200 sw: fix missing OLE preview for actively edited OLE object on save Regression from commit 74844277cc2194c9e43f5bd7a6f78a9603da32f3 (disable generation of ole previews in ODF format until after load, 2016-09-13), if the user started an OLE edit in a Writer document, and saved without ending the OLE edit, then svt::EmbeddedObjectRef::UpdateReplacementOnDemand() removed the old replacement image, but no new one was created. Given that save is always an explicit user action (auto-save does not kick in for unmodified documents), restore the permission to update OLE replacement images during save. Do this check in SwDocShell::CalcLayoutForOLEObjects(), as that's OLE-related and is called from all the relevant save code paths (save, save-as, convert to alien formats). Change-Id: Idaad43909cd744a379e713efd70ffd000e2692bc Reviewed-on: https://gerrit.libreoffice.org/75867 Reviewed-by: Miklos Vajna <[email protected]> Tested-by: Jenkins diff --git a/sw/qa/extras/uiwriter/data2/ole-save-while-edit.odt b/sw/qa/extras/uiwriter/data2/ole-save-while-edit.odt new file mode 100644 index 000000000000..33a2284dd314 Binary files /dev/null and b/sw/qa/extras/uiwriter/data2/ole-save-while-edit.odt differ diff --git a/sw/qa/extras/uiwriter/uiwriter2.cxx b/sw/qa/extras/uiwriter/uiwriter2.cxx index 2c9e4e91f610..b48dfdf40dd4 100644 --- a/sw/qa/extras/uiwriter/uiwriter2.cxx +++ b/sw/qa/extras/uiwriter/uiwriter2.cxx @@ -37,6 +37,7 @@ #include <sfx2/dispatch.hxx> #include <svl/stritem.hxx> #include <svx/svxids.hrc> +#include <comphelper/lok.hxx> #include <txtfrm.hxx> #include <redline.hxx> #include <view.hxx> @@ -2004,4 +2005,39 @@ CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testDateFormFieldCurrentDateInvalidation) } #endif +CPPUNIT_TEST_FIXTURE(SwUiWriterTest2, testOleSaveWhileEdit) +{ + // Enable LOK mode, otherwise OCommonEmbeddedObject::SwitchStateTo_Impl() will throw when it + // finds out that the test runs headless. + comphelper::LibreOfficeKit::setActive(); + + // Load a document with a Draw doc in it. + SwDoc* pDoc = createDoc("ole-save-while-edit.odt"); + SwWrtShell* pWrtShell = pDoc->GetDocShell()->GetWrtShell(); + pWrtShell->GotoObj(/*bNext=*/true, GotoObjFlags::Any); + + // Select the frame and switch to the frame shell. + SwView* pView = pDoc->GetDocShell()->GetView(); + pView->StopShellTimer(); + + // Start editing the OLE object. + pWrtShell->LaunchOLEObj(); + + // Save the document without existing the OLE edit. + uno::Reference<frame::XStorable> xStorable(mxComponent, uno::UNO_QUERY); + xStorable->storeToURL(maTempFile.GetURL(), {}); + + uno::Reference<packages::zip::XZipFileAccess2> xNameAccess + = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), + maTempFile.GetURL()); + // Without the accompanying fix in place, this test would have failed: the OLE object lost its + // replacement on save if the edit was active while saving. + CPPUNIT_ASSERT(xNameAccess->hasByName("ObjectReplacements/Object 1")); + + // Dispose the document while LOK is still active to avoid leaks. + mxComponent->dispose(); + mxComponent.clear(); + comphelper::LibreOfficeKit::setActive(false); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/uibase/app/docsh.cxx b/sw/source/uibase/app/docsh.cxx index 229decaf2a9c..b6c0df359aa8 100644 --- a/sw/source/uibase/app/docsh.cxx +++ b/sw/source/uibase/app/docsh.cxx @@ -1276,6 +1276,14 @@ void SwDocShell::CalcLayoutForOLEObjects() if (!m_pWrtShell) return; + if (m_pView && m_pView->GetIPClient()) + { + // We have an active OLE edit: allow link updates, so an up to date replacement graphic can + // be created. + comphelper::EmbeddedObjectContainer& rEmbeddedObjectContainer = getEmbeddedObjectContainer(); + rEmbeddedObjectContainer.setUserAllowsLinkUpdate(true); + } + SwIterator<SwContentNode,SwFormatColl> aIter( *m_xDoc->GetDfltGrfFormatColl() ); for( SwContentNode* pNd = aIter.First(); pNd; pNd = aIter.Next() ) { _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
