filter/source/svg/svgfilter.cxx |   38 +++++++++++++++++++++++---------------
 filter/source/svg/svgfilter.hxx |    1 +
 2 files changed, 24 insertions(+), 15 deletions(-)

New commits:
commit cde5aa1e55bc5af29e484bd6da9078d49a825edc
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Thu May 29 07:38:37 2025 +0200
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Wed Jun 4 10:10:08 2025 +0200

    tdf#166779: use model first to obtain selection
    
    The current frame can be Basic, so only use it as a fallback to obtain 
selection.
    Also, failure to get the selection is not fatal here.
    
    The throwing behavior was since commit 
aa1927dc257b52edf96de220cc3797e02c83a0ae
    (Make svg export use slidesorter selection in most cases., 2012-10-10).
    
    Change-Id: I06f80151b4184f353d1d5387c11837f1e883a068
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185983
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>
    Tested-by: Jenkins
    (cherry picked from commit 58ba249df589b0c9f91667f2938bfa18d2a1ce61)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/185991
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

diff --git a/filter/source/svg/svgfilter.cxx b/filter/source/svg/svgfilter.cxx
index 04514f029425..b50c1c12d7f9 100644
--- a/filter/source/svg/svgfilter.cxx
+++ b/filter/source/svg/svgfilter.cxx
@@ -149,15 +149,28 @@ sal_Bool SAL_CALL SVGFilter::filter( const Sequence< 
PropertyValue >& rDescripto
     return filterImpressOrDraw(rDescriptor);
 }
 
+css::uno::Reference<css::frame::XController> SVGFilter::getSourceController() 
const
+{
+    uno::Reference<frame::XController> xController;
+    // Current frame may be e.g. Basic. Try to get a controller from the 
source model first.
+    if (auto xModel = mxSrcDoc.query<frame::XModel>())
+        xController = xModel->getCurrentController();
+    // Try current frame as a fallback.
+    if (!xController)
+    {
+        uno::Reference<frame::XDesktop2> 
xDesktop(frame::Desktop::create(mxContext));
+        if (auto xFrame = xDesktop->getCurrentFrame()) // Manage headless case
+            xController = xFrame->getController();
+    }
+    return xController;
+}
+
 css::uno::Reference<css::frame::XController> 
SVGFilter::fillDrawImpressSelectedPages()
 {
-    uno::Reference<frame::XDesktop2> 
xDesktop(frame::Desktop::create(mxContext));
-    uno::Reference<frame::XFrame> xFrame = xDesktop->getCurrentFrame(); // 
Manage headless case
-    if (!xFrame)
+    uno::Reference<frame::XController> xController = getSourceController();
+    uno::Reference<drawing::framework::XControllerManager> 
xManager(xController, uno::UNO_QUERY);
+    if (!xManager)
         return {};
-    uno::Reference<frame::XController> xController(xFrame->getController(), 
uno::UNO_SET_THROW);
-    uno::Reference<drawing::framework::XControllerManager> 
xManager(xController,
-                                                                    
uno::UNO_QUERY_THROW);
     uno::Reference<drawing::framework::XConfigurationController> 
xConfigController(
         xManager->getConfigurationController());
 
@@ -210,9 +223,9 @@ css::uno::Reference<css::frame::XController> 
SVGFilter::fillDrawImpressSelectedP
 
     if (mSelectedPages.empty())
     {
-        // apparently failed to clean selection - fallback to current page
-        uno::Reference<drawing::XDrawView> xDrawView(xController, 
uno::UNO_QUERY_THROW);
-        mSelectedPages.push_back(xDrawView->getCurrentPage());
+        // apparently failed to get a selection - fallback to current page
+        if (auto xDrawView = xController.query<drawing::XDrawView>())
+            mSelectedPages.push_back(xDrawView->getCurrentPage());
     }
     return xController;
 }
@@ -580,12 +593,7 @@ bool SVGFilter::filterWriterOrCalc( const Sequence< 
PropertyValue >& rDescriptor
     if(!bSelectionOnly) // For Writer only the selection-only mode is supported
         return false;
 
-    uno::Reference<frame::XDesktop2> 
xDesktop(frame::Desktop::create(mxContext));
-    uno::Reference<frame::XController > xController;
-    if (uno::Reference<frame::XFrame> xFrame = xDesktop->getCurrentFrame())
-        xController.set(xFrame->getController(), uno::UNO_SET_THROW);
-
-    Reference< view::XSelectionSupplier > xSelection (xController, UNO_QUERY);
+    Reference<view::XSelectionSupplier> xSelection(getSourceController(), 
UNO_QUERY);
     if (!xSelection.is())
         return false;
 
diff --git a/filter/source/svg/svgfilter.hxx b/filter/source/svg/svgfilter.hxx
index 90bd682fdb95..902f42b8aab2 100644
--- a/filter/source/svg/svgfilter.hxx
+++ b/filter/source/svg/svgfilter.hxx
@@ -284,6 +284,7 @@ private:
     bool filterImpressOrDraw( const Sequence< PropertyValue >& rDescriptor );
     bool filterWriterOrCalc( const Sequence< PropertyValue >& rDescriptor );
 
+    css::uno::Reference<css::frame::XController> getSourceController() const;
     css::uno::Reference<css::frame::XController> 
fillDrawImpressSelectedPages();
 
 protected:

Reply via email to