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_action
.h" | 5 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_action
.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/stringprintf.h" | 8 #include "base/stringprintf.h" |
9 #include "base/values.h" | 9 #include "base/values.h" |
10 #include "chrome/browser/extensions/api/declarative_webrequest/request_stages.h" | 10 #include "chrome/browser/extensions/api/declarative_webrequest/request_stages.h" |
11 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_consta
nts.h" | 11 #include "chrome/browser/extensions/api/declarative_webrequest/webrequest_consta
nts.h" |
12 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.h" | 12 #include "chrome/browser/extensions/api/web_request/web_request_api_helpers.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 namespace keys = declarative_webrequest_constants; | 17 namespace keys = declarative_webrequest_constants; |
18 | 18 |
19 namespace { | 19 namespace { |
20 // Error messages. | 20 // Error messages. |
21 const char kExpectedDictionary[] = "Expected a dictionary as action."; | 21 const char kExpectedDictionary[] = "Expected a dictionary as action."; |
22 const char kInvalidInstanceTypeError[] = | 22 const char kInvalidInstanceTypeError[] = |
23 "An action has an invalid instanceType: %s"; | 23 "An action has an invalid instanceType: %s"; |
24 const char kMissingRedirectUrl[] = "No redirection target specified."; | 24 const char kMissingRedirectUrl[] = "No redirection target specified."; |
| 25 |
| 26 const char kTransparentImageUrl[] = "data:image/png;base64,iVBORw0KGgoAAAANSUh" |
| 27 "EUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg=="; |
| 28 const char kEmptyDocumentUrl[] = "data:text/html,"; |
25 } // namespace | 29 } // namespace |
26 | 30 |
27 // | 31 // |
28 // WebRequestAction | 32 // WebRequestAction |
29 // | 33 // |
30 | 34 |
31 WebRequestAction::WebRequestAction() {} | 35 WebRequestAction::WebRequestAction() {} |
32 | 36 |
33 WebRequestAction::~WebRequestAction() {} | 37 WebRequestAction::~WebRequestAction() {} |
34 | 38 |
35 // static | 39 // static |
36 scoped_ptr<WebRequestAction> WebRequestAction::Create( | 40 scoped_ptr<WebRequestAction> WebRequestAction::Create( |
37 const base::Value& json_action, | 41 const base::Value& json_action, |
38 std::string* error) { | 42 std::string* error) { |
39 const base::DictionaryValue* action_dict = NULL; | 43 const base::DictionaryValue* action_dict = NULL; |
40 if (!json_action.GetAsDictionary(&action_dict)) { | 44 if (!json_action.GetAsDictionary(&action_dict)) { |
41 *error = kExpectedDictionary; | 45 *error = kExpectedDictionary; |
42 return scoped_ptr<WebRequestAction>(NULL); | 46 return scoped_ptr<WebRequestAction>(NULL); |
43 } | 47 } |
44 | 48 |
45 std::string instance_type = "No instanceType"; | 49 std::string instance_type = "No instanceType"; |
46 if (!action_dict->GetString(keys::kInstanceTypeKey, &instance_type)) { | 50 if (!action_dict->GetString(keys::kInstanceTypeKey, &instance_type)) { |
47 *error = base::StringPrintf(kInvalidInstanceTypeError, | 51 *error = base::StringPrintf(kInvalidInstanceTypeError, |
48 instance_type.c_str()); | 52 instance_type.c_str()); |
49 return scoped_ptr<WebRequestAction>(NULL); | 53 return scoped_ptr<WebRequestAction>(NULL); |
50 } | 54 } |
51 | 55 |
52 // TODO(battre): Change this into a proper factory. | 56 // TODO(battre): Change this into a proper factory. |
| 57 *error = ""; |
53 if (instance_type == keys::kCancelRequestType) { | 58 if (instance_type == keys::kCancelRequestType) { |
54 *error = ""; | |
55 return scoped_ptr<WebRequestAction>(new WebRequestCancelAction); | 59 return scoped_ptr<WebRequestAction>(new WebRequestCancelAction); |
56 } else if (instance_type == keys::kRedirectRequestType) { | 60 } else if (instance_type == keys::kRedirectRequestType) { |
57 std::string redirect_url_string; | 61 std::string redirect_url_string; |
58 if (!action_dict->GetString(keys::kRedirectUrlKey, &redirect_url_string)) { | 62 if (!action_dict->GetString(keys::kRedirectUrlKey, &redirect_url_string)) { |
59 *error = kMissingRedirectUrl; | 63 *error = kMissingRedirectUrl; |
60 return scoped_ptr<WebRequestAction>(NULL); | 64 return scoped_ptr<WebRequestAction>(NULL); |
61 } | 65 } |
62 *error = ""; | |
63 GURL redirect_url(redirect_url_string); | 66 GURL redirect_url(redirect_url_string); |
64 return scoped_ptr<WebRequestAction>( | 67 return scoped_ptr<WebRequestAction>( |
65 new WebRequestRedirectAction(redirect_url)); | 68 new WebRequestRedirectAction(redirect_url)); |
| 69 } else if (instance_type == keys::kRedirectToTransparentImageType) { |
| 70 return scoped_ptr<WebRequestAction>( |
| 71 new WebRequestRedirectToTransparentImageAction); |
| 72 } else if (instance_type == keys::kRedirectToEmptyDocumentType) { |
| 73 return scoped_ptr<WebRequestAction>( |
| 74 new WebRequestRedirectToEmptyDocumentAction); |
66 } | 75 } |
67 | 76 |
68 *error = base::StringPrintf(kInvalidInstanceTypeError, instance_type.c_str()); | 77 *error = base::StringPrintf(kInvalidInstanceTypeError, instance_type.c_str()); |
69 return scoped_ptr<WebRequestAction>(); | 78 return scoped_ptr<WebRequestAction>(); |
70 } | 79 } |
71 | 80 |
72 | 81 |
73 // | 82 // |
74 // WebRequestActionSet | 83 // WebRequestActionSet |
75 // | 84 // |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 | 139 |
131 WebRequestAction::Type WebRequestCancelAction::GetType() const { | 140 WebRequestAction::Type WebRequestCancelAction::GetType() const { |
132 return WebRequestAction::ACTION_CANCEL_REQUEST; | 141 return WebRequestAction::ACTION_CANCEL_REQUEST; |
133 } | 142 } |
134 | 143 |
135 LinkedPtrEventResponseDelta WebRequestCancelAction::CreateDelta( | 144 LinkedPtrEventResponseDelta WebRequestCancelAction::CreateDelta( |
136 net::URLRequest* request, | 145 net::URLRequest* request, |
137 RequestStages request_stage, | 146 RequestStages request_stage, |
138 const std::string& extension_id, | 147 const std::string& extension_id, |
139 const base::Time& extension_install_time) const { | 148 const base::Time& extension_install_time) const { |
140 if (!(request_stage & GetStages())) | 149 CHECK(request_stage & GetStages()); |
141 return LinkedPtrEventResponseDelta(NULL); | |
142 LinkedPtrEventResponseDelta result( | 150 LinkedPtrEventResponseDelta result( |
143 new extension_web_request_api_helpers::EventResponseDelta( | 151 new extension_web_request_api_helpers::EventResponseDelta( |
144 extension_id, extension_install_time)); | 152 extension_id, extension_install_time)); |
145 result->cancel = true; | 153 result->cancel = true; |
146 return result; | 154 return result; |
147 } | 155 } |
148 | 156 |
149 // | 157 // |
150 // WebRequestRedirectAction | 158 // WebRequestRedirectAction |
151 // | 159 // |
152 | 160 |
153 WebRequestRedirectAction::WebRequestRedirectAction(const GURL& redirect_url) | 161 WebRequestRedirectAction::WebRequestRedirectAction(const GURL& redirect_url) |
154 : redirect_url_(redirect_url) {} | 162 : redirect_url_(redirect_url) {} |
155 | 163 |
156 WebRequestRedirectAction::~WebRequestRedirectAction() {} | 164 WebRequestRedirectAction::~WebRequestRedirectAction() {} |
157 | 165 |
158 int WebRequestRedirectAction::GetStages() const { | 166 int WebRequestRedirectAction::GetStages() const { |
159 return ON_BEFORE_REQUEST; | 167 return ON_BEFORE_REQUEST; |
160 } | 168 } |
161 | 169 |
162 WebRequestAction::Type WebRequestRedirectAction::GetType() const { | 170 WebRequestAction::Type WebRequestRedirectAction::GetType() const { |
163 return WebRequestAction::ACTION_REDIRECT_REQUEST; | 171 return WebRequestAction::ACTION_REDIRECT_REQUEST; |
164 } | 172 } |
165 | 173 |
166 LinkedPtrEventResponseDelta WebRequestRedirectAction::CreateDelta( | 174 LinkedPtrEventResponseDelta WebRequestRedirectAction::CreateDelta( |
167 net::URLRequest* request, | 175 net::URLRequest* request, |
168 RequestStages request_stage, | 176 RequestStages request_stage, |
169 const std::string& extension_id, | 177 const std::string& extension_id, |
170 const base::Time& extension_install_time) const { | 178 const base::Time& extension_install_time) const { |
171 if (!(request_stage & GetStages())) | 179 CHECK(request_stage & GetStages()); |
172 return LinkedPtrEventResponseDelta(NULL); | |
173 if (request->url() == redirect_url_) | 180 if (request->url() == redirect_url_) |
174 return LinkedPtrEventResponseDelta(NULL); | 181 return LinkedPtrEventResponseDelta(NULL); |
175 LinkedPtrEventResponseDelta result( | 182 LinkedPtrEventResponseDelta result( |
176 new extension_web_request_api_helpers::EventResponseDelta( | 183 new extension_web_request_api_helpers::EventResponseDelta( |
177 extension_id, extension_install_time)); | 184 extension_id, extension_install_time)); |
178 result->new_url = redirect_url_; | 185 result->new_url = redirect_url_; |
179 return result; | 186 return result; |
180 } | 187 } |
181 | 188 |
| 189 // |
| 190 // WebRequestRedirectToTransparentImageAction |
| 191 // |
| 192 |
| 193 WebRequestRedirectToTransparentImageAction:: |
| 194 WebRequestRedirectToTransparentImageAction() {} |
| 195 |
| 196 WebRequestRedirectToTransparentImageAction:: |
| 197 ~WebRequestRedirectToTransparentImageAction() {} |
| 198 |
| 199 int WebRequestRedirectToTransparentImageAction::GetStages() const { |
| 200 return ON_BEFORE_REQUEST; |
| 201 } |
| 202 |
| 203 WebRequestAction::Type |
| 204 WebRequestRedirectToTransparentImageAction::GetType() const { |
| 205 return WebRequestAction::ACTION_REDIRECT_TO_TRANSPARENT_IMAGE; |
| 206 } |
| 207 |
| 208 LinkedPtrEventResponseDelta |
| 209 WebRequestRedirectToTransparentImageAction::CreateDelta( |
| 210 net::URLRequest* request, |
| 211 RequestStages request_stage, |
| 212 const std::string& extension_id, |
| 213 const base::Time& extension_install_time) const { |
| 214 CHECK(request_stage & GetStages()); |
| 215 LinkedPtrEventResponseDelta result( |
| 216 new extension_web_request_api_helpers::EventResponseDelta( |
| 217 extension_id, extension_install_time)); |
| 218 result->new_url = GURL(kTransparentImageUrl); |
| 219 return result; |
| 220 } |
| 221 |
| 222 // |
| 223 // WebRequestRedirectToEmptyDocumentAction |
| 224 // |
| 225 |
| 226 WebRequestRedirectToEmptyDocumentAction:: |
| 227 WebRequestRedirectToEmptyDocumentAction() {} |
| 228 |
| 229 WebRequestRedirectToEmptyDocumentAction:: |
| 230 ~WebRequestRedirectToEmptyDocumentAction() {} |
| 231 |
| 232 int WebRequestRedirectToEmptyDocumentAction::GetStages() const { |
| 233 return ON_BEFORE_REQUEST; |
| 234 } |
| 235 |
| 236 WebRequestAction::Type |
| 237 WebRequestRedirectToEmptyDocumentAction::GetType() const { |
| 238 return WebRequestAction::ACTION_REDIRECT_TO_EMPTY_DOCUMENT; |
| 239 } |
| 240 |
| 241 LinkedPtrEventResponseDelta |
| 242 WebRequestRedirectToEmptyDocumentAction::CreateDelta( |
| 243 net::URLRequest* request, |
| 244 RequestStages request_stage, |
| 245 const std::string& extension_id, |
| 246 const base::Time& extension_install_time) const { |
| 247 CHECK(request_stage & GetStages()); |
| 248 LinkedPtrEventResponseDelta result( |
| 249 new extension_web_request_api_helpers::EventResponseDelta( |
| 250 extension_id, extension_install_time)); |
| 251 result->new_url = GURL(kEmptyDocumentUrl); |
| 252 return result; |
| 253 } |
| 254 |
182 } // namespace extensions | 255 } // namespace extensions |
OLD | NEW |