chart2/source/controller/dialogs/ObjectNameProvider.cxx |   26 +++++----
 chart2/source/tools/DataSeriesHelper.cxx                |   13 +++-
 sw/qa/uitest/writer_tests7/tdf132714.py                 |   46 ++++++++++++++++
 sw/source/core/unocore/unochart.cxx                     |   25 +++++---
 4 files changed, 89 insertions(+), 21 deletions(-)

New commits:
commit 78373e81c79a8afe67ffe3ac84aef5649fcf489a
Author:     László Németh <nem...@numbertext.org>
AuthorDate: Mon Feb 27 11:20:09 2023 +0100
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Tue Mar 7 16:50:00 2023 +0000

    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 <nem...@numbertext.org>
    Reviewed-by: László Németh <nem...@numbertext.org>
    (cherry picked from commit 4f2dcc4bc70c3602e2612dab611b610410637920)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/147898
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

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 e2bc3cfbe7d0..47b3ad979b05 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 87dbbcce50a7..33ceb029ab66 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>
@@ -2057,14 +2058,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()

Reply via email to