Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(29)

Side by Side Diff: chrome/browser/media/webrtc/permission_bubble_media_access_handler.cc

Issue 2706813004: Move logic to show permission prompts into MediaStreamDevicesController (Closed)
Patch Set: Move logic to show permission prompts into MediaStreamDevicesController Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/media/webrtc/permission_bubble_media_access_handler.h" 5 #include "chrome/browser/media/webrtc/permission_bubble_media_access_handler.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/metrics/field_trial.h" 9 #include "base/metrics/field_trial.h"
10 #include "chrome/browser/media/webrtc/media_permission.h" 10 #include "chrome/browser/media/webrtc/media_permission.h"
11 #include "chrome/browser/media/webrtc/media_stream_device_permissions.h" 11 #include "chrome/browser/media/webrtc/media_stream_device_permissions.h"
12 #include "chrome/browser/media/webrtc/media_stream_devices_controller.h" 12 #include "chrome/browser/media/webrtc/media_stream_devices_controller.h"
13 #include "chrome/browser/profiles/profile.h" 13 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/common/pref_names.h" 14 #include "chrome/common/pref_names.h"
15 #include "components/content_settings/core/browser/host_content_settings_map.h" 15 #include "components/content_settings/core/browser/host_content_settings_map.h"
16 #include "content/public/browser/browser_thread.h" 16 #include "content/public/browser/browser_thread.h"
17 #include "content/public/browser/notification_service.h" 17 #include "content/public/browser/notification_service.h"
18 #include "content/public/browser/notification_types.h" 18 #include "content/public/browser/notification_types.h"
19 #include "content/public/browser/web_contents.h" 19 #include "content/public/browser/web_contents.h"
20 20
21 #if defined(OS_ANDROID) 21 #if defined(OS_ANDROID)
22 #include <vector> 22 #include <vector>
23 23
24 #include "base/bind.h" 24 #include "base/bind.h"
25 #include "base/bind_helpers.h" 25 #include "base/bind_helpers.h"
26 #include "chrome/browser/android/chrome_feature_list.h" 26 #include "chrome/browser/android/chrome_feature_list.h"
27 #include "chrome/browser/media/webrtc/media_stream_infobar_delegate_android.h"
28 #include "chrome/browser/media/webrtc/screen_capture_infobar_delegate_android.h" 27 #include "chrome/browser/media/webrtc/screen_capture_infobar_delegate_android.h"
29 #include "chrome/browser/permissions/permission_dialog_delegate.h"
30 #include "chrome/browser/permissions/permission_uma_util.h" 28 #include "chrome/browser/permissions/permission_uma_util.h"
31 #include "chrome/browser/permissions/permission_update_infobar_delegate_android. h"
32 #include "chrome/browser/permissions/permission_util.h" 29 #include "chrome/browser/permissions/permission_util.h"
33 #else
34 #include "chrome/browser/permissions/permission_request_manager.h"
35 #endif // defined(OS_ANDROID)
36
37 #if defined(OS_ANDROID)
38 namespace {
39 // Callback for the permission update infobar when the site and Chrome
40 // permissions are mismatched on Android.
41 void OnPermissionConflictResolved(
42 std::unique_ptr<MediaStreamDevicesController> controller,
43 bool allowed) {
44 if (allowed)
45 controller->PermissionGranted();
46 else
47 controller->ForcePermissionDeniedTemporarily();
48 }
49 } // namespace
50
51 #endif // defined(OS_ANDROID) 30 #endif // defined(OS_ANDROID)
52 31
53 using content::BrowserThread; 32 using content::BrowserThread;
54 33
55 struct PermissionBubbleMediaAccessHandler::PendingAccessRequest { 34 struct PermissionBubbleMediaAccessHandler::PendingAccessRequest {
56 PendingAccessRequest(const content::MediaStreamRequest& request, 35 PendingAccessRequest(const content::MediaStreamRequest& request,
57 const content::MediaResponseCallback& callback) 36 const content::MediaResponseCallback& callback)
58 : request(request), callback(callback) {} 37 : request(request), callback(callback) {}
59 ~PendingAccessRequest() {} 38 ~PendingAccessRequest() {}
60 39
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 #if defined(OS_ANDROID) 133 #if defined(OS_ANDROID)
155 if (request.video_type == content::MEDIA_DESKTOP_VIDEO_CAPTURE) { 134 if (request.video_type == content::MEDIA_DESKTOP_VIDEO_CAPTURE) {
156 ScreenCaptureInfoBarDelegateAndroid::Create( 135 ScreenCaptureInfoBarDelegateAndroid::Create(
157 web_contents, request, 136 web_contents, request,
158 base::Bind(&PermissionBubbleMediaAccessHandler::OnAccessRequestResponse, 137 base::Bind(&PermissionBubbleMediaAccessHandler::OnAccessRequestResponse,
159 base::Unretained(this), web_contents)); 138 base::Unretained(this), web_contents));
160 return; 139 return;
161 } 140 }
162 #endif 141 #endif
163 142
164 std::unique_ptr<MediaStreamDevicesController> controller( 143 MediaStreamDevicesController::RequestPermissions(
165 new MediaStreamDevicesController( 144 web_contents, request,
166 web_contents, request, 145 base::Bind(&PermissionBubbleMediaAccessHandler::OnAccessRequestResponse,
167 base::Bind( 146 base::Unretained(this), web_contents));
168 &PermissionBubbleMediaAccessHandler::OnAccessRequestResponse,
169 base::Unretained(this), web_contents)));
170 if (!controller->IsAskingForAudio() && !controller->IsAskingForVideo()) {
171 #if defined(OS_ANDROID)
172 // If either audio or video was previously allowed and Chrome no longer has
173 // the necessary permissions, show a infobar to attempt to address this
174 // mismatch.
175 std::vector<ContentSettingsType> content_settings_types;
176 if (controller->IsAllowedForAudio())
177 content_settings_types.push_back(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC);
178
179 if (controller->IsAllowedForVideo()) {
180 content_settings_types.push_back(
181 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA);
182 }
183 if (!content_settings_types.empty() &&
184 PermissionUpdateInfoBarDelegate::ShouldShowPermissionInfobar(
185 web_contents, content_settings_types)) {
186 PermissionUpdateInfoBarDelegate::Create(
187 web_contents, content_settings_types,
188 base::Bind(&OnPermissionConflictResolved, base::Passed(&controller)));
189 }
190 #endif
191 return;
192 }
193
194 #if defined(OS_ANDROID)
195 PermissionUmaUtil::RecordPermissionPromptShown(
196 controller->GetPermissionRequestType(),
197 PermissionUtil::GetGestureType(request.user_gesture));
198 if (PermissionDialogDelegate::ShouldShowDialog(request.user_gesture)) {
199 PermissionDialogDelegate::CreateMediaStreamDialog(
200 web_contents, request.user_gesture, std::move(controller));
201 } else {
202 MediaStreamInfoBarDelegateAndroid::Create(
203 web_contents, request.user_gesture, std::move(controller));
204 }
205 #else
206 PermissionRequestManager* permission_request_manager =
207 PermissionRequestManager::FromWebContents(web_contents);
208 if (permission_request_manager)
209 permission_request_manager->AddRequest(controller.release());
210 #endif
211 } 147 }
212 148
213 void PermissionBubbleMediaAccessHandler::UpdateMediaRequestState( 149 void PermissionBubbleMediaAccessHandler::UpdateMediaRequestState(
214 int render_process_id, 150 int render_process_id,
215 int render_frame_id, 151 int render_frame_id,
216 int page_request_id, 152 int page_request_id,
217 content::MediaStreamType stream_type, 153 content::MediaStreamType stream_type,
218 content::MediaRequestState state) { 154 content::MediaRequestState state) {
219 DCHECK_CURRENTLY_ON(BrowserThread::UI); 155 DCHECK_CURRENTLY_ON(BrowserThread::UI);
220 if (state != content::MEDIA_REQUEST_STATE_CLOSING) 156 if (state != content::MEDIA_REQUEST_STATE_CLOSING)
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 211
276 void PermissionBubbleMediaAccessHandler::Observe( 212 void PermissionBubbleMediaAccessHandler::Observe(
277 int type, 213 int type,
278 const content::NotificationSource& source, 214 const content::NotificationSource& source,
279 const content::NotificationDetails& details) { 215 const content::NotificationDetails& details) {
280 DCHECK_CURRENTLY_ON(BrowserThread::UI); 216 DCHECK_CURRENTLY_ON(BrowserThread::UI);
281 DCHECK_EQ(content::NOTIFICATION_WEB_CONTENTS_DESTROYED, type); 217 DCHECK_EQ(content::NOTIFICATION_WEB_CONTENTS_DESTROYED, type);
282 218
283 pending_requests_.erase(content::Source<content::WebContents>(source).ptr()); 219 pending_requests_.erase(content::Source<content::WebContents>(source).ptr());
284 } 220 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698