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

Side by Side Diff: content/browser/renderer_host/media/media_stream_manager.cc

Issue 11198044: Make tab capture media stream requests verify that the request came from extension API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: review comments Created 8 years, 2 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 "content/browser/renderer_host/media/media_stream_manager.h" 5 #include "content/browser/renderer_host/media/media_stream_manager.h"
6 6
7 #include <list> 7 #include <list>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 12 matching lines...) Expand all
23 #include "content/public/common/content_switches.h" 23 #include "content/public/common/content_switches.h"
24 #include "googleurl/src/gurl.h" 24 #include "googleurl/src/gurl.h"
25 25
26 #if defined(OS_WIN) 26 #if defined(OS_WIN)
27 #include "base/win/scoped_com_initializer.h" 27 #include "base/win/scoped_com_initializer.h"
28 #endif 28 #endif
29 29
30 using content::BrowserThread; 30 using content::BrowserThread;
31 using content::MediaStreamRequest; 31 using content::MediaStreamRequest;
32 32
33 namespace {
34 const char kExtensionScheme[] = "chrome-extension";
35 } // namespace
36
37 namespace media_stream { 33 namespace media_stream {
38 34
39 // Creates a random label used to identify requests. 35 // Creates a random label used to identify requests.
40 static std::string RandomLabel() { 36 static std::string RandomLabel() {
41 // An earlier PeerConnection spec, 37 // An earlier PeerConnection spec,
42 // http://dev.w3.org/2011/webrtc/editor/webrtc.html, specified the 38 // http://dev.w3.org/2011/webrtc/editor/webrtc.html, specified the
43 // MediaStream::label alphabet as containing 36 characters from 39 // MediaStream::label alphabet as containing 36 characters from
44 // range: U+0021, U+0023 to U+0027, U+002A to U+002B, U+002D to U+002E, 40 // range: U+0021, U+0023 to U+0027, U+002A to U+002B, U+002D to U+002E,
45 // U+0030 to U+0039, U+0041 to U+005A, U+005E to U+007E. 41 // U+0030 to U+0039, U+0041 to U+005A, U+005E to U+007E.
46 // Here we use a safe subset. 42 // Here we use a safe subset.
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 237
242 // Get user confirmation to use the capture device. 238 // Get user confirmation to use the capture device.
243 device_settings_->RequestCaptureDeviceUsage(*label, 239 device_settings_->RequestCaptureDeviceUsage(*label,
244 render_process_id, 240 render_process_id,
245 render_view_id, 241 render_view_id,
246 options, 242 options,
247 security_origin); 243 security_origin);
248 244
249 if (!CommandLine::ForCurrentProcess()->HasSwitch( 245 if (!CommandLine::ForCurrentProcess()->HasSwitch(
250 switches::kEnableTabCapture) || 246 switches::kEnableTabCapture) ||
251 !security_origin.SchemeIs(kExtensionScheme) ||
252 (options.audio_type != content::MEDIA_TAB_AUDIO_CAPTURE && 247 (options.audio_type != content::MEDIA_TAB_AUDIO_CAPTURE &&
253 options.audio_type != content::MEDIA_NO_SERVICE) || 248 options.audio_type != content::MEDIA_NO_SERVICE) ||
254 (options.video_type != content::MEDIA_TAB_VIDEO_CAPTURE && 249 (options.video_type != content::MEDIA_TAB_VIDEO_CAPTURE &&
255 options.video_type != content::MEDIA_NO_SERVICE)) { 250 options.video_type != content::MEDIA_NO_SERVICE)) {
256 LOG(ERROR) << "Invalid request or used tab capture outside extension API."; 251 LOG(ERROR) << "Invalid request or used tab capture outside extension API.";
257 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 252 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
258 base::Bind(&MediaStreamManager::CancelGenerateStream, 253 base::Bind(&MediaStreamManager::CancelGenerateStream,
259 base::Unretained(this), *label)); 254 base::Unretained(this), *label));
260 return; 255 return;
261 } 256 }
262 257
263 // TODO(miu): We should ask the device manager whether a device with id 258 // TODO(miu): We should ask the device manager whether a device with id
264 // |device_id| actually exists. Note that no such MediaStreamProvider API for 259 // |device_id| actually exists. Note that no such MediaStreamProvider API for
265 // this currently exists. Also, we don't have a user-friendly device name for 260 // this currently exists. Also, we don't have a user-friendly device name for
266 // the infobar UI. 261 // the infobar UI.
267 StreamDeviceInfoArray devices;
268 if (content::IsAudioMediaType(options.audio_type)) { 262 if (content::IsAudioMediaType(options.audio_type)) {
269 // TODO(justinlin): Updating the state to requested and pending are no-ops 263 // TODO(justinlin): Updating the state to requested and pending are no-ops
270 // in terms of the media manager, but these are the state changes we want to 264 // in terms of the media manager, but these are the state changes we want to
271 // support in terms of extensions (which is registered as an observer). 265 // support in terms of extensions (which is registered as an observer).
272 request.setState(options.audio_type, 266 request.setState(options.audio_type,
273 content::MEDIA_REQUEST_STATE_REQUESTED); 267 content::MEDIA_REQUEST_STATE_REQUESTED);
274 request.setState(options.audio_type, 268 request.setState(options.audio_type,
275 content::MEDIA_REQUEST_STATE_PENDING_APPROVAL); 269 content::MEDIA_REQUEST_STATE_PENDING_APPROVAL);
276 devices.push_back( 270 device_settings_->AvailableDevices(
277 StreamDeviceInfo(options.audio_type, device_id, device_id, false)); 271 *label, options.audio_type, StreamDeviceInfoArray(
272 1, StreamDeviceInfo(options.audio_type, device_id, device_id,
273 false)));
278 } 274 }
279 if (content::IsVideoMediaType(options.video_type)) { 275 if (content::IsVideoMediaType(options.video_type)) {
280 request.setState(options.video_type, 276 request.setState(options.video_type,
281 content::MEDIA_REQUEST_STATE_REQUESTED); 277 content::MEDIA_REQUEST_STATE_REQUESTED);
282 request.setState(options.video_type, 278 request.setState(options.video_type,
283 content::MEDIA_REQUEST_STATE_PENDING_APPROVAL); 279 content::MEDIA_REQUEST_STATE_PENDING_APPROVAL);
284 devices.push_back( 280 device_settings_->AvailableDevices(
285 StreamDeviceInfo(options.video_type, device_id, device_id, false)); 281 *label, options.video_type, StreamDeviceInfoArray(
282 1, StreamDeviceInfo(options.video_type, device_id, device_id,
283 false)));
286 } 284 }
287
288 // Bypass the user authorization dropdown for tab capture.
289 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
290 base::Bind(&MediaStreamManager::DevicesAccepted,
291 base::Unretained(this), *label, devices));
292 } 285 }
293 286
294 void MediaStreamManager::CancelGenerateStream(const std::string& label) { 287 void MediaStreamManager::CancelGenerateStream(const std::string& label) {
295 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 288 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
296 289
297 DeviceRequests::iterator it = requests_.find(label); 290 DeviceRequests::iterator it = requests_.find(label);
298 if (it != requests_.end()) { 291 if (it != requests_.end()) {
299 // The request isn't complete. 292 // The request isn't complete.
300 if (!RequestDone(it->second)) { 293 if (!RequestDone(it->second)) {
301 DeviceRequest& request = it->second; 294 DeviceRequest& request = it->second;
(...skipping 671 matching lines...) Expand 10 before | Expand all | Expand 10 after
973 it != requests_.end(); ++it) { 966 it != requests_.end(); ++it) {
974 if (it->second.type == DeviceRequest::ENUMERATE_DEVICES && 967 if (it->second.type == DeviceRequest::ENUMERATE_DEVICES &&
975 Requested(it->second.options, stream_type)) { 968 Requested(it->second.options, stream_type)) {
976 return true; 969 return true;
977 } 970 }
978 } 971 }
979 return false; 972 return false;
980 } 973 }
981 974
982 } // namespace media_stream 975 } // namespace media_stream
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698