mhashmi | 1ec338a | 2016-10-25 22:13:34 | [diff] [blame] | 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 |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "components/ui_devtools/devtools_client.h" |
| 6 | |
mhashmi | 1ec338a | 2016-10-25 22:13:34 | [diff] [blame] | 7 | #include "components/ui_devtools/devtools_server.h" |
Johannes Henkel | cf98c79 | 2019-11-23 02:45:33 | [diff] [blame^] | 8 | #include "third_party/inspector_protocol/crdtp/json.h" |
mhashmi | 1ec338a | 2016-10-25 22:13:34 | [diff] [blame] | 9 | |
thanhph | 3f396851 | 2017-06-21 00:37:23 | [diff] [blame] | 10 | namespace ui_devtools { |
mhashmi | 1ec338a | 2016-10-25 22:13:34 | [diff] [blame] | 11 | |
| 12 | UiDevToolsClient::UiDevToolsClient(const std::string& name, |
| 13 | UiDevToolsServer* server) |
| 14 | : name_(name), |
| 15 | connection_id_(kNotConnected), |
| 16 | dispatcher_(this), |
| 17 | server_(server) { |
| 18 | DCHECK(server_); |
| 19 | } |
| 20 | |
| 21 | UiDevToolsClient::~UiDevToolsClient() {} |
| 22 | |
mhashmi | e2445fe73 | 2016-10-29 20:46:32 | [diff] [blame] | 23 | void UiDevToolsClient::AddAgent(std::unique_ptr<UiDevToolsAgent> agent) { |
| 24 | agent->Init(&dispatcher_); |
| 25 | agents_.push_back(std::move(agent)); |
| 26 | } |
| 27 | |
mhashmi | ca5eebc | 2016-11-03 15:17:45 | [diff] [blame] | 28 | void UiDevToolsClient::Disconnect() { |
| 29 | connection_id_ = kNotConnected; |
| 30 | DisableAllAgents(); |
| 31 | } |
| 32 | |
mhashmi | 1ec338a | 2016-10-25 22:13:34 | [diff] [blame] | 33 | void UiDevToolsClient::Dispatch(const std::string& data) { |
Andrey Lushnikov | cde71c1 | 2018-07-25 00:50:49 | [diff] [blame] | 34 | int call_id; |
| 35 | std::string method; |
| 36 | std::unique_ptr<protocol::Value> protocolCommand = |
Pavel Feldman | bfcc79d | 2019-02-13 16:45:04 | [diff] [blame] | 37 | protocol::StringUtil::parseMessage(data, false); |
Andrey Lushnikov | cde71c1 | 2018-07-25 00:50:49 | [diff] [blame] | 38 | if (dispatcher_.parseCommand(protocolCommand.get(), &call_id, &method)) { |
| 39 | dispatcher_.dispatch(call_id, method, std::move(protocolCommand), data); |
| 40 | } |
mhashmi | 1ec338a | 2016-10-25 22:13:34 | [diff] [blame] | 41 | } |
| 42 | |
| 43 | bool UiDevToolsClient::connected() const { |
| 44 | return connection_id_ != kNotConnected; |
| 45 | } |
| 46 | |
| 47 | void UiDevToolsClient::set_connection_id(int connection_id) { |
| 48 | connection_id_ = connection_id; |
| 49 | } |
| 50 | |
| 51 | const std::string& UiDevToolsClient::name() const { |
| 52 | return name_; |
| 53 | } |
| 54 | |
mhashmi | ca5eebc | 2016-11-03 15:17:45 | [diff] [blame] | 55 | void UiDevToolsClient::DisableAllAgents() { |
| 56 | for (std::unique_ptr<UiDevToolsAgent>& agent : agents_) |
| 57 | agent->Disable(); |
| 58 | } |
| 59 | |
Johannes Henkel | 99cc4c9 | 2019-06-05 01:02:06 | [diff] [blame] | 60 | namespace { |
| 61 | std::string SerializeToJSON(std::unique_ptr<protocol::Serializable> message) { |
Johannes Henkel | 24ac8a8 | 2019-10-29 19:45:39 | [diff] [blame] | 62 | std::vector<uint8_t> cbor = std::move(*message).TakeSerialized(); |
Johannes Henkel | 99cc4c9 | 2019-06-05 01:02:06 | [diff] [blame] | 63 | std::string json; |
Johannes Henkel | cf98c79 | 2019-11-23 02:45:33 | [diff] [blame^] | 64 | crdtp::Status status = |
| 65 | crdtp::json::ConvertCBORToJSON(crdtp::SpanFrom(cbor), &json); |
Johannes Henkel | 99cc4c9 | 2019-06-05 01:02:06 | [diff] [blame] | 66 | LOG_IF(ERROR, !status.ok()) << status.ToASCIIString(); |
| 67 | return json; |
| 68 | } |
| 69 | } // namespace |
| 70 | |
kozyatinskiy | 2dfeded | 2016-11-23 17:39:54 | [diff] [blame] | 71 | void UiDevToolsClient::sendProtocolResponse( |
| 72 | int callId, |
| 73 | std::unique_ptr<protocol::Serializable> message) { |
Johannes Henkel | 99cc4c9 | 2019-06-05 01:02:06 | [diff] [blame] | 74 | if (connected()) { |
| 75 | server_->SendOverWebSocket( |
| 76 | connection_id_, base::StringPiece(SerializeToJSON(std::move(message)))); |
| 77 | } |
mhashmi | 1ec338a | 2016-10-25 22:13:34 | [diff] [blame] | 78 | } |
| 79 | |
kozyatinskiy | 2dfeded | 2016-11-23 17:39:54 | [diff] [blame] | 80 | void UiDevToolsClient::sendProtocolNotification( |
| 81 | std::unique_ptr<protocol::Serializable> message) { |
Johannes Henkel | 99cc4c9 | 2019-06-05 01:02:06 | [diff] [blame] | 82 | if (connected()) { |
| 83 | server_->SendOverWebSocket( |
| 84 | connection_id_, base::StringPiece(SerializeToJSON(std::move(message)))); |
| 85 | } |
mhashmi | 1ec338a | 2016-10-25 22:13:34 | [diff] [blame] | 86 | } |
| 87 | |
| 88 | void UiDevToolsClient::flushProtocolNotifications() { |
| 89 | NOTIMPLEMENTED(); |
| 90 | } |
| 91 | |
Andrey Lushnikov | cde71c1 | 2018-07-25 00:50:49 | [diff] [blame] | 92 | void UiDevToolsClient::fallThrough(int call_id, |
| 93 | const std::string& method, |
| 94 | const std::string& message) { |
| 95 | NOTIMPLEMENTED(); |
| 96 | } |
| 97 | |
thanhph | 3f396851 | 2017-06-21 00:37:23 | [diff] [blame] | 98 | } // namespace ui_devtools |