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 84cfb57fcef80a5061bd269f7015d0f87235184c..9c00500bacb3dc2b2f5463006d72b00ef8eb4c70 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_manager.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" |
@@ -237,12 +238,6 @@ bool ShouldServiceRequest(int process_type, |
return true; |
} |
-void RemoveDownloadFileFromChildSecurityPolicy(int child_id, |
- const base::FilePath& path) { |
- ChildProcessSecurityPolicyImpl::GetInstance()->RevokeAllPermissionsForFile( |
- child_id, path); |
-} |
- |
#if defined(OS_WIN) |
#pragma warning(disable: 4748) |
#pragma optimize("", off) |
@@ -797,6 +792,7 @@ bool ResourceDispatcherHostImpl::RenderViewForRequest( |
void ResourceDispatcherHostImpl::OnInit() { |
scheduler_.reset(new ResourceScheduler); |
+ temporary_file_manager_.reset(new TemporaryFileManager); |
appcache::AppCacheInterceptor::EnsureRegistered(); |
} |
@@ -828,6 +824,7 @@ void ResourceDispatcherHostImpl::OnShutdown() { |
CancelBlockedRequestsForRoute(iter->child_id, iter->route_id); |
} |
+ temporary_file_manager_.reset(); |
scheduler_.reset(); |
} |
@@ -1148,7 +1145,8 @@ void ResourceDispatcherHostImpl::BeginRequest( |
// 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, |
+ temporary_file_manager_.get())); |
} |
// Install a CrossSiteResourceHandler for all main frame requests. This will |
@@ -1189,45 +1187,19 @@ void ResourceDispatcherHostImpl::BeginRequest( |
} |
void ResourceDispatcherHostImpl::OnReleaseDownloadedFile(int request_id) { |
- UnregisterDownloadedTempFile(filter_->child_id(), request_id); |
+ if (temporary_file_manager_) { |
+ temporary_file_manager_->UnregisterDownloadedTempFile(filter_->child_id(), |
+ request_id); |
+ } else { |
+ // Can the RDH still receive messages after being shut down? |
+ NOTREACHED(); |
+ } |
} |
void ResourceDispatcherHostImpl::OnDataDownloadedACK(int request_id) { |
// TODO(michaeln): maybe throttle DataDownloaded messages |
} |
-void ResourceDispatcherHostImpl::RegisterDownloadedTempFile( |
- int child_id, int request_id, ShareableFileReference* reference) { |
- registered_temp_files_[child_id][request_id] = reference; |
- ChildProcessSecurityPolicyImpl::GetInstance()->GrantReadFile( |
- child_id, reference->path()); |
- |
- // When the temp file is deleted, revoke permissions that the renderer has |
- // to that file. This covers an edge case where the file is deleted and then |
- // the same name is re-used for some other purpose, we don't want the old |
- // renderer to still have access to it. |
- // |
- // We do this when the file is deleted because the renderer can take a blob |
- // reference to the temp file that outlives the url loaded that it was |
- // loaded with to keep the file (and permissions) alive. |
- reference->AddFinalReleaseCallback( |
- base::Bind(&RemoveDownloadFileFromChildSecurityPolicy, |
- child_id)); |
-} |
- |
-void ResourceDispatcherHostImpl::UnregisterDownloadedTempFile( |
- int child_id, int request_id) { |
- DeletableFilesMap& map = registered_temp_files_[child_id]; |
- DeletableFilesMap::iterator found = map.find(request_id); |
- if (found == map.end()) |
- return; |
- |
- map.erase(found); |
- |
- // Note that we don't remove the security bits here. This will be done |
- // when all file refs are deleted (see RegisterDownloadedTempFile). |
-} |
- |
bool ResourceDispatcherHostImpl::Send(IPC::Message* message) { |
delete message; |
return false; |
@@ -1362,7 +1334,9 @@ void ResourceDispatcherHostImpl::ResumeDeferredNavigation( |
// even if initiated via a renderer. |
void ResourceDispatcherHostImpl::CancelRequestsForProcess(int child_id) { |
CancelRequestsForRoute(child_id, -1 /* cancel all */); |
- registered_temp_files_.erase(child_id); |
+ // The RDH may already have been shutdown by the time this is called. |
+ if (temporary_file_manager_) |
+ temporary_file_manager_->UnregisterFilesForChild(child_id); |
} |
void ResourceDispatcherHostImpl::CancelRequestsForRoute(int child_id, |