Chromium Code Reviews| 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..814bf756d41daf87a22feeb1c2b4fb5ff755833c 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> ParsePrintSettings( |
|
Lei Zhang
2017/04/20 08:35:58
Now that you have written a parser, you probably w
jzfeng
2017/04/27 06:56:06
Done. Added headless_printing_unittest.cc to do al
|
| + int command_id, |
| + const base::DictionaryValue* params, |
| + printing::HeadlessPrintSettings* settings) { |
| + params->GetInteger("dpi", &settings->dpi); |
|
Eric Seckler
2017/04/20 09:15:28
nit: add a comment that we can safely ignore retur
jzfeng
2017/04/27 06:56:06
Done.
|
| + 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) |
|
Lei Zhang
2017/04/20 08:35:58
In print preview, the valid range is [10, 200]. Ho
jzfeng
2017/04/27 06:56:06
Done.
|
| + return CreateInvalidParamResponse(command_id, "scale"); |
| + |
| + std::string paper_type; |
| + if (params->GetString("paperType", &paper_type)) { |
| + if (paper_type == "letter") |
|
Lei Zhang
2017/04/20 08:35:58
Maybe use the same names as https://developers.goo
jzfeng
2017/04/27 06:56:05
Done.
|
| + 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)) |
|
Lei Zhang
2017/04/20 08:35:58
Can you try setting this to 20 inches and see what
jzfeng
2017/04/27 06:56:06
I tested it, this type of error has been handled b
|
| + 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 { |
|
Lei Zhang
2017/04/20 08:35:58
Did you leave out PRINTABLE_AREA_MARGINS on purpos
jzfeng
2017/04/27 06:56:06
Yeah. Now I further restrict the type to be DEFAUL
|
| + return CreateInvalidParamResponse(command_id, "marginType"); |
| + } |
| + } |
| + |
| + std::string page_ranges; |
| + if (params->GetString("pageRanges", &page_ranges)) { |
|
Lei Zhang
2017/04/20 09:15:05
If you want to get fancy, see pageRangeTextToPageR
jzfeng
2017/04/27 06:56:06
Re-implement the logic in headless_print_manager.c
|
| + 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); |
|
Lei Zhang
2017/04/20 08:35:58
StringToInt() comes with a 16 line comment about i
jzfeng
2017/04/27 06:56:06
Added unit test for it.
|
| + 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."; |
|
Lei Zhang
2017/04/20 08:35:58
Which settings don't work? Is it just headers+foot
jzfeng
2017/04/27 06:56:06
headers+footers and scale don't work.
In PrintWe
Lei Zhang
2017/04/27 22:17:46
I would suggest experimenting with making these fe
Eric Seckler
2017/04/28 08:13:06
If this works, would we be able to avoid adding th
jzfeng
2017/05/02 07:50:55
In PrintWebViewHelper,
1) I removed some of the BU
|
| +#endif |
| content::WebContents* web_contents = agent_host->GetWebContents(); |
| content::RenderFrameHost* rfh = web_contents->GetMainFrame(); |
| + printing::HeadlessPrintSettings settings; |
| + auto response = ParsePrintSettings(command_id, params, &settings); |
|
Lei Zhang
2017/04/20 08:35:58
You may want to write out the type instead of usin
Lei Zhang
2017/04/20 08:53:12
See https://google.github.io/styleguide/cppguide.h
jzfeng
2017/04/27 06:56:06
Done.
|
| + 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 |