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); |
} |