| 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 77bc9b8f44ef22fa8bbbf5a3aa67ed9398a29687..1aaadb53c6b643f8c9b2101a82955f496b36ad12 100644
|
| --- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc
|
| +++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.h"
|
|
|
| +#include <algorithm>
|
| #include <limits>
|
|
|
| #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_condition.h"
|
| @@ -29,16 +30,27 @@ WebRequestRulesRegistry::GetMatches(
|
| // Figure out for which rules the URL match conditions were fulfilled.
|
| typedef std::set<URLMatcherConditionSet::ID> URLMatches;
|
| URLMatches url_matches = url_matcher_.MatchURL(request_data.request->url());
|
| + std::set<const WebRequestRule*> url_matched_rules;
|
| + std::transform(url_matches.begin(), url_matches.end(),
|
| + std::inserter(url_matched_rules, url_matched_rules.begin()),
|
| + RuleTriggersOperator(rule_triggers_));
|
| +
|
| + URLMatches first_party_url_matches = first_party_url_matcher_.MatchURL(
|
| + request_data.request->first_party_for_cookies());
|
|
|
| // Then we need to check for each of these, whether the other
|
| // WebRequestConditionAttributes are also fulfilled.
|
| - for (URLMatches::iterator url_match = url_matches.begin();
|
| - url_match != url_matches.end(); ++url_match) {
|
| + for (URLMatches::iterator url_match = first_party_url_matches.begin();
|
| + url_match != first_party_url_matches.end(); ++url_match) {
|
| RuleTriggers::iterator rule_trigger = rule_triggers_.find(*url_match);
|
| CHECK(rule_trigger != rule_triggers_.end());
|
|
|
| WebRequestRule* rule = rule_trigger->second;
|
| - if (rule->conditions().IsFulfilled(*url_match, request_data))
|
| + // We already iterate over rules which have the first-party URL condition
|
| + // satisfied. Now check that the request URL is also satisfied, and finally
|
| + // check the rest of the attributes.
|
| + if (url_matched_rules.find(rule) != url_matched_rules.end() &&
|
| + rule->conditions().IsFulfilled(*url_match, request_data))
|
| result.insert(rule->id());
|
| }
|
| return result;
|
| @@ -124,11 +136,13 @@ std::string WebRequestRulesRegistry::AddRulesImpl(
|
| DCHECK(webrequest_rules_.find(rule_id) == webrequest_rules_.end());
|
|
|
| scoped_ptr<WebRequestRule> webrequest_rule(
|
| - WebRequestRule::Create(url_matcher_.condition_factory(), extension_id,
|
| + WebRequestRule::Create(url_matcher_.condition_factory(),
|
| + first_party_url_matcher_.condition_factory(),
|
| + extension_id,
|
| extension_installation_time, *rule, &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;
|
| }
|
|
|
| @@ -138,6 +152,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;
|
| }
|
|
|
| @@ -151,19 +166,24 @@ std::string WebRequestRulesRegistry::AddRulesImpl(
|
| URLMatcherConditionSet::Vector url_condition_sets;
|
| const WebRequestConditionSet& conditions = i->second->conditions();
|
| conditions.GetURLMatcherConditionSets(&url_condition_sets);
|
| + conditions.GetFirstPartyURLMatcherConditionSets(&url_condition_sets);
|
| 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_.
|
| + // Register url patterns in |url_matcher_| and |first_party_url_matcher_|.
|
| 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().GetFirstPartyURLMatcherConditionSets(
|
| + &all_new_condition_sets_first_party);
|
| }
|
| url_matcher_.AddConditionSets(all_new_condition_sets);
|
| + first_party_url_matcher_.AddConditionSets(all_new_condition_sets_first_party);
|
|
|
| ClearCacheOnNavigation();
|
|
|
| @@ -173,8 +193,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) {
|
| @@ -187,20 +208,31 @@ 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().GetFirstPartyURLMatcherConditionSets(
|
| + &condition_sets_first_party);
|
| 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());
|
| + }
|
|
|
| // Remove reference to actual rule.
|
| 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();
|
|
|
| @@ -229,7 +261,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() {}
|
| @@ -246,4 +278,12 @@ void WebRequestRulesRegistry::ClearCacheOnNavigation() {
|
| extension_web_request_api_helpers::ClearCacheOnNavigation();
|
| }
|
|
|
| +WebRequestRulesRegistry::RuleTriggersOperator::RuleTriggersOperator(
|
| + const RuleTriggers& triggers)
|
| + : triggers_(triggers) {
|
| +}
|
| +
|
| +WebRequestRulesRegistry::RuleTriggersOperator::~RuleTriggersOperator() {
|
| +}
|
| +
|
| } // namespace extensions
|
|
|