Index: chrome/browser/media/webrtc/media_stream_devices_controller.cc |
diff --git a/chrome/browser/media/webrtc/media_stream_devices_controller.cc b/chrome/browser/media/webrtc/media_stream_devices_controller.cc |
index 768ef2b0fc9b8e5b0b2fcc5ff5592526b00fd55b..2ee1bf2bafb9861b76a3de6018ff83ad81b0987b 100644 |
--- a/chrome/browser/media/webrtc/media_stream_devices_controller.cc |
+++ b/chrome/browser/media/webrtc/media_stream_devices_controller.cc |
@@ -8,6 +8,7 @@ |
#include <utility> |
#include "base/callback_helpers.h" |
+#include "base/feature_list.h" |
#include "base/memory/ptr_util.h" |
#include "base/metrics/histogram_macros.h" |
#include "base/strings/utf_string_conversions.h" |
@@ -23,7 +24,7 @@ |
#include "chrome/browser/permissions/permission_util.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/ui/browser.h" |
-#include "chrome/common/chrome_switches.h" |
+#include "chrome/common/chrome_features.h" |
#include "chrome/common/pref_names.h" |
#include "chrome/grit/generated_resources.h" |
#include "components/content_settings/core/browser/host_content_settings_map.h" |
@@ -387,6 +388,28 @@ void MediaStreamDevicesController::PromptAnswered(ContentSetting setting, |
RunCallback(); |
} |
+void MediaStreamDevicesController::PromptAnsweredGroupedRequest( |
+ const std::vector<ContentSetting>& responses) { |
+ DCHECK(responses.size() == 1 || responses.size() == 2); |
+ |
+ // The audio setting will always be the first one in the vector, if it was |
+ // requested. |
+ if (audio_setting_ == CONTENT_SETTING_ASK) |
+ audio_setting_ = responses.front(); |
+ |
+ if (video_setting_ == CONTENT_SETTING_ASK) |
+ video_setting_ = responses.back(); |
+ |
+ for (ContentSetting response : responses) { |
+ if (response == CONTENT_SETTING_BLOCK) |
+ denial_reason_ = content::MEDIA_DEVICE_PERMISSION_DENIED; |
+ else if (response == CONTENT_SETTING_ASK) |
+ denial_reason_ = content::MEDIA_DEVICE_PERMISSION_DISMISSED; |
+ } |
+ |
+ RunCallback(); |
+} |
+ |
#if defined(OS_ANDROID) |
void MediaStreamDevicesController::AndroidOSPromptAnswered(bool allowed) { |
DCHECK(audio_setting_ != CONTENT_SETTING_ASK && |
@@ -416,10 +439,10 @@ void MediaStreamDevicesController::RequestPermissionsWithDelegate( |
const content::MediaStreamRequest& request, |
const content::MediaResponseCallback& callback, |
PermissionPromptDelegate* delegate) { |
+ content::RenderFrameHost* rfh = content::RenderFrameHost::FromID( |
+ request.render_process_id, request.render_frame_id); |
content::WebContents* web_contents = |
- content::WebContents::FromRenderFrameHost( |
- content::RenderFrameHost::FromID(request.render_process_id, |
- request.render_frame_id)); |
+ content::WebContents::FromRenderFrameHost(rfh); |
if (request.request_type == content::MEDIA_OPEN_DEVICE_PEPPER_ONLY) { |
MediaPermissionRequestLogger::LogRequest( |
web_contents, request.render_process_id, request.render_frame_id, |
@@ -435,13 +458,32 @@ void MediaStreamDevicesController::RequestPermissionsWithDelegate( |
if (is_asking_for_audio || is_asking_for_video) { |
Profile* profile = |
Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
- delegate->ShowPrompt( |
- request.user_gesture, web_contents, |
- base::MakeUnique<Request>( |
- profile, is_asking_for_audio, is_asking_for_video, |
- request.security_origin, |
- base::Bind(&MediaStreamDevicesController::PromptAnswered, |
- base::Passed(&controller)))); |
+ if (base::FeatureList::IsEnabled( |
+ features::kUsePermissionManagerForMediaRequests)) { |
+ std::vector<ContentSettingsType> content_settings_types; |
+ |
+ if (is_asking_for_audio) |
+ content_settings_types.push_back(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC); |
+ if (is_asking_for_video) { |
+ content_settings_types.push_back( |
+ CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA); |
+ } |
+ |
+ PermissionManager::Get(profile)->RequestPermissions( |
+ content_settings_types, rfh, request.security_origin, |
+ request.user_gesture, |
+ base::Bind( |
+ &MediaStreamDevicesController::PromptAnsweredGroupedRequest, |
+ base::Passed(&controller))); |
+ } else { |
+ delegate->ShowPrompt( |
+ request.user_gesture, web_contents, |
+ base::MakeUnique<Request>( |
+ profile, is_asking_for_audio, is_asking_for_video, |
+ request.security_origin, |
+ base::Bind(&MediaStreamDevicesController::PromptAnswered, |
+ base::Passed(&controller)))); |
+ } |
return; |
} |