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..499ddd71d6ea1267ad9aab85eaa0d3980ce173b0 100644 |
--- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc |
+++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc |
@@ -26,7 +26,17 @@ WebRequestRulesRegistry::GetMatches( |
const WebRequestRule::RequestData& request_data) { |
std::set<WebRequestRule::GlobalRuleId> result; |
- // Figure out for which rules the URL match conditions were fulfilled. |
+ // First check for rules with a satisfied condition set without URL |
Jeffrey Yasskin
2012/12/18 02:24:32
Given the next change you're making, and the decla
battre
2012/12/18 17:17:54
This is a very elegant way of dealing with this. S
vabr (Chromium)
2012/12/18 18:26:42
I implemented Jeffrey's suggestion. My only concer
|
+ // attributes. |
+ for (std::set<const WebRequestRule*>::iterator rule = |
+ rules_with_untriggered_conditions_.begin(); |
+ rule != rules_with_untriggered_conditions_.end(); ++rule) { |
+ if (result.find((*rule)->id()) == result.end() && |
+ (*rule)->conditions().IsFulfilledWithoutURLMatcher(request_data)) |
+ result.insert((*rule)->id()); |
+ } |
+ |
+ // Now 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()); |
@@ -38,7 +48,8 @@ WebRequestRulesRegistry::GetMatches( |
CHECK(rule_trigger != rule_triggers_.end()); |
WebRequestRule* rule = rule_trigger->second; |
- if (rule->conditions().IsFulfilled(*url_match, request_data)) |
+ if (result.find(rule->id()) == result.end() && |
vabr (Chromium)
2012/12/13 12:18:06
This check spares time, because some rules might b
battre
2012/12/18 08:20:44
Use ContainsKey from base/stl_util.h?
vabr (Chromium)
2012/12/18 18:26:42
Code changed. But thanks, base/stl_util.h is a use
|
+ rule->conditions().IsFulfilled(*url_match, request_data)) |
result.insert(rule->id()); |
} |
return result; |
@@ -157,11 +168,14 @@ std::string WebRequestRulesRegistry::AddRulesImpl( |
} |
} |
- // Register url patterns in url_matcher_. |
+ // Register url patterns in |url_matcher_| and |
+ // |rules_with_untriggered_conditions_|. |
URLMatcherConditionSet::Vector all_new_condition_sets; |
for (RulesMap::iterator i = new_webrequest_rules.begin(); |
i != new_webrequest_rules.end(); ++i) { |
i->second->conditions().GetURLMatcherConditionSets(&all_new_condition_sets); |
+ if (i->second->conditions().has_untriggered_conditions()) |
+ rules_with_untriggered_conditions_.insert(i->second.get()); |
} |
url_matcher_.AddConditionSets(all_new_condition_sets); |
@@ -195,8 +209,9 @@ std::string WebRequestRulesRegistry::RemoveRulesImpl( |
rule_triggers_.erase((*j)->id()); |
} |
- // Remove reference to actual rule. |
Jeffrey Yasskin
2012/12/18 02:24:32
This comment should probably have read "Remove own
vabr (Chromium)
2012/12/18 18:26:42
Corrected.
|
+ // Remove references to the rule. |
webrequest_rules_.erase(webrequest_rules_entry); |
+ rules_with_untriggered_conditions_.erase(rule); |
Jeffrey Yasskin
2012/12/18 02:24:32
This ought to happen before webrequest_rules_.eras
vabr (Chromium)
2012/12/18 18:26:42
Makes sense, thanks for explaining that to me.
I c
|
} |
// Clear URLMatcher based on condition_set_ids that are not needed any more. |