Chromium Code Reviews| Index: content/browser/renderer_host/media/media_stream_manager.cc |
| diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc |
| index 1678d2b1148a06b6d34cf5e6e64229445517327a..8a25fcb795d332db746298a34e7f7d12202d4b83 100644 |
| --- a/content/browser/renderer_host/media/media_stream_manager.cc |
| +++ b/content/browser/renderer_host/media/media_stream_manager.cc |
| @@ -31,6 +31,7 @@ |
| #include "content/public/browser/media_observer.h" |
| #include "content/public/browser/media_request_state.h" |
| #include "content/public/browser/render_process_host.h" |
| +#include "content/public/common/content_client.h" |
| #include "content/public/common/content_switches.h" |
| #include "content/public/common/media_stream_request.h" |
| #include "media/audio/audio_manager_base.h" |
| @@ -198,7 +199,6 @@ class MediaStreamManager::DeviceRequest { |
| int requesting_frame_id, |
| int page_request_id, |
| const GURL& security_origin, |
| - bool have_permission, |
| bool user_gesture, |
| MediaStreamRequestType request_type, |
| const StreamOptions& options, |
| @@ -208,7 +208,6 @@ class MediaStreamManager::DeviceRequest { |
| requesting_frame_id(requesting_frame_id), |
| page_request_id(page_request_id), |
| security_origin(security_origin), |
| - have_permission(have_permission), |
| user_gesture(user_gesture), |
| request_type(request_type), |
| options(options), |
| @@ -325,10 +324,6 @@ class MediaStreamManager::DeviceRequest { |
| const GURL security_origin; |
| - // This is used when enumerating devices; if we don't have device access |
| - // permission, we remove the device label. |
| - bool have_permission; |
| - |
| const bool user_gesture; |
| const MediaStreamRequestType request_type; |
| @@ -433,7 +428,6 @@ std::string MediaStreamManager::MakeMediaAccessRequest( |
| render_frame_id, |
| page_request_id, |
| security_origin, |
| - true, |
| false, // user gesture |
| MEDIA_DEVICE_ACCESS, |
| options, |
| @@ -474,7 +468,6 @@ void MediaStreamManager::GenerateStream(MediaStreamRequester* requester, |
| render_frame_id, |
| page_request_id, |
| security_origin, |
| - true, |
| user_gesture, |
| MEDIA_GENERATE_STREAM, |
| options, |
| @@ -657,8 +650,7 @@ std::string MediaStreamManager::EnumerateDevices( |
| const ResourceContext::SaltCallback& sc, |
| int page_request_id, |
| MediaStreamType type, |
| - const GURL& security_origin, |
| - bool have_permission) { |
| + const GURL& security_origin) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| DCHECK(requester); |
| DCHECK(type == MEDIA_DEVICE_AUDIO_CAPTURE || |
| @@ -670,7 +662,6 @@ std::string MediaStreamManager::EnumerateDevices( |
| render_frame_id, |
| page_request_id, |
| security_origin, |
| - have_permission, |
| false, // user gesture |
| MEDIA_ENUMERATE_DEVICES, |
| StreamOptions(), |
| @@ -817,7 +808,6 @@ void MediaStreamManager::OpenDevice(MediaStreamRequester* requester, |
| render_frame_id, |
| page_request_id, |
| security_origin, |
| - true, |
| false, // user gesture |
| MEDIA_OPEN_DEVICE, |
| options, |
| @@ -1467,6 +1457,11 @@ void MediaStreamManager::FinalizeEnumerateDevices(const std::string& label, |
| DeviceRequest* request) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| DCHECK_EQ(request->request_type, MEDIA_ENUMERATE_DEVICES); |
| + DCHECK(((request->audio_type() == MEDIA_DEVICE_AUDIO_CAPTURE || |
| + request->audio_type() == MEDIA_DEVICE_AUDIO_OUTPUT) && |
| + request->video_type() == MEDIA_NO_SERVICE) || |
| + (request->audio_type() == MEDIA_NO_SERVICE && |
| + request->video_type() == MEDIA_DEVICE_VIDEO_CAPTURE)); |
| if (request->security_origin.is_valid()) { |
| for (StreamDeviceInfoArray::iterator it = request->devices.begin(); |
| @@ -1477,7 +1472,59 @@ void MediaStreamManager::FinalizeEnumerateDevices(const std::string& label, |
| request->devices.clear(); |
| } |
| - if (!request->have_permission) |
| + // Output label permissions are based on input permission. |
| + MediaStreamType type = |
| + request->audio_type() == MEDIA_DEVICE_AUDIO_CAPTURE || |
| + request->audio_type() == MEDIA_DEVICE_AUDIO_OUTPUT |
| + ? MEDIA_DEVICE_AUDIO_CAPTURE |
| + : MEDIA_DEVICE_VIDEO_CAPTURE; |
| + |
| + BrowserThread::PostTaskAndReplyWithResult( |
| + BrowserThread::UI, |
| + FROM_HERE, |
| + base::Bind(&MediaStreamManager::CheckMediaAccessOnUI, |
| + base::Unretained(this), |
| + request->requesting_process_id, |
| + request->security_origin, |
| + type), |
| + base::Bind(&MediaStreamManager::HandleCheckMediaAccessResponse, |
| + base::Unretained(this), |
| + label)); |
| +} |
| + |
| +bool MediaStreamManager::CheckMediaAccessOnUI(int render_process_id, |
|
perkj_chrome
2014/08/29 09:38:10
CheckMediaAccessPermissionsOnUi?
Henrik Grunell
2014/08/29 11:20:08
Yes, that's good. Even ...OnUIThread() so that it'
|
| + const GURL& security_origin, |
| + MediaStreamType type) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + |
| + RenderProcessHost* host = |
| + RenderProcessHost::FromID(render_process_id); |
| + if (!host) { |
| + // This can happen if the renderer goes away during the lifetime of a |
| + // request. |
| + return false; |
| + } |
| + content::BrowserContext* context = host->GetBrowserContext(); |
| + DCHECK(context); |
| + return GetContentClient()->browser()->CheckMediaAccessPermission( |
| + context, |
| + security_origin, |
| + type); |
| +} |
| + |
| +void MediaStreamManager::HandleCheckMediaAccessResponse( |
| + const std::string& label, |
| + bool have_access) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + |
| + DeviceRequest* request = FindRequest(label); |
| + if (!request) { |
| + // This can happen if the request was cancelled. |
| + DVLOG(1) << "The request with label " << label << " does not exist."; |
| + return; |
| + } |
| + |
| + if (!have_access) |
| ClearDeviceLabels(&request->devices); |
| request->requester->DevicesEnumerated( |