Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(365)

Unified Diff: components/subresource_filter/content/browser/content_subresource_filter_driver_factory.cc

Issue 2844063002: Add support for multiple simultaneous subresource_filter::Configurations. (Closed)
Patch Set: Polish + rebase. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/subresource_filter/content/browser/content_subresource_filter_driver_factory.cc
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_driver_factory.cc b/components/subresource_filter/content/browser/content_subresource_filter_driver_factory.cc
index e11a7e4d1a45764eb969df59768ff30f121ae72d..2bf1d921940f86370683049cf594a0a1ac9cb52c 100644
--- a/components/subresource_filter/content/browser/content_subresource_filter_driver_factory.cc
+++ b/components/subresource_filter/content/browser/content_subresource_filter_driver_factory.cc
@@ -93,10 +93,7 @@ ContentSubresourceFilterDriverFactory::ContentSubresourceFilterDriverFactory(
base::MakeUnique<ContentSubresourceFilterThrottleManager>(
this,
client_->GetRulesetDealer(),
- web_contents)),
- activation_level_(ActivationLevel::DISABLED),
- activation_decision_(ActivationDecision::UNKNOWN),
- measure_performance_(false) {}
+ web_contents)) {}
ContentSubresourceFilterDriverFactory::
~ContentSubresourceFilterDriverFactory() {}
@@ -111,30 +108,52 @@ void ContentSubresourceFilterDriverFactory::
url, GetListForThreatTypeAndMetadata(threat_type, threat_type_metadata));
}
+void ContentSubresourceFilterDriverFactory::
+ ComputeActivationForMainFrameNavigation(
+ content::NavigationHandle* navigation_handle) {
+ activation_decision_ = ActivationDecision::ACTIVATION_DISABLED;
+ activation_options_ = Configuration::ActivationOptions();
+ const auto config_list = GetEnabledConfigurations();
+ for (const auto& config : config_list->configs_by_decreasing_priority()) {
+ ActivationDecision decision =
+ ComputePerConfigActivationDecisionForMainFrameNavigation(
+ navigation_handle, config);
+ if (decision == ActivationDecision::ACTIVATED) {
+ activation_decision_ = ActivationDecision::ACTIVATED;
+ activation_options_ = config.activation_options;
+ return;
+ }
+
+ // Remember a |decision| more specific that `ACTIVATION_DISABLED`, if any.
pkalinnikov 2017/05/04 12:04:22 g/that/than/
pkalinnikov 2017/05/04 12:04:22 If we have 2 configs, and both return different no
engedy 2017/05/05 12:25:41 Done.
engedy 2017/05/05 12:25:41 Yes and yes, but agreed that it's a bit hacky. Gla
pkalinnikov 2017/05/05 13:29:58 Maybe you could add a short explicit comment that
engedy 2017/05/05 19:24:10 I cleaned this up a bit, so this is no longer a co
+ if (decision != ActivationDecision::ACTIVATION_DISABLED)
+ activation_decision_ = decision;
+ }
+}
+
ContentSubresourceFilterDriverFactory::ActivationDecision
ContentSubresourceFilterDriverFactory::
- ComputeActivationDecisionForMainFrameNavigation(
- content::NavigationHandle* navigation_handle) const {
+ ComputePerConfigActivationDecisionForMainFrameNavigation(
+ content::NavigationHandle* navigation_handle,
+ const Configuration& configuration) const {
const GURL& url(navigation_handle->GetURL());
-
- const auto configurations = GetActiveConfigurations();
- if (configurations->the_one_and_only().activation_level ==
+ if (configuration.activation_options.activation_level ==
ActivationLevel::DISABLED)
return ActivationDecision::ACTIVATION_DISABLED;
- if (configurations->the_one_and_only().activation_scope ==
+ if (configuration.activation_conditions.activation_scope ==
ActivationScope::NO_SITES)
return ActivationDecision::ACTIVATION_DISABLED;
if (!url.SchemeIsHTTPOrHTTPS())
return ActivationDecision::UNSUPPORTED_SCHEME;
+
// TODO(csharrison): The throttle manager also performs this check. Remove
// this one when the activation decision is sent directly to the throttle
// manager.
if (client_->ShouldSuppressActivation(navigation_handle))
return ActivationDecision::URL_WHITELISTED;
- switch (configurations->the_one_and_only().activation_scope) {
+ switch (configuration.activation_conditions.activation_scope) {
case ActivationScope::ALL_SITES:
return ActivationDecision::ACTIVATED;
case ActivationScope::ACTIVATION_LIST: {
@@ -143,10 +162,10 @@ ContentSubresourceFilterDriverFactory::
// entries.
DCHECK(url.SchemeIsHTTPOrHTTPS() ||
!DidURLMatchActivationList(
- url, configurations->the_one_and_only().activation_list));
+ url, configuration.activation_conditions.activation_list));
bool should_activate = DidURLMatchActivationList(
- url, configurations->the_one_and_only().activation_list);
- if (configurations->the_one_and_only().activation_list ==
+ url, configuration.activation_conditions.activation_list);
+ if (configuration.activation_conditions.activation_list ==
ActivationList::PHISHING_INTERSTITIAL) {
// Handling special case, where activation on the phishing sites also
// mean the activation on the sites with social engineering metadata.
@@ -191,37 +210,30 @@ void ContentSubresourceFilterDriverFactory::WillProcessResponse(
RecordRedirectChainMatchPattern();
- const auto configurations = GetActiveConfigurations();
- if (configurations->the_one_and_only().should_whitelist_site_on_reload &&
+ if (activation_options_.should_whitelist_site_on_reload &&
NavigationIsPageReload(url, referrer, transition)) {
// Whitelist this host for the current as well as subsequent navigations.
client_->WhitelistInCurrentWebContents(url);
}
- activation_decision_ =
- ComputeActivationDecisionForMainFrameNavigation(navigation_handle);
- DCHECK(activation_decision_ != ActivationDecision::UNKNOWN);
+ ComputeActivationForMainFrameNavigation(navigation_handle);
+ DCHECK_NE(activation_decision_, ActivationDecision::UNKNOWN);
if (activation_decision_ != ActivationDecision::ACTIVATED) {
- ResetActivationState();
+ DCHECK_EQ(activation_options_.activation_level, ActivationLevel::DISABLED);
return;
}
- activation_level_ = configurations->the_one_and_only().activation_level;
- measure_performance_ =
- activation_level_ != ActivationLevel::DISABLED &&
- ShouldMeasurePerformanceForPageLoad(
- configurations->the_one_and_only().performance_measurement_rate);
- ActivationState state = ActivationState(activation_level_);
- state.measure_performance = measure_performance_;
+ DCHECK_NE(activation_options_.activation_level, ActivationLevel::DISABLED);
+ ActivationState state = ActivationState(activation_options_.activation_level);
+ state.measure_performance = ShouldMeasurePerformanceForPageLoad(
+ activation_options_.performance_measurement_rate);
throttle_manager_->NotifyPageActivationComputed(navigation_handle, state);
}
void ContentSubresourceFilterDriverFactory::OnFirstSubresourceLoadDisallowed() {
- const auto configurations = GetActiveConfigurations();
- if (configurations->the_one_and_only().should_suppress_notifications)
+ if (activation_options_.should_suppress_notifications)
return;
-
- client_->ToggleNotificationVisibility(activation_level_ ==
+ client_->ToggleNotificationVisibility(activation_options_.activation_level ==
ActivationLevel::ENABLED);
}
@@ -230,19 +242,13 @@ bool ContentSubresourceFilterDriverFactory::ShouldSuppressActivation(
return client_->ShouldSuppressActivation(navigation_handle);
}
-void ContentSubresourceFilterDriverFactory::ResetActivationState() {
- navigation_chain_.clear();
- activation_list_matches_.clear();
- activation_level_ = ActivationLevel::DISABLED;
- measure_performance_ = false;
-}
-
void ContentSubresourceFilterDriverFactory::DidStartNavigation(
content::NavigationHandle* navigation_handle) {
if (navigation_handle->IsInMainFrame() &&
!navigation_handle->IsSameDocument()) {
activation_decision_ = ActivationDecision::UNKNOWN;
- ResetActivationState();
+ activation_list_matches_.clear();
+ navigation_chain_.clear();
pkalinnikov 2017/05/04 12:04:22 optional: navigation_chain_.assign(1, navigation_h
engedy 2017/05/05 12:25:41 How about this?
pkalinnikov 2017/05/05 13:29:58 Even better :)
navigation_chain_.push_back(navigation_handle->GetURL());
client_->ToggleNotificationVisibility(false);
}
@@ -255,6 +261,17 @@ void ContentSubresourceFilterDriverFactory::DidRedirectNavigation(
navigation_chain_.push_back(navigation_handle->GetURL());
}
+void ContentSubresourceFilterDriverFactory::DidFinishNavigation(
+ content::NavigationHandle* navigation_handle) {
+ if (navigation_handle->IsInMainFrame() &&
+ !navigation_handle->IsSameDocument() &&
+ activation_decision_ == ActivationDecision::UNKNOWN &&
+ navigation_handle->HasCommitted()) {
+ activation_decision_ = ActivationDecision::ACTIVATION_DISABLED;
+ activation_options_ = Configuration::ActivationOptions();
+ }
+}
+
bool ContentSubresourceFilterDriverFactory::DidURLMatchActivationList(
const GURL& url,
ActivationList activation_list) const {

Powered by Google App Engine
This is Rietveld 408576698