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_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 |