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

Unified Diff: content/browser/renderer_host/media/media_stream_manager.cc

Issue 11451006: Make TabCapture requests use the target render process and render view id's for UI permissions. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix the bug too.. Created 8 years 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/media/media_stream_manager.cc
diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc
index 980ee4b22d5cd9589aec6d4cb85b8d5fdb8bc3aa..e1ce1e07b49360647b80528eb62ac587e975fef2 100644
--- a/content/browser/renderer_host/media/media_stream_manager.cc
+++ b/content/browser/renderer_host/media/media_stream_manager.cc
@@ -245,11 +245,20 @@ std::string MediaStreamManager::GenerateStreamForDevice(
const GURL& security_origin) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ int target_render_process_id = -1;
+ int target_render_view_id = -1;
+ // We will post the request to the target render view, not the source (i.e.
+ // source is an extension, and target is the tab we want to capture).
+ DCHECK(WebContentsCaptureUtil::ExtractTabCaptureTarget(
no longer working on chromium 2012/12/05 17:38:37 If you put it in DCHECK, the code won't run in rel
+ device_id, &target_render_process_id, &target_render_view_id));
+ DCHECK_NE(target_render_process_id, -1);
+ DCHECK_NE(target_render_view_id, -1);
+
// Create a new request based on options.
DeviceRequest* request = new DeviceRequest(requester, options,
DeviceRequest::GENERATE_STREAM,
- render_process_id,
- render_view_id,
+ target_render_process_id,
+ target_render_view_id,
security_origin);
const std::string& label = AddRequest(request);
request->requested_device_id = device_id;
@@ -282,8 +291,6 @@ std::string MediaStreamManager::GenerateStreamForDevice(
request->setState(options.video_type, MEDIA_REQUEST_STATE_PENDING_APPROVAL);
}
- // TODO(xians): Figure out the way to handle tab capture request.
- // Can we verify the devices here before sending the request to UI?
HandleRequest(label);
return label;
@@ -585,10 +592,13 @@ void MediaStreamManager::PostRequestToUI(const std::string& label) {
void MediaStreamManager::HandleRequest(const std::string& label) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
DeviceRequest* request = requests_[label];
- if ((IsAudioMediaType(request->options.audio_type) &&
- !audio_enumeration_cache_.valid) ||
- (IsVideoMediaType(request->options.video_type) &&
- !video_enumeration_cache_.valid)) {
+ // We want to always post request to UI for tab capture to verify the request.
+ if ((request->options.audio_type != MEDIA_TAB_AUDIO_CAPTURE &&
+ request->options.video_type != MEDIA_TAB_VIDEO_CAPTURE) &&
+ ((IsAudioMediaType(request->options.audio_type) &&
+ !audio_enumeration_cache_.valid) ||
+ (IsVideoMediaType(request->options.video_type) &&
+ !video_enumeration_cache_.valid))) {
// Enumerate the devices if there is no valid device lists to be used.
StartEnumeration(request);
} else {
@@ -852,6 +862,7 @@ void MediaStreamManager::DevicesAccepted(const std::string& label,
const StreamDeviceInfoArray& devices) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
DCHECK(!devices.empty());
+
DeviceRequests::iterator request_it = requests_.find(label);
if (request_it == requests_.end()) {
return;
@@ -883,6 +894,12 @@ void MediaStreamManager::DevicesAccepted(const std::string& label,
device_it != devices.end(); ++device_it) {
StreamDeviceInfo device_info = *device_it; // Make a copy.
+ // TODO(justinlin): Nicer way to do this?
+ // Re-append the device_id since we lost it when posting request to UI.
+ if (device_info.stream_type == content::MEDIA_TAB_VIDEO_CAPTURE ||
+ device_info.stream_type == content::MEDIA_TAB_AUDIO_CAPTURE)
+ device_info.device_id = request->requested_device_id;
+
// Set in_use to false to be able to track if this device has been
// opened. in_use might be true if the device type can be used in more
// than one session.
@@ -987,22 +1004,8 @@ void MediaStreamManager::NotifyDevicesOpened(const DeviceRequest& request) {
if (opened_devices.empty())
return;
- int target_render_process_id = request.render_process_id;
- int target_render_view_id = request.render_view_id;
-
- // For tab capture requests, we should notify the UI to update the renderer
- // that is the target of the capture instead of the requester.
- if (request.options.audio_type == content::MEDIA_TAB_AUDIO_CAPTURE ||
- request.options.video_type == content::MEDIA_TAB_VIDEO_CAPTURE) {
- if (!WebContentsCaptureUtil::ExtractTabCaptureTarget(
- request.requested_device_id,
- &target_render_process_id,
- &target_render_view_id))
- return;
- }
-
- NotifyUIDevicesOpened(target_render_process_id,
- target_render_view_id,
+ NotifyUIDevicesOpened(request.render_process_id,
+ request.render_view_id,
opened_devices);
}
@@ -1013,22 +1016,8 @@ void MediaStreamManager::NotifyDevicesClosed(const DeviceRequest& request) {
if (closed_devices.empty())
return;
- int target_render_process_id = request.render_process_id;
- int target_render_view_id = request.render_view_id;
-
- // For tab capture requests, we should notify the UI to update the renderer
- // that is the target of the capture instead of the requester.
- if (request.options.audio_type == content::MEDIA_TAB_AUDIO_CAPTURE ||
- request.options.video_type == content::MEDIA_TAB_VIDEO_CAPTURE) {
- if (!WebContentsCaptureUtil::ExtractTabCaptureTarget(
- request.requested_device_id,
- &target_render_process_id,
- &target_render_view_id))
- return;
- }
-
- NotifyUIDevicesClosed(target_render_process_id,
- target_render_view_id,
+ NotifyUIDevicesClosed(request.render_process_id,
+ request.render_view_id,
closed_devices);
}

Powered by Google App Engine
This is Rietveld 408576698