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

Unified Diff: chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc

Issue 11569007: Refactoring how conditions without URL attributes are handled. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Typo Created 7 years, 11 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: 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..06477a1c27774c8ff2198a31329e0bf92784b0aa 100644
--- a/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc
+++ b/chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.cc
@@ -4,8 +4,11 @@
#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_registry.h"
+#include <algorithm>
#include <limits>
+#include <utility>
+#include "base/stl_util.h"
#include "chrome/browser/extensions/api/declarative_webrequest/webrequest_condition.h"
#include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h"
#include "chrome/browser/extensions/api/web_request/web_request_permissions.h"
@@ -21,26 +24,34 @@ WebRequestRulesRegistry::WebRequestRulesRegistry(Profile* profile,
extension_info_map_ = ExtensionSystem::Get(profile)->info_map();
}
-std::set<WebRequestRule::GlobalRuleId>
+std::set<const WebRequestRule*>
WebRequestRulesRegistry::GetMatches(
const WebRequestRule::RequestData& request_data) {
- std::set<WebRequestRule::GlobalRuleId> result;
-
- // Figure out for which rules the URL match conditions were fulfilled.
+ typedef std::set<const WebRequestRule*> RuleSet;
typedef std::set<URLMatcherConditionSet::ID> URLMatches;
+
+ RuleSet result;
URLMatches url_matches = url_matcher_.MatchURL(request_data.request->url());
- // Then we need to check for each of these, whether the other
- // WebRequestConditionAttributes are also fulfilled.
- for (URLMatches::iterator url_match = url_matches.begin();
+ // 1st phase -- add all rules with some conditions without UrlFilter
+ // attributes.
+ for (RuleSet::const_iterator it = rules_with_untriggered_conditions_.begin();
+ it != rules_with_untriggered_conditions_.end(); ++it) {
+ if ((*it)->conditions().IsFulfilled(-1, url_matches, request_data))
+ result.insert(*it);
+ }
+
+ // 2nd phase -- add all rules with some conditions triggered by URL matches.
+ for (URLMatches::const_iterator url_match = url_matches.begin();
url_match != url_matches.end(); ++url_match) {
- RuleTriggers::iterator rule_trigger = rule_triggers_.find(*url_match);
+ RuleTriggers::const_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))
- result.insert(rule->id());
+ if (!ContainsKey(result, rule_trigger->second) &&
+ rule_trigger->second->conditions().IsFulfilled(*url_match, url_matches,
+ request_data))
+ result.insert(rule_trigger->second);
}
+
return result;
}
@@ -51,8 +62,7 @@ std::list<LinkedPtrEventResponseDelta> WebRequestRulesRegistry::CreateDeltas(
if (webrequest_rules_.empty())
return std::list<LinkedPtrEventResponseDelta>();
- std::set<WebRequestRule::GlobalRuleId> matches =
- GetMatches(request_data);
+ std::set<const WebRequestRule*> matches = GetMatches(request_data);
// Sort all matching rules by their priority so that they can be processed
// in decreasing order.
@@ -60,11 +70,9 @@ std::list<LinkedPtrEventResponseDelta> WebRequestRulesRegistry::CreateDeltas(
PriorityRuleIdPair;
std::vector<PriorityRuleIdPair> ordered_matches;
ordered_matches.reserve(matches.size());
- for (std::set<WebRequestRule::GlobalRuleId>::iterator i = matches.begin();
+ for (std::set<const WebRequestRule*>::iterator i = matches.begin();
i != matches.end(); ++i) {
- RulesMap::const_iterator rule = webrequest_rules_.find(*i);
- CHECK(rule != webrequest_rules_.end());
- ordered_matches.push_back(make_pair(rule->second->priority(), *i));
+ ordered_matches.push_back(make_pair((*i)->priority(), (*i)->id()));
}
// Sort from rbegin to rend in order to get descending priority order.
std::sort(ordered_matches.rbegin(), ordered_matches.rend());
@@ -157,11 +165,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().HasConditionsWithoutUrls())
+ rules_with_untriggered_conditions_.insert(i->second.get());
}
url_matcher_.AddConditionSets(all_new_condition_sets);
@@ -195,7 +206,9 @@ std::string WebRequestRulesRegistry::RemoveRulesImpl(
rule_triggers_.erase((*j)->id());
}
- // Remove reference to actual rule.
+ rules_with_untriggered_conditions_.erase(rule);
+
+ // Removes the owning references to (and thus deletes) the rule.
webrequest_rules_.erase(webrequest_rules_entry);
}

Powered by Google App Engine
This is Rietveld 408576698