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