Index: content/renderer/media/media_stream_impl.cc |
diff --git a/content/renderer/media/media_stream_impl.cc b/content/renderer/media/media_stream_impl.cc |
index ae9d31fa045b6b30e25c570b094fd55b01b98bfb..bf60ddbe22d51ba3e2331235c4cd4d064d4b7f9b 100644 |
--- a/content/renderer/media/media_stream_impl.cc |
+++ b/content/renderer/media/media_stream_impl.cc |
@@ -90,7 +90,7 @@ void CreateWebKitSourceVector( |
type, |
UTF8ToUTF16(devices[i].device.name)); |
webkit_sources[i].setExtraData( |
- new content::MediaStreamSourceExtraData(devices[i])); |
+ new content::MediaStreamSourceExtraData(devices[i], webkit_sources[i])); |
webkit_sources[i].setDeviceId(UTF8ToUTF16(devices[i].device.id.c_str())); |
} |
} |
@@ -306,11 +306,13 @@ void MediaStreamImpl::OnStreamGenerated( |
CreateWebKitSourceVector(label, audio_array, |
WebKit::WebMediaStreamSource::TypeAudio, |
audio_source_vector); |
+ request_info->audio_sources.assign(audio_source_vector); |
WebKit::WebVector<WebKit::WebMediaStreamSource> video_source_vector( |
video_array.size()); |
CreateWebKitSourceVector(label, video_array, |
WebKit::WebMediaStreamSource::TypeVideo, |
video_source_vector); |
+ request_info->video_sources.assign(video_source_vector); |
WebKit::WebUserMediaRequest* request = &(request_info->request); |
WebKit::WebString webkit_label = UTF8ToUTF16(label); |
@@ -560,8 +562,10 @@ MediaStreamImpl::CreateLocalAudioRenderer( |
} |
MediaStreamSourceExtraData::MediaStreamSourceExtraData( |
- const StreamDeviceInfo& device_info) |
- : device_info_(device_info) { |
+ const StreamDeviceInfo& device_info, |
+ const WebKit::WebMediaStreamSource& webkit_source) |
+ : device_info_(device_info), |
+ webkit_source_(webkit_source) { |
} |
MediaStreamSourceExtraData::MediaStreamSourceExtraData( |
@@ -590,4 +594,35 @@ void MediaStreamExtraData::OnLocalStreamStop() { |
stream_stop_callback_.Run(stream_->label()); |
} |
+MediaStreamImpl::UserMediaRequestInfo::UserMediaRequestInfo() |
+ : request_id(0), generated(false), frame(NULL), request() { |
+} |
+ |
+MediaStreamImpl::UserMediaRequestInfo::UserMediaRequestInfo( |
+ int request_id, |
+ WebKit::WebFrame* frame, |
+ const WebKit::WebUserMediaRequest& request) |
+ : request_id(request_id), generated(false), frame(frame), |
+ request(request) { |
+} |
+ |
+MediaStreamImpl::UserMediaRequestInfo::~UserMediaRequestInfo() { |
+ // Release the extra data field of all sources created by |
+ // MediaStreamImpl for this request. This breaks the circular reference to |
+ // WebKit::MediaStreamSource. |
+ // TODO(tommyw): Remove this once WebKit::MediaStreamSource::Owner has been |
+ // implemented to fully avoid a circular dependency. |
+ for (size_t i = 0; i < audio_sources.size(); ++i) { |
+ audio_sources[i].setReadyState( |
+ WebKit::WebMediaStreamSource::ReadyStateEnded); |
+ audio_sources[i].setExtraData(NULL); |
+ } |
+ |
+ for (size_t i = 0; i < video_sources.size(); ++i) { |
+ video_sources[i].setReadyState( |
+ WebKit::WebMediaStreamSource::ReadyStateEnded); |
+ video_sources[i].setExtraData(NULL); |
+ } |
+} |
+ |
} // namespace content |