1 // Copyright (c) 2013 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 #include "content/browser/renderer_host/media/peer_connection_tracker_host.h"
6 
7 #include <utility>
8 
9 #include "base/bind.h"
10 #include "base/power_monitor/power_monitor.h"
11 #include "base/task/post_task.h"
12 #include "content/browser/renderer_host/render_process_host_impl.h"
13 #include "content/browser/webrtc/webrtc_internals.h"
14 #include "content/public/browser/browser_thread.h"
15 #include "content/public/browser/webrtc_event_logger.h"
16 
17 namespace content {
18 
PeerConnectionTrackerHost(RenderProcessHost * rph)19 PeerConnectionTrackerHost::PeerConnectionTrackerHost(RenderProcessHost* rph)
20     : render_process_id_(rph->GetID()), peer_pid_(rph->GetProcess().Pid()) {
21   DCHECK_CURRENTLY_ON(BrowserThread::UI);
22   base::PowerMonitor::AddObserver(this);
23   rph->BindReceiver(tracker_.BindNewPipeAndPassReceiver());
24 }
25 
~PeerConnectionTrackerHost()26 PeerConnectionTrackerHost::~PeerConnectionTrackerHost() {
27   DCHECK_CURRENTLY_ON(BrowserThread::UI);
28   base::PowerMonitor::RemoveObserver(this);
29 }
30 
AddPeerConnection(blink::mojom::PeerConnectionInfoPtr info)31 void PeerConnectionTrackerHost::AddPeerConnection(
32     blink::mojom::PeerConnectionInfoPtr info) {
33   DCHECK_CURRENTLY_ON(BrowserThread::UI);
34 
35   WebRTCInternals* webrtc_internals = WebRTCInternals::GetInstance();
36   if (webrtc_internals) {
37     webrtc_internals->OnAddPeerConnection(
38         render_process_id_, peer_pid_, info->lid, info->url,
39         info->rtc_configuration, info->constraints);
40   }
41 
42   WebRtcEventLogger* logger = WebRtcEventLogger::Get();
43   if (logger) {
44     logger->PeerConnectionAdded(render_process_id_, info->lid,
45                                 base::OnceCallback<void(bool)>());
46   }
47 }
48 
RemovePeerConnection(int lid)49 void PeerConnectionTrackerHost::RemovePeerConnection(int lid) {
50   DCHECK_CURRENTLY_ON(BrowserThread::UI);
51 
52   WebRTCInternals* webrtc_internals = WebRTCInternals::GetInstance();
53   if (webrtc_internals) {
54     webrtc_internals->OnRemovePeerConnection(peer_pid_, lid);
55   }
56   WebRtcEventLogger* logger = WebRtcEventLogger::Get();
57   if (logger) {
58     logger->PeerConnectionRemoved(render_process_id_, lid,
59                                   base::OnceCallback<void(bool)>());
60   }
61 }
62 
UpdatePeerConnection(int lid,const std::string & type,const std::string & value)63 void PeerConnectionTrackerHost::UpdatePeerConnection(int lid,
64                                                      const std::string& type,
65                                                      const std::string& value) {
66   DCHECK_CURRENTLY_ON(BrowserThread::UI);
67 
68   // TODO(eladalon): Get rid of magic value. https://crbug.com/810383
69   if (type == "stop") {
70     WebRtcEventLogger* logger = WebRtcEventLogger::Get();
71     if (logger) {
72       logger->PeerConnectionStopped(render_process_id_, lid,
73                                     base::OnceCallback<void(bool)>());
74     }
75   }
76 
77   WebRTCInternals* webrtc_internals = WebRTCInternals::GetInstance();
78   if (webrtc_internals) {
79     webrtc_internals->OnUpdatePeerConnection(peer_pid_, lid, type, value);
80   }
81 }
82 
OnPeerConnectionSessionIdSet(int lid,const std::string & session_id)83 void PeerConnectionTrackerHost::OnPeerConnectionSessionIdSet(
84     int lid,
85     const std::string& session_id) {
86   DCHECK_CURRENTLY_ON(BrowserThread::UI);
87 
88   WebRtcEventLogger* logger = WebRtcEventLogger::Get();
89   if (logger) {
90     logger->PeerConnectionSessionIdSet(render_process_id_, lid, session_id,
91                                        base::OnceCallback<void(bool)>());
92   }
93 }
94 
AddStandardStats(int lid,base::Value value)95 void PeerConnectionTrackerHost::AddStandardStats(int lid, base::Value value) {
96   DCHECK_CURRENTLY_ON(BrowserThread::UI);
97 
98   WebRTCInternals* webrtc_internals = WebRTCInternals::GetInstance();
99   if (webrtc_internals)
100     webrtc_internals->OnAddStandardStats(peer_pid_, lid, std::move(value));
101 }
102 
AddLegacyStats(int lid,base::Value value)103 void PeerConnectionTrackerHost::AddLegacyStats(int lid, base::Value value) {
104   DCHECK_CURRENTLY_ON(BrowserThread::UI);
105 
106   WebRTCInternals* webrtc_internals = WebRTCInternals::GetInstance();
107   if (webrtc_internals)
108     webrtc_internals->OnAddLegacyStats(peer_pid_, lid, std::move(value));
109 }
110 
GetUserMedia(const std::string & origin,bool audio,bool video,const std::string & audio_constraints,const std::string & video_constraints)111 void PeerConnectionTrackerHost::GetUserMedia(
112     const std::string& origin,
113     bool audio,
114     bool video,
115     const std::string& audio_constraints,
116     const std::string& video_constraints) {
117   DCHECK_CURRENTLY_ON(BrowserThread::UI);
118 
119   WebRTCInternals* webrtc_internals = WebRTCInternals::GetInstance();
120   if (webrtc_internals) {
121     webrtc_internals->OnGetUserMedia(render_process_id_, peer_pid_, origin,
122                                      audio, video, audio_constraints,
123                                      video_constraints);
124   }
125 }
126 
WebRtcEventLogWrite(int lid,const std::vector<uint8_t> & output)127 void PeerConnectionTrackerHost::WebRtcEventLogWrite(
128     int lid,
129     const std::vector<uint8_t>& output) {
130   DCHECK_CURRENTLY_ON(BrowserThread::UI);
131 
132   std::string converted_output(output.begin(), output.end());
133   WebRtcEventLogger* logger = WebRtcEventLogger::Get();
134   if (logger) {
135     logger->OnWebRtcEventLogWrite(
136         render_process_id_, lid, converted_output,
137         base::OnceCallback<void(std::pair<bool, bool>)>());
138   }
139 }
140 
OnSuspend()141 void PeerConnectionTrackerHost::OnSuspend() {
142   DCHECK_CURRENTLY_ON(BrowserThread::UI);
143   tracker_->OnSuspend();
144 }
145 
StartEventLog(int lid,int output_period_ms)146 void PeerConnectionTrackerHost::StartEventLog(int lid, int output_period_ms) {
147   DCHECK_CURRENTLY_ON(BrowserThread::UI);
148   tracker_->StartEventLog(lid, output_period_ms);
149 }
150 
StopEventLog(int lid)151 void PeerConnectionTrackerHost::StopEventLog(int lid) {
152   DCHECK_CURRENTLY_ON(BrowserThread::UI);
153   tracker_->StopEventLog(lid);
154 }
155 
GetStandardStats()156 void PeerConnectionTrackerHost::GetStandardStats() {
157   DCHECK_CURRENTLY_ON(BrowserThread::UI);
158   tracker_->GetStandardStats();
159 }
160 
GetLegacyStats()161 void PeerConnectionTrackerHost::GetLegacyStats() {
162   DCHECK_CURRENTLY_ON(BrowserThread::UI);
163   tracker_->GetLegacyStats();
164 }
165 
BindReceiver(mojo::PendingReceiver<blink::mojom::PeerConnectionTrackerHost> pending_receiver)166 void PeerConnectionTrackerHost::BindReceiver(
167     mojo::PendingReceiver<blink::mojom::PeerConnectionTrackerHost>
168         pending_receiver) {
169   DCHECK_CURRENTLY_ON(BrowserThread::UI);
170   receiver_.reset();
171   receiver_.Bind(std::move(pending_receiver));
172 }
173 
174 }  // namespace content
175