From c7f42c0ba48f6b63c2fd81093da5d076c85c9e8a Mon Sep 17 00:00:00 2001 From: Alexander Frick Date: Tue, 20 Aug 2024 16:44:40 -0500 Subject: [PATCH] use BASE_FEATURE for Th24 flag parsing --- other/thorium-2024-ui.patch | 42 ++--- src/chrome/browser/ui/thorium_2024.h | 6 +- src/ui/base/ui_base_features.cc | 9 + src/ui/base/ui_base_features.h | 266 +++++++++++++++++++++++++++ 4 files changed, 297 insertions(+), 26 deletions(-) create mode 100644 src/ui/base/ui_base_features.h diff --git a/other/thorium-2024-ui.patch b/other/thorium-2024-ui.patch index 03b5d48cf..729578992 100644 --- a/other/thorium-2024-ui.patch +++ b/other/thorium-2024-ui.patch @@ -24,7 +24,7 @@ index bba403a7e5068..e6cba4e30c0a0 100644 // to the white space above and below. - const int bookmark_bar_attached_vertical_margin = - features::IsChromeRefresh2023() ? 6 : 4; -+ const int bookmark_bar_attached_vertical_margin = Th24State() ? 2 : 6; ++ const int bookmark_bar_attached_vertical_margin = IsThorium2024() ? 2 : 6; return GetLayoutConstant(BOOKMARK_BAR_BUTTON_HEIGHT) + bookmark_bar_attached_vertical_margin; } @@ -33,13 +33,13 @@ index bba403a7e5068..e6cba4e30c0a0 100644 GetLayoutConstant(TAB_STRIP_PADDING); case TAB_STRIP_PADDING: - return features::IsChromeRefresh2023() ? 6 : 0; -+ return Th24State() ? 0 : 6; ++ return IsThorium2024() ? 0 : 6; + case TAB_MARGIN: -+ return Th24State() ? 6 : GetLayoutConstant(TAB_STRIP_PADDING); ++ return IsThorium2024() ? 6 : GetLayoutConstant(TAB_STRIP_PADDING); + case TAB_INACTIVE_PADDING: -+ return Th24State() ? 3 : 6; ++ return IsThorium2024() ? 3 : 6; + case TAB_SEARCH_PADDING: -+ return Th24State() ? 4 : 0; ++ return IsThorium2024() ? 4 : 0; case TAB_SEPARATOR_HEIGHT: // TODO (crbug.com/1451400): ChromeRefresh2023 needs different values for // this constant. @@ -48,14 +48,14 @@ index bba403a7e5068..e6cba4e30c0a0 100644 return 1; case TOOLBAR_DIVIDER_HEIGHT: - return touch_ui ? 20 : 16; -+ if (Th24State()) { ++ if (IsThorium2024()) { + return 20; + } else { + return touch_ui ? 20 : 16; + } case TOOLBAR_DIVIDER_SPACING: - return 9; -+ return Th24State() ? 8 : 9; ++ return IsThorium2024() ? 8 : 9; case TOOLBAR_DIVIDER_WIDTH: return 2; case TOOLBAR_ELEMENT_PADDING: @@ -64,7 +64,7 @@ index bba403a7e5068..e6cba4e30c0a0 100644 } case TOOLBAR_STANDARD_SPACING: - if (features::IsChromeRefresh2023()) { -+ if (features::IsChromeRefresh2023() && !Th24State()) { ++ if (features::IsChromeRefresh2023() && !IsThorium2024()) { return touch_ui ? 12 : 9; } else { return touch_ui ? 12 : 8; @@ -73,7 +73,7 @@ index bba403a7e5068..e6cba4e30c0a0 100644 return features::IsChromeRefresh2023() ? 20 : 16; case TOOLBAR_CORNER_RADIUS: - return 8; -+ return Th24State() ? 0 : 2; ++ return IsThorium2024() ? 0 : 2; default: break; } @@ -152,9 +152,9 @@ index aa9cd30374311..5d5a40f92f922 100644 - return 10; + static const bool rectangular_tabs = + base::CommandLine::ForCurrentProcess()->HasSwitch("rectangular-tabs"); -+ if (Th24State() && !rectangular_tabs) { ++ if (IsThorium2024() && !rectangular_tabs) { + return 8; -+ } else if ((rectangular_tabs && Th24State()) || (rectangular_tabs && !Th24State())) { ++ } else if ((rectangular_tabs && IsThorium2024()) || (rectangular_tabs && !IsThorium2024())) { + return 3; + } else { + return 10; @@ -165,9 +165,9 @@ index aa9cd30374311..5d5a40f92f922 100644 - return 12; + static const bool rectangular_tabs = + base::CommandLine::ForCurrentProcess()->HasSwitch("rectangular-tabs"); -+ if (Th24State() && !rectangular_tabs) { ++ if (IsThorium2024() && !rectangular_tabs) { + return 10; -+ } else if ((rectangular_tabs && Th24State()) || (rectangular_tabs && !Th24State())) { ++ } else if ((rectangular_tabs && IsThorium2024()) || (rectangular_tabs && !IsThorium2024())) { + return 3; + } else { + return 12; @@ -181,7 +181,7 @@ index aa9cd30374311..5d5a40f92f922 100644 gfx::Size ChromeRefresh2023TabStyle::GetSeparatorSize() const { - return gfx::Size(kChromeRefreshSeparatorThickness, - kChromeRefreshSeparatorHeight); -+ if (Th24State()) { ++ if (IsThorium2024()) { + return gfx::Size(kThoriumSeparatorThickness, + kThoriumSeparatorHeight); + } else { @@ -196,7 +196,7 @@ index aa9cd30374311..5d5a40f92f922 100644 - GetBottomCornerRadius() + kChromeRefreshTabHorizontalPadding, - kChromeRefreshTabVerticalPadding + GetLayoutConstant(TAB_STRIP_PADDING), - GetBottomCornerRadius() + kChromeRefreshTabHorizontalPadding); -+ if (Th24State()) { ++ if (IsThorium2024()) { + return gfx::Insets::TLBR( + kThoriumTabVerticalPadding + GetLayoutConstant(TAB_STRIP_PADDING), + GetBottomCornerRadius() + kThoriumTabHorizontalPadding, @@ -216,7 +216,7 @@ index aa9cd30374311..5d5a40f92f922 100644 - kChromeRefreshSeparatorHorizontalMargin, - GetLayoutConstant(TAB_STRIP_PADDING), - kChromeRefreshSeparatorHorizontalMargin); -+ if (Th24State()) { ++ if (IsThorium2024()) { + return gfx::Insets::TLBR(GetLayoutConstant(TAB_INACTIVE_PADDING), + kThoriumSeparatorHorizontalMargin, + GetLayoutConstant(TAB_INACTIVE_PADDING), @@ -341,15 +341,15 @@ index 83c7f06f1b236..576150ff56af4 100644 menu_horizontal_border_size = 0; submenu_horizontal_overlap = 0; - item_vertical_margin = 6; -+ item_vertical_margin = Th24State() ? 4 : 6; ++ item_vertical_margin = IsThorium2024() ? 4 : 6; item_horizontal_border_padding = 12; arrow_size = 16; - separator_height = 17; - separator_spacing_height = 4; - use_outer_border = false; -+ separator_height = Th24State() ? 11 : 17; -+ separator_spacing_height = Th24State() ? 3 : 4; -+ use_outer_border = Th24State() ? true : false; ++ separator_height = IsThorium2024() ? 11 : 17; ++ separator_spacing_height = IsThorium2024() ? 3 : 4; ++ use_outer_border = IsThorium2024() ? true : false; } // static @@ -376,7 +376,7 @@ index 3684e27766834..d62fe3f96ab62 100644 int LayoutProvider::GetCornerRadiusMetric(ShapeContextTokens id, const gfx::Size& size) const { + -+ if (Th24State()) { ++ if (IsThorium2024()) { + switch (id) { + case ShapeContextTokens::kBadgeRadius: + return 4; diff --git a/src/chrome/browser/ui/thorium_2024.h b/src/chrome/browser/ui/thorium_2024.h index efce7e3d9..36dae99b9 100644 --- a/src/chrome/browser/ui/thorium_2024.h +++ b/src/chrome/browser/ui/thorium_2024.h @@ -8,10 +8,6 @@ #include "base/command_line.h" #include "ui/base/ui_base_features.h" -static bool Th24State() { - static const bool chrome_2024 = features::IsChromeRefresh2023(); - static const bool thorium_2024 = base::CommandLine::ForCurrentProcess()->HasSwitch("thorium-2024"); - return thorium_2024 && chrome_2024; -} +static const bool thor24 = features::IsThorium2024(); #endif // CHROME_BROWSER_UI_THORIUM_2024_UI_H_ diff --git a/src/ui/base/ui_base_features.cc b/src/ui/base/ui_base_features.cc index 766acff73..4d067c825 100644 --- a/src/ui/base/ui_base_features.cc +++ b/src/ui/base/ui_base_features.cc @@ -520,6 +520,15 @@ bool IsChromeWebuiRefresh2023() { base::FeatureList::IsEnabled(kChromeRefreshSecondary2023); } +BASE_FEATURE(kThorium2024 + "Thorium2024", + base::FEATURE_DISABLED_BY_DEFAULT); + +bool IsThorium2024() { + return IsChromeRefresh2023() && + base::FeatureList::IsEnabled(kThorium2024); +} + BASE_FEATURE(kBubbleMetricsApi, "BubbleMetricsApi", base::FEATURE_DISABLED_BY_DEFAULT); diff --git a/src/ui/base/ui_base_features.h b/src/ui/base/ui_base_features.h new file mode 100644 index 000000000..97132e02e --- /dev/null +++ b/src/ui/base/ui_base_features.h @@ -0,0 +1,266 @@ +// Copyright 2024 The Chromium Authors and Alex313031 +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef UI_BASE_UI_BASE_FEATURES_H_ +#define UI_BASE_UI_BASE_FEATURES_H_ + +#include "base/component_export.h" +#include "base/feature_list.h" +#include "base/metrics/field_trial_params.h" +#include "build/build_config.h" +#include "build/chromeos_buildflags.h" +#include "ui/base/buildflags.h" + +namespace features { + +// Keep sorted! + +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kExperimentalFlingAnimation); +COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kFocusFollowsCursor); +#if BUILDFLAG(IS_CHROMEOS_ASH) +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kSettingsShowsPerKeyboardSettings); +#endif // BUILDFLAG(IS_CHROMEOS_ASH) +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kInputMethodSettingsUiUpdate); +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kWindowsScrollingPersonality); +COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsPercentBasedScrollingEnabled(); +COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kSystemCaptionStyle); +COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kSystemKeyboardLock); +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kUiCompositorScrollWithLayers); + +COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsUiGpuRasterizationEnabled(); + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID) +COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kElasticOverscroll); +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_WIN) +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kApplyNativeOccludedRegionToWindowTracker); +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kCalculateNativeWinOcclusion); +COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kPointerEventsForTouch); +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kScreenPowerListenerForNativeWinOcclusion); + +// Returns true if the system should use WM_POINTER events for touch events. +COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsUsingWMPointerForTouch(); +#endif // BUILDFLAG(IS_WIN) + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_LACROS) +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kApplyNativeOcclusionToCompositor); +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kAlwaysTrackNativeWindowOcclusionForTest); +COMPONENT_EXPORT(UI_BASE_FEATURES) +extern const base::FeatureParam + kApplyNativeOcclusionToCompositorType; +COMPONENT_EXPORT(UI_BASE_FEATURES) +extern const char kApplyNativeOcclusionToCompositorTypeRelease[]; +COMPONENT_EXPORT(UI_BASE_FEATURES) +extern const char kApplyNativeOcclusionToCompositorTypeThrottle[]; +COMPONENT_EXPORT(UI_BASE_FEATURES) +extern const char kApplyNativeOcclusionToCompositorTypeThrottleAndRelease[]; +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS_LACROS) + +#if BUILDFLAG(IS_CHROMEOS) +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kImprovedKeyboardShortcuts); +COMPONENT_EXPORT(UI_BASE_FEATURES) +bool IsImprovedKeyboardShortcutsEnabled(); +#endif // BUILDFLAG(IS_CHROMEOS) + +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kTouchTextEditingRedesign); +COMPONENT_EXPORT(UI_BASE_FEATURES) +bool IsTouchTextEditingRedesignEnabled(); + +// Used to enable forced colors mode for web content. +COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kForcedColors); +COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsForcedColorsEnabled(); + +// Used to enable the eye-dropper in the refresh color-picker. +COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kEyeDropper); +// TODO(https://crbug.com/329678163): This flag should be removed. +COMPONENT_EXPORT(UI_BASE_FEATURES) extern const char kEyeDropperNotSupported[]; +COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsEyeDropperEnabled(); + +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kSystemCursorSizeSupported); +COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsSystemCursorSizeSupported(); + +// Used to enable keyboard accessible tooltips in in-page content +// (i.e., inside Blink). See +// ::views::features::kKeyboardAccessibleTooltipInViews for +// keyboard-accessible tooltips in Views UI. +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kKeyboardAccessibleTooltip); +COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsKeyboardAccessibleTooltipEnabled(); + +// Used to enable gesture changes for notifications. +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kNotificationGesturesUpdate); +COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsNotificationGesturesUpdateEnabled(); + +#if BUILDFLAG(IS_CHROMEOS_ASH) +COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kDeprecateAltClick); + +COMPONENT_EXPORT(UI_BASE_FEATURES) +bool IsDeprecateAltClickEnabled(); + +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kNotificationsIgnoreRequireInteraction); + +COMPONENT_EXPORT(UI_BASE_FEATURES) +bool IsNotificationsIgnoreRequireInteractionEnabled(); + +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kShortcutCustomization); + +COMPONENT_EXPORT(UI_BASE_FEATURES) +bool IsShortcutCustomizationEnabled(); + +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kLacrosResourcesFileSharing); + +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kSupportF11AndF12KeyShortcuts); + +COMPONENT_EXPORT(UI_BASE_FEATURES) bool AreF11AndF12ShortcutsEnabled(); +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + +#if BUILDFLAG(IS_OZONE) +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kOzoneBubblesUsePlatformWidgets); +#endif // BUILDFLAG(IS_OZONE) + +// Indicates whether DrmOverlayManager should used the synchronous API to +// perform pageflip tests. +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kSynchronousPageFlipTesting); + +COMPONENT_EXPORT(UI_BASE_FEATURES) +bool IsSynchronousPageFlipTestingEnabled(); + +// The type of predictor to use for the resampling events. These values are +// used as the 'predictor' feature param for +// |blink::features::kResamplingScrollEvents|. +COMPONENT_EXPORT(UI_BASE_FEATURES) extern const char kPredictorNameLsq[]; +COMPONENT_EXPORT(UI_BASE_FEATURES) extern const char kPredictorNameKalman[]; +COMPONENT_EXPORT(UI_BASE_FEATURES) +extern const char kPredictorNameLinearFirst[]; +COMPONENT_EXPORT(UI_BASE_FEATURES) +extern const char kPredictorNameLinearSecond[]; +COMPONENT_EXPORT(UI_BASE_FEATURES) +extern const char kPredictorNameLinearResampling[]; +COMPONENT_EXPORT(UI_BASE_FEATURES) extern const char kPredictorNameEmpty[]; + +// Enables resampling of scroll events using an experimental latency of +3.3ms +// instead of the original -5ms. +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kResamplingScrollEventsExperimentalPrediction); + +// The type of prediction used. TimeBased uses a fixed timing, FramesBased uses +// a ratio of the vsync refresh rate. The timing/ratio can be changed on the +// command line through a `latency` param. +COMPONENT_EXPORT(UI_BASE_FEATURES) extern const char kPredictionTypeTimeBased[]; +COMPONENT_EXPORT(UI_BASE_FEATURES) +extern const char kPredictionTypeFramesBased[]; +// The default values for `latency` +COMPONENT_EXPORT(UI_BASE_FEATURES) +extern const char kPredictionTypeDefaultTime[]; +COMPONENT_EXPORT(UI_BASE_FEATURES) +extern const char kPredictionTypeDefaultFramesRatio[]; + +// The type of filter to use for filtering events. These values are used as the +// 'filter' feature param for |blink::features::kFilteringScrollPrediction|. +COMPONENT_EXPORT(UI_BASE_FEATURES) extern const char kFilterNameEmpty[]; +COMPONENT_EXPORT(UI_BASE_FEATURES) extern const char kFilterNameOneEuro[]; + +// Android only feature, for swipe to move cursor. +COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kSwipeToMoveCursor); + +// Enables UI debugging tools such as shortcuts. +COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kUIDebugTools); + +COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsSwipeToMoveCursorEnabled(); + +// Enables Raw Draw. +COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kRawDraw); +COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsUsingRawDraw(); +COMPONENT_EXPORT(UI_BASE_FEATURES) double RawDrawTileSizeFactor(); +COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsRawDrawUsingMSAA(); + +COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kStylusSpecificTapSlop); + +// This feature indicates that this device is approved for utilizing variable +// refresh rates. This flag is added by cros-config and not exposed in the +// chrome://flags UI. +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kVariableRefreshRateAvailable); +// Enables the variable refresh rate feature for Borealis gaming only. If this +// flag is set by Finch, it requires the availability flag to also be true. If +// this flag is overridden by the user, then the availability flag is ignored. +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kEnableVariableRefreshRate); +// This feature indicates that this device should have variable refresh rates +// enabled by default if available. This overrides the default value of +// |kEnableVariableRefreshRate|. This flag is added by USE and not exposed in +// the chrome://flags UI. +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kVariableRefreshRateDefaultEnabled); +COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsVariableRefreshRateEnabled(); +// Enables the variable refresh rate feature at all times. +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kEnableVariableRefreshRateAlwaysOn); +COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsVariableRefreshRateAlwaysOn(); + +COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kLacrosColorManagement); +COMPONENT_EXPORT(UI_BASE_FEATURES) +bool IsLacrosColorManagementEnabled(); + +// Exposed for testing and flags integration. For actual checks please use +// IsChromeRefresh2023(). +COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kChromeRefresh2023); +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kChromeRefreshSecondary2023); + +COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsChromeRefresh2023(); + +COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsChromeWebuiRefresh2023(); + +// Used to revert some stupid UI decisions for Cr23 +COMPONENT_EXPORT(UI_BASE_FEATURES) BASE_DECLARE_FEATURE(kThorium2024); +COMPONENT_EXPORT(UI_BASE_FEATURES) bool IsThorium2024(); + +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kBubbleMetricsApi); + +#if BUILDFLAG(IS_APPLE) +// Font Smoothing, a CoreText technique, simulates optical sizes to enhance text +// readability at smaller scales. In practice, it leads to an increased +// perception of text weight, creating discrepancies between renderings in UX +// design tools and actual macOS displays. This feature is only effective when +// ChromeRefresh2023 is enabled. +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kCr2023MacFontSmoothing); +#endif // BUILDFLAG(IS_APPLE) + +#if BUILDFLAG(IS_WIN) +// Use font settings for contrast and gamma as specified in system settings. +// If not set, these values fall back to the pre-defined Skia defaults. +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kUseGammaContrastRegistrySettings); +#endif // BUILDFLAG(IS_WIN) + +COMPONENT_EXPORT(UI_BASE_FEATURES) +BASE_DECLARE_FEATURE(kBubbleFrameViewTitleIsHeading); + +} // namespace features + +#endif // UI_BASE_UI_BASE_FEATURES_H_