| Index: chrome/browser/devtools/devtools_adb_bridge.cc
|
| diff --git a/chrome/browser/devtools/devtools_adb_bridge.cc b/chrome/browser/devtools/devtools_adb_bridge.cc
|
| index 0536da0ded908ffc2946be0caf52be148bc6f696..15bcdb5745cd91566a14f7e20dbf8eac36db080a 100644
|
| --- a/chrome/browser/devtools/devtools_adb_bridge.cc
|
| +++ b/chrome/browser/devtools/devtools_adb_bridge.cc
|
| @@ -9,10 +9,12 @@
|
|
|
| #include "base/base64.h"
|
| #include "base/bind.h"
|
| +#include "base/command_line.h"
|
| #include "base/compiler_specific.h"
|
| #include "base/json/json_reader.h"
|
| #include "base/lazy_instance.h"
|
| #include "base/logging.h"
|
| +#include "base/memory/singleton.h"
|
| #include "base/message_loop/message_loop_proxy.h"
|
| #include "base/rand_util.h"
|
| #include "base/strings/string_number_conversions.h"
|
| @@ -20,17 +22,21 @@
|
| #include "base/strings/stringprintf.h"
|
| #include "base/threading/thread.h"
|
| #include "base/values.h"
|
| +#include "chrome/browser/devtools/adb/android_rsa.h"
|
| #include "chrome/browser/devtools/adb/android_usb_device.h"
|
| #include "chrome/browser/devtools/adb_client_socket.h"
|
| #include "chrome/browser/devtools/devtools_window.h"
|
| #include "chrome/browser/devtools/tethering_adb_filter.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| +#include "chrome/common/chrome_switches.h"
|
| +#include "components/browser_context_keyed_service/browser_context_dependency_manager.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/devtools_agent_host.h"
|
| #include "content/public/browser/devtools_client_host.h"
|
| #include "content/public/browser/devtools_external_agent_proxy.h"
|
| #include "content/public/browser/devtools_external_agent_proxy_delegate.h"
|
| #include "content/public/browser/devtools_manager.h"
|
| +#include "crypto/rsa_private_key.h"
|
| #include "net/base/net_errors.h"
|
| #include "net/server/web_socket.h"
|
|
|
| @@ -185,50 +191,18 @@ class AdbQueryCommand : public base::RefCounted<AdbQueryCommand> {
|
| Callback callback_;
|
| };
|
|
|
| -static void ReceivedDevices(const AndroidDevicesCallback& callback,
|
| - Profile* profile,
|
| - int result,
|
| - const std::string& response) {
|
| - AndroidDevices devices;
|
| -#if defined(DEBUG_DEVTOOLS)
|
| - devices.push_back(new AdbDeviceImpl("")); // For desktop remote debugging.
|
| - std::vector<scoped_refptr<AndroidUsbDevice> > usb_devices;
|
| - AndroidUsbDevice::Enumerate(profile, &usb_devices);
|
| - for (size_t i = 0; i < usb_devices.size(); ++i)
|
| - devices.push_back(new UsbDeviceImpl(usb_devices[i]));
|
| -#endif // defined(DEBUG_DEVTOOLS)
|
| - if (result != net::OK) {
|
| - callback.Run(devices);
|
| - return;
|
| - }
|
| -
|
| - std::vector<std::string> serials;
|
| - Tokenize(response, "\n", &serials);
|
| - for (size_t i = 0; i < serials.size(); ++i) {
|
| - std::vector<std::string> tokens;
|
| - Tokenize(serials[i], "\t ", &tokens);
|
| - devices.push_back(new AdbDeviceImpl(tokens[0]));
|
| - }
|
| - callback.Run(devices);
|
| -}
|
| -
|
| -static void EnumerateDevices(Profile* profile,
|
| - const AndroidDevicesCallback& callback) {
|
| - AdbClientSocket::AdbQuery(
|
| - kAdbPort, kHostDevicesCommand,
|
| - base::Bind(&ReceivedDevices, callback, profile));
|
| -}
|
| -
|
| class AdbPagesCommand : public base::RefCounted<AdbPagesCommand> {
|
| public:
|
| - explicit AdbPagesCommand(const PagesCallback& callback)
|
| - : callback_(callback) {
|
| + explicit AdbPagesCommand(DevToolsAdbBridge* bridge,
|
| + const PagesCallback& callback)
|
| + : bridge_(bridge),
|
| + callback_(callback) {
|
| pages_.reset(new DevToolsAdbBridge::RemotePages());
|
| }
|
|
|
| - void Run(Profile* profile) {
|
| - EnumerateDevices(profile,
|
| - base::Bind(&AdbPagesCommand::ReceivedDevices, this));
|
| + void Run() {
|
| + bridge_->EnumerateDevices(base::Bind(&AdbPagesCommand::ReceivedDevices,
|
| + this));
|
| }
|
|
|
| private:
|
| @@ -410,6 +384,7 @@ class AdbPagesCommand : public base::RefCounted<AdbPagesCommand> {
|
| }
|
| }
|
|
|
| + scoped_refptr<DevToolsAdbBridge> bridge_;
|
| PagesCallback callback_;
|
| AndroidDevices devices_;
|
| std::vector<std::string> sockets_;
|
| @@ -428,6 +403,42 @@ typedef std::map<std::string, AgentHostDelegate*> AgentHostDelegates;
|
| base::LazyInstance<AgentHostDelegates>::Leaky g_host_delegates =
|
| LAZY_INSTANCE_INITIALIZER;
|
|
|
| +DevToolsAdbBridge::Wrapper::Wrapper(Profile* profile)
|
| + : bridge_(new DevToolsAdbBridge(profile)) {
|
| +}
|
| +
|
| +DevToolsAdbBridge::Wrapper::~Wrapper() {
|
| +}
|
| +
|
| +DevToolsAdbBridge* DevToolsAdbBridge::Wrapper::Get() {
|
| + return bridge_.get();
|
| +}
|
| +
|
| +// static
|
| +DevToolsAdbBridge::Factory* DevToolsAdbBridge::Factory::GetInstance() {
|
| + return Singleton<DevToolsAdbBridge::Factory>::get();
|
| +}
|
| +
|
| +// static
|
| +DevToolsAdbBridge* DevToolsAdbBridge::Factory::GetForProfile(
|
| + Profile* profile) {
|
| + return static_cast<DevToolsAdbBridge::Wrapper*>(
|
| + GetInstance()->GetServiceForBrowserContext(profile, true))->Get();
|
| +}
|
| +
|
| +DevToolsAdbBridge::Factory::Factory()
|
| + : BrowserContextKeyedServiceFactory(
|
| + "DevToolsAdbBridge",
|
| + BrowserContextDependencyManager::GetInstance()) {}
|
| +
|
| +DevToolsAdbBridge::Factory::~Factory() {}
|
| +
|
| +BrowserContextKeyedService*
|
| +DevToolsAdbBridge::Factory::BuildServiceInstanceFor(
|
| + content::BrowserContext* context) const {
|
| + return new DevToolsAdbBridge::Wrapper(Profile::FromBrowserContext(context));
|
| +}
|
| +
|
| DevToolsAdbBridge::AndroidDevice::AndroidDevice(const std::string& serial)
|
| : serial_(serial) {
|
| }
|
| @@ -636,7 +647,7 @@ class AgentHostDelegate : public base::RefCountedThreadSafe<AgentHostDelegate>,
|
|
|
| class AdbAttachCommand : public base::RefCounted<AdbAttachCommand> {
|
| public:
|
| - AdbAttachCommand(const base::WeakPtr<DevToolsAdbBridge>& bridge,
|
| + AdbAttachCommand(DevToolsAdbBridge* bridge,
|
| const std::string& serial,
|
| const std::string& socket,
|
| const std::string& debug_url,
|
| @@ -648,16 +659,8 @@ class AdbAttachCommand : public base::RefCounted<AdbAttachCommand> {
|
| frontend_url_(frontend_url) {
|
| }
|
|
|
| - void Run(Profile* profile) {
|
| -
|
| - // scoped_refptr<DevToolsAdbBridge::AndroidDevice> device =
|
| - // new AdbDeviceImpl(serial_);
|
| -
|
| - DevToolsAdbBridge* bridge = bridge_.get();
|
| - if (!bridge)
|
| - return;
|
| -
|
| - EnumerateDevices(profile, base::Bind(&AdbAttachCommand::ReceivedDevices,
|
| + void Run() {
|
| + bridge_->EnumerateDevices(base::Bind(&AdbAttachCommand::ReceivedDevices,
|
| this));
|
| }
|
|
|
| @@ -689,10 +692,6 @@ class AdbAttachCommand : public base::RefCounted<AdbAttachCommand> {
|
| void OpenDevToolsWindow(net::StreamSocket* socket) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|
| - DevToolsAdbBridge* bridge = bridge_.get();
|
| - if (!bridge)
|
| - return;
|
| -
|
| std::string id = base::StringPrintf("%s:%s", serial_.c_str(),
|
| debug_url_.c_str());
|
| AgentHostDelegates::iterator it = g_host_delegates.Get().find(id);
|
| @@ -700,13 +699,13 @@ class AdbAttachCommand : public base::RefCounted<AdbAttachCommand> {
|
| if (it != g_host_delegates.Get().end())
|
| delegate = it->second;
|
| else
|
| - delegate = new AgentHostDelegate(id, serial_, bridge->adb_thread_,
|
| + delegate = new AgentHostDelegate(id, serial_, bridge_->adb_thread_,
|
| socket);
|
| DevToolsWindow::OpenExternalFrontend(
|
| - bridge->profile_, frontend_url_, delegate->GetAgentHost().get());
|
| + bridge_->profile_, frontend_url_, delegate->GetAgentHost().get());
|
| }
|
|
|
| - base::WeakPtr<DevToolsAdbBridge> bridge_;
|
| + scoped_refptr<DevToolsAdbBridge> bridge_;
|
| std::string serial_;
|
| std::string socket_;
|
| std::string debug_url_;
|
| @@ -791,12 +790,15 @@ DevToolsAdbBridge::RefCountedAdbThread::~RefCountedAdbThread() {
|
| DevToolsAdbBridge::DevToolsAdbBridge(Profile* profile)
|
| : profile_(profile),
|
| adb_thread_(RefCountedAdbThread::GetInstance()),
|
| - weak_factory_(this),
|
| has_message_loop_(adb_thread_->message_loop() != NULL) {
|
| + rsa_key_.reset(AndroidRSAPrivateKey(profile));
|
| }
|
|
|
| -DevToolsAdbBridge::~DevToolsAdbBridge() {
|
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +void DevToolsAdbBridge::EnumerateDevices(
|
| + const AndroidDevicesCallback& callback) {
|
| + AdbClientSocket::AdbQuery(
|
| + kAdbPort, kHostDevicesCommand,
|
| + base::Bind(&DevToolsAdbBridge::ReceivedDevices, this, callback));
|
| }
|
|
|
| void DevToolsAdbBridge::Query(
|
| @@ -818,9 +820,9 @@ void DevToolsAdbBridge::Pages(const PagesCallback& callback) {
|
| return;
|
|
|
| scoped_refptr<AdbPagesCommand> command(
|
| - new AdbPagesCommand(callback));
|
| + new AdbPagesCommand(this, callback));
|
| adb_thread_->message_loop()->PostTask(FROM_HERE,
|
| - base::Bind(&AdbPagesCommand::Run, command, profile_));
|
| + base::Bind(&AdbPagesCommand::Run, command));
|
| }
|
|
|
| void DevToolsAdbBridge::Attach(const std::string& serial,
|
| @@ -832,9 +834,46 @@ void DevToolsAdbBridge::Attach(const std::string& serial,
|
| return;
|
|
|
| scoped_refptr<AdbAttachCommand> command(
|
| - new AdbAttachCommand(weak_factory_.GetWeakPtr(), serial, socket,
|
| + new AdbAttachCommand(this, serial, socket,
|
| debug_url, frontend_url));
|
| adb_thread_->message_loop()->PostTask(
|
| FROM_HERE,
|
| - base::Bind(&AdbAttachCommand::Run, command, profile_));
|
| + base::Bind(&AdbAttachCommand::Run, command));
|
| +}
|
| +
|
| +DevToolsAdbBridge::~DevToolsAdbBridge() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +}
|
| +
|
| +void DevToolsAdbBridge::ReceivedDevices(const AndroidDevicesCallback& callback,
|
| + int result,
|
| + const std::string& response) {
|
| + AndroidDevices devices;
|
| +#if defined(DEBUG_DEVTOOLS)
|
| + devices.push_back(new AdbDeviceImpl("")); // For desktop remote debugging.
|
| +#endif // defined(DEBUG_DEVTOOLS)
|
| +
|
| + if (CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kRemoteDebuggingRawUSB)) {
|
| + AndroidUsbDevices usb_devices;
|
| + AndroidUsbDevice::Enumerate(profile_, rsa_key_.get(), &usb_devices);
|
| + for (AndroidUsbDevices::iterator it = usb_devices.begin();
|
| + it != usb_devices.end(); ++it) {
|
| + devices.push_back(new UsbDeviceImpl(*it));
|
| + }
|
| + }
|
| +
|
| + if (result != net::OK) {
|
| + callback.Run(devices);
|
| + return;
|
| + }
|
| +
|
| + std::vector<std::string> serials;
|
| + Tokenize(response, "\n", &serials);
|
| + for (size_t i = 0; i < serials.size(); ++i) {
|
| + std::vector<std::string> tokens;
|
| + Tokenize(serials[i], "\t ", &tokens);
|
| + devices.push_back(new AdbDeviceImpl(tokens[0]));
|
| + }
|
| + callback.Run(devices);
|
| }
|
|
|