10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#ifndef CHROME_BROWSER_DEVTOOLS_DEVICE_DEVTOOLS_ANDROID_BRIDGE_H_ 60529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#define CHROME_BROWSER_DEVTOOLS_DEVICE_DEVTOOLS_ANDROID_BRIDGE_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback.h" 1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/cancelable_callback.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/ref_counted.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/prefs/pref_change_registrar.h" 160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/devtools/device/android_device_manager.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/content/browser_context_keyed_service_factory.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/keyed_service/core/keyed_service.h" 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/devtools_agent_host.h" 20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/size.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochtemplate<typename T> struct DefaultSingletonTraits; 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base { 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class MessageLoop; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DictionaryValue; 271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class ListValue; 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class Thread; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace content { 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass BrowserContext; 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class DevToolsTargetImpl; 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass PortForwardingController; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Profile; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass DevToolsAndroidBridge 40558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch : public base::RefCountedThreadSafe< 410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DevToolsAndroidBridge, 42558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch content::BrowserThread::DeleteOnUIThread> { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::Callback<void(int result, 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& response)> Callback; 461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) class Wrapper : public KeyedService { 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch explicit Wrapper(content::BrowserContext* context); 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual ~Wrapper(); 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DevToolsAndroidBridge* Get(); 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch scoped_refptr<DevToolsAndroidBridge> bridge_; 557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch }; 567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch class Factory : public BrowserContextKeyedServiceFactory { 587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Returns singleton instance of DevToolsAndroidBridge. 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static Factory* GetInstance(); 617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Returns DevToolsAndroidBridge associated with |profile|. 630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static DevToolsAndroidBridge* GetForProfile(Profile* profile); 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch friend struct DefaultSingletonTraits<Factory>; 677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Factory(); 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual ~Factory(); 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // BrowserContextKeyedServiceFactory overrides: 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual KeyedService* BuildServiceInstanceFor( 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::BrowserContext* context) const OVERRIDE; 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DISALLOW_COPY_AND_ASSIGN(Factory); 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch }; 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) class RemotePage { 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public: 79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual ~RemotePage() {} 80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual DevToolsTargetImpl* GetTarget() = 0; 81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual std::string GetFrontendURL() = 0; 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }; 83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) typedef base::Callback<void(RemotePage*)> RemotePageCallback; 8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) typedef base::Callback<void(int, const std::string&)> JsonRequestCallback; 8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) typedef AndroidDeviceManager::Device Device; 8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) typedef AndroidDeviceManager::AndroidWebSocket AndroidWebSocket; 88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) class RemoteBrowser : public base::RefCounted<RemoteBrowser> { 90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) RemoteBrowser(scoped_refptr<Device> device, 9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const AndroidDeviceManager::BrowserInfo& browser_info); 93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string serial() { return device_->serial(); } 95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string socket() { return socket_; } 96c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string display_name() { return display_name_; } 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void set_display_name(const std::string& name) { display_name_ = name; } 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 100c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch std::string version() { return version_; } 101c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch void set_version(const std::string& version) { version_ = version; } 102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool IsChrome() const; 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool IsWebView() const; 1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) typedef std::vector<int> ParsedVersion; 1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ParsedVersion GetParsedVersion() const; 1081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::vector<RemotePage*> CreatePages(); 1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void SetPageDescriptors(const base::ListValue&); 1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void SendJsonRequest(const std::string& request, 113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const JsonRequestCallback& callback); 11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void SendProtocolCommand(const std::string& debug_url, 1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const std::string& method, 117a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::DictionaryValue* params, 118a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const base::Closure callback); 119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void Open(const std::string& url, 121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const RemotePageCallback& callback); 122bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<content::DevToolsAgentHost> GetAgentHost(); 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) AndroidWebSocket* CreateWebSocket( 126c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const std::string& url, 1270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DevToolsAndroidBridge::AndroidWebSocket::Delegate* delegate); 128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) friend class base::RefCounted<RemoteBrowser>; 131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual ~RemoteBrowser(); 132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void InnerOpen(const std::string& url, 1345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const JsonRequestCallback& callback); 135bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 136bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch void PageCreatedOnUIThread( 137a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const JsonRequestCallback& callback, 138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const std::string& url, int result, const std::string& response); 139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 140a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void NavigatePageOnUIThread(const JsonRequestCallback& callback, 1415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int result, 1425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::string& response, 1435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::string& url); 1445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu void RespondToOpenOnUIThread( 146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const DevToolsAndroidBridge::RemotePageCallback& callback, 1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int result, 1485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const std::string& response); 149bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<Device> device_; 151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string socket_; 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string display_name_; 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const AndroidDeviceManager::BrowserInfo::Type type_; 154c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch std::string version_; 1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<base::ListValue> page_descriptors_; 156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(RemoteBrowser); 158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }; 159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) typedef std::vector<scoped_refptr<RemoteBrowser> > RemoteBrowsers; 161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) class RemoteDevice : public base::RefCounted<RemoteDevice> { 163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) RemoteDevice(scoped_refptr<Device> device, 16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const AndroidDeviceManager::DeviceInfo& device_info); 166c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::string serial() { return device_->serial(); } 168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::string model() { return model_; } 169c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool is_connected() { return connected_; } 170a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RemoteBrowsers& browsers() { return browsers_; } 1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) gfx::Size screen_size() { return screen_size_; } 172c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 173c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void OpenSocket(const std::string& socket_name, 174c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const AndroidDeviceManager::SocketCallback& callback); 175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) friend class base::RefCounted<RemoteDevice>; 178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual ~RemoteDevice(); 179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_refptr<Device> device_; 181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch std::string model_; 182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool connected_; 183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RemoteBrowsers browsers_; 184d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Size screen_size_; 185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(RemoteDevice); 187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }; 188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) typedef std::vector<scoped_refptr<RemoteDevice> > RemoteDevices; 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 191a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch class DeviceListListener { 1929ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch public: 193a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void DeviceListChanged(const RemoteDevices& devices) = 0; 1949ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch protected: 195a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual ~DeviceListListener() {} 1969ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch }; 1979ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 1980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch explicit DevToolsAndroidBridge(Profile* profile); 199a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void AddDeviceListListener(DeviceListListener* listener); 200a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void RemoveDeviceListListener(DeviceListListener* listener); 201a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 202a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch class DeviceCountListener { 203a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public: 204a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void DeviceCountChanged(int count) = 0; 205a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch protected: 206a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual ~DeviceCountListener() {} 207a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch }; 208a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 209a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void AddDeviceCountListener(DeviceCountListener* listener); 210a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void RemoveDeviceCountListener(DeviceCountListener* listener); 2111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef int PortStatus; 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef std::map<int, PortStatus> PortStatusMap; 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef std::map<std::string, PortStatusMap> DevicesStatus; 2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci class PortForwardingListener { 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef DevToolsAndroidBridge::PortStatusMap PortStatusMap; 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef DevToolsAndroidBridge::DevicesStatus DevicesStatus; 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void PortStatusChanged(const DevicesStatus&) = 0; 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected: 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~PortForwardingListener() {} 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void AddPortForwardingListener(PortForwardingListener* listener); 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void RemovePortForwardingListener(PortForwardingListener* listener); 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void set_device_providers_for_test( 230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const AndroidDeviceManager::DeviceProviders& device_providers) { 23146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) device_manager_->SetDeviceProviders(device_providers); 23246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 23346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 23446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void set_task_scheduler_for_test( 23546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Callback<void(const base::Closure&)> scheduler) { 23646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) task_scheduler_ = scheduler; 2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) static bool HasDevToolsWindow(const std::string& agent_id); 2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private: 2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) friend struct content::BrowserThread::DeleteOnThread< 2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) content::BrowserThread::UI>; 2440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch friend class base::DeleteHelper<DevToolsAndroidBridge>; 2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual ~DevToolsAndroidBridge(); 2477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 24846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void StartDeviceListPolling(); 24946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void StopDeviceListPolling(); 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool NeedsDeviceListPolling(); 25146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void RequestDeviceList( 25246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const base::Callback<void(const RemoteDevices&)>& callback); 25346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void ReceivedDeviceList(const RemoteDevices& devices); 25446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void StartDeviceCountPolling(); 25546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void StopDeviceCountPolling(); 25646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void RequestDeviceCount(const base::Callback<void(int)>& callback); 257a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void ReceivedDeviceCount(int count); 258a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 25946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static void ScheduleTaskDefault(const base::Closure& task); 26046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 261c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void CreateDeviceProviders(); 2629ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch 263c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch Profile* profile_; 264c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_refptr<AndroidDeviceManager> device_manager_; 26546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) RemoteDevices devices_; 266a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 267a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch typedef std::vector<DeviceListListener*> DeviceListListeners; 268a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DeviceListListeners device_list_listeners_; 26946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::CancelableCallback<void(const RemoteDevices&)> device_list_callback_; 270a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 271a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch typedef std::vector<DeviceCountListener*> DeviceCountListeners; 272a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DeviceCountListeners device_count_listeners_; 27346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::CancelableCallback<void(int)> device_count_callback_; 27446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Callback<void(const base::Closure&)> task_scheduler_; 275a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci typedef std::vector<PortForwardingListener*> PortForwardingListeners; 2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PortForwardingListeners port_forwarding_listeners_; 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<PortForwardingController> port_forwarding_controller_; 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 280c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch PrefChangeRegistrar pref_change_registrar_; 2810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DISALLOW_COPY_AND_ASSIGN(DevToolsAndroidBridge); 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif // CHROME_BROWSER_DEVTOOLS_DEVICE_DEVTOOLS_ANDROID_BRIDGE_H_ 285