Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2069)

Unified Diff: chrome/browser/printing/printing_message_filter.cc

Issue 10544084: Fix crash when displaying system print dialog on Linux. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove extra render_view_id references Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/printing/printing_message_filter.cc
diff --git a/chrome/browser/printing/printing_message_filter.cc b/chrome/browser/printing/printing_message_filter.cc
index a100d44db5e1b680e00cbd84eb5d16ec23568880..c392979b9433fdfa9bb8757bf7437bf118efdb23 100644
--- a/chrome/browser/printing/printing_message_filter.cc
+++ b/chrome/browser/printing/printing_message_filter.cc
@@ -13,6 +13,9 @@
#include "chrome/browser/printing/print_job_manager.h"
#include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
#include "chrome/common/print_messages.h"
+#include "content/public/browser/render_view_host.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_contents_view.h"
#if defined(OS_CHROMEOS)
#include <fcntl.h>
@@ -22,9 +25,6 @@
#include "base/file_util.h"
#include "base/lazy_instance.h"
#include "chrome/browser/printing/print_dialog_cloud.h"
-#include "content/public/browser/render_view_host.h"
-#include "content/public/browser/web_contents.h"
-#include "content/public/browser/web_contents_view.h"
#endif
using content::BrowserThread;
@@ -90,9 +90,10 @@ PrintingMessageFilter::~PrintingMessageFilter() {
void PrintingMessageFilter::OverrideThreadForMessage(
const IPC::Message& message, BrowserThread::ID* thread) {
#if defined(OS_CHROMEOS)
- if (message.type() == PrintHostMsg_AllocateTempFileForPrinting::ID ||
- message.type() == PrintHostMsg_TempFileForPrintingWritten::ID) {
+ if (message.type() == PrintHostMsg_AllocateTempFileForPrinting::ID) {
*thread = BrowserThread::FILE;
+ } else if (message.type() == PrintHostMsg_TempFileForPrintingWritten::ID) {
+ *thread = BrowserThread::UI;
}
#endif
}
@@ -161,7 +162,7 @@ void PrintingMessageFilter::OnAllocateTempFileForPrinting(
void PrintingMessageFilter::OnTempFileForPrintingWritten(int render_view_id,
int sequence_number) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
Lei Zhang 2012/06/11 23:32:28 If you do this, then |g_printing_file_descriptor_m
Albert Bodenhamer 2012/06/11 23:54:58 Argh! Yeah. I should have caught that. CrOS DID
Albert Bodenhamer 2012/06/12 01:19:02 Done.
SequenceToPathMap* map = &g_printing_file_descriptor_map.Get().map;
SequenceToPathMap::iterator it = map->find(sequence_number);
if (it == map->end()) {
@@ -169,10 +170,7 @@ void PrintingMessageFilter::OnTempFileForPrintingWritten(int render_view_id,
"renderer: " << sequence_number;
return;
}
-
- content::RenderViewHost* view = content::RenderViewHost::FromID(
- render_process_id_, render_view_id);
- content::WebContents* wc = content::WebContents::FromRenderViewHost(view);
+ content::WebContents* wc = GetWebContentsForRenderView(render_view_id);
print_dialog_cloud::CreatePrintDialogForFile(
wc->GetBrowserContext(),
wc->GetView()->GetTopLevelNativeWindow(),
@@ -187,25 +185,57 @@ void PrintingMessageFilter::OnTempFileForPrintingWritten(int render_view_id,
}
#endif // defined(OS_CHROMEOS)
-void PrintingMessageFilter::OnGetDefaultPrintSettings(IPC::Message* reply_msg) {
+content::WebContents* PrintingMessageFilter::GetWebContentsForRenderView(
+ int render_view_id) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ content::RenderViewHost* view = content::RenderViewHost::FromID(
+ render_process_id_, render_view_id);
+ return content::WebContents::FromRenderViewHost(view);
+}
+
+void PrintingMessageFilter::GetPrintSettingsForRenderView(
+ int render_view_id,
+ GetPrintSettingsForRenderViewParams params,
+ const base::Closure& callback,
+ scoped_refptr<printing::PrinterQuery> printer_query) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ content::WebContents* wc = GetWebContentsForRenderView(render_view_id);
+
+ 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::OnGetDefaultPrintSettings(
+ IPC::Message* reply_msg) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
scoped_refptr<printing::PrinterQuery> printer_query;
if (!print_job_manager_->printing_enabled()) {
// Reply with NULL query.
OnGetDefaultPrintSettingsReply(printer_query, reply_msg);
return;
}
-
print_job_manager_->PopPrinterQuery(0, &printer_query);
if (!printer_query.get())
printer_query = new printing::PrinterQuery;
// Loads default settings. This is asynchronous, only the IPC message sender
// will hang until the settings are retrieved.
- printer_query->GetSettings(
- printing::PrinterQuery::DEFAULTS, NULL, 0, false,
- printing::DEFAULT_MARGINS,
- base::Bind(&PrintingMessageFilter::OnGetDefaultPrintSettingsReply, this,
- printer_query, reply_msg));
+ GetPrintSettingsForRenderViewParams params;
+ params.ask_user_for_settings = printing::PrinterQuery::DEFAULTS;
+ params.expected_page_count = 0;
+ params.has_selection = false;
+ params.margin_type = printing::DEFAULT_MARGINS;
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&PrintingMessageFilter::GetPrintSettingsForRenderView, this,
+ reply_msg->routing_id(), params,
+ base::Bind(&PrintingMessageFilter::OnGetDefaultPrintSettingsReply,
+ this, printer_query, reply_msg),
+ printer_query));
}
void PrintingMessageFilter::OnGetDefaultPrintSettingsReply(
@@ -235,20 +265,24 @@ void PrintingMessageFilter::OnGetDefaultPrintSettingsReply(
void PrintingMessageFilter::OnScriptedPrint(
const PrintHostMsg_ScriptedPrint_Params& params,
IPC::Message* reply_msg) {
- gfx::NativeView host_view =
- gfx::NativeViewFromIdInBrowser(params.host_window_id);
-
scoped_refptr<printing::PrinterQuery> printer_query;
print_job_manager_->PopPrinterQuery(params.cookie, &printer_query);
if (!printer_query.get()) {
printer_query = new printing::PrinterQuery;
}
-
- printer_query->GetSettings(
- printing::PrinterQuery::ASK_USER, host_view, params.expected_pages_count,
- params.has_selection, params.margin_type,
- base::Bind(&PrintingMessageFilter::OnScriptedPrintReply, this,
- printer_query, reply_msg));
+ GetPrintSettingsForRenderViewParams settings_params;
+ settings_params.ask_user_for_settings = printing::PrinterQuery::ASK_USER;
+ settings_params.expected_page_count = params.expected_pages_count;
+ settings_params.has_selection = params.has_selection;
+ settings_params.margin_type = params.margin_type;
+
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&PrintingMessageFilter::GetPrintSettingsForRenderView, this,
+ reply_msg->routing_id(), settings_params,
+ base::Bind(&PrintingMessageFilter::OnScriptedPrintReply, this,
+ printer_query, reply_msg),
+ printer_query));
}
void PrintingMessageFilter::OnScriptedPrintReply(

Powered by Google App Engine
This is Rietveld 408576698