Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / content / browser / renderer_host / media / media_stream_manager.cc
index 6832d62..26aa2b6 100644 (file)
@@ -118,8 +118,13 @@ void DoAddLogMessage(const std::string& message) {
   // no-ops until MediaStreamManager is aware that a renderer process has
   // started logging. crbug.com/333894
   if (content::BrowserMainLoop::GetInstance()) {
-    content::BrowserMainLoop::GetInstance()->
-        media_stream_manager()->AddLogMessageOnUIThread(message);
+    BrowserThread::PostTask(
+        BrowserThread::IO,
+        FROM_HERE,
+        base::Bind(&MediaStreamManager::AddLogMessageOnIOThread,
+                   base::Unretained(content::BrowserMainLoop::GetInstance()
+                                        ->media_stream_manager()),
+                   message));
   }
 }
 
@@ -140,6 +145,11 @@ std::string GetLogMessageString(MediaStreamType stream_type,
   return output_string;
 }
 
+// Needed for MediaStreamManager::GenerateStream below.
+std::string ReturnEmptySalt() {
+  return std::string();
+}
+
 }  // namespace
 
 
@@ -158,7 +168,7 @@ class MediaStreamManager::DeviceRequest {
                 const GURL& security_origin,
                 MediaStreamRequestType request_type,
                 const StreamOptions& options,
-                ResourceContext* resource_context)
+                const ResourceContext::SaltCallback& salt_callback)
       : requester(requester),
         requesting_process_id(requesting_process_id),
         requesting_view_id(requesting_view_id),
@@ -166,7 +176,7 @@ class MediaStreamManager::DeviceRequest {
         security_origin(security_origin),
         request_type(request_type),
         options(options),
-        resource_context(resource_context),
+        salt_callback(salt_callback),
         state_(NUM_MEDIA_TYPES, MEDIA_REQUEST_STATE_NOT_REQUESTED),
         audio_type_(MEDIA_NO_SERVICE),
         video_type_(MEDIA_NO_SERVICE) {
@@ -286,7 +296,7 @@ class MediaStreamManager::DeviceRequest {
 
   const StreamOptions options;
 
-  ResourceContext* resource_context;
+  ResourceContext::SaltCallback salt_callback;
 
   StreamDeviceInfoArray devices;
 
@@ -341,7 +351,7 @@ MediaStreamManager::MediaStreamManager(media::AudioManager* audio_manager)
 MediaStreamManager::~MediaStreamManager() {
   DVLOG(1) << "~MediaStreamManager";
   DCHECK(requests_.empty());
-  DCHECK(!device_thread_.get());
+  DCHECK(!device_task_runner_);
 }
 
 VideoCaptureManager* MediaStreamManager::video_capture_manager() {
@@ -374,7 +384,7 @@ std::string MediaStreamManager::MakeMediaAccessRequest(
                                              security_origin,
                                              MEDIA_DEVICE_ACCESS,
                                              options,
-                                             NULL);
+                                             base::Bind(&ReturnEmptySalt));
 
   const std::string& label = AddRequest(request);
 
@@ -394,7 +404,7 @@ std::string MediaStreamManager::MakeMediaAccessRequest(
 void MediaStreamManager::GenerateStream(MediaStreamRequester* requester,
                                         int render_process_id,
                                         int render_view_id,
-                                        ResourceContext* rc,
+                                        const ResourceContext::SaltCallback& sc,
                                         int page_request_id,
                                         const StreamOptions& options,
                                         const GURL& security_origin) {
@@ -412,7 +422,7 @@ void MediaStreamManager::GenerateStream(MediaStreamRequester* requester,
                                              security_origin,
                                              MEDIA_GENERATE_STREAM,
                                              options,
-                                             rc);
+                                             sc);
 
   const std::string& label = AddRequest(request);
 
@@ -588,7 +598,7 @@ std::string MediaStreamManager::EnumerateDevices(
     MediaStreamRequester* requester,
     int render_process_id,
     int render_view_id,
-    ResourceContext* rc,
+    const ResourceContext::SaltCallback& sc,
     int page_request_id,
     MediaStreamType type,
     const GURL& security_origin) {
@@ -604,7 +614,7 @@ std::string MediaStreamManager::EnumerateDevices(
                                              security_origin,
                                              MEDIA_ENUMERATE_DEVICES,
                                              StreamOptions(),
-                                             rc);
+                                             sc);
   if (IsAudioMediaType(type))
     request->SetAudioType(type);
   else if (IsVideoMediaType(type))
@@ -655,7 +665,7 @@ void MediaStreamManager::DoEnumerateDevices(const std::string& label) {
 void MediaStreamManager::OpenDevice(MediaStreamRequester* requester,
                                     int render_process_id,
                                     int render_view_id,
-                                    ResourceContext* rc,
+                                    const ResourceContext::SaltCallback& sc,
                                     int page_request_id,
                                     const std::string& device_id,
                                     MediaStreamType type,
@@ -683,7 +693,7 @@ void MediaStreamManager::OpenDevice(MediaStreamRequester* requester,
                                              security_origin,
                                              MEDIA_OPEN_DEVICE,
                                              options,
-                                             rc);
+                                             sc);
 
   const std::string& label = AddRequest(request);
   // Post a task and handle the request asynchronously. The reason is that the
@@ -711,8 +721,8 @@ void MediaStreamManager::StopRemovedDevices(
   for (StreamDeviceInfoArray::const_iterator old_dev_it = old_devices.begin();
        old_dev_it != old_devices.end(); ++old_dev_it) {
     bool device_found = false;
-    for (StreamDeviceInfoArray::const_iterator new_dev_it = new_devices.begin();
-         new_dev_it != new_devices.end(); ++new_dev_it) {
+    StreamDeviceInfoArray::const_iterator new_dev_it = new_devices.begin();
+    for (; new_dev_it != new_devices.end(); ++new_dev_it) {
       if (old_dev_it->device.id == new_dev_it->device.id) {
         device_found = true;
         break;
@@ -736,7 +746,7 @@ void MediaStreamManager::StopRemovedDevice(const MediaStreamDevice& device) {
              request->devices.begin();
          device_it != request->devices.end(); ++device_it) {
       std::string source_id = content::GetHMACForMediaDeviceID(
-          request->resource_context,
+          request->salt_callback,
           request->security_origin,
           device.id);
       if (device_it->device.id == source_id &&
@@ -811,7 +821,7 @@ bool MediaStreamManager::GetRequestedDeviceCaptureId(
   // id.
   if (source_ids.size() == 1 &&
       !TranslateSourceIdToDeviceId(type,
-                                   request->resource_context,
+                                   request->salt_callback,
                                    request->security_origin,
                                    source_ids[0], device_id)) {
     LOG(WARNING) << "Invalid mandatory " << kMediaStreamSourceInfoId
@@ -828,7 +838,7 @@ bool MediaStreamManager::GetRequestedDeviceCaptureId(
     for (std::vector<std::string>::const_iterator it = source_ids.begin();
          it != source_ids.end(); ++it) {
       if (TranslateSourceIdToDeviceId(type,
-                                      request->resource_context,
+                                      request->salt_callback,
                                       request->security_origin,
                                       *it,
                                       device_id)) {
@@ -845,7 +855,7 @@ void MediaStreamManager::TranslateDeviceIdToSourceId(
   if (request->audio_type() == MEDIA_DEVICE_AUDIO_CAPTURE ||
       request->video_type() == MEDIA_DEVICE_VIDEO_CAPTURE) {
     device->id = content::GetHMACForMediaDeviceID(
-        request->resource_context,
+        request->salt_callback,
         request->security_origin,
         device->id);
   }
@@ -853,7 +863,7 @@ void MediaStreamManager::TranslateDeviceIdToSourceId(
 
 bool MediaStreamManager::TranslateSourceIdToDeviceId(
     MediaStreamType stream_type,
-    ResourceContext* rc,
+    const ResourceContext::SaltCallback& sc,
     const GURL& security_origin,
     const std::string& source_id,
     std::string* device_id) const {
@@ -874,7 +884,7 @@ bool MediaStreamManager::TranslateSourceIdToDeviceId(
   for (StreamDeviceInfoArray::const_iterator it = cache->devices.begin();
        it != cache->devices.end();
        ++it) {
-    if (content::DoesMediaDeviceIDMatchHMAC(rc, security_origin, source_id,
+    if (content::DoesMediaDeviceIDMatchHMAC(sc, security_origin, source_id,
                                             it->device.id)) {
       *device_id = it->device.id;
       return true;
@@ -1211,7 +1221,7 @@ bool MediaStreamManager::FindExistingRequestedDeviceInfo(
   DCHECK(existing_request_state);
 
   std::string source_id = content::GetHMACForMediaDeviceID(
-      new_request.resource_context,
+      new_request.salt_callback,
       new_request.security_origin,
       new_device_info.id);
 
@@ -1348,22 +1358,16 @@ void MediaStreamManager::FinalizeMediaAccessRequest(
 
 void MediaStreamManager::InitializeDeviceManagersOnIOThread() {
   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
-  if (device_thread_)
+  if (device_task_runner_)
     return;
 
-  device_thread_.reset(new base::Thread("MediaStreamDeviceThread"));
-#if defined(OS_WIN)
-  device_thread_->init_com_with_mta(true);
-#endif
-  CHECK(device_thread_->Start());
+  device_task_runner_ = audio_manager_->GetWorkerTaskRunner();
 
   audio_input_device_manager_ = new AudioInputDeviceManager(audio_manager_);
-  audio_input_device_manager_->Register(
-      this, device_thread_->message_loop_proxy().get());
+  audio_input_device_manager_->Register(this, device_task_runner_);
 
   video_capture_manager_ = new VideoCaptureManager();
-  video_capture_manager_->Register(this,
-                                   device_thread_->message_loop_proxy().get());
+  video_capture_manager_->Register(this, device_task_runner_);
 
   // We want to be notified of IO message loop destruction to delete the thread
   // and the device managers.
@@ -1538,16 +1542,9 @@ void MediaStreamManager::SendMessageToNativeLog(const std::string& message) {
       base::Bind(DoAddLogMessage, message));
 }
 
-void MediaStreamManager::AddLogMessageOnUIThread(const std::string& message) {
-#if defined(OS_ANDROID)
-  // It appears android_aosp is being built with ENABLE_WEBRTC=0, since it does
-  // not find RenderProcessHostImpl::WebRtcLogMessage. Logging is not enabled on
-  // Android anyway, so make this function a no-op.
-  // TODO(vrk): Figure out what's going on here and fix.
-  return;
-#else
-  // Must be on the UI thread to access RenderProcessHost from process ID.
-  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+void MediaStreamManager::AddLogMessageOnIOThread(const std::string& message) {
+  // Get render process ids on the IO thread.
+  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
 
   // Grab all unique process ids that request a MediaStream or have a
   // MediaStream running.
@@ -1559,6 +1556,25 @@ void MediaStreamManager::AddLogMessageOnUIThread(const std::string& message) {
       requesting_process_ids.insert(request->requesting_process_id);
   }
 
+  // MediaStreamManager is a singleton in BrowserMainLoop, which owns the UI
+  // thread. MediaStreamManager has the same lifetime as the UI thread, so it is
+  // safe to use base::Unretained.
+  BrowserThread::PostTask(
+      BrowserThread::UI,
+      FROM_HERE,
+      base::Bind(&MediaStreamManager::AddLogMessageOnUIThread,
+                 base::Unretained(this),
+                 requesting_process_ids,
+                 message));
+}
+
+void MediaStreamManager::AddLogMessageOnUIThread(
+    const std::set<int>& requesting_process_ids,
+    const std::string& message) {
+#if defined(ENABLE_WEBRTC)
+  // Must be on the UI thread to access RenderProcessHost from process ID.
+  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
   for (std::set<int>::const_iterator it = requesting_process_ids.begin();
        it != requesting_process_ids.end(); ++it) {
     // Log the message to all renderers that are requesting a MediaStream or
@@ -1712,12 +1728,12 @@ void MediaStreamManager::WillDestroyCurrentMessageLoop() {
   DVLOG(3) << "MediaStreamManager::WillDestroyCurrentMessageLoop()";
   DCHECK_EQ(base::MessageLoop::current(), io_loop_);
   DCHECK(requests_.empty());
-  if (device_thread_) {
+  if (device_task_runner_) {
     StopMonitoring();
 
     video_capture_manager_->Unregister();
     audio_input_device_manager_->Unregister();
-    device_thread_.reset();
+    device_task_runner_ = NULL;
   }
 
   audio_input_device_manager_ = NULL;