Chromium Code Reviews| Index: chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc |
| diff --git a/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc b/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc |
| index 0e90c2d22ddd6a2d92a6302d2a31009b4f48be5d..ca3aafd0288b09a04807e2ae4e4a3e69955cc157 100644 |
| --- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc |
| +++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc |
| @@ -37,7 +37,11 @@ WebRequestRulesRegistry::GetMatches( |
| typedef std::set<URLMatcherConditionSet::ID> URLMatches; |
| RuleSet result; |
| + |
| URLMatches url_matches = url_matcher_.MatchURL(request_data.request->url()); |
| + URLMatches first_party = first_party_url_matcher_.MatchURL( |
| + request_data.request->first_party_for_cookies()); |
| + url_matches.insert(first_party.begin(), first_party.end()); |
|
vabr (Chromium)
2013/01/21 10:57:48
This means that we first check all conditions trig
battre
2013/01/21 17:32:08
I think we are good here with the current approach
|
| // 1st phase -- add all rules with some conditions without UrlFilter |
| // attributes. |
| @@ -136,18 +140,22 @@ std::string WebRequestRulesRegistry::AddRulesImpl( |
| std::string error; |
| RulesMap new_webrequest_rules; |
| + std::vector<URLMatcherConditionFactory*> factories; |
| + factories.push_back(url_matcher_.condition_factory()); |
| + factories.push_back(first_party_url_matcher_.condition_factory()); |
| + |
| for (std::vector<linked_ptr<RulesRegistry::Rule> >::const_iterator rule = |
| rules.begin(); rule != rules.end(); ++rule) { |
| WebRequestRule::GlobalRuleId rule_id(extension_id, *(*rule)->id); |
| DCHECK(webrequest_rules_.find(rule_id) == webrequest_rules_.end()); |
| scoped_ptr<WebRequestRule> webrequest_rule( |
| - WebRequestRule::Create(url_matcher_.condition_factory(), extension_id, |
| - extension_installation_time, *rule, |
| - &CheckConsistency, &error)); |
| + WebRequestRule::Create(factories, |
| + extension_id, extension_installation_time, |
| + *rule, &CheckConsistency, &error)); |
| if (!error.empty()) { |
| // We don't return here, because we want to clear temporary |
| - // condition sets in the url_matcher_. |
| + // condition sets in |url_matcher_| and |first_party_url_matcher_|. |
| break; |
| } |
| @@ -157,6 +165,7 @@ std::string WebRequestRulesRegistry::AddRulesImpl( |
| if (!error.empty()) { |
| // Clean up temporary condition sets created during rule creation. |
| url_matcher_.ClearUnusedConditionSets(); |
| + first_party_url_matcher_.ClearUnusedConditionSets(); |
| return error; |
| } |
| @@ -169,23 +178,29 @@ std::string WebRequestRulesRegistry::AddRulesImpl( |
| i != new_webrequest_rules.end(); ++i) { |
| URLMatcherConditionSet::Vector url_condition_sets; |
| const WebRequestConditionSet& conditions = i->second->conditions(); |
| - conditions.GetURLMatcherConditionSets(&url_condition_sets); |
| + conditions.GetURLMatcherConditionSets(&url_condition_sets, 0); |
| + conditions.GetURLMatcherConditionSets(&url_condition_sets, 1); |
| for (URLMatcherConditionSet::Vector::iterator j = |
| url_condition_sets.begin(); j != url_condition_sets.end(); ++j) { |
| rule_triggers_[(*j)->id()] = i->second.get(); |
| } |
| } |
| - // Register url patterns in |url_matcher_| and |
| + // Register url patterns with both URL matchers and |
| // |rules_with_untriggered_conditions_|. |
| URLMatcherConditionSet::Vector all_new_condition_sets; |
| + URLMatcherConditionSet::Vector all_new_condition_sets_first_party; |
| for (RulesMap::iterator i = new_webrequest_rules.begin(); |
| i != new_webrequest_rules.end(); ++i) { |
| - i->second->conditions().GetURLMatcherConditionSets(&all_new_condition_sets); |
| + i->second->conditions().GetURLMatcherConditionSets( |
| + &all_new_condition_sets, 0); |
| + i->second->conditions().GetURLMatcherConditionSets( |
| + &all_new_condition_sets_first_party, 1); |
| if (i->second->conditions().HasConditionsWithoutUrls()) |
| rules_with_untriggered_conditions_.insert(i->second.get()); |
| } |
| url_matcher_.AddConditionSets(all_new_condition_sets); |
| + first_party_url_matcher_.AddConditionSets(all_new_condition_sets_first_party); |
| ClearCacheOnNavigation(); |
| @@ -195,8 +210,9 @@ std::string WebRequestRulesRegistry::AddRulesImpl( |
| std::string WebRequestRulesRegistry::RemoveRulesImpl( |
| const std::string& extension_id, |
| const std::vector<std::string>& rule_identifiers) { |
| - // URLMatcherConditionSet IDs that can be removed from URLMatcher. |
| + // URLMatcherConditionSet IDs that can be removed from URL matchers. |
| std::vector<URLMatcherConditionSet::ID> remove_from_url_matcher; |
| + std::vector<URLMatcherConditionSet::ID> remove_from_first_party_url_matcher; |
| for (std::vector<std::string>::const_iterator i = rule_identifiers.begin(); |
| i != rule_identifiers.end(); ++i) { |
| @@ -209,13 +225,22 @@ std::string WebRequestRulesRegistry::RemoveRulesImpl( |
| // Remove all triggers but collect their IDs. |
| URLMatcherConditionSet::Vector condition_sets; |
| + URLMatcherConditionSet::Vector condition_sets_first_party; |
| WebRequestRule* rule = webrequest_rules_entry->second.get(); |
| - rule->conditions().GetURLMatcherConditionSets(&condition_sets); |
| + rule->conditions().GetURLMatcherConditionSets(&condition_sets, 0); |
| + rule->conditions().GetURLMatcherConditionSets( |
| + &condition_sets_first_party, 1); |
| for (URLMatcherConditionSet::Vector::iterator j = condition_sets.begin(); |
| j != condition_sets.end(); ++j) { |
| remove_from_url_matcher.push_back((*j)->id()); |
| rule_triggers_.erase((*j)->id()); |
| } |
| + for (URLMatcherConditionSet::Vector::iterator j = |
| + condition_sets_first_party.begin(); |
| + j != condition_sets_first_party.end(); ++j) { |
| + remove_from_first_party_url_matcher.push_back((*j)->id()); |
| + rule_triggers_.erase((*j)->id()); |
| + } |
| rules_with_untriggered_conditions_.erase(rule); |
| @@ -223,8 +248,10 @@ std::string WebRequestRulesRegistry::RemoveRulesImpl( |
| webrequest_rules_.erase(webrequest_rules_entry); |
| } |
| - // Clear URLMatcher based on condition_set_ids that are not needed any more. |
| + // Clear URL matchers based on condition_set_ids that are not needed any more. |
| url_matcher_.RemoveConditionSets(remove_from_url_matcher); |
| + first_party_url_matcher_.RemoveConditionSets( |
| + remove_from_first_party_url_matcher); |
| ClearCacheOnNavigation(); |
| @@ -253,7 +280,7 @@ content::BrowserThread::ID WebRequestRulesRegistry::GetOwnerThread() const { |
| bool WebRequestRulesRegistry::IsEmpty() const { |
| return rule_triggers_.empty() && webrequest_rules_.empty() && |
| - url_matcher_.IsEmpty(); |
| + url_matcher_.IsEmpty() && first_party_url_matcher_.IsEmpty(); |
| } |
| WebRequestRulesRegistry::~WebRequestRulesRegistry() {} |