blob: 9fa5692f4184bb143fe114b55d3f69b11b108761 [file] [log] [blame]
Avi Drissman4e1b7bc32022-09-15 14:03:501// Copyright 2013 The Chromium Authors
[email protected]94fb5102013-01-23 09:00:472// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
mcasas6b8c0c82016-07-29 23:04:355#include "content/browser/webrtc/webrtc_internals_message_handler.h"
[email protected]94fb5102013-01-23 09:00:476
Avi Drissmanadac21992023-01-11 23:46:397#include "base/functional/bind.h"
8#include "base/functional/callback_helpers.h"
Antonio Gomesbc917af2019-10-20 08:01:549#include "content/browser/renderer_host/media/peer_connection_tracker_host.h"
mcasas6b8c0c82016-07-29 23:04:3510#include "content/browser/webrtc/webrtc_internals.h"
[email protected]94fb5102013-01-23 09:00:4711#include "content/public/browser/browser_thread.h"
[email protected]f13ab892014-03-12 06:48:5212#include "content/public/browser/render_frame_host.h"
[email protected]6efd5f22013-02-06 19:20:3713#include "content/public/browser/render_process_host.h"
[email protected]94fb5102013-01-23 09:00:4714#include "content/public/browser/web_contents.h"
15#include "content/public/browser/web_ui.h"
tommi61cc0c02015-10-26 12:42:2416#include "content/public/common/url_constants.h"
Philip Eliasson88d9bbcf2025-05-14 12:55:2417#include "third_party/blink/public/common/features.h"
[email protected]94fb5102013-01-23 09:00:4718
[email protected]64ccac32013-01-29 21:40:0419namespace content {
[email protected]94fb5102013-01-23 09:00:4720
maxmorinc369574d2016-07-25 15:28:1721WebRTCInternalsMessageHandler::WebRTCInternalsMessageHandler()
22 : WebRTCInternalsMessageHandler(WebRTCInternals::GetInstance()) {}
23
24WebRTCInternalsMessageHandler::WebRTCInternalsMessageHandler(
25 WebRTCInternals* webrtc_internals)
26 : webrtc_internals_(webrtc_internals) {
Elad Alona619d5562018-01-13 01:30:1527 DCHECK(webrtc_internals);
maxmorinc369574d2016-07-25 15:28:1728 webrtc_internals_->AddObserver(this);
[email protected]94fb5102013-01-23 09:00:4729}
30
31WebRTCInternalsMessageHandler::~WebRTCInternalsMessageHandler() {
maxmorinc369574d2016-07-25 15:28:1732 webrtc_internals_->RemoveObserver(this);
[email protected]94fb5102013-01-23 09:00:4733}
34
35void WebRTCInternalsMessageHandler::RegisterMessages() {
Maks Orlovichb3c5128e2022-07-13 18:26:0236 web_ui()->RegisterMessageCallback(
Henrik Boström33ece3e92019-04-23 10:08:5337 "getStandardStats",
38 base::BindRepeating(&WebRTCInternalsMessageHandler::OnGetStandardStats,
39 base::Unretained(this)));
[email protected]ce34e1012013-05-02 04:55:4640
Maks Orlovichb3c5128e2022-07-13 18:26:0241 web_ui()->RegisterMessageCallback(
Avi Drissman5e5875b2018-03-24 01:39:4742 "enableAudioDebugRecordings",
43 base::BindRepeating(
grunell7566ffc2015-09-07 07:39:4444 &WebRTCInternalsMessageHandler::OnSetAudioDebugRecordingsEnabled,
Avi Drissman5e5875b2018-03-24 01:39:4745 base::Unretained(this), true));
[email protected]bf3657b2013-12-17 12:36:1746
Maks Orlovichb3c5128e2022-07-13 18:26:0247 web_ui()->RegisterMessageCallback(
Avi Drissman5e5875b2018-03-24 01:39:4748 "disableAudioDebugRecordings",
49 base::BindRepeating(
grunell7566ffc2015-09-07 07:39:4450 &WebRTCInternalsMessageHandler::OnSetAudioDebugRecordingsEnabled,
Avi Drissman5e5875b2018-03-24 01:39:4751 base::Unretained(this), false));
[email protected]bf3657b2013-12-17 12:36:1752
Maks Orlovichb3c5128e2022-07-13 18:26:0253 web_ui()->RegisterMessageCallback(
ivocadd54f0d2015-12-18 23:17:0554 "enableEventLogRecordings",
Avi Drissman5e5875b2018-03-24 01:39:4755 base::BindRepeating(
56 &WebRTCInternalsMessageHandler::OnSetEventLogRecordingsEnabled,
57 base::Unretained(this), true));
ivocadd54f0d2015-12-18 23:17:0558
Maks Orlovichb3c5128e2022-07-13 18:26:0259 web_ui()->RegisterMessageCallback(
ivocadd54f0d2015-12-18 23:17:0560 "disableEventLogRecordings",
Avi Drissman5e5875b2018-03-24 01:39:4761 base::BindRepeating(
62 &WebRTCInternalsMessageHandler::OnSetEventLogRecordingsEnabled,
63 base::Unretained(this), false));
ivocadd54f0d2015-12-18 23:17:0564
Maks Orlovichb3c5128e2022-07-13 18:26:0265 web_ui()->RegisterMessageCallback(
Philip Eliasson9b5072d42025-05-13 13:13:4966 "enableDataChannelRecordings",
67 base::BindRepeating(
68 &WebRTCInternalsMessageHandler::OnSetDataChannelRecordingsEnabled,
69 base::Unretained(this), true));
70
71 web_ui()->RegisterMessageCallback(
72 "disableDataChannelRecordings",
73 base::BindRepeating(
74 &WebRTCInternalsMessageHandler::OnSetDataChannelRecordingsEnabled,
75 base::Unretained(this), false));
76
77 web_ui()->RegisterMessageCallback(
Avi Drissman5e5875b2018-03-24 01:39:4778 "finishedDOMLoad",
79 base::BindRepeating(&WebRTCInternalsMessageHandler::OnDOMLoadDone,
80 base::Unretained(this)));
[email protected]c054f092013-01-27 08:12:4981}
82
rbpotter6353cbe2021-04-22 15:48:2883RenderFrameHost* WebRTCInternalsMessageHandler::GetWebRTCInternalsHost() {
Dave Tapuska327c06c92022-06-13 20:31:5184 RenderFrameHost* host = web_ui()->GetWebContents()->GetPrimaryMainFrame();
tommi61cc0c02015-10-26 12:42:2485 if (host) {
86 // Make sure we only ever execute the script in the webrtc-internals page.
87 const GURL url(host->GetLastCommittedURL());
88 if (!url.SchemeIs(kChromeUIScheme) ||
89 url.host() != kChromeUIWebRTCInternalsHost) {
90 // Some other page is currently loaded even though we might be in the
91 // process of loading webrtc-internals. So, the current RFH is not the
92 // one we're waiting for.
93 host = nullptr;
94 }
95 }
96
97 return host;
98}
99
Henrik Boström33ece3e92019-04-23 10:08:53100void WebRTCInternalsMessageHandler::OnGetStandardStats(
Maks Orlovichb3c5128e2022-07-13 18:26:02101 const base::Value::List& /* unused_list */) {
Tal Pressmand7f6d6f2021-03-02 00:10:04102 for (auto* host : PeerConnectionTrackerHost::GetAllHosts()) {
103 host->GetStandardStats();
Henrik Boström33ece3e92019-04-23 10:08:53104 }
105}
106
grunell7566ffc2015-09-07 07:39:44107void WebRTCInternalsMessageHandler::OnSetAudioDebugRecordingsEnabled(
Maks Orlovichb3c5128e2022-07-13 18:26:02108 bool enable,
109 const base::Value::List& /* unused_list */) {
grunell7566ffc2015-09-07 07:39:44110 if (enable) {
maxmorinc369574d2016-07-25 15:28:17111 webrtc_internals_->EnableAudioDebugRecordings(web_ui()->GetWebContents());
grunell7566ffc2015-09-07 07:39:44112 } else {
maxmorinc369574d2016-07-25 15:28:17113 webrtc_internals_->DisableAudioDebugRecordings();
grunell7566ffc2015-09-07 07:39:44114 }
[email protected]bf3657b2013-12-17 12:36:17115}
116
ivocadd54f0d2015-12-18 23:17:05117void WebRTCInternalsMessageHandler::OnSetEventLogRecordingsEnabled(
118 bool enable,
Maks Orlovichb3c5128e2022-07-13 18:26:02119 const base::Value::List& /* unused_list */) {
Elad Alonc0928bf12018-02-28 19:35:17120 if (!webrtc_internals_->CanToggleEventLogRecordings()) {
121 LOG(WARNING) << "Cannot toggle WebRTC event logging.";
122 return;
123 }
124
ivoccf0887d2016-07-07 18:23:53125 if (enable) {
Elad Alon2afe2492017-12-01 15:11:46126 webrtc_internals_->EnableLocalEventLogRecordings(
127 web_ui()->GetWebContents());
ivoccf0887d2016-07-07 18:23:53128 } else {
Elad Alon2afe2492017-12-01 15:11:46129 webrtc_internals_->DisableLocalEventLogRecordings();
ivoccf0887d2016-07-07 18:23:53130 }
ivocadd54f0d2015-12-18 23:17:05131}
132
Philip Eliasson9b5072d42025-05-13 13:13:49133void WebRTCInternalsMessageHandler::OnSetDataChannelRecordingsEnabled(
134 bool enable,
135 const base::Value::List& /* unused_list */) {
Philip Eliasson88d9bbcf2025-05-14 12:55:24136 if (!base::FeatureList::IsEnabled(
137 blink::features::kWebRtcAllowDataChannelRecordingInWebrtcInternals)) {
138 return;
139 }
Philip Eliasson9b5072d42025-05-13 13:13:49140 if (enable) {
141 webrtc_internals_->EnableDataChannelRecordings(web_ui()->GetWebContents());
142 } else {
143 webrtc_internals_->DisableDataChannelRecordings();
144 }
145}
146
Maks Orlovichb3c5128e2022-07-13 18:26:02147void WebRTCInternalsMessageHandler::OnDOMLoadDone(
148 const base::Value::List& args_list) {
Maks Orlovich266c5dd2021-12-02 23:06:41149 CHECK_GE(args_list.size(), 1u);
150
151 const std::string callback_id = args_list[0].GetString();
rbpotter5796b002021-03-10 18:49:21152 AllowJavascript();
153
maxmorinc369574d2016-07-25 15:28:17154 webrtc_internals_->UpdateObserver(this);
[email protected]bf3657b2013-12-17 12:36:17155
Maks Orlovichb3c5128e2022-07-13 18:26:02156 base::Value::Dict params;
157 params.Set("audioDebugRecordingsEnabled",
158 webrtc_internals_->IsAudioDebugRecordingsEnabled());
159 params.Set("eventLogRecordingsEnabled",
160 webrtc_internals_->IsEventLogRecordingsEnabled());
161 params.Set("eventLogRecordingsToggleable",
162 webrtc_internals_->CanToggleEventLogRecordings());
Philip Eliasson9b5072d42025-05-13 13:13:49163 params.Set("dataChannelRecordingsEnabled",
164 webrtc_internals_->IsDataChannelRecordingsEnabled());
tommi61cc0c02015-10-26 12:42:24165
Philipp Hanckea9abeab52023-05-16 06:43:41166 for (auto* host : PeerConnectionTrackerHost::GetAllHosts()) {
167 host->GetCurrentState();
168 }
Claudio DeSouzae80c81e92022-08-15 22:09:33169 ResolveJavascriptCallback(base::Value(callback_id), params);
[email protected]bf3657b2013-12-17 12:36:17170}
171
rbpotter5796b002021-03-10 18:49:21172void WebRTCInternalsMessageHandler::OnUpdate(const std::string& event_name,
173 const base::Value* event_data) {
mostynb4c27d042015-03-18 21:47:47174 DCHECK_CURRENTLY_ON(BrowserThread::UI);
Tony Herre6bd89b4f2021-10-07 14:27:41175 if (!IsJavascriptAllowed()) {
176 // Javascript is disallowed, either due to the page still loading, or in the
177 // process of being unloaded. Skip this update.
178 return;
179 }
tommi61cc0c02015-10-26 12:42:24180
181 RenderFrameHost* host = GetWebRTCInternalsHost();
182 if (!host)
183 return;
184
rbpotter5796b002021-03-10 18:49:21185 if (event_data) {
186 FireWebUIListener(event_name, *event_data);
187 } else {
188 FireWebUIListener(event_name, base::Value());
189 }
[email protected]94fb5102013-01-23 09:00:47190}
[email protected]64ccac32013-01-29 21:40:04191
192} // namespace content