Index: chrome/browser/devtools/device/devtools_android_bridge.cc |
diff --git a/chrome/browser/devtools/device/devtools_android_bridge.cc b/chrome/browser/devtools/device/devtools_android_bridge.cc |
index 3b05ecb05fe2a874acb3a6de1319421be8ad505c..7475981401764e0128c38f762aa0da2db95405d3 100644 |
--- a/chrome/browser/devtools/device/devtools_android_bridge.cc |
+++ b/chrome/browser/devtools/device/devtools_android_bridge.cc |
@@ -308,6 +308,7 @@ class DevToolsAndroidBridge::AgentHostDelegate |
bool socket_opened_; |
bool is_web_view_; |
std::vector<std::string> pending_messages_; |
+ scoped_refptr<AndroidDeviceManager::Device> device_; |
scoped_ptr<AndroidDeviceManager::AndroidWebSocket> web_socket_; |
content::DevToolsAgentHost* agent_host_; |
content::DevToolsExternalAgentProxy* proxy_; |
@@ -361,12 +362,19 @@ void DevToolsAndroidBridge::AgentHostDelegate::Attach( |
proxy_ = proxy; |
content::RecordAction(base::UserMetricsAction(is_web_view_ ? |
"DevTools_InspectAndroidWebView" : "DevTools_InspectAndroidPage")); |
+ |
+ // Retain the device so it's not released until AgentHost is detached. |
+ device_ = bridge_->FindDevice(browser_id_.first); |
+ if (!device_.get()) |
+ return; |
+ |
web_socket_.reset( |
- bridge_->CreateWebSocket(browser_id_, debug_url_, this)); |
+ device_->CreateWebSocket(browser_id_.second, debug_url_, this)); |
} |
void DevToolsAndroidBridge::AgentHostDelegate::Detach() { |
web_socket_.reset(); |
+ device_ = nullptr; |
} |
void DevToolsAndroidBridge::AgentHostDelegate::SendMessageToBackend( |
@@ -594,12 +602,13 @@ void DevToolsAndroidBridge::SendJsonRequest( |
const BrowserId& browser_id, |
const std::string& request, |
const JsonRequestCallback& callback) { |
- DeviceMap::iterator it = device_map_.find(browser_id.first); |
- if (it == device_map_.end()) { |
+ scoped_refptr<AndroidDeviceManager::Device> device( |
+ FindDevice(browser_id.first)); |
+ if (!device.get()) { |
callback.Run(net::ERR_FAILED, std::string()); |
return; |
} |
- it->second->SendJsonRequest(browser_id.second, request, callback); |
+ device->SendJsonRequest(browser_id.second, request, callback); |
} |
void DevToolsAndroidBridge::SendProtocolCommand( |
@@ -611,13 +620,14 @@ void DevToolsAndroidBridge::SendProtocolCommand( |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
if (debug_url.empty()) |
return; |
- DeviceMap::iterator it = device_map_.find(browser_id.first); |
- if (it == device_map_.end()) { |
+ scoped_refptr<AndroidDeviceManager::Device> device( |
+ FindDevice(browser_id.first)); |
+ if (!device.get()) { |
callback.Run(); |
return; |
} |
DevToolsProtocol::Command command(1, method, params); |
- new ProtocolCommand(it->second, browser_id.second, debug_url, |
+ new ProtocolCommand(device, browser_id.second, debug_url, |
command.Serialize(), callback); |
} |
@@ -632,16 +642,10 @@ DevToolsAndroidBridge::GetBrowserAgentHost( |
browser->IsWebView()); |
} |
-AndroidDeviceManager::AndroidWebSocket* |
-DevToolsAndroidBridge::CreateWebSocket( |
- const BrowserId& browser_id, |
- const std::string& url, |
- AndroidDeviceManager::AndroidWebSocket::Delegate* delegate) { |
- DeviceMap::iterator it = device_map_.find(browser_id.first); |
- if (it == device_map_.end()) |
- return NULL; |
- |
- return it->second->CreateWebSocket(browser_id.second, url, delegate); |
+scoped_refptr<AndroidDeviceManager::Device> DevToolsAndroidBridge::FindDevice( |
+ const std::string& serial) { |
+ DeviceMap::iterator it = device_map_.find(serial); |
+ return it == device_map_.end() ? nullptr : it->second; |
} |
void DevToolsAndroidBridge::RespondToOpenOnUIThread( |
@@ -760,7 +764,7 @@ DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile) |
: profile_(profile), |
device_manager_(AndroidDeviceManager::Create()), |
task_scheduler_(base::Bind(&DevToolsAndroidBridge::ScheduleTaskDefault)), |
- port_forwarding_controller_(new PortForwardingController(profile)) { |
+ port_forwarding_controller_(new PortForwardingController(profile, this)) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
pref_change_registrar_.Init(profile_->GetPrefs()); |
pref_change_registrar_.Add(prefs::kDevToolsDiscoverUsbDevicesEnabled, |
@@ -881,7 +885,7 @@ void DevToolsAndroidBridge::ReceivedDeviceList( |
(*it)->DeviceListChanged(remote_devices); |
ForwardingStatus status = |
- port_forwarding_controller_->DeviceListChanged(complete_devices); |
+ port_forwarding_controller_->DeviceListChanged(remote_devices); |
PortForwardingListeners forwarding_listeners(port_forwarding_listeners_); |
for (PortForwardingListeners::iterator it = forwarding_listeners.begin(); |
it != forwarding_listeners.end(); ++it) { |