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

Side by Side Diff: chrome/browser/media/media_stream_devices_controller.cc

Issue 11896028: Add an location bar icon and a content settings bubble for media settings. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix browser test Created 7 years, 11 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/media_stream_devices_controller.h" 5 #include "chrome/browser/media/media_stream_devices_controller.h"
6 6
7 #include "base/values.h" 7 #include "base/values.h"
8 #include "chrome/browser/content_settings/content_settings_provider.h" 8 #include "chrome/browser/content_settings/content_settings_provider.h"
9 #include "chrome/browser/content_settings/host_content_settings_map.h" 9 #include "chrome/browser/content_settings/host_content_settings_map.h"
10 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
10 #include "chrome/browser/extensions/api/tab_capture/tab_capture_registry.h" 11 #include "chrome/browser/extensions/api/tab_capture/tab_capture_registry.h"
11 #include "chrome/browser/extensions/api/tab_capture/tab_capture_registry_factory .h" 12 #include "chrome/browser/extensions/api/tab_capture/tab_capture_registry_factory .h"
12 #include "chrome/browser/media/media_capture_devices_dispatcher.h" 13 #include "chrome/browser/media/media_capture_devices_dispatcher.h"
13 #include "chrome/browser/media/media_internals.h" 14 #include "chrome/browser/media/media_internals.h"
14 #include "chrome/browser/prefs/scoped_user_pref_update.h" 15 #include "chrome/browser/prefs/scoped_user_pref_update.h"
15 #include "chrome/browser/profiles/profile.h" 16 #include "chrome/browser/profiles/profile.h"
16 #include "chrome/browser/ui/browser.h" 17 #include "chrome/browser/ui/browser.h"
17 #include "chrome/common/content_settings.h" 18 #include "chrome/common/content_settings.h"
18 #include "chrome/common/pref_names.h" 19 #include "chrome/common/pref_names.h"
19 #include "content/public/browser/browser_thread.h" 20 #include "content/public/browser/browser_thread.h"
20 #include "content/public/common/media_stream_request.h" 21 #include "content/public/common/media_stream_request.h"
21 22
22 using content::BrowserThread; 23 using content::BrowserThread;
23 24
24 // TODO(xians): Remove this when the Omnibar UI has been completed.
25 // See http://crbug.com/167263 for more details.
26 #define ALLOW_STICKY_DENY 0
27
28 namespace { 25 namespace {
29 26
30 bool HasAnyAvailableDevice() { 27 bool HasAnyAvailableDevice() {
31 MediaCaptureDevicesDispatcher* dispatcher = 28 MediaCaptureDevicesDispatcher* dispatcher =
32 MediaInternals::GetInstance()->GetMediaCaptureDevicesDispatcher(); 29 MediaInternals::GetInstance()->GetMediaCaptureDevicesDispatcher();
33 const content::MediaStreamDevices& audio_devices = 30 const content::MediaStreamDevices& audio_devices =
34 dispatcher->GetAudioCaptureDevices(); 31 dispatcher->GetAudioCaptureDevices();
35 const content::MediaStreamDevices& video_devices = 32 const content::MediaStreamDevices& video_devices =
36 dispatcher->GetVideoCaptureDevices(); 33 dispatcher->GetVideoCaptureDevices();
37 34
38 return !audio_devices.empty() || !video_devices.empty(); 35 return !audio_devices.empty() || !video_devices.empty();
39 }; 36 };
40 37
41 } // namespace 38 } // namespace
42 39
43 MediaStreamDevicesController::MediaStreamDevicesController( 40 MediaStreamDevicesController::MediaStreamDevicesController(
44 Profile* profile, 41 Profile* profile,
42 TabSpecificContentSettings* content_settings,
45 const content::MediaStreamRequest& request, 43 const content::MediaStreamRequest& request,
46 const content::MediaResponseCallback& callback) 44 const content::MediaResponseCallback& callback)
47 : profile_(profile), 45 : profile_(profile),
46 content_settings_(content_settings),
48 request_(request), 47 request_(request),
49 callback_(callback), 48 callback_(callback),
50 has_audio_(content::IsAudioMediaType(request.audio_type) && 49 has_audio_(content::IsAudioMediaType(request.audio_type) &&
51 !IsAudioDeviceBlockedByPolicy()), 50 !IsAudioDeviceBlockedByPolicy()),
52 has_video_(content::IsVideoMediaType(request.video_type) && 51 has_video_(content::IsVideoMediaType(request.video_type) &&
53 !IsVideoDeviceBlockedByPolicy()) { 52 !IsVideoDeviceBlockedByPolicy()) {
54 } 53 }
55 54
56 MediaStreamDevicesController::~MediaStreamDevicesController() {} 55 MediaStreamDevicesController::~MediaStreamDevicesController() {}
57 56
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 113
115 // Show the infobar. 114 // Show the infobar.
116 return false; 115 return false;
117 } 116 }
118 117
119 const std::string& MediaStreamDevicesController::GetSecurityOriginSpec() const { 118 const std::string& MediaStreamDevicesController::GetSecurityOriginSpec() const {
120 return request_.security_origin.spec(); 119 return request_.security_origin.spec();
121 } 120 }
122 121
123 void MediaStreamDevicesController::Accept(bool update_content_setting) { 122 void MediaStreamDevicesController::Accept(bool update_content_setting) {
123 content_settings_->OnMediaStreamAccessed();
124
125 // Get the default devices for the request.
124 content::MediaStreamDevices devices; 126 content::MediaStreamDevices devices;
125 if (has_audio_ || has_video_) { 127 if (has_audio_ || has_video_) {
126 switch (request_.request_type) { 128 switch (request_.request_type) {
127 case content::MEDIA_OPEN_DEVICE: 129 case content::MEDIA_OPEN_DEVICE:
128 // For open device request pick the desired device or fall back to the 130 // For open device request pick the desired device or fall back to the
129 // first available of the given type. 131 // first available of the given type.
130 media::GetRequestedDevice(request_.requested_device_id, 132 media::GetRequestedDevice(request_.requested_device_id,
131 has_audio_, 133 has_audio_,
132 has_video_, 134 has_video_,
133 &devices); 135 &devices);
134 break; 136 break;
135 case content::MEDIA_DEVICE_ACCESS: 137 case content::MEDIA_DEVICE_ACCESS:
136 case content::MEDIA_GENERATE_STREAM: 138 case content::MEDIA_GENERATE_STREAM:
137 case content::MEDIA_ENUMERATE_DEVICES: 139 case content::MEDIA_ENUMERATE_DEVICES:
138 // Get the default devices for the request. 140 // Get the default devices for the request.
139 media::GetDefaultDevicesForProfile(profile_, 141 media::GetDefaultDevicesForProfile(profile_,
140 has_audio_, 142 has_audio_,
141 has_video_, 143 has_video_,
142 &devices); 144 &devices);
143 break; 145 break;
144 } 146 }
145 147
146 if (update_content_setting && IsSchemeSecure() && !devices.empty()) 148 if (update_content_setting && IsSchemeSecure() && !devices.empty())
147 SetPermission(true); 149 SetPermission(true);
148 } 150 }
149 151
150 callback_.Run(devices); 152 callback_.Run(devices);
151 } 153 }
152 154
153 void MediaStreamDevicesController::Deny(bool update_content_setting) { 155 void MediaStreamDevicesController::Deny(bool update_content_setting) {
154 #if ALLOW_STICKY_DENY 156 // TODO(markusheintz): Replace CONTENT_SETTINGS_TYPE_MEDIA_STREAM with the
157 // appropriate new CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC and
158 // CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA.
159 content_settings_->OnContentBlocked(CONTENT_SETTINGS_TYPE_MEDIASTREAM,
160 std::string());
155 if (update_content_setting) 161 if (update_content_setting)
156 SetPermission(false); 162 SetPermission(false);
157 #endif
158 163
159 callback_.Run(content::MediaStreamDevices()); 164 callback_.Run(content::MediaStreamDevices());
160 } 165 }
161 166
162 bool MediaStreamDevicesController::IsAudioDeviceBlockedByPolicy() const { 167 bool MediaStreamDevicesController::IsAudioDeviceBlockedByPolicy() const {
163 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 168 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
164 return (!profile_->GetPrefs()->GetBoolean(prefs::kAudioCaptureAllowed) && 169 return (!profile_->GetPrefs()->GetBoolean(prefs::kAudioCaptureAllowed) &&
165 profile_->GetPrefs()->IsManagedPreference( 170 profile_->GetPrefs()->IsManagedPreference(
166 prefs::kAudioCaptureAllowed)); 171 prefs::kAudioCaptureAllowed));
167 } 172 }
(...skipping 25 matching lines...) Expand all
193 request_.security_origin, 198 request_.security_origin,
194 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, 199 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
195 NO_RESOURCE_IDENTIFIER) != CONTENT_SETTING_ALLOW) { 200 NO_RESOURCE_IDENTIFIER) != CONTENT_SETTING_ALLOW) {
196 return false; 201 return false;
197 } 202 }
198 203
199 return true; 204 return true;
200 } 205 }
201 206
202 bool MediaStreamDevicesController::IsRequestBlockedByDefault() const { 207 bool MediaStreamDevicesController::IsRequestBlockedByDefault() const {
203 #if ALLOW_STICKY_DENY
204 if (has_audio_ && 208 if (has_audio_ &&
205 profile_->GetHostContentSettingsMap()->GetContentSetting( 209 profile_->GetHostContentSettingsMap()->GetContentSetting(
206 request_.security_origin, 210 request_.security_origin,
207 request_.security_origin, 211 request_.security_origin,
208 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, 212 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC,
209 NO_RESOURCE_IDENTIFIER) != CONTENT_SETTING_BLOCK) { 213 NO_RESOURCE_IDENTIFIER) != CONTENT_SETTING_BLOCK) {
210 return false; 214 return false;
211 } 215 }
212 216
213 if (has_video_ && 217 if (has_video_ &&
214 profile_->GetHostContentSettingsMap()->GetContentSetting( 218 profile_->GetHostContentSettingsMap()->GetContentSetting(
215 request_.security_origin, 219 request_.security_origin,
216 request_.security_origin, 220 request_.security_origin,
217 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, 221 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
218 NO_RESOURCE_IDENTIFIER) != CONTENT_SETTING_BLOCK) { 222 NO_RESOURCE_IDENTIFIER) != CONTENT_SETTING_BLOCK) {
219 return false; 223 return false;
220 } 224 }
221 225
222 return true; 226 return true;
223 #else
224 return false;
225 #endif
226 } 227 }
227 228
228 bool MediaStreamDevicesController::IsDefaultMediaAccessBlocked() const { 229 bool MediaStreamDevicesController::IsDefaultMediaAccessBlocked() const {
229 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 230 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
230 #if ALLOW_STICKY_DENY 231 // TODO(markusheintz): Replace CONTENT_SETTINGS_TYPE_MEDIA_STREAM with the
232 // appropriate new CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC and
233 // CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA.
231 ContentSetting current_setting = 234 ContentSetting current_setting =
232 profile_->GetHostContentSettingsMap()->GetDefaultContentSetting( 235 profile_->GetHostContentSettingsMap()->GetDefaultContentSetting(
233 CONTENT_SETTINGS_TYPE_MEDIASTREAM, NULL); 236 CONTENT_SETTINGS_TYPE_MEDIASTREAM, NULL);
234 return (current_setting == CONTENT_SETTING_BLOCK); 237 return (current_setting == CONTENT_SETTING_BLOCK);
235 #else
236 return false;
237 #endif
238 } 238 }
239 239
240 void MediaStreamDevicesController::HandleTapMediaRequest() { 240 void MediaStreamDevicesController::HandleTapMediaRequest() {
241 // For tab media requests, we need to make sure the request came from the 241 // For tab media requests, we need to make sure the request came from the
242 // extension API, so we check the registry here. 242 // extension API, so we check the registry here.
243 extensions::TabCaptureRegistry* registry = 243 extensions::TabCaptureRegistry* registry =
244 extensions::TabCaptureRegistryFactory::GetForProfile(profile_); 244 extensions::TabCaptureRegistryFactory::GetForProfile(profile_);
245 245
246 if (!registry->VerifyRequest(request_.render_process_id, 246 if (!registry->VerifyRequest(request_.render_process_id,
247 request_.render_view_id)) { 247 request_.render_view_id)) {
(...skipping 12 matching lines...) Expand all
260 260
261 callback_.Run(devices); 261 callback_.Run(devices);
262 } 262 }
263 } 263 }
264 264
265 bool MediaStreamDevicesController::IsSchemeSecure() const { 265 bool MediaStreamDevicesController::IsSchemeSecure() const {
266 return (request_.security_origin.SchemeIsSecure()); 266 return (request_.security_origin.SchemeIsSecure());
267 } 267 }
268 268
269 bool MediaStreamDevicesController::ShouldAlwaysAllowOrigin() const { 269 bool MediaStreamDevicesController::ShouldAlwaysAllowOrigin() const {
270 // TODO(markusheintz): Replace CONTENT_SETTINGS_TYPE_MEDIA_STREAM with the
271 // appropriate new CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC and
272 // CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA.
270 return profile_->GetHostContentSettingsMap()->ShouldAllowAllContent( 273 return profile_->GetHostContentSettingsMap()->ShouldAllowAllContent(
271 request_.security_origin, request_.security_origin, 274 request_.security_origin, request_.security_origin,
272 CONTENT_SETTINGS_TYPE_MEDIASTREAM); 275 CONTENT_SETTINGS_TYPE_MEDIASTREAM);
273 } 276 }
274 277
275 void MediaStreamDevicesController::SetPermission(bool allowed) const { 278 void MediaStreamDevicesController::SetPermission(bool allowed) const {
276 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 279 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
277 ContentSettingsPattern primary_pattern = 280 ContentSettingsPattern primary_pattern =
278 ContentSettingsPattern::FromURLNoWildcard(request_.security_origin); 281 ContentSettingsPattern::FromURLNoWildcard(request_.security_origin);
279 // Check the pattern is valid or not. When the request is from a file access, 282 // Check the pattern is valid or not. When the request is from a file access,
(...skipping 13 matching lines...) Expand all
293 } 296 }
294 if (has_video_) { 297 if (has_video_) {
295 profile_->GetHostContentSettingsMap()->SetContentSetting( 298 profile_->GetHostContentSettingsMap()->SetContentSetting(
296 primary_pattern, 299 primary_pattern,
297 ContentSettingsPattern::Wildcard(), 300 ContentSettingsPattern::Wildcard(),
298 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, 301 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
299 std::string(), 302 std::string(),
300 content_setting); 303 content_setting);
301 } 304 }
302 } 305 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698