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:
@@ -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
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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__
|
||||
|
||||
Reference in New Issue
Block a user