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 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
172 return LinkedPtrEventResponseDelta(NULL); | 181 return LinkedPtrEventResponseDelta(NULL); |
173 if (request->url() == redirect_url_) | 182 if (request->url() == redirect_url_) |
174 return LinkedPtrEventResponseDelta(NULL); | 183 return LinkedPtrEventResponseDelta(NULL); |
175 LinkedPtrEventResponseDelta result( | 184 LinkedPtrEventResponseDelta result( |
176 new extension_web_request_api_helpers::EventResponseDelta( | 185 new extension_web_request_api_helpers::EventResponseDelta( |
177 extension_id, extension_install_time)); | 186 extension_id, extension_install_time)); |
178 result->new_url = redirect_url_; | 187 result->new_url = redirect_url_; |
179 return result; | 188 return result; |
180 } | 189 } |
181 | 190 |
191 // | |
192 // WebRequestRedirectToTransparentImageAction | |
193 // | |
194 | |
195 WebRequestRedirectToTransparentImageAction:: | |
196 WebRequestRedirectToTransparentImageAction() {} | |
197 | |
198 WebRequestRedirectToTransparentImageAction:: | |
199 ~WebRequestRedirectToTransparentImageAction() {} | |
200 | |
201 int WebRequestRedirectToTransparentImageAction::GetStages() const { | |
202 return ON_BEFORE_REQUEST; | |
203 } | |
204 | |
205 WebRequestAction::Type | |
206 WebRequestRedirectToTransparentImageAction::GetType() const { | |
207 return WebRequestAction::ACTION_REDIRECT_TO_TRANSPARENT_IMAGE; | |
208 } | |
209 | |
210 LinkedPtrEventResponseDelta | |
211 WebRequestRedirectToTransparentImageAction::CreateDelta( | |
212 net::URLRequest* request, | |
213 RequestStages request_stage, | |
214 const std::string& extension_id, | |
215 const base::Time& extension_install_time) const { | |
216 if (!(request_stage & GetStages())) | |
Matt Perry
2012/05/16 23:54:12
seems like all the CreateDeltas have this check. C
battre
2012/05/18 10:29:38
I do this at the caller already. I have replaced t
| |
217 return LinkedPtrEventResponseDelta(NULL); | |
218 LinkedPtrEventResponseDelta result( | |
219 new extension_web_request_api_helpers::EventResponseDelta( | |
220 extension_id, extension_install_time)); | |
221 result->new_url = GURL(kTransparentImageUrl); | |
222 return result; | |
223 } | |
224 | |
225 // | |
226 // WebRequestRedirectToEmptyDocumentAction | |
227 // | |
228 | |
229 WebRequestRedirectToEmptyDocumentAction:: | |
230 WebRequestRedirectToEmptyDocumentAction() {} | |
231 | |
232 WebRequestRedirectToEmptyDocumentAction:: | |
233 ~WebRequestRedirectToEmptyDocumentAction() {} | |
234 | |
235 int WebRequestRedirectToEmptyDocumentAction::GetStages() const { | |
236 return ON_BEFORE_REQUEST; | |
237 } | |
238 | |
239 WebRequestAction::Type | |
240 WebRequestRedirectToEmptyDocumentAction::GetType() const { | |
241 return WebRequestAction::ACTION_REDIRECT_TO_EMPTY_DOCUMENT; | |
242 } | |
243 | |
244 LinkedPtrEventResponseDelta | |
245 WebRequestRedirectToEmptyDocumentAction::CreateDelta( | |
246 net::URLRequest* request, | |
247 RequestStages request_stage, | |
248 const std::string& extension_id, | |
249 const base::Time& extension_install_time) const { | |
250 if (!(request_stage & GetStages())) | |
251 return LinkedPtrEventResponseDelta(NULL); | |
252 LinkedPtrEventResponseDelta result( | |
253 new extension_web_request_api_helpers::EventResponseDelta( | |
254 extension_id, extension_install_time)); | |
255 result->new_url = GURL(kEmptyDocumentUrl); | |
256 return result; | |
257 } | |
258 | |
182 } // namespace extensions | 259 } // namespace extensions |
OLD | NEW |