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

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

Issue 1907533002: headless: Implement DevTools events (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 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_client_impl.h" 5 #include "headless/lib/browser/headless_devtools_client_impl.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "base/json/json_reader.h" 9 #include "base/json/json_reader.h"
10 #include "base/json/json_writer.h" 10 #include "base/json/json_writer.h"
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 agent_host_ = nullptr; 76 agent_host_ = nullptr;
77 pending_messages_.clear(); 77 pending_messages_.clear();
78 } 78 }
79 79
80 void HeadlessDevToolsClientImpl::DispatchProtocolMessage( 80 void HeadlessDevToolsClientImpl::DispatchProtocolMessage(
81 content::DevToolsAgentHost* agent_host, 81 content::DevToolsAgentHost* agent_host,
82 const std::string& json_message) { 82 const std::string& json_message) {
83 DCHECK_EQ(agent_host_, agent_host); 83 DCHECK_EQ(agent_host_, agent_host);
84 std::unique_ptr<base::Value> message = 84 std::unique_ptr<base::Value> message =
85 base::JSONReader::Read(json_message, base::JSON_PARSE_RFC); 85 base::JSONReader::Read(json_message, base::JSON_PARSE_RFC);
86 base::DictionaryValue* message_dict; 86 const base::DictionaryValue* message_dict;
87 if (!message || !message->GetAsDictionary(&message_dict)) { 87 if (!message || !message->GetAsDictionary(&message_dict)) {
88 NOTREACHED() << "Badly formed reply"; 88 NOTREACHED() << "Badly formed reply";
89 return; 89 return;
90 } 90 }
91 if (!DispatchMessageReply(*message_dict) && !DispatchEvent(*message_dict))
92 DLOG(ERROR) << "Unhandled protocol message: " << json_message;
93 }
94
95 bool HeadlessDevToolsClientImpl::DispatchMessageReply(
96 const base::DictionaryValue& message_dict) {
91 int id = 0; 97 int id = 0;
92 DCHECK(message_dict->GetInteger("id", &id)); 98 if (!message_dict.GetInteger("id", &id))
99 return false;
93 auto it = pending_messages_.find(id); 100 auto it = pending_messages_.find(id);
94 if (it == pending_messages_.end()) { 101 if (it == pending_messages_.end()) {
95 NOTREACHED() << "Unexpected reply"; 102 NOTREACHED() << "Unexpected reply";
96 return; 103 return false;
97 } 104 }
98 if (!it->second.callback_with_result.is_null()) { 105 if (!it->second.callback_with_result.is_null()) {
99 base::DictionaryValue* result_dict; 106 const base::DictionaryValue* result_dict;
100 if (!message_dict->GetDictionary("result", &result_dict)) { 107 if (!message_dict.GetDictionary("result", &result_dict)) {
101 NOTREACHED() << "Badly formed reply result"; 108 NOTREACHED() << "Badly formed reply result";
102 return; 109 return false;
103 } 110 }
104 it->second.callback_with_result.Run(*result_dict); 111 it->second.callback_with_result.Run(*result_dict);
105 } else if (!it->second.callback.is_null()) { 112 } else if (!it->second.callback.is_null()) {
106 it->second.callback.Run(); 113 it->second.callback.Run();
107 } 114 }
108 pending_messages_.erase(it); 115 pending_messages_.erase(it);
116 return true;
117 }
118
119 bool HeadlessDevToolsClientImpl::DispatchEvent(
120 const base::DictionaryValue& message_dict) {
121 std::string method;
122 if (!message_dict.GetString("method", &method))
123 return false;
124 auto it = event_handlers_.find(method);
125 if (it == event_handlers_.end()) {
126 NOTREACHED() << "Unknown event: " << method;
127 return false;
128 }
129 if (!it->second.callback_with_result.is_null()) {
130 const base::DictionaryValue* result_dict;
131 if (!message_dict.GetDictionary("params", &result_dict)) {
132 NOTREACHED() << "Badly formed event parameters";
133 return false;
134 }
135 it->second.callback_with_result.Run(*result_dict);
136 } else if (!it->second.callback.is_null()) {
137 it->second.callback.Run();
138 }
139 return true;
109 } 140 }
110 141
111 void HeadlessDevToolsClientImpl::AgentHostClosed( 142 void HeadlessDevToolsClientImpl::AgentHostClosed(
112 content::DevToolsAgentHost* agent_host, 143 content::DevToolsAgentHost* agent_host,
113 bool replaced_with_another_client) { 144 bool replaced_with_another_client) {
114 DCHECK_EQ(agent_host_, agent_host); 145 DCHECK_EQ(agent_host_, agent_host);
115 agent_host = nullptr; 146 agent_host = nullptr;
116 pending_messages_.clear(); 147 pending_messages_.clear();
117 } 148 }
118 149
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 265
235 template <typename CallbackType> 266 template <typename CallbackType>
236 void HeadlessDevToolsClientImpl::FinalizeAndSendMessage( 267 void HeadlessDevToolsClientImpl::FinalizeAndSendMessage(
237 base::DictionaryValue* message, 268 base::DictionaryValue* message,
238 CallbackType callback) { 269 CallbackType callback) {
239 DCHECK(agent_host_); 270 DCHECK(agent_host_);
240 int id = next_message_id_++; 271 int id = next_message_id_++;
241 message->SetInteger("id", id); 272 message->SetInteger("id", id);
242 std::string json_message; 273 std::string json_message;
243 base::JSONWriter::Write(*message, &json_message); 274 base::JSONWriter::Write(*message, &json_message);
244 pending_messages_[id] = PendingMessage(callback); 275 pending_messages_[id] = Callback(callback);
245 agent_host_->DispatchProtocolMessage(json_message); 276 agent_host_->DispatchProtocolMessage(json_message);
246 } 277 }
247 278
248 template <typename CallbackType> 279 template <typename CallbackType>
249 void HeadlessDevToolsClientImpl::SendMessageWithParams( 280 void HeadlessDevToolsClientImpl::SendMessageWithParams(
250 const char* method, 281 const char* method,
251 std::unique_ptr<base::Value> params, 282 std::unique_ptr<base::Value> params,
252 CallbackType callback) { 283 CallbackType callback) {
253 base::DictionaryValue message; 284 base::DictionaryValue message;
254 message.SetString("method", method); 285 message.SetString("method", method);
(...skipping 28 matching lines...) Expand all
283 const char* method, 314 const char* method,
284 base::Callback<void(const base::Value&)> callback) { 315 base::Callback<void(const base::Value&)> callback) {
285 SendMessageWithoutParams(method, std::move(callback)); 316 SendMessageWithoutParams(method, std::move(callback));
286 } 317 }
287 318
288 void HeadlessDevToolsClientImpl::SendMessage(const char* method, 319 void HeadlessDevToolsClientImpl::SendMessage(const char* method,
289 base::Callback<void()> callback) { 320 base::Callback<void()> callback) {
290 SendMessageWithoutParams(method, std::move(callback)); 321 SendMessageWithoutParams(method, std::move(callback));
291 } 322 }
292 323
293 HeadlessDevToolsClientImpl::PendingMessage::PendingMessage() {} 324 void HeadlessDevToolsClientImpl::RegisterEventHandler(
325 const char* method,
326 base::Callback<void()> callback) {
327 DCHECK(event_handlers_.find(method) == event_handlers_.end());
328 event_handlers_[method] = Callback(callback);
329 }
294 330
295 HeadlessDevToolsClientImpl::PendingMessage::PendingMessage( 331 void HeadlessDevToolsClientImpl::RegisterEventHandler(
296 PendingMessage&& other) = default; 332 const char* method,
333 base::Callback<void(const base::Value&)> callback) {
334 DCHECK(event_handlers_.find(method) == event_handlers_.end());
335 event_handlers_[method] = Callback(callback);
336 }
297 337
298 HeadlessDevToolsClientImpl::PendingMessage::PendingMessage( 338 HeadlessDevToolsClientImpl::Callback::Callback() {}
299 base::Callback<void()> callback) 339
340 HeadlessDevToolsClientImpl::Callback::Callback(Callback&& other) = default;
341
342 HeadlessDevToolsClientImpl::Callback::Callback(base::Callback<void()> callback)
300 : callback(callback) {} 343 : callback(callback) {}
301 344
302 HeadlessDevToolsClientImpl::PendingMessage::PendingMessage( 345 HeadlessDevToolsClientImpl::Callback::Callback(
303 base::Callback<void(const base::Value&)> callback) 346 base::Callback<void(const base::Value&)> callback)
304 : callback_with_result(callback) {} 347 : callback_with_result(callback) {}
305 348
306 HeadlessDevToolsClientImpl::PendingMessage::~PendingMessage() {} 349 HeadlessDevToolsClientImpl::Callback::~Callback() {}
307 350
308 HeadlessDevToolsClientImpl::PendingMessage& 351 HeadlessDevToolsClientImpl::Callback& HeadlessDevToolsClientImpl::Callback::
309 HeadlessDevToolsClientImpl::PendingMessage::operator=(PendingMessage&& other) = 352 operator=(Callback&& other) = default;
310 default;
311 353
312 } // namespace headless 354 } // namespace headless
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698