blob: e5ba62bc81c6fd540bf91cb51f1da8350aa07e9e [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_DEVTOOLS_DEVICE_DEVTOOLS_DEVICE_DISCOVERY_H_
#define CHROME_BROWSER_DEVTOOLS_DEVICE_DEVTOOLS_DEVICE_DISCOVERY_H_
#include <memory>
#include <string>
#include <vector>
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/values.h"
#include "chrome/browser/devtools/device/android_device_manager.h"
#include "content/public/browser/devtools_agent_host.h"
class DevToolsDeviceDiscovery {
public:
class RemotePage : public base::RefCountedThreadSafe<RemotePage> {
public:
RemotePage(const RemotePage&) = delete;
RemotePage& operator=(const RemotePage&) = delete;
scoped_refptr<AndroidDeviceManager::Device> device() { return device_; }
const std::string& socket() { return browser_id_; }
const std::string& frontend_url() { return frontend_url_; }
scoped_refptr<content::DevToolsAgentHost> CreateTarget();
private:
friend class base::RefCountedThreadSafe<RemotePage>;
friend class DevToolsDeviceDiscovery;
RemotePage(scoped_refptr<AndroidDeviceManager::Device> device,
const std::string& browser_id,
const std::string& browser_version,
base::Value::Dict dict);
virtual ~RemotePage();
scoped_refptr<AndroidDeviceManager::Device> device_;
std::string browser_id_;
std::string browser_version_;
std::string frontend_url_;
base::Value::Dict dict_;
scoped_refptr<content::DevToolsAgentHost> agent_host_;
};
using RemotePages = std::vector<scoped_refptr<RemotePage>>;
class RemoteBrowser : public base::RefCountedThreadSafe<RemoteBrowser> {
public:
RemoteBrowser(const RemoteBrowser&) = delete;
RemoteBrowser& operator=(const RemoteBrowser&) = delete;
const std::string& serial() { return serial_; }
const std::string& socket() { return browser_id_; }
const std::string& display_name() { return display_name_; }
const std::string& user() { return user_; }
const std::string& version() { return version_; }
const std::string& browser_target_id() { return browser_target_id_; }
const RemotePages& pages() { return pages_; }
bool IsChrome();
std::string GetId();
using ParsedVersion = std::vector<int>;
ParsedVersion GetParsedVersion();
private:
friend class base::RefCountedThreadSafe<RemoteBrowser>;
friend class DevToolsDeviceDiscovery;
RemoteBrowser(const std::string& serial,
const AndroidDeviceManager::BrowserInfo& browser_info);
virtual ~RemoteBrowser();
std::string serial_;
std::string browser_id_;
std::string display_name_;
std::string user_;
AndroidDeviceManager::BrowserInfo::Type type_;
std::string version_;
std::string browser_target_id_;
RemotePages pages_;
};
using RemoteBrowsers = std::vector<scoped_refptr<RemoteBrowser>>;
class RemoteDevice : public base::RefCountedThreadSafe<RemoteDevice> {
public:
RemoteDevice(const RemoteDevice&) = delete;
RemoteDevice& operator=(const RemoteDevice&) = delete;
std::string serial() { return serial_; }
std::string model() { return model_; }
bool is_connected() { return connected_; }
RemoteBrowsers& browsers() { return browsers_; }
gfx::Size screen_size() { return screen_size_; }
private:
friend class base::RefCountedThreadSafe<RemoteDevice>;
friend class DevToolsDeviceDiscovery;
RemoteDevice(const std::string& serial,
const AndroidDeviceManager::DeviceInfo& device_info);
virtual ~RemoteDevice();
std::string serial_;
std::string model_;
bool connected_;
RemoteBrowsers browsers_;
gfx::Size screen_size_;
};
using RemoteDevices = std::vector<scoped_refptr<RemoteDevice>>;
using CompleteDevice =
std::pair<scoped_refptr<AndroidDeviceManager::Device>,
scoped_refptr<RemoteDevice>>;
using CompleteDevices = std::vector<CompleteDevice>;
using DeviceListCallback =
base::RepeatingCallback<void(const CompleteDevices&)>;
DevToolsDeviceDiscovery(AndroidDeviceManager* device_manager,
DeviceListCallback callback);
DevToolsDeviceDiscovery(const DevToolsDeviceDiscovery&) = delete;
DevToolsDeviceDiscovery& operator=(const DevToolsDeviceDiscovery&) = delete;
~DevToolsDeviceDiscovery();
void SetScheduler(base::RepeatingCallback<void(base::OnceClosure)> scheduler);
static scoped_refptr<content::DevToolsAgentHost> CreateBrowserAgentHost(
scoped_refptr<AndroidDeviceManager::Device> device,
scoped_refptr<RemoteBrowser> browser);
private:
class DiscoveryRequest;
void RequestDeviceList();
void ReceivedDeviceList(const CompleteDevices& complete_devices);
raw_ptr<AndroidDeviceManager, DanglingUntriaged> device_manager_;
const DeviceListCallback callback_;
base::RepeatingCallback<void(base::OnceClosure)> task_scheduler_;
base::WeakPtrFactory<DevToolsDeviceDiscovery> weak_factory_{this};
};
#endif // CHROME_BROWSER_DEVTOOLS_DEVICE_DEVTOOLS_DEVICE_DISCOVERY_H_