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 | #ifndef COMPONENTS_UI_DEVTOOLS_DEVTOOLS_SERVER_H_ |
| 6 | #define COMPONENTS_UI_DEVTOOLS_DEVTOOLS_SERVER_H_ |
| 7 | |
| 8 | #include <vector> |
| 9 | |
mhashmi | 6d1b1cb2 | 2016-11-22 16:04:24 | [diff] [blame] | 10 | #include "base/compiler_specific.h" |
Lily Houghton | 7f7b2fb | 2018-05-01 21:40:46 | [diff] [blame] | 11 | #include "base/memory/weak_ptr.h" |
Gabriel Charette | 5ff87ce | 2017-05-16 18:03:45 | [diff] [blame] | 12 | #include "base/single_thread_task_runner.h" |
Johannes Henkel | 99cc4c9 | 2019-06-05 01:02:06 | [diff] [blame] | 13 | #include "base/strings/string_piece_forward.h" |
mhashmi | 1ec338a | 2016-10-25 22:13:34 | [diff] [blame] | 14 | #include "base/threading/thread.h" |
| 15 | #include "components/ui_devtools/DOM.h" |
| 16 | #include "components/ui_devtools/Forward.h" |
| 17 | #include "components/ui_devtools/Protocol.h" |
| 18 | #include "components/ui_devtools/devtools_client.h" |
thanhph | 3f396851 | 2017-06-21 00:37:23 | [diff] [blame] | 19 | #include "components/ui_devtools/devtools_export.h" |
Lily Houghton | 7f7b2fb | 2018-05-01 21:40:46 | [diff] [blame] | 20 | #include "services/network/public/cpp/server/http_server.h" |
mhashmi | 1ec338a | 2016-10-25 22:13:34 | [diff] [blame] | 21 | |
thanhph | 3f396851 | 2017-06-21 00:37:23 | [diff] [blame] | 22 | namespace ui_devtools { |
mhashmi | 1ec338a | 2016-10-25 22:13:34 | [diff] [blame] | 23 | |
Mitsuru Oshima | 4de59ac | 2019-09-03 20:49:09 | [diff] [blame^] | 24 | class TracingAgent; |
| 25 | |
Lily Houghton | 7f7b2fb | 2018-05-01 21:40:46 | [diff] [blame] | 26 | class UI_DEVTOOLS_EXPORT UiDevToolsServer |
| 27 | : public network::server::HttpServer::Delegate { |
mhashmi | 1ec338a | 2016-10-25 22:13:34 | [diff] [blame] | 28 | public: |
Sean Gilhuly | 13fc02ff3 | 2018-11-01 14:05:30 | [diff] [blame] | 29 | // Network tags to be used for the UI and the Viz devtools servers. |
| 30 | static const net::NetworkTrafficAnnotationTag kUIDevtoolsServerTag; |
| 31 | static const net::NetworkTrafficAnnotationTag kVizDevtoolsServerTag; |
| 32 | |
mhashmi | 1ec338a | 2016-10-25 22:13:34 | [diff] [blame] | 33 | ~UiDevToolsServer() override; |
| 34 | |
mhashmi | 6d1b1cb2 | 2016-11-22 16:04:24 | [diff] [blame] | 35 | // Returns an empty unique_ptr if ui devtools flag isn't enabled or if a |
Sean Gilhuly | 13fc02ff3 | 2018-11-01 14:05:30 | [diff] [blame] | 36 | // server instance has already been created. |
| 37 | static std::unique_ptr<UiDevToolsServer> CreateForViews( |
Lily Houghton | 7f7b2fb | 2018-05-01 21:40:46 | [diff] [blame] | 38 | network::mojom::NetworkContext* network_context, |
Mike Wasserman | 8f8b085 | 2018-12-03 22:08:10 | [diff] [blame] | 39 | int port); |
mhashmi | 1ec338a | 2016-10-25 22:13:34 | [diff] [blame] | 40 | |
Sean Gilhuly | 13fc02ff3 | 2018-11-01 14:05:30 | [diff] [blame] | 41 | // Assumes that the devtools flag is enabled, and was checked when the socket |
| 42 | // was created. |
| 43 | static std::unique_ptr<UiDevToolsServer> CreateForViz( |
| 44 | network::mojom::TCPServerSocketPtr server_socket, |
| 45 | int port); |
| 46 | |
| 47 | // Creates a TCPServerSocket to be used by a UiDevToolsServer. |
| 48 | static void CreateTCPServerSocket( |
| 49 | network::mojom::TCPServerSocketRequest server_socket_request, |
| 50 | network::mojom::NetworkContext* network_context, |
| 51 | int port, |
| 52 | net::NetworkTrafficAnnotationTag tag, |
| 53 | network::mojom::NetworkContext::CreateTCPServerSocketCallback callback); |
| 54 | |
mhashmi | 6d1b1cb2 | 2016-11-22 16:04:24 | [diff] [blame] | 55 | // Returns a list of attached UiDevToolsClient name + URL |
| 56 | using NameUrlPair = std::pair<std::string, std::string>; |
leon.han | 030d74f | 2016-12-13 02:52:16 | [diff] [blame] | 57 | static std::vector<NameUrlPair> GetClientNamesAndUrls(); |
mhashmi | 6d1b1cb2 | 2016-11-22 16:04:24 | [diff] [blame] | 58 | |
Mike Wasserman | 8f8b085 | 2018-12-03 22:08:10 | [diff] [blame] | 59 | // Returns true if UI Devtools is enabled by the given commandline switch. |
| 60 | static bool IsUiDevToolsEnabled(const char* enable_devtools_flag); |
| 61 | |
Ahmed Fakhry | f6c1bcd | 2018-11-13 19:08:25 | [diff] [blame] | 62 | // Returns the port number specified by a command line flag. If a number is |
| 63 | // not specified as a command line argument, returns the |default_port|. |
| 64 | static int GetUiDevToolsPort(const char* enable_devtools_flag, |
| 65 | int default_port); |
Sean Gilhuly | 13fc02ff3 | 2018-11-01 14:05:30 | [diff] [blame] | 66 | |
mhashmi | 1ec338a | 2016-10-25 22:13:34 | [diff] [blame] | 67 | void AttachClient(std::unique_ptr<UiDevToolsClient> client); |
Johannes Henkel | 99cc4c9 | 2019-06-05 01:02:06 | [diff] [blame] | 68 | void SendOverWebSocket(int connection_id, base::StringPiece message); |
mhashmi | 1ec338a | 2016-10-25 22:13:34 | [diff] [blame] | 69 | |
Illia Martyniuk | bd1e4485 | 2018-03-13 22:02:59 | [diff] [blame] | 70 | int port() const { return port_; } |
| 71 | |
Mitsuru Oshima | 4de59ac | 2019-09-03 20:49:09 | [diff] [blame^] | 72 | TracingAgent* tracing_agent() { return tracing_agent_; } |
| 73 | void set_tracing_agent(TracingAgent* agent) { tracing_agent_ = agent; } |
| 74 | |
mhashmi | 1ec338a | 2016-10-25 22:13:34 | [diff] [blame] | 75 | private: |
Sean Gilhuly | 13fc02ff3 | 2018-11-01 14:05:30 | [diff] [blame] | 76 | UiDevToolsServer(int port, const net::NetworkTrafficAnnotationTag tag); |
mhashmi | 6011c1bd | 2016-10-31 15:24:29 | [diff] [blame] | 77 | |
Lily Houghton | 7f7b2fb | 2018-05-01 21:40:46 | [diff] [blame] | 78 | void MakeServer(network::mojom::TCPServerSocketPtr server_socket, |
| 79 | int result, |
| 80 | const base::Optional<net::IPEndPoint>& local_addr); |
mhashmi | 1ec338a | 2016-10-25 22:13:34 | [diff] [blame] | 81 | |
| 82 | // HttpServer::Delegate |
| 83 | void OnConnect(int connection_id) override; |
Lily Houghton | 7f7b2fb | 2018-05-01 21:40:46 | [diff] [blame] | 84 | void OnHttpRequest( |
| 85 | int connection_id, |
| 86 | const network::server::HttpServerRequestInfo& info) override; |
| 87 | void OnWebSocketRequest( |
| 88 | int connection_id, |
| 89 | const network::server::HttpServerRequestInfo& info) override; |
Johannes Henkel | e1cbda8 | 2019-03-18 21:17:03 | [diff] [blame] | 90 | void OnWebSocketMessage(int connection_id, std::string data) override; |
mhashmi | 1ec338a | 2016-10-25 22:13:34 | [diff] [blame] | 91 | void OnClose(int connection_id) override; |
| 92 | |
| 93 | using ClientsList = std::vector<std::unique_ptr<UiDevToolsClient>>; |
| 94 | using ConnectionsMap = std::map<uint32_t, UiDevToolsClient*>; |
| 95 | ClientsList clients_; |
| 96 | ConnectionsMap connections_; |
| 97 | |
Lily Houghton | 7f7b2fb | 2018-05-01 21:40:46 | [diff] [blame] | 98 | std::unique_ptr<network::server::HttpServer> server_; |
mhashmi | 1ec338a | 2016-10-25 22:13:34 | [diff] [blame] | 99 | |
Illia Martyniuk | bd1e4485 | 2018-03-13 22:02:59 | [diff] [blame] | 100 | // The port the devtools server listens on |
| 101 | const int port_; |
| 102 | |
Sean Gilhuly | 13fc02ff3 | 2018-11-01 14:05:30 | [diff] [blame] | 103 | const net::NetworkTrafficAnnotationTag tag_; |
| 104 | |
Mitsuru Oshima | 4de59ac | 2019-09-03 20:49:09 | [diff] [blame^] | 105 | TracingAgent* tracing_agent_ = nullptr; |
| 106 | |
Mike Wasserman | 8f8b085 | 2018-12-03 22:08:10 | [diff] [blame] | 107 | // The server (owned by Chrome for now) |
mhashmi | 6d1b1cb2 | 2016-11-22 16:04:24 | [diff] [blame] | 108 | static UiDevToolsServer* devtools_server_; |
| 109 | |
Lily Houghton | 7f7b2fb | 2018-05-01 21:40:46 | [diff] [blame] | 110 | SEQUENCE_CHECKER(devtools_server_sequence_); |
Jeremy Roman | 5c341f6d | 2019-07-15 15:56:10 | [diff] [blame] | 111 | base::WeakPtrFactory<UiDevToolsServer> weak_ptr_factory_{this}; |
Lily Houghton | 7f7b2fb | 2018-05-01 21:40:46 | [diff] [blame] | 112 | |
mhashmi | 1ec338a | 2016-10-25 22:13:34 | [diff] [blame] | 113 | DISALLOW_COPY_AND_ASSIGN(UiDevToolsServer); |
| 114 | }; |
| 115 | |
thanhph | 3f396851 | 2017-06-21 00:37:23 | [diff] [blame] | 116 | } // namespace ui_devtools |
mhashmi | 1ec338a | 2016-10-25 22:13:34 | [diff] [blame] | 117 | |
| 118 | #endif // COMPONENTS_UI_DEVTOOLS_DEVTOOLS_SERVER_H_ |