aw_devtools_server.cc 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. // Copyright 2013 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. #include "android_webview/browser/aw_devtools_server.h"
  5. #include <utility>
  6. #include "android_webview/browser_jni_headers/AwDevToolsServer_jni.h"
  7. #include "base/bind.h"
  8. #include "base/command_line.h"
  9. #include "base/files/file_path.h"
  10. #include "base/memory/ptr_util.h"
  11. #include "base/strings/stringprintf.h"
  12. #include "base/strings/string_number_conversions.h"
  13. #include "base/values.h"
  14. #include "content/public/browser/android/devtools_auth.h"
  15. #include "content/public/browser/devtools_agent_host.h"
  16. #include "content/public/browser/devtools_socket_factory.h"
  17. #include "content/public/common/content_switches.h"
  18. #include "net/base/net_errors.h"
  19. #include "net/socket/tcp_server_socket.h"
  20. #include "net/socket/unix_domain_server_socket_posix.h"
  21. using base::android::JavaParamRef;
  22. using content::DevToolsAgentHost;
  23. namespace {
  24. const char kSocketNameFormat[] = "webview_devtools_remote_%d";
  25. const char kTetheringSocketName[] = "webview_devtools_tethering_%d_%d";
  26. const int kBackLog = 10;
  27. // Factory for UnixDomainServerSocket.
  28. class UnixDomainServerSocketFactory : public content::DevToolsSocketFactory {
  29. public:
  30. explicit UnixDomainServerSocketFactory(const std::string& socket_name)
  31. : socket_name_(socket_name), last_tethering_socket_(0) {}
  32. UnixDomainServerSocketFactory(const UnixDomainServerSocketFactory&) = delete;
  33. UnixDomainServerSocketFactory& operator=(
  34. const UnixDomainServerSocketFactory&) = delete;
  35. private:
  36. // content::DevToolsAgentHost::ServerSocketFactory.
  37. std::unique_ptr<net::ServerSocket> CreateForHttpServer() override {
  38. std::unique_ptr<net::UnixDomainServerSocket> socket(
  39. new net::UnixDomainServerSocket(
  40. base::BindRepeating(&content::CanUserConnectToDevTools),
  41. true /* use_abstract_namespace */));
  42. if (socket->BindAndListen(socket_name_, kBackLog) != net::OK)
  43. return nullptr;
  44. return std::move(socket);
  45. }
  46. std::unique_ptr<net::ServerSocket> CreateForTethering(
  47. std::string* name) override {
  48. *name = base::StringPrintf(kTetheringSocketName, getpid(),
  49. ++last_tethering_socket_);
  50. std::unique_ptr<net::UnixDomainServerSocket> socket(
  51. new net::UnixDomainServerSocket(
  52. base::BindRepeating(&content::CanUserConnectToDevTools),
  53. true /* use_abstract_namespace */));
  54. if (socket->BindAndListen(*name, kBackLog) != net::OK)
  55. return nullptr;
  56. return std::move(socket);
  57. }
  58. std::string socket_name_;
  59. int last_tethering_socket_;
  60. };
  61. class TCPServerSocketFactory : public content::DevToolsSocketFactory {
  62. public:
  63. TCPServerSocketFactory(const std::string& address, uint16_t port)
  64. : address_(address), port_(port) {}
  65. TCPServerSocketFactory(const TCPServerSocketFactory&) = delete;
  66. TCPServerSocketFactory& operator=(const TCPServerSocketFactory&) = delete;
  67. private:
  68. // content::DevToolsSocketFactory.
  69. std::unique_ptr<net::ServerSocket> CreateForHttpServer() override {
  70. std::unique_ptr<net::ServerSocket> socket(
  71. new net::TCPServerSocket(nullptr, net::NetLogSource()));
  72. if (socket->ListenWithAddressAndPort(address_, port_, kBackLog) != net::OK)
  73. return nullptr;
  74. net::IPEndPoint endpoint;
  75. return socket;
  76. }
  77. std::unique_ptr<net::ServerSocket> CreateForTethering(
  78. std::string* out_name) override {
  79. return nullptr;
  80. }
  81. std::string address_;
  82. uint16_t port_;
  83. };
  84. std::unique_ptr<content::DevToolsSocketFactory> CreateSocketFactory() {
  85. const base::CommandLine& command_line =
  86. *base::CommandLine::ForCurrentProcess();
  87. if (command_line.HasSwitch(switches::kRemoteDebuggingPort)) {
  88. uint16_t port = 0;
  89. int temp_port;
  90. std::string port_str =
  91. command_line.GetSwitchValueASCII(switches::kRemoteDebuggingPort);
  92. if (base::StringToInt(port_str, &temp_port) && temp_port >= 1024 &&
  93. temp_port < 65535) {
  94. port = static_cast<uint16_t>(temp_port);
  95. } else {
  96. DLOG(WARNING) << "Invalid http debugger port number " << temp_port;
  97. }
  98. return std::make_unique<TCPServerSocketFactory>("127.0.0.1", port);
  99. }
  100. return std::make_unique<UnixDomainServerSocketFactory>(
  101. base::StringPrintf(kSocketNameFormat, getpid()));
  102. }
  103. } // namespace
  104. namespace android_webview {
  105. AwDevToolsServer::AwDevToolsServer() : is_started_(false) {}
  106. AwDevToolsServer::~AwDevToolsServer() {
  107. Stop();
  108. }
  109. void AwDevToolsServer::Start() {
  110. if (is_started_)
  111. return;
  112. is_started_ = true;
  113. DevToolsAgentHost::StartRemoteDebuggingServer(
  114. CreateSocketFactory(), base::FilePath(), base::FilePath());
  115. }
  116. void AwDevToolsServer::Stop() {
  117. DevToolsAgentHost::StopRemoteDebuggingServer();
  118. is_started_ = false;
  119. }
  120. bool AwDevToolsServer::IsStarted() const {
  121. return is_started_;
  122. }
  123. static jlong JNI_AwDevToolsServer_InitRemoteDebugging(
  124. JNIEnv* env,
  125. const JavaParamRef<jobject>& obj) {
  126. AwDevToolsServer* server = new AwDevToolsServer();
  127. return reinterpret_cast<intptr_t>(server);
  128. }
  129. static void JNI_AwDevToolsServer_DestroyRemoteDebugging(
  130. JNIEnv* env,
  131. const JavaParamRef<jobject>& obj,
  132. jlong server) {
  133. delete reinterpret_cast<AwDevToolsServer*>(server);
  134. }
  135. static void JNI_AwDevToolsServer_SetRemoteDebuggingEnabled(
  136. JNIEnv* env,
  137. const JavaParamRef<jobject>& obj,
  138. jlong server,
  139. jboolean enabled) {
  140. AwDevToolsServer* devtools_server =
  141. reinterpret_cast<AwDevToolsServer*>(server);
  142. if (enabled) {
  143. devtools_server->Start();
  144. } else {
  145. devtools_server->Stop();
  146. }
  147. }
  148. } // namespace android_webview