OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |