sd/qa/uitest/impress_tests/data/tdf153161_FlushToSave.odp |binary
 sd/qa/uitest/impress_tests/tdf153161.py                   |   41 ++++++++++++++
 xmloff/source/draw/shapeexport.cxx                        |   12 ++++
 3 files changed, 53 insertions(+)

New commits:
commit cd69836ee9e98a4c6ceaa716da8838ddac842054
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Wed Jan 25 01:37:00 2023 +0300
Commit:     Thorsten Behrens <thorsten.behr...@allotropia.de>
CommitDate: Tue Mar 21 14:57:49 2023 +0000

    tdf#153161: (Ab)use a call to XTextRange::getString to flush edits
    
    Restore the call (without checking its returned value), removed in commit
    d194474aabd699806cb3631bc8641dd0548b8026 ("tdf#151100: xText->getString()
    may be empty for content needing export", 2022-09-22), side effects of
    which obviously allow some object's changes to get flushed and saved.
    
    Change-Id: I62f27cd056c32ad76f79a4862e2f4a0964eaadef
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146106
    Tested-by: Mike Kaganski <mike.kagan...@collabora.com>
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/149142
    Tested-by: Thorsten Behrens <thorsten.behr...@allotropia.de>
    Reviewed-by: Thorsten Behrens <thorsten.behr...@allotropia.de>

diff --git a/sd/qa/uitest/impress_tests/data/tdf153161_FlushToSave.odp 
b/sd/qa/uitest/impress_tests/data/tdf153161_FlushToSave.odp
new file mode 100644
index 000000000000..1fd5c20c2a52
Binary files /dev/null and 
b/sd/qa/uitest/impress_tests/data/tdf153161_FlushToSave.odp differ
diff --git a/sd/qa/uitest/impress_tests/tdf153161.py 
b/sd/qa/uitest/impress_tests/tdf153161.py
new file mode 100644
index 000000000000..23ffdef879d1
--- /dev/null
+++ b/sd/qa/uitest/impress_tests/tdf153161.py
@@ -0,0 +1,41 @@
+# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+from libreoffice.uno.propertyvalue import mkPropertyValues
+from uitest.framework import UITestCase
+import org.libreoffice.unotest
+import pathlib
+
+def get_url_for_data_file(file_name):
+    return 
pathlib.Path(org.libreoffice.unotest.makeCopyFromTDOC(file_name)).as_uri()
+
+class TestTdf153161(UITestCase):
+
+    def testTdf153161(self):
+
+        document = 
self.ui_test.load_file(get_url_for_data_file('tdf153161_FlushToSave.odp'))
+        oldText = document.DrawPages[0].getByIndex(1).String
+        self.assertTrue(oldText.startswith('在没有版本控制系统的时期'))
+
+        xImpressDoc = self.xUITest.getTopFocusWindow()
+        xEditWin = xImpressDoc.getChild('impress_win')
+        xEditWin.executeAction('SELECT', mkPropertyValues({'OBJECT':'Unnamed 
Drawinglayer object 1'}))
+
+        # Type something, getting into text editing mode (appending) 
automatically
+        xEditWin.executeAction('TYPE', mkPropertyValues({'TEXT': 'Foo Bar'}))
+        xToolkit = 
self.xContext.ServiceManager.createInstance('com.sun.star.awt.Toolkit')
+        xToolkit.processEventsToIdle()
+        self.xUITest.executeCommand('.uno:Save')
+        self.xUITest.executeCommand('.uno:Reload')
+
+        # Reload and check that the edit was saved
+        document = self.ui_test.get_component()
+        self.assertEqual(oldText + 'Foo Bar', 
document.DrawPages[0].getByIndex(1).String)
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab:
diff --git a/xmloff/source/draw/shapeexport.cxx 
b/xmloff/source/draw/shapeexport.cxx
index 61193072f84e..887c49e61a49 100644
--- a/xmloff/source/draw/shapeexport.cxx
+++ b/xmloff/source/draw/shapeexport.cxx
@@ -304,6 +304,18 @@ void XMLShapeExport::collectShapeAutoStyles(const 
uno::Reference< drawing::XShap
         uno::Reference< text::XText > xText(xShape, uno::UNO_QUERY);
         if (xText.is())
         {
+            try
+            {
+                // tdf#153161: it seems that the call to XTextRange::getString 
flushes the changes
+                // for some objects, that otherwise fail to get exported 
correctly. Maybe at some
+                // point it would make sense to find a better place for more 
targeted flush.
+                xText->getString();
+            }
+            catch (uno::RuntimeException const&)
+            {
+                // E.g., SwXTextFrame that contains only a table will throw; 
this is not an error
+            }
+
             uno::Reference< beans::XPropertySetInfo > xPropSetInfo( 
xPropSet->getPropertySetInfo() );
 
             if( xPropSetInfo.is() && 
xPropSetInfo->hasPropertyByName("IsEmptyPresentationObject") )

Reply via email to