1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "android_webview/native/permission/media_access_permission_request.h" 6 7#include "android_webview/native/permission/aw_permission_request.h" 8#include "content/public/browser/media_capture_devices.h" 9 10using content::MediaCaptureDevices; 11using content::MediaStreamDevice; 12using content::MediaStreamDevices; 13 14namespace android_webview { 15 16namespace { 17 18// Return the device specified by |device_id| if exists, otherwise the first 19// available device is returned. 20const MediaStreamDevice* GetDeviceByIdOrFirstAvailable( 21 const MediaStreamDevices& devices, 22 const std::string& device_id) { 23 if (devices.empty()) 24 return NULL; 25 26 if (!device_id.empty()) { 27 for (size_t i = 0; i < devices.size(); ++i) { 28 if (devices[i].id == device_id) 29 return &devices[i]; 30 } 31 } 32 33 return &devices[0]; 34} 35 36} // namespace 37 38MediaAccessPermissionRequest::MediaAccessPermissionRequest( 39 const content::MediaStreamRequest& request, 40 const content::MediaResponseCallback& callback) 41 : request_(request), 42 callback_(callback) { 43} 44 45MediaAccessPermissionRequest::~MediaAccessPermissionRequest() { 46} 47 48void MediaAccessPermissionRequest::NotifyRequestResult(bool allowed) { 49 scoped_ptr<content::MediaStreamUI> ui; 50 MediaStreamDevices devices; 51 if (!allowed) { 52 callback_.Run(devices, content::MEDIA_DEVICE_PERMISSION_DENIED, ui.Pass()); 53 return; 54 } 55 56 if (request_.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE) { 57 const MediaStreamDevices& audio_devices = audio_test_devices_.empty()? 58 MediaCaptureDevices::GetInstance()->GetAudioCaptureDevices() : 59 audio_test_devices_; 60 const MediaStreamDevice* device = GetDeviceByIdOrFirstAvailable( 61 audio_devices, request_.requested_audio_device_id); 62 if (device) 63 devices.push_back(*device); 64 } 65 66 if (request_.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE) { 67 const MediaStreamDevices& video_devices = video_test_devices_.empty()? 68 MediaCaptureDevices::GetInstance()->GetVideoCaptureDevices() : 69 video_test_devices_; 70 const MediaStreamDevice* device = GetDeviceByIdOrFirstAvailable( 71 video_devices, request_.requested_video_device_id); 72 if (device) 73 devices.push_back(*device); 74 } 75 callback_.Run(devices, devices.empty() ? 76 content::MEDIA_DEVICE_NO_HARDWARE : content::MEDIA_DEVICE_OK, 77 ui.Pass()); 78} 79 80const GURL& MediaAccessPermissionRequest::GetOrigin() { 81 return request_.security_origin; 82} 83 84int64 MediaAccessPermissionRequest::GetResources() { 85 return (request_.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE ? 86 AwPermissionRequest::AudioCapture : 0) | 87 (request_.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE ? 88 AwPermissionRequest::VideoCapture : 0); 89} 90 91} // namespace android_webview 92