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 2e0d77b2ebf1406c198a4cb19558fdeed7d4c268..11bfb0ed242c5cd9471ebf9f48f03cfcd175c374 100644 |
--- a/content/browser/renderer_host/media/media_stream_manager.cc |
+++ b/content/browser/renderer_host/media/media_stream_manager.cc |
@@ -238,7 +238,9 @@ class MediaStreamManager::DeviceRequest { |
salt_callback(salt_callback), |
state_(NUM_MEDIA_TYPES, MEDIA_REQUEST_STATE_NOT_REQUESTED), |
audio_type_(MEDIA_NO_SERVICE), |
- video_type_(MEDIA_NO_SERVICE) { |
+ video_type_(MEDIA_NO_SERVICE), |
+ target_process_id_(-1), |
+ target_frame_id_(-1) { |
} |
~DeviceRequest() {} |
@@ -264,6 +266,8 @@ class MediaStreamManager::DeviceRequest { |
void CreateUIRequest(const std::string& requested_audio_device_id, |
const std::string& requested_video_device_id) { |
DCHECK(!ui_request_); |
+ target_process_id_ = requesting_process_id; |
+ target_frame_id_ = requesting_frame_id; |
ui_request_.reset(new MediaStreamRequest(requesting_process_id, |
requesting_frame_id, |
page_request_id, |
@@ -279,9 +283,10 @@ class MediaStreamManager::DeviceRequest { |
// Creates a tab capture specific MediaStreamRequest object that is used by |
// this request when UI is asked for permission and device selection. |
void CreateTabCaptureUIRequest(int target_render_process_id, |
- int target_render_frame_id, |
- const std::string& tab_capture_id) { |
+ int target_render_frame_id) { |
DCHECK(!ui_request_); |
+ target_process_id_ = target_render_process_id; |
+ target_frame_id_ = target_render_frame_id; |
ui_request_.reset(new MediaStreamRequest(target_render_process_id, |
target_render_frame_id, |
page_request_id, |
@@ -292,10 +297,12 @@ class MediaStreamManager::DeviceRequest { |
"", |
audio_type_, |
video_type_)); |
- ui_request_->tab_capture_device_id = tab_capture_id; |
} |
- const MediaStreamRequest* UIRequest() const { return ui_request_.get(); } |
+ bool HasUIRequest() const { return ui_request_.get() != nullptr; } |
+ scoped_ptr<MediaStreamRequest> DetachUIRequest() { |
+ return ui_request_.Pass(); |
+ } |
// Update the request state and notify observers. |
void SetState(MediaStreamType stream_type, MediaRequestState new_state) { |
@@ -313,14 +320,8 @@ class MediaStreamManager::DeviceRequest { |
if (!media_observer) |
return; |
- // If |ui_request_| doesn't exist, it means that the request has not yet |
- // been setup fully and there are no valid observers. |
- if (!ui_request_) |
- return; |
- |
media_observer->OnMediaRequestStateChanged( |
- ui_request_->render_process_id, ui_request_->render_frame_id, |
- ui_request_->page_request_id, ui_request_->security_origin, |
+ target_process_id_, target_frame_id_, page_request_id, security_origin, |
stream_type, new_state); |
} |
@@ -365,11 +366,15 @@ class MediaStreamManager::DeviceRequest { |
scoped_ptr<MediaStreamUIProxy> ui_proxy; |
+ std::string tab_capture_device_id; |
+ |
private: |
std::vector<MediaRequestState> state_; |
scoped_ptr<MediaStreamRequest> ui_request_; |
MediaStreamType audio_type_; |
MediaStreamType video_type_; |
+ int target_process_id_; |
+ int target_frame_id_; |
}; |
MediaStreamManager::EnumerationCache::EnumerationCache() |
@@ -1163,7 +1168,7 @@ void MediaStreamManager::DeleteRequest(const std::string& label) { |
void MediaStreamManager::PostRequestToUI(const std::string& label, |
DeviceRequest* request) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- DCHECK(request->UIRequest()); |
+ DCHECK(request->HasUIRequest()); |
DVLOG(1) << "PostRequestToUI({label= " << label << "})"; |
const MediaStreamType audio_type = request->audio_type(); |
@@ -1203,7 +1208,7 @@ void MediaStreamManager::PostRequestToUI(const std::string& label, |
} |
request->ui_proxy->RequestAccess( |
- *request->UIRequest(), |
+ request->DetachUIRequest(), |
base::Bind(&MediaStreamManager::HandleAccessRequestResponse, |
base::Unretained(this), label)); |
} |
@@ -1340,10 +1345,10 @@ bool MediaStreamManager::SetupTabCaptureRequest(DeviceRequest* request) { |
request->video_type() != MEDIA_NO_SERVICE)) { |
return false; |
} |
+ request->tab_capture_device_id = capture_device_id; |
request->CreateTabCaptureUIRequest(target_render_process_id, |
- target_render_frame_id, |
- capture_device_id); |
+ target_render_frame_id); |
DVLOG(3) << "SetupTabCaptureRequest " |
<< ", {capture_device_id = " << capture_device_id << "}" |
@@ -1913,7 +1918,7 @@ void MediaStreamManager::HandleAccessRequestResponse( |
if (device_info.device.type == content::MEDIA_TAB_VIDEO_CAPTURE || |
device_info.device.type == content::MEDIA_TAB_AUDIO_CAPTURE) { |
- device_info.device.id = request->UIRequest()->tab_capture_device_id; |
+ device_info.device.id = request->tab_capture_device_id; |
// Initialize the sample_rate and channel_layout here since for audio |
// mirroring, we don't go through EnumerateDevices where these are usually |