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