#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/printing_ui_web_contents_observer.h"
+#include "chrome/browser/printing/printer_query.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_io_data.h"
#include "chrome/common/print_messages.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/common/child_process_host.h"
#if defined(ENABLE_FULL_PRINTING)
#include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
#include <map>
-#include "base/file_util.h"
+#include "base/files/file_util.h"
#include "base/lazy_instance.h"
#include "chrome/browser/printing/print_dialog_cloud.h"
#endif
using content::BrowserThread;
+namespace printing {
+
namespace {
#if defined(OS_CHROMEOS)
g_printing_file_descriptor_map = LAZY_INSTANCE_INITIALIZER;
#endif
-void RenderParamsFromPrintSettings(const printing::PrintSettings& settings,
+void RenderParamsFromPrintSettings(const PrintSettings& settings,
PrintMsg_Print_Params* params) {
params->page_size = settings.page_setup_device_units().physical_size();
params->content_size.SetSize(
profile->GetResourceContext())),
render_process_id_(render_process_id),
queue_(g_browser_process->print_job_manager()->queue()) {
- DCHECK(queue_);
+ DCHECK(queue_.get());
}
PrintingMessageFilter::~PrintingMessageFilter() {
content::WebContents* wc = GetWebContentsForRenderView(render_view_id);
if (!wc)
return;
- printing::PrintViewManagerBasic* print_view_manager =
- printing::PrintViewManagerBasic::FromWebContents(wc);
+ PrintViewManagerBasic* print_view_manager =
+ PrintViewManagerBasic::FromWebContents(wc);
// The file descriptor is originally created in & passed from the Android
// side, and it will handle the closing.
const base::FileDescriptor& file_descriptor =
content::WebContents* wc = GetWebContentsForRenderView(render_view_id);
if (!wc)
return;
- printing::PrintViewManagerBasic* print_view_manager =
- printing::PrintViewManagerBasic::FromWebContents(wc);
+ PrintViewManagerBasic* print_view_manager =
+ PrintViewManagerBasic::FromWebContents(wc);
const base::FileDescriptor& file_descriptor =
print_view_manager->file_descriptor();
- printing::PrintingContextAndroid::PdfWritingDone(file_descriptor.fd, true);
+ PrintingContextAndroid::PdfWritingDone(file_descriptor.fd, true);
// Invalidate the file descriptor so it doesn't accidentally get reused.
print_view_manager->set_file_descriptor(base::FileDescriptor(-1, false));
#endif
return view ? content::WebContents::FromRenderViewHost(view) : NULL;
}
-struct PrintingMessageFilter::GetPrintSettingsForRenderViewParams {
- printing::PrinterQuery::GetSettingsAskParam ask_user_for_settings;
- int expected_page_count;
- bool has_selection;
- printing::MarginType margin_type;
-};
-
-void PrintingMessageFilter::GetPrintSettingsForRenderView(
- int render_view_id,
- GetPrintSettingsForRenderViewParams params,
- const base::Closure& callback,
- scoped_refptr<printing::PrinterQuery> printer_query) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
- content::WebContents* wc = GetWebContentsForRenderView(render_view_id);
- if (wc) {
- scoped_ptr<PrintingUIWebContentsObserver> wc_observer(
- new PrintingUIWebContentsObserver(wc));
- BrowserThread::PostTask(
- BrowserThread::IO, FROM_HERE,
- base::Bind(&printing::PrinterQuery::GetSettings, printer_query,
- params.ask_user_for_settings, base::Passed(&wc_observer),
- 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));
- }
-}
-
-void PrintingMessageFilter::OnGetPrintSettingsFailed(
- const base::Closure& callback,
- scoped_refptr<printing::PrinterQuery> printer_query) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
- printer_query->GetSettingsDone(printing::PrintSettings(),
- printing::PrintingContext::FAILED);
- callback.Run();
-}
-
void PrintingMessageFilter::OnIsPrintingEnabled(bool* is_enabled) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
*is_enabled = profile_io_data_->printing_enabled()->GetValue();
void PrintingMessageFilter::OnGetDefaultPrintSettings(IPC::Message* reply_msg) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
- scoped_refptr<printing::PrinterQuery> printer_query;
+ scoped_refptr<PrinterQuery> printer_query;
if (!profile_io_data_->printing_enabled()->GetValue()) {
// Reply with NULL query.
OnGetDefaultPrintSettingsReply(printer_query, reply_msg);
return;
}
printer_query = queue_->PopPrinterQuery(0);
- if (!printer_query)
- printer_query = queue_->CreatePrinterQuery();
+ if (!printer_query.get()) {
+ printer_query =
+ queue_->CreatePrinterQuery(render_process_id_, reply_msg->routing_id());
+ }
// Loads default settings. This is asynchronous, only the IPC message sender
// will hang until the settings are retrieved.
- 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));
+ printer_query->GetSettings(
+ PrinterQuery::DEFAULTS,
+ 0,
+ false,
+ DEFAULT_MARGINS,
+ base::Bind(&PrintingMessageFilter::OnGetDefaultPrintSettingsReply,
+ this,
+ printer_query,
+ reply_msg));
}
void PrintingMessageFilter::OnGetDefaultPrintSettingsReply(
- scoped_refptr<printing::PrinterQuery> printer_query,
+ scoped_refptr<PrinterQuery> printer_query,
IPC::Message* reply_msg) {
PrintMsg_Print_Params params;
if (!printer_query.get() ||
- printer_query->last_status() != printing::PrintingContext::OK) {
+ printer_query->last_status() != PrintingContext::OK) {
params.Reset();
} else {
RenderParamsFromPrintSettings(printer_query->settings(), ¶ms);
void PrintingMessageFilter::OnScriptedPrint(
const PrintHostMsg_ScriptedPrint_Params& params,
IPC::Message* reply_msg) {
- scoped_refptr<printing::PrinterQuery> printer_query =
+ scoped_refptr<PrinterQuery> printer_query =
queue_->PopPrinterQuery(params.cookie);
- if (!printer_query)
- printer_query = queue_->CreatePrinterQuery();
- 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));
+ if (!printer_query.get()) {
+ printer_query =
+ queue_->CreatePrinterQuery(render_process_id_, reply_msg->routing_id());
+ }
+ printer_query->GetSettings(
+ PrinterQuery::ASK_USER,
+ params.expected_pages_count,
+ params.has_selection,
+ params.margin_type,
+ base::Bind(&PrintingMessageFilter::OnScriptedPrintReply,
+ this,
+ printer_query,
+ reply_msg));
}
void PrintingMessageFilter::OnScriptedPrintReply(
- scoped_refptr<printing::PrinterQuery> printer_query,
+ scoped_refptr<PrinterQuery> printer_query,
IPC::Message* reply_msg) {
PrintMsg_PrintPages_Params params;
#if defined(OS_ANDROID)
// |reply_msg| before we can get the routing ID for the Android code.
int routing_id = reply_msg->routing_id();
#endif
- if (printer_query->last_status() != printing::PrintingContext::OK ||
+ if (printer_query->last_status() != PrintingContext::OK ||
!printer_query->settings().dpi()) {
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());
+ params.pages = PageRange::GetPages(printer_query->settings().ranges());
}
PrintHostMsg_ScriptedPrint::WriteReplyParams(reply_msg, params);
Send(reply_msg);
content::WebContents* wc = GetWebContentsForRenderView(render_view_id);
if (!wc)
return;
- printing::PrintViewManagerBasic* print_view_manager =
- printing::PrintViewManagerBasic::FromWebContents(wc);
+ PrintViewManagerBasic* print_view_manager =
+ 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,
IPC::Message* reply_msg) {
- scoped_refptr<printing::PrinterQuery> printer_query;
+ scoped_ptr<base::DictionaryValue> new_settings(job_settings.DeepCopy());
+
+ scoped_refptr<PrinterQuery> printer_query;
if (!profile_io_data_->printing_enabled()->GetValue()) {
// Reply with NULL query.
OnUpdatePrintSettingsReply(printer_query, reply_msg);
return;
}
printer_query = queue_->PopPrinterQuery(document_cookie);
- if (!printer_query)
- printer_query = queue_->CreatePrinterQuery();
+ if (!printer_query.get()) {
+ int host_id = render_process_id_;
+ int routing_id = reply_msg->routing_id();
+ if (!new_settings->GetInteger(printing::kPreviewInitiatorHostId,
+ &host_id) ||
+ !new_settings->GetInteger(printing::kPreviewInitiatorRoutingId,
+ &routing_id)) {
+ host_id = content::ChildProcessHost::kInvalidUniqueID;
+ routing_id = content::ChildProcessHost::kInvalidUniqueID;
+ }
+ printer_query = queue_->CreatePrinterQuery(host_id, routing_id);
+ }
printer_query->SetSettings(
- job_settings,
+ new_settings.Pass(),
base::Bind(&PrintingMessageFilter::OnUpdatePrintSettingsReply, this,
printer_query, reply_msg));
}
void PrintingMessageFilter::OnUpdatePrintSettingsReply(
- scoped_refptr<printing::PrinterQuery> printer_query,
+ scoped_refptr<PrinterQuery> printer_query,
IPC::Message* reply_msg) {
PrintMsg_PrintPages_Params params;
if (!printer_query.get() ||
- printer_query->last_status() != printing::PrintingContext::OK) {
+ printer_query->last_status() != PrintingContext::OK) {
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());
+ params.pages = PageRange::GetPages(printer_query->settings().ranges());
}
- PrintHostMsg_UpdatePrintSettings::WriteReplyParams(reply_msg, params);
+ 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()) {
cancel);
}
#endif
+
+} // namespace printing