Index: components/translate/content/browser/data_file_browser_cld_data_provider.cc |
diff --git a/components/translate/content/browser/data_file_browser_cld_data_provider.cc b/components/translate/content/browser/data_file_browser_cld_data_provider.cc |
index 97764aa40ab09e2234055bf45ecf0d48140d8bef..9e61fbe694f53a52a41cfe05aaca77ae5a5b75e8 100644 |
--- a/components/translate/content/browser/data_file_browser_cld_data_provider.cc |
+++ b/components/translate/content/browser/data_file_browser_cld_data_provider.cc |
@@ -17,6 +17,7 @@ |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/render_process_host.h" |
#include "content/public/browser/render_view_host.h" |
+#include "content/public/browser/web_contents.h" |
#include "ipc/ipc_message.h" |
#include "ipc/ipc_message_macros.h" |
#include "ipc/ipc_platform_file.h" |
@@ -38,8 +39,8 @@ namespace translate { |
// Implementation of the static factory method from BrowserCldDataProvider, |
// hooking up this specific implementation for all of Chromium. |
BrowserCldDataProvider* CreateBrowserCldDataProviderFor( |
- content::RenderViewHost* render_view_host) { |
- return new DataFileBrowserCldDataProvider(render_view_host); |
+ content::WebContents* web_contents) { |
+ return new DataFileBrowserCldDataProvider(web_contents); |
} |
void DataFileBrowserCldDataProvider::SetCldDataFilePath( |
@@ -61,8 +62,8 @@ base::FilePath DataFileBrowserCldDataProvider::GetCldDataFilePath() { |
} |
DataFileBrowserCldDataProvider::DataFileBrowserCldDataProvider( |
- content::RenderViewHost* render_view_host) |
- : render_view_host_(render_view_host), weak_pointer_factory_() { |
+ content::WebContents* web_contents) |
+ : web_contents_(web_contents), weak_pointer_factory_() { |
} |
DataFileBrowserCldDataProvider::~DataFileBrowserCldDataProvider() { |
@@ -140,19 +141,37 @@ void DataFileBrowserCldDataProvider::SendCldDataResponseInternal( |
const uint64 data_offset, |
const uint64 data_length) { |
VLOG(1) << "Sending CLD data file response."; |
+ |
+ content::RenderViewHost* render_view_host = |
+ web_contents_->GetRenderViewHost(); |
+ if (render_view_host == NULL) { |
+ // Render view destroyed, no need to bother. |
+ VLOG(1) << "Lost render view host, giving up"; |
+ return; |
+ } |
+ |
+ content::RenderProcessHost* render_process_host = |
+ render_view_host->GetProcess(); |
+ if (render_process_host == NULL) { |
+ // Render process destroyed, render view not yet dead. No need to bother. |
+ VLOG(1) << "Lost render process, giving up"; |
+ return; |
+ } |
+ |
// Data available, respond to the request. |
+ const int render_process_handle = render_process_host->GetHandle(); |
IPC::PlatformFileForTransit ipc_platform_file = |
IPC::GetFileHandleForProcess(handle->GetPlatformFile(), |
- render_view_host_->GetProcess()->GetHandle(), |
- false); |
+ render_process_handle, false); |
+ |
// In general, sending a response from within the code path that is processing |
// a request is discouraged because there is potential for deadlock (if the |
// methods are sent synchronously) or loops (if the response can trigger a |
// new request). Neither of these concerns is relevant in this code, so |
// sending the response from within the code path of the request handler is |
// safe. |
- render_view_host_->Send( |
- new ChromeViewMsg_CldDataFileAvailable(render_view_host_->GetRoutingID(), |
+ render_view_host->Send( |
+ new ChromeViewMsg_CldDataFileAvailable(render_view_host->GetRoutingID(), |
ipc_platform_file, |
data_offset, |
data_length)); |