OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_ registry.h" | 5 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rules_ registry.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_condit ion.h" | 9 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_condit ion.h" |
10 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h" | 10 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h" |
11 #include "chrome/browser/extensions/api/web_request/web_request_permissions.h" | 11 #include "chrome/browser/extensions/api/web_request/web_request_permissions.h" |
12 #include "chrome/browser/extensions/extension_system.h" | 12 #include "chrome/browser/extensions/extension_system.h" |
13 #include "net/url_request/url_request.h" | 13 #include "net/url_request/url_request.h" |
14 | 14 |
15 namespace extensions { | 15 namespace extensions { |
16 | 16 |
17 WebRequestRulesRegistry::WebRequestRulesRegistry(Profile* profile, | 17 WebRequestRulesRegistry::WebRequestRulesRegistry(Profile* profile, |
18 Delegate* delegate) | 18 Delegate* delegate) |
19 : RulesRegistryWithCache(delegate) { | 19 : RulesRegistryWithCache(delegate) { |
20 if (profile) | 20 if (profile) |
21 extension_info_map_ = ExtensionSystem::Get(profile)->info_map(); | 21 extension_info_map_ = ExtensionSystem::Get(profile)->info_map(); |
22 } | 22 } |
23 | 23 |
24 std::set<WebRequestRule::GlobalRuleId> | 24 std::set<WebRequestRule::GlobalRuleId> |
25 WebRequestRulesRegistry::GetMatches( | 25 WebRequestRulesRegistry::GetMatches( |
26 const WebRequestRule::RequestData& request_data) { | 26 const WebRequestRule::RequestData& request_data) { |
27 std::set<WebRequestRule::GlobalRuleId> result; | 27 std::set<WebRequestRule::GlobalRuleId> result; |
28 | 28 |
29 // Figure out for which rules the URL match conditions were fulfilled. | 29 // 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
| |
30 // attributes. | |
31 for (std::set<const WebRequestRule*>::iterator rule = | |
32 rules_with_untriggered_conditions_.begin(); | |
33 rule != rules_with_untriggered_conditions_.end(); ++rule) { | |
34 if (result.find((*rule)->id()) == result.end() && | |
35 (*rule)->conditions().IsFulfilledWithoutURLMatcher(request_data)) | |
36 result.insert((*rule)->id()); | |
37 } | |
38 | |
39 // Now figure out for which rules the URL match conditions were fulfilled. | |
30 typedef std::set<URLMatcherConditionSet::ID> URLMatches; | 40 typedef std::set<URLMatcherConditionSet::ID> URLMatches; |
31 URLMatches url_matches = url_matcher_.MatchURL(request_data.request->url()); | 41 URLMatches url_matches = url_matcher_.MatchURL(request_data.request->url()); |
32 | 42 |
33 // Then we need to check for each of these, whether the other | 43 // Then we need to check for each of these, whether the other |
34 // WebRequestConditionAttributes are also fulfilled. | 44 // WebRequestConditionAttributes are also fulfilled. |
35 for (URLMatches::iterator url_match = url_matches.begin(); | 45 for (URLMatches::iterator url_match = url_matches.begin(); |
36 url_match != url_matches.end(); ++url_match) { | 46 url_match != url_matches.end(); ++url_match) { |
37 RuleTriggers::iterator rule_trigger = rule_triggers_.find(*url_match); | 47 RuleTriggers::iterator rule_trigger = rule_triggers_.find(*url_match); |
38 CHECK(rule_trigger != rule_triggers_.end()); | 48 CHECK(rule_trigger != rule_triggers_.end()); |
39 | 49 |
40 WebRequestRule* rule = rule_trigger->second; | 50 WebRequestRule* rule = rule_trigger->second; |
41 if (rule->conditions().IsFulfilled(*url_match, request_data)) | 51 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
| |
52 rule->conditions().IsFulfilled(*url_match, request_data)) | |
42 result.insert(rule->id()); | 53 result.insert(rule->id()); |
43 } | 54 } |
44 return result; | 55 return result; |
45 } | 56 } |
46 | 57 |
47 std::list<LinkedPtrEventResponseDelta> WebRequestRulesRegistry::CreateDeltas( | 58 std::list<LinkedPtrEventResponseDelta> WebRequestRulesRegistry::CreateDeltas( |
48 const ExtensionInfoMap* extension_info_map, | 59 const ExtensionInfoMap* extension_info_map, |
49 const WebRequestRule::RequestData& request_data, | 60 const WebRequestRule::RequestData& request_data, |
50 bool crosses_incognito) { | 61 bool crosses_incognito) { |
51 if (webrequest_rules_.empty()) | 62 if (webrequest_rules_.empty()) |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
150 i != new_webrequest_rules.end(); ++i) { | 161 i != new_webrequest_rules.end(); ++i) { |
151 URLMatcherConditionSet::Vector url_condition_sets; | 162 URLMatcherConditionSet::Vector url_condition_sets; |
152 const WebRequestConditionSet& conditions = i->second->conditions(); | 163 const WebRequestConditionSet& conditions = i->second->conditions(); |
153 conditions.GetURLMatcherConditionSets(&url_condition_sets); | 164 conditions.GetURLMatcherConditionSets(&url_condition_sets); |
154 for (URLMatcherConditionSet::Vector::iterator j = | 165 for (URLMatcherConditionSet::Vector::iterator j = |
155 url_condition_sets.begin(); j != url_condition_sets.end(); ++j) { | 166 url_condition_sets.begin(); j != url_condition_sets.end(); ++j) { |
156 rule_triggers_[(*j)->id()] = i->second.get(); | 167 rule_triggers_[(*j)->id()] = i->second.get(); |
157 } | 168 } |
158 } | 169 } |
159 | 170 |
160 // Register url patterns in url_matcher_. | 171 // Register url patterns in |url_matcher_| and |
172 // |rules_with_untriggered_conditions_|. | |
161 URLMatcherConditionSet::Vector all_new_condition_sets; | 173 URLMatcherConditionSet::Vector all_new_condition_sets; |
162 for (RulesMap::iterator i = new_webrequest_rules.begin(); | 174 for (RulesMap::iterator i = new_webrequest_rules.begin(); |
163 i != new_webrequest_rules.end(); ++i) { | 175 i != new_webrequest_rules.end(); ++i) { |
164 i->second->conditions().GetURLMatcherConditionSets(&all_new_condition_sets); | 176 i->second->conditions().GetURLMatcherConditionSets(&all_new_condition_sets); |
177 if (i->second->conditions().has_untriggered_conditions()) | |
178 rules_with_untriggered_conditions_.insert(i->second.get()); | |
165 } | 179 } |
166 url_matcher_.AddConditionSets(all_new_condition_sets); | 180 url_matcher_.AddConditionSets(all_new_condition_sets); |
167 | 181 |
168 ClearCacheOnNavigation(); | 182 ClearCacheOnNavigation(); |
169 | 183 |
170 return ""; | 184 return ""; |
171 } | 185 } |
172 | 186 |
173 std::string WebRequestRulesRegistry::RemoveRulesImpl( | 187 std::string WebRequestRulesRegistry::RemoveRulesImpl( |
174 const std::string& extension_id, | 188 const std::string& extension_id, |
(...skipping 13 matching lines...) Expand all Loading... | |
188 // Remove all triggers but collect their IDs. | 202 // Remove all triggers but collect their IDs. |
189 URLMatcherConditionSet::Vector condition_sets; | 203 URLMatcherConditionSet::Vector condition_sets; |
190 WebRequestRule* rule = webrequest_rules_entry->second.get(); | 204 WebRequestRule* rule = webrequest_rules_entry->second.get(); |
191 rule->conditions().GetURLMatcherConditionSets(&condition_sets); | 205 rule->conditions().GetURLMatcherConditionSets(&condition_sets); |
192 for (URLMatcherConditionSet::Vector::iterator j = condition_sets.begin(); | 206 for (URLMatcherConditionSet::Vector::iterator j = condition_sets.begin(); |
193 j != condition_sets.end(); ++j) { | 207 j != condition_sets.end(); ++j) { |
194 remove_from_url_matcher.push_back((*j)->id()); | 208 remove_from_url_matcher.push_back((*j)->id()); |
195 rule_triggers_.erase((*j)->id()); | 209 rule_triggers_.erase((*j)->id()); |
196 } | 210 } |
197 | 211 |
198 // Remove reference to actual rule. | 212 // Remove references to the 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.
| |
199 webrequest_rules_.erase(webrequest_rules_entry); | 213 webrequest_rules_.erase(webrequest_rules_entry); |
214 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
| |
200 } | 215 } |
201 | 216 |
202 // Clear URLMatcher based on condition_set_ids that are not needed any more. | 217 // Clear URLMatcher based on condition_set_ids that are not needed any more. |
203 url_matcher_.RemoveConditionSets(remove_from_url_matcher); | 218 url_matcher_.RemoveConditionSets(remove_from_url_matcher); |
204 | 219 |
205 ClearCacheOnNavigation(); | 220 ClearCacheOnNavigation(); |
206 | 221 |
207 return ""; | 222 return ""; |
208 } | 223 } |
209 | 224 |
(...skipping 30 matching lines...) Expand all Loading... | |
240 return base::Time(); | 255 return base::Time(); |
241 | 256 |
242 return extension_info_map_->GetInstallTime(extension_id); | 257 return extension_info_map_->GetInstallTime(extension_id); |
243 } | 258 } |
244 | 259 |
245 void WebRequestRulesRegistry::ClearCacheOnNavigation() { | 260 void WebRequestRulesRegistry::ClearCacheOnNavigation() { |
246 extension_web_request_api_helpers::ClearCacheOnNavigation(); | 261 extension_web_request_api_helpers::ClearCacheOnNavigation(); |
247 } | 262 } |
248 | 263 |
249 } // namespace extensions | 264 } // namespace extensions |
OLD | NEW |