Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/test/chromedriver/chrome/adb_impl.h" | 5 #include "chrome/test/chromedriver/chrome/adb_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/json/string_escape.h" | 9 #include "base/json/string_escape.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 219 } else { | 219 } else { |
| 220 break; | 220 break; |
| 221 } | 221 } |
| 222 } | 222 } |
| 223 } | 223 } |
| 224 | 224 |
| 225 return Status(kUnknownError, | 225 return Status(kUnknownError, |
| 226 "Failed to get PID for the following process: " + process_name); | 226 "Failed to get PID for the following process: " + process_name); |
| 227 } | 227 } |
| 228 | 228 |
| 229 Status AdbImpl::GetDevtoolsRemoteSocket(const std::string& device_serial, | |
|
johnchen
2017/07/12 21:54:43
This doesn't work correctly for WebView apps. The
| |
| 230 const std::string& process_name, | |
| 231 std::string* device_socket) { | |
| 232 // Parse 'cat /proc/net/unix' output which on Android looks like this: | |
| 233 // | |
| 234 // Num RefCount Protocol Flags Type St Inode Path | |
| 235 // 00000000: 00000002 00000000 00010000 0001 01 331813 /dev/socket/zygote | |
| 236 // 00000000: 00000002 00000000 00010000 0001 01 358606 @xxx_devtools_remote | |
| 237 // 00000000: 00000002 00000000 00010000 0001 01 347300 @yyy_devtools_remote | |
| 238 // | |
| 239 // We need to find records with paths starting from '@' (abstract socket) | |
| 240 // and containing the channel pattern ("_devtools_remote"). | |
| 241 // | |
| 242 // The code that generates this file is in the unix_seq_show() function in | |
| 243 // net/unix/af_unix.c in the kernel source. Looking at include/net/af_unix.h | |
| 244 // is also helpful, to see the data structures in use. | |
| 245 // | |
| 246 // The socket path is always the last column in the output, and | |
| 247 // the Android Kernel source matches the stock kernel in this respect. | |
| 248 std::string response; | |
| 249 Status status = ExecuteHostShellCommand(device_serial, | |
| 250 "cat /proc/net/unix", &response); | |
| 251 std::string kDevToolsSocketSuffix = "_devtools_remote"; | |
| 252 if (!status.IsOk()) | |
| 253 return status; | |
| 254 for (const base::StringPiece& line : | |
| 255 base::SplitStringPiece(response, "\n", base::KEEP_WHITESPACE, | |
| 256 base::SPLIT_WANT_NONEMPTY)) { | |
| 257 std::vector<std::string> fields = | |
| 258 base::SplitString(line, " \r", base::KEEP_WHITESPACE, | |
| 259 base::SPLIT_WANT_NONEMPTY); | |
| 260 if (fields.size() < 8) | |
| 261 continue; | |
| 262 // We are looking for sockets accepting connections and there is no TCP | |
| 263 // connection established. Below values are defined in | |
| 264 // the kernel for reference | |
| 265 // fields[3] (Flags) != __SO_ACCEPTCON (include/uapi/net.h) | |
| 266 // fields[5] (State) != TCP_ESTABLISHED (include/net/tcp_states.h) | |
| 267 if (fields[3] != "00010000" || fields[5] != "01") | |
| 268 continue; | |
| 269 std::string path_field = fields[7]; | |
| 270 if (path_field.size() < 1 || path_field[0] != '@') | |
| 271 continue; | |
| 272 size_t socket_name_pos = path_field.find(kDevToolsSocketSuffix); | |
| 273 if (socket_name_pos == std::string::npos) | |
| 274 continue; | |
| 275 | |
| 276 std::string socket_name = path_field.substr(1, socket_name_pos - 1); | |
| 277 if (socket_name.compare(process_name) == 0) { | |
| 278 *device_socket = path_field.substr(1); | |
| 279 } | |
| 280 } | |
| 281 | |
| 282 // We could not find a device socket for the expected process name | |
| 283 if (device_socket->empty()) { | |
| 284 return Status(kUnknownError, | |
| 285 "Failed to find remote devtools socket for: " + process_name); | |
| 286 } | |
| 287 return Status(kOk); | |
| 288 } | |
| 289 | |
| 229 Status AdbImpl::ExecuteCommand( | 290 Status AdbImpl::ExecuteCommand( |
| 230 const std::string& command, std::string* response) { | 291 const std::string& command, std::string* response) { |
| 231 scoped_refptr<ResponseBuffer> response_buffer = new ResponseBuffer; | 292 scoped_refptr<ResponseBuffer> response_buffer = new ResponseBuffer; |
| 232 VLOG(1) << "Sending adb command: " << command; | 293 VLOG(1) << "Sending adb command: " << command; |
| 233 io_task_runner_->PostTask( | 294 io_task_runner_->PostTask( |
| 234 FROM_HERE, | 295 FROM_HERE, |
| 235 base::Bind(&ExecuteCommandOnIOThread, command, response_buffer, port_)); | 296 base::Bind(&ExecuteCommandOnIOThread, command, response_buffer, port_)); |
| 236 Status status = response_buffer->GetResponse( | 297 Status status = response_buffer->GetResponse( |
| 237 response, base::TimeDelta::FromSeconds(30)); | 298 response, base::TimeDelta::FromSeconds(30)); |
| 238 if (status.IsOk()) { | 299 if (status.IsOk()) { |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 250 | 311 |
| 251 Status AdbImpl::ExecuteHostShellCommand( | 312 Status AdbImpl::ExecuteHostShellCommand( |
| 252 const std::string& device_serial, | 313 const std::string& device_serial, |
| 253 const std::string& shell_command, | 314 const std::string& shell_command, |
| 254 std::string* response) { | 315 std::string* response) { |
| 255 return ExecuteCommand( | 316 return ExecuteCommand( |
| 256 "host:transport:" + device_serial + "|shell:" + shell_command, | 317 "host:transport:" + device_serial + "|shell:" + shell_command, |
| 257 response); | 318 response); |
| 258 } | 319 } |
| 259 | 320 |
| OLD | NEW |