Stop RTCDataChannel when closing page
[WebKit.git] / Source / WebCore / Modules / mediastream / RTCPeerConnection.h
1 /*
2  * Copyright (C) 2012 Google Inc. All rights reserved.
3  * Copyright (C) 2013 Nokia Corporation and/or its subsidiary(-ies).
4  * Copyright (C) 2015 Ericsson AB. All rights reserved.
5  * Copyright (C) 2017 Apple Inc. All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer
15  *    in the documentation and/or other materials provided with the
16  *    distribution.
17  * 3. Neither the name of Google Inc. nor the names of its contributors
18  *    may be used to endorse or promote products derived from this
19  *    software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33
34 #pragma once
35
36 #if ENABLE(WEB_RTC)
37
38 #include "ActiveDOMObject.h"
39 #include "EventTarget.h"
40 #include "MediaStream.h"
41 #include "RTCConfiguration.h"
42 #include "RTCDataChannel.h"
43 #include "RTCIceConnectionState.h"
44 #include "RTCIceGatheringState.h"
45 #include "RTCPeerConnectionState.h"
46 #include "RTCRtpTransceiver.h"
47 #include "RTCSignalingState.h"
48
49 namespace WebCore {
50
51 class MediaStreamTrack;
52 class PeerConnectionBackend;
53 class RTCController;
54 class RTCIceCandidate;
55 class RTCPeerConnectionErrorCallback;
56 class RTCSessionDescription;
57 class RTCStatsCallback;
58
59 struct RTCAnswerOptions;
60 struct RTCOfferOptions;
61 struct RTCRtpParameters;
62 struct RTCRtpTransceiverInit {
63     RTCRtpTransceiverDirection direction;
64 };
65
66 class RTCPeerConnection final : public RefCounted<RTCPeerConnection>, public RTCRtpSender::Backend, public EventTargetWithInlineData, public ActiveDOMObject {
67 public:
68     static Ref<RTCPeerConnection> create(ScriptExecutionContext&);
69     virtual ~RTCPeerConnection();
70
71     using DataChannelInit = RTCDataChannelInit;
72
73     ExceptionOr<void> initializeWith(Document&, RTCConfiguration&&);
74
75     // 4.3.2 RTCPeerConnection Interface
76     void queuedCreateOffer(RTCOfferOptions&&, PeerConnection::SessionDescriptionPromise&&);
77     void queuedCreateAnswer(RTCAnswerOptions&&, PeerConnection::SessionDescriptionPromise&&);
78
79     void queuedSetLocalDescription(RTCSessionDescription&, DOMPromise<void>&&);
80     RefPtr<RTCSessionDescription> localDescription() const;
81     RefPtr<RTCSessionDescription> currentLocalDescription() const;
82     RefPtr<RTCSessionDescription> pendingLocalDescription() const;
83
84     void queuedSetRemoteDescription(RTCSessionDescription&, DOMPromise<void>&&);
85     RefPtr<RTCSessionDescription> remoteDescription() const;
86     RefPtr<RTCSessionDescription> currentRemoteDescription() const;
87     RefPtr<RTCSessionDescription> pendingRemoteDescription() const;
88
89     void queuedAddIceCandidate(RTCIceCandidate*, DOMPromise<void>&&);
90
91     RTCSignalingState signalingState() const { return m_signalingState; }
92     RTCIceGatheringState iceGatheringState() const { return m_iceGatheringState; }
93     RTCIceConnectionState iceConnectionState() const { return m_iceConnectionState; }
94     RTCPeerConnectionState connectionState() const { return m_connectionState; }
95
96     const RTCConfiguration& getConfiguration() const { return m_configuration; }
97     ExceptionOr<void> setConfiguration(RTCConfiguration&&);
98     void close();
99
100     // 5.1 RTCPeerConnection extensions
101     const Vector<std::reference_wrapper<RTCRtpSender>>& getSenders() const { return m_transceiverSet->senders(); }
102     const Vector<std::reference_wrapper<RTCRtpReceiver>>& getReceivers() const { return m_transceiverSet->receivers(); }
103     const Vector<RefPtr<RTCRtpTransceiver>>& getTransceivers() const { return m_transceiverSet->list(); }
104
105     ExceptionOr<Ref<RTCRtpSender>> addTrack(Ref<MediaStreamTrack>&&, const Vector<std::reference_wrapper<MediaStream>>&);
106     ExceptionOr<void> removeTrack(RTCRtpSender&);
107
108     using AddTransceiverTrackOrKind = Variant<RefPtr<MediaStreamTrack>, String>;
109     ExceptionOr<Ref<RTCRtpTransceiver>> addTransceiver(AddTransceiverTrackOrKind&&, const RTCRtpTransceiverInit&);
110
111     // 6.1 Peer-to-peer data API
112     ExceptionOr<Ref<RTCDataChannel>> createDataChannel(ScriptExecutionContext&, String&&, RTCDataChannelInit&&);
113
114     // 8.2 Statistics API
115     void getStats(MediaStreamTrack*, Ref<DeferredPromise>&&);
116
117     // Legacy MediaStream-based API, mostly implemented as JS built-ins
118     Vector<RefPtr<MediaStream>> getRemoteStreams() const { return m_backend->getRemoteStreams(); }
119
120     // EventTarget
121     EventTargetInterface eventTargetInterface() const final { return RTCPeerConnectionEventTargetInterfaceType; }
122     ScriptExecutionContext* scriptExecutionContext() const final { return ActiveDOMObject::scriptExecutionContext(); }
123
124     using RefCounted::ref;
125     using RefCounted::deref;
126
127     // Used for testing with a mock
128     WEBCORE_EXPORT void emulatePlatformEvent(const String& action);
129
130     // API used by PeerConnectionBackend and relatives
131     void addTransceiver(Ref<RTCRtpTransceiver>&&);
132     void setSignalingState(RTCSignalingState);
133     void updateIceGatheringState(RTCIceGatheringState);
134     void updateIceConnectionState(RTCIceConnectionState);
135
136     void scheduleNegotiationNeededEvent();
137
138     RTCRtpSender::Backend& senderBackend() { return *this; }
139     void fireEvent(Event&);
140
141     void disableICECandidateFiltering() { m_backend->disableICECandidateFiltering(); }
142     void enableICECandidateFiltering() { m_backend->enableICECandidateFiltering(); }
143
144     void enqueueReplaceTrackTask(RTCRtpSender&, Ref<MediaStreamTrack>&&, DOMPromise<void>&&);
145
146 private:
147     RTCPeerConnection(ScriptExecutionContext&);
148
149     Ref<RTCRtpTransceiver> completeAddTransceiver(Ref<RTCRtpSender>&&, const RTCRtpTransceiverInit&, const String& trackId, const String& trackKind);
150
151     RTCController& rtcController();
152     void registerToController();
153     void unregisterFromController();
154
155     // EventTarget implementation.
156     void refEventTarget() final { ref(); }
157     void derefEventTarget() final { deref(); }
158
159     // ActiveDOMObject
160     void stop() final;
161     const char* activeDOMObjectName() const final;
162     bool canSuspendForDocumentSuspension() const final;
163
164     // FIXME: We might want PeerConnectionBackend to be the Backend
165     // RTCRtpSender::Backend
166     void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromise<void>&&) final;
167     RTCRtpParameters getParameters(RTCRtpSender&) const final;
168
169     void updateConnectionState();
170     bool doClose();
171     void doStop();
172
173     bool m_isStopped { false };
174     RTCSignalingState m_signalingState { RTCSignalingState::Stable };
175     RTCIceGatheringState m_iceGatheringState { RTCIceGatheringState::New };
176     RTCIceConnectionState m_iceConnectionState { RTCIceConnectionState::New };
177     RTCPeerConnectionState m_connectionState { RTCPeerConnectionState::New };
178
179     std::unique_ptr<RtpTransceiverSet> m_transceiverSet { std::unique_ptr<RtpTransceiverSet>(new RtpTransceiverSet()) };
180
181     std::unique_ptr<PeerConnectionBackend> m_backend;
182
183     RTCConfiguration m_configuration;
184 };
185
186 } // namespace WebCore
187
188 #endif // ENABLE(WEB_RTC)