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

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: Fix error caused by rebasing 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 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698