| 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 a063d9b0642cf80bcd36a6a162d1f3eefc876c2d..c7df7040464e7c448dea487ba997bfc7780e8844 100644
|
| --- a/chrome/browser/media/webrtc/media_stream_devices_controller.cc
|
| +++ b/chrome/browser/media/webrtc/media_stream_devices_controller.cc
|
| @@ -190,31 +190,134 @@ bool HasAvailableDevices(ContentSettingsType content_type,
|
|
|
| } // namespace
|
|
|
| +MediaStreamDevicesController::Request::Request(
|
| + Profile* profile,
|
| + bool is_asking_for_audio,
|
| + bool is_asking_for_video,
|
| + const GURL& security_origin,
|
| + PromptAnsweredCallback prompt_answered_callback)
|
| + : profile_(profile),
|
| + is_asking_for_audio_(is_asking_for_audio),
|
| + is_asking_for_video_(is_asking_for_video),
|
| + security_origin_(security_origin),
|
| + prompt_answered_callback_(prompt_answered_callback),
|
| + responded_(false) {}
|
| +
|
| +MediaStreamDevicesController::Request::~Request() {
|
| + if (!responded_) {
|
| + RecordPermissionAction(is_asking_for_audio_, is_asking_for_video_,
|
| + security_origin_, profile_,
|
| + base::Bind(PermissionUmaUtil::PermissionIgnored));
|
| + }
|
| +}
|
| +
|
| +bool MediaStreamDevicesController::Request::IsAskingForAudio() const {
|
| + return is_asking_for_audio_;
|
| +}
|
| +
|
| +bool MediaStreamDevicesController::Request::IsAskingForVideo() const {
|
| + return is_asking_for_video_;
|
| +}
|
| +
|
| +base::string16 MediaStreamDevicesController::Request::GetMessageText() const {
|
| + int message_id = IDS_MEDIA_CAPTURE_AUDIO_AND_VIDEO;
|
| + if (!IsAskingForAudio())
|
| + message_id = IDS_MEDIA_CAPTURE_VIDEO_ONLY;
|
| + else if (!IsAskingForVideo())
|
| + message_id = IDS_MEDIA_CAPTURE_AUDIO_ONLY;
|
| + return l10n_util::GetStringFUTF16(
|
| + message_id,
|
| + url_formatter::FormatUrlForSecurityDisplay(
|
| + GetOrigin(), url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC));
|
| +}
|
| +
|
| +PermissionRequest::IconId MediaStreamDevicesController::Request::GetIconId()
|
| + const {
|
| +#if defined(OS_ANDROID)
|
| + return IsAskingForVideo() ? IDR_INFOBAR_MEDIA_STREAM_CAMERA
|
| + : IDR_INFOBAR_MEDIA_STREAM_MIC;
|
| +#else
|
| + return IsAskingForVideo() ? ui::kVideocamIcon : ui::kMicrophoneIcon;
|
| +#endif
|
| +}
|
| +
|
| +base::string16 MediaStreamDevicesController::Request::GetMessageTextFragment()
|
| + const {
|
| + int message_id = IDS_MEDIA_CAPTURE_AUDIO_AND_VIDEO_PERMISSION_FRAGMENT;
|
| + if (!IsAskingForAudio())
|
| + message_id = IDS_MEDIA_CAPTURE_VIDEO_ONLY_PERMISSION_FRAGMENT;
|
| + else if (!IsAskingForVideo())
|
| + message_id = IDS_MEDIA_CAPTURE_AUDIO_ONLY_PERMISSION_FRAGMENT;
|
| + return l10n_util::GetStringUTF16(message_id);
|
| +}
|
| +
|
| +GURL MediaStreamDevicesController::Request::GetOrigin() const {
|
| + return security_origin_;
|
| +}
|
| +
|
| +void MediaStreamDevicesController::Request::PermissionGranted() {
|
| + RecordPermissionAction(is_asking_for_audio_, is_asking_for_video_,
|
| + security_origin_, profile_,
|
| + base::Bind(PermissionUmaUtil::PermissionGranted));
|
| + responded_ = true;
|
| + prompt_answered_callback_.Run(CONTENT_SETTING_ALLOW, persist());
|
| +}
|
| +
|
| +void MediaStreamDevicesController::Request::PermissionDenied() {
|
| + RecordPermissionAction(is_asking_for_audio_, is_asking_for_video_,
|
| + security_origin_, profile_,
|
| + base::Bind(PermissionUmaUtil::PermissionDenied));
|
| + responded_ = true;
|
| + prompt_answered_callback_.Run(CONTENT_SETTING_BLOCK, persist());
|
| +}
|
| +
|
| +void MediaStreamDevicesController::Request::Cancelled() {
|
| + RecordPermissionAction(is_asking_for_audio_, is_asking_for_video_,
|
| + security_origin_, profile_,
|
| + base::Bind(PermissionUmaUtil::PermissionDismissed));
|
| + responded_ = true;
|
| + prompt_answered_callback_.Run(CONTENT_SETTING_ASK, false /* persist */);
|
| +}
|
| +
|
| +void MediaStreamDevicesController::Request::RequestFinished() {
|
| + delete this;
|
| +}
|
| +
|
| +PermissionRequestType
|
| +MediaStreamDevicesController::Request::GetPermissionRequestType() const {
|
| + return PermissionRequestType::MEDIA_STREAM;
|
| +}
|
| +
|
| +bool MediaStreamDevicesController::Request::ShouldShowPersistenceToggle()
|
| + const {
|
| + return PermissionUtil::ShouldShowPersistenceToggle();
|
| +}
|
| +
|
| // Implementation of PermissionPromptDelegate which actually shows a permission
|
| // prompt.
|
| class MediaStreamDevicesController::PermissionPromptDelegateImpl
|
| - : public internal::PermissionPromptDelegate {
|
| + : public MediaStreamDevicesController::PermissionPromptDelegate {
|
| public:
|
| void ShowPrompt(
|
| bool user_gesture,
|
| content::WebContents* web_contents,
|
| - std::unique_ptr<MediaStreamDevicesController> controller) override {
|
| + std::unique_ptr<MediaStreamDevicesController::Request> request) override {
|
| #if defined(OS_ANDROID)
|
| PermissionUmaUtil::RecordPermissionPromptShown(
|
| - controller->GetPermissionRequestType(),
|
| + request->GetPermissionRequestType(),
|
| PermissionUtil::GetGestureType(user_gesture));
|
| if (PermissionDialogDelegate::ShouldShowDialog(user_gesture)) {
|
| PermissionDialogDelegate::CreateMediaStreamDialog(
|
| - web_contents, user_gesture, std::move(controller));
|
| + web_contents, user_gesture, std::move(request));
|
| } else {
|
| MediaStreamInfoBarDelegateAndroid::Create(web_contents, user_gesture,
|
| - std::move(controller));
|
| + std::move(request));
|
| }
|
| #else
|
| PermissionRequestManager* permission_request_manager =
|
| PermissionRequestManager::FromWebContents(web_contents);
|
| if (permission_request_manager)
|
| - permission_request_manager->AddRequest(controller.release());
|
| + permission_request_manager->AddRequest(request.release());
|
| #endif
|
| }
|
| };
|
| @@ -238,9 +341,6 @@ void MediaStreamDevicesController::RegisterProfilePrefs(
|
|
|
| MediaStreamDevicesController::~MediaStreamDevicesController() {
|
| if (!callback_.is_null()) {
|
| - RecordPermissionAction(IsAskingForAudio(), IsAskingForVideo(), GetOrigin(),
|
| - profile_,
|
| - base::Bind(PermissionUmaUtil::PermissionIgnored));
|
| callback_.Run(content::MediaStreamDevices(),
|
| content::MEDIA_DEVICE_FAILED_DUE_TO_SHUTDOWN,
|
| std::unique_ptr<content::MediaStreamUI>());
|
| @@ -255,16 +355,23 @@ bool MediaStreamDevicesController::IsAskingForVideo() const {
|
| return old_video_setting_ == CONTENT_SETTING_ASK;
|
| }
|
|
|
| -base::string16 MediaStreamDevicesController::GetMessageText() const {
|
| - int message_id = IDS_MEDIA_CAPTURE_AUDIO_AND_VIDEO;
|
| - if (!IsAskingForAudio())
|
| - message_id = IDS_MEDIA_CAPTURE_VIDEO_ONLY;
|
| - else if (!IsAskingForVideo())
|
| - message_id = IDS_MEDIA_CAPTURE_AUDIO_ONLY;
|
| - return l10n_util::GetStringFUTF16(
|
| - message_id,
|
| - url_formatter::FormatUrlForSecurityDisplay(
|
| - GetOrigin(), url_formatter::SchemeDisplay::OMIT_CRYPTOGRAPHIC));
|
| +void MediaStreamDevicesController::PromptAnswered(ContentSetting setting,
|
| + bool persist) {
|
| + ContentSetting audio_setting = GetNewSetting(
|
| + CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, old_audio_setting_, setting);
|
| + ContentSetting video_setting = GetNewSetting(
|
| + CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, old_video_setting_, setting);
|
| +
|
| + if (persist)
|
| + StorePermission(audio_setting, video_setting);
|
| +
|
| + content::MediaStreamRequestResult denial_reason = content::MEDIA_DEVICE_OK;
|
| + if (setting == CONTENT_SETTING_ASK)
|
| + denial_reason = content::MEDIA_DEVICE_PERMISSION_DISMISSED;
|
| + else if (setting == CONTENT_SETTING_BLOCK)
|
| + denial_reason = content::MEDIA_DEVICE_PERMISSION_DENIED;
|
| +
|
| + RunCallback(audio_setting, video_setting, denial_reason);
|
| }
|
|
|
| #if defined(OS_ANDROID)
|
| @@ -290,76 +397,11 @@ void MediaStreamDevicesController::AndroidOSPromptAnswered(bool allowed) {
|
| }
|
| #endif // defined(OS_ANDROID)
|
|
|
| -PermissionRequest::IconId MediaStreamDevicesController::GetIconId() const {
|
| -#if defined(OS_ANDROID)
|
| - return IsAskingForVideo() ? IDR_INFOBAR_MEDIA_STREAM_CAMERA
|
| - : IDR_INFOBAR_MEDIA_STREAM_MIC;
|
| -#else
|
| - return IsAskingForVideo() ? ui::kVideocamIcon : ui::kMicrophoneIcon;
|
| -#endif
|
| -}
|
| -
|
| -base::string16 MediaStreamDevicesController::GetMessageTextFragment() const {
|
| - int message_id = IDS_MEDIA_CAPTURE_AUDIO_AND_VIDEO_PERMISSION_FRAGMENT;
|
| - if (!IsAskingForAudio())
|
| - message_id = IDS_MEDIA_CAPTURE_VIDEO_ONLY_PERMISSION_FRAGMENT;
|
| - else if (!IsAskingForVideo())
|
| - message_id = IDS_MEDIA_CAPTURE_AUDIO_ONLY_PERMISSION_FRAGMENT;
|
| - return l10n_util::GetStringUTF16(message_id);
|
| -}
|
| -
|
| -GURL MediaStreamDevicesController::GetOrigin() const {
|
| - return request_.security_origin;
|
| -}
|
| -
|
| -void MediaStreamDevicesController::PermissionGranted() {
|
| - RecordPermissionAction(IsAskingForAudio(), IsAskingForVideo(), GetOrigin(),
|
| - profile_,
|
| - base::Bind(PermissionUmaUtil::PermissionGranted));
|
| - RunCallback(GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
|
| - old_audio_setting_, CONTENT_SETTING_ALLOW),
|
| - GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
|
| - old_video_setting_, CONTENT_SETTING_ALLOW),
|
| - content::MEDIA_DEVICE_PERMISSION_DENIED);
|
| -}
|
| -
|
| -void MediaStreamDevicesController::PermissionDenied() {
|
| - RecordPermissionAction(IsAskingForAudio(), IsAskingForVideo(), GetOrigin(),
|
| - profile_,
|
| - base::Bind(PermissionUmaUtil::PermissionDenied));
|
| - RunCallback(GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
|
| - old_audio_setting_, CONTENT_SETTING_BLOCK),
|
| - GetNewSetting(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
|
| - old_video_setting_, CONTENT_SETTING_BLOCK),
|
| - content::MEDIA_DEVICE_PERMISSION_DENIED);
|
| -}
|
| -
|
| -bool MediaStreamDevicesController::ShouldShowPersistenceToggle() const {
|
| - return PermissionUtil::ShouldShowPersistenceToggle();
|
| -}
|
| -
|
| -void MediaStreamDevicesController::Cancelled() {
|
| - RecordPermissionAction(IsAskingForAudio(), IsAskingForVideo(), GetOrigin(),
|
| - profile_,
|
| - base::Bind(PermissionUmaUtil::PermissionDismissed));
|
| - RunCallback(old_audio_setting_, old_video_setting_,
|
| - content::MEDIA_DEVICE_PERMISSION_DISMISSED);
|
| -}
|
| -
|
| -void MediaStreamDevicesController::RequestFinished() {
|
| - delete this;
|
| -}
|
| -
|
| -PermissionRequestType MediaStreamDevicesController::GetPermissionRequestType()
|
| - const {
|
| - return PermissionRequestType::MEDIA_STREAM;
|
| -}
|
| -
|
| // static
|
| void MediaStreamDevicesController::RequestPermissionsWithDelegate(
|
| const content::MediaStreamRequest& request,
|
| const content::MediaResponseCallback& callback,
|
| - internal::PermissionPromptDelegate* delegate) {
|
| + PermissionPromptDelegate* delegate) {
|
| content::WebContents* web_contents =
|
| content::WebContents::FromRenderFrameHost(
|
| content::RenderFrameHost::FromID(request.render_process_id,
|
| @@ -397,8 +439,15 @@ void MediaStreamDevicesController::RequestPermissionsWithDelegate(
|
| return;
|
| }
|
|
|
| - delegate->ShowPrompt(request.user_gesture, web_contents,
|
| - std::move(controller));
|
| + Profile* profile =
|
| + Profile::FromBrowserContext(web_contents->GetBrowserContext());
|
| + delegate->ShowPrompt(
|
| + request.user_gesture, web_contents,
|
| + base::MakeUnique<MediaStreamDevicesController::Request>(
|
| + profile, controller->IsAskingForAudio(),
|
| + controller->IsAskingForVideo(), request.security_origin,
|
| + base::Bind(&MediaStreamDevicesController::PromptAnswered,
|
| + base::Passed(&controller))));
|
| }
|
|
|
| MediaStreamDevicesController::MediaStreamDevicesController(
|
| @@ -547,13 +596,9 @@ void MediaStreamDevicesController::RunCallback(
|
| content::MediaStreamRequestResult denial_reason) {
|
| CHECK(!callback_.is_null());
|
|
|
| - // If the kill switch is on we don't update the tab context or persist the
|
| - // setting.
|
| - if (denial_reason != content::MEDIA_DEVICE_KILL_SWITCH_ON) {
|
| - if (persist())
|
| - StorePermission(audio_setting, video_setting);
|
| + // If the kill switch is on we don't update the tab context.
|
| + if (denial_reason != content::MEDIA_DEVICE_KILL_SWITCH_ON)
|
| UpdateTabSpecificContentSettings(audio_setting, video_setting);
|
| - }
|
|
|
| content::MediaStreamDevices devices =
|
| GetDevices(audio_setting, video_setting);
|
| @@ -694,8 +739,6 @@ ContentSetting MediaStreamDevicesController::GetNewSetting(
|
| ContentSettingsType content_type,
|
| ContentSetting old_setting,
|
| ContentSetting user_decision) const {
|
| - DCHECK(user_decision == CONTENT_SETTING_ALLOW ||
|
| - user_decision == CONTENT_SETTING_BLOCK);
|
| ContentSetting result = old_setting;
|
| if (old_setting == CONTENT_SETTING_ASK)
|
| result = user_decision;
|
|
|