xref: /aosp_15_r20/external/cronet/base/android/feature_map.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2023 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/android/feature_map.h"
6 
7 #include <jni.h>
8 #include <stddef.h>
9 
10 #include <memory>
11 #include <string>
12 #include <string_view>
13 
14 #include "base/base_jni/FeatureMap_jni.h"
15 #include "base/metrics/field_trial_params.h"
16 #include "base/notreached.h"
17 
18 namespace base::android {
19 
MakeNameToFeaturePair(const Feature * feature)20 std::pair<std::string_view, const Feature*> MakeNameToFeaturePair(
21     const Feature* feature) {
22   return std::make_pair(feature->name, feature);
23 }
24 
FeatureMap(std::vector<const Feature * > features_exposed_to_java)25 FeatureMap::FeatureMap(std::vector<const Feature*> features_exposed_to_java) {
26   mapping_ = MakeFlatMap<std::string_view, const Feature*>(
27       features_exposed_to_java, {}, &MakeNameToFeaturePair);
28 }
29 
30 FeatureMap::~FeatureMap() = default;
31 
FindFeatureExposedToJava(const std::string & feature_name)32 const Feature* FeatureMap::FindFeatureExposedToJava(
33     const std::string& feature_name) {
34   auto it = mapping_.find(feature_name);
35   if (it != mapping_.end()) {
36     return it->second;
37   }
38 
39   NOTREACHED_NORETURN() << "Queried feature cannot be found in FeatureMap: "
40                         << feature_name;
41 }
42 
JNI_FeatureMap_IsEnabled(JNIEnv * env,jlong jfeature_map,std::string & feature_name)43 static jboolean JNI_FeatureMap_IsEnabled(JNIEnv* env,
44                                          jlong jfeature_map,
45                                          std::string& feature_name) {
46   FeatureMap* feature_map = reinterpret_cast<FeatureMap*>(jfeature_map);
47   const base::Feature* feature =
48       feature_map->FindFeatureExposedToJava(feature_name);
49   return base::FeatureList::IsEnabled(*feature);
50 }
51 
JNI_FeatureMap_GetFieldTrialParamByFeature(JNIEnv * env,jlong jfeature_map,std::string & feature_name,std::string & param_name)52 static std::string JNI_FeatureMap_GetFieldTrialParamByFeature(
53     JNIEnv* env,
54     jlong jfeature_map,
55     std::string& feature_name,
56     std::string& param_name) {
57   FeatureMap* feature_map = reinterpret_cast<FeatureMap*>(jfeature_map);
58   const base::Feature* feature =
59       feature_map->FindFeatureExposedToJava(feature_name);
60   return base::GetFieldTrialParamValueByFeature(*feature, param_name);
61 }
62 
JNI_FeatureMap_GetFieldTrialParamByFeatureAsInt(JNIEnv * env,jlong jfeature_map,std::string & feature_name,std::string & param_name,const jint jdefault_value)63 static jint JNI_FeatureMap_GetFieldTrialParamByFeatureAsInt(
64     JNIEnv* env,
65     jlong jfeature_map,
66     std::string& feature_name,
67     std::string& param_name,
68     const jint jdefault_value) {
69   FeatureMap* feature_map = reinterpret_cast<FeatureMap*>(jfeature_map);
70   const base::Feature* feature =
71       feature_map->FindFeatureExposedToJava(feature_name);
72   return base::GetFieldTrialParamByFeatureAsInt(*feature, param_name,
73                                                 jdefault_value);
74 }
75 
JNI_FeatureMap_GetFieldTrialParamByFeatureAsDouble(JNIEnv * env,jlong jfeature_map,std::string & feature_name,std::string & param_name,const jdouble jdefault_value)76 static jdouble JNI_FeatureMap_GetFieldTrialParamByFeatureAsDouble(
77     JNIEnv* env,
78     jlong jfeature_map,
79     std::string& feature_name,
80     std::string& param_name,
81     const jdouble jdefault_value) {
82   FeatureMap* feature_map = reinterpret_cast<FeatureMap*>(jfeature_map);
83   const base::Feature* feature =
84       feature_map->FindFeatureExposedToJava(feature_name);
85   return base::GetFieldTrialParamByFeatureAsDouble(*feature, param_name,
86                                                    jdefault_value);
87 }
88 
JNI_FeatureMap_GetFieldTrialParamByFeatureAsBoolean(JNIEnv * env,jlong jfeature_map,std::string & feature_name,std::string & param_name,const jboolean jdefault_value)89 static jboolean JNI_FeatureMap_GetFieldTrialParamByFeatureAsBoolean(
90     JNIEnv* env,
91     jlong jfeature_map,
92     std::string& feature_name,
93     std::string& param_name,
94     const jboolean jdefault_value) {
95   FeatureMap* feature_map = reinterpret_cast<FeatureMap*>(jfeature_map);
96   const base::Feature* feature =
97       feature_map->FindFeatureExposedToJava(feature_name);
98   return base::GetFieldTrialParamByFeatureAsBool(*feature, param_name,
99                                                  jdefault_value);
100 }
101 
JNI_FeatureMap_GetFlattedFieldTrialParamsForFeature(JNIEnv * env,jlong jfeature_map,std::string & feature_name)102 std::vector<std::string> JNI_FeatureMap_GetFlattedFieldTrialParamsForFeature(
103     JNIEnv* env,
104     jlong jfeature_map,
105     std::string& feature_name) {
106   FeatureMap* feature_map = reinterpret_cast<FeatureMap*>(jfeature_map);
107   base::FieldTrialParams params;
108   std::vector<std::string> keys_and_values;
109   const base::Feature* feature =
110       feature_map->FindFeatureExposedToJava(feature_name);
111   if (feature && base::GetFieldTrialParamsByFeature(*feature, &params)) {
112     for (const auto& param_pair : params) {
113       keys_and_values.push_back(param_pair.first);
114       keys_and_values.push_back(param_pair.second);
115     }
116   }
117   return keys_and_values;
118 }
119 
120 }  // namespace base::android
121