| 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 fa69ad8abf922d8649ffa3758d5e58d3c8b3aa76..c6f6935cf52cc0adcfc99a58d4d4951f4ed5136c 100644
|
| --- a/chrome/browser/devtools/device/webrtc/webrtc_device_provider.cc
|
| +++ b/chrome/browser/devtools/device/webrtc/webrtc_device_provider.cc
|
| @@ -4,59 +4,93 @@
|
|
|
| #include "chrome/browser/devtools/device/webrtc/webrtc_device_provider.h"
|
|
|
| +#include "chrome/browser/chrome_notification_types.h"
|
| +#include "chrome/browser/signin/profile_identity_provider.h"
|
| #include "chrome/browser/ui/browser.h"
|
| #include "chrome/common/url_constants.h"
|
| +#include "content/public/browser/notification_observer.h"
|
| +#include "content/public/browser/notification_registrar.h"
|
| +#include "content/public/browser/notification_source.h"
|
| #include "content/public/browser/web_contents.h"
|
| #include "content/public/browser/web_ui_data_source.h"
|
| #include "content/public/browser/web_ui_message_handler.h"
|
| #include "grit/webrtc_device_provider_resources_map.h"
|
| +#include "net/base/net_errors.h"
|
| +#include "net/socket/stream_socket.h"
|
| #include "ui/base/page_transition_types.h"
|
|
|
| +using content::BrowserThread;
|
| +using content::NotificationDetails;
|
| +using content::NotificationObserver;
|
| +using content::NotificationRegistrar;
|
| +using content::NotificationSource;
|
| +using content::WebContents;
|
| +using content::WebUIDataSource;
|
| +using content::WebUIMessageHandler;
|
| +
|
| +namespace {
|
| +
|
| const char kBackgroundWorkerURL[] =
|
| "chrome://webrtc-device-provider/background_worker.html";
|
|
|
| -namespace {
|
| +} // namespace
|
|
|
| -class MessageHandler : public content::WebUIMessageHandler {
|
| +// Lives on the UI thread.
|
| +class WebRTCDeviceProvider::DevToolsBridgeClient :
|
| + private NotificationObserver,
|
| + private IdentityProvider::Observer {
|
| public:
|
| - explicit MessageHandler(WebRTCDeviceProvider* owner);
|
| + static base::WeakPtr<DevToolsBridgeClient> Create(
|
| + Profile* profile,
|
| + SigninManagerBase* signin_manager,
|
| + ProfileOAuth2TokenService* token_service);
|
|
|
| - void RegisterMessages() override;
|
| + void DeleteSelf();
|
|
|
| private:
|
| - void HandleLoaded(const base::ListValue* args);
|
| + DevToolsBridgeClient(Profile* profile,
|
| + SigninManagerBase* signin_manager,
|
| + ProfileOAuth2TokenService* token_service);
|
|
|
| - WebRTCDeviceProvider* const owner_;
|
| -};
|
| + ~DevToolsBridgeClient();
|
|
|
| -// MessageHandler -------------------------------------------------------------
|
| + void CreateBackgroundWorker();
|
|
|
| -MessageHandler::MessageHandler(
|
| - WebRTCDeviceProvider* owner) : owner_(owner) {
|
| -}
|
| + // Implementation of IdentityProvider::Observer.
|
| + void OnActiveAccountLogin() override;
|
| + void OnActiveAccountLogout() override;
|
|
|
| -void MessageHandler::RegisterMessages() {
|
| - web_ui()->RegisterMessageCallback(
|
| - "loaded",
|
| - base::Bind(&MessageHandler::HandleLoaded, base::Unretained(this)));
|
| -}
|
| + // Implementation of NotificationObserver.
|
| + void Observe(int type,
|
| + const NotificationSource& source,
|
| + const NotificationDetails& details) override;
|
|
|
| -void MessageHandler::HandleLoaded(
|
| - const base::ListValue* args) {
|
| - if (!owner_)
|
| - return;
|
| - // TODO(serya): implement
|
| -}
|
| + Profile* const profile_;
|
| + ProfileIdentityProvider identity_provider_;
|
| + NotificationRegistrar registrar_;
|
| + scoped_ptr<WebContents> background_worker_;
|
| + base::WeakPtrFactory<DevToolsBridgeClient> weak_factory_;
|
| +};
|
|
|
| -} // namespace
|
| +class WebRTCDeviceProvider::MessageHandler : public WebUIMessageHandler {
|
| + public:
|
| + explicit MessageHandler(DevToolsBridgeClient* owner);
|
|
|
| -// WebRTCDeviceProvider::WebUI ------------------------------------------------
|
| + void RegisterMessages() override;
|
| +
|
| + private:
|
| + void HandleLoaded(const base::ListValue* args);
|
| +
|
| + DevToolsBridgeClient* const owner_;
|
| +};
|
| +
|
| +// WebRTCDeviceProvider::WebUI -------------------------------------------------
|
|
|
| WebRTCDeviceProvider::WebUI::WebUI(content::WebUI* web_ui)
|
| : content::WebUIController(web_ui) {
|
| Profile* profile = Profile::FromWebUI(web_ui);
|
|
|
| - content::WebUIDataSource* source = content::WebUIDataSource::Create(
|
| + WebUIDataSource* source = WebUIDataSource::Create(
|
| chrome::kChromeUIWebRTCDeviceProviderHost);
|
|
|
| for (size_t i = 0; i < kWebrtcDeviceProviderResourcesSize; i++) {
|
| @@ -69,21 +103,61 @@ WebRTCDeviceProvider::WebUI::WebUI(content::WebUI* web_ui)
|
| // a real implementation.
|
| web_ui->AddMessageHandler(new MessageHandler(nullptr));
|
|
|
| - content::WebUIDataSource::Add(profile, source);
|
| + WebUIDataSource::Add(profile, source);
|
| }
|
|
|
| WebRTCDeviceProvider::WebUI::~WebUI() {
|
| }
|
|
|
| -// WebRTCDeviceProvider -------------------------------------------------------
|
| +// WebRTCDeviceProvider::DevToolsBridgeClient ----------------------------------
|
| +
|
| +// static
|
| +base::WeakPtr<WebRTCDeviceProvider::DevToolsBridgeClient>
|
| +WebRTCDeviceProvider::DevToolsBridgeClient::Create(
|
| + Profile* profile,
|
| + SigninManagerBase* signin_manager,
|
| + ProfileOAuth2TokenService* token_service) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + auto instance = new DevToolsBridgeClient(
|
| + profile, signin_manager, token_service);
|
| + return instance->weak_factory_.GetWeakPtr();
|
| +}
|
|
|
| -WebRTCDeviceProvider::WebRTCDeviceProvider(content::BrowserContext* context) {
|
| - background_worker_.reset(content::WebContents::Create(
|
| - content::WebContents::CreateParams(context)));
|
| +WebRTCDeviceProvider::DevToolsBridgeClient::DevToolsBridgeClient(
|
| + Profile* profile,
|
| + SigninManagerBase* signin_manager,
|
| + ProfileOAuth2TokenService* token_service)
|
| + : profile_(profile),
|
| + identity_provider_(signin_manager, token_service, nullptr),
|
| + weak_factory_(this) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + identity_provider_.AddObserver(this);
|
| + registrar_.Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED,
|
| + content::Source<Profile>(profile_));
|
| +
|
| + if (!identity_provider_.GetActiveAccountId().empty())
|
| + CreateBackgroundWorker();
|
| +}
|
|
|
| - // TODO(serya): Make sure background_worker_ destructed before profile.
|
| - GURL url(kBackgroundWorkerURL);
|
| +WebRTCDeviceProvider::DevToolsBridgeClient::~DevToolsBridgeClient() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
|
|
| + identity_provider_.RemoveObserver(this);
|
| +}
|
| +
|
| +void WebRTCDeviceProvider::DevToolsBridgeClient::DeleteSelf() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + delete this;
|
| +}
|
| +
|
| +void WebRTCDeviceProvider::DevToolsBridgeClient::CreateBackgroundWorker() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + background_worker_.reset(
|
| + WebContents::Create(WebContents::CreateParams(profile_)));
|
| +
|
| + GURL url(kBackgroundWorkerURL);
|
| DCHECK_EQ(chrome::kChromeUIWebRTCDeviceProviderHost, url.host());
|
|
|
| background_worker_->GetController().LoadURL(
|
| @@ -96,20 +170,80 @@ WebRTCDeviceProvider::WebRTCDeviceProvider(content::BrowserContext* context) {
|
| new MessageHandler(this));
|
| }
|
|
|
| +void WebRTCDeviceProvider::DevToolsBridgeClient::Observe(
|
| + int type,
|
| + const NotificationSource& source,
|
| + const NotificationDetails& details) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + DCHECK_EQ(chrome::NOTIFICATION_PROFILE_DESTROYED, type);
|
| +
|
| + delete this;
|
| +}
|
| +
|
| +void WebRTCDeviceProvider::DevToolsBridgeClient::OnActiveAccountLogin() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + CreateBackgroundWorker();
|
| +}
|
| +
|
| +void WebRTCDeviceProvider::DevToolsBridgeClient::OnActiveAccountLogout() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + background_worker_.reset();
|
| +}
|
| +
|
| +// WebRTCDeviceProvider::MessageHandler ----------------------------------------
|
| +
|
| +WebRTCDeviceProvider::MessageHandler::MessageHandler(
|
| + DevToolsBridgeClient* owner) : owner_(owner) {
|
| +}
|
| +
|
| +void WebRTCDeviceProvider::MessageHandler::RegisterMessages() {
|
| + web_ui()->RegisterMessageCallback(
|
| + "loaded",
|
| + base::Bind(&MessageHandler::HandleLoaded, base::Unretained(this)));
|
| +}
|
| +
|
| +void WebRTCDeviceProvider::MessageHandler::HandleLoaded(
|
| + const base::ListValue* args) {
|
| + if (!owner_)
|
| + return;
|
| + // TODO(serya): implement
|
| +}
|
| +
|
| +// WebRTCDeviceProvider --------------------------------------------------------
|
| +
|
| +WebRTCDeviceProvider::WebRTCDeviceProvider(
|
| + Profile* profile,
|
| + SigninManagerBase* signin_manager,
|
| + ProfileOAuth2TokenService* token_service)
|
| + : client_(DevToolsBridgeClient::Create(
|
| + profile, signin_manager, token_service)) {
|
| +}
|
| +
|
| WebRTCDeviceProvider::~WebRTCDeviceProvider() {
|
| + BrowserThread::PostTask(
|
| + BrowserThread::UI,
|
| + FROM_HERE,
|
| + base::Bind(&DevToolsBridgeClient::DeleteSelf, client_));
|
| }
|
|
|
| void WebRTCDeviceProvider::QueryDevices(const SerialsCallback& callback) {
|
| // TODO(serya): Implement
|
| + base::MessageLoop::current()->PostTask(
|
| + FROM_HERE, base::Bind(callback, std::vector<std::string>()));
|
| }
|
|
|
| void WebRTCDeviceProvider::QueryDeviceInfo(const std::string& serial,
|
| const DeviceInfoCallback& callback) {
|
| // TODO(serya): Implement
|
| + base::MessageLoop::current()->PostTask(
|
| + FROM_HERE, base::Bind(callback, AndroidDeviceManager::DeviceInfo()));
|
| }
|
|
|
| void WebRTCDeviceProvider::OpenSocket(const std::string& serial,
|
| const std::string& socket_name,
|
| const SocketCallback& callback) {
|
| // TODO(serya): Implement
|
| + scoped_ptr<net::StreamSocket> socket;
|
| + base::MessageLoop::current()->PostTask(
|
| + FROM_HERE, base::Bind(callback, net::ERR_FAILED, base::Passed(&socket)));
|
| }
|
|
|