| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_rule.h
" | |
| 6 | |
| 7 #include "base/logging.h" | |
| 8 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_action
.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" | |
| 11 #include "chrome/browser/extensions/api/web_request/web_request_permissions.h" | |
| 12 #include "chrome/browser/extensions/extension_info_map.h" | |
| 13 #include "chrome/common/extensions/extension.h" | |
| 14 | |
| 15 namespace { | |
| 16 const char kInvalidActionDatatype[] = "An action of a rule set had an invalid " | |
| 17 "structure that should have been caught by the JSON validator."; | |
| 18 const char kActionCannotBeExecuted[] = "An action can never be executed " | |
| 19 "because there are is no time in the request life-cycle during which the " | |
| 20 "conditions can be checked and the action can possibly be executed."; | |
| 21 } // namespace | |
| 22 | |
| 23 namespace extensions { | |
| 24 | |
| 25 WebRequestRule::WebRequestRule( | |
| 26 const GlobalRuleId& id, | |
| 27 base::Time extension_installation_time, | |
| 28 scoped_ptr<WebRequestConditionSet> conditions, | |
| 29 scoped_ptr<WebRequestActionSet> actions, | |
| 30 Priority priority) | |
| 31 : id_(id), | |
| 32 extension_installation_time_(extension_installation_time), | |
| 33 conditions_(conditions.release()), | |
| 34 actions_(actions.release()), | |
| 35 priority_(priority) { | |
| 36 CHECK(conditions_.get()); | |
| 37 CHECK(actions_.get()); | |
| 38 } | |
| 39 | |
| 40 WebRequestRule::~WebRequestRule() {} | |
| 41 | |
| 42 // static | |
| 43 bool WebRequestRule::CheckConsistency( | |
| 44 WebRequestConditionSet* conditions, | |
| 45 WebRequestActionSet* actions, | |
| 46 std::string* error) { | |
| 47 // Actions and conditions can be checked and executed in specific phases | |
| 48 // of each web request. We consider a rule inconsistent if there is an action | |
| 49 // that cannot be triggered by any condition. | |
| 50 for (WebRequestActionSet::Actions::const_iterator action_iter = | |
| 51 actions->actions().begin(); | |
| 52 action_iter != actions->actions().end(); | |
| 53 ++action_iter) { | |
| 54 bool found_matching_condition = false; | |
| 55 for (WebRequestConditionSet::Conditions::const_iterator condition_iter = | |
| 56 conditions->conditions().begin(); | |
| 57 condition_iter != conditions->conditions().end() && | |
| 58 !found_matching_condition; | |
| 59 ++condition_iter) { | |
| 60 // Test the intersection of bit masks, this is intentionally & and not &&. | |
| 61 if ((*action_iter)->GetStages() & (*condition_iter)->stages()) | |
| 62 found_matching_condition = true; | |
| 63 } | |
| 64 if (!found_matching_condition) { | |
| 65 *error = kActionCannotBeExecuted; | |
| 66 return false; | |
| 67 } | |
| 68 } | |
| 69 return true; | |
| 70 } | |
| 71 | |
| 72 // static | |
| 73 scoped_ptr<WebRequestRule> WebRequestRule::Create( | |
| 74 URLMatcherConditionFactory* url_matcher_condition_factory, | |
| 75 const std::string& extension_id, | |
| 76 base::Time extension_installation_time, | |
| 77 linked_ptr<RulesRegistry::Rule> rule, | |
| 78 std::string* error) { | |
| 79 scoped_ptr<WebRequestRule> error_result; | |
| 80 | |
| 81 scoped_ptr<WebRequestConditionSet> conditions = | |
| 82 WebRequestConditionSet::Create( | |
| 83 url_matcher_condition_factory, rule->conditions, error); | |
| 84 if (!error->empty()) | |
| 85 return error_result.Pass(); | |
| 86 CHECK(conditions.get()); | |
| 87 | |
| 88 bool bad_message = false; | |
| 89 scoped_ptr<WebRequestActionSet> actions = | |
| 90 WebRequestActionSet::Create(rule->actions, error, &bad_message); | |
| 91 if (bad_message) { | |
| 92 // TODO(battre) Export concept of bad_message to caller, the extension | |
| 93 // should be killed in case it is true. | |
| 94 *error = kInvalidActionDatatype; | |
| 95 return error_result.Pass(); | |
| 96 } | |
| 97 if (!error->empty() || bad_message) | |
| 98 return error_result.Pass(); | |
| 99 CHECK(actions.get()); | |
| 100 | |
| 101 if (!CheckConsistency(conditions.get(), actions.get(), error)) { | |
| 102 DCHECK(!error->empty()); | |
| 103 return error_result.Pass(); | |
| 104 } | |
| 105 | |
| 106 CHECK(rule->priority.get()); | |
| 107 int priority = *(rule->priority); | |
| 108 | |
| 109 GlobalRuleId rule_id(extension_id, *(rule->id)); | |
| 110 return scoped_ptr<WebRequestRule>( | |
| 111 new WebRequestRule(rule_id, extension_installation_time, | |
| 112 conditions.Pass(), actions.Pass(), priority)); | |
| 113 } | |
| 114 | |
| 115 std::list<LinkedPtrEventResponseDelta> WebRequestRule::CreateDeltas( | |
| 116 const ExtensionInfoMap* extension_info_map, | |
| 117 const RequestData& request_data, | |
| 118 bool crosses_incognito) const { | |
| 119 return actions_->CreateDeltas(extension_info_map, extension_id(), | |
| 120 request_data, crosses_incognito, | |
| 121 extension_installation_time_); | |
| 122 } | |
| 123 | |
| 124 int WebRequestRule::GetMinimumPriority() const { | |
| 125 return actions_->GetMinimumPriority(); | |
| 126 } | |
| 127 | |
| 128 } // namespace extensions | |
| OLD | NEW |