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

Side by Side Diff: content/renderer/media/rtc_peer_connection_handler.cc

Issue 1438153002: Fix leak of RTCPeerConnectionHandler if PeerConnection.close() is called from js. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed comments. Created 5 years, 1 month 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/media/rtc_peer_connection_handler.h" 5 #include "content/renderer/media/rtc_peer_connection_handler.h"
6 6
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 778 matching lines...) Expand 10 before | Expand all | Expand 10 after
789 789
790 private: 790 private:
791 const base::WeakPtr<RTCPeerConnectionHandler> handler_; 791 const base::WeakPtr<RTCPeerConnectionHandler> handler_;
792 const scoped_refptr<base::SingleThreadTaskRunner> main_thread_; 792 const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
793 }; 793 };
794 794
795 RTCPeerConnectionHandler::RTCPeerConnectionHandler( 795 RTCPeerConnectionHandler::RTCPeerConnectionHandler(
796 blink::WebRTCPeerConnectionHandlerClient* client, 796 blink::WebRTCPeerConnectionHandlerClient* client,
797 PeerConnectionDependencyFactory* dependency_factory) 797 PeerConnectionDependencyFactory* dependency_factory)
798 : client_(client), 798 : client_(client),
799 is_closed_(false),
799 dependency_factory_(dependency_factory), 800 dependency_factory_(dependency_factory),
800 weak_factory_(this) { 801 weak_factory_(this) {
802 CHECK(client_),
801 g_peer_connection_handlers.Get().insert(this); 803 g_peer_connection_handlers.Get().insert(this);
802 } 804 }
803 805
804 RTCPeerConnectionHandler::~RTCPeerConnectionHandler() { 806 RTCPeerConnectionHandler::~RTCPeerConnectionHandler() {
805 DCHECK(thread_checker_.CalledOnValidThread()); 807 DCHECK(thread_checker_.CalledOnValidThread());
806 808
807 stop(); 809 stop();
808 810
809 g_peer_connection_handlers.Get().erase(this); 811 g_peer_connection_handlers.Get().erase(this);
810 if (peer_connection_tracker_) 812 if (peer_connection_tracker_)
811 peer_connection_tracker_->UnregisterPeerConnection(this); 813 peer_connection_tracker_->UnregisterPeerConnection(this);
812 STLDeleteValues(&remote_streams_); 814 STLDeleteValues(&remote_streams_);
813 815
814 UMA_HISTOGRAM_COUNTS_10000( 816 UMA_HISTOGRAM_COUNTS_10000(
815 "WebRTC.NumDataChannelsPerPeerConnection", num_data_channels_created_); 817 "WebRTC.NumDataChannelsPerPeerConnection", num_data_channels_created_);
816 } 818 }
817 819
818 // static 820 // static
819 void RTCPeerConnectionHandler::DestructAllHandlers() { 821 void RTCPeerConnectionHandler::DestructAllHandlers() {
822 // Copy g_peer_connection_handlers since releasePeerConnectionHandler will
823 // remove an item.
820 std::set<RTCPeerConnectionHandler*> handlers( 824 std::set<RTCPeerConnectionHandler*> handlers(
821 g_peer_connection_handlers.Get().begin(), 825 g_peer_connection_handlers.Get().begin(),
822 g_peer_connection_handlers.Get().end()); 826 g_peer_connection_handlers.Get().end());
823 for (auto handler : handlers) { 827 for (auto* handler : handlers)
824 if (handler->client_) 828 handler->client_->releasePeerConnectionHandler();
825 handler->client_->releasePeerConnectionHandler();
826 }
827 } 829 }
828 830
829 // static 831 // static
830 void RTCPeerConnectionHandler::ConvertOfferOptionsToConstraints( 832 void RTCPeerConnectionHandler::ConvertOfferOptionsToConstraints(
831 const blink::WebRTCOfferOptions& options, 833 const blink::WebRTCOfferOptions& options,
832 RTCMediaConstraints* output) { 834 RTCMediaConstraints* output) {
833 output->AddMandatory( 835 output->AddMandatory(
834 webrtc::MediaConstraintsInterface::kOfferToReceiveAudio, 836 webrtc::MediaConstraintsInterface::kOfferToReceiveAudio,
835 options.offerToReceiveAudio() > 0 ? "true" : "false", 837 options.offerToReceiveAudio() > 0 ? "true" : "false",
836 true); 838 true);
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after
1302 const std::string& track_id, 1304 const std::string& track_id,
1303 blink::WebMediaStreamSource::Type track_type) { 1305 blink::WebMediaStreamSource::Type track_type) {
1304 DCHECK(thread_checker_.CalledOnValidThread()); 1306 DCHECK(thread_checker_.CalledOnValidThread());
1305 signaling_thread()->PostTask(FROM_HERE, 1307 signaling_thread()->PostTask(FROM_HERE,
1306 base::Bind(&GetStatsOnSignalingThread, native_peer_connection_, level, 1308 base::Bind(&GetStatsOnSignalingThread, native_peer_connection_, level,
1307 make_scoped_refptr(observer), track_id, track_type)); 1309 make_scoped_refptr(observer), track_id, track_type));
1308 } 1310 }
1309 1311
1310 void RTCPeerConnectionHandler::CloseClientPeerConnection() { 1312 void RTCPeerConnectionHandler::CloseClientPeerConnection() {
1311 DCHECK(thread_checker_.CalledOnValidThread()); 1313 DCHECK(thread_checker_.CalledOnValidThread());
1312 if (client_) 1314 if (!is_closed_)
1313 client_->closePeerConnection(); 1315 client_->closePeerConnection();
1314 } 1316 }
1315 1317
1316 blink::WebRTCDataChannelHandler* RTCPeerConnectionHandler::createDataChannel( 1318 blink::WebRTCDataChannelHandler* RTCPeerConnectionHandler::createDataChannel(
1317 const blink::WebString& label, const blink::WebRTCDataChannelInit& init) { 1319 const blink::WebString& label, const blink::WebRTCDataChannelInit& init) {
1318 DCHECK(thread_checker_.CalledOnValidThread()); 1320 DCHECK(thread_checker_.CalledOnValidThread());
1319 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createDataChannel"); 1321 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::createDataChannel");
1320 DVLOG(1) << "createDataChannel label " 1322 DVLOG(1) << "createDataChannel label "
1321 << base::UTF16ToUTF8(base::StringPiece16(label)); 1323 << base::UTF16ToUTF8(base::StringPiece16(label));
1322 1324
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1373 if (peer_connection_tracker_) 1375 if (peer_connection_tracker_)
1374 peer_connection_tracker_->TrackCreateDTMFSender(this, track); 1376 peer_connection_tracker_->TrackCreateDTMFSender(this, track);
1375 1377
1376 return new RtcDtmfSenderHandler(sender); 1378 return new RtcDtmfSenderHandler(sender);
1377 } 1379 }
1378 1380
1379 void RTCPeerConnectionHandler::stop() { 1381 void RTCPeerConnectionHandler::stop() {
1380 DCHECK(thread_checker_.CalledOnValidThread()); 1382 DCHECK(thread_checker_.CalledOnValidThread());
1381 DVLOG(1) << "RTCPeerConnectionHandler::stop"; 1383 DVLOG(1) << "RTCPeerConnectionHandler::stop";
1382 1384
1383 if (!client_ || !native_peer_connection_.get()) 1385 if (!is_closed_ || !native_peer_connection_.get())
Taylor_Brandstetter 2015/11/13 18:45:29 Should be "is_closed", not "!is_closed". I think t
tommi (sloooow) - chröme 2015/11/13 18:57:23 well spotted! :)
1384 return; // Already stopped. 1386 return; // Already stopped.
1385 1387
1386 if (peer_connection_tracker_) 1388 if (peer_connection_tracker_)
1387 peer_connection_tracker_->TrackStop(this); 1389 peer_connection_tracker_->TrackStop(this);
1388 1390
1389 native_peer_connection_->Close(); 1391 native_peer_connection_->Close();
1390 1392
1391 // The client_ pointer is not considered valid after this point and no further 1393 // This object may no longer forward call backs to blink.
1392 // callbacks must be made. 1394 is_closed_ = true;
1393 client_ = nullptr;
1394 } 1395 }
1395 1396
1396 void RTCPeerConnectionHandler::OnSignalingChange( 1397 void RTCPeerConnectionHandler::OnSignalingChange(
1397 webrtc::PeerConnectionInterface::SignalingState new_state) { 1398 webrtc::PeerConnectionInterface::SignalingState new_state) {
1398 DCHECK(thread_checker_.CalledOnValidThread()); 1399 DCHECK(thread_checker_.CalledOnValidThread());
1399 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnSignalingChange"); 1400 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnSignalingChange");
1400 1401
1401 blink::WebRTCPeerConnectionHandlerClient::SignalingState state = 1402 blink::WebRTCPeerConnectionHandlerClient::SignalingState state =
1402 GetWebKitSignalingState(new_state); 1403 GetWebKitSignalingState(new_state);
1403 if (peer_connection_tracker_) 1404 if (peer_connection_tracker_)
1404 peer_connection_tracker_->TrackSignalingStateChange(this, state); 1405 peer_connection_tracker_->TrackSignalingStateChange(this, state);
1405 if (client_) 1406 if (!is_closed_)
1406 client_->didChangeSignalingState(state); 1407 client_->didChangeSignalingState(state);
1407 } 1408 }
1408 1409
1409 // Called any time the IceConnectionState changes 1410 // Called any time the IceConnectionState changes
1410 void RTCPeerConnectionHandler::OnIceConnectionChange( 1411 void RTCPeerConnectionHandler::OnIceConnectionChange(
1411 webrtc::PeerConnectionInterface::IceConnectionState new_state) { 1412 webrtc::PeerConnectionInterface::IceConnectionState new_state) {
1412 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnIceConnectionChange"); 1413 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnIceConnectionChange");
1413 DCHECK(thread_checker_.CalledOnValidThread()); 1414 DCHECK(thread_checker_.CalledOnValidThread());
1414 ReportICEState(new_state); 1415 ReportICEState(new_state);
1415 if (new_state == webrtc::PeerConnectionInterface::kIceConnectionChecking) { 1416 if (new_state == webrtc::PeerConnectionInterface::kIceConnectionChecking) {
(...skipping 15 matching lines...) Expand all
1431 "WebRTC.PeerConnection.TimeToConnect", 1432 "WebRTC.PeerConnection.TimeToConnect",
1432 base::TimeTicks::Now() - ice_connection_checking_start_); 1433 base::TimeTicks::Now() - ice_connection_checking_start_);
1433 } 1434 }
1434 } 1435 }
1435 1436
1436 track_metrics_.IceConnectionChange(new_state); 1437 track_metrics_.IceConnectionChange(new_state);
1437 blink::WebRTCPeerConnectionHandlerClient::ICEConnectionState state = 1438 blink::WebRTCPeerConnectionHandlerClient::ICEConnectionState state =
1438 GetWebKitIceConnectionState(new_state); 1439 GetWebKitIceConnectionState(new_state);
1439 if (peer_connection_tracker_) 1440 if (peer_connection_tracker_)
1440 peer_connection_tracker_->TrackIceConnectionStateChange(this, state); 1441 peer_connection_tracker_->TrackIceConnectionStateChange(this, state);
1441 if(client_) 1442 if (!is_closed_)
1442 client_->didChangeICEConnectionState(state); 1443 client_->didChangeICEConnectionState(state);
1443 } 1444 }
1444 1445
1445 // Called any time the IceGatheringState changes 1446 // Called any time the IceGatheringState changes
1446 void RTCPeerConnectionHandler::OnIceGatheringChange( 1447 void RTCPeerConnectionHandler::OnIceGatheringChange(
1447 webrtc::PeerConnectionInterface::IceGatheringState new_state) { 1448 webrtc::PeerConnectionInterface::IceGatheringState new_state) {
1448 DCHECK(thread_checker_.CalledOnValidThread()); 1449 DCHECK(thread_checker_.CalledOnValidThread());
1449 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnIceGatheringChange"); 1450 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnIceGatheringChange");
1450 1451
1451 if (new_state == webrtc::PeerConnectionInterface::kIceGatheringComplete) { 1452 if (new_state == webrtc::PeerConnectionInterface::kIceGatheringComplete) {
1452 // If ICE gathering is completed, generate a NULL ICE candidate, 1453 // If ICE gathering is completed, generate a NULL ICE candidate,
1453 // to signal end of candidates. 1454 // to signal end of candidates.
1454 if (client_) { 1455 if (!is_closed_) {
1455 blink::WebRTCICECandidate null_candidate; 1456 blink::WebRTCICECandidate null_candidate;
1456 client_->didGenerateICECandidate(null_candidate); 1457 client_->didGenerateICECandidate(null_candidate);
1457 } 1458 }
1458 1459
1459 UMA_HISTOGRAM_COUNTS_100("WebRTC.PeerConnection.IPv4LocalCandidates", 1460 UMA_HISTOGRAM_COUNTS_100("WebRTC.PeerConnection.IPv4LocalCandidates",
1460 num_local_candidates_ipv4_); 1461 num_local_candidates_ipv4_);
1461 1462
1462 UMA_HISTOGRAM_COUNTS_100("WebRTC.PeerConnection.IPv6LocalCandidates", 1463 UMA_HISTOGRAM_COUNTS_100("WebRTC.PeerConnection.IPv6LocalCandidates",
1463 num_local_candidates_ipv6_); 1464 num_local_candidates_ipv6_);
1464 } else if (new_state == 1465 } else if (new_state ==
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1501 1502
1502 if (peer_connection_tracker_) { 1503 if (peer_connection_tracker_) {
1503 peer_connection_tracker_->TrackAddStream( 1504 peer_connection_tracker_->TrackAddStream(
1504 this, s->webkit_stream(), PeerConnectionTracker::SOURCE_REMOTE); 1505 this, s->webkit_stream(), PeerConnectionTracker::SOURCE_REMOTE);
1505 } 1506 }
1506 1507
1507 PerSessionWebRTCAPIMetrics::GetInstance()->IncrementStreamCounter(); 1508 PerSessionWebRTCAPIMetrics::GetInstance()->IncrementStreamCounter();
1508 1509
1509 track_metrics_.AddStream(MediaStreamTrackMetrics::RECEIVED_STREAM, 1510 track_metrics_.AddStream(MediaStreamTrackMetrics::RECEIVED_STREAM,
1510 s->webrtc_stream().get()); 1511 s->webrtc_stream().get());
1511 if (client_) 1512 if (!is_closed_)
1512 client_->didAddRemoteStream(s->webkit_stream()); 1513 client_->didAddRemoteStream(s->webkit_stream());
1513 } 1514 }
1514 1515
1515 void RTCPeerConnectionHandler::OnRemoveStream( 1516 void RTCPeerConnectionHandler::OnRemoveStream(
1516 const scoped_refptr<webrtc::MediaStreamInterface>& stream) { 1517 const scoped_refptr<webrtc::MediaStreamInterface>& stream) {
1517 DCHECK(thread_checker_.CalledOnValidThread()); 1518 DCHECK(thread_checker_.CalledOnValidThread());
1518 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnRemoveStreamImpl"); 1519 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnRemoveStreamImpl");
1519 RemoteStreamMap::iterator it = remote_streams_.find(stream.get()); 1520 RemoteStreamMap::iterator it = remote_streams_.find(stream.get());
1520 if (it == remote_streams_.end()) { 1521 if (it == remote_streams_.end()) {
1521 NOTREACHED() << "Stream not found"; 1522 NOTREACHED() << "Stream not found";
1522 return; 1523 return;
1523 } 1524 }
1524 1525
1525 track_metrics_.RemoveStream(MediaStreamTrackMetrics::RECEIVED_STREAM, 1526 track_metrics_.RemoveStream(MediaStreamTrackMetrics::RECEIVED_STREAM,
1526 stream.get()); 1527 stream.get());
1527 PerSessionWebRTCAPIMetrics::GetInstance()->DecrementStreamCounter(); 1528 PerSessionWebRTCAPIMetrics::GetInstance()->DecrementStreamCounter();
1528 1529
1529 scoped_ptr<RemoteMediaStreamImpl> remote_stream(it->second); 1530 scoped_ptr<RemoteMediaStreamImpl> remote_stream(it->second);
1530 const blink::WebMediaStream& webkit_stream = remote_stream->webkit_stream(); 1531 const blink::WebMediaStream& webkit_stream = remote_stream->webkit_stream();
1531 DCHECK(!webkit_stream.isNull()); 1532 DCHECK(!webkit_stream.isNull());
1532 remote_streams_.erase(it); 1533 remote_streams_.erase(it);
1533 1534
1534 if (peer_connection_tracker_) { 1535 if (peer_connection_tracker_) {
1535 peer_connection_tracker_->TrackRemoveStream( 1536 peer_connection_tracker_->TrackRemoveStream(
1536 this, webkit_stream, PeerConnectionTracker::SOURCE_REMOTE); 1537 this, webkit_stream, PeerConnectionTracker::SOURCE_REMOTE);
1537 } 1538 }
1538 1539
1539 if (client_) 1540 if (!is_closed_)
1540 client_->didRemoveRemoteStream(webkit_stream); 1541 client_->didRemoveRemoteStream(webkit_stream);
1541 } 1542 }
1542 1543
1543 void RTCPeerConnectionHandler::OnDataChannel( 1544 void RTCPeerConnectionHandler::OnDataChannel(
1544 scoped_ptr<RtcDataChannelHandler> handler) { 1545 scoped_ptr<RtcDataChannelHandler> handler) {
1545 DCHECK(thread_checker_.CalledOnValidThread()); 1546 DCHECK(thread_checker_.CalledOnValidThread());
1546 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnDataChannelImpl"); 1547 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnDataChannelImpl");
1547 1548
1548 if (peer_connection_tracker_) { 1549 if (peer_connection_tracker_) {
1549 peer_connection_tracker_->TrackCreateDataChannel( 1550 peer_connection_tracker_->TrackCreateDataChannel(
1550 this, handler->channel().get(), PeerConnectionTracker::SOURCE_REMOTE); 1551 this, handler->channel().get(), PeerConnectionTracker::SOURCE_REMOTE);
1551 } 1552 }
1552 1553
1553 if (client_) 1554 if (!is_closed_)
1554 client_->didAddRemoteDataChannel(handler.release()); 1555 client_->didAddRemoteDataChannel(handler.release());
1555 } 1556 }
1556 1557
1557 void RTCPeerConnectionHandler::OnIceCandidate( 1558 void RTCPeerConnectionHandler::OnIceCandidate(
1558 const std::string& sdp, const std::string& sdp_mid, int sdp_mline_index, 1559 const std::string& sdp, const std::string& sdp_mid, int sdp_mline_index,
1559 int component, int address_family) { 1560 int component, int address_family) {
1560 DCHECK(thread_checker_.CalledOnValidThread()); 1561 DCHECK(thread_checker_.CalledOnValidThread());
1561 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnIceCandidateImpl"); 1562 TRACE_EVENT0("webrtc", "RTCPeerConnectionHandler::OnIceCandidateImpl");
1562 blink::WebRTCICECandidate web_candidate; 1563 blink::WebRTCICECandidate web_candidate;
1563 web_candidate.initialize(base::UTF8ToUTF16(sdp), 1564 web_candidate.initialize(base::UTF8ToUTF16(sdp),
1564 base::UTF8ToUTF16(sdp_mid), 1565 base::UTF8ToUTF16(sdp_mid),
1565 sdp_mline_index); 1566 sdp_mline_index);
1566 if (peer_connection_tracker_) { 1567 if (peer_connection_tracker_) {
1567 peer_connection_tracker_->TrackAddIceCandidate( 1568 peer_connection_tracker_->TrackAddIceCandidate(
1568 this, web_candidate, PeerConnectionTracker::SOURCE_LOCAL, true); 1569 this, web_candidate, PeerConnectionTracker::SOURCE_LOCAL, true);
1569 } 1570 }
1570 1571
1571 // Only the first m line's first component is tracked to avoid 1572 // Only the first m line's first component is tracked to avoid
1572 // miscounting when doing BUNDLE or rtcp mux. 1573 // miscounting when doing BUNDLE or rtcp mux.
1573 if (sdp_mline_index == 0 && component == 1) { 1574 if (sdp_mline_index == 0 && component == 1) {
1574 if (address_family == AF_INET) { 1575 if (address_family == AF_INET) {
1575 ++num_local_candidates_ipv4_; 1576 ++num_local_candidates_ipv4_;
1576 } else if (address_family == AF_INET6) { 1577 } else if (address_family == AF_INET6) {
1577 ++num_local_candidates_ipv6_; 1578 ++num_local_candidates_ipv6_;
1578 } else { 1579 } else {
1579 NOTREACHED(); 1580 NOTREACHED();
1580 } 1581 }
1581 } 1582 }
1582 if (client_) 1583 if (!is_closed_)
1583 client_->didGenerateICECandidate(web_candidate); 1584 client_->didGenerateICECandidate(web_candidate);
1584 } 1585 }
1585 1586
1586 webrtc::SessionDescriptionInterface* 1587 webrtc::SessionDescriptionInterface*
1587 RTCPeerConnectionHandler::CreateNativeSessionDescription( 1588 RTCPeerConnectionHandler::CreateNativeSessionDescription(
1588 const std::string& sdp, const std::string& type, 1589 const std::string& sdp, const std::string& type,
1589 webrtc::SdpParseError* error) { 1590 webrtc::SdpParseError* error) {
1590 webrtc::SessionDescriptionInterface* native_desc = 1591 webrtc::SessionDescriptionInterface* native_desc =
1591 dependency_factory_->CreateSessionDescription(type, sdp, error); 1592 dependency_factory_->CreateSessionDescription(type, sdp, error);
1592 1593
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1663 } 1664 }
1664 1665
1665 void RTCPeerConnectionHandler::ResetUMAStats() { 1666 void RTCPeerConnectionHandler::ResetUMAStats() {
1666 DCHECK(thread_checker_.CalledOnValidThread()); 1667 DCHECK(thread_checker_.CalledOnValidThread());
1667 num_local_candidates_ipv6_ = 0; 1668 num_local_candidates_ipv6_ = 0;
1668 num_local_candidates_ipv4_ = 0; 1669 num_local_candidates_ipv4_ = 0;
1669 ice_connection_checking_start_ = base::TimeTicks(); 1670 ice_connection_checking_start_ = base::TimeTicks();
1670 memset(ice_state_seen_, 0, sizeof(ice_state_seen_)); 1671 memset(ice_state_seen_, 0, sizeof(ice_state_seen_));
1671 } 1672 }
1672 } // namespace content 1673 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/rtc_peer_connection_handler.h ('k') | content/renderer/media/rtc_peer_connection_handler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698