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

Side by Side Diff: headless/lib/browser/headless_devtools_manager_delegate.cc

Issue 2780433002: add print to pdf for headless (Closed)
Patch Set: 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 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 "base/base64.h"
10 #include "content/public/browser/browser_thread.h" 11 #include "content/public/browser/browser_thread.h"
11 #include "content/public/browser/devtools_agent_host.h" 12 #include "content/public/browser/devtools_agent_host.h"
12 #include "content/public/browser/devtools_frontend_host.h" 13 #include "content/public/browser/devtools_frontend_host.h"
13 #include "content/public/browser/web_contents.h" 14 #include "content/public/browser/web_contents.h"
14 #include "headless/grit/headless_lib_resources.h" 15 #include "headless/grit/headless_lib_resources.h"
15 #include "headless/lib/browser/headless_browser_context_impl.h" 16 #include "headless/lib/browser/headless_browser_context_impl.h"
16 #include "headless/lib/browser/headless_browser_impl.h" 17 #include "headless/lib/browser/headless_browser_impl.h"
18 #include "headless/lib/browser/headless_print_manager.h"
17 #include "headless/lib/browser/headless_web_contents_impl.h" 19 #include "headless/lib/browser/headless_web_contents_impl.h"
18 #include "headless/public/devtools/domains/target.h" 20 #include "headless/public/devtools/domains/target.h"
19 #include "ui/base/resource/resource_bundle.h" 21 #include "ui/base/resource/resource_bundle.h"
20 22
21 namespace headless { 23 namespace headless {
22 24
23 namespace { 25 namespace {
24 const char kIdParam[] = "id"; 26 const char kIdParam[] = "id";
25 const char kResultParam[] = "result"; 27 const char kResultParam[] = "result";
26 const char kErrorParam[] = "error"; 28 const char kErrorParam[] = "error";
(...skipping 21 matching lines...) Expand all
48 std::unique_ptr<base::DictionaryValue> CreateErrorResponse( 50 std::unique_ptr<base::DictionaryValue> CreateErrorResponse(
49 int command_id, 51 int command_id,
50 int error_code, 52 int error_code,
51 const std::string& error_message) { 53 const std::string& error_message) {
52 std::unique_ptr<base::DictionaryValue> error_object( 54 std::unique_ptr<base::DictionaryValue> error_object(
53 new base::DictionaryValue()); 55 new base::DictionaryValue());
54 error_object->SetInteger(kErrorCodeParam, error_code); 56 error_object->SetInteger(kErrorCodeParam, error_code);
55 error_object->SetString(kErrorMessageParam, error_message); 57 error_object->SetString(kErrorMessageParam, error_message);
56 58
57 std::unique_ptr<base::DictionaryValue> response(new base::DictionaryValue()); 59 std::unique_ptr<base::DictionaryValue> response(new base::DictionaryValue());
60 response->SetInteger(kIdParam, command_id);
58 response->Set(kErrorParam, std::move(error_object)); 61 response->Set(kErrorParam, std::move(error_object));
59 return response; 62 return response;
60 } 63 }
61 64
62 std::unique_ptr<base::DictionaryValue> CreateInvalidParamResponse( 65 std::unique_ptr<base::DictionaryValue> CreateInvalidParamResponse(
63 int command_id, 66 int command_id,
64 const std::string& param) { 67 const std::string& param) {
65 return CreateErrorResponse( 68 return CreateErrorResponse(
66 command_id, kErrorInvalidParam, 69 command_id, kErrorInvalidParam,
67 base::StringPrintf("Missing or invalid '%s' parameter", param.c_str())); 70 base::StringPrintf("Missing or invalid '%s' parameter", param.c_str()));
68 } 71 }
72
73 void PDFCreated(content::DevToolsManagerDelegate::CommandCallback callback,
74 int command_id,
75 printing::HeadlessPrintManager::PrintResult print_result,
76 const std::string& data) {
77 std::unique_ptr<base::DictionaryValue> response;
78 if (print_result == printing::HeadlessPrintManager::kPrintSuccess)
Lei Zhang 2017/03/29 01:38:03 nit: You need braces when the body is multi-line.
jzfeng 2017/03/29 03:50:12 Done.
79 response = CreateSuccessResponse(
80 command_id,
81 printing::HeadlessPrintManager::PDFContentsToDictionaryValue(data));
82 else
83 response = CreateErrorResponse(
84 command_id, kErrorServerError,
85 printing::HeadlessPrintManager::PrintResultToErrMsg(print_result));
86 callback.Run(std::move(response));
87 }
88
69 } // namespace 89 } // namespace
70 90
71 HeadlessDevToolsManagerDelegate::HeadlessDevToolsManagerDelegate( 91 HeadlessDevToolsManagerDelegate::HeadlessDevToolsManagerDelegate(
72 base::WeakPtr<HeadlessBrowserImpl> browser) 92 base::WeakPtr<HeadlessBrowserImpl> browser)
73 : browser_(std::move(browser)) { 93 : browser_(std::move(browser)) {
74 command_map_["Target.createTarget"] = 94 command_map_["Target.createTarget"] =
75 &HeadlessDevToolsManagerDelegate::CreateTarget; 95 &HeadlessDevToolsManagerDelegate::CreateTarget;
76 command_map_["Target.closeTarget"] = 96 command_map_["Target.closeTarget"] =
77 &HeadlessDevToolsManagerDelegate::CloseTarget; 97 &HeadlessDevToolsManagerDelegate::CloseTarget;
78 command_map_["Target.createBrowserContext"] = 98 command_map_["Target.createBrowserContext"] =
79 &HeadlessDevToolsManagerDelegate::CreateBrowserContext; 99 &HeadlessDevToolsManagerDelegate::CreateBrowserContext;
80 command_map_["Target.disposeBrowserContext"] = 100 command_map_["Target.disposeBrowserContext"] =
81 &HeadlessDevToolsManagerDelegate::DisposeBrowserContext; 101 &HeadlessDevToolsManagerDelegate::DisposeBrowserContext;
102
103 async_command_map_["Page.printToPDF"] =
104 &HeadlessDevToolsManagerDelegate::PrintToPDF;
82 } 105 }
83 106
84 HeadlessDevToolsManagerDelegate::~HeadlessDevToolsManagerDelegate() {} 107 HeadlessDevToolsManagerDelegate::~HeadlessDevToolsManagerDelegate() {}
85 108
86 base::DictionaryValue* HeadlessDevToolsManagerDelegate::HandleCommand( 109 base::DictionaryValue* HeadlessDevToolsManagerDelegate::HandleCommand(
87 content::DevToolsAgentHost* agent_host, 110 content::DevToolsAgentHost* agent_host,
88 base::DictionaryValue* command) { 111 base::DictionaryValue* command) {
89 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 112 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
90 113
91 if (!browser_) 114 if (!browser_)
92 return nullptr; 115 return nullptr;
93 116
94 int id; 117 int id;
95 std::string method; 118 std::string method;
96 if (!command->GetInteger("id", &id) || 119 if (!command->GetInteger("id", &id) ||
97 !command->GetString("method", &method)) { 120 !command->GetString("method", &method)) {
98 return nullptr; 121 return nullptr;
99 } 122 }
100 auto find_it = command_map_.find(method); 123 auto find_it = command_map_.find(method);
101 if (find_it == command_map_.end()) 124 if (find_it == command_map_.end())
102 return nullptr; 125 return nullptr;
103 CommandMemberFnPtr command_fn_ptr = find_it->second; 126 CommandMemberFnPtr command_fn_ptr = find_it->second;
104 const base::DictionaryValue* params = nullptr; 127 const base::DictionaryValue* params = nullptr;
105 command->GetDictionary("params", &params); 128 command->GetDictionary("params", &params);
106 std::unique_ptr<base::DictionaryValue> cmd_result( 129 std::unique_ptr<base::DictionaryValue> cmd_result(
107 ((this)->*command_fn_ptr)(id, params)); 130 ((this)->*command_fn_ptr)(id, params));
108 return cmd_result.release(); 131 return cmd_result.release();
109 } 132 }
110 133
134 bool HeadlessDevToolsManagerDelegate::HandleAsyncCommand(
135 content::DevToolsAgentHost* agent_host,
136 base::DictionaryValue* command,
137 CommandCallback callback) {
138 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
139
140 if (!browser_)
141 return false;
Lei Zhang 2017/03/29 01:38:03 nit: add a blank line like after line 115.
jzfeng 2017/03/29 03:50:13 Done.
142 int id;
143 std::string method;
144 if (!command->GetInteger("id", &id) ||
145 !command->GetString("method", &method)) {
146 return false;
147 }
148 auto find_it = async_command_map_.find(method);
149 if (find_it == async_command_map_.end())
150 return false;
151 AsyncCommandMemberFnPtr async_command_fn_ptr = find_it->second;
152 const base::DictionaryValue* params = nullptr;
153 command->GetDictionary("params", &params);
154 ((this)->*async_command_fn_ptr)(agent_host, id, params, callback);
Lei Zhang 2017/03/29 01:38:03 nit: Do you need a parens around "this" ? Same for
jzfeng 2017/03/29 03:50:13 Done.
155 return true;
156 }
157
111 scoped_refptr<content::DevToolsAgentHost> 158 scoped_refptr<content::DevToolsAgentHost>
112 HeadlessDevToolsManagerDelegate::CreateNewTarget(const GURL& url) { 159 HeadlessDevToolsManagerDelegate::CreateNewTarget(const GURL& url) {
113 HeadlessBrowserContext* context = browser_->GetDefaultBrowserContext(); 160 HeadlessBrowserContext* context = browser_->GetDefaultBrowserContext();
114 HeadlessWebContentsImpl* web_contents_impl = HeadlessWebContentsImpl::From( 161 HeadlessWebContentsImpl* web_contents_impl = HeadlessWebContentsImpl::From(
115 context->CreateWebContentsBuilder() 162 context->CreateWebContentsBuilder()
116 .SetInitialURL(url) 163 .SetInitialURL(url)
117 .SetWindowSize(browser_->options()->window_size) 164 .SetWindowSize(browser_->options()->window_size)
118 .Build()); 165 .Build());
119 return content::DevToolsAgentHost::GetOrCreateFor( 166 return content::DevToolsAgentHost::GetOrCreateFor(
120 web_contents_impl->web_contents()); 167 web_contents_impl->web_contents());
121 } 168 }
122 169
123 std::string HeadlessDevToolsManagerDelegate::GetDiscoveryPageHTML() { 170 std::string HeadlessDevToolsManagerDelegate::GetDiscoveryPageHTML() {
124 return ResourceBundle::GetSharedInstance() 171 return ResourceBundle::GetSharedInstance()
125 .GetRawDataResource(IDR_HEADLESS_LIB_DEVTOOLS_DISCOVERY_PAGE) 172 .GetRawDataResource(IDR_HEADLESS_LIB_DEVTOOLS_DISCOVERY_PAGE)
126 .as_string(); 173 .as_string();
127 } 174 }
128 175
129 std::string HeadlessDevToolsManagerDelegate::GetFrontendResource( 176 std::string HeadlessDevToolsManagerDelegate::GetFrontendResource(
130 const std::string& path) { 177 const std::string& path) {
131 return content::DevToolsFrontendHost::GetFrontendResource(path).as_string(); 178 return content::DevToolsFrontendHost::GetFrontendResource(path).as_string();
132 } 179 }
133 180
181 void HeadlessDevToolsManagerDelegate::PrintToPDF(
182 content::DevToolsAgentHost* agent_host,
183 int command_id,
184 const base::DictionaryValue* params,
185 CommandCallback callback) {
186 content::WebContents* web_contents = agent_host->GetWebContents();
187 content::RenderFrameHost* rfh = web_contents->GetMainFrame();
188
189 printing::HeadlessPrintManager::FromWebContents(web_contents)
190 ->GetPDFContents(rfh, base::Bind(&PDFCreated, callback, command_id));
191 }
192
134 std::unique_ptr<base::DictionaryValue> 193 std::unique_ptr<base::DictionaryValue>
135 HeadlessDevToolsManagerDelegate::CreateTarget( 194 HeadlessDevToolsManagerDelegate::CreateTarget(
136 int command_id, 195 int command_id,
137 const base::DictionaryValue* params) { 196 const base::DictionaryValue* params) {
138 std::string url; 197 std::string url;
139 std::string browser_context_id; 198 std::string browser_context_id;
140 int width = browser_->options()->window_size.width(); 199 int width = browser_->options()->window_size.width();
141 int height = browser_->options()->window_size.height(); 200 int height = browser_->options()->window_size.height();
142 if (!params || !params->GetString("url", &url)) 201 if (!params || !params->GetString("url", &url))
143 return CreateInvalidParamResponse(command_id, "url"); 202 return CreateInvalidParamResponse(command_id, "url");
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 289
231 std::unique_ptr<base::Value> result( 290 std::unique_ptr<base::Value> result(
232 target::DisposeBrowserContextResult::Builder() 291 target::DisposeBrowserContextResult::Builder()
233 .SetSuccess(success) 292 .SetSuccess(success)
234 .Build() 293 .Build()
235 ->Serialize()); 294 ->Serialize());
236 return CreateSuccessResponse(command_id, std::move(result)); 295 return CreateSuccessResponse(command_id, std::move(result));
237 } 296 }
238 297
239 } // namespace headless 298 } // namespace headless
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698