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
This commit is contained in:
Chris Martin
2020-06-12 13:31:15 +00:00
parent 4d0da594a6
commit 2cb499315c
5 changed files with 15 additions and 18 deletions

View File

@@ -228,7 +228,8 @@ nsresult nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) {
break;
case ColorID::MozMenubarhovertext:
if (!IsAppThemed()) {
idx = nsUXThemeData::sFlatMenus ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT;
idx = nsUXThemeData::AreFlatMenusEnabled() ? COLOR_HIGHLIGHTTEXT
: COLOR_MENUTEXT;
break;
}
// Fall through

View File

@@ -2749,7 +2749,7 @@ bool nsNativeThemeWin::ClassicThemeSupportsWidget(nsIFrame* aFrame,
case StyleAppearance::Menubar:
case StyleAppearance::Menupopup:
// Classic non-flat menus are handled almost entirely through CSS.
if (!nsUXThemeData::sFlatMenus) return false;
if (!nsUXThemeData::AreFlatMenusEnabled()) return false;
case StyleAppearance::Button:
case StyleAppearance::NumberInput:
case StyleAppearance::Textfield:
@@ -2885,7 +2885,7 @@ bool nsNativeThemeWin::ClassicGetWidgetPadding(nsDeviceContext* aContext,
return false;
if (part == 1) { // top-level menu
if (nsUXThemeData::sFlatMenus || !(state & DFCS_PUSHED)) {
if (nsUXThemeData::AreFlatMenusEnabled() || !(state & DFCS_PUSHED)) {
(*aResult).top = (*aResult).bottom = (*aResult).left =
(*aResult).right = 2;
} else {
@@ -3837,7 +3837,7 @@ RENDER_AGAIN:
case StyleAppearance::Menubar:
break;
case StyleAppearance::Menupopup:
NS_ASSERTION(nsUXThemeData::sFlatMenus,
NS_ASSERTION(nsUXThemeData::AreFlatMenusEnabled(),
"Classic menus are styled entirely through CSS");
::FillRect(hdc, &widgetRect, (HBRUSH)(COLOR_MENU + 1));
::FrameRect(hdc, &widgetRect, ::GetSysColorBrush(COLOR_BTNSHADOW));
@@ -3847,7 +3847,7 @@ RENDER_AGAIN:
case StyleAppearance::Radiomenuitem:
// part == 0 for normal items
// part == 1 for top-level menu items
if (nsUXThemeData::sFlatMenus) {
if (nsUXThemeData::AreFlatMenusEnabled()) {
// Not disabled and hot/pushed.
if ((state & (DFCS_HOT | DFCS_PUSHED)) != 0) {
::FillRect(hdc, &widgetRect, (HBRUSH)(COLOR_MENUHILIGHT + 1));

View File

@@ -46,7 +46,6 @@ nsToolkit::~nsToolkit() { MOZ_COUNT_DTOR(nsToolkit); }
void nsToolkit::Startup(HMODULE hModule) {
nsToolkit::mDllInstance = hModule;
WinUtils::Initialize();
nsUXThemeData::Initialize();
}
void nsToolkit::Shutdown() {

View File

@@ -24,8 +24,6 @@ bool nsUXThemeData::sCommandButtonMetricsInitialized = false;
SIZE nsUXThemeData::sCommandButtonBoxMetrics;
bool nsUXThemeData::sCommandButtonBoxMetricsInitialized = false;
bool nsUXThemeData::sFlatMenus = false;
bool nsUXThemeData::sTitlebarInfoPopulatedAero = false;
bool nsUXThemeData::sTitlebarInfoPopulatedThemed = false;
@@ -52,17 +50,10 @@ nsUXThemeData::ThemeHandle::operator HANDLE() {
return mHandle.isSome() ? mHandle.value() : nullptr;
}
void nsUXThemeData::Teardown() { Invalidate(); }
void nsUXThemeData::Initialize() { Invalidate(); }
void nsUXThemeData::Invalidate() {
for (auto& theme : sThemes) {
theme.Close();
}
BOOL useFlat = FALSE;
sFlatMenus =
::SystemParametersInfo(SPI_GETFLATMENU, 0, &useFlat, 0) ? useFlat : false;
}
HANDLE
@@ -397,3 +388,10 @@ void nsUXThemeData::UpdateNativeThemeInfo() {
return;
}
}
// static
bool nsUXThemeData::AreFlatMenusEnabled() {
BOOL useFlat = FALSE;
return !!::SystemParametersInfo(SPI_GETFLATMENU, 0, &useFlat, 0) ? useFlat
: false;
}

View File

@@ -100,15 +100,12 @@ class nsUXThemeData {
static void EnsureCommandButtonBoxMetrics();
public:
static bool sFlatMenus;
static bool sTitlebarInfoPopulatedAero;
static bool sTitlebarInfoPopulatedThemed;
static mozilla::LookAndFeel::WindowsTheme sThemeId;
static bool sIsDefaultWindowsTheme;
static bool sIsHighContrastOn;
static void Initialize();
static void Teardown();
static void Invalidate();
static HANDLE GetTheme(nsUXThemeClass cls);
static HMODULE GetThemeDLL();
@@ -128,5 +125,7 @@ class nsUXThemeData {
static mozilla::LookAndFeel::WindowsTheme GetNativeThemeId();
static bool IsDefaultWindowTheme();
static bool IsHighContrastOn();
static bool AreFlatMenusEnabled();
};
#endif // __UXThemeData_h__