diff options
author | vitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-10 20:52:30 +0000 |
---|---|---|
committer | vitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-10 20:52:30 +0000 |
commit | 345b8dfaeaf2b4289ba080f5da033a70310fc5cc (patch) | |
tree | c5e955fa8194694c178e828e7fe3f27f16418b9c /chrome/browser/printing | |
parent | 6cf6ca58e053f69d88c90b55f3a9011a6caba801 (diff) | |
download | chromium_src-345b8dfaeaf2b4289ba080f5da033a70310fc5cc.zip chromium_src-345b8dfaeaf2b4289ba080f5da033a70310fc5cc.tar.gz chromium_src-345b8dfaeaf2b4289ba080f5da033a70310fc5cc.tar.bz2 |
Check RenderViewHost pointer, it may be deleted before PrintingMessageFilter.
PrintingMessageFilter is ref counted class, so if we post message, it may hold PrintingMessageFilter instance longer then RenderViewHost is alive.
BUG=298431
Review URL: https://codereview.chromium.org/26320009
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@227984 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/printing')
-rw-r--r-- | chrome/browser/printing/printing_message_filter.cc | 37 | ||||
-rw-r--r-- | chrome/browser/printing/printing_message_filter.h | 4 |
2 files changed, 34 insertions, 7 deletions
diff --git a/chrome/browser/printing/printing_message_filter.cc b/chrome/browser/printing/printing_message_filter.cc index 4cd5b98..79a1194 100644 --- a/chrome/browser/printing/printing_message_filter.cc +++ b/chrome/browser/printing/printing_message_filter.cc @@ -185,6 +185,8 @@ void PrintingMessageFilter::OnAllocateTempFileForPrinting( #elif defined(OS_ANDROID) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); content::WebContents* wc = GetWebContentsForRenderView(render_view_id); + if (!wc) + return; printing::PrintViewManagerBasic* print_view_manager = printing::PrintViewManagerBasic::FromWebContents(wc); // The file descriptor is originally created in & passed from the Android @@ -217,6 +219,8 @@ void PrintingMessageFilter::OnTempFileForPrintingWritten(int render_view_id, #elif defined(OS_ANDROID) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); content::WebContents* wc = GetWebContentsForRenderView(render_view_id); + if (!wc) + return; printing::PrintViewManagerBasic* print_view_manager = printing::PrintViewManagerBasic::FromWebContents(wc); const base::FileDescriptor& file_descriptor = @@ -233,6 +237,8 @@ void PrintingMessageFilter::CreatePrintDialogForFile( int render_view_id, const base::FilePath& path) { content::WebContents* wc = GetWebContentsForRenderView(render_view_id); + if (!wc) + return; print_dialog_cloud::CreatePrintDialogForFile( wc->GetBrowserContext(), wc->GetView()->GetTopLevelNativeWindow(), @@ -249,7 +255,7 @@ content::WebContents* PrintingMessageFilter::GetWebContentsForRenderView( DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); content::RenderViewHost* view = content::RenderViewHost::FromID( render_process_id_, render_view_id); - return content::WebContents::FromRenderViewHost(view); + return view ? content::WebContents::FromRenderViewHost(view) : NULL; } struct PrintingMessageFilter::GetPrintSettingsForRenderViewParams { @@ -266,13 +272,28 @@ void PrintingMessageFilter::GetPrintSettingsForRenderView( scoped_refptr<printing::PrinterQuery> printer_query) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); content::WebContents* wc = GetWebContentsForRenderView(render_view_id); + if (wc) { + BrowserThread::PostTask( + BrowserThread::IO, FROM_HERE, + base::Bind(&printing::PrinterQuery::GetSettings, printer_query, + params.ask_user_for_settings, wc->GetView()->GetNativeView(), + params.expected_page_count, params.has_selection, + params.margin_type, callback)); + } else { + BrowserThread::PostTask( + BrowserThread::IO, FROM_HERE, + base::Bind(&PrintingMessageFilter::OnGetPrintSettingsFailed, this, + callback, printer_query)); + } +} - BrowserThread::PostTask( - BrowserThread::IO, FROM_HERE, - base::Bind(&printing::PrinterQuery::GetSettings, printer_query, - params.ask_user_for_settings, wc->GetView()->GetNativeView(), - params.expected_page_count, params.has_selection, - params.margin_type, callback)); +void PrintingMessageFilter::OnGetPrintSettingsFailed( + const base::Closure& callback, + scoped_refptr<printing::PrinterQuery> printer_query) { + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); + printer_query->GetSettingsDone(printing::PrintSettings(), + printing::PrintingContext::FAILED); + callback.Run(); } void PrintingMessageFilter::OnIsPrintingEnabled(bool* is_enabled) { @@ -395,6 +416,8 @@ void PrintingMessageFilter::OnScriptedPrintReply( void PrintingMessageFilter::UpdateFileDescriptor(int render_view_id, int fd) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); content::WebContents* wc = GetWebContentsForRenderView(render_view_id); + if (!wc) + return; printing::PrintViewManagerBasic* print_view_manager = printing::PrintViewManagerBasic::FromWebContents(wc); print_view_manager->set_file_descriptor(base::FileDescriptor(fd, false)); diff --git a/chrome/browser/printing/printing_message_filter.h b/chrome/browser/printing/printing_message_filter.h index 148dfda..3c0bf88 100644 --- a/chrome/browser/printing/printing_message_filter.h +++ b/chrome/browser/printing/printing_message_filter.h @@ -92,6 +92,10 @@ class PrintingMessageFilter : public content::BrowserMessageFilter { const base::Closure& callback, scoped_refptr<printing::PrinterQuery> printer_query); + void OnGetPrintSettingsFailed( + const base::Closure& callback, + scoped_refptr<printing::PrinterQuery> printer_query); + // Checks if printing is enabled. void OnIsPrintingEnabled(bool* is_enabled); |