devtools_android_bridge.h revision 46d4c2bc3267f3f028f39e7e311b0f89aba2e4fd
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;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Profile;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass DevToolsAndroidBridge
39558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    : public base::RefCountedThreadSafe<
400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          DevToolsAndroidBridge,
41558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch          content::BrowserThread::DeleteOnUIThread> {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::Callback<void(int result,
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const std::string& response)> Callback;
451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  class Wrapper : public KeyedService {
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   public:
48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    explicit Wrapper(content::BrowserContext* context);
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    virtual ~Wrapper();
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    DevToolsAndroidBridge* Get();
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   private:
530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    scoped_refptr<DevToolsAndroidBridge> bridge_;
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  };
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  class Factory : public BrowserContextKeyedServiceFactory {
577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   public:
580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // Returns singleton instance of DevToolsAndroidBridge.
597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    static Factory* GetInstance();
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // Returns DevToolsAndroidBridge associated with |profile|.
620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    static DevToolsAndroidBridge* GetForProfile(Profile* profile);
637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch   private:
657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    friend struct DefaultSingletonTraits<Factory>;
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    Factory();
687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    virtual ~Factory();
697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // BrowserContextKeyedServiceFactory overrides:
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    virtual KeyedService* BuildServiceInstanceFor(
727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        content::BrowserContext* context) const OVERRIDE;
737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    DISALLOW_COPY_AND_ASSIGN(Factory);
747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  };
757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  class RemotePage {
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   public:
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    virtual ~RemotePage() {}
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    virtual DevToolsTargetImpl* GetTarget() = 0;
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    virtual std::string GetFrontendURL() = 0;
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  };
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  typedef base::Callback<void(RemotePage*)> RemotePageCallback;
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  typedef base::Callback<void(int, const std::string&)> JsonRequestCallback;
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  typedef AndroidDeviceManager::Device Device;
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  typedef AndroidDeviceManager::AndroidWebSocket AndroidWebSocket;
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  class RemoteBrowser : public base::RefCounted<RemoteBrowser> {
89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)   public:
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    RemoteBrowser(scoped_refptr<Device> device,
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                  const AndroidDeviceManager::BrowserInfo& browser_info);
92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    std::string serial() { return device_->serial(); }
94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    std::string socket() { return socket_; }
95c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    std::string display_name() { return display_name_; }
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    void set_display_name(const std::string& name) { display_name_ = name; }
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
99c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    std::string version() { return version_; }
100c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    void set_version(const std::string& version) { version_ = version; }
101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    bool IsChrome() const;
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    bool IsWebView() const;
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    typedef std::vector<int> ParsedVersion;
1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ParsedVersion GetParsedVersion() const;
1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    std::vector<RemotePage*> CreatePages();
1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    void SetPageDescriptors(const base::ListValue&);
1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    void SendJsonRequest(const std::string& request,
112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                         const JsonRequestCallback& callback);
11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    void SendProtocolCommand(const std::string& debug_url,
1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                             const std::string& method,
116a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                             base::DictionaryValue* params,
117a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                             const base::Closure callback);
118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    void Open(const std::string& url,
120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)              const RemotePageCallback& callback);
121bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    scoped_refptr<content::DevToolsAgentHost> GetAgentHost();
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    scoped_refptr<AndroidWebSocket> CreateWebSocket(
125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        const std::string& url,
1260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        DevToolsAndroidBridge::AndroidWebSocket::Delegate* delegate);
127c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)   private:
129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    friend class base::RefCounted<RemoteBrowser>;
130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    virtual ~RemoteBrowser();
131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    void InnerOpen(const std::string& url,
1335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                   const JsonRequestCallback& callback);
134bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
135bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    void PageCreatedOnUIThread(
136a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        const JsonRequestCallback& callback,
137a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        const std::string& url, int result, const std::string& response);
138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    void NavigatePageOnUIThread(const JsonRequestCallback& callback,
1405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        int result,
1415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        const std::string& response,
1425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        const std::string& url);
1435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    void RespondToOpenOnUIThread(
145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        const DevToolsAndroidBridge::RemotePageCallback& callback,
1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        int result,
1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        const std::string& response);
148bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    scoped_refptr<Device> device_;
150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const std::string socket_;
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    std::string display_name_;
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const AndroidDeviceManager::BrowserInfo::Type type_;
153c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    std::string version_;
1541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    scoped_ptr<base::ListValue> page_descriptors_;
155a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(RemoteBrowser);
157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  };
158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  typedef std::vector<scoped_refptr<RemoteBrowser> > RemoteBrowsers;
160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  class RemoteDevice : public base::RefCounted<RemoteDevice> {
162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)   public:
16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    RemoteDevice(scoped_refptr<Device> device,
16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 const AndroidDeviceManager::DeviceInfo& device_info);
165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    std::string serial() { return device_->serial(); }
167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    std::string model() { return model_; }
168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    bool is_connected() { return connected_; }
169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    RemoteBrowsers& browsers() { return browsers_; }
1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    gfx::Size screen_size() { return screen_size_; }
171c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
172c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    void OpenSocket(const std::string& socket_name,
173c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                    const AndroidDeviceManager::SocketCallback& callback);
174c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)   private:
176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    friend class base::RefCounted<RemoteDevice>;
177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    virtual ~RemoteDevice();
178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    scoped_refptr<Device> device_;
180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    std::string model_;
181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    bool connected_;
182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    RemoteBrowsers browsers_;
183d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    gfx::Size screen_size_;
184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(RemoteDevice);
186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  };
187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  typedef std::vector<scoped_refptr<RemoteDevice> > RemoteDevices;
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
190a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  class DeviceListListener {
1919ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch   public:
192a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    virtual void DeviceListChanged(const RemoteDevices& devices) = 0;
1939ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch   protected:
194a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    virtual ~DeviceListListener() {}
1959ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  };
1969ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  explicit DevToolsAndroidBridge(Profile* profile);
198a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void AddDeviceListListener(DeviceListListener* listener);
199a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void RemoveDeviceListListener(DeviceListListener* listener);
200a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
201a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  class DeviceCountListener {
202a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch   public:
203a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    virtual void DeviceCountChanged(int count) = 0;
204a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch   protected:
205a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    virtual ~DeviceCountListener() {}
206a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  };
207a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
208a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void AddDeviceCountListener(DeviceCountListener* listener);
209a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void RemoveDeviceCountListener(DeviceCountListener* listener);
2101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void set_device_providers_for_test(
212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      const AndroidDeviceManager::DeviceProviders& device_providers) {
21346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    device_manager_->SetDeviceProviders(device_providers);
21446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
21546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
21646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void set_task_scheduler_for_test(
21746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      base::Callback<void(const base::Closure&)> scheduler) {
21846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    task_scheduler_ = scheduler;
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  static bool HasDevToolsWindow(const std::string& agent_id);
2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  friend struct content::BrowserThread::DeleteOnThread<
2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      content::BrowserThread::UI>;
2260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  friend class base::DeleteHelper<DevToolsAndroidBridge>;
2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual ~DevToolsAndroidBridge();
2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
23046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void StartDeviceListPolling();
23146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void StopDeviceListPolling();
23246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void RequestDeviceList(
23346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const base::Callback<void(const RemoteDevices&)>& callback);
23446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void ReceivedDeviceList(const RemoteDevices& devices);
23546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void StartDeviceCountPolling();
23646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void StopDeviceCountPolling();
23746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void RequestDeviceCount(const base::Callback<void(int)>& callback);
238a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  void ReceivedDeviceCount(int count);
239a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
24046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  static void ScheduleTaskDefault(const base::Closure& task);
24146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
242c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void CreateDeviceProviders();
2439ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
244c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  Profile* profile_;
245c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<AndroidDeviceManager> device_manager_;
24646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  RemoteDevices devices_;
247a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
248a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  typedef std::vector<DeviceListListener*> DeviceListListeners;
249a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DeviceListListeners device_list_listeners_;
25046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::CancelableCallback<void(const RemoteDevices&)> device_list_callback_;
251a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
252a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  typedef std::vector<DeviceCountListener*> DeviceCountListeners;
253a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DeviceCountListeners device_count_listeners_;
25446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::CancelableCallback<void(int)> device_count_callback_;
25546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::Callback<void(const base::Closure&)> task_scheduler_;
256a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
257c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  PrefChangeRegistrar pref_change_registrar_;
2580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DISALLOW_COPY_AND_ASSIGN(DevToolsAndroidBridge);
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif  // CHROME_BROWSER_DEVTOOLS_DEVICE_DEVTOOLS_ANDROID_BRIDGE_H_
262