| 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 |