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 |