1*6777b538SAndroid Build Coastguard Worker // Copyright 2022 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/features.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include "base/cpu_reduction_experiment.h"
8*6777b538SAndroid Build Coastguard Worker #include "base/task/sequence_manager/sequence_manager_impl.h"
9*6777b538SAndroid Build Coastguard Worker #include "base/threading/platform_thread.h"
10*6777b538SAndroid Build Coastguard Worker #include "build/buildflag.h"
11*6777b538SAndroid Build Coastguard Worker
12*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
13*6777b538SAndroid Build Coastguard Worker #include "base/message_loop/message_pump_libevent.h"
14*6777b538SAndroid Build Coastguard Worker #endif
15*6777b538SAndroid Build Coastguard Worker
16*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE)
17*6777b538SAndroid Build Coastguard Worker #include "base/files/file.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/message_loop/message_pump_apple.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/message_loop/message_pump_kqueue.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/synchronization/condition_variable.h"
21*6777b538SAndroid Build Coastguard Worker #endif
22*6777b538SAndroid Build Coastguard Worker
23*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
24*6777b538SAndroid Build Coastguard Worker #include "base/android/input_hint_checker.h"
25*6777b538SAndroid Build Coastguard Worker #endif
26*6777b538SAndroid Build Coastguard Worker
27*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
28*6777b538SAndroid Build Coastguard Worker #include "base/task/sequence_manager/thread_controller_power_monitor.h"
29*6777b538SAndroid Build Coastguard Worker #include "base/threading/platform_thread_win.h"
30*6777b538SAndroid Build Coastguard Worker #endif
31*6777b538SAndroid Build Coastguard Worker
32*6777b538SAndroid Build Coastguard Worker namespace base::features {
33*6777b538SAndroid Build Coastguard Worker
34*6777b538SAndroid Build Coastguard Worker // Alphabetical:
35*6777b538SAndroid Build Coastguard Worker
36*6777b538SAndroid Build Coastguard Worker // Enforce that writeable file handles passed to untrusted processes are not
37*6777b538SAndroid Build Coastguard Worker // backed by executable files.
38*6777b538SAndroid Build Coastguard Worker BASE_FEATURE(kEnforceNoExecutableFileHandles,
39*6777b538SAndroid Build Coastguard Worker "EnforceNoExecutableFileHandles",
40*6777b538SAndroid Build Coastguard Worker FEATURE_ENABLED_BY_DEFAULT);
41*6777b538SAndroid Build Coastguard Worker
42*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/851128): Roll out this to 100% before replacing existing
43*6777b538SAndroid Build Coastguard Worker // NOTREACHED()s with NOTREACHED_NORETURN() as part of NOTREACHED() migration.
44*6777b538SAndroid Build Coastguard Worker // Note that a prerequisite for rolling out this experiment is that existing
45*6777b538SAndroid Build Coastguard Worker // NOTREACHED reports are at a very low rate. Once this rolls out we should
46*6777b538SAndroid Build Coastguard Worker // monitor that crash rates for the experiment population is within a 1-5% or
47*6777b538SAndroid Build Coastguard Worker // lower than the control group.
48*6777b538SAndroid Build Coastguard Worker BASE_FEATURE(kNotReachedIsFatal,
49*6777b538SAndroid Build Coastguard Worker "NotReachedIsFatal",
50*6777b538SAndroid Build Coastguard Worker FEATURE_DISABLED_BY_DEFAULT);
51*6777b538SAndroid Build Coastguard Worker
52*6777b538SAndroid Build Coastguard Worker // Optimizes parsing and loading of data: URLs.
53*6777b538SAndroid Build Coastguard Worker BASE_FEATURE(kOptimizeDataUrls, "OptimizeDataUrls", FEATURE_ENABLED_BY_DEFAULT);
54*6777b538SAndroid Build Coastguard Worker
55*6777b538SAndroid Build Coastguard Worker BASE_FEATURE(kUseRustJsonParser,
56*6777b538SAndroid Build Coastguard Worker "UseRustJsonParser",
57*6777b538SAndroid Build Coastguard Worker FEATURE_DISABLED_BY_DEFAULT);
58*6777b538SAndroid Build Coastguard Worker
59*6777b538SAndroid Build Coastguard Worker BASE_FEATURE(kJsonNegativeZero, "JsonNegativeZero", FEATURE_ENABLED_BY_DEFAULT);
60*6777b538SAndroid Build Coastguard Worker
61*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS)
62*6777b538SAndroid Build Coastguard Worker // Force to enable LowEndDeviceMode partially on Android 3Gb devices.
63*6777b538SAndroid Build Coastguard Worker // (see PartialLowEndModeOnMidRangeDevices below)
64*6777b538SAndroid Build Coastguard Worker BASE_FEATURE(kPartialLowEndModeOn3GbDevices,
65*6777b538SAndroid Build Coastguard Worker "PartialLowEndModeOn3GbDevices",
66*6777b538SAndroid Build Coastguard Worker FEATURE_DISABLED_BY_DEFAULT);
67*6777b538SAndroid Build Coastguard Worker
68*6777b538SAndroid Build Coastguard Worker // Used to enable LowEndDeviceMode partially on Android and ChromeOS mid-range
69*6777b538SAndroid Build Coastguard Worker // devices. Such devices aren't considered low-end, but we'd like experiment
70*6777b538SAndroid Build Coastguard Worker // with a subset of low-end features to see if we get a good memory vs.
71*6777b538SAndroid Build Coastguard Worker // performance tradeoff.
72*6777b538SAndroid Build Coastguard Worker //
73*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/1434873): |#if| out 32-bit before launching or going to
74*6777b538SAndroid Build Coastguard Worker // high Stable %, because we will enable the feature only for <8GB 64-bit
75*6777b538SAndroid Build Coastguard Worker // devices, where we didn't ship yet. However, we first need a larger
76*6777b538SAndroid Build Coastguard Worker // population to collect data.
77*6777b538SAndroid Build Coastguard Worker BASE_FEATURE(kPartialLowEndModeOnMidRangeDevices,
78*6777b538SAndroid Build Coastguard Worker "PartialLowEndModeOnMidRangeDevices",
79*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
80*6777b538SAndroid Build Coastguard Worker FEATURE_ENABLED_BY_DEFAULT);
81*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_CHROMEOS)
82*6777b538SAndroid Build Coastguard Worker FEATURE_DISABLED_BY_DEFAULT);
83*6777b538SAndroid Build Coastguard Worker #endif
84*6777b538SAndroid Build Coastguard Worker
85*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS)
86*6777b538SAndroid Build Coastguard Worker
87*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
88*6777b538SAndroid Build Coastguard Worker // Whether to report frame metrics to the Android.FrameTimeline.* histograms.
89*6777b538SAndroid Build Coastguard Worker BASE_FEATURE(kCollectAndroidFrameTimelineMetrics,
90*6777b538SAndroid Build Coastguard Worker "CollectAndroidFrameTimelineMetrics",
91*6777b538SAndroid Build Coastguard Worker FEATURE_DISABLED_BY_DEFAULT);
92*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_ANDROID)
93*6777b538SAndroid Build Coastguard Worker
Init(EmitThreadControllerProfilerMetadata emit_thread_controller_profiler_metadata)94*6777b538SAndroid Build Coastguard Worker void Init(EmitThreadControllerProfilerMetadata
95*6777b538SAndroid Build Coastguard Worker emit_thread_controller_profiler_metadata) {
96*6777b538SAndroid Build Coastguard Worker InitializeCpuReductionExperiment();
97*6777b538SAndroid Build Coastguard Worker sequence_manager::internal::SequenceManagerImpl::InitializeFeatures();
98*6777b538SAndroid Build Coastguard Worker sequence_manager::internal::ThreadController::InitializeFeatures(
99*6777b538SAndroid Build Coastguard Worker emit_thread_controller_profiler_metadata);
100*6777b538SAndroid Build Coastguard Worker
101*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
102*6777b538SAndroid Build Coastguard Worker MessagePumpLibevent::InitializeFeatures();
103*6777b538SAndroid Build Coastguard Worker #endif
104*6777b538SAndroid Build Coastguard Worker
105*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_CHROMEOS)
106*6777b538SAndroid Build Coastguard Worker PlatformThread::InitializeFeatures();
107*6777b538SAndroid Build Coastguard Worker #endif
108*6777b538SAndroid Build Coastguard Worker
109*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE)
110*6777b538SAndroid Build Coastguard Worker ConditionVariable::InitializeFeatures();
111*6777b538SAndroid Build Coastguard Worker File::InitializeFeatures();
112*6777b538SAndroid Build Coastguard Worker MessagePumpCFRunLoopBase::InitializeFeatures();
113*6777b538SAndroid Build Coastguard Worker MessagePumpKqueue::InitializeFeatures();
114*6777b538SAndroid Build Coastguard Worker #endif
115*6777b538SAndroid Build Coastguard Worker
116*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
117*6777b538SAndroid Build Coastguard Worker android::InputHintChecker::InitializeFeatures();
118*6777b538SAndroid Build Coastguard Worker #endif
119*6777b538SAndroid Build Coastguard Worker
120*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
121*6777b538SAndroid Build Coastguard Worker sequence_manager::internal::ThreadControllerPowerMonitor::
122*6777b538SAndroid Build Coastguard Worker InitializeFeatures();
123*6777b538SAndroid Build Coastguard Worker InitializePlatformThreadFeatures();
124*6777b538SAndroid Build Coastguard Worker #endif
125*6777b538SAndroid Build Coastguard Worker }
126*6777b538SAndroid Build Coastguard Worker
127*6777b538SAndroid Build Coastguard Worker } // namespace base::features
128