| 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_ | 
|  |