Files
libreoffice/test/source/setupvcl.cxx
Noel Grandin 6e35794cad terminate XDesktop properly in unit tests
So that the UNO constructor work can continue - where we need the
desktop to be disposed properly so that all UNO constructors objects
have their dispose() called, and they can clean up their global state.

We detect this case by changing a SAL_WARN to an assert in
Desktop::disposing()

(*) in ~ScTabViewShell, don't call EnterHandler, because that tries to
create EditEngine's and other stuff, which crashes
(*) Need a fake singleton so that the servicemanager calls dispose()
 on the AnalysAddIn and we can clear the global variable there.

Change-Id: Id13b51e17afc16fcbbc65d64281cdf847e4a58cf
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/99640
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2020-07-30 10:49:27 +02:00

95 lines
3.2 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
#include <sal/config.h>
#include <com/sun/star/configuration/theDefaultProvider.hpp>
#include <com/sun/star/lang/XComponent.hpp>
#include <com/sun/star/util/XFlushable.hpp>
#include <com/sun/star/frame/Desktop.hpp>
#include <comphelper/processfactory.hxx>
#include <i18nlangtag/languagetag.hxx>
#include <i18nlangtag/mslangid.hxx>
#include <unotools/configmgr.hxx>
#include <unotools/syslocaleoptions.hxx>
#include <vcl/svapp.hxx>
#include "isheadless.hxx"
#include "setupvcl.hxx"
namespace {
struct Hook { // LINK only works as a member of a class...
DECL_STATIC_LINK(Hook, deinitHook, LinkParamNone *, void);
};
// HACK so that defaultBootstrap_InitialComponentContext (in
// unobootstrapprotector) is called before InitVCL (below), but component
// context is disposed (redundantly again in unobootstrapprotector) from within
// DeInitVCL (cf. Desktop::DeInit, desktop/source/app/app.cxx):
IMPL_STATIC_LINK_NOARG(Hook, deinitHook, LinkParamNone *, void) {
css::uno::Reference<css::uno::XComponentContext> context;
try {
context = comphelper::getProcessComponentContext();
} catch (css::uno::RuntimeException &) {}
if (!context)
return;
css::uno::Reference<css::lang::XMultiServiceFactory> config;
try {
config = css::configuration::theDefaultProvider::get(context);
} catch (css::uno::DeploymentException &) {}
if (config) {
utl::ConfigManager::storeConfigItems();
css::uno::Reference<css::util::XFlushable>(
config, css::uno::UNO_QUERY_THROW)->flush();
}
// the desktop has to be terminate() before it can be dispose()
css::uno::Reference<css::frame::XDesktop> xDesktop;
try {
xDesktop = css::frame::Desktop::create(comphelper::getProcessComponentContext());
} catch (css::uno::DeploymentException &) {}
if (xDesktop)
try {
xDesktop->terminate();
} catch (css::uno::DeploymentException &) {}
css::uno::Reference<css::lang::XComponent>(
context, css::uno::UNO_QUERY_THROW)->dispose();
comphelper::setProcessServiceFactory(nullptr);
}
}
void test::setUpVcl(bool const forceHeadless) {
// Force locale (and resource files loaded):
OUString locale;
if (getenv("LO_TEST_LOCALE") != nullptr)
locale = OUString::fromUtf8(getenv("LO_TEST_LOCALE"));
else
locale = "en-US";
SvtSysLocaleOptions localOptions;
localOptions.SetLocaleConfigString(locale);
localOptions.SetUILocaleConfigString(locale);
LanguageTag tag(locale);
MsLangId::setConfiguredSystemUILanguage(tag.getLanguageType(false));
LanguageTag::setConfiguredSystemLanguage(tag.getLanguageType(false));
InitVCL();
if (forceHeadless || isHeadless()) {
Application::EnableHeadlessMode(false);
}
Application::setDeInitHook(LINK(nullptr, Hook, deinitHook));
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */