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 3// found in the LICENSE file. 4 5#ifndef CONTENT_RENDERER_MEDIA_RTC_PEER_CONNECTION_HANDLER_H_ 6#define CONTENT_RENDERER_MEDIA_RTC_PEER_CONNECTION_HANDLER_H_ 7 8#include "base/basictypes.h" 9#include "base/compiler_specific.h" 10#include "content/common/content_export.h" 11#include "content/renderer/media/peer_connection_handler_base.h" 12#include "third_party/WebKit/public/platform/WebRTCPeerConnectionHandler.h" 13#include "third_party/WebKit/public/platform/WebRTCStatsRequest.h" 14#include "third_party/WebKit/public/platform/WebRTCStatsResponse.h" 15 16namespace WebKit { 17class WebFrame; 18class WebRTCDataChannelHandler; 19} 20 21namespace content { 22 23class PeerConnectionTracker; 24 25// Mockable wrapper for WebKit::WebRTCStatsResponse 26class CONTENT_EXPORT LocalRTCStatsResponse 27 : public NON_EXPORTED_BASE(talk_base::RefCountInterface) { 28 public: 29 explicit LocalRTCStatsResponse(const WebKit::WebRTCStatsResponse& impl) 30 : impl_(impl) { 31 } 32 33 virtual WebKit::WebRTCStatsResponse webKitStatsResponse() const; 34 virtual size_t addReport(WebKit::WebString type, WebKit::WebString id, 35 double timestamp); 36 virtual void addStatistic(size_t report, 37 WebKit::WebString name, WebKit::WebString value); 38 39 protected: 40 virtual ~LocalRTCStatsResponse() {} 41 // Constructor for creating mocks. 42 LocalRTCStatsResponse() {} 43 44 private: 45 WebKit::WebRTCStatsResponse impl_; 46}; 47 48// Mockable wrapper for WebKit::WebRTCStatsRequest 49class CONTENT_EXPORT LocalRTCStatsRequest 50 : public NON_EXPORTED_BASE(talk_base::RefCountInterface) { 51 public: 52 explicit LocalRTCStatsRequest(WebKit::WebRTCStatsRequest impl); 53 // Constructor for testing. 54 LocalRTCStatsRequest(); 55 56 virtual bool hasSelector() const; 57 virtual WebKit::WebMediaStream stream() const; 58 virtual WebKit::WebMediaStreamTrack component() const; 59 virtual void requestSucceeded(const LocalRTCStatsResponse* response); 60 virtual scoped_refptr<LocalRTCStatsResponse> createResponse(); 61 62 protected: 63 virtual ~LocalRTCStatsRequest(); 64 65 private: 66 WebKit::WebRTCStatsRequest impl_; 67 talk_base::scoped_refptr<LocalRTCStatsResponse> response_; 68}; 69 70// RTCPeerConnectionHandler is a delegate for the RTC PeerConnection API 71// messages going between WebKit and native PeerConnection in libjingle. It's 72// owned by WebKit. 73// WebKit calls all of these methods on the main render thread. 74// Callbacks to the webrtc::PeerConnectionObserver implementation also occur on 75// the main render thread. 76class CONTENT_EXPORT RTCPeerConnectionHandler 77 : public PeerConnectionHandlerBase, 78 NON_EXPORTED_BASE(public WebKit::WebRTCPeerConnectionHandler) { 79 public: 80 RTCPeerConnectionHandler( 81 WebKit::WebRTCPeerConnectionHandlerClient* client, 82 MediaStreamDependencyFactory* dependency_factory); 83 virtual ~RTCPeerConnectionHandler(); 84 85 void associateWithFrame(WebKit::WebFrame* frame); 86 87 // Initialize method only used for unit test. 88 bool InitializeForTest( 89 const WebKit::WebRTCConfiguration& server_configuration, 90 const WebKit::WebMediaConstraints& options, 91 PeerConnectionTracker* peer_connection_tracker); 92 93 // WebKit::WebRTCPeerConnectionHandler implementation 94 virtual bool initialize( 95 const WebKit::WebRTCConfiguration& server_configuration, 96 const WebKit::WebMediaConstraints& options) OVERRIDE; 97 98 virtual void createOffer( 99 const WebKit::WebRTCSessionDescriptionRequest& request, 100 const WebKit::WebMediaConstraints& options) OVERRIDE; 101 virtual void createAnswer( 102 const WebKit::WebRTCSessionDescriptionRequest& request, 103 const WebKit::WebMediaConstraints& options) OVERRIDE; 104 105 virtual void setLocalDescription( 106 const WebKit::WebRTCVoidRequest& request, 107 const WebKit::WebRTCSessionDescription& description) OVERRIDE; 108 virtual void setRemoteDescription( 109 const WebKit::WebRTCVoidRequest& request, 110 const WebKit::WebRTCSessionDescription& description) OVERRIDE; 111 112 virtual WebKit::WebRTCSessionDescription localDescription() 113 OVERRIDE; 114 virtual WebKit::WebRTCSessionDescription remoteDescription() 115 OVERRIDE; 116 virtual bool updateICE( 117 const WebKit::WebRTCConfiguration& server_configuration, 118 const WebKit::WebMediaConstraints& options) OVERRIDE; 119 virtual bool addICECandidate( 120 const WebKit::WebRTCICECandidate& candidate) OVERRIDE; 121 122 virtual bool addStream( 123 const WebKit::WebMediaStream& stream, 124 const WebKit::WebMediaConstraints& options) OVERRIDE; 125 virtual void removeStream( 126 const WebKit::WebMediaStream& stream) OVERRIDE; 127 virtual void getStats( 128 const WebKit::WebRTCStatsRequest& request) OVERRIDE; 129 virtual WebKit::WebRTCDataChannelHandler* createDataChannel( 130 const WebKit::WebString& label, 131 const WebKit::WebRTCDataChannelInit& init) OVERRIDE; 132 virtual WebKit::WebRTCDTMFSenderHandler* createDTMFSender( 133 const WebKit::WebMediaStreamTrack& track) OVERRIDE; 134 virtual void stop() OVERRIDE; 135 136 // webrtc::PeerConnectionObserver implementation 137 virtual void OnError() OVERRIDE; 138 // Triggered when the SignalingState changed. 139 virtual void OnSignalingChange( 140 webrtc::PeerConnectionInterface::SignalingState new_state) OVERRIDE; 141 virtual void OnAddStream(webrtc::MediaStreamInterface* stream) OVERRIDE; 142 virtual void OnRemoveStream(webrtc::MediaStreamInterface* stream) OVERRIDE; 143 virtual void OnIceCandidate( 144 const webrtc::IceCandidateInterface* candidate) OVERRIDE; 145 virtual void OnIceConnectionChange( 146 webrtc::PeerConnectionInterface::IceConnectionState new_state) OVERRIDE; 147 virtual void OnIceGatheringChange( 148 webrtc::PeerConnectionInterface::IceGatheringState new_state) OVERRIDE; 149 150 virtual void OnDataChannel( 151 webrtc::DataChannelInterface* data_channel) OVERRIDE; 152 virtual void OnRenegotiationNeeded() OVERRIDE; 153 154 // Delegate functions to allow for mocking of WebKit interfaces. 155 // getStats takes ownership of request parameter. 156 virtual void getStats(LocalRTCStatsRequest* request); 157 158 // Calls GetStats on |native_peer_connection_|. 159 void GetStats(webrtc::StatsObserver* observer, 160 webrtc::MediaStreamTrackInterface* track); 161 162 PeerConnectionTracker* peer_connection_tracker(); 163 164 private: 165 webrtc::SessionDescriptionInterface* CreateNativeSessionDescription( 166 const WebKit::WebRTCSessionDescription& description, 167 webrtc::SdpParseError* error); 168 169 // |client_| is a weak pointer, and is valid until stop() has returned. 170 WebKit::WebRTCPeerConnectionHandlerClient* client_; 171 172 WebKit::WebFrame* frame_; 173 174 PeerConnectionTracker* peer_connection_tracker_; 175 176 DISALLOW_COPY_AND_ASSIGN(RTCPeerConnectionHandler); 177}; 178 179} // namespace content 180 181#endif // CONTENT_RENDERER_MEDIA_RTC_PEER_CONNECTION_HANDLER_H_ 182