| OLD | NEW |
| 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 "content/browser/loader/resource_loader.h" | 5 #include "content/browser/loader/resource_loader.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
| 10 #include "base/strings/string_number_conversions.h" |
| 10 #include "base/time/time.h" | 11 #include "base/time/time.h" |
| 12 #include "base/timer/timer.h" |
| 11 #include "content/browser/child_process_security_policy_impl.h" | 13 #include "content/browser/child_process_security_policy_impl.h" |
| 12 #include "content/browser/loader/cross_site_resource_handler.h" | 14 #include "content/browser/loader/cross_site_resource_handler.h" |
| 13 #include "content/browser/loader/resource_loader_delegate.h" | 15 #include "content/browser/loader/resource_loader_delegate.h" |
| 14 #include "content/browser/loader/resource_request_info_impl.h" | 16 #include "content/browser/loader/resource_request_info_impl.h" |
| 15 #include "content/browser/ssl/ssl_client_auth_handler.h" | 17 #include "content/browser/ssl/ssl_client_auth_handler.h" |
| 16 #include "content/browser/ssl/ssl_manager.h" | 18 #include "content/browser/ssl/ssl_manager.h" |
| 17 #include "content/common/ssl_status_serialization.h" | 19 #include "content/common/ssl_status_serialization.h" |
| 18 #include "content/public/browser/cert_store.h" | 20 #include "content/public/browser/cert_store.h" |
| 19 #include "content/public/browser/resource_dispatcher_host_login_delegate.h" | 21 #include "content/public/browser/resource_dispatcher_host_login_delegate.h" |
| 20 #include "content/public/browser/site_instance.h" | 22 #include "content/public/browser/site_instance.h" |
| 21 #include "content/public/common/content_client.h" | 23 #include "content/public/common/content_client.h" |
| 22 #include "content/public/common/content_switches.h" | 24 #include "content/public/common/content_switches.h" |
| 23 #include "content/public/common/process_type.h" | 25 #include "content/public/common/process_type.h" |
| 24 #include "content/public/common/resource_response.h" | 26 #include "content/public/common/resource_response.h" |
| 25 #include "content/public/common/url_constants.h" | 27 #include "content/public/common/url_constants.h" |
| 26 #include "net/base/io_buffer.h" | 28 #include "net/base/io_buffer.h" |
| 27 #include "net/base/load_flags.h" | 29 #include "net/base/load_flags.h" |
| 28 #include "net/http/http_response_headers.h" | 30 #include "net/http/http_response_headers.h" |
| 29 #include "net/ssl/client_cert_store.h" | 31 #include "net/ssl/client_cert_store.h" |
| 30 #include "net/ssl/client_cert_store_impl.h" | 32 #include "net/ssl/client_cert_store_impl.h" |
| 31 #include "webkit/browser/appcache/appcache_interceptor.h" | 33 #include "webkit/browser/appcache/appcache_interceptor.h" |
| 32 | 34 |
| 33 using base::TimeDelta; | 35 using base::TimeDelta; |
| 34 using base::TimeTicks; | 36 using base::TimeTicks; |
| 35 | 37 |
| 36 namespace content { | 38 namespace content { |
| 37 namespace { | 39 namespace { |
| 38 | 40 |
| 41 const int kDefaultDetachableDelayOnCancelMs = 60000; |
| 42 |
| 39 void PopulateResourceResponse(net::URLRequest* request, | 43 void PopulateResourceResponse(net::URLRequest* request, |
| 40 ResourceResponse* response) { | 44 ResourceResponse* response) { |
| 41 response->head.error_code = request->status().error(); | 45 response->head.error_code = request->status().error(); |
| 42 response->head.request_time = request->request_time(); | 46 response->head.request_time = request->request_time(); |
| 43 response->head.response_time = request->response_time(); | 47 response->head.response_time = request->response_time(); |
| 44 response->head.headers = request->response_headers(); | 48 response->head.headers = request->response_headers(); |
| 45 request->GetCharset(&response->head.charset); | 49 request->GetCharset(&response->head.charset); |
| 46 response->head.content_length = request->GetExpectedContentSize(); | 50 response->head.content_length = request->GetExpectedContentSize(); |
| 47 request->GetMimeType(&response->head.mime_type); | 51 request->GetMimeType(&response->head.mime_type); |
| 48 net::HttpResponseInfo response_info = request->response_info(); | 52 net::HttpResponseInfo response_info = request->response_info(); |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 ResourceLoaderDelegate* delegate, | 207 ResourceLoaderDelegate* delegate, |
| 204 scoped_ptr<net::ClientCertStore> client_cert_store) { | 208 scoped_ptr<net::ClientCertStore> client_cert_store) { |
| 205 deferred_stage_ = DEFERRED_NONE; | 209 deferred_stage_ = DEFERRED_NONE; |
| 206 request_ = request.Pass(); | 210 request_ = request.Pass(); |
| 207 handler_ = handler.Pass(); | 211 handler_ = handler.Pass(); |
| 208 delegate_ = delegate; | 212 delegate_ = delegate; |
| 209 last_upload_position_ = 0; | 213 last_upload_position_ = 0; |
| 210 waiting_for_upload_progress_ack_ = false; | 214 waiting_for_upload_progress_ack_ = false; |
| 211 is_transferring_ = false; | 215 is_transferring_ = false; |
| 212 client_cert_store_ = client_cert_store.Pass(); | 216 client_cert_store_ = client_cert_store.Pass(); |
| 217 detachable_delay_on_cancel_ms_ = kDefaultDetachableDelayOnCancelMs; |
| 213 | 218 |
| 214 request_->set_delegate(this); | 219 request_->set_delegate(this); |
| 215 handler_->SetController(this); | 220 handler_->SetController(this); |
| 216 } | 221 } |
| 217 | 222 |
| 218 void ResourceLoader::OnReceivedRedirect(net::URLRequest* unused, | 223 void ResourceLoader::OnReceivedRedirect(net::URLRequest* unused, |
| 219 const GURL& new_url, | 224 const GURL& new_url, |
| 220 bool* defer) { | 225 bool* defer) { |
| 221 DCHECK_EQ(request_.get(), unused); | 226 DCHECK_EQ(request_.get(), unused); |
| 222 | 227 |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 451 CancelRequest(false); | 456 CancelRequest(false); |
| 452 } | 457 } |
| 453 | 458 |
| 454 void ResourceLoader::StartRequestInternal() { | 459 void ResourceLoader::StartRequestInternal() { |
| 455 DCHECK(!request_->is_pending()); | 460 DCHECK(!request_->is_pending()); |
| 456 request_->Start(); | 461 request_->Start(); |
| 457 | 462 |
| 458 delegate_->DidStartRequest(this); | 463 delegate_->DidStartRequest(this); |
| 459 } | 464 } |
| 460 | 465 |
| 466 void ResourceLoader::CancelAfterTimeout() { |
| 467 if (detached_timer_) |
| 468 return; |
| 469 |
| 470 detached_timer_.reset(new base::OneShotTimer<ResourceLoader>()); |
| 471 detached_timer_->Start( |
| 472 FROM_HERE, TimeDelta::FromMilliseconds(detachable_delay_on_cancel_ms_), |
| 473 this, &ResourceLoader::Cancel); |
| 474 } |
| 475 |
| 461 void ResourceLoader::CancelRequestInternal(int error, bool from_renderer) { | 476 void ResourceLoader::CancelRequestInternal(int error, bool from_renderer) { |
| 462 VLOG(1) << "CancelRequestInternal: " << request_->url().spec(); | 477 VLOG(1) << "CancelRequestInternal: " << request_->url().spec(); |
| 463 | 478 |
| 464 ResourceRequestInfoImpl* info = GetRequestInfo(); | 479 ResourceRequestInfoImpl* info = GetRequestInfo(); |
| 465 | 480 |
| 466 // WebKit will send us a cancel for downloads since it no longer handles | 481 // WebKit will send us a cancel for downloads since it no longer handles |
| 467 // them. In this case, ignore the cancel since we handle downloads in the | 482 // them. In this case, ignore the cancel since we handle downloads in the |
| 468 // browser. | 483 // browser. |
| 469 if (from_renderer && (info->is_download() || info->is_stream())) | 484 if (from_renderer && (info->is_download() || info->is_stream())) |
| 470 return; | 485 return; |
| 471 | 486 |
| 487 if (from_renderer && info->is_detachable()) { |
| 488 CancelAfterTimeout(); |
| 489 return; |
| 490 } |
| 491 |
| 472 // TODO(darin): Perhaps we should really be looking to see if the status is | 492 // TODO(darin): Perhaps we should really be looking to see if the status is |
| 473 // IO_PENDING? | 493 // IO_PENDING? |
| 474 bool was_pending = request_->is_pending(); | 494 bool was_pending = request_->is_pending(); |
| 475 | 495 |
| 476 if (login_delegate_.get()) { | 496 if (login_delegate_.get()) { |
| 477 login_delegate_->OnRequestCancelled(); | 497 login_delegate_->OnRequestCancelled(); |
| 478 login_delegate_ = NULL; | 498 login_delegate_ = NULL; |
| 479 } | 499 } |
| 480 if (ssl_client_auth_handler_.get()) { | 500 if (ssl_client_auth_handler_.get()) { |
| 481 ssl_client_auth_handler_->OnRequestCancelled(); | 501 ssl_client_auth_handler_->OnRequestCancelled(); |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 655 // we resume. | 675 // we resume. |
| 656 deferred_stage_ = DEFERRED_FINISH; | 676 deferred_stage_ = DEFERRED_FINISH; |
| 657 } | 677 } |
| 658 } | 678 } |
| 659 | 679 |
| 660 void ResourceLoader::CallDidFinishLoading() { | 680 void ResourceLoader::CallDidFinishLoading() { |
| 661 delegate_->DidFinishLoading(this); | 681 delegate_->DidFinishLoading(this); |
| 662 } | 682 } |
| 663 | 683 |
| 664 } // namespace content | 684 } // namespace content |
| OLD | NEW |