Chromium Code Reviews| 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..162c6d759f4d6debc3d8f54f62f939a3d5d868c5 100644 |
| --- a/components/subresource_filter/core/browser/subresource_filter_features.h |
| +++ b/components/subresource_filter/core/browser/subresource_filter_features.h |
| @@ -5,6 +5,9 @@ |
| #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" |
| @@ -14,63 +17,121 @@ |
| 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 |
| +// satisfied for the navigation. |
|
Charlie Harrison
2017/05/03 14:52:18
A note about the specific case of the ruleset flav
engedy
2017/05/05 12:25:42
Done.
|
| +// |
| +// The priorities for configurations are defined as follows. The configuration |
| +// with the higher priority is: |
| +// -- the one with the higher |activation_level|, |
| +// -- in case of a tie, the one with the more specific |activation_scope|, |
| +// -- in case of a tie, the one with the more recently added |activation_list|, |
| +// -- then at this point there should not be a tie anymore. If there is one, a |
| +// configuration will be selected deterministically, but arbitrarily. |
| +// See details in the .cc file and the example ordering in the unit test. |
| 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. |
| + 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 details of how subresource filtering should operate for a given main |
| + // frame navigation if the conditions above are met (and this is the highest |
| + // priority configuration among those whose conditions are met). |
| + struct ActivationOptions { |
| + // The maximum degree to which subresource filtering should be activated on |
| + // any RenderFrame. |
| + 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 the apply outside of the scope a navigation. |
|
pkalinnikov
2017/05/04 12:04:23
nit: ... that apply ... of the scope of a ...
engedy
2017/05/05 12:25:42
Done.
|
| + 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; |
| + }; |
| + |
|
Charlie Harrison
2017/05/03 14:52:18
Please add a comment somewhere around here to upda
engedy
2017/05/05 12:25:42
Done. Do you know of any cool ways to static_asser
Charlie Harrison
2017/05/05 13:12:52
Not in a clean way, though I wouldn't call myself
pkalinnikov
2017/05/05 13:29:58
One weird way would be smth like:
static_assert(si
Charlie Harrison
2017/05/05 14:00:08
I don't think this is very portable, but there are
engedy
2017/05/05 19:24:10
Yeah, that's very not portable. Even within the sa
|
| 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(std::vector<Configuration> configs); |
| explicit ConfigurationList(Configuration config); |
| - const Configuration& the_one_and_only() const { return config_; } |
| + // Retrieves the configurations pre-sorted in decreasing order of priority |
| + // (see the comment above the definition of Configuration for details). |
| + const std::vector<Configuration>& configs_by_decreasing_priority() const { |
| + return configs_by_decreasing_priority_; |
| + } |
| + |
| + // Returns the most specific ruleset flavor string that is prescribed by any |
| + // of the configurations. |
| + // |
| + // The `most specific` flavor is defined as the longest flavor string, and, in |
|
pkalinnikov
2017/05/04 12:04:23
As discussed offline, can we get rid of length-fir
engedy
2017/05/05 12:25:42
Done.
|
| + // case of a tie, the lexicographically greatest among those. The ruleset |
| + // flavor is derived independently of activation `priorities`. |
|
Charlie Harrison
2017/05/03 14:52:18
A comment why this is the case would be nice.
engedy
2017/05/05 12:25:42
No longer applicable.
|
| + std::string GetMostSpecificRulesetFlavor() const; |
| private: |
| friend class base::RefCountedThreadSafe<ConfigurationList>; |
| ~ConfigurationList(); |
| - const Configuration config_; |
| + const std::vector<Configuration> configs_by_decreasing_priority_; |
| DISALLOW_COPY_AND_ASSIGN(ConfigurationList); |
| }; |
| @@ -78,13 +139,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,14 +176,18 @@ extern const char kActivationListSocialEngineeringAdsInterstitial[]; |
| extern const char kActivationListPhishingInterstitial[]; |
| extern const char kActivationListSubresourceFilter[]; |
| -extern const char kRulesetFlavorParameterName[]; |
| - |
| extern const char kPerformanceMeasurementRateParameterName[]; |
| extern const char kSuppressNotificationsParameterName[]; |
| extern const char kWhitelistSiteOnReloadParameterName[]; |
| +extern const char kRulesetFlavorParameterName[]; |
| + |
| +extern const char kEnablePresetsParameterName[]; |
| +extern const char kPresetLiveRunOnPhishingSites[]; |
| +extern const char kPresetPerformanceTestingDryRunOnAllSites[]; |
| + |
| } // namespace subresource_filter |
| #endif // COMPONENTS_SUBRESOURCE_FILTER_CORE_BROWSER_SUBRESOURCE_FILTER_FEATURES_H_ |