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(net::URLRequest* request, | 25 WebRequestRulesRegistry::GetMatches( |
26 RequestStages request_stage) { | 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 // Figure out for which rules the URL match conditions were fulfilled. |
30 typedef std::set<URLMatcherConditionSet::ID> URLMatches; | 30 typedef std::set<URLMatcherConditionSet::ID> URLMatches; |
31 URLMatches url_matches = url_matcher_.MatchURL(request->url()); | 31 URLMatches url_matches = url_matcher_.MatchURL(request_data.request->url()); |
32 | 32 |
33 // Then we need to check for each of these, whether the other | 33 // Then we need to check for each of these, whether the other |
34 // WebRequestConditionAttributes are also fulfilled. | 34 // WebRequestConditionAttributes are also fulfilled. |
35 for (URLMatches::iterator url_match = url_matches.begin(); | 35 for (URLMatches::iterator url_match = url_matches.begin(); |
36 url_match != url_matches.end(); ++url_match) { | 36 url_match != url_matches.end(); ++url_match) { |
37 RuleTriggers::iterator rule_trigger = rule_triggers_.find(*url_match); | 37 RuleTriggers::iterator rule_trigger = rule_triggers_.find(*url_match); |
38 CHECK(rule_trigger != rule_triggers_.end()); | 38 CHECK(rule_trigger != rule_triggers_.end()); |
39 | 39 |
40 WebRequestRule* rule = rule_trigger->second; | 40 WebRequestRule* rule = rule_trigger->second; |
41 if (rule->conditions().IsFulfilled(*url_match, request, request_stage)) | 41 if (rule->conditions().IsFulfilled(*url_match, request_data)) |
42 result.insert(rule->id()); | 42 result.insert(rule->id()); |
43 } | 43 } |
44 return result; | 44 return result; |
45 } | 45 } |
46 | 46 |
47 std::list<LinkedPtrEventResponseDelta> WebRequestRulesRegistry::CreateDeltas( | 47 std::list<LinkedPtrEventResponseDelta> WebRequestRulesRegistry::CreateDeltas( |
48 const ExtensionInfoMap* extension_info_map, | 48 const ExtensionInfoMap* extension_info_map, |
49 net::URLRequest* request, | 49 const WebRequestRule::RequestData& request_data, |
50 bool crosses_incognito, | 50 bool crosses_incognito) { |
51 RequestStages request_stage, | |
52 const WebRequestRule::OptionalRequestData& optional_request_data) { | |
53 if (webrequest_rules_.empty()) | 51 if (webrequest_rules_.empty()) |
54 return std::list<LinkedPtrEventResponseDelta>(); | 52 return std::list<LinkedPtrEventResponseDelta>(); |
55 | 53 |
56 std::set<WebRequestRule::GlobalRuleId> matches = | 54 std::set<WebRequestRule::GlobalRuleId> matches = |
57 GetMatches(request, request_stage); | 55 GetMatches(request_data); |
58 | 56 |
59 // Sort all matching rules by their priority so that they can be processed | 57 // Sort all matching rules by their priority so that they can be processed |
60 // in decreasing order. | 58 // in decreasing order. |
61 typedef std::pair<WebRequestRule::Priority, WebRequestRule::GlobalRuleId> | 59 typedef std::pair<WebRequestRule::Priority, WebRequestRule::GlobalRuleId> |
62 PriorityRuleIdPair; | 60 PriorityRuleIdPair; |
63 std::vector<PriorityRuleIdPair> ordered_matches; | 61 std::vector<PriorityRuleIdPair> ordered_matches; |
64 ordered_matches.reserve(matches.size()); | 62 ordered_matches.reserve(matches.size()); |
65 for (std::set<WebRequestRule::GlobalRuleId>::iterator i = matches.begin(); | 63 for (std::set<WebRequestRule::GlobalRuleId>::iterator i = matches.begin(); |
66 i != matches.end(); ++i) { | 64 i != matches.end(); ++i) { |
67 RulesMap::const_iterator rule = webrequest_rules_.find(*i); | 65 RulesMap::const_iterator rule = webrequest_rules_.find(*i); |
(...skipping 27 matching lines...) Expand all Loading... |
95 const WebRequestRule* rule = webrequest_rules_[rule_id].get(); | 93 const WebRequestRule* rule = webrequest_rules_[rule_id].get(); |
96 CHECK(rule); | 94 CHECK(rule); |
97 | 95 |
98 // Skip rule if a previous rule of this extension instructed to ignore | 96 // Skip rule if a previous rule of this extension instructed to ignore |
99 // all rules with a lower priority than min_priorities[extension_id]. | 97 // all rules with a lower priority than min_priorities[extension_id]. |
100 int current_min_priority = min_priorities[extension_id]; | 98 int current_min_priority = min_priorities[extension_id]; |
101 if (priority_of_rule < current_min_priority) | 99 if (priority_of_rule < current_min_priority) |
102 continue; | 100 continue; |
103 | 101 |
104 std::list<LinkedPtrEventResponseDelta> rule_result = | 102 std::list<LinkedPtrEventResponseDelta> rule_result = |
105 rule->CreateDeltas(extension_info_map, request, crosses_incognito, | 103 rule->CreateDeltas(extension_info_map, request_data, crosses_incognito); |
106 request_stage, optional_request_data); | |
107 result.splice(result.begin(), rule_result); | 104 result.splice(result.begin(), rule_result); |
108 | 105 |
109 min_priorities[extension_id] = std::max(current_min_priority, | 106 min_priorities[extension_id] = std::max(current_min_priority, |
110 rule->GetMinimumPriority()); | 107 rule->GetMinimumPriority()); |
111 } | 108 } |
112 return result; | 109 return result; |
113 } | 110 } |
114 | 111 |
115 std::string WebRequestRulesRegistry::AddRulesImpl( | 112 std::string WebRequestRulesRegistry::AddRulesImpl( |
116 const std::string& extension_id, | 113 const std::string& extension_id, |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 | 230 |
234 base::Time WebRequestRulesRegistry::GetExtensionInstallationTime( | 231 base::Time WebRequestRulesRegistry::GetExtensionInstallationTime( |
235 const std::string& extension_id) const { | 232 const std::string& extension_id) const { |
236 if (!extension_info_map_.get()) // May be NULL during testing. | 233 if (!extension_info_map_.get()) // May be NULL during testing. |
237 return base::Time(); | 234 return base::Time(); |
238 | 235 |
239 return extension_info_map_->GetInstallTime(extension_id); | 236 return extension_info_map_->GetInstallTime(extension_id); |
240 } | 237 } |
241 | 238 |
242 } // namespace extensions | 239 } // namespace extensions |
OLD | NEW |