• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
10 using content::MediaCaptureDevices;
11 using content::MediaStreamDevice;
12 using content::MediaStreamDevices;
13 
14 namespace android_webview {
15 
16 namespace {
17 
18 // Return the device specified by |device_id| if exists, otherwise the first
19 // available device is returned.
GetDeviceByIdOrFirstAvailable(const MediaStreamDevices & devices,const std::string & device_id)20 const 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 
MediaAccessPermissionRequest(const content::MediaStreamRequest & request,const content::MediaResponseCallback & callback)38 MediaAccessPermissionRequest::MediaAccessPermissionRequest(
39     const content::MediaStreamRequest& request,
40     const content::MediaResponseCallback& callback)
41     : request_(request),
42       callback_(callback) {
43 }
44 
~MediaAccessPermissionRequest()45 MediaAccessPermissionRequest::~MediaAccessPermissionRequest() {
46 }
47 
NotifyRequestResult(bool allowed)48 void 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 
GetOrigin()80 const GURL& MediaAccessPermissionRequest::GetOrigin() {
81   return request_.security_origin;
82 }
83 
GetResources()84 int64 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