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) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/metrics/histogram.h" 81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.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" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/media/media_capture_devices_dispatcher.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/media/media_stream_capture_indicator.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/media/media_stream_device_permissions.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h" 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/browser/content_settings_provider.h" 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/common/content_settings.h" 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/common/content_settings_pattern.h" 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/browser/render_widget_host_view.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/media_stream_request.h" 28424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "extensions/common/constants.h" 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "grit/theme_resources.h" 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool HasAvailableDevicesForRequest(const content::MediaStreamRequest& request) { 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const content::MediaStreamDevices* audio_devices = 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) request.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE ? 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &MediaCaptureDevicesDispatcher::GetInstance() 40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ->GetAudioCaptureDevices() : 41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) NULL; 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const content::MediaStreamDevices* video_devices = 44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) request.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE ? 45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) &MediaCaptureDevicesDispatcher::GetInstance() 46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ->GetVideoCaptureDevices() : 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) NULL; 48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Check if we're being asked for audio and/or video and that either of those 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // lists is empty. If they are, we do not have devices available for the 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // request. 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // TODO(tommi): It's kind of strange to have this here since if we fail this 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // test, there'll be a UI shown that indicates to the user that access to 54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // non-existing audio/video devices has been denied. The user won't have 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // any way to change that but there will be a UI shown which indicates that 56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // access is blocked. 57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if ((audio_devices != NULL && audio_devices->empty()) || 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) (video_devices != NULL && video_devices->empty())) { 59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Note: we check requested_[audio|video]_device_id before dereferencing 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // [audio|video]_devices. If the requested device id is non-empty, then 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // the corresponding device list must not be NULL. 65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!request.requested_audio_device_id.empty() && 67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) !audio_devices->FindById(request.requested_audio_device_id)) { 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!request.requested_video_device_id.empty() && 72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) !video_devices->FindById(request.requested_video_device_id)) { 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return true; 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)enum DevicePermissionActions { 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kAllowHttps = 0, 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kAllowHttp, 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kDeny, 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kCancel, 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kPermissionActionsMax // Must always be last! 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)MediaStreamDevicesController::MediaStreamTypeSettings::MediaStreamTypeSettings( 9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Permission permission, const std::string& requested_device_id): 9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) permission(permission), requested_device_id(requested_device_id) {} 9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)MediaStreamDevicesController::MediaStreamTypeSettings:: 9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) MediaStreamTypeSettings(): permission(MEDIA_NONE) {} 9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)MediaStreamDevicesController::MediaStreamTypeSettings:: 9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ~MediaStreamTypeSettings() {} 9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MediaStreamDevicesController::MediaStreamDevicesController( 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::WebContents* web_contents, 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::MediaStreamRequest& request, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::MediaResponseCallback& callback) 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : web_contents_(web_contents), 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_(request), 1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callback_(callback) { 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile_ = Profile::FromBrowserContext(web_contents->GetBrowserContext()); 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_settings_ = TabSpecificContentSettings::FromWebContents(web_contents); 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // For MEDIA_OPEN_DEVICE requests (Pepper) we always request both webcam 1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // and microphone to avoid popping two infobars. 1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // We start with setting the requested media type to allowed or blocked 1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // depending on the policy. If not blocked by policy it may be blocked later 1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // in the two remaining filtering steps (by user setting or by user when 1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // clicking the infobar). 1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // TODO(grunell): It's not the nicest solution to let the MEDIA_OPEN_DEVICE 1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // case take a ride on the MEDIA_DEVICE_*_CAPTURE permission. Should be fixed. 1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (request.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE || 1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) request.request_type == content::MEDIA_OPEN_DEVICE) { 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (GetDevicePolicy(profile_, 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci request_.security_origin, 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefs::kAudioCaptureAllowed, 1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) prefs::kAudioCaptureAllowedUrls) == ALWAYS_DENY) { 12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) request_permissions_.insert(std::make_pair( 12468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::MEDIA_DEVICE_AUDIO_CAPTURE, 12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) MediaStreamTypeSettings(MEDIA_BLOCKED_BY_POLICY, 12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) request.requested_audio_device_id))); 1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } else { 12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) request_permissions_.insert(std::make_pair( 12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::MEDIA_DEVICE_AUDIO_CAPTURE, 13068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) MediaStreamTypeSettings(MEDIA_ALLOWED, 13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) request.requested_audio_device_id))); 1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (request.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE || 1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) request.request_type == content::MEDIA_OPEN_DEVICE) { 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (GetDevicePolicy(profile_, 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci request_.security_origin, 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prefs::kVideoCaptureAllowed, 1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) prefs::kVideoCaptureAllowedUrls) == ALWAYS_DENY) { 14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) request_permissions_.insert(std::make_pair( 14168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::MEDIA_DEVICE_VIDEO_CAPTURE, 14268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) MediaStreamTypeSettings(MEDIA_BLOCKED_BY_POLICY, 14368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) request.requested_video_device_id))); 1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } else { 14568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) request_permissions_.insert(std::make_pair( 14668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) content::MEDIA_DEVICE_VIDEO_CAPTURE, 14768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) MediaStreamTypeSettings(MEDIA_ALLOWED, 14868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) request.requested_video_device_id))); 1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)MediaStreamDevicesController::~MediaStreamDevicesController() { 154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!callback_.is_null()) { 155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) callback_.Run(content::MediaStreamDevices(), 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::MEDIA_DEVICE_FAILED_DUE_TO_SHUTDOWN, 157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<content::MediaStreamUI>()); 158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 1627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid MediaStreamDevicesController::RegisterProfilePrefs( 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable* prefs) { 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs->RegisterBooleanPref(prefs::kVideoCaptureAllowed, 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) prefs->RegisterBooleanPref(prefs::kAudioCaptureAllowed, 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true, 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) prefs->RegisterListPref(prefs::kVideoCaptureAllowedUrls, 17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) prefs->RegisterListPref(prefs::kAudioCaptureAllowedUrls, 17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// TODO(gbillock): rename? doesn't actually dismiss. More of a 'check profile 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// and system for compatibility' thing. 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool MediaStreamDevicesController::DismissInfoBarAndTakeActionOnSettings() { 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Tab capture is allowed for extensions only and infobar is not shown for 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // extensions. 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (request_.audio_type == content::MEDIA_TAB_AUDIO_CAPTURE || 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) request_.video_type == content::MEDIA_TAB_VIDEO_CAPTURE) { 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Deny(false, content::MEDIA_DEVICE_INVALID_STATE); 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Deny the request if the security origin is empty, this happens with 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // file access without |--allow-file-access-from-files| flag. 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (request_.security_origin.is_empty()) { 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Deny(false, content::MEDIA_DEVICE_INVALID_SECURITY_ORIGIN); 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Deny the request if there is no device attached to the OS of the 195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // requested type. If both audio and video is requested, both types must be 196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // available. 197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!HasAvailableDevicesForRequest(request_)) { 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Deny(false, content::MEDIA_DEVICE_NO_HARDWARE); 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check if any allow exception has been made for this request. 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsRequestAllowedByDefault()) { 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Accept(false); 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Filter any parts of the request that have been blocked by default and deny 2097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // it if nothing is left to accept. 2107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (FilterBlockedByDefaultDevices() == 0) { 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Deny(false, content::MEDIA_DEVICE_PERMISSION_DENIED); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check if the media default setting is set to block. 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (IsDefaultMediaAccessBlocked()) { 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Deny(false, content::MEDIA_DEVICE_PERMISSION_DENIED); 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Show the infobar. 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool MediaStreamDevicesController::HasAudio() const { 2263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return IsDeviceAudioCaptureRequestedAndAllowed(); 2273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool MediaStreamDevicesController::HasVideo() const { 2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return IsDeviceVideoCaptureRequestedAndAllowed(); 2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const std::string& MediaStreamDevicesController::GetSecurityOriginSpec() const { 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return request_.security_origin.spec(); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void MediaStreamDevicesController::Accept(bool update_content_setting) { 2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NotifyUIRequestAccepted(); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Get the default devices for the request. 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::MediaStreamDevices devices; 2423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool audio_allowed = IsDeviceAudioCaptureRequestedAndAllowed(); 2433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) bool video_allowed = IsDeviceVideoCaptureRequestedAndAllowed(); 2443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (audio_allowed || video_allowed) { 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (request_.request_type) { 2467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case content::MEDIA_OPEN_DEVICE: { 2477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const content::MediaStreamDevice* device = NULL; 24868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // For open device request, when requested device_id is empty, pick 24968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // the first available of the given type. If requested device_id is 25068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // not empty, return the desired device if it's available. Otherwise, 25168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // return no device. 25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (audio_allowed && 25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) request_.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE) { 25468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!request_.requested_audio_device_id.empty()) { 25568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) device = MediaCaptureDevicesDispatcher::GetInstance()-> 25668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GetRequestedAudioDevice(request_.requested_audio_device_id); 25768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } else { 2587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch device = MediaCaptureDevicesDispatcher::GetInstance()-> 2597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetFirstAvailableAudioDevice(); 2607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } else if (video_allowed && 26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) request_.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE) { 2637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Pepper API opens only one device at a time. 26468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!request_.requested_video_device_id.empty()) { 26568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) device = MediaCaptureDevicesDispatcher::GetInstance()-> 26668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GetRequestedVideoDevice(request_.requested_video_device_id); 26768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } else { 2687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch device = MediaCaptureDevicesDispatcher::GetInstance()-> 2697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetFirstAvailableVideoDevice(); 2707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (device) 2737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch devices.push_back(*device); 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case content::MEDIA_GENERATE_STREAM: { 27758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool get_default_audio_device = audio_allowed; 27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool get_default_video_device = video_allowed; 2797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Get the exact audio or video device if an id is specified. 28158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (audio_allowed && !request_.requested_audio_device_id.empty()) { 2827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const content::MediaStreamDevice* audio_device = 2837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MediaCaptureDevicesDispatcher::GetInstance()-> 2847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetRequestedAudioDevice(request_.requested_audio_device_id); 2857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (audio_device) { 2867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch devices.push_back(*audio_device); 28758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) get_default_audio_device = false; 2887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 29058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (video_allowed && !request_.requested_video_device_id.empty()) { 2917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const content::MediaStreamDevice* video_device = 2927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MediaCaptureDevicesDispatcher::GetInstance()-> 2937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetRequestedVideoDevice(request_.requested_video_device_id); 2947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (video_device) { 2957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch devices.push_back(*video_device); 29658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) get_default_video_device = false; 2977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // If either or both audio and video devices were requested but not 3017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // specified by id, get the default devices. 30258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (get_default_audio_device || get_default_video_device) { 3037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MediaCaptureDevicesDispatcher::GetInstance()-> 3047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GetDefaultDevicesForProfile(profile_, 30558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) get_default_audio_device, 30658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) get_default_video_device, 3077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &devices); 3087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 3097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 31058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 31158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case content::MEDIA_DEVICE_ACCESS: { 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Get the default devices for the request. 313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MediaCaptureDevicesDispatcher::GetInstance()-> 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetDefaultDevicesForProfile(profile_, 3153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) audio_allowed, 3163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) video_allowed, 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &devices); 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) break; 31958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 32058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) case content::MEDIA_ENUMERATE_DEVICES: { 3217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Do nothing. 3227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NOTREACHED(); 3237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch break; 32458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 32558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } // switch 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // TODO(raymes): We currently set the content permission for non-https 3287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // websites for Pepper requests as well. This is temporary and should be 3297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // removed. 3307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (update_content_setting) { 3317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if ((IsSchemeSecure() && !devices.empty()) || 3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) request_.request_type == content::MEDIA_OPEN_DEVICE) { 3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SetPermission(true); 3347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (audio_allowed) { 3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) profile_->GetHostContentSettingsMap()->UpdateLastUsageByPattern( 3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ContentSettingsPattern::FromURLNoWildcard(request_.security_origin), 3405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ContentSettingsPattern::Wildcard(), 3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC); 3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 3435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (video_allowed) { 3445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) profile_->GetHostContentSettingsMap()->UpdateLastUsageByPattern( 3455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ContentSettingsPattern::FromURLNoWildcard(request_.security_origin), 3465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ContentSettingsPattern::Wildcard(), 3475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA); 3485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<content::MediaStreamUI> ui; 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!devices.empty()) { 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui = MediaCaptureDevicesDispatcher::GetInstance()-> 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetMediaStreamCaptureIndicator()->RegisterMediaStream( 355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_contents_, devices); 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 357868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::MediaResponseCallback cb = callback_; 358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) callback_.Reset(); 359e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch cb.Run(devices, 360e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch devices.empty() ? 361e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch content::MEDIA_DEVICE_NO_HARDWARE : content::MEDIA_DEVICE_OK, 362e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ui.Pass()); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void MediaStreamDevicesController::Deny( 366a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool update_content_setting, 367a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content::MediaStreamRequestResult result) { 368a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DLOG(WARNING) << "MediaStreamDevicesController::Deny: " << result; 3697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NotifyUIRequestDenied(); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 371010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (update_content_setting) { 372010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) CHECK_EQ(content::MEDIA_DEVICE_PERMISSION_DENIED, result); 373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetPermission(false); 374010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 376868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::MediaResponseCallback cb = callback_; 377868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) callback_.Reset(); 378a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) cb.Run(content::MediaStreamDevices(), 379a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) result, 380a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<content::MediaStreamUI>()); 381a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 382a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 383a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int MediaStreamDevicesController::GetIconID() const { 384a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (HasVideo()) 385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return IDR_INFOBAR_MEDIA_STREAM_CAMERA; 386a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 387a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return IDR_INFOBAR_MEDIA_STREAM_MIC; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 MediaStreamDevicesController::GetMessageText() const { 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int message_id = IDS_MEDIA_CAPTURE_AUDIO_AND_VIDEO; 3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!HasAudio()) 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_id = IDS_MEDIA_CAPTURE_VIDEO_ONLY; 3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (!HasVideo()) 3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_id = IDS_MEDIA_CAPTURE_AUDIO_ONLY; 3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return l10n_util::GetStringFUTF16( 3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_id, base::UTF8ToUTF16(GetSecurityOriginSpec())); 3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 MediaStreamDevicesController::GetMessageTextFragment() const { 4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int message_id = IDS_MEDIA_CAPTURE_AUDIO_AND_VIDEO_PERMISSION_FRAGMENT; 4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!HasAudio()) 4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_id = IDS_MEDIA_CAPTURE_VIDEO_ONLY_PERMISSION_FRAGMENT; 4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) else if (!HasVideo()) 4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) message_id = IDS_MEDIA_CAPTURE_AUDIO_ONLY_PERMISSION_FRAGMENT; 4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return l10n_util::GetStringUTF16(message_id); 4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool MediaStreamDevicesController::HasUserGesture() const { 410effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return request_.user_gesture; 4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)GURL MediaStreamDevicesController::GetRequestingHostname() const { 414a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return request_.security_origin; 4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void MediaStreamDevicesController::PermissionGranted() { 4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL origin(GetSecurityOriginSpec()); 4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (origin.SchemeIsSecure()) { 4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", 4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kAllowHttps, kPermissionActionsMax); 4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", 4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kAllowHttp, kPermissionActionsMax); 4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Accept(true); 4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void MediaStreamDevicesController::PermissionDenied() { 4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", 4315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kDeny, kPermissionActionsMax); 432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Deny(true, content::MEDIA_DEVICE_PERMISSION_DENIED); 4335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void MediaStreamDevicesController::Cancelled() { 4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Media.DevicePermissionActions", 4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kCancel, kPermissionActionsMax); 438010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) Deny(false, content::MEDIA_DEVICE_PERMISSION_DISMISSED); 4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void MediaStreamDevicesController::RequestFinished() { 4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delete this; 4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool MediaStreamDevicesController::IsRequestAllowedByDefault() const { 446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The request from internal objects like chrome://URLs is always allowed. 4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (CheckAllowAllMediaStreamContentForOrigin(profile_, 4481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci request_.security_origin)) { 449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 4501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) struct { 453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool has_capability; 454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const char* policy_name; 45590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const char* list_policy_name; 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentSettingsType settings_type; 457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } device_checks[] = { 4583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { IsDeviceAudioCaptureRequestedAndAllowed(), prefs::kAudioCaptureAllowed, 45990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) prefs::kAudioCaptureAllowedUrls, CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC }, 4603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { IsDeviceVideoCaptureRequestedAndAllowed(), prefs::kVideoCaptureAllowed, 46190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) prefs::kVideoCaptureAllowedUrls, 462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA }, 463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(device_checks); ++i) { 466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!device_checks[i].has_capability) 467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) continue; 468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MediaStreamDevicePolicy policy = 4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetDevicePolicy(profile_, 4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci request_.security_origin, 4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci device_checks[i].policy_name, 4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci device_checks[i].list_policy_name); 4747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (policy == ALWAYS_DENY) 476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return false; 4777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (policy == POLICY_NOT_SET) { 4797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Only load content settings from secure origins unless it is a 4807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // content::MEDIA_OPEN_DEVICE (Pepper) request. 4817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!IsSchemeSecure() && 4827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) request_.request_type != content::MEDIA_OPEN_DEVICE) { 4837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 4847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (profile_->GetHostContentSettingsMap()->GetContentSetting( 4867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) request_.security_origin, request_.security_origin, 4877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) device_checks[i].settings_type, NO_RESOURCE_IDENTIFIER) != 4887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CONTENT_SETTING_ALLOW) { 4897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 4907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 492c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // If we get here, then either policy is set to ALWAYS_ALLOW or the content 493c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // settings allow the request by default. 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 496c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochint MediaStreamDevicesController::FilterBlockedByDefaultDevices() { 5003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int requested_devices = 0; 5013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (IsDeviceAudioCaptureRequestedAndAllowed()) { 5033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (profile_->GetHostContentSettingsMap()->GetContentSetting( 5043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) request_.security_origin, 5053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) request_.security_origin, 5063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, 5073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) NO_RESOURCE_IDENTIFIER) == CONTENT_SETTING_BLOCK) { 50868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) request_permissions_[content::MEDIA_DEVICE_AUDIO_CAPTURE].permission = 5093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) MEDIA_BLOCKED_BY_USER_SETTING; 5103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } else { 5113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ++requested_devices; 5123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (IsDeviceVideoCaptureRequestedAndAllowed()) { 5163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (profile_->GetHostContentSettingsMap()->GetContentSetting( 5173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) request_.security_origin, 5183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) request_.security_origin, 5193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, 5203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) NO_RESOURCE_IDENTIFIER) == CONTENT_SETTING_BLOCK) { 52168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) request_permissions_[content::MEDIA_DEVICE_VIDEO_CAPTURE].permission = 5223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) MEDIA_BLOCKED_BY_USER_SETTING; 5233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } else { 5243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ++requested_devices; 5253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return requested_devices; 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool MediaStreamDevicesController::IsDefaultMediaAccessBlocked() const { 532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(markusheintz): Replace CONTENT_SETTINGS_TYPE_MEDIA_STREAM with the 534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // appropriate new CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC and 535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA. 536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentSetting current_setting = 537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile_->GetHostContentSettingsMap()->GetDefaultContentSetting( 538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CONTENT_SETTINGS_TYPE_MEDIASTREAM, NULL); 539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return (current_setting == CONTENT_SETTING_BLOCK); 540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool MediaStreamDevicesController::IsSchemeSecure() const { 543424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) return request_.security_origin.SchemeIsSecure() || 54446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) request_.security_origin.SchemeIs(extensions::kExtensionScheme); 545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void MediaStreamDevicesController::SetPermission(bool allowed) const { 548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentSettingsPattern primary_pattern = 550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentSettingsPattern::FromURLNoWildcard(request_.security_origin); 551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Check the pattern is valid or not. When the request is from a file access, 552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // no exception will be made. 553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!primary_pattern.IsValid()) 554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentSetting content_setting = allowed ? 557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK; 5583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (request_permissions_.find(content::MEDIA_DEVICE_AUDIO_CAPTURE) != 5593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) request_permissions_.end()) { 560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) profile_->GetHostContentSettingsMap()->SetContentSetting( 561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) primary_pattern, 562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentSettingsPattern::Wildcard(), 563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, 564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_setting); 566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 5673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (request_permissions_.find(content::MEDIA_DEVICE_VIDEO_CAPTURE) != 5683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) request_permissions_.end()) { 569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) profile_->GetHostContentSettingsMap()->SetContentSetting( 570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) primary_pattern, 571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ContentSettingsPattern::Wildcard(), 572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, 573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_setting); 575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void MediaStreamDevicesController::NotifyUIRequestAccepted() const { 5797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!content_settings_) 5807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 5817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) content_settings_->OnMediaStreamPermissionSet(request_.security_origin, 5833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) request_permissions_); 5847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void MediaStreamDevicesController::NotifyUIRequestDenied() { 5877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!content_settings_) 5887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 5897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (IsDeviceAudioCaptureRequestedAndAllowed()) { 59168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) request_permissions_[content::MEDIA_DEVICE_AUDIO_CAPTURE].permission = 5923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) MEDIA_BLOCKED_BY_USER; 5937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 5943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (IsDeviceVideoCaptureRequestedAndAllowed()) { 59568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) request_permissions_[content::MEDIA_DEVICE_VIDEO_CAPTURE].permission = 5963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) MEDIA_BLOCKED_BY_USER; 5973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 5983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) content_settings_->OnMediaStreamPermissionSet(request_.security_origin, 6003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) request_permissions_); 6013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 6023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool MediaStreamDevicesController::IsDeviceAudioCaptureRequestedAndAllowed() 6043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const { 60568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) MediaStreamTypeSettingsMap::const_iterator it = 6063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) request_permissions_.find(content::MEDIA_DEVICE_AUDIO_CAPTURE); 6075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return (it != request_permissions_.end() && IsCaptureDeviceRequestAllowed() && 60868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) it->second.permission == MEDIA_ALLOWED); 6093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 6107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool MediaStreamDevicesController::IsDeviceVideoCaptureRequestedAndAllowed() 6123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const { 61368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) MediaStreamTypeSettingsMap::const_iterator it = 6143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) request_permissions_.find(content::MEDIA_DEVICE_VIDEO_CAPTURE); 6155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return (it != request_permissions_.end() && IsCaptureDeviceRequestAllowed() && 61668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) it->second.permission == MEDIA_ALLOWED); 6177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 6185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 6195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool MediaStreamDevicesController::IsCaptureDeviceRequestAllowed() const { 6205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(OS_ANDROID) 6215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Don't approve device requests if the tab was hidden. 6225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // TODO(qinmin): Add a test for this. http://crbug.com/396869. 6235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return web_contents_->GetRenderWidgetHostView()->IsShowing(); 6245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 6255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return true; 6265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 627