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

Side by Side Diff: chrome/browser/extensions/extension_webrequest_api_helpers.cc

Issue 8802017: Consider redirects to data:// urls as cancelling a request and don't report conflicts (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years 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
« no previous file with comments | « no previous file | chrome/browser/extensions/extension_webrequest_api_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/extension_webrequest_api_helpers.h" 5 #include "chrome/browser/extensions/extension_webrequest_api_helpers.h"
6 6
7 #include "base/string_util.h" 7 #include "base/string_util.h"
8 #include "base/values.h" 8 #include "base/values.h"
9 #include "chrome/browser/extensions/extension_webrequest_api.h" 9 #include "chrome/browser/extensions/extension_webrequest_api.h"
10 #include "chrome/common/url_constants.h"
10 #include "net/http/http_util.h" 11 #include "net/http/http_util.h"
11 12
12 namespace extension_webrequest_api_helpers { 13 namespace extension_webrequest_api_helpers {
13 14
14 15
15 EventResponseDelta::EventResponseDelta( 16 EventResponseDelta::EventResponseDelta(
16 const std::string& extension_id, const base::Time& extension_install_time) 17 const std::string& extension_id, const base::Time& extension_install_time)
17 : extension_id(extension_id), 18 : extension_id(extension_id),
18 extension_install_time(extension_install_time), 19 extension_install_time(extension_install_time),
19 cancel(false) { 20 cancel(false) {
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 EventLogEntry log_entry( 241 EventLogEntry log_entry(
241 net::NetLog::TYPE_CHROME_EXTENSION_ABORTED_REQUEST, 242 net::NetLog::TYPE_CHROME_EXTENSION_ABORTED_REQUEST,
242 make_scoped_refptr( 243 make_scoped_refptr(
243 new NetLogExtensionIdParameter((*i)->extension_id))); 244 new NetLogExtensionIdParameter((*i)->extension_id)));
244 event_log_entries->push_back(log_entry); 245 event_log_entries->push_back(log_entry);
245 break; 246 break;
246 } 247 }
247 } 248 }
248 } 249 }
249 250
251 // Helper function for MergeOnBeforeRequestResponses() that allows considering
252 // only data:// urls. These are considered a special case of cancelling a
253 // request. This helper function allows us to ignore all other redirects
254 // in case any extension wants to cancel the request by redirecting to a
255 // data:// url.
256 // Returns whether a redirect occurred.
257 static bool MergeOnBeforeRequestResponsesHelper(
258 const EventResponseDeltas& deltas,
259 GURL* new_url,
260 std::set<std::string>* conflicting_extensions,
261 EventLogEntries* event_log_entries,
262 bool consider_only_data_scheme_urls) {
263 bool redirected = false;
264
265 EventResponseDeltas::const_iterator delta;
266 for (delta = deltas.begin(); delta != deltas.end(); ++delta) {
267 if ((*delta)->new_url.is_empty())
268 continue;
269 if (consider_only_data_scheme_urls &&
270 !(*delta)->new_url.SchemeIs(chrome::kDataScheme)) {
271 continue;
272 }
273
274 if (!redirected || *new_url == (*delta)->new_url) {
275 *new_url = (*delta)->new_url;
276 redirected = true;
277 EventLogEntry log_entry(
278 net::NetLog::TYPE_CHROME_EXTENSION_REDIRECTED_REQUEST,
279 make_scoped_refptr(
280 new NetLogExtensionIdParameter((*delta)->extension_id)));
281 event_log_entries->push_back(log_entry);
282 } else {
283 conflicting_extensions->insert((*delta)->extension_id);
284 EventLogEntry log_entry(
285 net::NetLog::TYPE_CHROME_EXTENSION_IGNORED_DUE_TO_CONFLICT,
286 make_scoped_refptr(
287 new NetLogExtensionIdParameter((*delta)->extension_id)));
288 event_log_entries->push_back(log_entry);
289 }
290 }
291 return redirected;
292 }
293
250 void MergeOnBeforeRequestResponses( 294 void MergeOnBeforeRequestResponses(
251 const EventResponseDeltas& deltas, 295 const EventResponseDeltas& deltas,
252 GURL* new_url, 296 GURL* new_url,
253 std::set<std::string>* conflicting_extensions, 297 std::set<std::string>* conflicting_extensions,
254 EventLogEntries* event_log_entries) { 298 EventLogEntries* event_log_entries) {
255 EventResponseDeltas::const_iterator delta;
256 299
257 bool redirected = false; 300 // First handle only redirects to data:// URLs. These are a special case as
258 for (delta = deltas.begin(); delta != deltas.end(); ++delta) { 301 // they represent a way of cancelling a request.
259 if (!(*delta)->new_url.is_empty()) { 302 if (MergeOnBeforeRequestResponsesHelper(
260 if (!redirected || *new_url == (*delta)->new_url) { 303 deltas, new_url, conflicting_extensions, event_log_entries, true)) {
261 *new_url = (*delta)->new_url; 304 // If any extension cancelled a request by redirecting to a data:// URL,
262 redirected = true; 305 // we don't consider the other redirects.
263 EventLogEntry log_entry( 306 return;
264 net::NetLog::TYPE_CHROME_EXTENSION_REDIRECTED_REQUEST,
265 make_scoped_refptr(
266 new NetLogExtensionIdParameter((*delta)->extension_id)));
267 event_log_entries->push_back(log_entry);
268 } else {
269 conflicting_extensions->insert((*delta)->extension_id);
270 EventLogEntry log_entry(
271 net::NetLog::TYPE_CHROME_EXTENSION_REDIRECTED_REQUEST,
272 make_scoped_refptr(
273 new NetLogExtensionIdParameter((*delta)->extension_id)));
274 event_log_entries->push_back(log_entry);
275 }
276 }
277 } 307 }
308
309 // Handle all other redirects.
310 MergeOnBeforeRequestResponsesHelper(
311 deltas, new_url, conflicting_extensions, event_log_entries, false);
278 } 312 }
279 313
280 void MergeOnBeforeSendHeadersResponses( 314 void MergeOnBeforeSendHeadersResponses(
281 const EventResponseDeltas& deltas, 315 const EventResponseDeltas& deltas,
282 net::HttpRequestHeaders* request_headers, 316 net::HttpRequestHeaders* request_headers,
283 std::set<std::string>* conflicting_extensions, 317 std::set<std::string>* conflicting_extensions,
284 EventLogEntries* event_log_entries) { 318 EventLogEntries* event_log_entries) {
285 EventResponseDeltas::const_iterator delta; 319 EventResponseDeltas::const_iterator delta;
286 320
287 // Here we collect which headers we have removed or set to new values 321 // Here we collect which headers we have removed or set to new values
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
500 new NetLogExtensionIdParameter((*delta)->extension_id))); 534 new NetLogExtensionIdParameter((*delta)->extension_id)));
501 event_log_entries->push_back(log_entry); 535 event_log_entries->push_back(log_entry);
502 *auth_credentials = *(*delta)->auth_credentials; 536 *auth_credentials = *(*delta)->auth_credentials;
503 credentials_set = true; 537 credentials_set = true;
504 } 538 }
505 } 539 }
506 return credentials_set; 540 return credentials_set;
507 } 541 }
508 542
509 } // namespace extension_webrequest_api_helpers 543 } // namespace extension_webrequest_api_helpers
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/extensions/extension_webrequest_api_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698