summaryrefslogtreecommitdiffstats
path: root/chrome/browser/printing
diff options
context:
space:
mode:
authorvitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-10 20:52:30 +0000
committervitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-10 20:52:30 +0000
commit345b8dfaeaf2b4289ba080f5da033a70310fc5cc (patch)
treec5e955fa8194694c178e828e7fe3f27f16418b9c /chrome/browser/printing
parent6cf6ca58e053f69d88c90b55f3a9011a6caba801 (diff)
downloadchromium_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.cc37
-rw-r--r--chrome/browser/printing/printing_message_filter.h4
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);