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

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

Issue 2812253002: Headless: Support sending and receiving of raw protocol messages (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_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/bind.h" 9 #include "base/bind.h"
10 #include "base/json/json_reader.h" 10 #include "base/json/json_reader.h"
(...skipping 13 matching lines...) Expand all
24 // static 24 // static
25 HeadlessDevToolsClientImpl* HeadlessDevToolsClientImpl::From( 25 HeadlessDevToolsClientImpl* HeadlessDevToolsClientImpl::From(
26 HeadlessDevToolsClient* client) { 26 HeadlessDevToolsClient* client) {
27 // This downcast is safe because there is only one implementation of 27 // This downcast is safe because there is only one implementation of
28 // HeadlessDevToolsClient. 28 // HeadlessDevToolsClient.
29 return static_cast<HeadlessDevToolsClientImpl*>(client); 29 return static_cast<HeadlessDevToolsClientImpl*>(client);
30 } 30 }
31 31
32 HeadlessDevToolsClientImpl::HeadlessDevToolsClientImpl() 32 HeadlessDevToolsClientImpl::HeadlessDevToolsClientImpl()
33 : agent_host_(nullptr), 33 : agent_host_(nullptr),
34 raw_protocol_listener_(nullptr),
34 next_message_id_(0), 35 next_message_id_(0),
35 renderer_crashed_(false), 36 renderer_crashed_(false),
36 accessibility_domain_(this), 37 accessibility_domain_(this),
37 animation_domain_(this), 38 animation_domain_(this),
38 application_cache_domain_(this), 39 application_cache_domain_(this),
39 cache_storage_domain_(this), 40 cache_storage_domain_(this),
40 console_domain_(this), 41 console_domain_(this),
41 css_domain_(this), 42 css_domain_(this),
42 database_domain_(this), 43 database_domain_(this),
43 debugger_domain_(this), 44 debugger_domain_(this),
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 89
89 void HeadlessDevToolsClientImpl::DetachFromHost( 90 void HeadlessDevToolsClientImpl::DetachFromHost(
90 content::DevToolsAgentHost* agent_host) { 91 content::DevToolsAgentHost* agent_host) {
91 DCHECK_EQ(agent_host_, agent_host); 92 DCHECK_EQ(agent_host_, agent_host);
92 if (!renderer_crashed_) 93 if (!renderer_crashed_)
93 agent_host_->DetachClient(this); 94 agent_host_->DetachClient(this);
94 agent_host_ = nullptr; 95 agent_host_ = nullptr;
95 pending_messages_.clear(); 96 pending_messages_.clear();
96 } 97 }
97 98
99 void HeadlessDevToolsClientImpl::SetRawProtocolListener(
100 RawProtocolListener* raw_protocol_listener) {
101 raw_protocol_listener_ = raw_protocol_listener;
102 }
103
104 void HeadlessDevToolsClientImpl::SendRawDevtoolsMessage(
105 const std::string& json_message) {
106 #ifndef NDEBUG
107 std::unique_ptr<base::Value> message =
108 base::JSONReader::Read(json_message, base::JSON_PARSE_RFC);
109 const base::DictionaryValue* message_dict;
110 int id = 0;
111 if (!message || !message->GetAsDictionary(&message_dict) ||
112 !message_dict->GetInteger("id", &id)) {
113 NOTREACHED() << "Badly formed message";
114 return;
115 }
116 DCHECK_EQ((id % 2), 1) << "Raw devtools messages must have an odd ID.";
Sami 2017/04/12 14:54:24 Could we instead add a generator getter for next_m
alex clarke (OOO till 29th) 2017/04/13 10:46:28 Added a function as discussed offline.
117 #endif
118
119 agent_host_->DispatchProtocolMessage(this, json_message);
120 }
121
98 void HeadlessDevToolsClientImpl::DispatchProtocolMessage( 122 void HeadlessDevToolsClientImpl::DispatchProtocolMessage(
99 content::DevToolsAgentHost* agent_host, 123 content::DevToolsAgentHost* agent_host,
100 const std::string& json_message) { 124 const std::string& json_message) {
101 DCHECK_EQ(agent_host_, agent_host); 125 DCHECK_EQ(agent_host_, agent_host);
102 std::unique_ptr<base::Value> message = 126 std::unique_ptr<base::Value> message =
103 base::JSONReader::Read(json_message, base::JSON_PARSE_RFC); 127 base::JSONReader::Read(json_message, base::JSON_PARSE_RFC);
104 const base::DictionaryValue* message_dict; 128 const base::DictionaryValue* message_dict;
105 if (!message || !message->GetAsDictionary(&message_dict)) { 129 if (!message || !message->GetAsDictionary(&message_dict)) {
106 NOTREACHED() << "Badly formed reply"; 130 NOTREACHED() << "Badly formed reply";
107 return; 131 return;
108 } 132 }
109 if (!DispatchMessageReply(*message_dict) && 133 if (!DispatchMessageReply(*message_dict)) {
110 !DispatchEvent(std::move(message), *message_dict)) { 134 DispatchEvent(std::move(message), *message_dict);
111 DLOG(ERROR) << "Unhandled protocol message: " << json_message; 135 // Silently ignore unhandled messages.
112 } 136 }
137 if (raw_protocol_listener_)
138 raw_protocol_listener_->OnProtocolMessage(json_message, message_dict);
113 } 139 }
114 140
115 bool HeadlessDevToolsClientImpl::DispatchMessageReply( 141 bool HeadlessDevToolsClientImpl::DispatchMessageReply(
116 const base::DictionaryValue& message_dict) { 142 const base::DictionaryValue& message_dict) {
117 int id = 0; 143 int id = 0;
118 if (!message_dict.GetInteger("id", &id)) 144 if (!message_dict.GetInteger("id", &id))
119 return false; 145 return false;
120 auto it = pending_messages_.find(id); 146 auto it = pending_messages_.find(id);
121 if (it == pending_messages_.end()) { 147 if (it == pending_messages_.end()) {
122 NOTREACHED() << "Unexpected reply"; 148 NOTREACHED() << "Unexpected reply";
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 return &tracing_domain_; 333 return &tracing_domain_;
308 } 334 }
309 335
310 template <typename CallbackType> 336 template <typename CallbackType>
311 void HeadlessDevToolsClientImpl::FinalizeAndSendMessage( 337 void HeadlessDevToolsClientImpl::FinalizeAndSendMessage(
312 base::DictionaryValue* message, 338 base::DictionaryValue* message,
313 CallbackType callback) { 339 CallbackType callback) {
314 if (renderer_crashed_) 340 if (renderer_crashed_)
315 return; 341 return;
316 DCHECK(agent_host_); 342 DCHECK(agent_host_);
317 int id = next_message_id_++; 343 int id = next_message_id_;
344 next_message_id_ += 2; // We only send even numbered messages.
318 message->SetInteger("id", id); 345 message->SetInteger("id", id);
319 std::string json_message; 346 std::string json_message;
320 base::JSONWriter::Write(*message, &json_message); 347 base::JSONWriter::Write(*message, &json_message);
321 pending_messages_[id] = Callback(callback); 348 pending_messages_[id] = Callback(callback);
322 agent_host_->DispatchProtocolMessage(this, json_message); 349 agent_host_->DispatchProtocolMessage(this, json_message);
323 } 350 }
324 351
325 template <typename CallbackType> 352 template <typename CallbackType>
326 void HeadlessDevToolsClientImpl::SendMessageWithParams( 353 void HeadlessDevToolsClientImpl::SendMessageWithParams(
327 const char* method, 354 const char* method,
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 HeadlessDevToolsClientImpl::Callback::Callback( 391 HeadlessDevToolsClientImpl::Callback::Callback(
365 base::Callback<void(const base::Value&)> callback) 392 base::Callback<void(const base::Value&)> callback)
366 : callback_with_result(callback) {} 393 : callback_with_result(callback) {}
367 394
368 HeadlessDevToolsClientImpl::Callback::~Callback() {} 395 HeadlessDevToolsClientImpl::Callback::~Callback() {}
369 396
370 HeadlessDevToolsClientImpl::Callback& HeadlessDevToolsClientImpl::Callback:: 397 HeadlessDevToolsClientImpl::Callback& HeadlessDevToolsClientImpl::Callback::
371 operator=(Callback&& other) = default; 398 operator=(Callback&& other) = default;
372 399
373 } // namespace headless 400 } // namespace headless
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698