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 485cff692b27bdad64eb978716563fd6ff49617a..94301a67c98afcb9253aee5f4adcc4fc6827fbfa 100644 |
--- a/chrome/browser/printing/printing_message_filter.cc |
+++ b/chrome/browser/printing/printing_message_filter.cc |
@@ -8,8 +8,8 @@ |
#include "base/bind.h" |
#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/printing/printer_query.h" |
#include "chrome/browser/printing/print_job_manager.h" |
+#include "chrome/browser/printing/printer_query.h" |
#include "chrome/browser/printing/printing_ui_web_contents_observer.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/profiles/profile_io_data.h" |
@@ -36,7 +36,9 @@ |
#include "base/strings/string_number_conversions.h" |
#include "chrome/browser/printing/print_view_manager_basic.h" |
#include "printing/printing_context_android.h" |
-#endif |
+#else // defined(OS_ANDROID) |
+#include "chrome/browser/printing/print_preview_dialog_controller.h" |
+#endif // defined(OS_ANDROID) |
using content::BrowserThread; |
@@ -413,6 +415,7 @@ void PrintingMessageFilter::OnScriptedPrintReply( |
} |
#if defined(OS_ANDROID) |
+ |
void PrintingMessageFilter::UpdateFileDescriptor(int render_view_id, int fd) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
content::WebContents* wc = GetWebContentsForRenderView(render_view_id); |
@@ -422,40 +425,102 @@ void PrintingMessageFilter::UpdateFileDescriptor(int render_view_id, int fd) { |
printing::PrintViewManagerBasic::FromWebContents(wc); |
print_view_manager->set_file_descriptor(base::FileDescriptor(fd, false)); |
} |
-#endif |
void PrintingMessageFilter::OnUpdatePrintSettings( |
- int document_cookie, const base::DictionaryValue& job_settings, |
+ int render_view_id, |
+ int document_cookie, |
+ const base::DictionaryValue& job_settings, |
IPC::Message* reply_msg) { |
- scoped_refptr<printing::PrinterQuery> printer_query; |
+ scoped_ptr<base::DictionaryValue> new_settings(job_settings.DeepCopy()); |
+ |
+ OnUpdatePrintSettingsOnIOThread( |
+ document_cookie, |
+ base::Bind( |
+ &PrintingMessageFilter::OnUpdatePrintSettingsReply, this, reply_msg), |
+ scoped_ptr<PrintingUIWebContentsObserver>(), |
+ base::Passed(&new_settings)); |
+} |
+ |
+#else // defined(OS_ANDROID) |
+ |
+void PrintingMessageFilter::OnUpdatePrintSettings( |
+ int render_view_id, |
+ int document_cookie, |
+ const base::DictionaryValue& job_settings, |
+ IPC::Message* reply_msg) { |
+ scoped_ptr<base::DictionaryValue> new_settings(job_settings.DeepCopy()); |
+ |
+ BrowserThread::PostTaskAndReplyWithResult( |
+ BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&PrintingMessageFilter::OnUpdatePrintSettingsOnUIThread, |
+ this, |
+ render_view_id), |
+ base::Bind(&PrintingMessageFilter::OnUpdatePrintSettingsOnIOThread, |
+ this, |
+ document_cookie, |
+ base::Bind(&PrintingMessageFilter::OnUpdatePrintSettingsReply, |
+ this, |
+ reply_msg), |
+ base::Passed(&new_settings))); |
+} |
+ |
+scoped_ptr<PrintingUIWebContentsObserver> |
+PrintingMessageFilter::OnUpdatePrintSettingsOnUIThread(int render_view_id) { |
+ scoped_ptr<PrintingUIWebContentsObserver> wc_observer; |
+ content::WebContents* wc = GetWebContentsForRenderView(render_view_id); |
+ if (wc) { |
+ printing::PrintPreviewDialogController* dialog_controller = |
+ printing::PrintPreviewDialogController::GetInstance(); |
+ if (dialog_controller) { |
+ wc = dialog_controller->GetInitiator(wc); |
+ if (wc) |
+ wc_observer.reset(new PrintingUIWebContentsObserver(wc)); |
+ } |
+ } |
+ |
+ return wc_observer.Pass(); |
+} |
+ |
+#endif // defined(OS_ANDROID) |
+ |
+void PrintingMessageFilter::OnUpdatePrintSettingsOnIOThread( |
+ int document_cookie, |
+ const OnUpdatePrintSettingsCallback& callback, |
+ scoped_ptr<base::DictionaryValue> new_settings, |
+ scoped_ptr<PrintingUIWebContentsObserver> wc_observer) { |
if (!profile_io_data_->printing_enabled()->GetValue()) { |
// Reply with NULL query. |
- OnUpdatePrintSettingsReply(printer_query, reply_msg); |
+ callback.Run(NULL); |
return; |
} |
- printer_query = queue_->PopPrinterQuery(document_cookie); |
+ scoped_refptr<printing::PrinterQuery> printer_query = |
+ queue_->PopPrinterQuery(document_cookie); |
if (!printer_query) |
printer_query = queue_->CreatePrinterQuery(); |
- printer_query->SetSettings( |
- job_settings, |
- base::Bind(&PrintingMessageFilter::OnUpdatePrintSettingsReply, this, |
- printer_query, reply_msg)); |
+ printer_query->SetSettings(wc_observer.Pass(), |
+ new_settings.Pass(), |
+ base::Bind(callback, printer_query)); |
} |
void PrintingMessageFilter::OnUpdatePrintSettingsReply( |
- scoped_refptr<printing::PrinterQuery> printer_query, |
- IPC::Message* reply_msg) { |
+ IPC::Message* reply_msg, |
+ scoped_refptr<printing::PrinterQuery> printer_query) { |
PrintMsg_PrintPages_Params params; |
if (!printer_query.get() || |
- printer_query->last_status() != printing::PrintingContext::OK) { |
+ printer_query->last_status() == printing::PrintingContext::FAILED) { |
params.Reset(); |
} else { |
RenderParamsFromPrintSettings(printer_query->settings(), ¶ms.params); |
- params.params.document_cookie = printer_query->cookie(); |
params.pages = |
printing::PageRange::GetPages(printer_query->settings().ranges()); |
} |
- PrintHostMsg_UpdatePrintSettings::WriteReplyParams(reply_msg, params); |
+ params.params.document_cookie = printer_query->cookie(); |
+ PrintHostMsg_UpdatePrintSettings::WriteReplyParams( |
+ reply_msg, |
+ params, |
+ printer_query.get() && |
+ (printer_query->last_status() == printing::PrintingContext::CANCEL)); |
Send(reply_msg); |
// If user hasn't cancelled. |
if (printer_query.get()) { |