diff options
author | vkuzkokov <vkuzkokov@chromium.org> | 2015-01-19 04:46:33 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-01-19 12:47:20 +0000 |
commit | babd5a0011a43ad14537e5fa2b4ae0d5941c3e0a (patch) | |
tree | 9e319de2fd558a3f1db158f4f1933d3420cf2ca4 /chrome | |
parent | 7f1af057a80d7a134d9c14e538290c7650f5f9d5 (diff) | |
download | chromium_src-babd5a0011a43ad14537e5fa2b4ae0d5941c3e0a.zip chromium_src-babd5a0011a43ad14537e5fa2b4ae0d5941c3e0a.tar.gz chromium_src-babd5a0011a43ad14537e5fa2b4ae0d5941c3e0a.tar.bz2 |
[DevTools] Implement AdbDeviceInfoQuery through single remote shell instance
BUG=
Review URL: https://codereview.chromium.org/852223002
Cr-Commit-Position: refs/heads/master@{#312101}
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/devtools/BUILD.gn | 3 | ||||
-rw-r--r-- | chrome/browser/devtools/device/adb/adb_device_info_query.h | 54 | ||||
-rw-r--r-- | chrome/browser/devtools/device/adb/adb_device_provider.cc | 4 | ||||
-rw-r--r-- | chrome/browser/devtools/device/adb/mock_adb_server.cc | 46 | ||||
-rw-r--r-- | chrome/browser/devtools/device/android_device_info_query.cc (renamed from chrome/browser/devtools/device/adb/adb_device_info_query.cc) | 184 | ||||
-rw-r--r-- | chrome/browser/devtools/device/android_device_manager.h | 8 | ||||
-rw-r--r-- | chrome/browser/devtools/device/devtools_android_bridge.cc | 3 | ||||
-rw-r--r-- | chrome/browser/devtools/device/usb/usb_device_provider.cc | 4 | ||||
-rw-r--r-- | chrome/chrome_debugger.gypi | 3 |
9 files changed, 119 insertions, 190 deletions
diff --git a/chrome/browser/devtools/BUILD.gn b/chrome/browser/devtools/BUILD.gn index b512b44..e1edca7 100644 --- a/chrome/browser/devtools/BUILD.gn +++ b/chrome/browser/devtools/BUILD.gn @@ -85,10 +85,9 @@ static_library("devtools") { "chrome_devtools_manager_delegate.h", "device/adb/adb_client_socket.cc", "device/adb/adb_client_socket.h", - "device/adb/adb_device_info_query.cc", - "device/adb/adb_device_info_query.h", "device/adb/adb_device_provider.cc", "device/adb/adb_device_provider.h", + "device/android_device_info_query.cc", "device/android_device_manager.cc", "device/android_device_manager.h", "device/android_web_socket.cc", diff --git a/chrome/browser/devtools/device/adb/adb_device_info_query.h b/chrome/browser/devtools/device/adb/adb_device_info_query.h deleted file mode 100644 index 0c87af0..0000000 --- a/chrome/browser/devtools/device/adb/adb_device_info_query.h +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_DEVTOOLS_DEVICE_ADB_ADB_DEVICE_INFO_QUERY_H_ -#define CHROME_BROWSER_DEVTOOLS_DEVICE_ADB_ADB_DEVICE_INFO_QUERY_H_ - -#include "base/memory/ref_counted.h" -#include "chrome/browser/devtools/device/android_device_manager.h" - -class AdbDeviceInfoQuery : public base::RefCounted<AdbDeviceInfoQuery> { - public: - static AndroidDeviceManager::BrowserInfo::Type GetBrowserType( - const std::string& socket); - - static std::string GetDisplayName(const std::string& socket, - const std::string& package); - - typedef AndroidDeviceManager::CommandCallback CommandCallback; - typedef AndroidDeviceManager::DeviceInfoCallback DeviceInfoCallback; - - typedef base::Callback< - void(const std::string&, const CommandCallback&)> RunCommandCallback; - - static void Start(const RunCommandCallback& command_callback, - const DeviceInfoCallback& callback); - - private: - friend class base::RefCounted<AdbDeviceInfoQuery>; - - AdbDeviceInfoQuery(const RunCommandCallback& command_callback, - const DeviceInfoCallback& callback); - - virtual ~AdbDeviceInfoQuery(); - - void ReceivedModel(int result, const std::string& response); - void ReceivedWindowPolicy(int result, const std::string& response); - void ReceivedProcesses(int result, const std::string& response); - void ReceivedSockets(int result, const std::string& response); - void ReceivedUsers(int result, const std::string& response); - - void ParseBrowserInfo(); - - DeviceInfoCallback callback_; - std::string processes_response_; - std::string sockets_response_; - std::string users_response_; - AndroidDeviceManager::DeviceInfo device_info_; - base::ThreadChecker thread_checker_; - - DISALLOW_COPY_AND_ASSIGN(AdbDeviceInfoQuery); -}; - -#endif // CHROME_BROWSER_DEVTOOLS_DEVICE_ADB_ADB_DEVICE_INFO_QUERY_H_ diff --git a/chrome/browser/devtools/device/adb/adb_device_provider.cc b/chrome/browser/devtools/device/adb/adb_device_provider.cc index 93ba0d0..9f5b33a 100644 --- a/chrome/browser/devtools/device/adb/adb_device_provider.cc +++ b/chrome/browser/devtools/device/adb/adb_device_provider.cc @@ -7,7 +7,6 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "chrome/browser/devtools/device/adb/adb_client_socket.h" -#include "chrome/browser/devtools/device/adb/adb_device_info_query.h" namespace { @@ -53,7 +52,8 @@ void AdbDeviceProvider::QueryDevices(const SerialsCallback& callback) { void AdbDeviceProvider::QueryDeviceInfo(const std::string& serial, const DeviceInfoCallback& callback) { - AdbDeviceInfoQuery::Start(base::Bind(&RunCommand, serial), callback); + AndroidDeviceManager::QueryDeviceInfo(base::Bind(&RunCommand, serial), + callback); } void AdbDeviceProvider::OpenSocket(const std::string& serial, diff --git a/chrome/browser/devtools/device/adb/mock_adb_server.cc b/chrome/browser/devtools/device/adb/mock_adb_server.cc index 16661c4..8288674 100644 --- a/chrome/browser/devtools/device/adb/mock_adb_server.cc +++ b/chrome/browser/devtools/device/adb/mock_adb_server.cc @@ -25,11 +25,13 @@ namespace { const char kHostTransportPrefix[] = "host:transport:"; const char kLocalAbstractPrefix[] = "localabstract:"; -const char kOpenedUnixSocketsCommand[] = "shell:cat /proc/net/unix"; -const char kDeviceModelCommand[] = "shell:getprop ro.product.model"; -const char kDumpsysCommand[] = "shell:dumpsys window policy"; -const char kListProcessesCommand[] = "shell:ps"; -const char kListUsersCommand[] = "shell:dumpsys user"; +const char kShellPrefix[] = "shell:"; +const char kOpenedUnixSocketsCommand[] = "cat /proc/net/unix"; +const char kDeviceModelCommand[] = "getprop ro.product.model"; +const char kDumpsysCommand[] = "dumpsys window policy"; +const char kListProcessesCommand[] = "ps"; +const char kListUsersCommand[] = "dumpsys user"; +const char kEchoCommandPrefix[] = "echo "; const char kSerialOnline[] = "01498B321301A00A"; const char kSerialOffline[] = "01498B2B0D01300E"; @@ -544,16 +546,30 @@ void MockAndroidConnection::ProcessCommand(const std::string& command) { socket_name_ = command.substr(strlen(kLocalAbstractPrefix)); delegate_->SendSuccess(std::string()); } else { - if (command == kDeviceModelCommand) { - delegate_->SendSuccess(kDeviceModel); - } else if (command == kOpenedUnixSocketsCommand) { - delegate_->SendSuccess(kSampleOpenedUnixSockets); - } else if (command == kDumpsysCommand) { - delegate_->SendSuccess(kSampleDumpsys); - } else if (command == kListProcessesCommand) { - delegate_->SendSuccess(kSampleListProcesses); - } else if (command == kListUsersCommand) { - delegate_->SendSuccess(kSampleListUsers); + if (command.find(kShellPrefix) == 0) { + std::vector<std::string> lines; + Tokenize(command.substr(strlen(kShellPrefix)), "\n", &lines); + std::string result; + for (const auto& line : lines) { + if (line == kDeviceModelCommand) { + result += kDeviceModel; + result += "\r\n"; + } else if (line == kOpenedUnixSocketsCommand) { + result += kSampleOpenedUnixSockets; + } else if (line == kDumpsysCommand) { + result += kSampleDumpsys; + } else if (line == kListProcessesCommand) { + result += kSampleListProcesses; + } else if (line == kListUsersCommand) { + result += kSampleListUsers; + } else if (line.find(kEchoCommandPrefix) == 0) { + result += line.substr(strlen(kEchoCommandPrefix)); + result += "\r\n"; + } else { + NOTREACHED() << "Unknown shell command - " << command; + } + } + delegate_->SendSuccess(result); } else { NOTREACHED() << "Unknown command - " << command; } diff --git a/chrome/browser/devtools/device/adb/adb_device_info_query.cc b/chrome/browser/devtools/device/android_device_info_query.cc index e7de946..e1d575c 100644 --- a/chrome/browser/devtools/device/adb/adb_device_info_query.cc +++ b/chrome/browser/devtools/device/android_device_info_query.cc @@ -2,20 +2,31 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/devtools/device/adb/adb_device_info_query.h" - #include "base/strings/string_number_conversions.h" +#include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" +#include "chrome/browser/devtools/device/android_device_manager.h" namespace { +#define SEPARATOR "====!@#$%^&*(output separator)*&^%$#@!====" + +const char kAllCommands[] = "shell:" + "getprop ro.product.model\n" + "echo " SEPARATOR "\n" + "dumpsys window policy\n" + "echo " SEPARATOR "\n" + "ps\n" + "echo " SEPARATOR "\n" + "cat /proc/net/unix\n" + "echo " SEPARATOR "\n" + "dumpsys user\n"; + +const char kSeparator[] = SEPARATOR "\r\n"; + +#undef SEPARATOR -const char kDeviceModelCommand[] = "shell:getprop ro.product.model"; -const char kOpenedUnixSocketsCommand[] = "shell:cat /proc/net/unix"; -const char kListProcessesCommand[] = "shell:ps"; -const char kWindowPolicyCommand[] = "shell:dumpsys window policy"; -const char kListUsersCommand[] = "shell:dumpsys user"; const char kScreenSizePrefix[] = "mStable="; const char kUserInfoPrefix[] = "UserInfo{"; @@ -187,7 +198,6 @@ StringMap MapIdsToUsers(const std::string& response) { // UserInfo{10:User with : (colon):10} serialNo=10 // Created: +3d4h35m1s139ms ago // Last logged in: +17m26s287ms ago - StringMap id_to_username; std::vector<std::string> lines; Tokenize(response, "\r", &lines); @@ -224,11 +234,8 @@ std::string GetUserName(const std::string& unix_user, return std::string(); } -} // namespace - -// static AndroidDeviceManager::BrowserInfo::Type -AdbDeviceInfoQuery::GetBrowserType(const std::string& socket) { +GetBrowserType(const std::string& socket) { if (socket.find(kChromeDefaultSocket) == 0) return AndroidDeviceManager::BrowserInfo::kTypeChrome; @@ -238,107 +245,28 @@ AdbDeviceInfoQuery::GetBrowserType(const std::string& socket) { return AndroidDeviceManager::BrowserInfo::kTypeOther; } -// static -std::string AdbDeviceInfoQuery::GetDisplayName(const std::string& socket, - const std::string& package) { - if (package.empty()) { - // Derive a fallback display name from the socket name. - std::string name = socket.substr(0, socket.find(kDevToolsSocketSuffix)); - name[0] = base::ToUpperASCII(name[0]); - return name; +void ReceivedResponse(const AndroidDeviceManager::DeviceInfoCallback& callback, + int result, + const std::string& response) { + AndroidDeviceManager::DeviceInfo device_info; + if (result < 0) { + callback.Run(device_info); + return; } - - const BrowserDescriptor* descriptor = FindBrowserDescriptor(package); - if (descriptor) - return descriptor->display_name; - - if (GetBrowserType(socket) == - AndroidDeviceManager::BrowserInfo::kTypeWebView) - return base::StringPrintf(kWebViewNameTemplate, package.c_str()); - - return package; -} - -// static -void AdbDeviceInfoQuery::Start(const RunCommandCallback& command_callback, - const DeviceInfoCallback& callback) { - new AdbDeviceInfoQuery(command_callback, callback); -} - -AdbDeviceInfoQuery::AdbDeviceInfoQuery( - const RunCommandCallback& command_callback, - const DeviceInfoCallback& callback) - : callback_(callback) { - AddRef(); - command_callback.Run( - kDeviceModelCommand, - base::Bind(&AdbDeviceInfoQuery::ReceivedModel, this)); - command_callback.Run( - kWindowPolicyCommand, - base::Bind(&AdbDeviceInfoQuery::ReceivedWindowPolicy, this)); - command_callback.Run( - kListProcessesCommand, - base::Bind(&AdbDeviceInfoQuery::ReceivedProcesses, this)); - command_callback.Run( - kOpenedUnixSocketsCommand, - base::Bind(&AdbDeviceInfoQuery::ReceivedSockets, this)); - command_callback.Run( - kListUsersCommand, - base::Bind(&AdbDeviceInfoQuery::ReceivedUsers, this)); - Release(); -} - -AdbDeviceInfoQuery::~AdbDeviceInfoQuery() { - DCHECK(thread_checker_.CalledOnValidThread()); - ParseBrowserInfo(); - callback_.Run(device_info_); -} - -void AdbDeviceInfoQuery::ReceivedModel(int result, - const std::string& response) { - DCHECK(thread_checker_.CalledOnValidThread()); - if (result >= 0) { - TrimWhitespaceASCII(response, base::TRIM_ALL, &device_info_.model); - device_info_.connected = true; + std::vector<std::string> outputs; + base::SplitStringUsingSubstr(response, kSeparator, &outputs); + if (outputs.size() != 5) { + callback.Run(device_info); + return; } -} - -void AdbDeviceInfoQuery::ReceivedWindowPolicy(int result, - const std::string& response) { - DCHECK(thread_checker_.CalledOnValidThread()); - if (result >= 0) - device_info_.screen_size = ParseWindowPolicyResponse(response); -} - -void AdbDeviceInfoQuery::ReceivedProcesses(int result, - const std::string& response) { - DCHECK(thread_checker_.CalledOnValidThread()); - if (result >= 0) - processes_response_ = response; -} - -void AdbDeviceInfoQuery::ReceivedSockets(int result, - const std::string& response) { - DCHECK(thread_checker_.CalledOnValidThread()); - if (result >= 0) - sockets_response_ = response; -} - -void AdbDeviceInfoQuery::ReceivedUsers(int result, - const std::string& response) { - DCHECK(thread_checker_.CalledOnValidThread()); - if (result >= 0) - users_response_ = response; -} - -void AdbDeviceInfoQuery::ParseBrowserInfo() { + device_info.connected = true; + device_info.model = outputs[0]; + device_info.screen_size = ParseWindowPolicyResponse(outputs[1]); StringMap pid_to_package; StringMap pid_to_user; - MapProcessesToPackages(processes_response_, - &pid_to_package, - &pid_to_user); - StringMap socket_to_pid = MapSocketsToProcesses(sockets_response_); - StringMap id_to_username = MapIdsToUsers(users_response_); + MapProcessesToPackages(outputs[2], &pid_to_package, &pid_to_user); + StringMap socket_to_pid = MapSocketsToProcesses(outputs[3]); + StringMap id_to_username = MapIdsToUsers(outputs[4]); std::set<std::string> used_pids; for (const auto& pair : socket_to_pid) used_pids.insert(pair.second); @@ -364,12 +292,46 @@ void AdbDeviceInfoQuery::ParseBrowserInfo() { AndroidDeviceManager::BrowserInfo browser_info; browser_info.socket_name = socket; browser_info.type = GetBrowserType(socket); - browser_info.display_name = GetDisplayName(socket, package); + browser_info.display_name = + AndroidDeviceManager::GetBrowserName(socket, package); StringMap::iterator uit = pid_to_user.find(pid); if (uit != pid_to_user.end()) browser_info.user = GetUserName(uit->second, id_to_username); - device_info_.browser_info.push_back(browser_info); + device_info.browser_info.push_back(browser_info); } + callback.Run(device_info); +} + +} // namespace + +// static +std::string AndroidDeviceManager::GetBrowserName(const std::string& socket, + const std::string& package) { + if (package.empty()) { + // Derive a fallback display name from the socket name. + std::string name = socket.substr(0, socket.find(kDevToolsSocketSuffix)); + name[0] = base::ToUpperASCII(name[0]); + return name; + } + + const BrowserDescriptor* descriptor = FindBrowserDescriptor(package); + if (descriptor) + return descriptor->display_name; + + if (GetBrowserType(socket) == + AndroidDeviceManager::BrowserInfo::kTypeWebView) + return base::StringPrintf(kWebViewNameTemplate, package.c_str()); + + return package; +} + +// static +void AndroidDeviceManager::QueryDeviceInfo( + const RunCommandCallback& command_callback, + const DeviceInfoCallback& callback) { + command_callback.Run( + kAllCommands, + base::Bind(&ReceivedResponse, callback)); } diff --git a/chrome/browser/devtools/device/android_device_manager.h b/chrome/browser/devtools/device/android_device_manager.h index ae2defb..831b13d 100644 --- a/chrome/browser/devtools/device/android_device_manager.h +++ b/chrome/browser/devtools/device/android_device_manager.h @@ -188,6 +188,14 @@ class AndroidDeviceManager : public base::NonThreadSafe { void QueryDevices(const DevicesCallback& callback); + static std::string GetBrowserName(const std::string& socket, + const std::string& package); + using RunCommandCallback = + base::Callback<void(const std::string&, const CommandCallback&)>; + + static void QueryDeviceInfo(const RunCommandCallback& command_callback, + const DeviceInfoCallback& callback); + struct DeviceDescriptor { DeviceDescriptor(); ~DeviceDescriptor(); diff --git a/chrome/browser/devtools/device/devtools_android_bridge.cc b/chrome/browser/devtools/device/devtools_android_bridge.cc index f427d0e..a1e29a5 100644 --- a/chrome/browser/devtools/device/devtools_android_bridge.cc +++ b/chrome/browser/devtools/device/devtools_android_bridge.cc @@ -22,7 +22,6 @@ #include "base/strings/utf_string_conversions.h" #include "base/threading/thread.h" #include "base/values.h" -#include "chrome/browser/devtools/device/adb/adb_device_info_query.h" #include "chrome/browser/devtools/device/adb/adb_device_provider.h" #include "chrome/browser/devtools/device/port_forwarding_controller.h" #include "chrome/browser/devtools/device/self_device_provider.h" @@ -167,7 +166,7 @@ void DevToolsAndroidBridge::DiscoveryRequest::ReceivedVersion( std::string package; if (dict->GetString("Android-Package", &package)) { browser->display_name_ = - AdbDeviceInfoQuery::GetDisplayName(browser->socket(), package); + AndroidDeviceManager::GetBrowserName(browser->socket(), package); } } } diff --git a/chrome/browser/devtools/device/usb/usb_device_provider.cc b/chrome/browser/devtools/device/usb/usb_device_provider.cc index 258365c..d3b16bf 100644 --- a/chrome/browser/devtools/device/usb/usb_device_provider.cc +++ b/chrome/browser/devtools/device/usb/usb_device_provider.cc @@ -5,7 +5,6 @@ #include "chrome/browser/devtools/device/usb/usb_device_provider.h" #include "base/strings/stringprintf.h" -#include "chrome/browser/devtools/device/adb/adb_device_info_query.h" #include "chrome/browser/devtools/device/usb/android_rsa.h" #include "chrome/browser/devtools/device/usb/android_usb_device.h" #include "crypto/rsa_private_key.h" @@ -103,7 +102,8 @@ void UsbDeviceProvider::QueryDeviceInfo(const std::string& serial, callback.Run(offline_info); return; } - AdbDeviceInfoQuery::Start(base::Bind(&RunCommand, it->second), callback); + AndroidDeviceManager::QueryDeviceInfo(base::Bind(&RunCommand, it->second), + callback); } void UsbDeviceProvider::OpenSocket(const std::string& serial, diff --git a/chrome/chrome_debugger.gypi b/chrome/chrome_debugger.gypi index 67b06a4..02b2f00 100644 --- a/chrome/chrome_debugger.gypi +++ b/chrome/chrome_debugger.gypi @@ -62,10 +62,9 @@ 'browser/devtools/chrome_devtools_manager_delegate.h', 'browser/devtools/device/adb/adb_client_socket.cc', 'browser/devtools/device/adb/adb_client_socket.h', - 'browser/devtools/device/adb/adb_device_info_query.cc', - 'browser/devtools/device/adb/adb_device_info_query.h', 'browser/devtools/device/adb/adb_device_provider.cc', 'browser/devtools/device/adb/adb_device_provider.h', + 'browser/devtools/device/android_device_info_query.cc', 'browser/devtools/device/android_device_manager.cc', 'browser/devtools/device/android_device_manager.h', 'browser/devtools/device/android_web_socket.cc', |