summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-15 16:59:47 +0000
committervitalybuka@chromium.org <vitalybuka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-10-15 16:59:47 +0000
commitb3ea1818f3368d39712254a5d930c19f8e6d5d67 (patch)
treece8a997feb6142d56eb01a635f5fd90e2979c162
parent2caa44d507ac44307160770bd811a13063e0f812 (diff)
downloadchromium_src-b3ea1818f3368d39712254a5d930c19f8e6d5d67.zip
chromium_src-b3ea1818f3368d39712254a5d930c19f8e6d5d67.tar.gz
chromium_src-b3ea1818f3368d39712254a5d930c19f8e6d5d67.tar.bz2
Merge 227984 "Check RenderViewHost pointer, it may be deleted be..."
> 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 TBR=vitalybuka@chromium.org Review URL: https://codereview.chromium.org/26378006 git-svn-id: svn://svn.chromium.org/chrome/branches/1650/src@228708 0039d316-1c4b-4281-b951-d872f2087c98
-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);