#include "third_party/blink/renderer/modules/peerconnection/peer_connection_tracker.h"
#include <stddef.h>
#include <stdint.h>
#include <memory>
#include <optional>
#include <string>
#include <utility>
#include <vector>
#include "base/containers/contains.h"
#include "base/task/single_thread_task_runner.h"
#include "base/types/pass_key.h"
#include "base/values.h"
#include "build/build_config.h"
#include "build/buildflag.h"
#include "build/chromecast_buildflags.h"
#include "third_party/blink/public/mojom/peerconnection/peer_connection_tracker.mojom-blink.h"
#include "third_party/blink/public/platform/browser_interface_broker_proxy.h"
#include "third_party/blink/public/platform/interface_registry.h"
#include "third_party/blink/public/platform/modules/mediastream/web_media_stream.h"
#include "third_party/blink/public/platform/platform.h"
#include "third_party/blink/public/web/web_document.h"
#include "third_party/blink/public/web/web_local_frame.h"
#include "third_party/blink/renderer/core/execution_context/execution_context.h"
#include "third_party/blink/renderer/core/frame/local_dom_window.h"
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/core/frame/web_local_frame_impl.h"
#include "third_party/blink/renderer/modules/mediastream/media_constraints.h"
#include "third_party/blink/renderer/modules/mediastream/user_media_request.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.h"
#include "third_party/blink/renderer/platform/mediastream/media_stream_component.h"
#include "third_party/blink/renderer/platform/mojo/mojo_binding_context.h"
#include "third_party/blink/renderer/platform/peerconnection/rtc_answer_options_platform.h"
#include "third_party/blink/renderer/platform/peerconnection/rtc_ice_candidate_platform.h"
#include "third_party/blink/renderer/platform/peerconnection/rtc_offer_options_platform.h"
#include "third_party/blink/renderer/platform/peerconnection/rtc_peer_connection_handler_client.h"
#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
#include "third_party/blink/renderer/platform/scheduler/public/thread.h"
#include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
#include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
#include "third_party/webrtc/api/stats/rtcstats_objects.h"
StatsReport;
StatsReports;
namespace blink {
class InternalStandardStatsObserver;
}
namespace WTF {
template <>
struct CrossThreadCopier<scoped_refptr<blink::InternalStandardStatsObserver>>
: public CrossThreadCopierPassThrough<
scoped_refptr<blink::InternalStandardStatsObserver>> { … };
CrossThreadCopier<rtc::scoped_refptr<T>>;
template <>
struct CrossThreadCopier<base::Value::List>
: public CrossThreadCopierByValuePassThrough<base::Value::List> { … };
}
namespace blink {
namespace {
String SerializeBoolean(bool value) { … }
String SerializeServers(
const std::vector<webrtc::PeerConnectionInterface::IceServer>& servers) { … }
String SerializeGetUserMediaMediaConstraints(
const MediaConstraints& constraints) { … }
String SerializeOfferOptions(blink::RTCOfferOptionsPlatform* options) { … }
String SerializeAnswerOptions(blink::RTCAnswerOptionsPlatform* options) { … }
String SerializeMediaStreamIds(const Vector<String>& stream_ids) { … }
String SerializeDirection(webrtc::RtpTransceiverDirection direction) { … }
String SerializeOptionalDirection(
const std::optional<webrtc::RtpTransceiverDirection>& direction) { … }
String SerializeTransceiverKind(const String& indent,
const RTCRtpTransceiverPlatform& transceiver) { … }
String SerializeEncodingParameters(
const String& indent,
const std::vector<webrtc::RtpEncodingParameters>& encodings) { … }
String SerializeSender(const String& indent,
const blink::RTCRtpSenderPlatform& sender) { … }
String SerializeReceiver(const String& indent,
const RTCRtpReceiverPlatform& receiver) { … }
String SerializeTransceiver(const RTCRtpTransceiverPlatform& transceiver) { … }
String SerializeIceTransportType(
webrtc::PeerConnectionInterface::IceTransportsType type) { … }
String SerializeBundlePolicy(
webrtc::PeerConnectionInterface::BundlePolicy policy) { … }
String SerializeRtcpMuxPolicy(
webrtc::PeerConnectionInterface::RtcpMuxPolicy policy) { … }
String SerializeConfiguration(
const webrtc::PeerConnectionInterface::RTCConfiguration& config,
bool usesInsertableStreams) { … }
const char* GetTransceiverUpdatedReasonString(
PeerConnectionTracker::TransceiverUpdatedReason reason) { … }
int GetNextProcessLocalID() { … }
}
class InternalStandardStatsObserver : public webrtc::RTCStatsCollectorCallback { … };
const char PeerConnectionTracker::kSupplementName[] = …;
PeerConnectionTracker& PeerConnectionTracker::From(LocalDOMWindow& window) { … }
PeerConnectionTracker* PeerConnectionTracker::From(LocalFrame& frame) { … }
PeerConnectionTracker* PeerConnectionTracker::From(WebLocalFrame& frame) { … }
void PeerConnectionTracker::BindToFrame(
LocalFrame* frame,
mojo::PendingReceiver<blink::mojom::blink::PeerConnectionManager>
receiver) { … }
PeerConnectionTracker::PeerConnectionTracker(
LocalDOMWindow& window,
scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner,
base::PassKey<PeerConnectionTracker>)
: … { … }
PeerConnectionTracker::PeerConnectionTracker(
mojo::PendingRemote<blink::mojom::blink::PeerConnectionTrackerHost> host,
scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner)
: … { … }
PeerConnectionTracker::~PeerConnectionTracker() { … }
void PeerConnectionTracker::Bind(
mojo::PendingReceiver<blink::mojom::blink::PeerConnectionManager>
receiver) { … }
void PeerConnectionTracker::OnSuspend() { … }
void PeerConnectionTracker::OnThermalStateChange(
mojom::blink::DeviceThermalState thermal_state) { … }
void PeerConnectionTracker::OnSpeedLimitChange(int32_t speed_limit) { … }
void PeerConnectionTracker::StartEventLog(int peer_connection_local_id,
int output_period_ms) { … }
void PeerConnectionTracker::StopEventLog(int peer_connection_local_id) { … }
void PeerConnectionTracker::GetStandardStats() { … }
void PeerConnectionTracker::GetCurrentState() { … }
void PeerConnectionTracker::RegisterPeerConnection(
RTCPeerConnectionHandler* pc_handler,
const webrtc::PeerConnectionInterface::RTCConfiguration& config,
const blink::WebLocalFrame* frame) { … }
void PeerConnectionTracker::UnregisterPeerConnection(
RTCPeerConnectionHandler* pc_handler) { … }
void PeerConnectionTracker::TrackCreateOffer(
RTCPeerConnectionHandler* pc_handler,
RTCOfferOptionsPlatform* options) { … }
void PeerConnectionTracker::TrackCreateAnswer(
RTCPeerConnectionHandler* pc_handler,
RTCAnswerOptionsPlatform* options) { … }
void PeerConnectionTracker::TrackSetSessionDescription(
RTCPeerConnectionHandler* pc_handler,
const String& sdp,
const String& type,
Source source) { … }
void PeerConnectionTracker::TrackSetSessionDescriptionImplicit(
RTCPeerConnectionHandler* pc_handler) { … }
void PeerConnectionTracker::TrackSetConfiguration(
RTCPeerConnectionHandler* pc_handler,
const webrtc::PeerConnectionInterface::RTCConfiguration& config) { … }
void PeerConnectionTracker::TrackAddIceCandidate(
RTCPeerConnectionHandler* pc_handler,
RTCIceCandidatePlatform* candidate,
Source source,
bool succeeded) { … }
void PeerConnectionTracker::TrackIceCandidateError(
RTCPeerConnectionHandler* pc_handler,
const String& address,
std::optional<uint16_t> port,
const String& host_candidate,
const String& url,
int error_code,
const String& error_text) { … }
void PeerConnectionTracker::TrackAddTransceiver(
RTCPeerConnectionHandler* pc_handler,
PeerConnectionTracker::TransceiverUpdatedReason reason,
const RTCRtpTransceiverPlatform& transceiver,
size_t transceiver_index) { … }
void PeerConnectionTracker::TrackModifyTransceiver(
RTCPeerConnectionHandler* pc_handler,
PeerConnectionTracker::TransceiverUpdatedReason reason,
const RTCRtpTransceiverPlatform& transceiver,
size_t transceiver_index) { … }
void PeerConnectionTracker::TrackTransceiver(
const char* callback_type_ending,
RTCPeerConnectionHandler* pc_handler,
PeerConnectionTracker::TransceiverUpdatedReason reason,
const RTCRtpTransceiverPlatform& transceiver,
size_t transceiver_index) { … }
void PeerConnectionTracker::TrackCreateDataChannel(
RTCPeerConnectionHandler* pc_handler,
const webrtc::DataChannelInterface* data_channel,
Source source) { … }
void PeerConnectionTracker::TrackClose(RTCPeerConnectionHandler* pc_handler) { … }
void PeerConnectionTracker::TrackSignalingStateChange(
RTCPeerConnectionHandler* pc_handler,
webrtc::PeerConnectionInterface::SignalingState state) { … }
void PeerConnectionTracker::TrackIceConnectionStateChange(
RTCPeerConnectionHandler* pc_handler,
webrtc::PeerConnectionInterface::IceConnectionState state) { … }
void PeerConnectionTracker::TrackConnectionStateChange(
RTCPeerConnectionHandler* pc_handler,
webrtc::PeerConnectionInterface::PeerConnectionState state) { … }
void PeerConnectionTracker::TrackIceGatheringStateChange(
RTCPeerConnectionHandler* pc_handler,
webrtc::PeerConnectionInterface::IceGatheringState state) { … }
void PeerConnectionTracker::TrackSessionDescriptionCallback(
RTCPeerConnectionHandler* pc_handler,
Action action,
const String& callback_type,
const String& value) { … }
void PeerConnectionTracker::TrackSessionId(RTCPeerConnectionHandler* pc_handler,
const String& session_id) { … }
void PeerConnectionTracker::TrackOnRenegotiationNeeded(
RTCPeerConnectionHandler* pc_handler) { … }
void PeerConnectionTracker::TrackGetUserMedia(
UserMediaRequest* user_media_request) { … }
void PeerConnectionTracker::TrackGetUserMediaSuccess(
UserMediaRequest* user_media_request,
const MediaStream* stream) { … }
void PeerConnectionTracker::TrackGetUserMediaFailure(
UserMediaRequest* user_media_request,
const String& error,
const String& error_message) { … }
void PeerConnectionTracker::TrackGetDisplayMedia(
UserMediaRequest* user_media_request) { … }
void PeerConnectionTracker::TrackGetDisplayMediaSuccess(
UserMediaRequest* user_media_request,
MediaStream* stream) { … }
void PeerConnectionTracker::TrackGetDisplayMediaFailure(
UserMediaRequest* user_media_request,
const String& error,
const String& error_message) { … }
void PeerConnectionTracker::TrackRtcEventLogWrite(
RTCPeerConnectionHandler* pc_handler,
const WTF::Vector<uint8_t>& output) { … }
int PeerConnectionTracker::GetNextLocalID() { … }
int PeerConnectionTracker::GetLocalIDForHandler(
RTCPeerConnectionHandler* handler) const { … }
void PeerConnectionTracker::SendPeerConnectionUpdate(
int local_id,
const String& callback_type,
const String& value) { … }
void PeerConnectionTracker::AddStandardStats(int lid, base::Value::List value) { … }
void PeerConnectionTracker::AddLegacyStats(int lid, base::Value::List value) { … }
}