OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |