Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(118)

Side by Side Diff: chrome/browser/devtools/device/devtools_android_bridge.cc

Issue 596253003: DevTools: RemoteDevice and RemoteBrowser are now value types (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@pfc3
Patch Set: Fixed test Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/devtools/device/devtools_android_bridge.h" 5 #include "chrome/browser/devtools/device/devtools_android_bridge.h"
6 6
7 #include <map> 7 #include <map>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/base64.h" 10 #include "base/base64.h"
(...skipping 19 matching lines...) Expand all
30 #include "chrome/browser/devtools/devtools_target_impl.h" 30 #include "chrome/browser/devtools/devtools_target_impl.h"
31 #include "chrome/browser/devtools/devtools_window.h" 31 #include "chrome/browser/devtools/devtools_window.h"
32 #include "chrome/browser/profiles/profile.h" 32 #include "chrome/browser/profiles/profile.h"
33 #include "chrome/common/pref_names.h" 33 #include "chrome/common/pref_names.h"
34 #include "components/keyed_service/content/browser_context_dependency_manager.h" 34 #include "components/keyed_service/content/browser_context_dependency_manager.h"
35 #include "content/public/browser/devtools_agent_host.h" 35 #include "content/public/browser/devtools_agent_host.h"
36 #include "content/public/browser/devtools_external_agent_proxy.h" 36 #include "content/public/browser/devtools_external_agent_proxy.h"
37 #include "content/public/browser/devtools_external_agent_proxy_delegate.h" 37 #include "content/public/browser/devtools_external_agent_proxy_delegate.h"
38 #include "content/public/browser/user_metrics.h" 38 #include "content/public/browser/user_metrics.h"
39 #include "net/base/escape.h" 39 #include "net/base/escape.h"
40 #include "net/base/net_errors.h"
40 41
41 using content::BrowserThread; 42 using content::BrowserThread;
42 43
43 namespace { 44 namespace {
44 45
45 const char kPageListRequest[] = "/json"; 46 const char kPageListRequest[] = "/json";
46 const char kVersionRequest[] = "/json/version"; 47 const char kVersionRequest[] = "/json/version";
47 const char kClosePageRequest[] = "/json/close/%s"; 48 const char kClosePageRequest[] = "/json/close/%s";
48 const char kNewPageRequest[] = "/json/new"; 49 const char kNewPageRequest[] = "/json/new";
49 const char kNewPageRequestWithURL[] = "/json/new?%s"; 50 const char kNewPageRequestWithURL[] = "/json/new?%s";
50 const char kActivatePageRequest[] = "/json/activate/%s"; 51 const char kActivatePageRequest[] = "/json/activate/%s";
51 const char kBrowserTargetSocket[] = "/devtools/browser"; 52 const char kBrowserTargetSocket[] = "/devtools/browser";
52 const int kAdbPollingIntervalMs = 1000; 53 const int kAdbPollingIntervalMs = 1000;
53 54
54 const char kUrlParam[] = "url"; 55 const char kUrlParam[] = "url";
55 const char kPageReloadCommand[] = "Page.reload"; 56 const char kPageReloadCommand[] = "Page.reload";
56 const char kPageNavigateCommand[] = "Page.navigate"; 57 const char kPageNavigateCommand[] = "Page.navigate";
57 58
58 const int kMinVersionNewWithURL = 32; 59 const int kMinVersionNewWithURL = 32;
59 const int kNewPageNavigateDelayMs = 500; 60 const int kNewPageNavigateDelayMs = 500;
60 61
61 // DiscoveryRequest ----------------------------------------------------- 62 // DiscoveryRequest -----------------------------------------------------
62 63
63 class DiscoveryRequest : public base::RefCountedThreadSafe< 64 class DiscoveryRequest : public base::RefCountedThreadSafe<
64 DiscoveryRequest, 65 DiscoveryRequest,
65 BrowserThread::DeleteOnUIThread> { 66 BrowserThread::DeleteOnUIThread> {
66 public: 67 public:
67 typedef AndroidDeviceManager::Device Device;
68 typedef AndroidDeviceManager::Devices Devices;
69 typedef AndroidDeviceManager::DeviceInfo DeviceInfo;
70 typedef DevToolsAndroidBridge::RemoteDevice RemoteDevice;
71 typedef DevToolsAndroidBridge::RemoteDevices RemoteDevices;
72 typedef DevToolsAndroidBridge::RemoteBrowser RemoteBrowser;
73 typedef DevToolsAndroidBridge::RemoteBrowsers RemoteBrowsers; 68 typedef DevToolsAndroidBridge::RemoteBrowsers RemoteBrowsers;
74 typedef base::Callback<void(const RemoteDevices&)> DiscoveryCallback; 69 typedef base::Callback<void(
70 const AndroidDeviceManager::Devices&,
71 const DevToolsAndroidBridge::RemoteDevices&)> DiscoveryCallback;
75 72
76 DiscoveryRequest(AndroidDeviceManager* device_manager, 73 DiscoveryRequest(AndroidDeviceManager* device_manager,
77 const DiscoveryCallback& callback); 74 const DiscoveryCallback& callback);
78 private: 75 private:
79 friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>; 76 friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>;
80 friend class base::DeleteHelper<DiscoveryRequest>; 77 friend class base::DeleteHelper<DiscoveryRequest>;
81 virtual ~DiscoveryRequest(); 78 virtual ~DiscoveryRequest();
82 79
83 void ReceivedDevices(const Devices& devices); 80 void ReceivedDevices(const AndroidDeviceManager::Devices& devices);
84 void ReceivedDeviceInfo(scoped_refptr<Device> device, 81 void ReceivedDeviceInfo(scoped_refptr<AndroidDeviceManager::Device> device,
85 const DeviceInfo& device_info); 82 const AndroidDeviceManager::DeviceInfo& device_info);
86 void ReceivedVersion(scoped_refptr<RemoteBrowser>, 83 void ReceivedVersion(scoped_refptr<DevToolsAndroidBridge::RemoteBrowser>,
87 int result, 84 int result,
88 const std::string& response); 85 const std::string& response);
89 void ReceivedPages(scoped_refptr<RemoteBrowser>, 86 void ReceivedPages(scoped_refptr<DevToolsAndroidBridge::RemoteBrowser>,
90 int result, 87 int result,
91 const std::string& response); 88 const std::string& response);
92 89
93 DiscoveryCallback callback_; 90 DiscoveryCallback callback_;
94 RemoteDevices remote_devices_; 91 AndroidDeviceManager::Devices devices_;
92 DevToolsAndroidBridge::RemoteDevices remote_devices_;
95 }; 93 };
96 94
97 DiscoveryRequest::DiscoveryRequest( 95 DiscoveryRequest::DiscoveryRequest(
98 AndroidDeviceManager* device_manager, 96 AndroidDeviceManager* device_manager,
99 const DiscoveryCallback& callback) 97 const DiscoveryCallback& callback)
100 : callback_(callback) { 98 : callback_(callback) {
101 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 99 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
102 device_manager->QueryDevices( 100 device_manager->QueryDevices(
103 base::Bind(&DiscoveryRequest::ReceivedDevices, this)); 101 base::Bind(&DiscoveryRequest::ReceivedDevices, this));
104 } 102 }
105 103
106 DiscoveryRequest::~DiscoveryRequest() { 104 DiscoveryRequest::~DiscoveryRequest() {
107 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 105 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
108 callback_.Run(remote_devices_); 106 callback_.Run(devices_, remote_devices_);
109 } 107 }
110 108
111 void DiscoveryRequest::ReceivedDevices(const Devices& devices) { 109 void DiscoveryRequest::ReceivedDevices(
110 const AndroidDeviceManager::Devices& devices) {
112 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 111 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
113 for (Devices::const_iterator it = devices.begin(); 112 devices_ = devices;
113 for (AndroidDeviceManager::Devices::const_iterator it = devices.begin();
114 it != devices.end(); ++it) { 114 it != devices.end(); ++it) {
115 (*it)->QueryDeviceInfo( 115 (*it)->QueryDeviceInfo(
116 base::Bind(&DiscoveryRequest::ReceivedDeviceInfo, this, *it)); 116 base::Bind(&DiscoveryRequest::ReceivedDeviceInfo, this, *it));
117 } 117 }
118 } 118 }
119 119
120 void DiscoveryRequest::ReceivedDeviceInfo(scoped_refptr<Device> device, 120 void DiscoveryRequest::ReceivedDeviceInfo(
121 const DeviceInfo& device_info) { 121 scoped_refptr<AndroidDeviceManager::Device> device,
122 const AndroidDeviceManager::DeviceInfo& device_info) {
122 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 123 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
123 scoped_refptr<RemoteDevice> remote_device = 124 scoped_refptr<DevToolsAndroidBridge::RemoteDevice> remote_device =
124 new RemoteDevice(device, device_info); 125 new DevToolsAndroidBridge::RemoteDevice(device->serial(), device_info);
125 remote_devices_.push_back(remote_device); 126 remote_devices_.push_back(remote_device);
126 for (RemoteBrowsers::iterator it = remote_device->browsers().begin(); 127 for (RemoteBrowsers::iterator it = remote_device->browsers().begin();
127 it != remote_device->browsers().end(); ++it) { 128 it != remote_device->browsers().end(); ++it) {
128 (*it)->SendJsonRequest( 129 device->SendJsonRequest(
130 (*it)->socket(),
129 kVersionRequest, 131 kVersionRequest,
130 base::Bind(&DiscoveryRequest::ReceivedVersion, this, *it)); 132 base::Bind(&DiscoveryRequest::ReceivedVersion, this, *it));
131 (*it)->SendJsonRequest( 133 device->SendJsonRequest(
134 (*it)->socket(),
132 kPageListRequest, 135 kPageListRequest,
133 base::Bind(&DiscoveryRequest::ReceivedPages, this, *it)); 136 base::Bind(&DiscoveryRequest::ReceivedPages, this, *it));
134 } 137 }
135 } 138 }
136 139
137 void DiscoveryRequest::ReceivedVersion(scoped_refptr<RemoteBrowser> browser, 140 void DiscoveryRequest::ReceivedVersion(
138 int result, 141 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser,
139 const std::string& response) { 142 int result,
143 const std::string& response) {
140 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 144 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
141 if (result < 0) 145 if (result < 0)
142 return; 146 return;
143 // Parse version, append to package name if available, 147 // Parse version, append to package name if available,
144 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); 148 scoped_ptr<base::Value> value(base::JSONReader::Read(response));
145 base::DictionaryValue* dict; 149 base::DictionaryValue* dict;
146 if (value && value->GetAsDictionary(&dict)) { 150 if (value && value->GetAsDictionary(&dict)) {
147 std::string browser_name; 151 std::string browser_name;
148 if (dict->GetString("Browser", &browser_name)) { 152 if (dict->GetString("Browser", &browser_name)) {
149 std::vector<std::string> parts; 153 std::vector<std::string> parts;
150 Tokenize(browser_name, "/", &parts); 154 Tokenize(browser_name, "/", &parts);
151 if (parts.size() == 2) 155 if (parts.size() == 2)
152 browser->set_version(parts[1]); 156 browser->set_version(parts[1]);
153 else 157 else
154 browser->set_version(browser_name); 158 browser->set_version(browser_name);
155 } 159 }
156 std::string package; 160 std::string package;
157 if (dict->GetString("Android-Package", &package)) { 161 if (dict->GetString("Android-Package", &package)) {
158 browser->set_display_name( 162 browser->set_display_name(
159 AdbDeviceInfoQuery::GetDisplayName(browser->socket(), package)); 163 AdbDeviceInfoQuery::GetDisplayName(browser->socket(), package));
160 } 164 }
161 } 165 }
162 } 166 }
163 167
164 void DiscoveryRequest::ReceivedPages(scoped_refptr<RemoteBrowser> browser, 168 void DiscoveryRequest::ReceivedPages(
165 int result, 169 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser,
166 const std::string& response) { 170 int result,
171 const std::string& response) {
167 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 172 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
168 if (result < 0) 173 if (result < 0)
169 return; 174 return;
170 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); 175 scoped_ptr<base::Value> value(base::JSONReader::Read(response));
171 base::ListValue* list_value; 176 base::ListValue* list_value;
172 if (value && value->GetAsList(&list_value)) 177 if (value && value->GetAsList(&list_value))
173 browser->SetPageDescriptors(*list_value); 178 browser->set_page_descriptors(*list_value);
174 } 179 }
175 180
176 // ProtocolCommand ------------------------------------------------------------ 181 // ProtocolCommand ------------------------------------------------------------
177 182
178 class ProtocolCommand 183 class ProtocolCommand
179 : public DevToolsAndroidBridge::AndroidWebSocket::Delegate { 184 : public AndroidDeviceManager::AndroidWebSocket::Delegate {
180 public: 185 public:
181 ProtocolCommand( 186 ProtocolCommand(
182 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser, 187 scoped_refptr<AndroidDeviceManager::Device> device,
188 const std::string& socket,
183 const std::string& debug_url, 189 const std::string& debug_url,
184 const std::string& command, 190 const std::string& command,
185 const base::Closure callback); 191 const base::Closure callback);
186 192
187 private: 193 private:
188 virtual void OnSocketOpened() OVERRIDE; 194 virtual void OnSocketOpened() OVERRIDE;
189 virtual void OnFrameRead(const std::string& message) OVERRIDE; 195 virtual void OnFrameRead(const std::string& message) OVERRIDE;
190 virtual void OnSocketClosed() OVERRIDE; 196 virtual void OnSocketClosed() OVERRIDE;
191 virtual ~ProtocolCommand(); 197 virtual ~ProtocolCommand();
192 198
193 const std::string command_; 199 const std::string command_;
194 const base::Closure callback_; 200 const base::Closure callback_;
195 scoped_ptr<DevToolsAndroidBridge::AndroidWebSocket> web_socket_; 201 scoped_ptr<AndroidDeviceManager::AndroidWebSocket> web_socket_;
196 202
197 DISALLOW_COPY_AND_ASSIGN(ProtocolCommand); 203 DISALLOW_COPY_AND_ASSIGN(ProtocolCommand);
198 }; 204 };
199 205
200 ProtocolCommand::ProtocolCommand( 206 ProtocolCommand::ProtocolCommand(
201 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser, 207 scoped_refptr<AndroidDeviceManager::Device> device,
208 const std::string& socket,
202 const std::string& debug_url, 209 const std::string& debug_url,
203 const std::string& command, 210 const std::string& command,
204 const base::Closure callback) 211 const base::Closure callback)
205 : command_(command), 212 : command_(command),
206 callback_(callback), 213 callback_(callback),
207 web_socket_(browser->CreateWebSocket(debug_url, this)) { 214 web_socket_(device->CreateWebSocket(socket, debug_url, this)) {
208 } 215 }
209 216
210 void ProtocolCommand::OnSocketOpened() { 217 void ProtocolCommand::OnSocketOpened() {
211 web_socket_->SendFrame(command_); 218 web_socket_->SendFrame(command_);
212 } 219 }
213 220
214 void ProtocolCommand::OnFrameRead(const std::string& message) { 221 void ProtocolCommand::OnFrameRead(const std::string& message) {
215 delete this; 222 delete this;
216 } 223 }
217 224
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 "DevToolsAndroidBridge", 270 "DevToolsAndroidBridge",
264 BrowserContextDependencyManager::GetInstance()) {} 271 BrowserContextDependencyManager::GetInstance()) {}
265 272
266 DevToolsAndroidBridge::Factory::~Factory() {} 273 DevToolsAndroidBridge::Factory::~Factory() {}
267 274
268 KeyedService* DevToolsAndroidBridge::Factory::BuildServiceInstanceFor( 275 KeyedService* DevToolsAndroidBridge::Factory::BuildServiceInstanceFor(
269 content::BrowserContext* context) const { 276 content::BrowserContext* context) const {
270 return new DevToolsAndroidBridge::Wrapper(context); 277 return new DevToolsAndroidBridge::Wrapper(context);
271 } 278 }
272 279
273
274 // AgentHostDelegate ---------------------------------------------------------- 280 // AgentHostDelegate ----------------------------------------------------------
275 281
276 class AgentHostDelegate 282 class AgentHostDelegate
277 : public content::DevToolsExternalAgentProxyDelegate, 283 : public content::DevToolsExternalAgentProxyDelegate,
278 public DevToolsAndroidBridge::AndroidWebSocket::Delegate { 284 public AndroidDeviceManager::AndroidWebSocket::Delegate {
279 public: 285 public:
280 static scoped_refptr<content::DevToolsAgentHost> GetOrCreateAgentHost( 286 static scoped_refptr<content::DevToolsAgentHost> GetOrCreateAgentHost(
287 scoped_refptr<DevToolsAndroidBridge> bridge,
281 const std::string& id, 288 const std::string& id,
282 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser, 289 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser,
283 const std::string& debug_url); 290 const std::string& debug_url);
284 291
285 private: 292 private:
286 AgentHostDelegate( 293 AgentHostDelegate(
294 scoped_refptr<DevToolsAndroidBridge> bridge,
287 const std::string& id, 295 const std::string& id,
288 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser, 296 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser,
289 const std::string& debug_url); 297 const std::string& debug_url);
290 virtual ~AgentHostDelegate(); 298 virtual ~AgentHostDelegate();
291 virtual void Attach(content::DevToolsExternalAgentProxy* proxy) OVERRIDE; 299 virtual void Attach(content::DevToolsExternalAgentProxy* proxy) OVERRIDE;
292 virtual void Detach() OVERRIDE; 300 virtual void Detach() OVERRIDE;
293 virtual void SendMessageToBackend( 301 virtual void SendMessageToBackend(
294 const std::string& message) OVERRIDE; 302 const std::string& message) OVERRIDE;
295 virtual void OnSocketOpened() OVERRIDE; 303 virtual void OnSocketOpened() OVERRIDE;
296 virtual void OnFrameRead(const std::string& message) OVERRIDE; 304 virtual void OnFrameRead(const std::string& message) OVERRIDE;
297 virtual void OnSocketClosed() OVERRIDE; 305 virtual void OnSocketClosed() OVERRIDE;
298 306
299 const std::string id_; 307 std::string id_;
308 scoped_refptr<DevToolsAndroidBridge> bridge_;
300 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser_; 309 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser_;
301 const std::string debug_url_; 310 std::string debug_url_;
302 bool socket_opened_; 311 bool socket_opened_;
303 bool is_web_view_; 312 bool is_web_view_;
304 std::vector<std::string> pending_messages_; 313 std::vector<std::string> pending_messages_;
305 scoped_ptr<DevToolsAndroidBridge::AndroidWebSocket> web_socket_; 314 scoped_ptr<AndroidDeviceManager::AndroidWebSocket> web_socket_;
306 content::DevToolsAgentHost* agent_host_; 315 content::DevToolsAgentHost* agent_host_;
307 content::DevToolsExternalAgentProxy* proxy_; 316 content::DevToolsExternalAgentProxy* proxy_;
308 DISALLOW_COPY_AND_ASSIGN(AgentHostDelegate); 317 DISALLOW_COPY_AND_ASSIGN(AgentHostDelegate);
309 }; 318 };
310 319
311 // static 320 // static
312 scoped_refptr<content::DevToolsAgentHost> 321 scoped_refptr<content::DevToolsAgentHost>
313 AgentHostDelegate::GetOrCreateAgentHost( 322 AgentHostDelegate::GetOrCreateAgentHost(
323 scoped_refptr<DevToolsAndroidBridge> bridge,
314 const std::string& id, 324 const std::string& id,
315 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser, 325 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser,
316 const std::string& debug_url) { 326 const std::string& debug_url) {
317 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 327 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
318 AgentHostDelegates::iterator it = g_host_delegates.Get().find(id); 328 AgentHostDelegates::iterator it = g_host_delegates.Get().find(id);
319 if (it != g_host_delegates.Get().end()) 329 if (it != g_host_delegates.Get().end())
320 return it->second->agent_host_; 330 return it->second->agent_host_;
321 331
322 AgentHostDelegate* delegate = new AgentHostDelegate(id, browser, debug_url); 332 AgentHostDelegate* delegate =
333 new AgentHostDelegate(bridge, id, browser, debug_url);
323 scoped_refptr<content::DevToolsAgentHost> result = 334 scoped_refptr<content::DevToolsAgentHost> result =
324 content::DevToolsAgentHost::Create(delegate); 335 content::DevToolsAgentHost::Create(delegate);
325 delegate->agent_host_ = result.get(); 336 delegate->agent_host_ = result.get();
326 return result; 337 return result;
327 } 338 }
328 339
329 AgentHostDelegate::AgentHostDelegate( 340 AgentHostDelegate::AgentHostDelegate(
341 scoped_refptr<DevToolsAndroidBridge> bridge,
330 const std::string& id, 342 const std::string& id,
331 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser, 343 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser,
332 const std::string& debug_url) 344 const std::string& debug_url)
333 : id_(id), 345 : id_(id),
346 bridge_(bridge),
334 browser_(browser), 347 browser_(browser),
335 debug_url_(debug_url), 348 debug_url_(debug_url),
336 socket_opened_(false), 349 socket_opened_(false),
337 is_web_view_(browser->IsWebView()), 350 is_web_view_(browser->IsWebView()),
338 agent_host_(NULL), 351 agent_host_(NULL),
339 proxy_(NULL) { 352 proxy_(NULL) {
340 g_host_delegates.Get()[id] = this; 353 g_host_delegates.Get()[id] = this;
341 } 354 }
342 355
343 AgentHostDelegate::~AgentHostDelegate() { 356 AgentHostDelegate::~AgentHostDelegate() {
344 g_host_delegates.Get().erase(id_); 357 g_host_delegates.Get().erase(id_);
345 } 358 }
346 359
347 void AgentHostDelegate::Attach(content::DevToolsExternalAgentProxy* proxy) { 360 void AgentHostDelegate::Attach(content::DevToolsExternalAgentProxy* proxy) {
348 proxy_ = proxy; 361 proxy_ = proxy;
349 content::RecordAction(base::UserMetricsAction(is_web_view_ ? 362 content::RecordAction(base::UserMetricsAction(is_web_view_ ?
350 "DevTools_InspectAndroidWebView" : "DevTools_InspectAndroidPage")); 363 "DevTools_InspectAndroidWebView" : "DevTools_InspectAndroidPage"));
351 web_socket_.reset(browser_->CreateWebSocket(debug_url_, this)); 364 web_socket_.reset(
365 bridge_->CreateWebSocket(browser_, debug_url_, this));
352 } 366 }
353 367
354 void AgentHostDelegate::Detach() { 368 void AgentHostDelegate::Detach() {
355 web_socket_.reset(); 369 web_socket_.reset();
356 } 370 }
357 371
358 void AgentHostDelegate::SendMessageToBackend(const std::string& message) { 372 void AgentHostDelegate::SendMessageToBackend(const std::string& message) {
359 if (socket_opened_) 373 if (socket_opened_)
360 web_socket_->SendFrame(message); 374 web_socket_->SendFrame(message);
361 else 375 else
(...skipping 17 matching lines...) Expand all
379 void AgentHostDelegate::OnSocketClosed() { 393 void AgentHostDelegate::OnSocketClosed() {
380 if (proxy_) 394 if (proxy_)
381 proxy_->ConnectionClosed(); 395 proxy_->ConnectionClosed();
382 } 396 }
383 397
384 //// RemotePageTarget ---------------------------------------------- 398 //// RemotePageTarget ----------------------------------------------
385 399
386 class RemotePageTarget : public DevToolsTargetImpl, 400 class RemotePageTarget : public DevToolsTargetImpl,
387 public DevToolsAndroidBridge::RemotePage { 401 public DevToolsAndroidBridge::RemotePage {
388 public: 402 public:
389 RemotePageTarget(scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser, 403 RemotePageTarget(scoped_refptr<DevToolsAndroidBridge> bridge,
404 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser,
390 const base::DictionaryValue& value); 405 const base::DictionaryValue& value);
391 virtual ~RemotePageTarget(); 406 virtual ~RemotePageTarget();
392 407
393 // DevToolsAndroidBridge::RemotePage implementation. 408 // DevToolsAndroidBridge::RemotePage implementation.
394 virtual DevToolsTargetImpl* GetTarget() OVERRIDE; 409 virtual DevToolsTargetImpl* GetTarget() OVERRIDE;
395 virtual std::string GetFrontendURL() OVERRIDE; 410 virtual std::string GetFrontendURL() OVERRIDE;
396 411
397 // DevToolsTargetImpl overrides. 412 // DevToolsTargetImpl overrides.
398 virtual std::string GetId() const OVERRIDE; 413 virtual std::string GetId() const OVERRIDE;
399 virtual bool IsAttached() const OVERRIDE; 414 virtual bool IsAttached() const OVERRIDE;
400 virtual bool Activate() const OVERRIDE; 415 virtual bool Activate() const OVERRIDE;
401 virtual bool Close() const OVERRIDE; 416 virtual bool Close() const OVERRIDE;
402 virtual void Inspect(Profile* profile) const OVERRIDE; 417 virtual void Inspect(Profile* profile) const OVERRIDE;
403 virtual void Reload() const OVERRIDE; 418 virtual void Reload() const OVERRIDE;
404 419
405 void Navigate(const std::string& url, base::Closure callback) const; 420 void Navigate(const std::string& url, base::Closure callback) const;
406 421
407 private: 422 private:
423 scoped_refptr<DevToolsAndroidBridge> bridge_;
408 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser_; 424 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser_;
409 std::string debug_url_; 425 std::string debug_url_;
410 std::string frontend_url_; 426 std::string frontend_url_;
411 std::string remote_id_; 427 std::string remote_id_;
412 std::string remote_type_; 428 std::string remote_type_;
413 DISALLOW_COPY_AND_ASSIGN(RemotePageTarget); 429 DISALLOW_COPY_AND_ASSIGN(RemotePageTarget);
414 }; 430 };
415 431
416 static std::string GetStringProperty(const base::DictionaryValue& value, 432 static std::string GetStringProperty(const base::DictionaryValue& value,
417 const std::string& name) { 433 const std::string& name) {
418 std::string result; 434 std::string result;
419 value.GetString(name, &result); 435 value.GetString(name, &result);
420 return result; 436 return result;
421 } 437 }
422 438
423 static std::string BuildUniqueTargetId( 439 static std::string BuildUniqueTargetId(
424 DevToolsAndroidBridge::RemoteBrowser* browser, 440 DevToolsAndroidBridge::RemoteBrowser* browser,
425 const base::DictionaryValue& value) { 441 const base::DictionaryValue& value) {
426 return base::StringPrintf("%s:%s:%s", browser->serial().c_str(), 442 return base::StringPrintf("%s:%s:%s", browser->serial().c_str(),
427 browser->socket().c_str(), GetStringProperty(value, "id").c_str()); 443 browser->socket().c_str(), GetStringProperty(value, "id").c_str());
428 } 444 }
429 445
430 static std::string GetDebugURL(const base::DictionaryValue& value) { 446 static std::string GetDebugURL(const base::DictionaryValue& value) {
431 std::string debug_url = GetStringProperty(value, "webSocketDebuggerUrl"); 447 std::string debug_url = GetStringProperty(value, "webSocketDebuggerUrl");
432 448
433 if (debug_url.find("ws://") == 0) 449 if (debug_url.find("ws://") == 0)
434 debug_url = debug_url.substr(5); 450 debug_url = debug_url.substr(5);
435 else 451 else
436 debug_url = ""; 452 debug_url = std::string();
437 return debug_url; 453 return debug_url;
438 } 454 }
439 455
440 RemotePageTarget::RemotePageTarget( 456 RemotePageTarget::RemotePageTarget(
457 scoped_refptr<DevToolsAndroidBridge> bridge,
441 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser, 458 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser,
442 const base::DictionaryValue& value) 459 const base::DictionaryValue& value)
443 : DevToolsTargetImpl(AgentHostDelegate::GetOrCreateAgentHost( 460 : DevToolsTargetImpl(AgentHostDelegate::GetOrCreateAgentHost(
461 bridge,
444 BuildUniqueTargetId(browser.get(), value), 462 BuildUniqueTargetId(browser.get(), value),
445 browser, GetDebugURL(value))), 463 browser,
464 GetDebugURL(value))),
465 bridge_(bridge),
446 browser_(browser), 466 browser_(browser),
447 debug_url_(GetDebugURL(value)), 467 debug_url_(GetDebugURL(value)),
448 remote_id_(GetStringProperty(value, "id")), 468 remote_id_(GetStringProperty(value, "id")),
449 remote_type_(GetStringProperty(value, "type")) { 469 remote_type_(GetStringProperty(value, "type")) {
450 set_type("adb_page"); 470 set_type("adb_page");
451 set_url(GURL(GetStringProperty(value, "url"))); 471 set_url(GURL(GetStringProperty(value, "url")));
452 set_title(base::UTF16ToUTF8(net::UnescapeForHTML(base::UTF8ToUTF16( 472 set_title(base::UTF16ToUTF8(net::UnescapeForHTML(base::UTF8ToUTF16(
453 GetStringProperty(value, "title"))))); 473 GetStringProperty(value, "title")))));
454 set_description(GetStringProperty(value, "description")); 474 set_description(GetStringProperty(value, "description"));
455 set_favicon_url(GURL(GetStringProperty(value, "faviconUrl"))); 475 set_favicon_url(GURL(GetStringProperty(value, "faviconUrl")));
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
488 Activate(); 508 Activate();
489 bool isWorker = remote_type_ == kTargetTypeWorker || 509 bool isWorker = remote_type_ == kTargetTypeWorker ||
490 remote_type_ == kTargetTypeServiceWorker; 510 remote_type_ == kTargetTypeServiceWorker;
491 DevToolsWindow::OpenExternalFrontend(profile, frontend_url_, GetAgentHost(), 511 DevToolsWindow::OpenExternalFrontend(profile, frontend_url_, GetAgentHost(),
492 isWorker); 512 isWorker);
493 } 513 }
494 514
495 bool RemotePageTarget::Activate() const { 515 bool RemotePageTarget::Activate() const {
496 std::string request = base::StringPrintf(kActivatePageRequest, 516 std::string request = base::StringPrintf(kActivatePageRequest,
497 remote_id_.c_str()); 517 remote_id_.c_str());
498 browser_->SendJsonRequest(request, base::Bind(&NoOp)); 518 bridge_->SendJsonRequest(browser_, request, base::Bind(&NoOp));
499 return true; 519 return true;
500 } 520 }
501 521
502 bool RemotePageTarget::Close() const { 522 bool RemotePageTarget::Close() const {
503 std::string request = base::StringPrintf(kClosePageRequest, 523 std::string request = base::StringPrintf(kClosePageRequest,
504 remote_id_.c_str()); 524 remote_id_.c_str());
505 browser_->SendJsonRequest(request, base::Bind(&NoOp)); 525 bridge_->SendJsonRequest(browser_, request, base::Bind(&NoOp));
506 return true; 526 return true;
507 } 527 }
508 528
509 void RemotePageTarget::Reload() const { 529 void RemotePageTarget::Reload() const {
510 browser_->SendProtocolCommand(debug_url_, kPageReloadCommand, NULL, 530 bridge_->SendProtocolCommand(browser_, debug_url_, kPageReloadCommand,
511 base::Closure()); 531 NULL, base::Closure());
512 } 532 }
513 533
514 void RemotePageTarget::Navigate(const std::string& url, 534 void RemotePageTarget::Navigate(const std::string& url,
515 base::Closure callback) const { 535 base::Closure callback) const {
516 base::DictionaryValue params; 536 base::DictionaryValue params;
517 params.SetString(kUrlParam, url); 537 params.SetString(kUrlParam, url);
518 browser_->SendProtocolCommand(debug_url_, kPageNavigateCommand, &params, 538 bridge_->SendProtocolCommand(browser_, debug_url_, kPageNavigateCommand,
519 callback); 539 &params, callback);
520 } 540 }
521 541
522 // DevToolsAndroidBridge::RemoteBrowser --------------------------------------- 542 // DevToolsAndroidBridge::RemoteBrowser ---------------------------------------
523 543
524 DevToolsAndroidBridge::RemoteBrowser::RemoteBrowser( 544 DevToolsAndroidBridge::RemoteBrowser::RemoteBrowser(
525 scoped_refptr<Device> device, 545 const std::string& serial,
526 const AndroidDeviceManager::BrowserInfo& browser_info) 546 const AndroidDeviceManager::BrowserInfo& browser_info)
527 : device_(device), 547 : serial_(serial),
528 socket_(browser_info.socket_name), 548 socket_(browser_info.socket_name),
529 display_name_(browser_info.display_name), 549 display_name_(browser_info.display_name),
530 type_(browser_info.type), 550 type_(browser_info.type),
531 page_descriptors_(new base::ListValue()) { 551 page_descriptors_(new base::ListValue()) {
532 } 552 }
533 553
534 bool DevToolsAndroidBridge::RemoteBrowser::IsChrome() const { 554 bool DevToolsAndroidBridge::RemoteBrowser::IsChrome() {
535 return type_ == AndroidDeviceManager::BrowserInfo::kTypeChrome; 555 return type_ == AndroidDeviceManager::BrowserInfo::kTypeChrome;
536 } 556 }
537 557
538 bool DevToolsAndroidBridge::RemoteBrowser::IsWebView() const { 558 bool DevToolsAndroidBridge::RemoteBrowser::IsWebView() {
539 return type_ == AndroidDeviceManager::BrowserInfo::kTypeWebView; 559 return type_ == AndroidDeviceManager::BrowserInfo::kTypeWebView;
540 } 560 }
541 561
542 DevToolsAndroidBridge::RemoteBrowser::ParsedVersion 562 DevToolsAndroidBridge::RemoteBrowser::ParsedVersion
543 DevToolsAndroidBridge::RemoteBrowser::GetParsedVersion() const { 563 DevToolsAndroidBridge::RemoteBrowser::GetParsedVersion() {
544 ParsedVersion result; 564 ParsedVersion result;
545 std::vector<std::string> parts; 565 std::vector<std::string> parts;
546 Tokenize(version_, ".", &parts); 566 Tokenize(version_, ".", &parts);
547 for (size_t i = 0; i != parts.size(); ++i) { 567 for (size_t i = 0; i != parts.size(); ++i) {
548 int value = 0; 568 int value = 0;
549 base::StringToInt(parts[i], &value); 569 base::StringToInt(parts[i], &value);
550 result.push_back(value); 570 result.push_back(value);
551 } 571 }
552 return result; 572 return result;
553 } 573 }
554 574
555 std::vector<DevToolsAndroidBridge::RemotePage*> 575 std::vector<DevToolsAndroidBridge::RemotePage*>
556 DevToolsAndroidBridge::RemoteBrowser::CreatePages() { 576 DevToolsAndroidBridge::CreatePages(scoped_refptr<RemoteBrowser> browser) {
557 std::vector<DevToolsAndroidBridge::RemotePage*> result; 577 std::vector<RemotePage*> result;
558 for (size_t i = 0; i < page_descriptors_->GetSize(); ++i) { 578 for (base::ListValue::const_iterator it = browser->page_descriptors().begin();
559 base::Value* item; 579 it != browser->page_descriptors().end(); ++it) {
560 page_descriptors_->Get(i, &item);
561 if (!item)
562 continue;
563 base::DictionaryValue* dict; 580 base::DictionaryValue* dict;
564 if (!item->GetAsDictionary(&dict)) 581 if (*it && (*it)->GetAsDictionary(&dict))
565 continue; 582 result.push_back(new RemotePageTarget(this, browser, *dict));
566 result.push_back(new RemotePageTarget(this, *dict));
567 } 583 }
568 return result; 584 return result;
569 } 585 }
570 586
571 void DevToolsAndroidBridge::RemoteBrowser::SetPageDescriptors( 587 const base::ListValue&
588 DevToolsAndroidBridge::RemoteBrowser::page_descriptors() {
589 return *page_descriptors_;
590 }
591
592 void DevToolsAndroidBridge::RemoteBrowser::set_page_descriptors(
572 const base::ListValue& list) { 593 const base::ListValue& list) {
573 page_descriptors_.reset(list.DeepCopy()); 594 page_descriptors_.reset(list.DeepCopy());
574 } 595 }
575 596
576 static void RespondOnUIThread( 597 void DevToolsAndroidBridge::SendJsonRequest(
577 const DevToolsAndroidBridge::JsonRequestCallback& callback, 598 scoped_refptr<RemoteBrowser> browser,
578 int result, 599 const std::string& request,
579 const std::string& response) { 600 const JsonRequestCallback& callback) {
580 if (callback.is_null()) 601 DeviceMap::iterator it = device_map_.find(browser->serial());
602 if (it == device_map_.end()) {
603 callback.Run(net::ERR_FAILED, std::string());
581 return; 604 return;
582 BrowserThread::PostTask( 605 }
583 BrowserThread::UI, FROM_HERE, base::Bind(callback, result, response)); 606 it->second->SendJsonRequest(browser->socket(), request, callback);
584 } 607 }
585 608
586 void DevToolsAndroidBridge::RemoteBrowser::SendJsonRequest( 609 void DevToolsAndroidBridge::SendProtocolCommand(
587 const std::string& request, const JsonRequestCallback& callback) { 610 scoped_refptr<RemoteBrowser> browser,
588 device_->SendJsonRequest(socket_, request, callback);
589 }
590
591 void DevToolsAndroidBridge::RemoteBrowser::SendProtocolCommand(
592 const std::string& debug_url, 611 const std::string& debug_url,
593 const std::string& method, 612 const std::string& method,
594 base::DictionaryValue* params, 613 base::DictionaryValue* params,
595 const base::Closure callback) { 614 const base::Closure callback) {
596 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 615 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
597 if (debug_url.empty()) 616 if (debug_url.empty())
598 return; 617 return;
618 DeviceMap::iterator it = device_map_.find(browser->serial());
619 if (it == device_map_.end()) {
620 callback.Run();
621 return;
622 }
599 DevToolsProtocol::Command command(1, method, params); 623 DevToolsProtocol::Command command(1, method, params);
600 new ProtocolCommand(this, debug_url, command.Serialize(), callback); 624 new ProtocolCommand(it->second, browser->socket(), debug_url,
601 } 625 command.Serialize(), callback);
602
603 void DevToolsAndroidBridge::RemoteBrowser::Open(
604 const std::string& url,
605 const DevToolsAndroidBridge::RemotePageCallback& callback) {
606 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
607 InnerOpen(url, base::Bind(&RemoteBrowser::RespondToOpenOnUIThread,
608 this, callback));
609 } 626 }
610 627
611 scoped_refptr<content::DevToolsAgentHost> 628 scoped_refptr<content::DevToolsAgentHost>
612 DevToolsAndroidBridge::RemoteBrowser::GetAgentHost() { 629 DevToolsAndroidBridge::GetAgentHost(scoped_refptr<RemoteBrowser> browser) {
613 return AgentHostDelegate::GetOrCreateAgentHost( 630 return AgentHostDelegate::GetOrCreateAgentHost(
614 "adb:" + device_->serial() + ":" + socket_, this, kBrowserTargetSocket); 631 this,
632 "adb:" + browser->serial() + ":" + browser->socket(),
633 browser,
634 kBrowserTargetSocket);
615 } 635 }
616 636
617 DevToolsAndroidBridge::AndroidWebSocket* 637 AndroidDeviceManager::AndroidWebSocket*
618 DevToolsAndroidBridge::RemoteBrowser::CreateWebSocket( 638 DevToolsAndroidBridge::CreateWebSocket(
639 scoped_refptr<RemoteBrowser> browser,
619 const std::string& url, 640 const std::string& url,
620 DevToolsAndroidBridge::AndroidWebSocket::Delegate* delegate) { 641 AndroidDeviceManager::AndroidWebSocket::Delegate* delegate) {
621 return device_->CreateWebSocket(socket_, url, delegate); 642 DeviceMap::iterator it = device_map_.find(browser->serial());
643 if (it == device_map_.end())
644 return NULL;
645
646 return it->second->CreateWebSocket(browser->socket(), url, delegate);
622 } 647 }
623 648
624 void DevToolsAndroidBridge::RemoteBrowser::RespondToOpenOnUIThread( 649 void DevToolsAndroidBridge::RespondToOpenOnUIThread(
625 const DevToolsAndroidBridge::RemotePageCallback& callback, 650 scoped_refptr<RemoteBrowser> browser,
651 const RemotePageCallback& callback,
626 int result, 652 int result,
627 const std::string& response) { 653 const std::string& response) {
628 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 654 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
629 if (result < 0) { 655 if (result < 0) {
630 callback.Run(NULL); 656 callback.Run(NULL);
631 return; 657 return;
632 } 658 }
633 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); 659 scoped_ptr<base::Value> value(base::JSONReader::Read(response));
634 base::DictionaryValue* dict; 660 base::DictionaryValue* dict;
635 if (value && value->GetAsDictionary(&dict)) { 661 if (value && value->GetAsDictionary(&dict)) {
636 RemotePageTarget* new_page = new RemotePageTarget(this, *dict); 662 RemotePageTarget* new_page = new RemotePageTarget(this, browser, *dict);
637 callback.Run(new_page); 663 callback.Run(new_page);
638 } 664 }
639 } 665 }
640 666
641 void DevToolsAndroidBridge::RemoteBrowser::InnerOpen( 667 void DevToolsAndroidBridge::Open(
668 scoped_refptr<RemoteBrowser> browser,
642 const std::string& input_url, 669 const std::string& input_url,
643 const JsonRequestCallback& callback) { 670 const DevToolsAndroidBridge::RemotePageCallback& callback) {
644 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 671 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
645 GURL gurl(input_url); 672 GURL gurl(input_url);
646 if (!gurl.is_valid()) { 673 if (!gurl.is_valid()) {
647 gurl = GURL("http://" + input_url); 674 gurl = GURL("http://" + input_url);
648 if (!gurl.is_valid()) 675 if (!gurl.is_valid())
649 return; 676 return;
650 } 677 }
651 std::string url = gurl.spec(); 678 std::string url = gurl.spec();
679 RemoteBrowser::ParsedVersion parsed_version = browser->GetParsedVersion();
652 680
653 ParsedVersion parsed_version = GetParsedVersion(); 681 if (browser->IsChrome() &&
654 if (IsChrome() &&
655 !parsed_version.empty() && 682 !parsed_version.empty() &&
656 parsed_version[0] >= kMinVersionNewWithURL) { 683 parsed_version[0] >= kMinVersionNewWithURL) {
657 std::string query = net::EscapeQueryParamValue(url, false /* use_plus */); 684 std::string query = net::EscapeQueryParamValue(url, false /* use_plus */);
658 std::string request = 685 std::string request =
659 base::StringPrintf(kNewPageRequestWithURL, query.c_str()); 686 base::StringPrintf(kNewPageRequestWithURL, query.c_str());
660 SendJsonRequest(request, callback); 687 SendJsonRequest(browser, request,
688 base::Bind(&DevToolsAndroidBridge::RespondToOpenOnUIThread,
689 this, browser, callback));
661 } else { 690 } else {
662 SendJsonRequest(kNewPageRequest, 691 SendJsonRequest(browser, kNewPageRequest,
663 base::Bind(&RemoteBrowser::PageCreatedOnUIThread, this, 692 base::Bind(&DevToolsAndroidBridge::PageCreatedOnUIThread,
664 callback, url)); 693 this, browser, callback, url));
665 } 694 }
666 } 695 }
667 696
668 void DevToolsAndroidBridge::RemoteBrowser::PageCreatedOnUIThread( 697 void DevToolsAndroidBridge::PageCreatedOnUIThread(
669 const JsonRequestCallback& callback, 698 scoped_refptr<RemoteBrowser> browser,
670 const std::string& url, int result, const std::string& response) { 699 const RemotePageCallback& callback,
700 const std::string& url,
701 int result,
702 const std::string& response) {
671 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 703 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
672 704
673 if (result < 0) 705 if (result < 0)
674 return; 706 return;
675 // Navigating too soon after the page creation breaks navigation history 707 // Navigating too soon after the page creation breaks navigation history
676 // (crbug.com/311014). This can be avoided by adding a moderate delay. 708 // (crbug.com/311014). This can be avoided by adding a moderate delay.
677 BrowserThread::PostDelayedTask( 709 BrowserThread::PostDelayedTask(
678 BrowserThread::UI, FROM_HERE, 710 BrowserThread::UI, FROM_HERE,
679 base::Bind(&RemoteBrowser::NavigatePageOnUIThread, 711 base::Bind(&DevToolsAndroidBridge::NavigatePageOnUIThread,
680 this, callback, result, response, url), 712 this, browser, callback, result, response, url),
681 base::TimeDelta::FromMilliseconds(kNewPageNavigateDelayMs)); 713 base::TimeDelta::FromMilliseconds(kNewPageNavigateDelayMs));
682 } 714 }
683 715
684 void DevToolsAndroidBridge::RemoteBrowser::NavigatePageOnUIThread( 716 void DevToolsAndroidBridge::NavigatePageOnUIThread(
685 const JsonRequestCallback& callback, 717 scoped_refptr<RemoteBrowser> browser,
686 int result, const std::string& response, const std::string& url) { 718 const RemotePageCallback& callback,
719 int result,
720 const std::string& response,
721 const std::string& url) {
687 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 722 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
688 scoped_ptr<base::Value> value(base::JSONReader::Read(response)); 723 scoped_ptr<base::Value> value(base::JSONReader::Read(response));
689 base::DictionaryValue* dict; 724 base::DictionaryValue* dict;
690 725
691 if (value && value->GetAsDictionary(&dict)) { 726 if (value && value->GetAsDictionary(&dict)) {
692 RemotePageTarget new_page(this, *dict); 727 RemotePageTarget new_page(this, browser, *dict);
693 new_page.Navigate(url, 728 new_page.Navigate(url,
694 base::Bind(&RespondOnUIThread, callback, result, response)); 729 base::Bind(&DevToolsAndroidBridge::RespondToOpenOnUIThread,
730 this, browser, callback, result, response));
695 } 731 }
696 } 732 }
697 733
698 DevToolsAndroidBridge::RemoteBrowser::~RemoteBrowser() { 734 DevToolsAndroidBridge::RemoteBrowser::~RemoteBrowser() {
699 } 735 }
700 736
701 // DevToolsAndroidBridge::RemoteDevice ---------------------------------------- 737 // DevToolsAndroidBridge::RemoteDevice ----------------------------------------
702 738
703 DevToolsAndroidBridge::RemoteDevice::RemoteDevice( 739 DevToolsAndroidBridge::RemoteDevice::RemoteDevice(
704 scoped_refptr<AndroidDeviceManager::Device> device, 740 const std::string& serial,
705 const AndroidDeviceManager::DeviceInfo& device_info) 741 const AndroidDeviceManager::DeviceInfo& device_info)
706 : device_(device), 742 : serial_(serial),
707 model_(device_info.model), 743 model_(device_info.model),
708 connected_(device_info.connected), 744 connected_(device_info.connected),
709 screen_size_(device_info.screen_size) { 745 screen_size_(device_info.screen_size) {
710 for (std::vector<AndroidDeviceManager::BrowserInfo>::const_iterator it = 746 for (std::vector<AndroidDeviceManager::BrowserInfo>::const_iterator it =
711 device_info.browser_info.begin(); 747 device_info.browser_info.begin();
712 it != device_info.browser_info.end(); 748 it != device_info.browser_info.end();
713 ++it) { 749 ++it) {
714 browsers_.push_back(new DevToolsAndroidBridge::RemoteBrowser(device, *it)); 750 browsers_.push_back(new RemoteBrowser(serial, *it));
715 } 751 }
716 } 752 }
717 753
718 void DevToolsAndroidBridge::RemoteDevice::OpenSocket(
719 const std::string& socket_name,
720 const AndroidDeviceManager::SocketCallback& callback) {
721 device_->OpenSocket(socket_name, callback);
722 }
723
724 DevToolsAndroidBridge::RemoteDevice::~RemoteDevice() { 754 DevToolsAndroidBridge::RemoteDevice::~RemoteDevice() {
725 } 755 }
726 756
727 // DevToolsAndroidBridge ------------------------------------------------------ 757 // DevToolsAndroidBridge ------------------------------------------------------
728 758
729 DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile) 759 DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile)
730 : profile_(profile), 760 : profile_(profile),
731 device_manager_(AndroidDeviceManager::Create()), 761 device_manager_(AndroidDeviceManager::Create()),
732 task_scheduler_(base::Bind(&DevToolsAndroidBridge::ScheduleTaskDefault)), 762 task_scheduler_(base::Bind(&DevToolsAndroidBridge::ScheduleTaskDefault)),
733 port_forwarding_controller_(new PortForwardingController(profile)) { 763 port_forwarding_controller_(new PortForwardingController(profile)) {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
811 } 841 }
812 842
813 void DevToolsAndroidBridge::StartDeviceListPolling() { 843 void DevToolsAndroidBridge::StartDeviceListPolling() {
814 device_list_callback_.Reset( 844 device_list_callback_.Reset(
815 base::Bind(&DevToolsAndroidBridge::ReceivedDeviceList, this)); 845 base::Bind(&DevToolsAndroidBridge::ReceivedDeviceList, this));
816 RequestDeviceList(device_list_callback_.callback()); 846 RequestDeviceList(device_list_callback_.callback());
817 } 847 }
818 848
819 void DevToolsAndroidBridge::StopDeviceListPolling() { 849 void DevToolsAndroidBridge::StopDeviceListPolling() {
820 device_list_callback_.Cancel(); 850 device_list_callback_.Cancel();
821 devices_.clear(); 851 device_map_.clear();
822 } 852 }
823 853
824 bool DevToolsAndroidBridge::NeedsDeviceListPolling() { 854 bool DevToolsAndroidBridge::NeedsDeviceListPolling() {
825 return !device_list_listeners_.empty() || !port_forwarding_listeners_.empty(); 855 return !device_list_listeners_.empty() || !port_forwarding_listeners_.empty();
826 } 856 }
827 857
828 void DevToolsAndroidBridge::RequestDeviceList( 858 void DevToolsAndroidBridge::RequestDeviceList(
829 const base::Callback<void(const RemoteDevices&)>& callback) { 859 const DeviceListCallback& callback) {
830 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 860 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
831 861
832 if (!NeedsDeviceListPolling() || 862 if (!NeedsDeviceListPolling() ||
833 !callback.Equals(device_list_callback_.callback())) 863 !callback.Equals(device_list_callback_.callback()))
834 return; 864 return;
835 865
836 new DiscoveryRequest(device_manager_.get(), callback); 866 new DiscoveryRequest(device_manager_.get(), callback);
837 } 867 }
838 868
839 void DevToolsAndroidBridge::ReceivedDeviceList(const RemoteDevices& devices) { 869 void DevToolsAndroidBridge::ReceivedDeviceList(
870 const AndroidDeviceManager::Devices& devices,
871 const RemoteDevices& remote_devices) {
840 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 872 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
841 873
874 device_map_.clear();
875 for (AndroidDeviceManager::Devices::const_iterator it = devices.begin();
876 it != devices.end(); ++it) {
877 device_map_[(*it)->serial()] = *it;
878 }
879
842 DeviceListListeners copy(device_list_listeners_); 880 DeviceListListeners copy(device_list_listeners_);
843 for (DeviceListListeners::iterator it = copy.begin(); it != copy.end(); ++it) 881 for (DeviceListListeners::iterator it = copy.begin(); it != copy.end(); ++it)
844 (*it)->DeviceListChanged(devices); 882 (*it)->DeviceListChanged(remote_devices);
845 883
846 DevicesStatus status = 884 DevicesStatus status =
847 port_forwarding_controller_->DeviceListChanged(devices); 885 port_forwarding_controller_->DeviceListChanged(device_map_,
886 remote_devices);
848 PortForwardingListeners forwarding_listeners(port_forwarding_listeners_); 887 PortForwardingListeners forwarding_listeners(port_forwarding_listeners_);
849 for (PortForwardingListeners::iterator it = forwarding_listeners.begin(); 888 for (PortForwardingListeners::iterator it = forwarding_listeners.begin();
850 it != forwarding_listeners.end(); ++it) { 889 it != forwarding_listeners.end(); ++it) {
851 (*it)->PortStatusChanged(status); 890 (*it)->PortStatusChanged(status);
852 } 891 }
853 892
854 if (!NeedsDeviceListPolling()) 893 if (!NeedsDeviceListPolling())
855 return; 894 return;
856 895
857 devices_ = devices;
858
859 task_scheduler_.Run( 896 task_scheduler_.Run(
860 base::Bind(&DevToolsAndroidBridge::RequestDeviceList, 897 base::Bind(&DevToolsAndroidBridge::RequestDeviceList,
861 this, device_list_callback_.callback())); 898 this, device_list_callback_.callback()));
862 } 899 }
863 900
864 void DevToolsAndroidBridge::StartDeviceCountPolling() { 901 void DevToolsAndroidBridge::StartDeviceCountPolling() {
865 device_count_callback_.Reset( 902 device_count_callback_.Reset(
866 base::Bind(&DevToolsAndroidBridge::ReceivedDeviceCount, this)); 903 base::Bind(&DevToolsAndroidBridge::ReceivedDeviceCount, this));
867 RequestDeviceCount(device_count_callback_.callback()); 904 RequestDeviceCount(device_count_callback_.callback());
868 } 905 }
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
925 bool enabled; 962 bool enabled;
926 if (pref_value->GetAsBoolean(&enabled) && enabled) { 963 if (pref_value->GetAsBoolean(&enabled) && enabled) {
927 device_providers.push_back(new UsbDeviceProvider(profile_)); 964 device_providers.push_back(new UsbDeviceProvider(profile_));
928 } 965 }
929 device_manager_->SetDeviceProviders(device_providers); 966 device_manager_->SetDeviceProviders(device_providers);
930 if (NeedsDeviceListPolling()) { 967 if (NeedsDeviceListPolling()) {
931 StopDeviceListPolling(); 968 StopDeviceListPolling();
932 StartDeviceListPolling(); 969 StartDeviceListPolling();
933 } 970 }
934 } 971 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698