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

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

Issue 644963003: [DevTools] Port forwarding doesn't keep USB connection (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git/+/websocket
Patch Set: Rebased 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
« no previous file with comments | « chrome/browser/devtools/device/port_forwarding_controller.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/port_forwarding_controller.h" 5 #include "chrome/browser/devtools/device/port_forwarding_controller.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 } 247 }
248 } 248 }
249 return best_browser; 249 return best_browser;
250 } 250 }
251 251
252 } // namespace 252 } // namespace
253 253
254 class PortForwardingController::Connection 254 class PortForwardingController::Connection
255 : public AndroidDeviceManager::AndroidWebSocket::Delegate { 255 : public AndroidDeviceManager::AndroidWebSocket::Delegate {
256 public: 256 public:
257 Connection(Registry* registry, 257 Connection(PortForwardingController* controller,
258 scoped_refptr<AndroidDeviceManager::Device> device,
259 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser, 258 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser,
260 const ForwardingMap& forwarding_map); 259 const ForwardingMap& forwarding_map);
261 ~Connection() override; 260 ~Connection() override;
262 261
263 const PortStatusMap& GetPortStatusMap(); 262 const PortStatusMap& GetPortStatusMap();
264 263
265 void UpdateForwardingMap(const ForwardingMap& new_forwarding_map); 264 void UpdateForwardingMap(const ForwardingMap& new_forwarding_map);
266 265
267 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser() { 266 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser() {
268 return browser_; 267 return browser_;
269 } 268 }
270 269
271 private: 270 private:
272 friend struct content::BrowserThread::DeleteOnThread< 271 friend struct content::BrowserThread::DeleteOnThread<
273 content::BrowserThread::UI>; 272 content::BrowserThread::UI>;
274 friend class base::DeleteHelper<Connection>; 273 friend class base::DeleteHelper<Connection>;
275 274
276
277 typedef std::map<int, std::string> ForwardingMap; 275 typedef std::map<int, std::string> ForwardingMap;
278
279 typedef base::Callback<void(PortStatus)> CommandCallback; 276 typedef base::Callback<void(PortStatus)> CommandCallback;
280 typedef std::map<int, CommandCallback> CommandCallbackMap; 277 typedef std::map<int, CommandCallback> CommandCallbackMap;
281 278
282 void SerializeChanges(const std::string& method, 279 void SerializeChanges(const std::string& method,
283 const ForwardingMap& old_map, 280 const ForwardingMap& old_map,
284 const ForwardingMap& new_map); 281 const ForwardingMap& new_map);
285 282
286 void SendCommand(const std::string& method, int port); 283 void SendCommand(const std::string& method, int port);
287 bool ProcessResponse(const std::string& json); 284 bool ProcessResponse(const std::string& json);
288 285
289 void ProcessBindResponse(int port, PortStatus status); 286 void ProcessBindResponse(int port, PortStatus status);
290 void ProcessUnbindResponse(int port, PortStatus status); 287 void ProcessUnbindResponse(int port, PortStatus status);
291 288
292 static void UpdateSocketCountOnHandlerThread( 289 static void UpdateSocketCountOnHandlerThread(
293 base::WeakPtr<Connection> weak_connection, int port, int increment); 290 base::WeakPtr<Connection> weak_connection, int port, int increment);
294 void UpdateSocketCount(int port, int increment); 291 void UpdateSocketCount(int port, int increment);
295 292
296 // DevToolsAndroidBridge::AndroidWebSocket::Delegate implementation: 293 // DevToolsAndroidBridge::AndroidWebSocket::Delegate implementation:
297 void OnSocketOpened() override; 294 void OnSocketOpened() override;
298 void OnFrameRead(const std::string& message) override; 295 void OnFrameRead(const std::string& message) override;
299 void OnSocketClosed() override; 296 void OnSocketClosed() override;
300 297
301 PortForwardingController::Registry* registry_; 298 PortForwardingController* controller_;
302 scoped_refptr<AndroidDeviceManager::Device> device_;
303 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser_; 299 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser_;
304 scoped_ptr<AndroidDeviceManager::AndroidWebSocket> web_socket_; 300 scoped_ptr<AndroidDeviceManager::AndroidWebSocket> web_socket_;
305 int command_id_; 301 int command_id_;
306 bool connected_; 302 bool connected_;
307 ForwardingMap forwarding_map_; 303 ForwardingMap forwarding_map_;
308 CommandCallbackMap pending_responses_; 304 CommandCallbackMap pending_responses_;
309 PortStatusMap port_status_; 305 PortStatusMap port_status_;
310 base::WeakPtrFactory<Connection> weak_factory_; 306 base::WeakPtrFactory<Connection> weak_factory_;
311 307
312 DISALLOW_COPY_AND_ASSIGN(Connection); 308 DISALLOW_COPY_AND_ASSIGN(Connection);
313 }; 309 };
314 310
315 PortForwardingController::Connection::Connection( 311 PortForwardingController::Connection::Connection(
316 Registry* registry, 312 PortForwardingController* controller,
317 scoped_refptr<AndroidDeviceManager::Device> device,
318 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser, 313 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser,
319 const ForwardingMap& forwarding_map) 314 const ForwardingMap& forwarding_map)
320 : registry_(registry), 315 : controller_(controller),
321 device_(device),
322 browser_(browser), 316 browser_(browser),
323 command_id_(0), 317 command_id_(0),
324 connected_(false), 318 connected_(false),
325 forwarding_map_(forwarding_map), 319 forwarding_map_(forwarding_map),
326 weak_factory_(this) { 320 weak_factory_(this) {
327 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 321 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
328 (*registry_)[device_->serial()] = this; 322 controller_->registry_[browser->serial()] = this;
323 scoped_refptr<AndroidDeviceManager::Device> device(
324 controller_->bridge_->FindDevice(browser->serial()));
325 DCHECK(device.get());
329 web_socket_.reset( 326 web_socket_.reset(
330 device_->CreateWebSocket(browser->socket(), 327 device->CreateWebSocket(browser->socket(),
331 kDevToolsRemoteBrowserTarget, this)); 328 kDevToolsRemoteBrowserTarget, this));
332 } 329 }
333 330
334 PortForwardingController::Connection::~Connection() { 331 PortForwardingController::Connection::~Connection() {
335
336 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 332 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
337 DCHECK(registry_->find(device_->serial()) != registry_->end()); 333 DCHECK(controller_->registry_.find(browser_->serial()) !=
338 registry_->erase(device_->serial()); 334 controller_->registry_.end());
335 controller_->registry_.erase(browser_->serial());
339 } 336 }
340 337
341 void PortForwardingController::Connection::UpdateForwardingMap( 338 void PortForwardingController::Connection::UpdateForwardingMap(
342 const ForwardingMap& new_forwarding_map) { 339 const ForwardingMap& new_forwarding_map) {
343 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 340 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
344 if (connected_) { 341 if (connected_) {
345 SerializeChanges(tethering::unbind::kName, 342 SerializeChanges(tethering::unbind::kName,
346 new_forwarding_map, forwarding_map_); 343 new_forwarding_map, forwarding_map_);
347 SerializeChanges(tethering::bind::kName, 344 SerializeChanges(tethering::bind::kName,
348 forwarding_map_, new_forwarding_map); 345 forwarding_map_, new_forwarding_map);
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
508 Tokenize(location, ":", &tokens); 505 Tokenize(location, ":", &tokens);
509 int destination_port = 0; 506 int destination_port = 0;
510 if (tokens.size() != 2 || !base::StringToInt(tokens[1], &destination_port)) 507 if (tokens.size() != 2 || !base::StringToInt(tokens[1], &destination_port))
511 return; 508 return;
512 std::string destination_host = tokens[0]; 509 std::string destination_host = tokens[0];
513 510
514 SocketTunnel::CounterCallback callback = 511 SocketTunnel::CounterCallback callback =
515 base::Bind(&Connection::UpdateSocketCountOnHandlerThread, 512 base::Bind(&Connection::UpdateSocketCountOnHandlerThread,
516 weak_factory_.GetWeakPtr(), port); 513 weak_factory_.GetWeakPtr(), port);
517 514
518 device_->OpenSocket( 515 scoped_refptr<AndroidDeviceManager::Device> device(
516 controller_->bridge_->FindDevice(browser_->serial()));
517 DCHECK(device.get());
518 device->OpenSocket(
519 connection_id.c_str(), 519 connection_id.c_str(),
520 base::Bind(&SocketTunnel::StartTunnel, 520 base::Bind(&SocketTunnel::StartTunnel,
521 destination_host, 521 destination_host,
522 destination_port, 522 destination_port,
523 callback)); 523 callback));
524 } 524 }
525 525
526 PortForwardingController::PortForwardingController(Profile* profile) 526 PortForwardingController::PortForwardingController(
527 Profile* profile,
528 DevToolsAndroidBridge* bridge)
527 : profile_(profile), 529 : profile_(profile),
530 bridge_(bridge),
528 pref_service_(profile->GetPrefs()) { 531 pref_service_(profile->GetPrefs()) {
529 pref_change_registrar_.Init(pref_service_); 532 pref_change_registrar_.Init(pref_service_);
530 base::Closure callback = base::Bind( 533 base::Closure callback = base::Bind(
531 &PortForwardingController::OnPrefsChange, base::Unretained(this)); 534 &PortForwardingController::OnPrefsChange, base::Unretained(this));
532 pref_change_registrar_.Add(prefs::kDevToolsPortForwardingEnabled, callback); 535 pref_change_registrar_.Add(prefs::kDevToolsPortForwardingEnabled, callback);
533 pref_change_registrar_.Add(prefs::kDevToolsPortForwardingConfig, callback); 536 pref_change_registrar_.Add(prefs::kDevToolsPortForwardingConfig, callback);
534 OnPrefsChange(); 537 OnPrefsChange();
535 } 538 }
536 539
537 PortForwardingController::~PortForwardingController() {} 540 PortForwardingController::~PortForwardingController() {}
538 541
539 PortForwardingController::ForwardingStatus 542 PortForwardingController::ForwardingStatus
540 PortForwardingController::DeviceListChanged( 543 PortForwardingController::DeviceListChanged(
541 const DevToolsAndroidBridge::CompleteDevices& complete_devices) { 544 const DevToolsAndroidBridge::RemoteDevices& devices) {
542 ForwardingStatus status; 545 ForwardingStatus status;
543 if (forwarding_map_.empty()) 546 if (forwarding_map_.empty())
544 return status; 547 return status;
545 548
546 for (const auto& pair : complete_devices) { 549 for (const auto& device : devices) {
547 scoped_refptr<AndroidDeviceManager::Device> device(pair.first); 550 if (!device->is_connected())
548 scoped_refptr<DevToolsAndroidBridge::RemoteDevice> remote_device(
549 pair.second);
550 if (!remote_device->is_connected())
551 continue; 551 continue;
552 Registry::iterator rit = registry_.find(remote_device->serial()); 552 Registry::iterator rit = registry_.find(device->serial());
553 if (rit == registry_.end()) { 553 if (rit == registry_.end()) {
554 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser( 554 scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser(
555 FindBestBrowserForTethering(remote_device->browsers())); 555 FindBestBrowserForTethering(device->browsers()));
556 if (browser.get()) 556 if (browser.get())
557 new Connection(&registry_, device, browser, forwarding_map_); 557 new Connection(this, browser, forwarding_map_);
558 } else { 558 } else {
559 status.push_back(std::make_pair(rit->second->browser(), 559 status.push_back(std::make_pair(rit->second->browser(),
560 rit->second->GetPortStatusMap())); 560 rit->second->GetPortStatusMap()));
561 } 561 }
562 } 562 }
563 return status; 563 return status;
564 } 564 }
565 565
566 void PortForwardingController::OnPrefsChange() { 566 void PortForwardingController::OnPrefsChange() {
567 forwarding_map_.clear(); 567 forwarding_map_.clear();
(...skipping 20 matching lines...) Expand all
588 registry_copy.push_back(it->second); 588 registry_copy.push_back(it->second);
589 } 589 }
590 STLDeleteElements(&registry_copy); 590 STLDeleteElements(&registry_copy);
591 } 591 }
592 } 592 }
593 593
594 void PortForwardingController::UpdateConnections() { 594 void PortForwardingController::UpdateConnections() {
595 for (Registry::iterator it = registry_.begin(); it != registry_.end(); ++it) 595 for (Registry::iterator it = registry_.begin(); it != registry_.end(); ++it)
596 it->second->UpdateForwardingMap(forwarding_map_); 596 it->second->UpdateForwardingMap(forwarding_map_);
597 } 597 }
OLDNEW
« no previous file with comments | « chrome/browser/devtools/device/port_forwarding_controller.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698