Index: content/browser/loader/resource_dispatcher_host_impl.cc |
diff --git a/content/browser/loader/resource_dispatcher_host_impl.cc b/content/browser/loader/resource_dispatcher_host_impl.cc |
index 8ab8ca7a380d8a9644611b47f9e0784083da9d71..690ace7b2864e80fdb66971f331f78f805ee40f8 100644 |
--- a/content/browser/loader/resource_dispatcher_host_impl.cc |
+++ b/content/browser/loader/resource_dispatcher_host_impl.cc |
@@ -40,6 +40,7 @@ |
#include "content/browser/loader/resource_request_info_impl.h" |
#include "content/browser/loader/stream_resource_handler.h" |
#include "content/browser/loader/sync_resource_handler.h" |
+#include "content/browser/loader/temporary_file_stream.h" |
#include "content/browser/loader/throttling_resource_handler.h" |
#include "content/browser/loader/upload_data_stream_builder.h" |
#include "content/browser/plugin_service_impl.h" |
@@ -1147,18 +1148,22 @@ scoped_ptr<ResourceHandler> ResourceDispatcherHostImpl::CreateResourceHandler( |
handler.reset(new SyncResourceHandler(request, sync_result, this)); |
} else { |
handler.reset(new AsyncResourceHandler(request, this)); |
- if (IsDetachableResourceType(request_data.resource_type)) { |
- handler.reset(new DetachableResourceHandler( |
- request, |
- base::TimeDelta::FromMilliseconds(kDefaultDetachableCancelDelayMs), |
- handler.Pass())); |
- } |
} |
// The RedirectToFileResourceHandler depends on being next in the chain. |
if (request_data.download_to_file) { |
handler.reset( |
- new RedirectToFileResourceHandler(handler.Pass(), request, this)); |
+ new RedirectToFileResourceHandler( |
+ handler.Pass(), request, |
+ base::Bind(&CreateTemporaryFileStream))); |
+ } |
+ |
+ // Prefetches and <a ping> requests outlive their child process. |
+ if (!sync_result && IsDetachableResourceType(request_data.resource_type)) { |
+ handler.reset(new DetachableResourceHandler( |
+ request, |
+ base::TimeDelta::FromMilliseconds(kDefaultDetachableCancelDelayMs), |
+ handler.Pass())); |
} |
// Install a CrossSiteResourceHandler for all main frame requests. This will |
@@ -1213,7 +1218,14 @@ void ResourceDispatcherHostImpl::OnDataDownloadedACK(int request_id) { |
} |
void ResourceDispatcherHostImpl::RegisterDownloadedTempFile( |
- int child_id, int request_id, ShareableFileReference* reference) { |
+ int child_id, int request_id, const base::FilePath& file_path) { |
+ scoped_refptr<ShareableFileReference> reference = |
+ ShareableFileReference::Get(file_path); |
+ if (!reference) { |
+ NOTREACHED(); |
+ return; |
+ } |
+ |
registered_temp_files_[child_id][request_id] = reference; |
ChildProcessSecurityPolicyImpl::GetInstance()->GrantReadFile( |
child_id, reference->path()); |