Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(79)

Side by Side Diff: chrome/browser/extensions/api/declarative_webrequest/webrequest_action.cc

Issue 10386172: Implemented declarative redirects to transparent image and empty document. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed nits Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698