Chromium Code Reviews| Index: headless/app/headless_shell.cc |
| diff --git a/headless/app/headless_shell.cc b/headless/app/headless_shell.cc |
| index d6d6adeb758a5ef06ce2821d3973911297b22c74..e3e891d27b774b84ddbaf4ab29392c77992a15ea 100644 |
| --- a/headless/app/headless_shell.cc |
| +++ b/headless/app/headless_shell.cc |
| @@ -19,6 +19,7 @@ |
| #include "base/strings/string_number_conversions.h" |
| #include "headless/app/headless_shell.h" |
| #include "headless/app/headless_shell_switches.h" |
| +#include "headless/lib/browser/headless_devtools.h" |
| #include "headless/public/headless_devtools_target.h" |
| #include "headless/public/util/deterministic_http_protocol_handler.h" |
| #include "net/base/io_buffer.h" |
| @@ -392,15 +393,23 @@ void HeadlessShell::OnScreenshotFileClosed(base::File::Error error_code) { |
| bool HeadlessShell::RemoteDebuggingEnabled() const { |
| const base::CommandLine& command_line = |
| *base::CommandLine::ForCurrentProcess(); |
| - return command_line.HasSwitch(switches::kRemoteDebuggingPort); |
| + return (command_line.HasSwitch(switches::kRemoteDebuggingPort) || |
| + command_line.HasSwitch(switches::kRemoteDebuggingSocketFd)); |
| } |
| bool ValidateCommandLine(const base::CommandLine& command_line) { |
| - if (!command_line.HasSwitch(switches::kRemoteDebuggingPort)) { |
| + if (command_line.HasSwitch(switches::kRemoteDebuggingPort) && |
|
dvallet
2017/04/13 03:44:29
You could add a non POSIX check here to ensure tha
|
| + command_line.HasSwitch(switches::kRemoteDebuggingSocketFd)) { |
| + LOG(ERROR) << "remote-debugging-port and remote-debugging-socket " |
| + << "can't both be set."; |
| + return false; |
| + } |
| + if (!command_line.HasSwitch(switches::kRemoteDebuggingPort) && |
| + !command_line.HasSwitch(switches::kRemoteDebuggingSocketFd)) { |
| if (command_line.GetArgs().size() <= 1) |
| return true; |
| - LOG(ERROR) << "Open multiple tabs is only supported when the " |
| - << "remote debug port is set."; |
| + LOG(ERROR) << "Open multiple tabs is only supported when " |
| + << "remote debugging is enabled."; |
| return false; |
| } |
| if (command_line.HasSwitch(switches::kDumpDom)) { |
| @@ -436,7 +445,6 @@ int HeadlessShellMain(int argc, const char** argv) { |
| HeadlessShell shell; |
| HeadlessBrowser::Options::Builder builder(argc, argv); |
| - // Enable devtools if requested. |
| const base::CommandLine& command_line( |
| *base::CommandLine::ForCurrentProcess()); |
| if (!ValidateCommandLine(command_line)) |
| @@ -449,6 +457,8 @@ int HeadlessShellMain(int argc, const char** argv) { |
| command_line.GetSwitchValuePath(switches::kCrashDumpsDir)); |
| } |
| + // Enable devtools if requested, either by specifying a port (and optional |
| + // address), or by specifying the fd of an already-open socket. |
| if (command_line.HasSwitch(::switches::kRemoteDebuggingPort)) { |
| std::string address = kDevToolsHttpServerAddress; |
| if (command_line.HasSwitch(switches::kRemoteDebuggingAddress)) { |
| @@ -471,8 +481,19 @@ int HeadlessShellMain(int argc, const char** argv) { |
| net::IPAddress devtools_address; |
| bool result = devtools_address.AssignFromIPLiteral(address); |
| DCHECK(result); |
| - builder.EnableDevToolsServer(net::IPEndPoint( |
| - devtools_address, base::checked_cast<uint16_t>(parsed_port))); |
| + const net::IPEndPoint endpoint(devtools_address, |
| + base::checked_cast<uint16_t>(parsed_port)); |
| + builder.EnableDevToolsServer(endpoint); |
| + } else if (command_line.HasSwitch(switches::kRemoteDebuggingSocketFd)) { |
| + int parsed_fd; |
| + std::string fd_str = |
| + command_line.GetSwitchValueASCII(switches::kRemoteDebuggingSocketFd); |
| + if (!base::StringToInt(fd_str, &parsed_fd) || |
| + !base::IsValueInRangeForNumericType<size_t>(parsed_fd)) { |
| + LOG(ERROR) << "Invalid devtools server socket fd"; |
| + return EXIT_FAILURE; |
| + } |
| + builder.EnableDevToolsServer(base::checked_cast<uint16_t>(parsed_fd)); |
| } |
| if (command_line.HasSwitch(switches::kProxyServer)) { |