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..032664f57dffd1b163011bd78b1e02a41df56feb 100644 |
--- a/chrome/browser/devtools/device/webrtc/webrtc_device_provider.cc |
+++ b/chrome/browser/devtools/device/webrtc/webrtc_device_provider.cc |
@@ -4,59 +4,95 @@ |
#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 "google_apis/gaia/identity_provider.h" |
dgozman
2014/12/08 12:22:43
nit: let's remove this.
SeRya
2014/12/08 13:02:25
Done.
|
#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::Source; |
dgozman
2014/12/08 12:22:43
Let's drop this one.
SeRya
2014/12/08 13:02:25
Done.
|
+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 +105,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, NULL), |
dgozman
2014/12/08 12:22:43
nit: nullptr
SeRya
2014/12/08 13:02:25
Done.
|
+ weak_factory_(this) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ |
+ identity_provider_.AddObserver(this); |
+ registrar_.Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED, |
+ 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 +172,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))); |
} |