OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/subresource_filter/core/browser/subresource_filter_features
.h" | 5 #include "components/subresource_filter/core/browser/subresource_filter_features
.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
| 8 #include <utility> |
8 | 9 |
| 10 #include "base/lazy_instance.h" |
9 #include "base/metrics/field_trial_params.h" | 11 #include "base/metrics/field_trial_params.h" |
10 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
11 #include "base/strings/string_piece.h" | 13 #include "base/strings/string_piece.h" |
12 #include "base/strings/string_split.h" | 14 #include "base/strings/string_split.h" |
13 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
| 16 #include "base/synchronization/lock.h" |
14 #include "components/variations/variations_associated_data.h" | 17 #include "components/variations/variations_associated_data.h" |
15 | 18 |
16 namespace subresource_filter { | 19 namespace subresource_filter { |
17 | 20 |
18 namespace { | 21 namespace { |
19 | 22 |
20 std::string TakeVariationParamOrReturnEmpty( | 23 std::string TakeVariationParamOrReturnEmpty( |
21 std::map<std::string, std::string>* params, | 24 std::map<std::string, std::string>* params, |
22 const std::string& key) { | 25 const std::string& key) { |
23 auto it = params->find(key); | 26 auto it = params->find(key); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 double value = 0; | 72 double value = 0; |
70 if (!base::StringToDouble(rate, &value) || value < 0) | 73 if (!base::StringToDouble(rate, &value) || value < 0) |
71 return 0; | 74 return 0; |
72 return value < 1 ? value : 1; | 75 return value < 1 ? value : 1; |
73 } | 76 } |
74 | 77 |
75 bool ParseBool(const base::StringPiece value) { | 78 bool ParseBool(const base::StringPiece value) { |
76 return base::LowerCaseEqualsASCII(value, "true"); | 79 return base::LowerCaseEqualsASCII(value, "true"); |
77 } | 80 } |
78 | 81 |
| 82 Configuration ParseFieldTrialConfiguration() { |
| 83 Configuration configuration; |
| 84 |
| 85 std::map<std::string, std::string> params; |
| 86 base::GetFieldTrialParamsByFeature(kSafeBrowsingSubresourceFilter, ¶ms); |
| 87 |
| 88 configuration.activation_level = ParseActivationLevel( |
| 89 TakeVariationParamOrReturnEmpty(¶ms, kActivationLevelParameterName)); |
| 90 |
| 91 configuration.activation_scope = ParseActivationScope( |
| 92 TakeVariationParamOrReturnEmpty(¶ms, kActivationScopeParameterName)); |
| 93 |
| 94 configuration.activation_list = ParseActivationList( |
| 95 TakeVariationParamOrReturnEmpty(¶ms, kActivationListsParameterName)); |
| 96 |
| 97 configuration.performance_measurement_rate = |
| 98 ParsePerformanceMeasurementRate(TakeVariationParamOrReturnEmpty( |
| 99 ¶ms, kPerformanceMeasurementRateParameterName)); |
| 100 |
| 101 configuration.should_suppress_notifications = |
| 102 ParseBool(TakeVariationParamOrReturnEmpty( |
| 103 ¶ms, kSuppressNotificationsParameterName)); |
| 104 |
| 105 configuration.ruleset_flavor = |
| 106 TakeVariationParamOrReturnEmpty(¶ms, kRulesetFlavorParameterName); |
| 107 |
| 108 configuration.should_whitelist_site_on_reload = |
| 109 ParseBool(TakeVariationParamOrReturnEmpty( |
| 110 ¶ms, kWhitelistSiteOnReloadParameterName)); |
| 111 |
| 112 return configuration; |
| 113 } |
| 114 |
| 115 base::LazyInstance<base::Lock>::Leaky g_active_configurations_lock = |
| 116 LAZY_INSTANCE_INITIALIZER; |
| 117 |
| 118 base::LazyInstance<scoped_refptr<ConfigurationList>>::Leaky |
| 119 g_active_configurations = LAZY_INSTANCE_INITIALIZER; |
| 120 |
79 } // namespace | 121 } // namespace |
80 | 122 |
81 const base::Feature kSafeBrowsingSubresourceFilter{ | 123 const base::Feature kSafeBrowsingSubresourceFilter{ |
82 "SubresourceFilter", base::FEATURE_DISABLED_BY_DEFAULT}; | 124 "SubresourceFilter", base::FEATURE_DISABLED_BY_DEFAULT}; |
83 | 125 |
84 const base::Feature kSafeBrowsingSubresourceFilterExperimentalUI{ | 126 const base::Feature kSafeBrowsingSubresourceFilterExperimentalUI{ |
85 "SubresourceFilterExperimentalUI", base::FEATURE_DISABLED_BY_DEFAULT}; | 127 "SubresourceFilterExperimentalUI", base::FEATURE_DISABLED_BY_DEFAULT}; |
86 | 128 |
87 // Legacy name `activation_state` is used in variation parameters. | 129 // Legacy name `activation_state` is used in variation parameters. |
88 const char kActivationLevelParameterName[] = "activation_state"; | 130 const char kActivationLevelParameterName[] = "activation_state"; |
(...skipping 19 matching lines...) Expand all Loading... |
108 | 150 |
109 const char kSuppressNotificationsParameterName[] = "suppress_notifications"; | 151 const char kSuppressNotificationsParameterName[] = "suppress_notifications"; |
110 | 152 |
111 const char kWhitelistSiteOnReloadParameterName[] = "whitelist_site_on_reload"; | 153 const char kWhitelistSiteOnReloadParameterName[] = "whitelist_site_on_reload"; |
112 | 154 |
113 Configuration::Configuration() = default; | 155 Configuration::Configuration() = default; |
114 Configuration::~Configuration() = default; | 156 Configuration::~Configuration() = default; |
115 Configuration::Configuration(Configuration&&) = default; | 157 Configuration::Configuration(Configuration&&) = default; |
116 Configuration& Configuration::operator=(Configuration&&) = default; | 158 Configuration& Configuration::operator=(Configuration&&) = default; |
117 | 159 |
118 Configuration GetActiveConfiguration() { | 160 ConfigurationList::ConfigurationList(Configuration config) |
119 Configuration active_configuration; | 161 : config_(std::move(config)) {} |
| 162 ConfigurationList::~ConfigurationList() = default; |
120 | 163 |
121 std::map<std::string, std::string> params; | 164 scoped_refptr<ConfigurationList> GetActiveConfigurations() { |
122 base::GetFieldTrialParamsByFeature(kSafeBrowsingSubresourceFilter, ¶ms); | 165 base::AutoLock lock(g_active_configurations_lock.Get()); |
123 | 166 if (!g_active_configurations.Get()) { |
124 active_configuration.activation_level = ParseActivationLevel( | 167 g_active_configurations.Get() = |
125 TakeVariationParamOrReturnEmpty(¶ms, kActivationLevelParameterName)); | 168 base::MakeShared<ConfigurationList>(ParseFieldTrialConfiguration()); |
126 | 169 } |
127 active_configuration.activation_scope = ParseActivationScope( | 170 return g_active_configurations.Get(); |
128 TakeVariationParamOrReturnEmpty(¶ms, kActivationScopeParameterName)); | |
129 | |
130 active_configuration.activation_list = ParseActivationList( | |
131 TakeVariationParamOrReturnEmpty(¶ms, kActivationListsParameterName)); | |
132 | |
133 active_configuration.performance_measurement_rate = | |
134 ParsePerformanceMeasurementRate(TakeVariationParamOrReturnEmpty( | |
135 ¶ms, kPerformanceMeasurementRateParameterName)); | |
136 | |
137 active_configuration.should_suppress_notifications = | |
138 ParseBool(TakeVariationParamOrReturnEmpty( | |
139 ¶ms, kSuppressNotificationsParameterName)); | |
140 | |
141 active_configuration.ruleset_flavor = | |
142 TakeVariationParamOrReturnEmpty(¶ms, kRulesetFlavorParameterName); | |
143 | |
144 active_configuration.should_whitelist_site_on_reload = | |
145 ParseBool(TakeVariationParamOrReturnEmpty( | |
146 ¶ms, kWhitelistSiteOnReloadParameterName)); | |
147 | |
148 return active_configuration; | |
149 } | 171 } |
150 | 172 |
| 173 namespace testing { |
| 174 |
| 175 void ClearCachedActiveConfigurations() { |
| 176 base::AutoLock lock(g_active_configurations_lock.Get()); |
| 177 g_active_configurations.Get() = nullptr; |
| 178 } |
| 179 |
| 180 } // namespace testing |
| 181 |
151 } // namespace subresource_filter | 182 } // namespace subresource_filter |
OLD | NEW |