blob: 241dc8e4c622137d8dacbb487ed629f154708038 [file] [log] [blame]
/*
* Copyright (C) 2012 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name of Google Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_PEER_CONNECTION_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_PEER_CONNECTION_H_
#include <memory>
#include <utility>
#include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
#include "third_party/blink/renderer/modules/crypto/normalize_algorithm.h"
#include "third_party/blink/renderer/modules/event_target_modules.h"
#include "third_party/blink/renderer/modules/mediastream/media_stream.h"
#include "third_party/blink/renderer/modules/peerconnection/call_setup_state_tracker.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_ice_candidate.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_controller.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_session_description_enums.h"
#include "third_party/blink/renderer/platform/heap/heap_allocator.h"
#include "third_party/blink/renderer/platform/mediastream/media_constraints.h"
#include "third_party/blink/renderer/platform/peerconnection/rtc_peer_connection_handler_client.h"
#include "third_party/blink/renderer/platform/peerconnection/rtc_session_description_request.h"
#include "third_party/blink/renderer/platform/peerconnection/rtc_void_request.h"
#include "third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h"
#include "third_party/blink/renderer/platform/scheduler/public/post_cancellable_task.h"
#include "third_party/blink/renderer/platform/wtf/hash_set.h"
#include "third_party/blink/renderer/platform/wtf/vector.h"
namespace blink {
class ExceptionState;
class MediaStreamTrack;
class MediaStreamTrackOrString;
class RTCAnswerOptions;
class RTCConfiguration;
class RTCDtlsTransport;
class RTCDTMFSender;
class RTCDataChannel;
class RTCDataChannelInit;
class RTCIceCandidateInit;
class RTCIceTransport;
class RTCOfferOptions;
class RTCPeerConnectionTest;
class RTCRtpReceiver;
class RTCRtpSender;
class RTCRtpTransceiverInit;
class RTCSctpTransport;
class RTCSessionDescription;
class RTCSessionDescriptionInit;
class ScriptState;
class V8RTCPeerConnectionErrorCallback;
class V8RTCSessionDescriptionCallback;
class V8RTCStatsCallback;
class V8VoidFunction;
extern const char kOnlySupportedInUnifiedPlanMessage[];
// This enum is used to track usage of SDP during the transition of the default
// "sdpSemantics" value from "Plan B" to "Unified Plan". Usage refers to
// operations such as createOffer(), createAnswer(), setLocalDescription() and
// setRemoteDescription(). "Complex" SDP refers to SDP that is not compatible
// between SDP formats. Usage of SDP falls into two categories: "safe" and
// "unsafe". Applications with unsafe usage are predicted to break when the
// default changes. This includes complex SDP usage and relying on the default
// sdpSemantics. kUnknown is used if the SDP format could not be deduced, such
// as if SDP could not be parsed.
enum class SdpUsageCategory {
kSafe = 0,
kUnsafe = 1,
kUnknown = 2,
kMaxValue = kUnknown,
};
MODULES_EXPORT SdpUsageCategory
DeduceSdpUsageCategory(const ParsedSessionDescription& parsed_sdp,
bool sdp_semantics_specified,
webrtc::SdpSemantics sdp_semantics);
class MODULES_EXPORT RTCPeerConnection final
: public EventTargetWithInlineData,
public RTCPeerConnectionHandlerClient,
public ActiveScriptWrappable<RTCPeerConnection>,
public ExecutionContextLifecycleObserver,
public MediaStreamObserver {
DEFINE_WRAPPERTYPEINFO();
USING_PRE_FINALIZER(RTCPeerConnection, Dispose);
public:
static RTCPeerConnection* Create(ExecutionContext*,
const RTCConfiguration*,
const Dictionary&,
ExceptionState&);
static RTCPeerConnection* Create(ExecutionContext*,
const RTCConfiguration*,
const ScriptValue&,
ExceptionState&);
static RTCPeerConnection* Create(ExecutionContext*,
const RTCConfiguration*,
ExceptionState&);
RTCPeerConnection(ExecutionContext*,
webrtc::PeerConnectionInterface::RTCConfiguration,
bool sdp_semantics_specified,
bool force_encoded_audio_insertable_streams,
bool force_encoded_video_insertable_streams,
MediaConstraints,
ExceptionState&);
~RTCPeerConnection() override;
ScriptPromise createOffer(ScriptState*,
const RTCOfferOptions*,
ExceptionState&);
ScriptPromise createOffer(ScriptState*,
V8RTCSessionDescriptionCallback*,
V8RTCPeerConnectionErrorCallback*,
const ScriptValue&,
ExceptionState&);
ScriptPromise createOffer(ScriptState*,
V8RTCSessionDescriptionCallback*,
V8RTCPeerConnectionErrorCallback*,
ExceptionState&);
ScriptPromise CreateOffer(ScriptState*,
V8RTCSessionDescriptionCallback*,
V8RTCPeerConnectionErrorCallback*,
const Dictionary&,
ExceptionState&);
ScriptPromise createAnswer(ScriptState*,
const RTCAnswerOptions*,
ExceptionState&);
ScriptPromise createAnswer(ScriptState*,
V8RTCSessionDescriptionCallback*,
V8RTCPeerConnectionErrorCallback*,
const ScriptValue&,
ExceptionState&);
ScriptPromise createAnswer(ScriptState*,
V8RTCSessionDescriptionCallback*,
V8RTCPeerConnectionErrorCallback*,
ExceptionState&);
ScriptPromise CreateAnswer(ScriptState*,
V8RTCSessionDescriptionCallback*,
V8RTCPeerConnectionErrorCallback*,
const Dictionary&);
ScriptPromise setLocalDescription(ScriptState*);
ScriptPromise setLocalDescription(ScriptState*,
const RTCSessionDescriptionInit*,
ExceptionState&);
ScriptPromise setLocalDescription(
ScriptState*,
const RTCSessionDescriptionInit*,
V8VoidFunction*,
V8RTCPeerConnectionErrorCallback* = nullptr);
RTCSessionDescription* localDescription() const;
RTCSessionDescription* currentLocalDescription() const;
RTCSessionDescription* pendingLocalDescription() const;
ScriptPromise setRemoteDescription(ScriptState*,
const RTCSessionDescriptionInit*,
ExceptionState&);
ScriptPromise setRemoteDescription(
ScriptState*,
const RTCSessionDescriptionInit*,
V8VoidFunction*,
V8RTCPeerConnectionErrorCallback* = nullptr);
RTCSessionDescription* remoteDescription() const;
RTCSessionDescription* currentRemoteDescription() const;
RTCSessionDescription* pendingRemoteDescription() const;
String signalingState() const;
RTCConfiguration* getConfiguration(ScriptState*) const;
void setConfiguration(ScriptState*, const RTCConfiguration*, ExceptionState&);
// Certificate management
// http://w3c.github.io/webrtc-pc/#sec.cert-mgmt
static ScriptPromise generateCertificate(
ScriptState*,
const AlgorithmIdentifier& keygen_algorithm,
ExceptionState&);
ScriptPromise addIceCandidate(ScriptState*,
const RTCIceCandidateInit*,
ExceptionState&);
ScriptPromise addIceCandidate(ScriptState*,
const RTCIceCandidateInit*,
V8VoidFunction*,
V8RTCPeerConnectionErrorCallback*,
ExceptionState&);
String iceGatheringState() const;
String iceConnectionState() const;
String connectionState() const;
base::Optional<bool> canTrickleIceCandidates() const;
void restartIce();
// A local stream is any stream associated with a sender.
MediaStreamVector getLocalStreams() const;
// A remote stream is any stream associated with a receiver.
MediaStreamVector getRemoteStreams() const;
MediaStream* getRemoteStreamById(const String&) const;
bool IsRemoteStream(MediaStream* stream) const;
void addStream(ScriptState*,
MediaStream*,
const ScriptValue& media_constraints,
ExceptionState&);
void addStream(ScriptState*, MediaStream*, ExceptionState&);
void AddStream(ScriptState*,
MediaStream*,
const Dictionary& media_constraints,
ExceptionState&);
void removeStream(MediaStream*, ExceptionState&);
// Calls LegacyCallbackBasedGetStats() or PromiseBasedGetStats() (or rejects
// with an exception) depending on type, see rtc_peer_connection.idl.
ScriptPromise getStats(ScriptState* script_state, ExceptionState&);
ScriptPromise getStats(ScriptState* script_state,
ScriptValue callback_or_selector,
ExceptionState&);
ScriptPromise getStats(ScriptState* script_state,
ScriptValue callback_or_selector,
ScriptValue legacy_selector,
ExceptionState&);
ScriptPromise LegacyCallbackBasedGetStats(
ScriptState*,
V8RTCStatsCallback* success_callback,
MediaStreamTrack* selector);
ScriptPromise PromiseBasedGetStats(ScriptState*,
MediaStreamTrack* selector,
ExceptionState&);
const HeapVector<Member<RTCRtpTransceiver>>& getTransceivers() const;
const HeapVector<Member<RTCRtpSender>>& getSenders() const;
const HeapVector<Member<RTCRtpReceiver>>& getReceivers() const;
RTCRtpTransceiver* addTransceiver(const MediaStreamTrackOrString&,
const RTCRtpTransceiverInit*,
ExceptionState&);
RTCRtpSender* addTrack(MediaStreamTrack*, MediaStreamVector, ExceptionState&);
void removeTrack(RTCRtpSender*, ExceptionState&);
DEFINE_ATTRIBUTE_EVENT_LISTENER(track, kTrack)
RTCSctpTransport* sctp() const;
RTCDataChannel* createDataChannel(ScriptState*,
String label,
const RTCDataChannelInit*,
ExceptionState&);
RTCDTMFSender* createDTMFSender(MediaStreamTrack*, ExceptionState&);
bool IsClosed() { return closed_; }
void close();
// Makes the peer connection aware of the track. This is used to map web
// tracks to blink tracks, as is necessary for plumbing. There is no need to
// unregister the track because Weak references are used.
void RegisterTrack(MediaStreamTrack*);
// We allow getStats after close, but not other calls or callbacks.
bool ShouldFireDefaultCallbacks() {
return !closed_ && !peer_handler_unregistered_;
}
bool ShouldFireGetStatsCallback() { return !peer_handler_unregistered_; }
DEFINE_ATTRIBUTE_EVENT_LISTENER(negotiationneeded, kNegotiationneeded)
DEFINE_ATTRIBUTE_EVENT_LISTENER(icecandidate, kIcecandidate)
DEFINE_ATTRIBUTE_EVENT_LISTENER(signalingstatechange, kSignalingstatechange)
DEFINE_ATTRIBUTE_EVENT_LISTENER(addstream, kAddstream)
DEFINE_ATTRIBUTE_EVENT_LISTENER(removestream, kRemovestream)
DEFINE_ATTRIBUTE_EVENT_LISTENER(iceconnectionstatechange,
kIceconnectionstatechange)
DEFINE_ATTRIBUTE_EVENT_LISTENER(connectionstatechange, kConnectionstatechange)
DEFINE_ATTRIBUTE_EVENT_LISTENER(icegatheringstatechange,
kIcegatheringstatechange)
DEFINE_ATTRIBUTE_EVENT_LISTENER(datachannel, kDatachannel)
DEFINE_ATTRIBUTE_EVENT_LISTENER(icecandidateerror, kIcecandidateerror)
// Utility to note result of CreateOffer / CreateAnswer
void NoteSdpCreated(const RTCSessionDescription&);
// Utility to report SDP usage of setLocalDescription / setRemoteDescription.
enum class SetSdpOperationType {
kSetLocalDescription,
kSetRemoteDescription,
};
void ReportSetSdpUsage(SetSdpOperationType operation_type,
const ParsedSessionDescription& parsed_sdp) const;
// MediaStreamObserver
void OnStreamAddTrack(MediaStream*, MediaStreamTrack*) override;
void OnStreamRemoveTrack(MediaStream*, MediaStreamTrack*) override;
// RTCPeerConnectionHandlerClient
void NegotiationNeeded() override;
void DidGenerateICECandidate(RTCIceCandidatePlatform*) override;
void DidFailICECandidate(const String& address,
base::Optional<uint16_t> port,
const String& host_candidate,
const String& url,
int error_code,
const String& error_text) override;
void DidChangeSessionDescriptions(
RTCSessionDescriptionPlatform* pending_local_description,
RTCSessionDescriptionPlatform* current_local_description,
RTCSessionDescriptionPlatform* pending_remote_description,
RTCSessionDescriptionPlatform* current_remote_description) override;
void DidChangeIceGatheringState(
webrtc::PeerConnectionInterface::IceGatheringState) override;
void DidChangeIceConnectionState(
webrtc::PeerConnectionInterface::IceConnectionState) override;
void DidChangePeerConnectionState(
webrtc::PeerConnectionInterface::PeerConnectionState) override;
void DidModifyReceiversPlanB(
webrtc::PeerConnectionInterface::SignalingState,
Vector<std::unique_ptr<RTCRtpReceiverPlatform>> platform_receivers_added,
Vector<std::unique_ptr<RTCRtpReceiverPlatform>>
platform_receivers_removed) override;
void DidModifySctpTransport(WebRTCSctpTransportSnapshot) override;
void DidModifyTransceivers(webrtc::PeerConnectionInterface::SignalingState,
Vector<std::unique_ptr<RTCRtpTransceiverPlatform>>,
Vector<uintptr_t>,
bool is_remote_description) override;
void DidAddRemoteDataChannel(
scoped_refptr<webrtc::DataChannelInterface> channel) override;
void DidNoteInterestingUsage(int usage_pattern) override;
void UnregisterPeerConnectionHandler() override;
void ClosePeerConnection() override;
// EventTarget
const AtomicString& InterfaceName() const override;
ExecutionContext* GetExecutionContext() const override;
// ExecutionContextLifecycleObserver
void ContextDestroyed() override;
// ScriptWrappable
// We keep the this object alive until either stopped or closed.
bool HasPendingActivity() const final {
return !closed_ && !peer_handler_unregistered_;
}
// For testing; exported to testing/InternalWebRTCPeerConnection
static int PeerConnectionCount();
static int PeerConnectionCountLimit();
// SLD/SRD Helper method, public for testing.
// This function returns a value that indicates if complex SDP is being used
// and whether a format is explicitly specified. If the SDP is not complex or
// it could not be parsed, base::nullopt is returned.
// When "Complex" SDP (i.e., SDP that has multiple tracks) is used without
// explicitly specifying the SDP format, there may be errors if the
// application assumes a format that differs from the actual default format.
base::Optional<ComplexSdpCategory> CheckForComplexSdp(
const ParsedSessionDescription&) const;
const CallSetupStateTracker& call_setup_state_tracker() const;
void NoteCallSetupStateEventPending(
RTCPeerConnection::SetSdpOperationType operation,
const RTCSessionDescriptionInit& description);
void NoteSessionDescriptionRequestCompleted(
RTCCreateSessionDescriptionOperation operation,
bool success);
void NoteVoidRequestCompleted(RTCSetSessionDescriptionOperation operation,
bool success);
static void GenerateCertificateCompleted(
ScriptPromiseResolver* resolver,
rtc::scoped_refptr<rtc::RTCCertificate> certificate);
// Checks if the document that the peer connection lives in has ever executed
// getUserMedia().
bool HasDocumentMedia() const;
// Called by RTCIceTransport::OnStateChange to update the ice connection
// state.
void UpdateIceConnectionState();
webrtc::SdpSemantics sdp_semantics() { return sdp_semantics_; }
bool force_encoded_audio_insertable_streams() {
return force_encoded_audio_insertable_streams_;
}
bool force_encoded_video_insertable_streams() {
return force_encoded_video_insertable_streams_;
}
void Trace(Visitor*) const override;
base::TimeTicks WebRtcTimestampToBlinkTimestamp(
base::TimeTicks webrtc_monotonic_time) const;
using RtcPeerConnectionHandlerFactoryCallback =
base::RepeatingCallback<std::unique_ptr<RTCPeerConnectionHandler>()>;
static void SetRtcPeerConnectionHandlerFactoryForTesting(
RtcPeerConnectionHandlerFactoryCallback);
private:
friend class InternalsRTCPeerConnection;
FRIEND_TEST_ALL_PREFIXES(RTCPeerConnectionTest, GetAudioTrack);
FRIEND_TEST_ALL_PREFIXES(RTCPeerConnectionTest, GetVideoTrack);
FRIEND_TEST_ALL_PREFIXES(RTCPeerConnectionTest, GetAudioAndVideoTrack);
FRIEND_TEST_ALL_PREFIXES(RTCPeerConnectionTest, GetTrackRemoveStreamAndGCAll);
FRIEND_TEST_ALL_PREFIXES(RTCPeerConnectionTest,
GetTrackRemoveStreamAndGCWithPersistentComponent);
FRIEND_TEST_ALL_PREFIXES(RTCPeerConnectionTest,
GetTrackRemoveStreamAndGCWithPersistentStream);
typedef base::OnceCallback<bool()> BoolFunction;
class EventWrapper final : public GarbageCollected<EventWrapper> {
public:
EventWrapper(Event*, BoolFunction);
// Returns true if |m_setupFunction| returns true or it is null.
// |m_event| will only be fired if setup() returns true;
bool Setup();
void Trace(Visitor*) const;
Member<Event> event_;
private:
BoolFunction setup_function_;
};
void Dispose();
void MaybeDispatchEvent(Event*);
// TODO(hbos): Remove any remaining uses of ScheduleDispatchEvent.
void ScheduleDispatchEvent(Event*);
void ScheduleDispatchEvent(Event*, BoolFunction);
void DispatchScheduledEvents();
MediaStreamTrack* GetTrack(MediaStreamComponent*) const;
RTCRtpSender* FindSenderForTrackAndStream(MediaStreamTrack*, MediaStream*);
HeapVector<Member<RTCRtpSender>>::iterator FindSender(
const RTCRtpSenderPlatform& web_sender);
HeapVector<Member<RTCRtpReceiver>>::iterator FindReceiver(
const RTCRtpReceiverPlatform& platform_receiver);
HeapVector<Member<RTCRtpTransceiver>>::iterator FindTransceiver(
const RTCRtpTransceiverPlatform& platform_transceiver);
// Creates or updates the sender such that it is up-to-date with the
// RTCRtpSenderPlatform in all regards *except for streams*. The web sender
// only knows of stream IDs; updating the stream objects requires additional
// logic which is different depending on context, e.g:
// - If created/updated with addTrack(), the streams were supplied as
// arguments.
// The web sender's web track must already have a correspondent blink track in
// |tracks_|. The caller is responsible for ensuring this with
// RegisterTrack(), e.g:
// - On addTrack(), the track is supplied as an argument.
RTCRtpSender* CreateOrUpdateSender(std::unique_ptr<RTCRtpSenderPlatform>,
String kind);
// Creates or updates the receiver such that it is up-to-date with the
// RTCRtpReceiverPlatform in all regards *except for streams*. The web
// receiver only knows of stream IDs; updating the stream objects requires
// additional logic which is different depending on context, e.g:
// - If created/updated with setRemoteDescription(), there is an algorithm for
// processing the addition/removal of remote tracks which includes how to
// create and update the associated streams set.
RTCRtpReceiver* CreateOrUpdateReceiver(
std::unique_ptr<RTCRtpReceiverPlatform>);
// Creates or updates the transceiver such that it, including its sender and
// receiver, are up-to-date with the RTCRtpTransceiverPlatform in all regerds
// *except for sender and receiver streams*. The web sender and web receiver
// only knows of stream IDs; updating the stream objects require additional
// logic which is different depending on context. See above.
RTCRtpTransceiver* CreateOrUpdateTransceiver(
std::unique_ptr<RTCRtpTransceiverPlatform>);
// Creates or updates the RTCDtlsTransport object corresponding to the
// given webrtc::DtlsTransportInterface object.
RTCDtlsTransport* CreateOrUpdateDtlsTransport(
rtc::scoped_refptr<webrtc::DtlsTransportInterface>,
const webrtc::DtlsTransportInformation& info);
// Creates or updates the RTCIceTransport object corresponding to the given
// webrtc::IceTransportInterface object.
RTCIceTransport* CreateOrUpdateIceTransport(
rtc::scoped_refptr<webrtc::IceTransportInterface>);
// Update the |receiver->streams()| to the streams indicated by |stream_ids|,
// adding to |remove_list| and |add_list| accordingly.
// https://w3c.github.io/webrtc-pc/#set-associated-remote-streams
void SetAssociatedMediaStreams(
RTCRtpReceiver* receiver,
const Vector<String>& stream_ids,
HeapVector<std::pair<Member<MediaStream>, Member<MediaStreamTrack>>>*
remove_list,
HeapVector<std::pair<Member<MediaStream>, Member<MediaStreamTrack>>>*
add_list);
// Sets the signaling state synchronously, and dispatches a
// signalingstatechange event synchronously or asynchronously depending on
// |dispatch_event_immediately|.
// TODO(hbos): The ability to not fire the event asynchronously is there
// because CloseInternal() has historically fired asynchronously along with
// other asynchronously fired events. If close() does not fire any events,
// |dispatch_event_immediately| can be removed. https://crbug.com/849247
void ChangeSignalingState(webrtc::PeerConnectionInterface::SignalingState,
bool dispatch_event_immediately);
// The remaining "Change" methods set the state asynchronously and fire the
// corresponding event immediately after changing the state (if it was really
// changed).
//
// The "Set" methods are called asynchronously by the "Change" methods, and
// set the corresponding state without firing an event, returning true if the
// state was really changed.
//
// This is done because the standard guarantees that state changes and the
// corresponding events will happen in the same task; it shouldn't be
// possible to, for example, end up with two "icegatheringstatechange" events
// that are delayed somehow and cause the application to read a "complete"
// gathering state twice, missing the "gathering" state in the middle.
void ChangeIceGatheringState(
webrtc::PeerConnectionInterface::IceGatheringState);
bool SetIceGatheringState(webrtc::PeerConnectionInterface::IceGatheringState);
void ChangeIceConnectionState(
webrtc::PeerConnectionInterface::IceConnectionState);
webrtc::PeerConnectionInterface::IceConnectionState
ComputeIceConnectionState();
bool HasAnyFailedIceTransport() const;
bool HasAnyDisconnectedIceTransport() const;
bool HasAllNewOrClosedIceTransports() const;
bool HasAnyNewOrCheckingIceTransport() const;
bool HasAllCompletedOrClosedIceTransports() const;
bool HasAllConnectedCompletedOrClosedIceTransports() const;
void ChangePeerConnectionState(
webrtc::PeerConnectionInterface::PeerConnectionState);
bool SetPeerConnectionState(
webrtc::PeerConnectionInterface::PeerConnectionState);
void CloseInternal();
DOMException* checkSdpForStateErrors(ExecutionContext*,
const ParsedSessionDescription&);
void RecordSdpCategoryAndMaybeEmitWarnings(
const ParsedSessionDescription&) const;
HeapHashSet<Member<RTCIceTransport>> ActiveIceTransports() const;
// Disables the back-forward cache usage. This is called when it becomes
// possible for a connection to happen, as a page with connections cannot be
// put into the cache so far.
void DisableBackForwardCache(ExecutionContext* context);
Member<RTCSessionDescription> pending_local_description_;
Member<RTCSessionDescription> current_local_description_;
Member<RTCSessionDescription> pending_remote_description_;
Member<RTCSessionDescription> current_remote_description_;
webrtc::PeerConnectionInterface::SignalingState signaling_state_;
webrtc::PeerConnectionInterface::IceGatheringState ice_gathering_state_;
webrtc::PeerConnectionInterface::IceConnectionState ice_connection_state_;
webrtc::PeerConnectionInterface::PeerConnectionState peer_connection_state_;
// TODO(https://crbug.com/857004): The trackers' metrics are currently not
// uploaded; either use the metrics it produces (i.e. revert
// https://chromium-review.googlesource.com/c/chromium/src/+/1991421) or
// delete all CallSetupStateTracker code for good.
CallSetupStateTracker call_setup_state_tracker_;
// A map containing any track that is in use by the peer connection. This
// includes tracks of |rtp_senders_| and |rtp_receivers_|.
HeapHashMap<WeakMember<MediaStreamComponent>, WeakMember<MediaStreamTrack>>
tracks_;
// In Plan B, senders and receivers exist independently of one another.
// In Unified Plan, all senders and receivers are the sender-receiver pairs of
// transceivers.
// TODO(hbos): When Plan B is removed, remove |rtp_senders_| and
// |rtp_receivers_| since these are part of |transceivers_|.
// https://crbug.com/857004
HeapVector<Member<RTCRtpSender>> rtp_senders_;
HeapVector<Member<RTCRtpReceiver>> rtp_receivers_;
HeapVector<Member<RTCRtpTransceiver>> transceivers_;
// A map of all webrtc::DtlsTransports that have a corresponding
// RTCDtlsTransport object. Garbage collection will remove map entries
// when they are no longer in use.
// Note: Transports may exist in the map even if they are not currently
// in use, since garbage collection only happens when needed.
HeapHashMap<webrtc::DtlsTransportInterface*, WeakMember<RTCDtlsTransport>>
dtls_transports_by_native_transport_;
// The same kind of map for webrtc::IceTransports.
HeapHashMap<webrtc::IceTransportInterface*, WeakMember<RTCIceTransport>>
ice_transports_by_native_transport_;
// TODO(crbug.com/787254): Use RTCPeerConnectionHandler.
std::unique_ptr<RTCPeerConnectionHandler> peer_handler_;
base::OnceClosure dispatch_events_task_created_callback_for_testing_;
TaskHandle dispatch_scheduled_events_task_handle_;
HeapVector<Member<EventWrapper>> scheduled_events_;
// This handle notifies scheduler about an active connection associated
// with a frame. Handle should be destroyed when connection is closed.
FrameScheduler::SchedulingAffectingFeatureHandle
feature_handle_for_scheduler_;
// When the |peer_handler_| is unregistered, the native peer connection is
// closed and disappears from the chrome://webrtc-internals page. This happens
// when page context is destroyed.
//
// Note that the peer connection can be |closed_| without being unregistered
// (in which case it is still visible in chrome://webrtc-internals). If
// context is destroyed before the peer connection is closed, the native peer
// connection will be closed and stop surfacing states to blink but the blink
// peer connection will be unaware of the native layer being closed.
bool peer_handler_unregistered_;
// Reflects the RTCPeerConnection's [[IsClosed]] internal slot.
// https://w3c.github.io/webrtc-pc/#dfn-isclosed
// TODO(https://crbug.com/1083204): According to spec, the peer connection can
// only be closed through the close() API. However, our implementation can
// also be closed asynchronously by the |peer_handler_|, such as in response
// to laptop lid close on some system (depending on OS and settings).
bool closed_;
// When true, events on the RTCPeerConnection will not be dispatched to
// JavaScript. This happens when close() is called but not if the peer
// connection was closed asynchronously. This also happens if the context is
// destroyed.
// TODO(https://crbug.com/1083204): When we are spec compliant and don't close
// the peer connection asynchronously, this can be removed in favor of
// |closed_|.
bool suppress_events_;
// Internal state [[LastOffer]] and [[LastAnswer]]
String last_offer_;
String last_answer_;
Member<RTCSctpTransport> sctp_transport_;
// In Plan B, senders and receivers are added or removed independently of one
// another. In Unified Plan, senders and receivers are created in pairs as
// transceivers. Transceivers may become inactive, but are never removed.
// The value of this member affects the behavior of some methods and what
// information is surfaced from webrtc. This has the value "kPlanB" or
// "kUnifiedPlan", if constructed with "kDefault" it is translated to one or
// the other.
webrtc::SdpSemantics sdp_semantics_;
// Whether sdpSemantics was specified at construction.
bool sdp_semantics_specified_;
// Blink and WebRTC timestamp diff.
const base::TimeDelta blink_webrtc_time_diff_;
// Insertable streams.
bool force_encoded_audio_insertable_streams_;
bool force_encoded_video_insertable_streams_;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_PEER_CONNECTION_H_