Index: android_webview/native/permission/media_access_permission_request.cc |
diff --git a/android_webview/native/permission/media_access_permission_request.cc b/android_webview/native/permission/media_access_permission_request.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6ef8c070f1df1a885b0397fd17a3c07a07ec4d7a |
--- /dev/null |
+++ b/android_webview/native/permission/media_access_permission_request.cc |
@@ -0,0 +1,91 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "android_webview/native/permission/media_access_permission_request.h" |
+ |
+#include "android_webview/native/permission/aw_permission_request.h" |
+#include "content/public/browser/media_capture_devices.h" |
+ |
+using content::MediaCaptureDevices; |
+using content::MediaStreamDevice; |
+using content::MediaStreamDevices; |
+ |
+namespace android_webview { |
+ |
+namespace { |
+ |
+// Return the device specified by |device_id| if exists, otherwise the first |
+// available device is returned. |
+const MediaStreamDevice* GetDeviceByIdOrFirstAvailable( |
+ const MediaStreamDevices& devices, |
+ const std::string& device_id) { |
+ if (devices.empty()) |
+ return NULL; |
+ |
+ if (!device_id.empty()) { |
+ for (size_t i = 0; i < devices.size(); ++i) { |
+ if (devices[i].id == device_id) |
+ return &devices[i]; |
+ } |
+ } |
+ |
+ return &devices[0]; |
+} |
+ |
+} // namespace |
+ |
+MediaAccessPermissionRequest::MediaAccessPermissionRequest( |
+ const content::MediaStreamRequest& request, |
+ const content::MediaResponseCallback& callback) |
+ : request_(request), |
+ callback_(callback) { |
+} |
+ |
+MediaAccessPermissionRequest::~MediaAccessPermissionRequest() { |
+} |
+ |
+void MediaAccessPermissionRequest::NotifyRequestResult(bool allowed) { |
+ scoped_ptr<content::MediaStreamUI> ui; |
+ MediaStreamDevices devices; |
+ if (!allowed) { |
+ callback_.Run(devices, content::MEDIA_DEVICE_PERMISSION_DENIED, ui.Pass()); |
+ return; |
+ } |
+ |
+ if (request_.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE) { |
+ const MediaStreamDevices& audio_devices = audio_test_devices_.empty()? |
+ MediaCaptureDevices::GetInstance()->GetAudioCaptureDevices() : |
+ audio_test_devices_; |
+ const MediaStreamDevice* device = GetDeviceByIdOrFirstAvailable( |
+ audio_devices, request_.requested_audio_device_id); |
+ if (device) |
+ devices.push_back(*device); |
+ } |
+ |
+ if (request_.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE) { |
+ const MediaStreamDevices& video_devices = video_test_devices_.empty()? |
+ MediaCaptureDevices::GetInstance()->GetVideoCaptureDevices() : |
+ video_test_devices_; |
+ const MediaStreamDevice* device = GetDeviceByIdOrFirstAvailable( |
+ video_devices, request_.requested_video_device_id); |
+ if (device) |
+ devices.push_back(*device); |
+ } |
+ callback_.Run(devices, devices.empty() ? |
+ content::MEDIA_DEVICE_NO_HARDWARE : content::MEDIA_DEVICE_OK, |
+ ui.Pass()); |
+} |
+ |
+const GURL& MediaAccessPermissionRequest::GetOrigin() { |
+ return request_.security_origin; |
+} |
+ |
+int64 MediaAccessPermissionRequest::GetResources() { |
+ return (request_.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE ? |
+ AwPermissionRequest::AudioCapture : 0) | |
+ (request_.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE ? |
+ AwPermissionRequest::VideoCapture : 0); |
+} |
+ |
+} // namespace android_webview |