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

Side by Side 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, 7 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "headless/lib/browser/headless_devtools_manager_delegate.h" 5 #include "headless/lib/browser/headless_devtools_manager_delegate.h"
6 6
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 9
10 #include "content/public/browser/browser_thread.h" 10 #include "content/public/browser/browser_thread.h"
11 #include "content/public/browser/devtools_agent_host.h" 11 #include "content/public/browser/devtools_agent_host.h"
12 #include "content/public/browser/devtools_frontend_host.h" 12 #include "content/public/browser/devtools_frontend_host.h"
13 #include "content/public/browser/web_contents.h" 13 #include "content/public/browser/web_contents.h"
14 #include "headless/grit/headless_lib_resources.h" 14 #include "headless/grit/headless_lib_resources.h"
15 #include "headless/lib/browser/headless_browser_context_impl.h" 15 #include "headless/lib/browser/headless_browser_context_impl.h"
16 #include "headless/lib/browser/headless_browser_impl.h" 16 #include "headless/lib/browser/headless_browser_impl.h"
17 #include "headless/lib/browser/headless_web_contents_impl.h" 17 #include "headless/lib/browser/headless_web_contents_impl.h"
18 #include "headless/public/devtools/domains/target.h" 18 #include "headless/public/devtools/domains/target.h"
19 #include "printing/features/features.h"
20 #include "ui/base/resource/resource_bundle.h" 19 #include "ui/base/resource/resource_bundle.h"
21 20
22 #if BUILDFLAG(ENABLE_BASIC_PRINTING)
23 #include "headless/lib/browser/headless_print_manager.h"
24 #endif
25
26 namespace headless { 21 namespace headless {
27 22
28 namespace { 23 namespace {
29 const char kIdParam[] = "id"; 24 const char kIdParam[] = "id";
30 const char kResultParam[] = "result"; 25 const char kResultParam[] = "result";
31 const char kErrorParam[] = "error"; 26 const char kErrorParam[] = "error";
32 const char kErrorCodeParam[] = "code"; 27 const char kErrorCodeParam[] = "code";
33 const char kErrorMessageParam[] = "message"; 28 const char kErrorMessageParam[] = "message";
34 29
30 // The max and min value should match the ones in scaling_settings.html.
31 // Update both files at the same time.
32 const double kScaleMaxVal = 200;
33 const double kScaleMinVal = 10;
34
35 // JSON RPC 2.0 spec: http://www.jsonrpc.org/specification#error_object 35 // JSON RPC 2.0 spec: http://www.jsonrpc.org/specification#error_object
36 enum Error { 36 enum Error {
37 kErrorInvalidParam = -32602, 37 kErrorInvalidParam = -32602,
38 kErrorServerError = -32000 38 kErrorServerError = -32000
39 }; 39 };
40 40
41 std::unique_ptr<base::DictionaryValue> CreateSuccessResponse( 41 std::unique_ptr<base::DictionaryValue> CreateSuccessResponse(
42 int command_id, 42 int command_id,
43 std::unique_ptr<base::Value> result) { 43 std::unique_ptr<base::Value> result) {
44 if (!result) 44 if (!result)
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 response = CreateErrorResponse( 87 response = CreateErrorResponse(
88 command_id, kErrorServerError, 88 command_id, kErrorServerError,
89 printing::HeadlessPrintManager::PrintResultToString(print_result)); 89 printing::HeadlessPrintManager::PrintResultToString(print_result));
90 } 90 }
91 callback.Run(std::move(response)); 91 callback.Run(std::move(response));
92 } 92 }
93 #endif 93 #endif
94 94
95 } // namespace 95 } // namespace
96 96
97 #if BUILDFLAG(ENABLE_BASIC_PRINTING)
98 std::unique_ptr<base::DictionaryValue> ParsePrintSettings(
99 int command_id,
100 const base::DictionaryValue* params,
101 printing::HeadlessPrintSettings* settings) {
102 const double kMMToInch = 1 / 25.4;
103 // we can safely ignore the return values of the following Get methods since
104 // the defaults are already set in |settings|.
105 params->GetBoolean("landscape", &settings->landscape);
106 params->GetBoolean("displayHeaderFooter", &settings->display_header_footer);
107 params->GetBoolean("printBackgrounds", &settings->should_print_backgrounds);
108 params->GetDouble("scale", &settings->scale);
109 if (settings->scale > kScaleMaxVal / 100 ||
110 settings->scale < kScaleMinVal / 100)
111 return CreateInvalidParamResponse(command_id, "scale");
112 params->GetString("pageRanges", &settings->page_ranges);
113
114 std::string paper_type = "NA_LETTER";
115 params->GetString("paperType", &paper_type);
116 if (paper_type == "NA_LETTER") {
117 settings->paper_type = printing::HeadlessPrintSettings::NA_LETTER;
118 } else if (paper_type == "NA_LEGAL") {
119 settings->paper_type = printing::HeadlessPrintSettings::NA_LEGAL;
120 } else if (paper_type == "ISO_A4") {
121 settings->paper_type = printing::HeadlessPrintSettings::ISO_A4;
122 } else if (paper_type == "ISO_A3") {
123 settings->paper_type = printing::HeadlessPrintSettings::ISO_A3;
124 } else if (paper_type == "CUSTOM") {
125 settings->paper_type = printing::HeadlessPrintSettings::CUSTOM;
126 if (!params->GetDouble("paperWidth", &settings->paper_width_in_inch))
127 return CreateInvalidParamResponse(command_id, "paperWidth");
128 if (!params->GetDouble("paperHeight", &settings->paper_height_in_inch))
129 return CreateInvalidParamResponse(command_id, "paperHeight");
130 } else {
131 return CreateInvalidParamResponse(command_id, "paperType");
132 }
133
134 bool custom_margin = false;
135 if (params->GetDouble("marginTop", &settings->margin_top_in_inch))
136 custom_margin = true;
137 if (params->GetDouble("marginBottom", &settings->margin_bottom_in_inch))
138 custom_margin = true;
139 if (params->GetDouble("marginLeft", &settings->margin_left_in_inch))
140 custom_margin = true;
141 if (params->GetDouble("marginRight", &settings->margin_right_in_inch))
142 custom_margin = true;
143 if (custom_margin) {
144 settings->margin_type = printing::CUSTOM_MARGINS;
145 } else {
146 settings->margin_type = printing::DEFAULT_MARGINS;
147 }
148
149 std::string unit = "INCH";
150 if (params->GetString("unit", &unit) && unit != "MM" && unit != "INCH")
151 return CreateInvalidParamResponse(command_id, "unit");
152 if (unit == "MM") {
153 settings->paper_width_in_inch *= kMMToInch;
154 settings->paper_height_in_inch *= kMMToInch;
155 settings->margin_top_in_inch *= kMMToInch;
156 settings->margin_bottom_in_inch *= kMMToInch;
157 settings->margin_left_in_inch *= kMMToInch;
158 settings->margin_right_in_inch *= kMMToInch;
159 }
160
161 return nullptr;
162 }
163 #endif
164
97 HeadlessDevToolsManagerDelegate::HeadlessDevToolsManagerDelegate( 165 HeadlessDevToolsManagerDelegate::HeadlessDevToolsManagerDelegate(
98 base::WeakPtr<HeadlessBrowserImpl> browser) 166 base::WeakPtr<HeadlessBrowserImpl> browser)
99 : browser_(std::move(browser)) { 167 : browser_(std::move(browser)) {
100 command_map_["Target.createTarget"] = base::Bind( 168 command_map_["Target.createTarget"] = base::Bind(
101 &HeadlessDevToolsManagerDelegate::CreateTarget, base::Unretained(this)); 169 &HeadlessDevToolsManagerDelegate::CreateTarget, base::Unretained(this));
102 command_map_["Target.closeTarget"] = base::Bind( 170 command_map_["Target.closeTarget"] = base::Bind(
103 &HeadlessDevToolsManagerDelegate::CloseTarget, base::Unretained(this)); 171 &HeadlessDevToolsManagerDelegate::CloseTarget, base::Unretained(this));
104 command_map_["Target.createBrowserContext"] = 172 command_map_["Target.createBrowserContext"] =
105 base::Bind(&HeadlessDevToolsManagerDelegate::CreateBrowserContext, 173 base::Bind(&HeadlessDevToolsManagerDelegate::CreateBrowserContext,
106 base::Unretained(this)); 174 base::Unretained(this));
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 std::string HeadlessDevToolsManagerDelegate::GetFrontendResource( 250 std::string HeadlessDevToolsManagerDelegate::GetFrontendResource(
183 const std::string& path) { 251 const std::string& path) {
184 return content::DevToolsFrontendHost::GetFrontendResource(path).as_string(); 252 return content::DevToolsFrontendHost::GetFrontendResource(path).as_string();
185 } 253 }
186 254
187 void HeadlessDevToolsManagerDelegate::PrintToPDF( 255 void HeadlessDevToolsManagerDelegate::PrintToPDF(
188 content::DevToolsAgentHost* agent_host, 256 content::DevToolsAgentHost* agent_host,
189 int command_id, 257 int command_id,
190 const base::DictionaryValue* params, 258 const base::DictionaryValue* params,
191 const CommandCallback& callback) { 259 const CommandCallback& callback) {
260 DCHECK(callback);
261
192 #if BUILDFLAG(ENABLE_BASIC_PRINTING) 262 #if BUILDFLAG(ENABLE_BASIC_PRINTING)
263 #if !BUILDFLAG(ENABLE_PRINT_PREVIEW)
264 LOG(WARNING)
265 << "Print preview is not enabled. Some print settings may not work.";
266 #endif
193 content::WebContents* web_contents = agent_host->GetWebContents(); 267 content::WebContents* web_contents = agent_host->GetWebContents();
194 content::RenderFrameHost* rfh = web_contents->GetMainFrame(); 268 content::RenderFrameHost* rfh = web_contents->GetMainFrame();
195 269
270 printing::HeadlessPrintSettings settings;
271 std::unique_ptr<base::DictionaryValue> response =
272 ParsePrintSettings(command_id, params, &settings);
273 if (response) {
274 callback.Run(std::move(response));
275 return;
276 }
196 printing::HeadlessPrintManager::FromWebContents(web_contents) 277 printing::HeadlessPrintManager::FromWebContents(web_contents)
197 ->GetPDFContents(rfh, base::Bind(&PDFCreated, callback, command_id)); 278 ->GetPDFContents(rfh, settings,
279 base::Bind(&PDFCreated, callback, command_id));
198 #else 280 #else
199 DCHECK(callback);
200 callback.Run(CreateErrorResponse(command_id, kErrorServerError, 281 callback.Run(CreateErrorResponse(command_id, kErrorServerError,
201 "Printing is not enabled")); 282 "Printing is not enabled"));
202 #endif 283 #endif
203 } 284 }
204 285
205 std::unique_ptr<base::DictionaryValue> 286 std::unique_ptr<base::DictionaryValue>
206 HeadlessDevToolsManagerDelegate::CreateTarget( 287 HeadlessDevToolsManagerDelegate::CreateTarget(
207 int command_id, 288 int command_id,
208 const base::DictionaryValue* params) { 289 const base::DictionaryValue* params) {
209 std::string url; 290 std::string url;
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 382
302 std::unique_ptr<base::Value> result( 383 std::unique_ptr<base::Value> result(
303 target::DisposeBrowserContextResult::Builder() 384 target::DisposeBrowserContextResult::Builder()
304 .SetSuccess(success) 385 .SetSuccess(success)
305 .Build() 386 .Build()
306 ->Serialize()); 387 ->Serialize());
307 return CreateSuccessResponse(command_id, std::move(result)); 388 return CreateSuccessResponse(command_id, std::move(result));
308 } 389 }
309 390
310 } // namespace headless 391 } // namespace headless
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698