| Index: content/shell/test_runner/mock_webrtc_peer_connection_handler.cc | 
| diff --git a/content/shell/test_runner/mock_webrtc_peer_connection_handler.cc b/content/shell/test_runner/mock_webrtc_peer_connection_handler.cc | 
| index 61082718505918bf98b3cda622bdf1554fb37bc3..8e5512beffb949747bfbcae86daab18828a55464 100644 | 
| --- a/content/shell/test_runner/mock_webrtc_peer_connection_handler.cc | 
| +++ b/content/shell/test_runner/mock_webrtc_peer_connection_handler.cc | 
| @@ -251,6 +251,10 @@ class MockWebRTCRtpSender : public blink::WebRTCRtpSender { | 
| return track_.get(); | 
| } | 
|  | 
| +  void SetTrack(std::unique_ptr<blink::WebMediaStreamTrack> track) { | 
| +    track_ = std::move(track); | 
| +  } | 
| + | 
| private: | 
| uintptr_t id_; | 
| std::unique_ptr<blink::WebMediaStreamTrack> track_; | 
| @@ -638,6 +642,7 @@ void MockWebRTCPeerConnectionHandler::GetStats( | 
| blink::WebVector<std::unique_ptr<blink::WebRTCRtpSender>> | 
| MockWebRTCPeerConnectionHandler::GetSenders() { | 
| std::vector<std::unique_ptr<blink::WebRTCRtpSender>> senders; | 
| +  // Senders of tracks in |local_streams_| (from |Add/RemoveStream|). | 
| for (const auto& pair : local_streams_) { | 
| const auto& local_stream = pair.second; | 
| blink::WebVector<blink::WebMediaStreamTrack> local_tracks; | 
| @@ -656,6 +661,22 @@ MockWebRTCPeerConnectionHandler::GetSenders() { | 
| base::MakeUnique<WebMediaStreamTrack>(local_track)))); | 
| } | 
| } | 
| +  // Senders of tracks in |tracks_| (from |Add/RemoveTrack|). | 
| +  for (const auto& pair : tracks_) { | 
| +    const auto& track = pair.second; | 
| +    bool has_sender_for_track = false; | 
| +    for (const auto& sender : senders) { | 
| +      if (sender->Track()->Id() == track.Id()) { | 
| +        has_sender_for_track = true; | 
| +        break; | 
| +      } | 
| +    } | 
| +    if (has_sender_for_track) | 
| +      continue; | 
| +    senders.push_back(base::MakeUnique<MockWebRTCRtpSender>( | 
| +        GetIDByTrack(track.Id().Utf8(), &id_by_track_), | 
| +        base::MakeUnique<WebMediaStreamTrack>(track))); | 
| +  } | 
| blink::WebVector<std::unique_ptr<blink::WebRTCRtpSender>> web_vector( | 
| senders.size()); | 
| for (size_t i = 0; i < senders.size(); ++i) { | 
| @@ -693,6 +714,32 @@ MockWebRTCPeerConnectionHandler::GetReceivers() { | 
| return web_vector; | 
| } | 
|  | 
| +std::unique_ptr<blink::WebRTCRtpSender> | 
| +MockWebRTCPeerConnectionHandler::AddTrack( | 
| +    const blink::WebMediaStreamTrack& web_track, | 
| +    const blink::WebVector<blink::WebMediaStream>& web_streams) { | 
| +  for (const auto& sender : GetSenders()) { | 
| +    if (sender->Track() && sender->Track()->Id() == web_track.Id()) { | 
| +      return nullptr; | 
| +    } | 
| +  } | 
| +  tracks_[web_track.Id().Utf8()] = web_track; | 
| +  client_->NegotiationNeeded(); | 
| +  return base::MakeUnique<MockWebRTCRtpSender>( | 
| +      GetIDByTrack(web_track.Id().Utf8(), &id_by_track_), | 
| +      base::MakeUnique<blink::WebMediaStreamTrack>(web_track)); | 
| +} | 
| + | 
| +bool MockWebRTCPeerConnectionHandler::RemoveTrack( | 
| +    blink::WebRTCRtpSender* web_sender) { | 
| +  if (!tracks_.erase(web_sender->Track()->Id().Utf8())) | 
| +    return false; | 
| +  MockWebRTCRtpSender* sender = static_cast<MockWebRTCRtpSender*>(web_sender); | 
| +  sender->SetTrack(nullptr); | 
| +  client_->NegotiationNeeded(); | 
| +  return true; | 
| +} | 
| + | 
| void MockWebRTCPeerConnectionHandler::ReportCreationOfDataChannel() { | 
| WebRTCDataChannelInit init; | 
| WebRTCDataChannelHandler* remote_data_channel = | 
|  |