| Index: content/shell/renderer/test_runner/mock_webrtc_peer_connection_handler.cc
|
| diff --git a/content/shell/renderer/test_runner/mock_webrtc_peer_connection_handler.cc b/content/shell/renderer/test_runner/mock_webrtc_peer_connection_handler.cc
|
| index 341c95289b4b2802337be8b2e9d79cf14b38f2b3..815510b961c93a97718415908b6871c45c70c8ba 100644
|
| --- a/content/shell/renderer/test_runner/mock_webrtc_peer_connection_handler.cc
|
| +++ b/content/shell/renderer/test_runner/mock_webrtc_peer_connection_handler.cc
|
| @@ -11,6 +11,7 @@
|
| #include "content/shell/renderer/test_runner/web_test_delegate.h"
|
| #include "third_party/WebKit/public/platform/WebMediaConstraints.h"
|
| #include "third_party/WebKit/public/platform/WebMediaStream.h"
|
| +#include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
|
| #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
|
| #include "third_party/WebKit/public/platform/WebRTCDataChannelInit.h"
|
| #include "third_party/WebKit/public/platform/WebRTCPeerConnectionHandlerClient.h"
|
| @@ -147,6 +148,9 @@ class RemoteDataChannelTask
|
| MockWebRTCPeerConnectionHandler::MockWebRTCPeerConnectionHandler() {
|
| }
|
|
|
| +MockWebRTCPeerConnectionHandler::~MockWebRTCPeerConnectionHandler() {
|
| +}
|
| +
|
| MockWebRTCPeerConnectionHandler::MockWebRTCPeerConnectionHandler(
|
| WebRTCPeerConnectionHandlerClient* client,
|
| TestInterfaces* interfaces)
|
| @@ -223,7 +227,9 @@ void MockWebRTCPeerConnectionHandler::setLocalDescription(
|
| void MockWebRTCPeerConnectionHandler::setRemoteDescription(
|
| const WebRTCVoidRequest& request,
|
| const WebRTCSessionDescription& remote_description) {
|
| +
|
| if (!remote_description.isNull() && remote_description.sdp() == "remote") {
|
| + UpdateRemoteStreams();
|
| remote_description_ = remote_description;
|
| interfaces_->GetDelegate()->PostTask(
|
| new RTCVoidRequestTask(this, request, true));
|
| @@ -232,6 +238,84 @@ void MockWebRTCPeerConnectionHandler::setRemoteDescription(
|
| new RTCVoidRequestTask(this, request, false));
|
| }
|
|
|
| +void MockWebRTCPeerConnectionHandler::UpdateRemoteStreams() {
|
| + // Find all removed streams.
|
| + // Set the readyState of the remote tracks to ended, remove them from the
|
| + // stream and notify the client.
|
| + StreamMap::iterator removed_it = remote_streams_.begin();
|
| + while (removed_it != remote_streams_.end()) {
|
| + if (local_streams_.find(removed_it->first) != local_streams_.end()) {
|
| + removed_it++;
|
| + continue;
|
| + }
|
| +
|
| + // The stream have been removed. Loop through all tracks and set the
|
| + // source as ended and remove them from the stream.
|
| + blink::WebMediaStream stream = removed_it->second;
|
| + blink::WebVector<blink::WebMediaStreamTrack> audio_tracks;
|
| + stream.audioTracks(audio_tracks);
|
| + for (size_t i = 0; i < audio_tracks.size(); ++i) {
|
| + audio_tracks[i].source().setReadyState(
|
| + blink::WebMediaStreamSource::ReadyStateEnded);
|
| + stream.removeTrack(audio_tracks[i]);
|
| + }
|
| +
|
| + blink::WebVector<blink::WebMediaStreamTrack> video_tracks;
|
| + stream.videoTracks(video_tracks);
|
| + for (size_t i = 0; i < video_tracks.size(); ++i) {
|
| + video_tracks[i].source().setReadyState(
|
| + blink::WebMediaStreamSource::ReadyStateEnded);
|
| + stream.removeTrack(video_tracks[i]);
|
| + }
|
| + client_->didRemoveRemoteStream(stream);
|
| + remote_streams_.erase(removed_it++);
|
| + }
|
| +
|
| + // Find all new streams;
|
| + // Create new sources and tracks and notify the client about the new stream.
|
| + StreamMap::iterator added_it = local_streams_.begin();
|
| + while (added_it != local_streams_.end()) {
|
| + if (remote_streams_.find(added_it->first) != remote_streams_.end()) {
|
| + added_it++;
|
| + continue;
|
| + }
|
| +
|
| + const blink::WebMediaStream& stream = added_it->second;
|
| +
|
| + blink::WebVector<blink::WebMediaStreamTrack> local_audio_tracks;
|
| + stream.audioTracks(local_audio_tracks);
|
| + blink::WebVector<blink::WebMediaStreamTrack>
|
| + remote_audio_tracks(local_audio_tracks.size());
|
| +
|
| + for (size_t i = 0; i < local_audio_tracks.size(); ++i) {
|
| + blink::WebMediaStreamSource webkit_source;
|
| + webkit_source.initialize(local_audio_tracks[i].id(),
|
| + blink::WebMediaStreamSource::TypeAudio,
|
| + local_audio_tracks[i].id());
|
| + remote_audio_tracks[i].initialize(webkit_source);
|
| + }
|
| +
|
| + blink::WebVector<blink::WebMediaStreamTrack> local_video_tracks;
|
| + stream.videoTracks(local_video_tracks);
|
| + blink::WebVector<blink::WebMediaStreamTrack>
|
| + remote_video_tracks(local_video_tracks.size());
|
| + for (size_t i = 0; i < local_video_tracks.size(); ++i) {
|
| + blink::WebMediaStreamSource webkit_source;
|
| + webkit_source.initialize(local_video_tracks[i].id(),
|
| + blink::WebMediaStreamSource::TypeVideo,
|
| + local_video_tracks[i].id());
|
| + remote_video_tracks[i].initialize(webkit_source);
|
| + }
|
| +
|
| + blink::WebMediaStream new_remote_stream;
|
| + new_remote_stream.initialize(remote_audio_tracks,
|
| + remote_video_tracks);
|
| + remote_streams_[added_it->first] = new_remote_stream;
|
| + client_->didAddRemoteStream(new_remote_stream);
|
| + ++added_it;
|
| + }
|
| +}
|
| +
|
| WebRTCSessionDescription MockWebRTCPeerConnectionHandler::localDescription() {
|
| return local_description_;
|
| }
|
| @@ -263,14 +347,18 @@ bool MockWebRTCPeerConnectionHandler::addICECandidate(
|
| bool MockWebRTCPeerConnectionHandler::addStream(
|
| const WebMediaStream& stream,
|
| const WebMediaConstraints& constraints) {
|
| + if (local_streams_.find(stream.id().utf8()) != local_streams_.end())
|
| + return false;
|
| ++stream_count_;
|
| client_->negotiationNeeded();
|
| + local_streams_[stream.id().utf8()] = stream;
|
| return true;
|
| }
|
|
|
| void MockWebRTCPeerConnectionHandler::removeStream(
|
| const WebMediaStream& stream) {
|
| --stream_count_;
|
| + local_streams_.erase(stream.id().utf8());
|
| client_->negotiationNeeded();
|
| }
|
|
|
|
|