diff options
author | László Németh <nemeth@numbertext.org> | 2023-02-27 11:20:09 +0100 |
---|---|---|
committer | László Németh <nemeth@numbertext.org> | 2023-02-27 15:22:52 +0000 |
commit | 4f2dcc4bc70c3602e2612dab611b610410637920 (patch) | |
tree | 52d3c329c2dc7f5d4c6ac8844aeee2d86191d289 | |
parent | c23c071f38978f51a03dc352058c34448d314e03 (diff) |
tdf#153858 sw: crash fix for chart with deleted data table
Using mouse, e.g. simply moving the mouse pointer
during editing a chart with a deleted data table
crashed Writer immediately.
Follow-up to commit 5b9855acc7fa6d1e4a5f53ff0bc47e1dd4729827
"tdf#132714 sw: fix crash at table row deletion associated
to a chart".
Change-Id: I6d89eabc84565c548e2d9ded922789d623367ce4
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147882
Tested-by: László Németh <nemeth@numbertext.org>
Reviewed-by: László Németh <nemeth@numbertext.org>
-rw-r--r-- | chart2/source/controller/dialogs/ObjectNameProvider.cxx | 26 | ||||
-rw-r--r-- | chart2/source/tools/DataSeriesHelper.cxx | 13 | ||||
-rw-r--r-- | sw/qa/uitest/writer_tests7/tdf132714.py | 46 | ||||
-rw-r--r-- | sw/source/core/unocore/unochart.cxx | 25 |
4 files changed, 89 insertions, 21 deletions
diff --git a/chart2/source/controller/dialogs/ObjectNameProvider.cxx b/chart2/source/controller/dialogs/ObjectNameProvider.cxx index 2bf6af625555..c60ff1ca364a 100644 --- a/chart2/source/controller/dialogs/ObjectNameProvider.cxx +++ b/chart2/source/controller/dialogs/ObjectNameProvider.cxx @@ -124,13 +124,15 @@ OUString lcl_getDataPointValueText( const rtl::Reference< DataSeries >& xSeries, uno::Reference<data::XDataSequence> xDataSequence( aDataSequences[nN]->getValues()); if( !xDataSequence.is() ) continue; - Sequence< Any > aData( xDataSequence->getData() ); - if( nPointIndex >= aData.getLength() ) - continue; - uno::Reference<beans::XPropertySet> xProp(xDataSequence, uno::UNO_QUERY ); - if( xProp.is()) + + try { - try + Sequence< Any > aData( xDataSequence->getData() ); + + if( nPointIndex >= aData.getLength() ) + continue; + uno::Reference<beans::XPropertySet> xProp(xDataSequence, uno::UNO_QUERY ); + if( xProp.is()) { uno::Any aARole = xProp->getPropertyValue( "Role" ); OUString aRole; @@ -179,10 +181,14 @@ OUString lcl_getDataPointValueText( const rtl::Reference< DataSeries >& xSeries, a_Size = aNumberFormatterWrapper.getFormattedString( nNumberFormatKey, fValue, nLabelColor, bColorChanged ); } } - catch( const uno::Exception& ) - { - TOOLS_WARN_EXCEPTION("chart2", "" ); - } + } + catch (const lang::DisposedException&) + { + TOOLS_WARN_EXCEPTION( "chart2", "unexpected exception caught" ); + } + catch( const uno::Exception& ) + { + TOOLS_WARN_EXCEPTION("chart2", "" ); } } diff --git a/chart2/source/tools/DataSeriesHelper.cxx b/chart2/source/tools/DataSeriesHelper.cxx index 52c4c0637179..a2c25366dd3a 100644 --- a/chart2/source/tools/DataSeriesHelper.cxx +++ b/chart2/source/tools/DataSeriesHelper.cxx @@ -208,10 +208,17 @@ uno::Reference< chart2::data::XLabeledDataSequence > if( ! xSource.is()) return aNoResult; const Sequence< Reference< chart2::data::XLabeledDataSequence > > aLabeledSeq( xSource->getDataSequences()); - for (auto const & i : aLabeledSeq) + try + { + for (auto const & i : aLabeledSeq) + { + if (lcl_MatchesRole(aRole, bMatchPrefix)(i)) + return i; + } + } + catch (const lang::DisposedException&) { - if (lcl_MatchesRole(aRole, bMatchPrefix)(i)) - return i; + TOOLS_WARN_EXCEPTION( "chart2", "unexpected exception caught" ); } return aNoResult; diff --git a/sw/qa/uitest/writer_tests7/tdf132714.py b/sw/qa/uitest/writer_tests7/tdf132714.py index 971db5f97ad3..7ccedbeb6f4d 100644 --- a/sw/qa/uitest/writer_tests7/tdf132714.py +++ b/sw/qa/uitest/writer_tests7/tdf132714.py @@ -8,6 +8,9 @@ # from uitest.framework import UITestCase from uitest.uihelper.common import get_url_for_data_file +from libreoffice.uno.propertyvalue import mkPropertyValues +from com.sun.star.awt import MouseButton +from com.sun.star.awt import MouseEvent class tdf132714(UITestCase): def test_tdf132714(self): @@ -20,4 +23,47 @@ class tdf132714(UITestCase): # Without the fix in place, at this point crash occurs. self.xUITest.executeCommand(".uno:DeleteRows") + def test_delete_table(self): + with self.ui_test.load_file(get_url_for_data_file("tdf132714.odt")) as document: + + # delete second row (first data row) in the associated text table of the chart + self.xUITest.executeCommand(".uno:GoDown") + self.xUITest.executeCommand(".uno:GoDown") + # Without the fix in place, at this point crash occurs. + self.xUITest.executeCommand(".uno:DeleteTable") + + # select embedded chart + self.assertEqual(1, document.EmbeddedObjects.Count) + document.CurrentController.select(document.getEmbeddedObjects().getByIndex(0)) + self.assertEqual("SwXTextEmbeddedObject", document.CurrentSelection.getImplementationName()) + + xChartMainTop = self.xUITest.getTopFocusWindow() + xWriterEdit = xChartMainTop.getChild("writer_edit") + # edit object by pressing Enter + xWriterEdit.executeAction("TYPE", mkPropertyValues({"KEYCODE":"RETURN"})) + + # create mouse event in the chart area + xFrame = document.getCurrentController().getFrame() + self.assertIsNotNone(xFrame) + xWindow = xFrame.getContainerWindow() + self.assertIsNotNone(xWindow) + + xMouseEvent = MouseEvent() + xMouseEvent.Modifiers = 0 + xMouseEvent.Buttons = MouseButton.LEFT + xMouseEvent.X = 1000 + xMouseEvent.Y = 400 + xMouseEvent.ClickCount = 1 + xMouseEvent.PopupTrigger = False + xMouseEvent.Source = xWindow + + # send mouse event + xToolkitRobot = xWindow.getToolkit() + self.assertIsNotNone(xToolkitRobot) + + # Click in the chart area + + # Without the fix in place, this test would have crashed here + xToolkitRobot.mouseMove(xMouseEvent) + # vim: set shiftwidth=4 softtabstop=4 expandtab: diff --git a/sw/source/core/unocore/unochart.cxx b/sw/source/core/unocore/unochart.cxx index 99414a99e117..e5265acc4fec 100644 --- a/sw/source/core/unocore/unochart.cxx +++ b/sw/source/core/unocore/unochart.cxx @@ -24,6 +24,7 @@ #include <com/sun/star/chart2/data/LabelOrigin.hpp> #include <com/sun/star/embed/XEmbeddedObject.hpp> #include <com/sun/star/frame/XModel.hpp> +#include <comphelper/diagnose_ex.hxx> #include <cppuhelper/supportsservice.hxx> #include <o3tl/deleter.hxx> #include <o3tl/string_view.hxx> @@ -2023,14 +2024,22 @@ uno::Sequence< OUString > SAL_CALL SwChartDataSequence::getTextualData() uno::Sequence< uno::Any > SAL_CALL SwChartDataSequence::getData() { SolarMutexGuard aGuard; - auto vCells(GetCells()); - uno::Sequence< uno::Any > vAnyData(vCells.size()); - std::transform(vCells.begin(), - vCells.end(), - vAnyData.getArray(), - [] (decltype(vCells)::value_type& xCell) - { return static_cast<SwXCell*>(xCell.get())->GetAny(); }); - return vAnyData; + try + { + auto vCells(GetCells()); + uno::Sequence< uno::Any > vAnyData(vCells.size()); + std::transform(vCells.begin(), + vCells.end(), + vAnyData.getArray(), + [] (decltype(vCells)::value_type& xCell) + { return static_cast<SwXCell*>(xCell.get())->GetAny(); }); + return vAnyData; + } + catch (const lang::DisposedException&) + { + TOOLS_WARN_EXCEPTION( "sw", "unexpected exception caught" ); + } + return uno::Sequence< uno::Any >{}; } uno::Sequence< double > SAL_CALL SwChartDataSequence::getNumericalData() |