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

Unified Diff: headless/lib/browser/headless_devtools_manager_delegate.cc

Issue 2829973002: add customized printing setting for headless (Closed)
Patch Set: adjust command interface and add unit tests Created 3 years, 8 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: headless/lib/browser/headless_devtools_manager_delegate.cc
diff --git a/headless/lib/browser/headless_devtools_manager_delegate.cc b/headless/lib/browser/headless_devtools_manager_delegate.cc
index 040b8207c9e89b1fae5ff68455756533ce756c14..7483270f26a2e9a9882cd24e0d7c5ebe7100c031 100644
--- a/headless/lib/browser/headless_devtools_manager_delegate.cc
+++ b/headless/lib/browser/headless_devtools_manager_delegate.cc
@@ -16,13 +16,8 @@
#include "headless/lib/browser/headless_browser_impl.h"
#include "headless/lib/browser/headless_web_contents_impl.h"
#include "headless/public/devtools/domains/target.h"
-#include "printing/features/features.h"
#include "ui/base/resource/resource_bundle.h"
-#if BUILDFLAG(ENABLE_BASIC_PRINTING)
-#include "headless/lib/browser/headless_print_manager.h"
-#endif
-
namespace headless {
namespace {
@@ -32,6 +27,11 @@ const char kErrorParam[] = "error";
const char kErrorCodeParam[] = "code";
const char kErrorMessageParam[] = "message";
+// The max and min value should match the ones in scaling_settings.html.
+// Update both files at the same time.
+const double kScaleMaxVal = 200;
+const double kScaleMinVal = 10;
+
// JSON RPC 2.0 spec: http://www.jsonrpc.org/specification#error_object
enum Error {
kErrorInvalidParam = -32602,
@@ -94,6 +94,74 @@ void PDFCreated(
} // namespace
+#if BUILDFLAG(ENABLE_BASIC_PRINTING)
+std::unique_ptr<base::DictionaryValue> ParsePrintSettings(
+ int command_id,
+ const base::DictionaryValue* params,
+ printing::HeadlessPrintSettings* settings) {
+ const double kMMToInch = 1 / 25.4;
+ // we can safely ignore the return values of the following Get methods since
+ // the defaults are already set in |settings|.
+ params->GetBoolean("landscape", &settings->landscape);
+ params->GetBoolean("displayHeaderFooter", &settings->display_header_footer);
+ params->GetBoolean("printBackgrounds", &settings->should_print_backgrounds);
+ params->GetDouble("scale", &settings->scale);
+ if (settings->scale > kScaleMaxVal / 100 ||
+ settings->scale < kScaleMinVal / 100)
+ return CreateInvalidParamResponse(command_id, "scale");
+ params->GetString("pageRanges", &settings->page_ranges);
+
+ std::string paper_type = "NA_LETTER";
+ params->GetString("paperType", &paper_type);
+ if (paper_type == "NA_LETTER") {
+ settings->paper_type = printing::HeadlessPrintSettings::NA_LETTER;
+ } else if (paper_type == "NA_LEGAL") {
+ settings->paper_type = printing::HeadlessPrintSettings::NA_LEGAL;
+ } else if (paper_type == "ISO_A4") {
+ settings->paper_type = printing::HeadlessPrintSettings::ISO_A4;
+ } else if (paper_type == "ISO_A3") {
+ settings->paper_type = printing::HeadlessPrintSettings::ISO_A3;
+ } else if (paper_type == "CUSTOM") {
+ settings->paper_type = printing::HeadlessPrintSettings::CUSTOM;
+ if (!params->GetDouble("paperWidth", &settings->paper_width_in_inch))
+ return CreateInvalidParamResponse(command_id, "paperWidth");
+ if (!params->GetDouble("paperHeight", &settings->paper_height_in_inch))
+ return CreateInvalidParamResponse(command_id, "paperHeight");
+ } else {
+ return CreateInvalidParamResponse(command_id, "paperType");
+ }
+
+ bool custom_margin = false;
+ if (params->GetDouble("marginTop", &settings->margin_top_in_inch))
+ custom_margin = true;
+ if (params->GetDouble("marginBottom", &settings->margin_bottom_in_inch))
+ custom_margin = true;
+ if (params->GetDouble("marginLeft", &settings->margin_left_in_inch))
+ custom_margin = true;
+ if (params->GetDouble("marginRight", &settings->margin_right_in_inch))
+ custom_margin = true;
+ if (custom_margin) {
+ settings->margin_type = printing::CUSTOM_MARGINS;
+ } else {
+ settings->margin_type = printing::DEFAULT_MARGINS;
+ }
+
+ std::string unit = "INCH";
+ if (params->GetString("unit", &unit) && unit != "MM" && unit != "INCH")
+ return CreateInvalidParamResponse(command_id, "unit");
+ if (unit == "MM") {
+ settings->paper_width_in_inch *= kMMToInch;
+ settings->paper_height_in_inch *= kMMToInch;
+ settings->margin_top_in_inch *= kMMToInch;
+ settings->margin_bottom_in_inch *= kMMToInch;
+ settings->margin_left_in_inch *= kMMToInch;
+ settings->margin_right_in_inch *= kMMToInch;
+ }
+
+ return nullptr;
+}
+#endif
+
HeadlessDevToolsManagerDelegate::HeadlessDevToolsManagerDelegate(
base::WeakPtr<HeadlessBrowserImpl> browser)
: browser_(std::move(browser)) {
@@ -189,14 +257,27 @@ void HeadlessDevToolsManagerDelegate::PrintToPDF(
int command_id,
const base::DictionaryValue* params,
const CommandCallback& callback) {
+ DCHECK(callback);
+
#if BUILDFLAG(ENABLE_BASIC_PRINTING)
+#if !BUILDFLAG(ENABLE_PRINT_PREVIEW)
+ LOG(WARNING)
+ << "Print preview is not enabled. Some print settings may not work.";
+#endif
content::WebContents* web_contents = agent_host->GetWebContents();
content::RenderFrameHost* rfh = web_contents->GetMainFrame();
+ printing::HeadlessPrintSettings settings;
+ std::unique_ptr<base::DictionaryValue> response =
+ ParsePrintSettings(command_id, params, &settings);
+ if (response) {
+ callback.Run(std::move(response));
+ return;
+ }
printing::HeadlessPrintManager::FromWebContents(web_contents)
- ->GetPDFContents(rfh, base::Bind(&PDFCreated, callback, command_id));
+ ->GetPDFContents(rfh, settings,
+ base::Bind(&PDFCreated, callback, command_id));
#else
- DCHECK(callback);
callback.Run(CreateErrorResponse(command_id, kErrorServerError,
"Printing is not enabled"));
#endif

Powered by Google App Engine
This is Rietveld 408576698