blob: e44c587e9ca70a88d74df7b1be56d12d920c25bc [file] [log] [blame]
mhashmi1ec338a2016-10-25 22:13:341// 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
mhashmi6d1b1cb22016-11-22 16:04:2410#include "base/compiler_specific.h"
Lily Houghton7f7b2fb2018-05-01 21:40:4611#include "base/memory/weak_ptr.h"
Gabriel Charette5ff87ce2017-05-16 18:03:4512#include "base/single_thread_task_runner.h"
Johannes Henkel99cc4c92019-06-05 01:02:0613#include "base/strings/string_piece_forward.h"
mhashmi1ec338a2016-10-25 22:13:3414#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"
thanhph3f3968512017-06-21 00:37:2319#include "components/ui_devtools/devtools_export.h"
Lily Houghton7f7b2fb2018-05-01 21:40:4620#include "services/network/public/cpp/server/http_server.h"
mhashmi1ec338a2016-10-25 22:13:3421
thanhph3f3968512017-06-21 00:37:2322namespace ui_devtools {
mhashmi1ec338a2016-10-25 22:13:3423
Mitsuru Oshima4de59ac2019-09-03 20:49:0924class TracingAgent;
25
Lily Houghton7f7b2fb2018-05-01 21:40:4626class UI_DEVTOOLS_EXPORT UiDevToolsServer
27 : public network::server::HttpServer::Delegate {
mhashmi1ec338a2016-10-25 22:13:3428 public:
Sean Gilhuly13fc02ff32018-11-01 14:05:3029 // 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
mhashmi1ec338a2016-10-25 22:13:3433 ~UiDevToolsServer() override;
34
mhashmi6d1b1cb22016-11-22 16:04:2435 // Returns an empty unique_ptr if ui devtools flag isn't enabled or if a
Sean Gilhuly13fc02ff32018-11-01 14:05:3036 // server instance has already been created.
37 static std::unique_ptr<UiDevToolsServer> CreateForViews(
Lily Houghton7f7b2fb2018-05-01 21:40:4638 network::mojom::NetworkContext* network_context,
Mike Wasserman8f8b0852018-12-03 22:08:1039 int port);
mhashmi1ec338a2016-10-25 22:13:3440
Sean Gilhuly13fc02ff32018-11-01 14:05:3041 // 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
mhashmi6d1b1cb22016-11-22 16:04:2455 // Returns a list of attached UiDevToolsClient name + URL
56 using NameUrlPair = std::pair<std::string, std::string>;
leon.han030d74f2016-12-13 02:52:1657 static std::vector<NameUrlPair> GetClientNamesAndUrls();
mhashmi6d1b1cb22016-11-22 16:04:2458
Mike Wasserman8f8b0852018-12-03 22:08:1059 // Returns true if UI Devtools is enabled by the given commandline switch.
60 static bool IsUiDevToolsEnabled(const char* enable_devtools_flag);
61
Ahmed Fakhryf6c1bcd2018-11-13 19:08:2562 // 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 Gilhuly13fc02ff32018-11-01 14:05:3066
mhashmi1ec338a2016-10-25 22:13:3467 void AttachClient(std::unique_ptr<UiDevToolsClient> client);
Johannes Henkel99cc4c92019-06-05 01:02:0668 void SendOverWebSocket(int connection_id, base::StringPiece message);
mhashmi1ec338a2016-10-25 22:13:3469
Illia Martyniukbd1e44852018-03-13 22:02:5970 int port() const { return port_; }
71
Mitsuru Oshima4de59ac2019-09-03 20:49:0972 TracingAgent* tracing_agent() { return tracing_agent_; }
73 void set_tracing_agent(TracingAgent* agent) { tracing_agent_ = agent; }
74
mhashmi1ec338a2016-10-25 22:13:3475 private:
Sean Gilhuly13fc02ff32018-11-01 14:05:3076 UiDevToolsServer(int port, const net::NetworkTrafficAnnotationTag tag);
mhashmi6011c1bd2016-10-31 15:24:2977
Lily Houghton7f7b2fb2018-05-01 21:40:4678 void MakeServer(network::mojom::TCPServerSocketPtr server_socket,
79 int result,
80 const base::Optional<net::IPEndPoint>& local_addr);
mhashmi1ec338a2016-10-25 22:13:3481
82 // HttpServer::Delegate
83 void OnConnect(int connection_id) override;
Lily Houghton7f7b2fb2018-05-01 21:40:4684 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 Henkele1cbda82019-03-18 21:17:0390 void OnWebSocketMessage(int connection_id, std::string data) override;
mhashmi1ec338a2016-10-25 22:13:3491 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 Houghton7f7b2fb2018-05-01 21:40:4698 std::unique_ptr<network::server::HttpServer> server_;
mhashmi1ec338a2016-10-25 22:13:3499
Illia Martyniukbd1e44852018-03-13 22:02:59100 // The port the devtools server listens on
101 const int port_;
102
Sean Gilhuly13fc02ff32018-11-01 14:05:30103 const net::NetworkTrafficAnnotationTag tag_;
104
Mitsuru Oshima4de59ac2019-09-03 20:49:09105 TracingAgent* tracing_agent_ = nullptr;
106
Mike Wasserman8f8b0852018-12-03 22:08:10107 // The server (owned by Chrome for now)
mhashmi6d1b1cb22016-11-22 16:04:24108 static UiDevToolsServer* devtools_server_;
109
Lily Houghton7f7b2fb2018-05-01 21:40:46110 SEQUENCE_CHECKER(devtools_server_sequence_);
Jeremy Roman5c341f6d2019-07-15 15:56:10111 base::WeakPtrFactory<UiDevToolsServer> weak_ptr_factory_{this};
Lily Houghton7f7b2fb2018-05-01 21:40:46112
mhashmi1ec338a2016-10-25 22:13:34113 DISALLOW_COPY_AND_ASSIGN(UiDevToolsServer);
114};
115
thanhph3f3968512017-06-21 00:37:23116} // namespace ui_devtools
mhashmi1ec338a2016-10-25 22:13:34117
118#endif // COMPONENTS_UI_DEVTOOLS_DEVTOOLS_SERVER_H_