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" |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
57 request, | 59 request, |
58 &response->head.appcache_id, | 60 &response->head.appcache_id, |
59 &response->head.appcache_manifest_url); | 61 &response->head.appcache_manifest_url); |
60 // TODO(mmenke): Figure out if LOAD_ENABLE_LOAD_TIMING is safe to remove. | 62 // TODO(mmenke): Figure out if LOAD_ENABLE_LOAD_TIMING is safe to remove. |
61 if (request->load_flags() & net::LOAD_ENABLE_LOAD_TIMING) | 63 if (request->load_flags() & net::LOAD_ENABLE_LOAD_TIMING) |
62 request->GetLoadTimingInfo(&response->head.load_timing); | 64 request->GetLoadTimingInfo(&response->head.load_timing); |
63 } | 65 } |
64 | 66 |
65 } // namespace | 67 } // namespace |
66 | 68 |
69 // The time in ms to delay a cancel of a detachable resource unless otherwise | |
70 // specified by a flag. | |
71 static const int kDefaultDelayDetachableCancelMs = 60000; | |
72 | |
67 ResourceLoader::ResourceLoader(scoped_ptr<net::URLRequest> request, | 73 ResourceLoader::ResourceLoader(scoped_ptr<net::URLRequest> request, |
68 scoped_ptr<ResourceHandler> handler, | 74 scoped_ptr<ResourceHandler> handler, |
69 ResourceLoaderDelegate* delegate) | 75 ResourceLoaderDelegate* delegate) |
70 : weak_ptr_factory_(this) { | 76 : weak_ptr_factory_(this) { |
71 scoped_ptr<net::ClientCertStore> client_cert_store; | 77 scoped_ptr<net::ClientCertStore> client_cert_store; |
72 #if !defined(USE_OPENSSL) | 78 #if !defined(USE_OPENSSL) |
73 client_cert_store.reset(new net::ClientCertStoreImpl()); | 79 client_cert_store.reset(new net::ClientCertStoreImpl()); |
74 #endif | 80 #endif |
75 Init(request.Pass(), handler.Pass(), delegate, client_cert_store.Pass()); | 81 Init(request.Pass(), handler.Pass(), delegate, client_cert_store.Pass()); |
76 } | 82 } |
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
451 CancelRequest(false); | 457 CancelRequest(false); |
452 } | 458 } |
453 | 459 |
454 void ResourceLoader::StartRequestInternal() { | 460 void ResourceLoader::StartRequestInternal() { |
455 DCHECK(!request_->is_pending()); | 461 DCHECK(!request_->is_pending()); |
456 request_->Start(); | 462 request_->Start(); |
457 | 463 |
458 delegate_->DidStartRequest(this); | 464 delegate_->DidStartRequest(this); |
459 } | 465 } |
460 | 466 |
467 bool ResourceLoader::DelayCancelForDetachable( | |
468 const ResourceRequestInfoImpl& info, bool from_renderer) { | |
469 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); | |
470 // Delay requests to cancel detachable resources. Detachable resources are | |
471 // those that may need to live beyond the lifetime of their renderers, but | |
472 // should not be allowed to continue indefinitely as the user cannot control | |
473 // them through the UI. Examples of detachable resources include prefetches | |
474 // and <a ping>. | |
475 if (from_renderer && !detached_timer_ && info.is_detachable() && | |
476 command_line.HasSwitch(switches::kDelayDetachableCancellation)) { | |
asanka
2013/10/14 21:06:49
Is it possible to get two cancels from the rendere
| |
477 // Start the delay timer. | |
478 detached_timer_.reset(new base::OneShotTimer<ResourceLoader>()); | |
479 | |
480 int delay_ms; | |
481 if (!base::StringToInt(command_line.GetSwitchValueASCII( | |
482 switches::kDelayDetachableCancellation), | |
483 &delay_ms)) { | |
484 delay_ms = kDefaultDelayDetachableCancelMs; | |
485 } | |
486 | |
487 detached_timer_->Start(FROM_HERE, TimeDelta::FromMilliseconds(delay_ms), | |
488 this, &ResourceLoader::Cancel); | |
489 return true; | |
490 } | |
491 return false; | |
492 } | |
493 | |
461 void ResourceLoader::CancelRequestInternal(int error, bool from_renderer) { | 494 void ResourceLoader::CancelRequestInternal(int error, bool from_renderer) { |
462 VLOG(1) << "CancelRequestInternal: " << request_->url().spec(); | 495 VLOG(1) << "CancelRequestInternal: " << request_->url().spec(); |
463 | 496 |
464 ResourceRequestInfoImpl* info = GetRequestInfo(); | 497 ResourceRequestInfoImpl* info = GetRequestInfo(); |
465 | 498 |
466 // WebKit will send us a cancel for downloads since it no longer handles | 499 // 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 | 500 // them. In this case, ignore the cancel since we handle downloads in the |
468 // browser. | 501 // browser. |
469 if (from_renderer && (info->is_download() || info->is_stream())) | 502 if (from_renderer && (info->is_download() || info->is_stream())) |
470 return; | 503 return; |
471 | 504 |
505 if (DelayCancelForDetachable(*info, from_renderer)) { | |
506 return; | |
507 } | |
508 | |
472 // TODO(darin): Perhaps we should really be looking to see if the status is | 509 // TODO(darin): Perhaps we should really be looking to see if the status is |
473 // IO_PENDING? | 510 // IO_PENDING? |
474 bool was_pending = request_->is_pending(); | 511 bool was_pending = request_->is_pending(); |
475 | 512 |
476 if (login_delegate_.get()) { | 513 if (login_delegate_.get()) { |
477 login_delegate_->OnRequestCancelled(); | 514 login_delegate_->OnRequestCancelled(); |
478 login_delegate_ = NULL; | 515 login_delegate_ = NULL; |
479 } | 516 } |
480 if (ssl_client_auth_handler_.get()) { | 517 if (ssl_client_auth_handler_.get()) { |
481 ssl_client_auth_handler_->OnRequestCancelled(); | 518 ssl_client_auth_handler_->OnRequestCancelled(); |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
655 // we resume. | 692 // we resume. |
656 deferred_stage_ = DEFERRED_FINISH; | 693 deferred_stage_ = DEFERRED_FINISH; |
657 } | 694 } |
658 } | 695 } |
659 | 696 |
660 void ResourceLoader::CallDidFinishLoading() { | 697 void ResourceLoader::CallDidFinishLoading() { |
661 delegate_->DidFinishLoading(this); | 698 delegate_->DidFinishLoading(this); |
662 } | 699 } |
663 | 700 |
664 } // namespace content | 701 } // namespace content |
OLD | NEW |