Chromium Code Reviews| 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 "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 Loading... | |
| 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", ¶ms); | 128 command->GetDictionary("params", ¶ms); |
| 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", ¶ms); | |
| 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 Loading... | |
| 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 |
| OLD | NEW |