Index: chrome/browser/devtools/device/webrtc/webrtc_device_provider.cc |
diff --git a/chrome/browser/devtools/device/webrtc/webrtc_device_provider.cc b/chrome/browser/devtools/device/webrtc/webrtc_device_provider.cc |
index c6f6935cf52cc0adcfc99a58d4d4951f4ed5136c..c6704e88e3f918ff1be5eb93e6e92714c33045f9 100644 |
--- a/chrome/browser/devtools/device/webrtc/webrtc_device_provider.cc |
+++ b/chrome/browser/devtools/device/webrtc/webrtc_device_provider.cc |
@@ -5,6 +5,9 @@ |
#include "chrome/browser/devtools/device/webrtc/webrtc_device_provider.h" |
#include "chrome/browser/chrome_notification_types.h" |
+#include "chrome/browser/local_discovery/cloud_device_list.h" |
+#include "chrome/browser/local_discovery/cloud_device_list_delegate.h" |
+#include "chrome/browser/local_discovery/gcd_api_flow.h" |
#include "chrome/browser/signin/profile_identity_provider.h" |
#include "chrome/browser/ui/browser.h" |
#include "chrome/common/url_constants.h" |
@@ -19,6 +22,10 @@ |
#include "net/socket/stream_socket.h" |
#include "ui/base/page_transition_types.h" |
+using BrowserInfo = AndroidDeviceManager::BrowserInfo; |
+using BrowserInfoList = std::vector<BrowserInfo>; |
+using DeviceInfo = AndroidDeviceManager::DeviceInfo; |
+using SerialList = std::vector<std::string>; |
using content::BrowserThread; |
using content::NotificationDetails; |
using content::NotificationObserver; |
@@ -27,18 +34,24 @@ using content::NotificationSource; |
using content::WebContents; |
using content::WebUIDataSource; |
using content::WebUIMessageHandler; |
+using local_discovery::CloudDeviceList; |
+using local_discovery::CloudDeviceListDelegate; |
+using local_discovery::GCDApiFlow; |
namespace { |
const char kBackgroundWorkerURL[] = |
"chrome://webrtc-device-provider/background_worker.html"; |
+const char kSerial[] = "clouddevices"; |
+const char kPseudoDeviceName[] = "Remote browsers"; |
} // namespace |
// Lives on the UI thread. |
class WebRTCDeviceProvider::DevToolsBridgeClient : |
private NotificationObserver, |
- private IdentityProvider::Observer { |
+ private IdentityProvider::Observer, |
+ private CloudDeviceListDelegate { |
public: |
static base::WeakPtr<DevToolsBridgeClient> Create( |
Profile* profile, |
@@ -47,6 +60,10 @@ class WebRTCDeviceProvider::DevToolsBridgeClient : |
void DeleteSelf(); |
+ static SerialList GetDevices(base::WeakPtr<DevToolsBridgeClient> weak_ptr); |
+ static DeviceInfo GetDeviceInfo(base::WeakPtr<DevToolsBridgeClient> weak_ptr, |
+ const std::string& serial); |
+ |
private: |
DevToolsBridgeClient(Profile* profile, |
SigninManagerBase* signin_manager, |
@@ -55,6 +72,7 @@ class WebRTCDeviceProvider::DevToolsBridgeClient : |
~DevToolsBridgeClient(); |
void CreateBackgroundWorker(); |
+ void UpdateBrowserList(); |
// Implementation of IdentityProvider::Observer. |
void OnActiveAccountLogin() override; |
@@ -65,10 +83,18 @@ class WebRTCDeviceProvider::DevToolsBridgeClient : |
const NotificationSource& source, |
const NotificationDetails& details) override; |
+ // CloudDeviceListDelegate implementation. |
+ void OnDeviceListReady( |
+ const CloudDeviceListDelegate::DeviceList& devices) override; |
+ void OnDeviceListUnavailable() override; |
+ |
Profile* const profile_; |
ProfileIdentityProvider identity_provider_; |
NotificationRegistrar registrar_; |
scoped_ptr<WebContents> background_worker_; |
+ scoped_ptr<GCDApiFlow> browser_list_request_; |
+ BrowserInfoList browsers_; |
+ bool browser_list_updating_; |
base::WeakPtrFactory<DevToolsBridgeClient> weak_factory_; |
}; |
@@ -129,6 +155,7 @@ WebRTCDeviceProvider::DevToolsBridgeClient::DevToolsBridgeClient( |
ProfileOAuth2TokenService* token_service) |
: profile_(profile), |
identity_provider_(signin_manager, token_service, nullptr), |
+ browser_list_updating_(false), |
weak_factory_(this) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
@@ -151,6 +178,40 @@ void WebRTCDeviceProvider::DevToolsBridgeClient::DeleteSelf() { |
delete this; |
} |
+void WebRTCDeviceProvider::DevToolsBridgeClient::UpdateBrowserList() { |
+ if (browser_list_updating_ || !browser_list_request_.get()) |
+ return; |
+ browser_list_updating_ = true; |
+ |
+ browser_list_request_->Start(make_scoped_ptr(new CloudDeviceList(this))); |
+} |
+ |
+// static |
+SerialList WebRTCDeviceProvider::DevToolsBridgeClient::GetDevices( |
+ base::WeakPtr<DevToolsBridgeClient> weak_ptr) { |
+ SerialList result; |
+ if (auto* ptr = weak_ptr.get()) { |
+ if (ptr->background_worker_.get()) |
+ result.push_back(kSerial); |
+ |
+ ptr->UpdateBrowserList(); |
+ } |
+ return result; |
+} |
+ |
+// static |
+DeviceInfo WebRTCDeviceProvider::DevToolsBridgeClient::GetDeviceInfo( |
+ base::WeakPtr<DevToolsBridgeClient> weak_self, |
+ const std::string& serial) { |
+ DeviceInfo result; |
+ if (auto* self = weak_self.get()) { |
+ result.connected = !!self->background_worker_.get(); |
+ result.model = kPseudoDeviceName; |
+ result.browser_info = self->browsers_; |
+ } |
+ return result; |
+} |
+ |
void WebRTCDeviceProvider::DevToolsBridgeClient::CreateBackgroundWorker() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
@@ -168,6 +229,11 @@ void WebRTCDeviceProvider::DevToolsBridgeClient::CreateBackgroundWorker() { |
background_worker_->GetWebUI()->AddMessageHandler( |
new MessageHandler(this)); |
+ |
+ browser_list_request_ = |
+ GCDApiFlow::Create(profile_->GetRequestContext(), |
+ identity_provider_.GetTokenService(), |
+ identity_provider_.GetActiveAccountId()); |
} |
void WebRTCDeviceProvider::DevToolsBridgeClient::Observe( |
@@ -188,6 +254,31 @@ void WebRTCDeviceProvider::DevToolsBridgeClient::OnActiveAccountLogin() { |
void WebRTCDeviceProvider::DevToolsBridgeClient::OnActiveAccountLogout() { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
background_worker_.reset(); |
+ browser_list_request_.reset(); |
+ BrowserInfoList().swap(browsers_); |
+} |
+ |
+void WebRTCDeviceProvider::DevToolsBridgeClient::OnDeviceListReady( |
+ const CloudDeviceListDelegate::DeviceList& devices) { |
+ browser_list_updating_ = false; |
+ |
+ // TODO(serya): Not all devices are browsers. Filter them out. |
+ BrowserInfoList browsers; |
+ browsers.reserve(devices.size()); |
+ for (const auto& device : devices) { |
+ BrowserInfo browser; |
+ browser.type = BrowserInfo::kTypeChrome; |
+ browser.display_name = device.display_name; |
+ browsers.push_back(browser); |
+ } |
+ |
+ browsers_.swap(browsers); |
+} |
+ |
+void WebRTCDeviceProvider::DevToolsBridgeClient::OnDeviceListUnavailable() { |
+ browser_list_updating_ = false; |
+ |
+ BrowserInfoList().swap(browsers_); |
} |
// WebRTCDeviceProvider::MessageHandler ---------------------------------------- |
@@ -227,16 +318,20 @@ WebRTCDeviceProvider::~WebRTCDeviceProvider() { |
} |
void WebRTCDeviceProvider::QueryDevices(const SerialsCallback& callback) { |
- // TODO(serya): Implement |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, base::Bind(callback, std::vector<std::string>())); |
+ BrowserThread::PostTaskAndReplyWithResult( |
+ BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&DevToolsBridgeClient::GetDevices, client_), |
+ callback); |
} |
void WebRTCDeviceProvider::QueryDeviceInfo(const std::string& serial, |
- const DeviceInfoCallback& callback) { |
- // TODO(serya): Implement |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, base::Bind(callback, AndroidDeviceManager::DeviceInfo())); |
+ const DeviceInfoCallback& callback) { |
+ BrowserThread::PostTaskAndReplyWithResult( |
+ BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&DevToolsBridgeClient::GetDeviceInfo, client_, serial), |
+ callback); |
} |
void WebRTCDeviceProvider::OpenSocket(const std::string& serial, |