[Libreoffice-commits] core.git: sfx2/source sw/qa sw/source

Miklos Vajna (via logerrit) logerrit at kemper.freedesktop.org
Thu Nov 19 00:38:40 UTC 2020


 sfx2/source/view/sfxbasecontroller.cxx                    |   12 +++++-
 sw/qa/uibase/uiview/data/update-replacement-nosetting.odt |binary
 sw/qa/uibase/uiview/uiview.cxx                            |   25 ++++++++++++++
 sw/source/uibase/uiview/view.cxx                          |    2 -
 4 files changed, 34 insertions(+), 5 deletions(-)

New commits:
commit 693f12ad57912c2356a197d9a794e6108ce79ef2
Author:     Miklos Vajna <vmiklos at collabora.com>
AuthorDate: Wed Nov 18 17:55:13 2020 +0100
Commit:     Miklos Vajna <vmiklos at collabora.com>
CommitDate: Thu Nov 19 01:37:50 2020 +0100

    sw replacement image creation: fix this when an ODT's settings.xml is invalid
    
    This builds on top of commit c123bfff501229f398a1b679fc7434b82d53685c
    (Bin overly eager early return that stops replacement image creation,
    2020-08-20), and handles a similar case, when
    SwView::ReadUserDataSequence() is not called at all.
    
    The result is the same: no shell is selected on the command dispatcher
    stack, so .uno:UpdateAll is ignored and the replacement images are not
    created.
    
    Change-Id: If8b74424b0ad88e63129fd8f7efd09f85e300895
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106068
    Reviewed-by: Miklos Vajna <vmiklos at collabora.com>
    Tested-by: Jenkins

diff --git a/sfx2/source/view/sfxbasecontroller.cxx b/sfx2/source/view/sfxbasecontroller.cxx
index cecf046bfbe9..23b1aad5c3d0 100644
--- a/sfx2/source/view/sfxbasecontroller.cxx
+++ b/sfx2/source/view/sfxbasecontroller.cxx
@@ -1334,12 +1334,18 @@ void SfxBaseController::ConnectSfxFrame_Impl( const ConnectSfxFrame i_eConnect )
                             break;
                         }
                     }
-                    if ( nViewDataIndex < nCount )
+                    if (nViewDataIndex < nCount || !xViewData.is())
                     {
                         Sequence< PropertyValue > aViewData;
-                        OSL_VERIFY( xViewData->getByIndex( nViewDataIndex ) >>= aViewData );
-                        if ( aViewData.hasElements() )
+                        if (xViewData.is())
+                        {
+                            OSL_VERIFY(xViewData->getByIndex(nViewDataIndex) >>= aViewData);
+                        }
+                        if (aViewData.hasElements() || !xViewData.is())
+                        {
+                            // Tolerate empty xViewData, ReadUserDataSequence() has side effects.
                             m_pData->m_pViewShell->ReadUserDataSequence( aViewData );
+                        }
                     }
                 }
                 catch (const Exception&)
diff --git a/sw/qa/uibase/uiview/data/update-replacement-nosetting.odt b/sw/qa/uibase/uiview/data/update-replacement-nosetting.odt
new file mode 100644
index 000000000000..055c3d1a2c2a
Binary files /dev/null and b/sw/qa/uibase/uiview/data/update-replacement-nosetting.odt differ
diff --git a/sw/qa/uibase/uiview/uiview.cxx b/sw/qa/uibase/uiview/uiview.cxx
index 8827cea10752..4d622aafaa5f 100644
--- a/sw/qa/uibase/uiview/uiview.cxx
+++ b/sw/qa/uibase/uiview/uiview.cxx
@@ -12,6 +12,7 @@
 #include <unotools/mediadescriptor.hxx>
 #include <comphelper/processfactory.hxx>
 #include <osl/file.hxx>
+#include <comphelper/propertyvalue.hxx>
 
 #include <com/sun/star/frame/DispatchHelper.hpp>
 #include <com/sun/star/frame/XComponentLoader.hpp>
@@ -87,6 +88,30 @@ CPPUNIT_TEST_FIXTURE(SwUibaseUiviewTest, testUpdateAllObjectReplacements)
     CPPUNIT_ASSERT(xNameAccess->hasByName("ObjectReplacements/Components_1"));
 }
 
+CPPUNIT_TEST_FIXTURE(SwUibaseUiviewTest, testUpdateReplacementNosetting)
+{
+    // Load a copy of the document in hidden mode.
+    OUString aSourceURL
+        = m_directories.getURLFromSrc(DATA_DIRECTORY) + "update-replacement-nosetting.odt";
+    CPPUNIT_ASSERT_EQUAL(osl::FileBase::E_None, osl::File::copy(aSourceURL, maTempFile.GetURL()));
+    mxComponent = loadFromDesktop(maTempFile.GetURL(), "com.sun.star.text.TextDocument",
+                                  { comphelper::makePropertyValue("Hidden", true) });
+
+    // Update "everything" (including object replacements) and save it.
+    dispatchCommand(mxComponent, ".uno:UpdateAll", {});
+    uno::Reference<frame::XStorable2> xStorable(mxComponent, uno::UNO_QUERY);
+    xStorable->storeSelf({});
+
+    // Check the contents of the updated copy.
+    uno::Reference<uno::XComponentContext> xContext = comphelper::getProcessComponentContext();
+    uno::Reference<packages::zip::XZipFileAccess2> xNameAccess
+        = packages::zip::ZipFileAccess::createWithURL(xContext, maTempFile.GetURL());
+
+    // Without the accompanying fix in place, this test would have failed, because the embedded
+    // object replacement image was not generated.
+    CPPUNIT_ASSERT(xNameAccess->hasByName("ObjectReplacements/Components"));
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/uiview/view.cxx b/sw/source/uibase/uiview/view.cxx
index 2b5670cffc11..0e12a868f88d 100644
--- a/sw/source/uibase/uiview/view.cxx
+++ b/sw/source/uibase/uiview/view.cxx
@@ -1283,8 +1283,6 @@ void SwView::ReadUserDataSequence ( const uno::Sequence < beans::PropertyValue >
     if(GetDocShell()->IsPreview()||m_bIsPreviewDoubleClick)
         return;
     bool bIsOwnDocument = lcl_IsOwnDocument( *this );
-    if (!rSequence.hasElements())
-        return;
 
     CurrShell aCurr(m_pWrtShell.get());
     const SwRect& rRect = m_pWrtShell->GetCharRect();


More information about the Libreoffice-commits mailing list