Index: components/subresource_filter/core/browser/subresource_filter_features.cc |
diff --git a/components/subresource_filter/core/browser/subresource_filter_features.cc b/components/subresource_filter/core/browser/subresource_filter_features.cc |
index 2ad875eaf25275bec0c8c68ff3c1a123e4b6cfe5..943c2e78f29f1c68fa657f1c522f9ff525d910e9 100644 |
--- a/components/subresource_filter/core/browser/subresource_filter_features.cc |
+++ b/components/subresource_filter/core/browser/subresource_filter_features.cc |
@@ -5,12 +5,15 @@ |
#include "components/subresource_filter/core/browser/subresource_filter_features.h" |
#include <string> |
+#include <utility> |
+#include "base/lazy_instance.h" |
#include "base/metrics/field_trial_params.h" |
#include "base/strings/string_number_conversions.h" |
#include "base/strings/string_piece.h" |
#include "base/strings/string_split.h" |
#include "base/strings/string_util.h" |
+#include "base/synchronization/lock.h" |
#include "components/variations/variations_associated_data.h" |
namespace subresource_filter { |
@@ -76,6 +79,45 @@ bool ParseBool(const base::StringPiece value) { |
return base::LowerCaseEqualsASCII(value, "true"); |
} |
+Configuration ParseFieldTrialConfiguration() { |
+ Configuration configuration; |
+ |
+ std::map<std::string, std::string> params; |
+ base::GetFieldTrialParamsByFeature(kSafeBrowsingSubresourceFilter, ¶ms); |
+ |
+ configuration.activation_level = ParseActivationLevel( |
+ TakeVariationParamOrReturnEmpty(¶ms, kActivationLevelParameterName)); |
+ |
+ configuration.activation_scope = ParseActivationScope( |
+ TakeVariationParamOrReturnEmpty(¶ms, kActivationScopeParameterName)); |
+ |
+ configuration.activation_list = ParseActivationList( |
+ TakeVariationParamOrReturnEmpty(¶ms, kActivationListsParameterName)); |
+ |
+ configuration.performance_measurement_rate = |
+ ParsePerformanceMeasurementRate(TakeVariationParamOrReturnEmpty( |
+ ¶ms, kPerformanceMeasurementRateParameterName)); |
+ |
+ configuration.should_suppress_notifications = |
+ ParseBool(TakeVariationParamOrReturnEmpty( |
+ ¶ms, kSuppressNotificationsParameterName)); |
+ |
+ configuration.ruleset_flavor = |
+ TakeVariationParamOrReturnEmpty(¶ms, kRulesetFlavorParameterName); |
+ |
+ configuration.should_whitelist_site_on_reload = |
+ ParseBool(TakeVariationParamOrReturnEmpty( |
+ ¶ms, kWhitelistSiteOnReloadParameterName)); |
+ |
+ return configuration; |
+} |
+ |
+base::LazyInstance<base::Lock>::Leaky g_active_configurations_lock = |
+ LAZY_INSTANCE_INITIALIZER; |
+ |
+base::LazyInstance<scoped_refptr<ConfigurationList>>::Leaky |
+ g_active_configurations = LAZY_INSTANCE_INITIALIZER; |
+ |
} // namespace |
const base::Feature kSafeBrowsingSubresourceFilter{ |
@@ -115,37 +157,26 @@ Configuration::~Configuration() = default; |
Configuration::Configuration(Configuration&&) = default; |
Configuration& Configuration::operator=(Configuration&&) = default; |
-Configuration GetActiveConfiguration() { |
- Configuration active_configuration; |
- |
- std::map<std::string, std::string> params; |
- base::GetFieldTrialParamsByFeature(kSafeBrowsingSubresourceFilter, ¶ms); |
- |
- active_configuration.activation_level = ParseActivationLevel( |
- TakeVariationParamOrReturnEmpty(¶ms, kActivationLevelParameterName)); |
- |
- active_configuration.activation_scope = ParseActivationScope( |
- TakeVariationParamOrReturnEmpty(¶ms, kActivationScopeParameterName)); |
+ConfigurationList::ConfigurationList(Configuration config) |
+ : config_(std::move(config)) {} |
+ConfigurationList::~ConfigurationList() = default; |
- active_configuration.activation_list = ParseActivationList( |
- TakeVariationParamOrReturnEmpty(¶ms, kActivationListsParameterName)); |
- |
- active_configuration.performance_measurement_rate = |
- ParsePerformanceMeasurementRate(TakeVariationParamOrReturnEmpty( |
- ¶ms, kPerformanceMeasurementRateParameterName)); |
- |
- active_configuration.should_suppress_notifications = |
- ParseBool(TakeVariationParamOrReturnEmpty( |
- ¶ms, kSuppressNotificationsParameterName)); |
- |
- active_configuration.ruleset_flavor = |
- TakeVariationParamOrReturnEmpty(¶ms, kRulesetFlavorParameterName); |
+scoped_refptr<ConfigurationList> GetActiveConfigurations() { |
+ base::AutoLock lock(g_active_configurations_lock.Get()); |
+ if (!g_active_configurations.Get()) { |
+ g_active_configurations.Get() = |
+ base::MakeShared<ConfigurationList>(ParseFieldTrialConfiguration()); |
+ } |
+ return g_active_configurations.Get(); |
+} |
- active_configuration.should_whitelist_site_on_reload = |
- ParseBool(TakeVariationParamOrReturnEmpty( |
- ¶ms, kWhitelistSiteOnReloadParameterName)); |
+namespace testing { |
- return active_configuration; |
+void ClearCachedActiveConfigurations() { |
+ base::AutoLock lock(g_active_configurations_lock.Get()); |
+ g_active_configurations.Get() = nullptr; |
} |
+} // namespace testing |
+ |
} // namespace subresource_filter |