From cd69836ee9e98a4c6ceaa716da8838ddac842054 Mon Sep 17 00:00:00 2001 From: Mike Kaganski Date: Wed, 25 Jan 2023 01:37:00 +0300 Subject: 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 Reviewed-by: Mike Kaganski Reviewed-on: https://gerrit.libreoffice.org/c/core/+/149142 Tested-by: Thorsten Behrens Reviewed-by: Thorsten Behrens --- .../impress_tests/data/tdf153161_FlushToSave.odp | Bin 0 -> 37209 bytes sd/qa/uitest/impress_tests/tdf153161.py | 41 +++++++++++++++++++++ xmloff/source/draw/shapeexport.cxx | 12 ++++++ 3 files changed, 53 insertions(+) create mode 100644 sd/qa/uitest/impress_tests/data/tdf153161_FlushToSave.odp create mode 100644 sd/qa/uitest/impress_tests/tdf153161.py 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") ) -- cgit v1.2.3