#include "ui/base/ui_base_features.h"
#include <stdlib.h>
#include "base/command_line.h"
#include "base/feature_list.h"
#include "base/metrics/field_trial_params.h"
#include "build/build_config.h"
#if BUILDFLAG(IS_ANDROID)
#include "base/android/android_info.h"
#endif
#if BUILDFLAG(IS_CHROMEOS)
#include "ui/base/shortcut_mapping_pref_delegate.h"
#endif
namespace features {
BASE_FEATURE(kSendEmptyGestureScrollUpdate,
#if BUILDFLAG(IS_ANDROID)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
BASE_FEATURE_PARAM(bool,
kSendEmptyGestureScrollUpdateFilterOutEmptyUpdates,
&kSendEmptyGestureScrollUpdate,
"filter_out_empty_updates",
false);
#if BUILDFLAG(IS_WIN)
BASE_FEATURE(kCalculateNativeWinOcclusion, base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kApplyNativeOcclusionToCompositor,
base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kAlwaysTrackNativeWindowOcclusionForTest,
base::FEATURE_DISABLED_BY_DEFAULT);
const base::FeatureParam<std::string> kApplyNativeOcclusionToCompositorType{
&kApplyNativeOcclusionToCompositor, "type", ""};
const char kApplyNativeOcclusionToCompositorTypeRelease[] = "release";
const char kApplyNativeOcclusionToCompositorTypeThrottle[] = "throttle";
const char kApplyNativeOcclusionToCompositorTypeThrottleAndRelease[] =
"throttle_and_release";
#endif
#if BUILDFLAG(IS_CHROMEOS)
BASE_FEATURE(kSettingsShowsPerKeyboardSettings,
"InputMethodIntegratedSettings",
base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kDeprecateAltClick, base::FEATURE_DISABLED_BY_DEFAULT);
bool IsDeprecateAltClickEnabled() {
return base::FeatureList::IsEnabled(kDeprecateAltClick);
}
BASE_FEATURE(kNotificationsIgnoreRequireInteraction,
base::FEATURE_ENABLED_BY_DEFAULT);
bool IsNotificationsIgnoreRequireInteractionEnabled() {
return base::FeatureList::IsEnabled(kNotificationsIgnoreRequireInteraction);
}
BASE_FEATURE(kSupportF11AndF12KeyShortcuts, base::FEATURE_ENABLED_BY_DEFAULT);
bool AreF11AndF12ShortcutsEnabled() {
if (::ui::ShortcutMappingPrefDelegate::IsInitialized()) {
::ui::ShortcutMappingPrefDelegate* instance =
::ui::ShortcutMappingPrefDelegate::GetInstance();
if (instance && instance->IsDeviceEnterpriseManaged()) {
return instance->IsI18nShortcutPrefEnabled() &&
base::FeatureList::IsEnabled(
features::kSupportF11AndF12KeyShortcuts);
}
}
return base::FeatureList::IsEnabled(features::kSupportF11AndF12KeyShortcuts);
}
#endif
#if BUILDFLAG(IS_OZONE)
BASE_FEATURE(kOzoneBubblesUsePlatformWidgets, base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kWaylandLinuxDrmSyncobj, base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kWaylandPerSurfaceScale,
#if BUILDFLAG(IS_LINUX)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
BASE_FEATURE(kWaylandTextInputV3, base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kWaylandSessionManagement, base::FEATURE_DISABLED_BY_DEFAULT);
#endif
BASE_FEATURE(kSystemCursorSizeSupported,
#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(kUseCursorEventHook, base::FEATURE_DISABLED_BY_DEFAULT);
bool ShouldUseCursorEventHook() {
return base::FeatureList::IsEnabled(kUseCursorEventHook);
}
BASE_FEATURE(kSystemKeyboardLock, base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kUiGpuRasterization, base::FEATURE_ENABLED_BY_DEFAULT);
bool IsUiGpuRasterizationEnabled() {
return base::FeatureList::IsEnabled(kUiGpuRasterization);
}
BASE_FEATURE(kUiCompositorScrollWithLayers,
#if BUILDFLAG(IS_APPLE)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
BASE_FEATURE(kUiCompositorUsesLayerLists, base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kExperimentalFlingAnimation,
#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
#if !BUILDFLAG(IS_APPLE)|| BUILDFLAG(ARKWEB_INPUT_EVENTS)
BASE_FEATURE(kElasticOverscroll,
#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(ARKWEB_INPUT_EVENTS)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
#endif
BASE_FEATURE(kLimitScrollDeltaToScrollerSize, base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kFocusFollowsCursor, base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kDragDropOnlySynthesizeHttpOrHttpsUrlsFromText,
base::FEATURE_ENABLED_BY_DEFAULT);
#if BUILDFLAG(IS_CHROMEOS)
bool IsImprovedKeyboardShortcutsEnabled() {
if (::ui::ShortcutMappingPrefDelegate::IsInitialized()) {
::ui::ShortcutMappingPrefDelegate* instance =
::ui::ShortcutMappingPrefDelegate::GetInstance();
if (instance && instance->IsDeviceEnterpriseManaged()) {
return instance->IsI18nShortcutPrefEnabled();
}
}
return true;
}
#endif
BASE_FEATURE(kTouchTextEditingRedesign,
#if BUILDFLAG(IS_CHROMEOS)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
bool IsTouchTextEditingRedesignEnabled() {
return base::FeatureList::IsEnabled(kTouchTextEditingRedesign);
}
BASE_FEATURE(kTouchDragAndDrop,
#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN) || BUILDFLAG(ARKWEB_DRAG_DROP)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
bool IsTouchDragAndDropEnabled() {
static const bool touch_drag_and_drop_enabled =
base::FeatureList::IsEnabled(kTouchDragAndDrop);
return touch_drag_and_drop_enabled;
}
BASE_FEATURE(kForcedColors, 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,
#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ARKWEB)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
bool IsEyeDropperEnabled() {
return base::FeatureList::IsEnabled(features::kEyeDropper);
}
BASE_FEATURE(kKeyboardAccessibleTooltip, base::FEATURE_DISABLED_BY_DEFAULT);
bool IsKeyboardAccessibleTooltipEnabled() {
static const bool keyboard_accessible_tooltip_enabled =
base::FeatureList::IsEnabled(features::kKeyboardAccessibleTooltip);
return keyboard_accessible_tooltip_enabled;
}
BASE_FEATURE(kSynchronousPageFlipTesting, base::FEATURE_ENABLED_BY_DEFAULT);
bool IsSynchronousPageFlipTestingEnabled() {
return base::FeatureList::IsEnabled(kSynchronousPageFlipTesting);
}
BASE_FEATURE(kResamplingScrollEventsExperimentalPrediction,
base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kResampleScrollEventsLatency, base::FEATURE_DISABLED_BY_DEFAULT);
const char kResampleLatencyModeFixedMs[] = "fixed_ms";
const char kResampleLatencyModeFractional[] = "fractional";
const base::FeatureParam<std::string> kResampleLatencyModeParam(
&kResampleScrollEventsLatency,
"mode",
kResampleLatencyModeFixedMs);
const base::FeatureParam<double>
kResampleLatencyValueParam(&kResampleScrollEventsLatency, "value", -5.0);
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 kPredictionTypeFramesBased[] = "frames";
const char kPredictionTypeDefaultFramesVariation1[] = "0.25";
const char kPredictionTypeDefaultFramesVariation2[] = "0.375";
const char kPredictionTypeDefaultFramesVariation3[] = "0.5";
BASE_FEATURE(kSwipeToMoveCursor, 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::android_info::sdk_int() >=
base::android::android_info::SDK_VERSION_R;
#else
base::FeatureList::IsEnabled(kSwipeToMoveCursor) ||
IsTouchTextEditingRedesignEnabled();
#endif
return enabled;
}
BASE_FEATURE(kRawDraw, 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();
}
BASE_FEATURE(kVariableRefreshRateAvailable, base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kEnableVariableRefreshRate, base::FEATURE_DISABLED_BY_DEFAULT);
bool IsVariableRefreshRateEnabled() {
if (base::FeatureList::IsEnabled(kEnableVariableRefreshRateAlwaysOn)) {
return true;
}
if (!(base::FeatureList::GetInstance() &&
base::FeatureList::GetInstance()->IsFeatureOverridden(
kEnableVariableRefreshRate.name)) &&
base::FeatureList::IsEnabled(kVariableRefreshRateAvailable)) {
return true;
}
return base::FeatureList::IsEnabled(kEnableVariableRefreshRate);
}
BASE_FEATURE(kEnableVariableRefreshRateAlwaysOn,
base::FEATURE_DISABLED_BY_DEFAULT);
bool IsVariableRefreshRateAlwaysOn() {
return base::FeatureList::IsEnabled(kEnableVariableRefreshRateAlwaysOn);
}
BASE_FEATURE(kBubbleMetricsApi, base::FEATURE_DISABLED_BY_DEFAULT);
#if BUILDFLAG(IS_WIN)
BASE_FEATURE(kUseGammaContrastRegistrySettings,
base::FEATURE_ENABLED_BY_DEFAULT);
#endif
BASE_FEATURE(kBubbleFrameViewTitleIsHeading, base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kEnableGestureBeginEndTypes,
#if !BUILDFLAG(IS_CHROMEOS)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
BASE_FEATURE(kUseUtf8EncodingForSvgImage, base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kWriteBookmarkWithoutTitle, base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kAsyncFullscreenWindowState, base::FEATURE_DISABLED_BY_DEFAULT);
BASE_FEATURE(kPlatformClipboardMonitor, base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kEnablePixelCanvasRecording,
"enable-pixel-canvas-recording",
#if BUILDFLAG(IS_CHROMEOS)
base::FEATURE_ENABLED_BY_DEFAULT
#else
base::FEATURE_DISABLED_BY_DEFAULT
#endif
);
bool IsPixelCanvasRecordingEnabled() {
return base::FeatureList::IsEnabled(features::kEnablePixelCanvasRecording);
}
BASE_FEATURE(kHandleIMESpanChangesOnUpdateComposition,
base::FEATURE_ENABLED_BY_DEFAULT);
bool IsHandleIMESpanChangesOnUpdateCompositionEnabled() {
return base::FeatureList::IsEnabled(
features::kHandleIMESpanChangesOnUpdateComposition);
}
BASE_FEATURE(kUseSystemDefaultAccentColors, base::FEATURE_ENABLED_BY_DEFAULT);
BASE_FEATURE(kStringWidthCache, base::FEATURE_DISABLED_BY_DEFAULT);
}