gecko-dev/widget/windows/nsToolkit.cpp
Chris Martin 496f8377a1 Bug 1400317 - Use SPI_GETFLATMENU lazily to avoid early Win32k call r=jmathies
Currently, a SystemParametersInfo(SPI_GETFLATMENU) happens very very early
during the XUL DLL startup. This is unnecessary, as this value is not used
until way later.

For Win32k lockdown, we will need to remote this call, so ContentChild must
be available.

By loading this value lazily, we ensure IPC will be available and also get to
remove a Win32 call from the Firefox startup time.

Differential Revision: https://phabricator.services.mozilla.com/D76022
2020-06-12 13:31:15 +00:00

70 lines
1.8 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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 "nsToolkit.h"
#include "nsAppShell.h"
#include "nsWindow.h"
#include "nsWidgetsCID.h"
#include "prmon.h"
#include "prtime.h"
#include "nsComponentManagerUtils.h"
#include <objbase.h>
#include "WinUtils.h"
#include "nsUXThemeData.h"
// unknwn.h is needed to build with WIN32_LEAN_AND_MEAN
#include <unknwn.h>
using namespace mozilla::widget;
nsToolkit* nsToolkit::gToolkit = nullptr;
HINSTANCE nsToolkit::mDllInstance = 0;
//-------------------------------------------------------------------------
//
// constructor
//
//-------------------------------------------------------------------------
nsToolkit::nsToolkit() {
MOZ_COUNT_CTOR(nsToolkit);
#if defined(MOZ_STATIC_COMPONENT_LIBS)
nsToolkit::Startup(GetModuleHandle(nullptr));
#endif
}
//-------------------------------------------------------------------------
//
// destructor
//
//-------------------------------------------------------------------------
nsToolkit::~nsToolkit() { MOZ_COUNT_DTOR(nsToolkit); }
void nsToolkit::Startup(HMODULE hModule) {
nsToolkit::mDllInstance = hModule;
WinUtils::Initialize();
}
void nsToolkit::Shutdown() {
delete gToolkit;
gToolkit = nullptr;
}
//-------------------------------------------------------------------------
//
// Return the nsToolkit for the current thread. If a toolkit does not
// yet exist, then one will be created...
//
//-------------------------------------------------------------------------
// static
nsToolkit* nsToolkit::GetToolkit() {
if (!gToolkit) {
gToolkit = new nsToolkit();
}
return gToolkit;
}