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_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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |