Index: components/subresource_filter/core/browser/subresource_filter_features.h |
diff --git a/components/subresource_filter/core/browser/subresource_filter_features.h b/components/subresource_filter/core/browser/subresource_filter_features.h |
index c6106319cac4c7ab993d0b3b08c1a29f86f65257..e075356c3c22d1ee67528b60f1d3e86020025b51 100644 |
--- a/components/subresource_filter/core/browser/subresource_filter_features.h |
+++ b/components/subresource_filter/core/browser/subresource_filter_features.h |
@@ -5,72 +5,145 @@ |
#ifndef COMPONENTS_SUBRESOURCE_FILTER_CORE_BROWSER_SUBRESOURCE_FILTER_FEATURES_H_ |
#define COMPONENTS_SUBRESOURCE_FILTER_CORE_BROWSER_SUBRESOURCE_FILTER_FEATURES_H_ |
+#include <iosfwd> |
+#include <vector> |
+ |
#include "base/feature_list.h" |
#include "base/macros.h" |
#include "base/memory/ref_counted.h" |
+#include "base/strings/string_piece.h" |
#include "components/subresource_filter/core/common/activation_level.h" |
#include "components/subresource_filter/core/common/activation_list.h" |
#include "components/subresource_filter/core/common/activation_scope.h" |
namespace subresource_filter { |
-// Encapsulates all parameters that define how the subresource filter feature |
-// should operate. |
+// Encapsulates a set of parameters that define how the subresource filter |
+// feature should operate. Each configuration consists of three parts as |
+// described in detail below. |
+// |
+// There can be multiple configuration enabled at the same time. For each |
+// navigation, however, subresource filtering will be activated according to |
+// exactly one of these enabled configuration, if any. Namely, the configuration |
+// with the highest |priority| among those whose |activation_conditions| are |
+// otherwise satisfied for the navigation. |
+// |
+// Even when there are multiple enabled configurations, the RulesetService is |
+// currently only capable of fetching and indexing a single |ruleset_flavor|, |
+// which will be used for all navigations with subresource filtering activated, |
+// regardless of which configuration prescribed filtering for that navigation. |
+// This shared ruleset flavor will be the one lexicographically greatest. |
+// |
+// Experimenters wishing to use customized rulesets therefore must ensure that |
+// they set up the experimental state so that the ruleset chosen through this |
+// mechanism is compatible with all the enabled configurations (or disable some |
+// as needed). |
struct Configuration { |
+ // The conditions that determine whether subresource filtering should be |
+ // activated for a given main frame navigation using this configuration. |
+ struct ActivationConditions { |
+ // The activation scope. That is, the subset of page loads where subresource |
+ // filtering should be activated according to this configuration. When set |
+ // to NO_SITES, this configuration will never be active. |
+ ActivationScope activation_scope = ActivationScope::NO_SITES; |
+ |
+ // The activation list to use when the |activation_scope| is |
+ // ACTIVATION_LIST, ignored otherwise. |
+ ActivationList activation_list = ActivationList::NONE; |
+ |
+ // The activation priority of this configuration. Used to break ties when |
+ // there are multiple configurations whose activation conditions are |
+ // otherwise satisfied. A greater value indicates higher priority. |
+ int priority = 0; |
+ }; |
+ |
+ // The details of how subresource filtering should operate for a given main |
+ // frame navigation when it is activated using this configuration. |
+ struct ActivationOptions { |
+ // The maximum degree to which subresource filtering should be activated on |
+ // any RenderFrame. When set to DISABLED, this configuration will cause |
+ // subresource filtering to be de-activated for a navigation if this is the |
+ // highest priority configuration with its activation conditions met. |
+ ActivationLevel activation_level = ActivationLevel::DISABLED; |
+ |
+ // A number in the range [0, 1], indicating the fraction of page loads that |
+ // should have extended performance measurements enabled. |
+ double performance_measurement_rate = 0.0; |
+ |
+ // Whether notifications indicating that a subresource was disallowed should |
+ // be suppressed in the UI. |
+ bool should_suppress_notifications = false; |
+ |
+ // Whether to whitelist a site when a page loaded from that site is |
+ // reloaded. |
+ bool should_whitelist_site_on_reload = false; |
+ }; |
+ |
+ // General settings that apply outside of the scope of a navigation. |
+ struct GeneralSettings { |
+ // The ruleset flavor to download through the component updater. The empty |
+ // string indicates that the default ruleset should be used. |
+ std::string ruleset_flavor; |
+ }; |
+ |
+ // Do not forget updating operator==, operator<<, and any other necessary |
+ // methods when adding new fields here! |
+ |
Configuration(); |
Configuration(ActivationLevel activation_level, |
ActivationScope activation_scope, |
ActivationList activation_list = ActivationList::NONE); |
+ Configuration(const Configuration&); |
Configuration(Configuration&&); |
~Configuration(); |
+ Configuration& operator=(const Configuration&); |
Configuration& operator=(Configuration&&); |
- // The maximum degree to which subresource filtering should be activated on |
- // any RenderFrame. This will be ActivationLevel::DISABLED unless the feature |
- // is enabled and variation parameters prescribe a higher activation level. |
- ActivationLevel activation_level = ActivationLevel::DISABLED; |
- |
- // The activation scope. That is, the subset of page loads where subresource |
- // filtering should be activated. This will be ActivationScope::NO_SITES |
- // unless the feature is =enabled and variation parameters prescribe a wider |
- // activation scope. |
- ActivationScope activation_scope = ActivationScope::NO_SITES; |
- |
- // The activation list to use when the |activation_scope| is ACTIVATION_LIST. |
- // This will be ActivationList::NONE unless variation parameters prescribe a |
- // recognized list. |
- ActivationList activation_list = ActivationList::NONE; |
- |
- // A number in the range [0, 1], indicating the fraction of page loads that |
- // should have extended performance measurements enabled. The rate will |
- // be 0 unless a greater frequency is specified by variation parameters. |
- double performance_measurement_rate = 0.0; |
- |
- // Whether notifications indicating that a subresource was disallowed should |
- // be suppressed in the UI. |
- bool should_suppress_notifications = false; |
- |
- // The ruleset flavor to download through the component updater. This or the |
- // empty string if the default ruleset should be used. |
- std::string ruleset_flavor; |
- |
- // Whether to whitelist a site when a page loaded from that site is reloaded. |
- bool should_whitelist_site_on_reload = false; |
+ bool operator==(const Configuration& rhs) const; |
+ bool operator!=(const Configuration& rhs) const; |
+ |
+ // Factory methods for preset configurations. |
+ // |
+ // To add a new preset: |
+ // 1.) Define a named factory method here. |
+ // 2.) Define a name for the configuration to be used in variation params. |
+ // 3.) Register it into |kAvailablePresetConfigurations| in the .cc file. |
+ // 4.) Update unittests to cover the new preset. |
+ static Configuration MakePresetForLiveRunOnPhishingSites(); |
+ static Configuration MakePresetForPerformanceTestingDryRunOnAllSites(); |
+ |
+ ActivationConditions activation_conditions; |
+ ActivationOptions activation_options; |
+ GeneralSettings general_settings; |
}; |
-// TODO(engedy): Make this an actual list once all call sites are prepared to |
-// handle multiple simultaneous configurations. |
+// For logging in tests. |
+std::ostream& operator<<(std::ostream& os, const Configuration& config); |
+ |
+// Thread-safe, ref-counted wrapper around an immutable list of configurations. |
class ConfigurationList : public base::RefCountedThreadSafe<ConfigurationList> { |
public: |
- explicit ConfigurationList(Configuration config); |
+ explicit ConfigurationList(std::vector<Configuration> configs); |
- const Configuration& the_one_and_only() const { return config_; } |
+ // Returns the lexicographically greatest flavor string that is prescribed by |
+ // any of the configurations. The caller must hold a reference to this |
+ // instance while using the returned string piece. |
+ base::StringPiece lexicographically_greatest_ruleset_flavor() const { |
+ return lexicographically_greatest_ruleset_flavor_; |
+ } |
+ |
+ // Retrieves the configurations pre-sorted in decreasing order of their |
+ // |activation_condition.priority|. |
+ const std::vector<Configuration>& configs_by_decreasing_priority() const { |
+ return configs_by_decreasing_priority_; |
+ } |
private: |
friend class base::RefCountedThreadSafe<ConfigurationList>; |
~ConfigurationList(); |
- const Configuration config_; |
+ const std::vector<Configuration> configs_by_decreasing_priority_; |
+ const base::StringPiece lexicographically_greatest_ruleset_flavor_; |
DISALLOW_COPY_AND_ASSIGN(ConfigurationList); |
}; |
@@ -78,13 +151,13 @@ class ConfigurationList : public base::RefCountedThreadSafe<ConfigurationList> { |
// Retrieves all currently enabled subresource filtering configurations. The |
// configurations are parsed on first access and then the result is cached. |
// |
-// In tests, however, the config may be altered in-between navigations, so |
+// In tests, however, the config may be changed in-between navigations, so |
// callers should not hold on to the result for long. |
-scoped_refptr<ConfigurationList> GetActiveConfigurations(); |
+scoped_refptr<ConfigurationList> GetEnabledConfigurations(); |
namespace testing { |
-// Returns the currently cached active ConfigurationList, if any, and replaces |
+// Returns the currently cached enabled ConfigurationList, if any, and replaces |
// it with |new_configs|, which may be nullptr to clear the cache. |
scoped_refptr<ConfigurationList> GetAndSetActivateConfigurations( |
scoped_refptr<ConfigurationList> new_configs); |
@@ -115,7 +188,7 @@ extern const char kActivationListSocialEngineeringAdsInterstitial[]; |
extern const char kActivationListPhishingInterstitial[]; |
extern const char kActivationListSubresourceFilter[]; |
-extern const char kRulesetFlavorParameterName[]; |
+extern const char kActivationPriorityParameterName[]; |
extern const char kPerformanceMeasurementRateParameterName[]; |
@@ -123,6 +196,13 @@ extern const char kSuppressNotificationsParameterName[]; |
extern const char kWhitelistSiteOnReloadParameterName[]; |
+extern const char kRulesetFlavorParameterName[]; |
+ |
+extern const char kEnablePresetsParameterName[]; |
+extern const char kDisablePresetsParameterName[]; |
+extern const char kPresetLiveRunOnPhishingSites[]; |
+extern const char kPresetPerformanceTestingDryRunOnAllSites[]; |
+ |
} // namespace subresource_filter |
#endif // COMPONENTS_SUBRESOURCE_FILTER_CORE_BROWSER_SUBRESOURCE_FILTER_FEATURES_H_ |