| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |