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