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

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

Issue 54863002: Implement a salt for MediaSource IDs that can be cleared by a user. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed jois nit. Created 7 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 543436fc1084583f15e3be1ef5e76b6f75414e68..a3b9358f42208ca5db6e687db78ab07e8a490dc1 100644
--- a/content/browser/renderer_host/media/media_stream_manager.cc
+++ b/content/browser/renderer_host/media/media_stream_manager.cc
@@ -69,11 +69,13 @@ class MediaStreamManager::DeviceRequest {
DeviceRequest(MediaStreamRequester* requester,
const MediaStreamRequest& request,
int requesting_process_id,
- int requesting_view_id)
+ int requesting_view_id,
+ ResourceContext* resource_context)
: requester(requester),
request(request),
requesting_process_id(requesting_process_id),
requesting_view_id(requesting_view_id),
+ resource_context(resource_context),
state_(NUM_MEDIA_TYPES, MEDIA_REQUEST_STATE_NOT_REQUESTED) {
}
@@ -133,6 +135,8 @@ class MediaStreamManager::DeviceRequest {
// specifies the target renderer from which audio and video is captured.
const int requesting_view_id;
+ ResourceContext* resource_context;
+
StreamDeviceInfoArray devices;
// Callback to the requester which audio/video devices have been selected.
@@ -211,8 +215,11 @@ std::string MediaStreamManager::MakeMediaAccessRequest(
render_process_id, render_view_id, page_request_id,
security_origin, MEDIA_DEVICE_ACCESS, std::string(), std::string(),
options.audio_type, options.video_type);
+ // TODO(perkj): The argument list with NULL parameters to DeviceRequest
+ // suggests that this is the wrong design. Can this be refactored?
DeviceRequest* request = new DeviceRequest(NULL, stream_request,
- render_process_id, render_view_id);
+ render_process_id, render_view_id,
+ NULL);
const std::string& label = AddRequest(request);
request->callback = callback;
@@ -231,6 +238,7 @@ std::string MediaStreamManager::MakeMediaAccessRequest(
std::string MediaStreamManager::GenerateStream(MediaStreamRequester* requester,
int render_process_id,
int render_view_id,
+ ResourceContext* rc,
int page_request_id,
const StreamOptions& options,
const GURL& security_origin) {
@@ -253,7 +261,8 @@ std::string MediaStreamManager::GenerateStream(MediaStreamRequester* requester,
options.audio_type, options.video_type);
DeviceRequest* request = new DeviceRequest(requester, stream_request,
render_process_id,
- render_view_id);
+ render_view_id,
+ rc);
const std::string& label = AddRequest(request);
// Post a task and handle the request asynchronously. The reason is that the
@@ -399,6 +408,7 @@ std::string MediaStreamManager::EnumerateDevices(
MediaStreamRequester* requester,
int render_process_id,
int render_view_id,
+ ResourceContext* rc,
int page_request_id,
MediaStreamType type,
const GURL& security_origin) {
@@ -431,8 +441,8 @@ std::string MediaStreamManager::EnumerateDevices(
security_origin, MEDIA_ENUMERATE_DEVICES, std::string(), std::string(),
options.audio_type, options.video_type);
DeviceRequest* request = new DeviceRequest(requester, stream_request,
- render_process_id,
- render_view_id);
+ render_process_id, render_view_id,
+ rc);
const std::string& label = AddRequest(request);
// Post a task and handle the request asynchronously. The reason is that the
// requester won't have a label for the request until this function returns
@@ -480,6 +490,7 @@ std::string MediaStreamManager::OpenDevice(
MediaStreamRequester* requester,
int render_process_id,
int render_view_id,
+ ResourceContext* rc,
int page_request_id,
const std::string& device_id,
MediaStreamType type,
@@ -506,8 +517,8 @@ std::string MediaStreamManager::OpenDevice(
security_origin, MEDIA_OPEN_DEVICE, options.audio_device_id,
options.video_device_id, options.audio_type, options.video_type);
DeviceRequest* request = new DeviceRequest(requester, stream_request,
- render_process_id,
- render_view_id);
+ render_process_id, render_view_id,
+ rc);
const std::string& label = AddRequest(request);
// Post a task and handle the request asynchronously. The reason is that the
// requester won't have a label for the request until this function returns
@@ -557,6 +568,7 @@ void MediaStreamManager::StopRemovedDevice(const MediaStreamDevice& device) {
request->devices.begin();
device_it != request->devices.end(); ++device_it) {
std::string source_id = content::GetHMACForMediaDeviceID(
+ request->resource_context,
request->request.security_origin,
device.id);
if (device_it->device.id == source_id &&
@@ -606,14 +618,16 @@ void MediaStreamManager::StopMonitoring() {
}
bool MediaStreamManager::TranslateRequestedSourceIdToDeviceId(
- MediaStreamRequest* request) {
+ DeviceRequest* request) {
+ MediaStreamRequest* ms_request = &request->request;
// If a specific device has been requested we need to find the real device id.
- if (request->audio_type == MEDIA_DEVICE_AUDIO_CAPTURE &&
- !request->requested_audio_device_id.empty()) {
+ if (ms_request->audio_type == MEDIA_DEVICE_AUDIO_CAPTURE &&
+ !ms_request->requested_audio_device_id.empty()) {
if (!TranslateSourceIdToDeviceId(MEDIA_DEVICE_AUDIO_CAPTURE,
- request->security_origin,
- request->requested_audio_device_id,
- &request->requested_audio_device_id)) {
+ request->resource_context,
+ ms_request->security_origin,
+ ms_request->requested_audio_device_id,
+ &ms_request->requested_audio_device_id)) {
// TODO(perkj): gUM should support mandatory and optional constraints.
// Ie - if the sourceId is optional but it does not match - gUM should
// not fail. For now we treat sourceId as a mandatory constraint.
@@ -622,12 +636,13 @@ bool MediaStreamManager::TranslateRequestedSourceIdToDeviceId(
}
}
- if (request->video_type == MEDIA_DEVICE_VIDEO_CAPTURE &&
- !request->requested_video_device_id.empty()) {
+ if (ms_request->video_type == MEDIA_DEVICE_VIDEO_CAPTURE &&
+ !ms_request->requested_video_device_id.empty()) {
if (!TranslateSourceIdToDeviceId(MEDIA_DEVICE_VIDEO_CAPTURE,
- request->security_origin,
- request->requested_video_device_id,
- &request->requested_video_device_id)) {
+ request->resource_context,
+ ms_request->security_origin,
+ ms_request->requested_video_device_id,
+ &ms_request->requested_video_device_id)) {
// TODO(perkj): guM should support mandatory and optional constraints.
// Ie - if the sourceId is optional but it does not match - guM should
// not fail. For now we treat sourceId as a mandatory constraint.
@@ -635,23 +650,28 @@ bool MediaStreamManager::TranslateRequestedSourceIdToDeviceId(
return false;
}
}
- DVLOG(3) << "Requested audio device " << request->requested_audio_device_id
- << " video device " << request->requested_video_device_id;
+ DVLOG(3) << "Requested audio device "
+ << ms_request->requested_audio_device_id
+ << "Requested video device "
+ << ms_request->requested_video_device_id;
return true;
}
void MediaStreamManager::TranslateDeviceIdToSourceId(
- const MediaStreamRequest& request,
+ DeviceRequest* request,
MediaStreamDevice* device) {
- if (request.audio_type == MEDIA_DEVICE_AUDIO_CAPTURE ||
- request.video_type == MEDIA_DEVICE_VIDEO_CAPTURE) {
- device->id = content::GetHMACForMediaDeviceID(request.security_origin,
- device->id);
+ if (request->request.audio_type == MEDIA_DEVICE_AUDIO_CAPTURE ||
+ request->request.video_type == MEDIA_DEVICE_VIDEO_CAPTURE) {
+ device->id = content::GetHMACForMediaDeviceID(
+ request->resource_context,
+ request->request.security_origin,
+ device->id);
}
}
bool MediaStreamManager::TranslateSourceIdToDeviceId(
MediaStreamType stream_type,
+ ResourceContext* rc,
const GURL& security_origin,
const std::string& source_id,
std::string* device_id) {
@@ -670,7 +690,7 @@ bool MediaStreamManager::TranslateSourceIdToDeviceId(
for (StreamDeviceInfoArray::const_iterator it = cache->devices.begin();
it != cache->devices.end();
++it) {
- if (content::DoesMediaDeviceIDMatchHMAC(security_origin, source_id,
+ if (content::DoesMediaDeviceIDMatchHMAC(rc, security_origin, source_id,
it->device.id)) {
*device_id = it->device.id;
return true;
@@ -737,7 +757,7 @@ void MediaStreamManager::PostRequestToUI(const std::string& label,
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
DVLOG(1) << "PostRequestToUI({label= " << label << "})";
// If a specific device has been requested we need to find the real device id.
- if (!TranslateRequestedSourceIdToDeviceId(&request->request)) {
+ if (!TranslateRequestedSourceIdToDeviceId(request)) {
FinalizeRequestFailed(label, request);
return;
}
@@ -894,34 +914,33 @@ StreamDeviceInfoArray MediaStreamManager::GetDevicesOpenedByRequest(
}
bool MediaStreamManager::FindExistingRequestedDeviceInfo(
- int render_process_id,
- int render_view_id,
- const GURL& security_origin,
- MediaStreamRequestType type,
- const std::string& device_id,
- MediaStreamType device_type,
- StreamDeviceInfo* device_info,
- MediaRequestState* request_state) const {
- DCHECK(device_info);
- DCHECK(request_state);
+ const DeviceRequest& new_request,
+ const MediaStreamDevice& new_device_info,
+ StreamDeviceInfo* existing_device_info,
+ MediaRequestState* existing_request_state) const {
+ DCHECK(existing_device_info);
+ DCHECK(existing_request_state);
+
+ const MediaStreamRequest& new_ms_request = new_request.request;
std::string source_id = content::GetHMACForMediaDeviceID(
- security_origin,
- device_id);
+ new_request.resource_context,
+ new_ms_request.security_origin,
+ new_device_info.id);
for (DeviceRequests::const_iterator it = requests_.begin();
it != requests_.end() ; ++it) {
const DeviceRequest* request = it->second;
- if (request->requesting_process_id == render_process_id &&
- request->requesting_view_id == render_view_id &&
- request->request.request_type == type) {
+ if (request->requesting_process_id == new_request.requesting_process_id &&
+ request->requesting_view_id == new_request.requesting_view_id &&
+ request->request.request_type == new_ms_request.request_type) {
for (StreamDeviceInfoArray::const_iterator device_it =
request->devices.begin();
device_it != request->devices.end(); ++device_it) {
if (device_it->device.id == source_id &&
- device_it->device.type == device_type) {
- *device_info = *device_it;
- *request_state = request->state(device_it->device.type);
+ device_it->device.type == new_device_info.type) {
+ *existing_device_info = *device_it;
+ *existing_request_state = request->state(device_it->device.type);
return true;
}
}
@@ -980,7 +999,7 @@ void MediaStreamManager::FinalizeEnumerateDevices(const std::string& label,
}
for (StreamDeviceInfoArray::iterator it = request->devices.begin();
it != request->devices.end(); ++it) {
- TranslateDeviceIdToSourceId(request->request, &it->device);
+ TranslateDeviceIdToSourceId(request, &it->device);
}
request->requester->DevicesEnumerated(label, request->devices);
}
@@ -1234,25 +1253,21 @@ void MediaStreamManager::HandleAccessRequestResponse(
// MediaStreams it is being used in.
if (request->request.request_type == MEDIA_GENERATE_STREAM) {
MediaRequestState state;
- if (FindExistingRequestedDeviceInfo(request->requesting_process_id,
- request->requesting_view_id,
- request->request.security_origin,
- request->request.request_type,
- device_info.device.id,
- device_info.device.type,
+ if (FindExistingRequestedDeviceInfo(*request,
+ device_info.device,
&device_info,
&state)) {
request->devices.push_back(device_info);
request->SetState(device_info.device.type, state);
DVLOG(1) << "HandleAccessRequestResponse - device already opened "
- << ", {label = " << label << "}"
- << ", device_id = " << device_it->id << "}";
+ << ", {label = " << label << "}"
+ << ", device_id = " << device_it->id << "}";
continue;
}
}
device_info.session_id =
GetDeviceManager(device_info.device.type)->Open(device_info);
- TranslateDeviceIdToSourceId(request->request, &device_info.device);
+ TranslateDeviceIdToSourceId(request, &device_info.device);
request->devices.push_back(device_info);
request->SetState(device_info.device.type, MEDIA_REQUEST_STATE_OPENING);

Powered by Google App Engine
This is Rietveld 408576698