sfx2/source/appl/appopen.cxx           |    4 ++--
 sfx2/source/appl/appserv.cxx           |   14 +++++++-------
 sfx2/source/appl/openuriexternally.cxx |   19 +++++++++----------
 sfx2/source/appl/sfxhelp.cxx           |   31 ++++++++++++++++---------------
 sfx2/source/inc/openuriexternally.hxx  |    8 +++++++-
 sfx2/source/view/viewsh.cxx            |    2 +-
 6 files changed, 42 insertions(+), 36 deletions(-)

New commits:
commit b73bf4a5fca4fcfff24b234a7337c7a25d75887d
Author:     Caolán McNamara <caol...@redhat.com>
AuthorDate: Fri Oct 29 19:50:50 2021 +0100
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Sun Oct 31 15:06:37 2021 +0100

    pass an explicit parent to use for any warning dialogs
    
    Change-Id: I7909775b63dfe830e5f0e5b024fa6b47a074736a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/124457
    Tested-by: Caolán McNamara <caol...@redhat.com>
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/sfx2/source/appl/appopen.cxx b/sfx2/source/appl/appopen.cxx
index fa95d74ca458..5d8a28b7d21c 100644
--- a/sfx2/source/appl/appopen.cxx
+++ b/sfx2/source/appl/appopen.cxx
@@ -859,7 +859,7 @@ void SfxApplication::OpenDocExec_Impl( SfxRequest& rReq )
                      aINetProtocol == INetProtocol::Http ||
                      aINetProtocol == INetProtocol::Https )
                 {
-                    sfx2::openUriExternally(aURL.Complete, true);
+                    sfx2::openUriExternally(aURL.Complete, true, 
rReq.GetFrameWeld());
                     return;
                 }
                 else
@@ -904,7 +904,7 @@ void SfxApplication::OpenDocExec_Impl( SfxRequest& rReq )
                         try
                         {
                             sfx2::openUriExternally(
-                                aURL.Complete, pFilter == nullptr);
+                                aURL.Complete, pFilter == nullptr, 
rReq.GetFrameWeld());
                         }
                         catch ( css::system::SystemShellExecuteException& )
                         {
diff --git a/sfx2/source/appl/appserv.cxx b/sfx2/source/appl/appserv.cxx
index 6be2bfc85d40..816dfa668d69 100644
--- a/sfx2/source/appl/appserv.cxx
+++ b/sfx2/source/appl/appserv.cxx
@@ -482,7 +482,7 @@ void SfxApplication::MiscExec_Impl( SfxRequest& rReq )
                 "?LOversion=" + 
utl::ConfigManager::getAboutBoxProductVersion() +
                 "&LOlocale=" + utl::ConfigManager::getUILocale() +
                 "&LOmodule=" + module.subView(module.lastIndexOf('.') + 1 )  );
-            sfx2::openUriExternally(sURL, false);
+            sfx2::openUriExternally(sURL, false, rReq.GetFrameWeld());
             break;
         }
 
@@ -493,7 +493,7 @@ void SfxApplication::MiscExec_Impl( SfxRequest& rReq )
 
             OUString sURL(officecfg::Office::Common::Menus::QA_URL::get() + 
//https://hub.libreoffice.org/forum/
                 "?LOlocale=" + utl::ConfigManager::getUILocale());
-            sfx2::openUriExternally(sURL, false);
+            sfx2::openUriExternally(sURL, false, rReq.GetFrameWeld());
             break;
         }
         case SID_DOCUMENTATION:
@@ -501,7 +501,7 @@ void SfxApplication::MiscExec_Impl( SfxRequest& rReq )
             // Open documentation page based on locales
             OUString 
sURL(officecfg::Office::Common::Menus::DocumentationURL::get() + 
//https://hub.libreoffice.org/documentation/
                 "?LOlocale=" + utl::ConfigManager::getUILocale());
-            sfx2::openUriExternally(sURL, false);
+            sfx2::openUriExternally(sURL, false, rReq.GetFrameWeld());
             break;
         }
         case SID_GETINVOLVED:
@@ -509,7 +509,7 @@ void SfxApplication::MiscExec_Impl( SfxRequest& rReq )
             // Open get involved/join us page based on locales
             OUString 
sURL(officecfg::Office::Common::Menus::GetInvolvedURL::get() + 
//https://hub.libreoffice.org/joinus/
                 "?LOlocale=" + utl::ConfigManager::getUILocale());
-            sfx2::openUriExternally(sURL, false);
+            sfx2::openUriExternally(sURL, false, rReq.GetFrameWeld());
             break;
         }
         case SID_DONATION:
@@ -519,7 +519,7 @@ void SfxApplication::MiscExec_Impl( SfxRequest& rReq )
             OUString aBcp47 = 
LanguageTag(utl::ConfigManager::getUILocale()).getBcp47();
             OUString sURL(officecfg::Office::Common::Menus::DonationURL::get() 
+ //https://hub.libreoffice.org/donation/
                 "?BCP47=" + aBcp47 + "&LOlang=" + aLang );
-            sfx2::openUriExternally(sURL, false);
+            sfx2::openUriExternally(sURL, false, rReq.GetFrameWeld());
             break;
         }
         case SID_WHATSNEW:
@@ -528,7 +528,7 @@ void SfxApplication::MiscExec_Impl( SfxRequest& rReq )
             OUString 
sURL(officecfg::Office::Common::Menus::ReleaseNotesURL::get() + 
//https://hub.libreoffice.org/ReleaseNotes/
                 "?LOvers=" + utl::ConfigManager::getProductVersion() +
                 "&LOlocale=" + 
LanguageTag(utl::ConfigManager::getUILocale()).getBcp47() );
-            sfx2::openUriExternally(sURL, false);
+            sfx2::openUriExternally(sURL, false, rReq.GetFrameWeld());
             break;
         }
         case SID_HYPHENATIONMISSING:
@@ -536,7 +536,7 @@ void SfxApplication::MiscExec_Impl( SfxRequest& rReq )
             // Open wiki page about hyphenation
             OUString 
sURL(officecfg::Office::Common::Menus::HyphenationMissingURL::get() + 
//https://hub.libreoffice.org/HyphenationMissing/
                 "?LOlocale=" + utl::ConfigManager::getUILocale());
-            sfx2::openUriExternally(sURL, false);
+            sfx2::openUriExternally(sURL, false, rReq.GetFrameWeld());
             break;
         }
         case SID_SHOW_LICENSE:
diff --git a/sfx2/source/appl/openuriexternally.cxx 
b/sfx2/source/appl/openuriexternally.cxx
index 0425da7208be..ebc5886ea5b8 100644
--- a/sfx2/source/appl/openuriexternally.cxx
+++ b/sfx2/source/appl/openuriexternally.cxx
@@ -17,7 +17,6 @@
 #include <com/sun/star/uno/RuntimeException.hpp>
 #include <comphelper/processfactory.hxx>
 #include <rtl/ustring.hxx>
-#include <sfx2/app.hxx>
 #include <sfx2/sfxresid.hxx>
 #include <vcl/svapp.hxx>
 #include <vcl/weld.hxx>
@@ -35,12 +34,14 @@ class URITools
 private:
     Timer aOpenURITimer { "sfx2::openUriExternallyTimer" };
     OUString msURI;
+    weld::Widget* mpDialogParent;
     bool mbHandleSystemShellExecuteException;
     DECL_LINK(onOpenURI, Timer*, void);
 
 public:
-    URITools()
-        : mbHandleSystemShellExecuteException(false)
+    URITools(weld::Widget* pDialogParent)
+        : mpDialogParent(pDialogParent)
+        , mbHandleSystemShellExecuteException(false)
     {
     }
     void openURI(const OUString& sURI, bool 
bHandleSystemShellExecuteException);
@@ -89,11 +90,10 @@ IMPL_LINK_NOARG(URITools, onOpenURI, Timer*, void)
                     "unexpected IllegalArgumentException: " + e.Message);
             }
             SolarMutexGuard g;
-            weld::Window *pWindow = SfxGetpApp()->GetTopWindow();
             if (flags == css::system::SystemShellExecuteFlags::URIS_ONLY) {
                 std::unique_ptr<weld::MessageDialog> eb(
                     Application::CreateMessageDialog(
-                        pWindow, VclMessageType::Warning, 
VclButtonsType::OkCancel,
+                        mpDialogParent, VclMessageType::Warning, 
VclButtonsType::OkCancel,
                         SfxResId(STR_DANGEROUS_TO_OPEN)));
                 
eb->set_primary_text(eb->get_primary_text().replaceFirst("$(ARG1)", msURI));
                 if (eb->run() == RET_OK) {
@@ -101,7 +101,7 @@ IMPL_LINK_NOARG(URITools, onOpenURI, Timer*, void)
                     continue;
                 }
             } else {
-                std::unique_ptr<weld::MessageDialog> 
eb(Application::CreateMessageDialog(pWindow,
+                std::unique_ptr<weld::MessageDialog> 
eb(Application::CreateMessageDialog(mpDialogParent,
                                                                          
VclMessageType::Warning, VclButtonsType::Ok,
                                                                          
SfxResId(STR_NO_ABS_URI_REF)));
                 
eb->set_primary_text(eb->get_primary_text().replaceFirst("$(ARG1)", msURI));
@@ -112,8 +112,7 @@ IMPL_LINK_NOARG(URITools, onOpenURI, Timer*, void)
                 throw;
             }
             SolarMutexGuard g;
-            weld::Window *pWindow = SfxGetpApp()->GetTopWindow();
-            std::unique_ptr<weld::MessageDialog> 
eb(Application::CreateMessageDialog(pWindow,
+            std::unique_ptr<weld::MessageDialog> 
eb(Application::CreateMessageDialog(mpDialogParent,
                                                                      
VclMessageType::Warning, VclButtonsType::Ok,
                                                                      
SfxResId(STR_NO_WEBBROWSER_FOUND)));
             eb->set_primary_text(
@@ -127,9 +126,9 @@ IMPL_LINK_NOARG(URITools, onOpenURI, Timer*, void)
     }
 }
 
-void sfx2::openUriExternally(const OUString& sURI, bool 
bHandleSystemShellExecuteException)
+void sfx2::openUriExternally(const OUString& sURI, bool 
bHandleSystemShellExecuteException, weld::Widget* pDialogParent)
 {
-    URITools* uriTools = new URITools;
+    URITools* uriTools = new URITools(pDialogParent);
     uriTools->openURI(sURI, bHandleSystemShellExecuteException);
 }
 
diff --git a/sfx2/source/appl/sfxhelp.cxx b/sfx2/source/appl/sfxhelp.cxx
index 039b85bb1e27..73d86cba8266 100644
--- a/sfx2/source/appl/sfxhelp.cxx
+++ b/sfx2/source/appl/sfxhelp.cxx
@@ -712,7 +712,7 @@ bool SfxHelp::Start(const OUString& rURL, weld::Widget* 
pWidget)
 }
 
 /// Redirect the vnd.sun.star.help:// urls to http://help.libreoffice.org
-static bool impl_showOnlineHelp( const OUString& rURL )
+static bool impl_showOnlineHelp(const OUString& rURL, weld::Widget* 
pDialogParent)
 {
     static constexpr OUStringLiteral aInternal(u"vnd.sun.star.help://");
     if ( rURL.getLength() <= aInternal.getLength() || 
!rURL.startsWith(aInternal) )
@@ -750,8 +750,9 @@ static bool impl_showOnlineHelp( const OUString& rURL )
                                kCFStringEncodingUTF8),
                            nullptr),
             nullptr);
+        (void)pDialogParent;
 #else
-        sfx2::openUriExternally(aHelpLink, false);
+        sfx2::openUriExternally(aHelpLink, false, pDialogParent);
 #endif
         return true;
     }
@@ -939,7 +940,7 @@ constexpr OUStringLiteral SHTML4 = u"'\"><script 
type=\"text/javascript\"> windo
 constexpr OUStringLiteral SHTML5 = u"\";</script><title>Help Page 
Redirection</title></head><body></body></html>";
 
 // use a tempfile since e.g. xdg-open doesn't support URL-parameters with 
file:// URLs
-static bool impl_showOfflineHelp( const OUString& rURL )
+static bool impl_showOfflineHelp(const OUString& rURL, weld::Widget* 
pDialogParent)
 {
     OUString aBaseInstallPath = getHelpRootURL();
     // For the flatpak case, find the pathname outside the flatpak sandbox 
that corresponds to
@@ -982,8 +983,9 @@ static bool impl_showOfflineHelp( const OUString& rURL )
                                kCFStringEncodingUTF8),
                            nullptr),
             nullptr);
+        (void)pDialogParent;
 #else
-        sfx2::openUriExternally(aTempFile.GetURL(), false);
+        sfx2::openUriExternally(aTempFile.GetURL(), false, pDialogParent);
 #endif
         return true;
     }
@@ -1102,9 +1104,12 @@ bool SfxHelp::Start_Impl(const OUString& rURL, const 
vcl::Window* pWindow)
         }
     }
 
+    pWindow = GetBestParent(pWindow);
+    weld::Window* pWeldWindow = pWindow ? pWindow->GetFrameWeld() : nullptr;
+
     if ( comphelper::LibreOfficeKit::isActive() )
     {
-        impl_showOnlineHelp( aHelpURL );
+        impl_showOnlineHelp(aHelpURL, pWeldWindow);
         return true;
     }
 #ifdef MACOSX
@@ -1118,7 +1123,7 @@ bool SfxHelp::Start_Impl(const OUString& rURL, const 
vcl::Window* pWindow)
                                     nullptr),
                                 kLSRolesAll, nullptr);
         if([static_cast<NSString*>(CFURLGetString(pBrowser)) 
isEqualToString:@"file:///Applications/Safari.app/"]) {
-            impl_showOnlineHelp( aHelpURL );
+            impl_showOnlineHelp(aHelpURL, pWeldWindow);
             return true;
         }
     }
@@ -1130,7 +1135,7 @@ bool SfxHelp::Start_Impl(const OUString& rURL, const 
vcl::Window* pWindow)
     // display" code below:
     if (SfxContentHelper::IsHelpErrorDocument(aHelpURL))
     {
-        if ( impl_hasHTMLHelpInstalled() && impl_showOfflineHelp(aHelpURL) )
+        if ( impl_hasHTMLHelpInstalled() && impl_showOfflineHelp(aHelpURL, 
pWeldWindow) )
         {
             return true;
         }
@@ -1139,13 +1144,10 @@ bool SfxHelp::Start_Impl(const OUString& rURL, const 
vcl::Window* pWindow)
         {
             bool bShowOfflineHelpPopUp = 
officecfg::Office::Common::Help::BuiltInHelpNotInstalledPopUp::get();
 
-            pWindow = GetBestParent(pWindow);
-
             TopLevelWindowLocker aBusy;
 
             if(bShowOfflineHelpPopUp)
             {
-                weld::Window* pWeldWindow = pWindow ? pWindow->GetFrameWeld() 
: nullptr;
                 aBusy.incBusy(pWeldWindow);
                 HelpManualMessage aQueryBox(pWeldWindow);
                 short OnlineHelpBox = aQueryBox.run();
@@ -1157,11 +1159,10 @@ bool SfxHelp::Start_Impl(const OUString& rURL, const 
vcl::Window* pWindow)
             }
             if(!bShowOfflineHelpPopUp)
             {
-                if ( impl_showOnlineHelp( aHelpURL ) )
+                if ( impl_showOnlineHelp(aHelpURL, pWeldWindow) )
                     return true;
                 else
                 {
-                    weld::Window* pWeldWindow = pWindow ? 
pWindow->GetFrameWeld() : nullptr;
                     aBusy.incBusy(pWeldWindow);
                     NoHelpErrorBox aErrBox(pWeldWindow);
                     aErrBox.run();
@@ -1277,7 +1278,7 @@ bool SfxHelp::Start_Impl(const OUString& rURL, 
weld::Widget* pWidget, const OUSt
 
     if ( comphelper::LibreOfficeKit::isActive() )
     {
-        impl_showOnlineHelp( aHelpURL );
+        impl_showOnlineHelp(aHelpURL, pWidget);
         return true;
     }
 
@@ -1287,7 +1288,7 @@ bool SfxHelp::Start_Impl(const OUString& rURL, 
weld::Widget* pWidget, const OUSt
     // display" code below:
     if (SfxContentHelper::IsHelpErrorDocument(aHelpURL))
     {
-        if ( impl_hasHTMLHelpInstalled() && impl_showOfflineHelp(aHelpURL) )
+        if ( impl_hasHTMLHelpInstalled() && impl_showOfflineHelp(aHelpURL, 
pWidget) )
         {
             return true;
         }
@@ -1311,7 +1312,7 @@ bool SfxHelp::Start_Impl(const OUString& rURL, 
weld::Widget* pWidget, const OUSt
             }
             if(!bShowOfflineHelpPopUp)
             {
-                if ( impl_showOnlineHelp( aHelpURL ) )
+                if ( impl_showOnlineHelp(aHelpURL, pWidget) )
                     return true;
                 else
                 {
diff --git a/sfx2/source/inc/openuriexternally.hxx 
b/sfx2/source/inc/openuriexternally.hxx
index a7eca291c7c3..cf78d1b71370 100644
--- a/sfx2/source/inc/openuriexternally.hxx
+++ b/sfx2/source/inc/openuriexternally.hxx
@@ -14,6 +14,11 @@
 
 #include <rtl/ustring.hxx>
 
+namespace weld
+{
+class Widget;
+}
+
 namespace sfx2
 {
 /** Open a URI via com.sun.star.system.SystemShellExecute
@@ -26,7 +31,8 @@ namespace sfx2
     given bHandleSystemShellExecuteException is false (in which case the
     exception is re-thrown).
 */
-void openUriExternally(const OUString& sURI, bool 
bHandleSystemShellExecuteException);
+void openUriExternally(const OUString& sURI, bool 
bHandleSystemShellExecuteException,
+                       weld::Widget* pDialogParent);
 };
 
 #endif
diff --git a/sfx2/source/view/viewsh.cxx b/sfx2/source/view/viewsh.cxx
index 7b86b27cabf6..e49899bc36eb 100644
--- a/sfx2/source/view/viewsh.cxx
+++ b/sfx2/source/view/viewsh.cxx
@@ -639,7 +639,7 @@ void SfxViewShell::ExecMisc_Impl( SfxRequest &rReq )
                     return;
                 }
 
-                sfx2::openUriExternally(aFileURL, true);
+                sfx2::openUriExternally(aFileURL, true, rReq.GetFrameWeld());
                 rReq.Done(true);
                 break;
             }

Reply via email to