diff options
author | Miklos Vajna <vmiklos@collabora.com> | 2021-04-28 14:43:09 +0200 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.com> | 2021-04-28 17:17:44 +0200 |
commit | 6002014ce0a5c9cea22c14b2437b7a508b2c72cb (patch) | |
tree | c6f997ebd8b50379b38d4fe6bb5e13e91e9f4d8d /framework | |
parent | 041a22ec9e7789f93a8dacbc7e7f0b1fb630e6fb (diff) |
framework: allow loading a component on the main thread, using XDesktop
This is similar to commit 2dc3a6c273cb82506842864481d78df7294debbf
(framework: allow loading a component on the main thread, 2018-12-19),
but that focused on the special case when loading happens via XFrame.
The more frequently used XDesktop way now supports the same flag,
allowing correctly loading "real" OLE objects on Windows.
Change-Id: I059ea143c91894508d8264084094eefc2bff24e8
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114805
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
Diffstat (limited to 'framework')
-rw-r--r-- | framework/source/services/desktop.cxx | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/framework/source/services/desktop.cxx b/framework/source/services/desktop.cxx index 73b29953873b..a9cb105ad8e4 100644 --- a/framework/source/services/desktop.cxx +++ b/framework/source/services/desktop.cxx @@ -57,6 +57,7 @@ #include <vcl/scheduler.hxx> #include <sal/log.hxx> #include <vcl/errcode.hxx> +#include <vcl/threadex.hxx> #include <unotools/configmgr.hxx> namespace framework{ @@ -585,7 +586,25 @@ css::uno::Reference< css::lang::XComponent > SAL_CALL Desktop::loadComponentFrom css::uno::Reference< css::frame::XComponentLoader > xThis(static_cast< css::frame::XComponentLoader* >(this), css::uno::UNO_QUERY); - return LoadEnv::loadComponentFromURL(xThis, m_xContext, sURL, sTargetFrameName, nSearchFlags, lArguments); + utl::MediaDescriptor aDescriptor(lArguments); + bool bOnMainThread = aDescriptor.getUnpackedValueOrDefault("OnMainThread", false); + + if (bOnMainThread) + { + // Make sure that we own the solar mutex, otherwise later + // vcl::SolarThreadExecutor::execute() will release the solar mutex, even if it's owned by + // another thread, leading to an std::abort() at the end. + SolarMutexGuard g; + + return vcl::solarthread::syncExecute(std::bind(&LoadEnv::loadComponentFromURL, xThis, + m_xContext, sURL, sTargetFrameName, + nSearchFlags, lArguments)); + } + else + { + return LoadEnv::loadComponentFromURL(xThis, m_xContext, sURL, sTargetFrameName, + nSearchFlags, lArguments); + } } /*-************************************************************************************************************ |