Chromium Code Reviews| 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..fedf6da20df7ff6303ae482f44c1598d6ac8deee 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,11 +22,16 @@ |
| #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/browser/ui/app_list/search/history.h" |
| +#include "chrome/common/chrome_switches.h" |
| +#include "crypto/rsa_private_key.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" |
| @@ -185,50 +192,25 @@ 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(const base::WeakPtr<DevToolsAdbBridge>& bridge, |
|
vsevik
2013/07/11 15:59:54
Use raw pointer from now on.
pfeldman
2013/07/11 16:26:51
Fooled you here - I can't do this since the comman
|
| + 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() { |
| + DevToolsAdbBridge* bridge = bridge_.get(); |
| + if (!bridge) { |
| + BrowserThread::PostTask( |
| + BrowserThread::UI, FROM_HERE, |
| + base::Bind(&AdbPagesCommand::Respond, this)); |
| + return; |
| + } |
| + bridge->EnumerateDevices(base::Bind(&AdbPagesCommand::ReceivedDevices, |
| + this)); |
| } |
| private: |
| @@ -410,6 +392,7 @@ class AdbPagesCommand : public base::RefCounted<AdbPagesCommand> { |
| } |
| } |
| + base::WeakPtr<DevToolsAdbBridge> bridge_; |
| PagesCallback callback_; |
| AndroidDevices devices_; |
| std::vector<std::string> sockets_; |
| @@ -428,6 +411,31 @@ typedef std::map<std::string, AgentHostDelegate*> AgentHostDelegates; |
| base::LazyInstance<AgentHostDelegates>::Leaky g_host_delegates = |
| LAZY_INSTANCE_INITIALIZER; |
| +// static |
| +DevToolsAdbBridge::Factory* DevToolsAdbBridge::Factory::GetInstance() { |
| + return Singleton<DevToolsAdbBridge::Factory>::get(); |
| +} |
| + |
| +// static |
|
vsevik
2013/07/11 15:59:54
not static
pfeldman
2013/07/11 16:26:51
Oops, it was Ok.
|
| +DevToolsAdbBridge* DevToolsAdbBridge::Factory::GetForProfile( |
| + Profile* profile) { |
| + return static_cast<DevToolsAdbBridge*>( |
| + GetInstance()->GetServiceForBrowserContext(profile, true)); |
| +} |
| + |
| +DevToolsAdbBridge::Factory::Factory() |
| + : BrowserContextKeyedServiceFactory( |
| + "DevToolsAdbBridge", |
| + BrowserContextDependencyManager::GetInstance()) {} |
| + |
| +DevToolsAdbBridge::Factory::~Factory() {} |
| + |
| +BrowserContextKeyedService* |
| +DevToolsAdbBridge::Factory::BuildServiceInstanceFor( |
| + content::BrowserContext* context) const { |
| + return new DevToolsAdbBridge(Profile::FromBrowserContext(context)); |
| +} |
| + |
| DevToolsAdbBridge::AndroidDevice::AndroidDevice(const std::string& serial) |
| : serial_(serial) { |
| } |
| @@ -648,16 +656,11 @@ class AdbAttachCommand : public base::RefCounted<AdbAttachCommand> { |
| frontend_url_(frontend_url) { |
| } |
| - void Run(Profile* profile) { |
| - |
| - // scoped_refptr<DevToolsAdbBridge::AndroidDevice> device = |
| - // new AdbDeviceImpl(serial_); |
| - |
| + void Run() { |
| DevToolsAdbBridge* bridge = bridge_.get(); |
| if (!bridge) |
| return; |
| - |
| - EnumerateDevices(profile, base::Bind(&AdbAttachCommand::ReceivedDevices, |
| + bridge_->EnumerateDevices(base::Bind(&AdbAttachCommand::ReceivedDevices, |
| this)); |
| } |
| @@ -793,12 +796,21 @@ DevToolsAdbBridge::DevToolsAdbBridge(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, base::Unretained(this), |
| + callback)); |
| +} |
| + |
| void DevToolsAdbBridge::Query( |
| const std::string query, |
| const Callback& callback) { |
| @@ -818,9 +830,9 @@ void DevToolsAdbBridge::Pages(const PagesCallback& callback) { |
| return; |
| scoped_refptr<AdbPagesCommand> command( |
| - new AdbPagesCommand(callback)); |
| + new AdbPagesCommand(weak_factory_.GetWeakPtr(), 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, |
| @@ -836,5 +848,38 @@ void DevToolsAdbBridge::Attach(const std::string& serial, |
| debug_url, frontend_url)); |
| adb_thread_->message_loop()->PostTask( |
| FROM_HERE, |
| - base::Bind(&AdbAttachCommand::Run, command, profile_)); |
| + base::Bind(&AdbAttachCommand::Run, command)); |
| +} |
| + |
| +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); |
| } |