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

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: Fix tests 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),
36 next_raw_message_id_(1),
35 renderer_crashed_(false), 37 renderer_crashed_(false),
36 accessibility_domain_(this), 38 accessibility_domain_(this),
37 animation_domain_(this), 39 animation_domain_(this),
38 application_cache_domain_(this), 40 application_cache_domain_(this),
39 cache_storage_domain_(this), 41 cache_storage_domain_(this),
40 console_domain_(this), 42 console_domain_(this),
41 css_domain_(this), 43 css_domain_(this),
42 database_domain_(this), 44 database_domain_(this),
43 debugger_domain_(this), 45 debugger_domain_(this),
44 device_orientation_domain_(this), 46 device_orientation_domain_(this),
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 90
89 void HeadlessDevToolsClientImpl::DetachFromHost( 91 void HeadlessDevToolsClientImpl::DetachFromHost(
90 content::DevToolsAgentHost* agent_host) { 92 content::DevToolsAgentHost* agent_host) {
91 DCHECK_EQ(agent_host_, agent_host); 93 DCHECK_EQ(agent_host_, agent_host);
92 if (!renderer_crashed_) 94 if (!renderer_crashed_)
93 agent_host_->DetachClient(this); 95 agent_host_->DetachClient(this);
94 agent_host_ = nullptr; 96 agent_host_ = nullptr;
95 pending_messages_.clear(); 97 pending_messages_.clear();
96 } 98 }
97 99
100 void HeadlessDevToolsClientImpl::SetRawProtocolListener(
101 RawProtocolListener* raw_protocol_listener) {
102 raw_protocol_listener_ = raw_protocol_listener;
103 }
104
105 int HeadlessDevToolsClientImpl::GetNextRawDevToolsMessageId() {
106 int id = next_raw_message_id_;
107 next_raw_message_id_ += 2;
108 return id;
109 }
110
111 void HeadlessDevToolsClientImpl::SendRawDevToolsMessage(
112 const std::string& json_message) {
113 #ifndef NDEBUG
114 std::unique_ptr<base::Value> message =
115 base::JSONReader::Read(json_message, base::JSON_PARSE_RFC);
116 const base::DictionaryValue* message_dict;
117 int id = 0;
118 if (!message || !message->GetAsDictionary(&message_dict) ||
119 !message_dict->GetInteger("id", &id)) {
120 NOTREACHED() << "Badly formed message";
121 return;
122 }
123 DCHECK_EQ((id % 2), 1) << "Raw devtools messages must have an odd ID.";
124 #endif
125
126 agent_host_->DispatchProtocolMessage(this, json_message);
127 }
128
129 void HeadlessDevToolsClientImpl::SendRawDevToolsMessage(
130 const base::DictionaryValue& message) {
131 std::string json_message;
132 base::JSONWriter::Write(message, &json_message);
133 SendRawDevToolsMessage(json_message);
134 }
135
98 void HeadlessDevToolsClientImpl::DispatchProtocolMessage( 136 void HeadlessDevToolsClientImpl::DispatchProtocolMessage(
99 content::DevToolsAgentHost* agent_host, 137 content::DevToolsAgentHost* agent_host,
100 const std::string& json_message) { 138 const std::string& json_message) {
101 DCHECK_EQ(agent_host_, agent_host); 139 DCHECK_EQ(agent_host_, agent_host);
140
102 std::unique_ptr<base::Value> message = 141 std::unique_ptr<base::Value> message =
103 base::JSONReader::Read(json_message, base::JSON_PARSE_RFC); 142 base::JSONReader::Read(json_message, base::JSON_PARSE_RFC);
104 const base::DictionaryValue* message_dict; 143 const base::DictionaryValue* message_dict;
105 if (!message || !message->GetAsDictionary(&message_dict)) { 144 if (!message || !message->GetAsDictionary(&message_dict)) {
106 NOTREACHED() << "Badly formed reply"; 145 NOTREACHED() << "Badly formed reply";
107 return; 146 return;
108 } 147 }
148
149 if (raw_protocol_listener_ &&
150 raw_protocol_listener_->OnProtocolMessage(agent_host->GetId(),
151 json_message, *message_dict)) {
152 return;
153 }
154
109 if (!DispatchMessageReply(*message_dict) && 155 if (!DispatchMessageReply(*message_dict) &&
110 !DispatchEvent(std::move(message), *message_dict)) { 156 !DispatchEvent(std::move(message), *message_dict)) {
111 DLOG(ERROR) << "Unhandled protocol message: " << json_message; 157 DLOG(ERROR) << "Unhandled protocol message: " << json_message;
112 } 158 }
113 } 159 }
114 160
115 bool HeadlessDevToolsClientImpl::DispatchMessageReply( 161 bool HeadlessDevToolsClientImpl::DispatchMessageReply(
116 const base::DictionaryValue& message_dict) { 162 const base::DictionaryValue& message_dict) {
117 int id = 0; 163 int id = 0;
118 if (!message_dict.GetInteger("id", &id)) 164 if (!message_dict.GetInteger("id", &id))
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 return &tracing_domain_; 353 return &tracing_domain_;
308 } 354 }
309 355
310 template <typename CallbackType> 356 template <typename CallbackType>
311 void HeadlessDevToolsClientImpl::FinalizeAndSendMessage( 357 void HeadlessDevToolsClientImpl::FinalizeAndSendMessage(
312 base::DictionaryValue* message, 358 base::DictionaryValue* message,
313 CallbackType callback) { 359 CallbackType callback) {
314 if (renderer_crashed_) 360 if (renderer_crashed_)
315 return; 361 return;
316 DCHECK(agent_host_); 362 DCHECK(agent_host_);
317 int id = next_message_id_++; 363 int id = next_message_id_;
364 next_message_id_ += 2; // We only send even numbered messages.
318 message->SetInteger("id", id); 365 message->SetInteger("id", id);
319 std::string json_message; 366 std::string json_message;
320 base::JSONWriter::Write(*message, &json_message); 367 base::JSONWriter::Write(*message, &json_message);
321 pending_messages_[id] = Callback(callback); 368 pending_messages_[id] = Callback(callback);
322 agent_host_->DispatchProtocolMessage(this, json_message); 369 agent_host_->DispatchProtocolMessage(this, json_message);
323 } 370 }
324 371
325 template <typename CallbackType> 372 template <typename CallbackType>
326 void HeadlessDevToolsClientImpl::SendMessageWithParams( 373 void HeadlessDevToolsClientImpl::SendMessageWithParams(
327 const char* method, 374 const char* method,
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 HeadlessDevToolsClientImpl::Callback::Callback( 411 HeadlessDevToolsClientImpl::Callback::Callback(
365 base::Callback<void(const base::Value&)> callback) 412 base::Callback<void(const base::Value&)> callback)
366 : callback_with_result(callback) {} 413 : callback_with_result(callback) {}
367 414
368 HeadlessDevToolsClientImpl::Callback::~Callback() {} 415 HeadlessDevToolsClientImpl::Callback::~Callback() {}
369 416
370 HeadlessDevToolsClientImpl::Callback& HeadlessDevToolsClientImpl::Callback:: 417 HeadlessDevToolsClientImpl::Callback& HeadlessDevToolsClientImpl::Callback::
371 operator=(Callback&& other) = default; 418 operator=(Callback&& other) = default;
372 419
373 } // namespace headless 420 } // namespace headless
OLDNEW
« no previous file with comments | « headless/lib/browser/headless_devtools_client_impl.h ('k') | headless/lib/browser/headless_web_contents_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698