|
@@ -2,13 +2,17 @@
|
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
|
// found in the LICENSE file.
|
|
|
|
|
|
-#include "atom/browser/printing/printing_message_filter.h"
|
|
|
+#include "chrome/browser/printing/printing_message_filter.h"
|
|
|
+
|
|
|
+#include <string>
|
|
|
|
|
|
-#include "atom/browser/printing/printing_config_service.h"
|
|
|
#include "base/bind.h"
|
|
|
#include "chrome/browser/browser_process.h"
|
|
|
-#include "chrome/browser/printing/print_job_manager.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/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"
|
|
@@ -16,7 +20,38 @@
|
|
|
|
|
|
using content::BrowserThread;
|
|
|
|
|
|
-namespace atom {
|
|
|
+namespace {
|
|
|
+
|
|
|
+void RenderParamsFromPrintSettings(const printing::PrintSettings& settings,
|
|
|
+ PrintMsg_Print_Params* params) {
|
|
|
+ params->page_size = settings.page_setup_device_units().physical_size();
|
|
|
+ params->content_size.SetSize(
|
|
|
+ settings.page_setup_device_units().content_area().width(),
|
|
|
+ settings.page_setup_device_units().content_area().height());
|
|
|
+ params->printable_area.SetRect(
|
|
|
+ settings.page_setup_device_units().printable_area().x(),
|
|
|
+ settings.page_setup_device_units().printable_area().y(),
|
|
|
+ settings.page_setup_device_units().printable_area().width(),
|
|
|
+ settings.page_setup_device_units().printable_area().height());
|
|
|
+ params->margin_top = settings.page_setup_device_units().content_area().y();
|
|
|
+ params->margin_left = settings.page_setup_device_units().content_area().x();
|
|
|
+ params->dpi = settings.dpi();
|
|
|
+ // Currently hardcoded at 1.25. See PrintSettings' constructor.
|
|
|
+ params->min_shrink = settings.min_shrink();
|
|
|
+ // Currently hardcoded at 2.0. See PrintSettings' constructor.
|
|
|
+ params->max_shrink = settings.max_shrink();
|
|
|
+ // Currently hardcoded at 72dpi. See PrintSettings' constructor.
|
|
|
+ params->desired_dpi = settings.desired_dpi();
|
|
|
+ // Always use an invalid cookie.
|
|
|
+ params->document_cookie = 0;
|
|
|
+ params->selection_only = settings.selection_only();
|
|
|
+ params->supports_alpha_blend = settings.supports_alpha_blend();
|
|
|
+ params->should_print_backgrounds = settings.should_print_backgrounds();
|
|
|
+ params->title = settings.title();
|
|
|
+ params->url = settings.url();
|
|
|
+}
|
|
|
+
|
|
|
+} // namespace
|
|
|
|
|
|
PrintingMessageFilter::PrintingMessageFilter(int render_process_id)
|
|
|
: BrowserMessageFilter(PrintMsgStart),
|
|
@@ -62,16 +97,44 @@ content::WebContents* PrintingMessageFilter::GetWebContentsForRenderView(
|
|
|
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,
|
|
|
- bool ask_user_for_settings,
|
|
|
- PrintHostMsg_ScriptedPrint_Params params,
|
|
|
- const base::Callback<void(const PrintMsg_PrintPages_Params&)>callback,
|
|
|
+ GetPrintSettingsForRenderViewParams params,
|
|
|
+ const base::Closure& callback,
|
|
|
scoped_refptr<printing::PrinterQuery> printer_query) {
|
|
|
DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
|
|
content::WebContents* wc = GetWebContentsForRenderView(render_view_id);
|
|
|
- PrintingConfigService::GetInstance()->GetPrintSettings(
|
|
|
- wc, printer_query, ask_user_for_settings, params, callback);
|
|
|
+ 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::OnGetDefaultPrintSettings(IPC::Message* reply_msg) {
|
|
@@ -79,8 +142,7 @@ void PrintingMessageFilter::OnGetDefaultPrintSettings(IPC::Message* reply_msg) {
|
|
|
scoped_refptr<printing::PrinterQuery> printer_query;
|
|
|
if (false) {
|
|
|
// Reply with NULL query.
|
|
|
- OnGetDefaultPrintSettingsReply(printer_query, reply_msg,
|
|
|
- PrintMsg_PrintPages_Params());
|
|
|
+ OnGetDefaultPrintSettingsReply(printer_query, reply_msg);
|
|
|
return;
|
|
|
}
|
|
|
printer_query = queue_->PopPrinterQuery(0);
|
|
@@ -89,27 +151,33 @@ void PrintingMessageFilter::OnGetDefaultPrintSettings(IPC::Message* reply_msg) {
|
|
|
|
|
|
// Loads default settings. This is asynchronous, only the IPC message sender
|
|
|
// will hang until the settings are retrieved.
|
|
|
- PrintHostMsg_ScriptedPrint_Params params;
|
|
|
- params.expected_pages_count = 0;
|
|
|
+ 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(), false, params,
|
|
|
+ reply_msg->routing_id(), params,
|
|
|
base::Bind(&PrintingMessageFilter::OnGetDefaultPrintSettingsReply,
|
|
|
- this, printer_query, reply_msg),
|
|
|
+ this, printer_query, reply_msg),
|
|
|
printer_query));
|
|
|
}
|
|
|
|
|
|
void PrintingMessageFilter::OnGetDefaultPrintSettingsReply(
|
|
|
scoped_refptr<printing::PrinterQuery> printer_query,
|
|
|
- IPC::Message* reply_msg,
|
|
|
- const PrintMsg_PrintPages_Params& params) {
|
|
|
- PrintHostMsg_GetDefaultPrintSettings::WriteReplyParams(
|
|
|
- reply_msg, params.params);
|
|
|
+ IPC::Message* reply_msg) {
|
|
|
+ PrintMsg_Print_Params params;
|
|
|
+ if (!printer_query.get() ||
|
|
|
+ printer_query->last_status() != printing::PrintingContext::OK) {
|
|
|
+ params.Reset();
|
|
|
+ } else {
|
|
|
+ RenderParamsFromPrintSettings(printer_query->settings(), ¶ms);
|
|
|
+ params.document_cookie = printer_query->cookie();
|
|
|
+ }
|
|
|
+ PrintHostMsg_GetDefaultPrintSettings::WriteReplyParams(reply_msg, params);
|
|
|
Send(reply_msg);
|
|
|
-
|
|
|
// If printing was enabled.
|
|
|
if (printer_query.get()) {
|
|
|
// If user hasn't cancelled.
|
|
@@ -128,10 +196,16 @@ void PrintingMessageFilter::OnScriptedPrint(
|
|
|
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(), true, params,
|
|
|
+ reply_msg->routing_id(), settings_params,
|
|
|
base::Bind(&PrintingMessageFilter::OnScriptedPrintReply, this,
|
|
|
printer_query, reply_msg),
|
|
|
printer_query));
|
|
@@ -139,16 +213,22 @@ void PrintingMessageFilter::OnScriptedPrint(
|
|
|
|
|
|
void PrintingMessageFilter::OnScriptedPrintReply(
|
|
|
scoped_refptr<printing::PrinterQuery> printer_query,
|
|
|
- IPC::Message* reply_msg,
|
|
|
- const PrintMsg_PrintPages_Params& params) {
|
|
|
+ IPC::Message* reply_msg) {
|
|
|
+ PrintMsg_PrintPages_Params params;
|
|
|
+ if (printer_query->last_status() != printing::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());
|
|
|
+ }
|
|
|
PrintHostMsg_ScriptedPrint::WriteReplyParams(reply_msg, params);
|
|
|
Send(reply_msg);
|
|
|
-
|
|
|
if (params.params.dpi && params.params.document_cookie) {
|
|
|
queue_->QueuePrinterQuery(printer_query.get());
|
|
|
} else {
|
|
|
printer_query->StopWorker();
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-} // namespace atom
|