| 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..630ccb21632118b6eb1e17e65a4d0eb267694f3e 100644
|
| --- a/headless/lib/browser/headless_devtools_manager_delegate.cc
|
| +++ b/headless/lib/browser/headless_devtools_manager_delegate.cc
|
| @@ -7,6 +7,8 @@
|
| #include <string>
|
| #include <utility>
|
|
|
| +#include "base/strings/string_number_conversions.h"
|
| +#include "base/strings/string_split.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/devtools_agent_host.h"
|
| #include "content/public/browser/devtools_frontend_host.h"
|
| @@ -73,6 +75,85 @@ std::unique_ptr<base::DictionaryValue> CreateInvalidParamResponse(
|
| }
|
|
|
| #if BUILDFLAG(ENABLE_BASIC_PRINTING)
|
| +std::unique_ptr<base::DictionaryValue> ParsePrintParams(
|
| + int command_id,
|
| + const base::DictionaryValue* params,
|
| + printing::HeadlessPrintSettings* settings) {
|
| + params->GetInteger("dpi", &settings->dpi);
|
| + 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 < 0)
|
| + return CreateInvalidParamResponse(command_id, "scale");
|
| +
|
| + std::string paper_type;
|
| + if (params->GetString("paperType", &paper_type)) {
|
| + if (paper_type == "letter")
|
| + settings->paper_type = printing::HeadlessPrintSettings::LETTER;
|
| + else if (paper_type == "legal")
|
| + settings->paper_type = printing::HeadlessPrintSettings::LEGAL;
|
| + else if (paper_type == "A4")
|
| + settings->paper_type = printing::HeadlessPrintSettings::A4;
|
| + else if (paper_type == "A3")
|
| + settings->paper_type = printing::HeadlessPrintSettings::A3;
|
| + else
|
| + return CreateInvalidParamResponse(command_id, "paperType");
|
| + }
|
| +
|
| + std::string margin_type;
|
| + if (params->GetString("marginType", &margin_type)) {
|
| + if (margin_type == "defaultMargin") {
|
| + settings->margin_type = printing::DEFAULT_MARGINS;
|
| + } else if (margin_type == "noMargin") {
|
| + settings->margin_type = printing::NO_MARGINS;
|
| + } else if (margin_type == "customMargin") {
|
| + settings->margin_type = printing::CUSTOM_MARGINS;
|
| + if (!params->GetDouble("marginTop", &settings->margin_top_in_inch))
|
| + return CreateInvalidParamResponse(command_id, "marginTop");
|
| + if (!params->GetDouble("marginBottom",
|
| + &settings->margin_bottom_in_inch)) {
|
| + return CreateInvalidParamResponse(command_id, "marginBottom");
|
| + }
|
| + if (!params->GetDouble("marginLeft", &settings->margin_left_in_inch))
|
| + return CreateInvalidParamResponse(command_id, "marginLeft");
|
| + if (!params->GetDouble("marginRight", &settings->margin_right_in_inch)) {
|
| + return CreateInvalidParamResponse(command_id, "marginRight");
|
| + }
|
| + } else {
|
| + return CreateInvalidParamResponse(command_id, "marginType");
|
| + }
|
| + }
|
| +
|
| + std::string page_ranges;
|
| + if (params->GetString("pageRanges", &page_ranges)) {
|
| + for (const auto& range_string :
|
| + base::SplitStringPiece(page_ranges, ",", base::TRIM_WHITESPACE,
|
| + base::SPLIT_WANT_NONEMPTY)) {
|
| + auto tokens = base::SplitStringPiece(
|
| + range_string, "-", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
|
| + if (tokens.size() > 2 || tokens.empty())
|
| + return CreateInvalidParamResponse(command_id, "pageRanges");
|
| + printing::PageRange range;
|
| + base::StringToInt(tokens[0], &range.from);
|
| + if (tokens.size() == 2)
|
| + base::StringToInt(tokens[1], &range.to);
|
| + else
|
| + range.to = range.from;
|
| + if (range.from < 1 || range.from > range.to)
|
| + return CreateInvalidParamResponse(command_id, "pageRanges");
|
| +
|
| + // Page numbers are 1-based in the dictionary.
|
| + // Page numbers are 0-based for the print settings.
|
| + range.from--;
|
| + range.to--;
|
| + settings->page_ranges.push_back(range);
|
| + }
|
| + }
|
| +
|
| + return nullptr;
|
| +}
|
| +
|
| void PDFCreated(
|
| const content::DevToolsManagerDelegate::CommandCallback& callback,
|
| int command_id,
|
| @@ -189,14 +270,26 @@ 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;
|
| + auto response = ParsePrintParams(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
|
|
|