#include "ui/base/ui_base_features.h"
#include <stdlib.h>
#include "base/feature_list.h"
#include "base/metrics/field_trial_params.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#if BUILDFLAG(IS_ANDROID)
#include "base/android/build_info.h"
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "ui/base/shortcut_mapping_pref_delegate.h"
#endif
namespace features {
#if BUILDFLAG(IS_WIN)
BASE_FEATURE(kApplyNativeOccludedRegionToWindowTracker,
"ApplyNativeOccludedRegionToWindowTracker",
base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kApplyNativeOcclusionToCompositor,
"ApplyNativeOcclusionToCompositor",
base::FEATURE_DISABLED_BY_DEFAULT);
const char kApplyNativeOcclusionToCompositorType[] = "type";
const char kApplyNativeOcclusionToCompositorTypeRelease[] = "release";
const char kApplyNativeOcclusionToCompositorTypeThrottle[] = "throttle";
BASE_FEATURE(kCalculateNativeWinOcclusion,
"CalculateNativeWinOcclusion",
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kScreenPowerListenerForNativeWinOcclusion,
"ScreenPowerListenerForNativeWinOcclusion",
base::FEATURE_ENABLED_BY_DEFAULT);
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
BASE_FEATURE(kSettingsShowsPerKeyboardSettings,
"InputMethodIntegratedSettings",
base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kNewShortcutMapping,
"NewShortcutMapping",
base::FEATURE_DISABLED_BY_DEFAULT);
bool IsNewShortcutMappingEnabled() {
return !IsImprovedKeyboardShortcutsEnabled() &&
base::FeatureList::IsEnabled(kNewShortcutMapping);
}
BASE_FEATURE(kDeprecateAltClick,
"DeprecateAltClick",
base::FEATURE_DISABLED_BY_DEFAULT);
bool IsDeprecateAltClickEnabled() {
return base::FeatureList::IsEnabled(kDeprecateAltClick);
}
BASE_FEATURE(kShortcutCustomizationApp,
"ShortcutCustomizationApp",
base::FEATURE_DISABLED_BY_DEFAULT);
bool IsShortcutCustomizationAppEnabled() {
return base::FeatureList::IsEnabled(kShortcutCustomizationApp);
}
BASE_FEATURE(kShortcutCustomization,
"ShortcutCustomization",
base::FEATURE_DISABLED_BY_DEFAULT);
bool IsShortcutCustomizationEnabled() {
return base::FeatureList::IsEnabled(kShortcutCustomization);
}
BASE_FEATURE(kLacrosResourcesFileSharing,
"LacrosResourcesFileSharing",
base::FEATURE_DISABLED_BY_DEFAULT);
#endif
BASE_FEATURE(kInputMethodSettingsUiUpdate,
"InputMethodSettingsUiUpdate",
base::FEATURE_DISABLED_BY_DEFAULT);
const enum base::FeatureState kWindowsScrollingPersonalityDefaultStatus =
base::FEATURE_DISABLED_BY_DEFAULT;
static_assert(!BUILDFLAG(IS_MAC) ||
(BUILDFLAG(IS_MAC) &&
kWindowsScrollingPersonalityDefaultStatus ==
base::FEATURE_DISABLED_BY_DEFAULT),
"Do not enable this on the Mac. The animation does not match the "
"system scroll animation curve to such an extent that it makes "
"Chromium stand out in a bad way.");
BASE_FEATURE(kWindowsScrollingPersonality,
"WindowsScrollingPersonality",
kWindowsScrollingPersonalityDefaultStatus);
bool IsPercentBasedScrollingEnabled() {
return base::FeatureList::IsEnabled(features::kWindowsScrollingPersonality);
}
BASE_FEATURE(kStylusSpecificTapSlop,
"StylusSpecificTapSlop",
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kSystemCaptionStyle,
"SystemCaptionStyle",
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kSystemCursorSizeSupported,
"SystemCursorSizeSupported",
#if BUILDFLAG(IS_WIN)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
bool IsSystemCursorSizeSupported() {
return base::FeatureList::IsEnabled(kSystemCursorSizeSupported);
}
BASE_FEATURE(kSystemKeyboardLock,
"SystemKeyboardLock",
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kUiGpuRasterization,
"UiGpuRasterization",
#if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_CHROMEOS_ASH) || \
BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_CHROMEOS_LACROS)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
bool IsUiGpuRasterizationEnabled() {
return base::FeatureList::IsEnabled(kUiGpuRasterization);
}
BASE_FEATURE(kUiCompositorScrollWithLayers,
"UiCompositorScrollWithLayers",
#if BUILDFLAG(IS_APPLE)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
BASE_FEATURE(kExperimentalFlingAnimation,
"ExperimentalFlingAnimation",
#if BUILDFLAG(IS_WIN) || \
(BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS_ASH) && \
!BUILDFLAG(IS_CHROMEOS_LACROS))
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN)
BASE_FEATURE(kElasticOverscroll,
"ElasticOverscroll",
#if BUILDFLAG(IS_ANDROID)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
#endif
BASE_FEATURE(kFocusFollowsCursor,
"FocusFollowsCursor",
base::FEATURE_DISABLED_BY_DEFAULT);
#if BUILDFLAG(IS_WIN)
BASE_FEATURE(kInputPaneOnScreenKeyboard,
"InputPaneOnScreenKeyboard",
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kPointerEventsForTouch,
"PointerEventsForTouch",
base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kTSFImeSupport, "TSFImeSupport", base::FEATURE_ENABLED_BY_DEFAULT);
bool IsUsingWMPointerForTouch() {
return base::FeatureList::IsEnabled(kPointerEventsForTouch);
}
#endif
#if BUILDFLAG(IS_CHROMEOS)
BASE_FEATURE(kImprovedKeyboardShortcuts,
"ImprovedKeyboardShortcuts",
base::FEATURE_ENABLED_BY_DEFAULT);
bool IsImprovedKeyboardShortcutsEnabled() {
#if BUILDFLAG(IS_CHROMEOS_ASH)
if (::ui::ShortcutMappingPrefDelegate::IsInitialized()) {
::ui::ShortcutMappingPrefDelegate* instance =
::ui::ShortcutMappingPrefDelegate::GetInstance();
if (instance && instance->IsDeviceEnterpriseManaged()) {
return instance->IsI18nShortcutPrefEnabled();
}
}
#endif
return base::FeatureList::IsEnabled(kImprovedKeyboardShortcuts);
}
BASE_FEATURE(kDeprecateAltBasedSixPack,
"DeprecateAltBasedSixPack",
base::FEATURE_DISABLED_BY_DEFAULT);
bool IsDeprecateAltBasedSixPackEnabled() {
return base::FeatureList::IsEnabled(kDeprecateAltBasedSixPack);
}
#endif
BASE_FEATURE(kTouchTextEditingRedesign,
"TouchTextEditingRedesign",
base::FEATURE_DISABLED_BY_DEFAULT);
bool IsTouchTextEditingRedesignEnabled() {
return base::FeatureList::IsEnabled(kTouchTextEditingRedesign);
}
BASE_FEATURE(kForcedColors, "ForcedColors", base::FEATURE_ENABLED_BY_DEFAULT);
bool IsForcedColorsEnabled() {
static const bool forced_colors_enabled =
base::FeatureList::IsEnabled(features::kForcedColors);
return forced_colors_enabled;
}
BASE_FEATURE(kEyeDropper,
"EyeDropper",
#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
bool IsEyeDropperEnabled() {
return base::FeatureList::IsEnabled(features::kEyeDropper);
}
BASE_FEATURE(kUseCommonSelectPopup,
"UseCommonSelectPopup",
base::FEATURE_DISABLED_BY_DEFAULT);
bool IsUseCommonSelectPopupEnabled() {
return base::FeatureList::IsEnabled(features::kUseCommonSelectPopup);
}
BASE_FEATURE(kKeyboardAccessibleTooltip,
"KeyboardAccessibleTooltip",
base::FEATURE_DISABLED_BY_DEFAULT);
bool IsKeyboardAccessibleTooltipEnabled() {
static const bool keyboard_accessible_tooltip_enabled =
base::FeatureList::IsEnabled(features::kKeyboardAccessibleTooltip);
return keyboard_accessible_tooltip_enabled;
}
#if BUILDFLAG(IS_CHROMEOS_ASH)
BASE_FEATURE(kHandwritingGesture,
"HandwritingGesture",
base::FEATURE_ENABLED_BY_DEFAULT);
#endif
BASE_FEATURE(kSynchronousPageFlipTesting,
"SynchronousPageFlipTesting",
base::FEATURE_ENABLED_BY_DEFAULT);
bool IsSynchronousPageFlipTestingEnabled() {
return base::FeatureList::IsEnabled(kSynchronousPageFlipTesting);
}
BASE_FEATURE(kResamplingScrollEventsExperimentalPrediction,
"ResamplingScrollEventsExperimentalPrediction",
base::FEATURE_DISABLED_BY_DEFAULT);
const char kPredictorNameLsq[] = "lsq";
const char kPredictorNameKalman[] = "kalman";
const char kPredictorNameLinearFirst[] = "linear_first";
const char kPredictorNameLinearSecond[] = "linear_second";
const char kPredictorNameLinearResampling[] = "linear_resampling";
const char kPredictorNameEmpty[] = "empty";
const char kFilterNameEmpty[] = "empty_filter";
const char kFilterNameOneEuro[] = "one_euro_filter";
const char kPredictionTypeTimeBased[] = "time";
const char kPredictionTypeFramesBased[] = "frames";
const char kPredictionTypeDefaultTime[] = "3.3";
const char kPredictionTypeDefaultFramesRatio[] = "0.5";
BASE_FEATURE(kSwipeToMoveCursor,
"SwipeToMoveCursor",
base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kUIDebugTools,
"ui-debug-tools",
base::FEATURE_DISABLED_BY_DEFAULT);
bool IsSwipeToMoveCursorEnabled() {
static const bool enabled =
#if BUILDFLAG(IS_ANDROID)
base::android::BuildInfo::GetInstance()->sdk_int() >=
base::android::SDK_VERSION_R;
#else
base::FeatureList::IsEnabled(kSwipeToMoveCursor);
#endif
return enabled;
}
BASE_FEATURE(kRawDraw, "RawDraw", base::FEATURE_DISABLED_BY_DEFAULT);
const base::FeatureParam<double> kRawDrawTileSizeFactor{&kRawDraw,
"TileSizeFactor", 1};
const base::FeatureParam<bool> kIsRawDrawUsingMSAA{&kRawDraw, "IsUsingMSAA",
false};
bool IsUsingRawDraw() {
return base::FeatureList::IsEnabled(kRawDraw);
}
double RawDrawTileSizeFactor() {
return kRawDrawTileSizeFactor.Get();
}
bool IsRawDrawUsingMSAA() {
return kIsRawDrawUsingMSAA.Get();
}
#if BUILDFLAG(IS_ANDROID)
BASE_FEATURE(kUseToastManager,
"UseToastManager",
base::FEATURE_ENABLED_BY_DEFAULT);
bool UseToastManager() {
return base::FeatureList::IsEnabled(kUseToastManager);
}
BASE_FEATURE(kKeepAndroidTintedResources,
"KeepAndroidTintedResources",
base::FEATURE_DISABLED_BY_DEFAULT);
#endif
BASE_FEATURE(kEnableVariableRefreshRate,
"EnableVariableRefreshRate",
base::FEATURE_DISABLED_BY_DEFAULT);
bool IsVariableRefreshRateEnabled() {
return base::FeatureList::IsEnabled(kEnableVariableRefreshRate);
}
BASE_FEATURE(kWaylandScreenCoordinatesEnabled,
"WaylandScreenCoordinatesEnabled",
#if BUILDFLAG(IS_CHROMEOS_LACROS)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
bool IsWaylandScreenCoordinatesEnabled() {
return base::FeatureList::IsEnabled(kWaylandScreenCoordinatesEnabled);
}
BASE_FEATURE(kLacrosColorManagement,
"LacrosColorManagement",
base::FEATURE_ENABLED_BY_DEFAULT);
bool IsLacrosColorManagementEnabled() {
return base::FeatureList::IsEnabled(kLacrosColorManagement);
}
BASE_FEATURE(kChromeRefresh2023,
"ChromeRefresh2023",
base::FEATURE_DISABLED_BY_DEFAULT);
bool IsChromeRefresh2023() {
return base::FeatureList::IsEnabled(kChromeRefresh2023);
}
BASE_FEATURE(kChromeWebuiRefresh2023,
"ChromeWebuiRefresh2023",
base::FEATURE_DISABLED_BY_DEFAULT);
bool IsChromeWebuiRefresh2023() {
return IsChromeRefresh2023() &&
base::FeatureList::IsEnabled(kChromeWebuiRefresh2023);
}
constexpr base::FeatureParam<ChromeRefresh2023Level>::Option
kChromeRefresh2023LevelOption[] = {{ChromeRefresh2023Level::kLevel1, "1"},
{ChromeRefresh2023Level::kLevel2, "2"}};
const base::FeatureParam<ChromeRefresh2023Level> kChromeRefresh2023Level(
&kChromeRefresh2023,
"level",
ChromeRefresh2023Level::kLevel2,
&kChromeRefresh2023LevelOption);
ChromeRefresh2023Level GetChromeRefresh2023Level() {
static const ChromeRefresh2023Level level =
IsChromeRefresh2023() ? kChromeRefresh2023Level.Get()
: ChromeRefresh2023Level::kDisabled;
return level;
}
#if !BUILDFLAG(IS_LINUX)
BASE_FEATURE(kWebUiSystemFont,
"WebUiSystemFont",
base::FEATURE_DISABLED_BY_DEFAULT);
#endif
#if BUILDFLAG(IS_APPLE)
BASE_FEATURE(kCr2023MacFontSmoothing,
"Cr2023MacFontSmoothing",
base::FEATURE_ENABLED_BY_DEFAULT);
#endif
BASE_FEATURE(kUseNanosecondsForMotionEvent,
"UseNanosecondsForMotionEvent",
base::FEATURE_ENABLED_BY_DEFAULT);
}