media_stream_devices_controller.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/media/media_stream_devices_controller.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/command_line.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_provider.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/content_settings/tab_specific_content_settings.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/tab_capture/tab_capture_registry.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/tab_capture/tab_capture_registry_factory.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/media/media_capture_devices_dispatcher.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/scoped_user_pref_update.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/user_prefs/pref_registry_syncable.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/media_stream_request.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Return true if a microphone device is availbale. 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool HasMicrophoneDevice() { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::MediaStreamDevices& audio_devices = 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaCaptureDevicesDispatcher::GetInstance()->GetAudioCaptureDevices(); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !audio_devices.empty(); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Return true if a camera device is availbale. 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool HasCameraDevice() { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::MediaStreamDevices& video_devices = 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaCaptureDevicesDispatcher::GetInstance()->GetVideoCaptureDevices(); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !video_devices.empty(); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Store a permission setting in the given |host_content_settings_map|. 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SetPermission(HostContentSettingsMap* host_content_settings_map, 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& request_origin, 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentSettingsType content_type, 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentSetting content_setting) { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Storing mediastream permission settings on Android is not supported yet. 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_ANDROID) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentSettingsPattern primary_pattern = 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentSettingsPattern::FromURLNoWildcard(request_origin); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check the pattern is valid and don't store settings for invalid patterns. 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // When the request is from a file access, no exception will be made because 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the pattern will be invalid. 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // FIXME: Add an explicit check for file URLs instead of relying on this 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // implicit behavior. If this is just a preconditiono, then change it to a 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // DCHECK. 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!primary_pattern.IsValid()) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_content_settings_map->SetContentSetting( 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) primary_pattern, 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentSettingsPattern::Wildcard(), 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_type, 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string(), 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_setting); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns the permission settings for the given |request_origin| and 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |content_type|. If the policy with the given |policy_name| is set, then the 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// setting determined by the policy is returned. 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(pastramovj): Implement proper policy support for camera and microphone 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// policies and replace the |Profile| dependency with a dependency on the 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |HostContentSettingsMap|. 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ContentSetting GetPermission(Profile* profile, 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& request_origin, 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentSettingsType content_type, 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* policy_name) { 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(content_type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC || 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_type == CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefService* prefs = profile->GetPrefs(); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (prefs->IsManagedPreference(policy_name)) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return prefs->GetBoolean(policy_name) ? CONTENT_SETTING_ALLOW 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : CONTENT_SETTING_BLOCK; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentSetting setting = 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile->GetHostContentSettingsMap()->GetContentSetting( 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_origin, request_origin, content_type, NO_RESOURCE_IDENTIFIER); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For legacey reasons the content settings page (chrome://settings/content) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // does not allow to configure default values for the content settigs types 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC and 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA yet. Instead the default setting 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // of the content settings type CONTENT_SETTINGS_TYPE_MEDIASTREAM is used. 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Page specific permission settings for the content types 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA are set either to 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CONTENT_SETTING_ALLOW or the CONTENT_SETTING_BLOCK. If no page specific 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // setting fot the given |request_origin| exists, then the hardcoded default 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // value CONTENT_SETTING_ASK is returned. In this case the default setting of 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // content settings type CONTENT_SETTINGS_TYPE_MEDIASTREAM must be fetched. 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(markusheintz): Change the code to use the default settings for the 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // mic and camera content settings. 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (setting == CONTENT_SETTING_ASK) { 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) setting = profile->GetHostContentSettingsMap()->GetDefaultContentSetting( 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CONTENT_SETTINGS_TYPE_MEDIASTREAM, NULL); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return setting; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MediaStreamDevicesController::MediaStreamDevicesController( 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TabSpecificContentSettings* content_settings, 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::MediaStreamRequest& request, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::MediaResponseCallback& callback) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : profile_(profile), 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_settings_(content_settings), 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_(request), 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback_(callback), 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) microphone_access_(MEDIA_ACCESS_NOT_REQUESTED), 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) camera_access_(MEDIA_ACCESS_NOT_REQUESTED) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MediaStreamDevicesController::~MediaStreamDevicesController() {} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaStreamDevicesController::RegisterUserPrefs( 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefRegistrySyncable* prefs) { 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs->RegisterBooleanPref(prefs::kVideoCaptureAllowed, 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefRegistrySyncable::UNSYNCABLE_PREF); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs->RegisterBooleanPref(prefs::kAudioCaptureAllowed, 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefRegistrySyncable::UNSYNCABLE_PREF); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MediaStreamDevicesController::ProcessRequest() { 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The requests with type tab audio and tab video cature are requests for 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // screen casting. 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (request_.audio_type == content::MEDIA_TAB_AUDIO_CAPTURE || 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_.video_type == content::MEDIA_TAB_VIDEO_CAPTURE) { 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_NE(request_.audio_type, content::MEDIA_DEVICE_AUDIO_CAPTURE); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_NE(request_.video_type, content::MEDIA_DEVICE_VIDEO_CAPTURE); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_NE(request_.request_type, content::MEDIA_OPEN_DEVICE); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ProcessScreenCaptureRequest(); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ProcessMicrophoneCameraRequest(); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MediaStreamDevicesController::ProcessScreenCaptureRequest() { 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) microphone_access_ = MEDIA_ACCESS_BLOCKED; 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) camera_access_ = MEDIA_ACCESS_BLOCKED; 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback_.Run(content::MediaStreamDevices()); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For tab media requests, we need to make sure the request came from the 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // extension API, so we check the registry here. 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::TabCaptureRegistry* registry = 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::TabCaptureRegistryFactory::GetForProfile(profile_); 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!registry->VerifyRequest(request_.render_process_id, 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_.render_view_id)) { 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) microphone_access_ = MEDIA_ACCESS_BLOCKED; 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) camera_access_ = MEDIA_ACCESS_BLOCKED; 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback_.Run(content::MediaStreamDevices()); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::MediaStreamDevices devices; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (request_.audio_type == content::MEDIA_TAB_AUDIO_CAPTURE) { 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) devices.push_back(content::MediaStreamDevice( 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::MEDIA_TAB_AUDIO_CAPTURE, "", "")); 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (request_.video_type == content::MEDIA_TAB_VIDEO_CAPTURE) { 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) devices.push_back(content::MediaStreamDevice( 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::MEDIA_TAB_VIDEO_CAPTURE, "", "")); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback_.Run(devices); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MediaStreamDevicesController::ProcessMicrophoneCameraRequest() { 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Chrome polices for camera and microphone access are mapped to camera and 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // microphone permission settings. If policies for camera and microphone 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // access are set, then the camera and microphone permission settings are 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // controlled by the policies. In order to respect policies for camera and 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // microphone access, the camera and microphone settings must be fetched 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // first. 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (request_.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE) { 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) microphone_access_ = ContentSettingToMediaAccess( 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPermission( 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_, 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetRequestOrigin(), 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs::kAudioCaptureAllowed)); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (request_.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE) { 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) camera_access_ = ContentSettingToMediaAccess( 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetPermission( 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_, 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetRequestOrigin(), 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs::kVideoCaptureAllowed)); 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Requests with type MEDIA_OPEN_DEVICE are send from flapper. Flapper has a 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // separate permissions UI and manages it's own page specific permissions 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // similar to content settings. Flapper camera and microphone permissions are 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // checked before this code is run. If microphone and or camera access was 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // denied, then this code is not called. Therefor it is save to change media 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // stream access from MEDIA_ACCESS_REQUESTED to MEDIA_ACCESS_ALLOWED. 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Changing media stream access from MEDIA_ACCESS_REQUESTED to 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // MEDIA_ACCESS_ALLOWED prevents prompting the users for permissions again. 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // IMPORTANT: Policies for camera and microphone access are integrated into 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the content settings sytem. These policies don't support 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CONTENT_SETTING_ASK as permission value. Is means media stream access 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // can't be set to MEDIA_ACCESS_REQUESTED via policy. But media stream 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // settings set to MEDIA_ACCESS_BLOCK or MEDIA_ACCESS_ALLOW must not be 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // changed as they could have been set by policy. 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (request_.request_type == content::MEDIA_OPEN_DEVICE) { 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (microphone_access_ == MEDIA_ACCESS_REQUESTED) 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) microphone_access_ = MEDIA_ACCESS_BLOCKED; 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (camera_access_ == MEDIA_ACCESS_REQUESTED) 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) camera_access_ = MEDIA_ACCESS_BLOCKED; 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteProcessingRequest(); 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Block camera and microphone access for empty request origins. Request 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // origins can be empty when file URLS are used without the 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |--allow-file-access-from-files| flag. 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetRequestOrigin().is_empty()) { 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) microphone_access_ = MEDIA_ACCESS_BLOCKED; 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) camera_access_ = MEDIA_ACCESS_BLOCKED; 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteProcessingRequest(); 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (camera_access_ != MEDIA_ACCESS_REQUESTED && 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) microphone_access_ != MEDIA_ACCESS_REQUESTED) { 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteProcessingRequest(); 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Based on the current permission settings the user must be asked to grant 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // or deny the requested media stream access. 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MediaStreamDevicesController::IsMicrophoneRequested() const { 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return microphone_access_ == MEDIA_ACCESS_REQUESTED; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool MediaStreamDevicesController::IsCameraRequested() const { 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return camera_access_ == MEDIA_ACCESS_REQUESTED; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const GURL& MediaStreamDevicesController::GetRequestOrigin() const { 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return request_.security_origin; 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaStreamDevicesController::OnGrantPermission() { 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (microphone_access_ == MEDIA_ACCESS_REQUESTED) { 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) microphone_access_ = MEDIA_ACCESS_ALLOWED; 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetRequestOrigin().SchemeIsSecure()) { 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetPermission(profile_->GetHostContentSettingsMap(), 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetRequestOrigin(), 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CONTENT_SETTING_ALLOW); 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (camera_access_ == MEDIA_ACCESS_REQUESTED) { 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) camera_access_ = MEDIA_ACCESS_ALLOWED; 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GetRequestOrigin().SchemeIsSecure()) { 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetPermission(profile_->GetHostContentSettingsMap(), 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetRequestOrigin(), 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CONTENT_SETTING_ALLOW); 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteProcessingRequest(); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaStreamDevicesController::OnDenyPermission() { 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (microphone_access_ == MEDIA_ACCESS_REQUESTED) { 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) microphone_access_ = MEDIA_ACCESS_BLOCKED; 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetPermission(profile_->GetHostContentSettingsMap(), 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetRequestOrigin(), 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CONTENT_SETTING_BLOCK); 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (camera_access_ == MEDIA_ACCESS_REQUESTED) { 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) camera_access_ = MEDIA_ACCESS_BLOCKED; 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetPermission(profile_->GetHostContentSettingsMap(), 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetRequestOrigin(), 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CONTENT_SETTING_BLOCK); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteProcessingRequest(); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaStreamDevicesController::OnCancel() { 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (microphone_access_ == MEDIA_ACCESS_REQUESTED) 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) microphone_access_ = MEDIA_ACCESS_BLOCKED; 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (camera_access_ == MEDIA_ACCESS_REQUESTED) 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) camera_access_ = MEDIA_ACCESS_BLOCKED; 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteProcessingRequest(); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void MediaStreamDevicesController::CompleteProcessingRequest() { 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_NE(microphone_access_, MEDIA_ACCESS_REQUESTED); 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK_NE(camera_access_, MEDIA_ACCESS_REQUESTED); 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!HasMicrophoneDevice()) 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) microphone_access_ = MEDIA_ACCESS_NO_DEVICE; 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!HasCameraDevice()) 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) camera_access_ = MEDIA_ACCESS_NO_DEVICE; 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (content_settings_) { 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (microphone_access_ == MEDIA_ACCESS_BLOCKED) 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_settings_->OnMicrophoneAccessBlocked(); 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (microphone_access_ == MEDIA_ACCESS_ALLOWED) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_settings_->OnMicrophoneAccessed(); 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (camera_access_ == MEDIA_ACCESS_BLOCKED) 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_settings_->OnCameraAccessBlocked(); 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (camera_access_ == MEDIA_ACCESS_ALLOWED) 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_settings_->OnCameraAccessed(); 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(markusheintz): Remove this work argound once the 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TabSpecificContentSettings, the ContentSettingsImage and the 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ContentSettingsBubbleModel are changed. 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (microphone_access_ == MEDIA_ACCESS_BLOCKED || 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) camera_access_ == MEDIA_ACCESS_BLOCKED) { 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_settings_->OnContentBlocked(CONTENT_SETTINGS_TYPE_MEDIASTREAM, 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string()); 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (microphone_access_ == MEDIA_ACCESS_ALLOWED || 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) camera_access_ == MEDIA_ACCESS_ALLOWED) { 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_settings_->OnMediaStreamAllowed(); 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool get_microphone_stream = microphone_access_ == MEDIA_ACCESS_ALLOWED; 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool get_camera_stream = camera_access_ == MEDIA_ACCESS_ALLOWED; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!get_microphone_stream && !get_camera_stream) { 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback_.Run(content::MediaStreamDevices()); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::MediaStreamDevices devices; 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (request_.request_type) { 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case content::MEDIA_OPEN_DEVICE: 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For open device request pick the desired device or fall back to the 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // first available of the given type. 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaCaptureDevicesDispatcher::GetInstance()->GetRequestedDevice( 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_.requested_device_id, 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) get_microphone_stream, 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) get_camera_stream, 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &devices); 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case content::MEDIA_DEVICE_ACCESS: 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case content::MEDIA_GENERATE_STREAM: 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case content::MEDIA_ENUMERATE_DEVICES: 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get the default devices for the request. 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MediaCaptureDevicesDispatcher::GetInstance()-> 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetDefaultDevicesForProfile(profile_, 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) get_microphone_stream, 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) get_camera_stream, 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &devices); 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback_.Run(devices); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaStreamDevicesController::MediaAccess 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MediaStreamDevicesController::ContentSettingToMediaAccess( 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentSetting setting) const { 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (setting) { 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case CONTENT_SETTING_ALLOW: 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return MEDIA_ACCESS_ALLOWED; 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case CONTENT_SETTING_BLOCK: 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return MEDIA_ACCESS_BLOCKED; 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case CONTENT_SETTING_ASK: 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return MEDIA_ACCESS_REQUESTED; 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return MEDIA_ACCESS_NOT_REQUESTED; 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 404