commit c1169b7770445bb613b057ca63cd3ac4715125a9
parent 7a0f5cb43e8e0326cf21b3cc92d04a7f020e06d6
Author: Dan Baker <dbaker@mozilla.com>
Date: Mon, 27 Oct 2025 12:37:34 -0600
Bug 1995393 - Vendor libwebrtc from 306943dd4e
Upstream commit: https://webrtc.googlesource.com/src/+/306943dd4eab212b857557e20e597d50e6b116c7
Demonstrate a trampoline for step 1 of Sigslot removal
This demonstrates use of a trampoline so that callers to sigslot
functions can use lambda functions without any other changes.
Bug: webrtc:42222066
Change-Id: I815d390b383f7a55a854ac5dc0b09f0a6b28414d
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/406060
Reviewed-by: Tomas Gunnarsson <tommi@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#45433}
Diffstat:
13 files changed, 83 insertions(+), 47 deletions(-)
diff --git a/third_party/libwebrtc/README.mozilla.last-vendor b/third_party/libwebrtc/README.mozilla.last-vendor
@@ -1,4 +1,4 @@
# ./mach python dom/media/webrtc/third_party_build/vendor-libwebrtc.py --from-local /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc --commit mozpatches libwebrtc
-libwebrtc updated from /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-10-27T18:34:57.996454+00:00.
+libwebrtc updated from /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-10-27T18:37:16.988872+00:00.
# base of lastest vendoring
-dc0a35fe85
+306943dd4e
diff --git a/third_party/libwebrtc/api/task_queue/pending_task_safety_flag.h b/third_party/libwebrtc/api/task_queue/pending_task_safety_flag.h
@@ -172,6 +172,17 @@ inline absl::AnyInvocable<void() &&> SafeTask(
};
}
+// Safely execute an Invocable that can be used multiple times.
+inline absl::AnyInvocable<void()> SafeInvocable(
+ scoped_refptr<PendingTaskSafetyFlag> flag,
+ absl::AnyInvocable<void()> task) {
+ return [flag = std::move(flag), task = std::move(task)]() mutable {
+ if (flag->alive()) {
+ task();
+ }
+ };
+}
+
} // namespace webrtc
#endif // API_TASK_QUEUE_PENDING_TASK_SAFETY_FLAG_H_
diff --git a/third_party/libwebrtc/moz-patch-stack/s0001.patch b/third_party/libwebrtc/moz-patch-stack/s0001.patch
@@ -1383,7 +1383,7 @@ index 5ccc3d7d38..cd957416bc 100644
const bool enable_svc_for_simulcast_;
std::optional<SimulcastToSvcConverter> simulcast_to_svc_converter_;
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
-index b806050fca..66b76b8c78 100644
+index 6293f7cc2a..1e88de16e7 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
@@ -449,6 +449,12 @@ rtc_library("logging") {
diff --git a/third_party/libwebrtc/moz-patch-stack/s0027.patch b/third_party/libwebrtc/moz-patch-stack/s0027.patch
@@ -1013,7 +1013,7 @@ index 39aa39a41c..b26e30e8bb 100644
"/config/external/nspr",
"/nsprpub/lib/ds",
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
-index 66b76b8c78..f88a45d683 100644
+index 1e88de16e7..2d87e879e3 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
@@ -326,6 +326,7 @@ rtc_library("sample_counter") {
@@ -1050,7 +1050,7 @@ index 66b76b8c78..f88a45d683 100644
visibility = [ "*" ]
sources = [
"network.cc",
-@@ -1220,16 +1225,20 @@ rtc_library("network") {
+@@ -1222,16 +1227,20 @@ rtc_library("network") {
deps += [ ":win32" ]
}
}
@@ -1071,7 +1071,7 @@ index 66b76b8c78..f88a45d683 100644
visibility = [ "*" ]
sources = [
"net_helper.cc",
-@@ -1240,8 +1249,10 @@ rtc_library("net_helper") {
+@@ -1242,8 +1251,10 @@ rtc_library("net_helper") {
"//third_party/abseil-cpp/absl/strings:string_view",
]
}
@@ -1082,7 +1082,7 @@ index 66b76b8c78..f88a45d683 100644
visibility = [ "*" ]
sources = [
"socket_adapters.cc",
-@@ -1262,6 +1273,7 @@ rtc_library("socket_adapters") {
+@@ -1264,6 +1275,7 @@ rtc_library("socket_adapters") {
"//third_party/abseil-cpp/absl/strings:string_view",
]
}
@@ -1090,7 +1090,7 @@ index 66b76b8c78..f88a45d683 100644
rtc_library("network_route") {
sources = [
-@@ -1276,6 +1288,7 @@ rtc_library("network_route") {
+@@ -1278,6 +1290,7 @@ rtc_library("network_route") {
}
rtc_library("async_tcp_socket") {
@@ -1098,7 +1098,7 @@ index 66b76b8c78..f88a45d683 100644
sources = [
"async_tcp_socket.cc",
"async_tcp_socket.h",
-@@ -1295,8 +1308,10 @@ rtc_library("async_tcp_socket") {
+@@ -1297,8 +1310,10 @@ rtc_library("async_tcp_socket") {
"network:sent_packet",
]
}
@@ -1109,7 +1109,7 @@ index 66b76b8c78..f88a45d683 100644
visibility = [ "*" ]
sources = [
"async_udp_socket.cc",
-@@ -1320,8 +1335,10 @@ rtc_library("async_udp_socket") {
+@@ -1322,8 +1337,10 @@ rtc_library("async_udp_socket") {
"system:no_unique_address",
]
}
@@ -1120,7 +1120,7 @@ index 66b76b8c78..f88a45d683 100644
visibility = [ "*" ]
sources = [
"async_packet_socket.cc",
-@@ -1344,6 +1361,7 @@ rtc_library("async_packet_socket") {
+@@ -1346,6 +1363,7 @@ rtc_library("async_packet_socket") {
"//third_party/abseil-cpp/absl/functional:any_invocable",
]
}
@@ -1128,7 +1128,7 @@ index 66b76b8c78..f88a45d683 100644
if (rtc_include_tests) {
rtc_library("async_packet_socket_unittest") {
-@@ -1429,6 +1447,7 @@ rtc_library("data_rate_limiter") {
+@@ -1431,6 +1449,7 @@ rtc_library("data_rate_limiter") {
}
rtc_library("unique_id_generator") {
@@ -1136,7 +1136,7 @@ index 66b76b8c78..f88a45d683 100644
sources = [
"unique_id_generator.cc",
"unique_id_generator.h",
-@@ -1446,6 +1465,7 @@ rtc_library("unique_id_generator") {
+@@ -1448,6 +1467,7 @@ rtc_library("unique_id_generator") {
"//third_party/abseil-cpp/absl/strings:string_view",
]
}
@@ -1144,7 +1144,7 @@ index 66b76b8c78..f88a45d683 100644
rtc_library("crc32") {
sources = [
-@@ -1477,6 +1497,7 @@ rtc_library("stream") {
+@@ -1479,6 +1499,7 @@ rtc_library("stream") {
}
rtc_library("rtc_certificate_generator") {
@@ -1152,7 +1152,7 @@ index 66b76b8c78..f88a45d683 100644
visibility = [ "*" ]
sources = [
"rtc_certificate_generator.cc",
-@@ -1491,6 +1512,7 @@ rtc_library("rtc_certificate_generator") {
+@@ -1493,6 +1514,7 @@ rtc_library("rtc_certificate_generator") {
"//third_party/abseil-cpp/absl/functional:any_invocable",
]
}
@@ -1160,7 +1160,7 @@ index 66b76b8c78..f88a45d683 100644
rtc_source_set("ssl_header") {
visibility = [ "*" ]
-@@ -1547,6 +1569,7 @@ rtc_library("crypto_random") {
+@@ -1549,6 +1571,7 @@ rtc_library("crypto_random") {
}
rtc_library("ssl") {
@@ -1168,7 +1168,7 @@ index 66b76b8c78..f88a45d683 100644
visibility = [ "*" ]
sources = [
"openssl_key_pair.cc",
-@@ -1619,6 +1642,7 @@ rtc_library("ssl") {
+@@ -1621,6 +1644,7 @@ rtc_library("ssl") {
deps += [ ":win32" ]
}
}
@@ -1176,7 +1176,7 @@ index 66b76b8c78..f88a45d683 100644
rtc_library("ssl_adapter") {
visibility = [ "*" ]
-@@ -2342,7 +2366,7 @@ if (rtc_include_tests) {
+@@ -2344,7 +2368,7 @@ if (rtc_include_tests) {
}
}
diff --git a/third_party/libwebrtc/moz-patch-stack/s0053.patch b/third_party/libwebrtc/moz-patch-stack/s0053.patch
@@ -29,7 +29,7 @@ index 7db75d5fd3..d0feb5007c 100644
rtc_library("task_queue_test") {
visibility = [ "*" ]
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
-index f88a45d683..4e6b30a721 100644
+index 2d87e879e3..54a023fecb 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
@@ -664,10 +664,14 @@ if (is_mac || is_ios) {
diff --git a/third_party/libwebrtc/moz-patch-stack/s0091.patch b/third_party/libwebrtc/moz-patch-stack/s0091.patch
@@ -13,7 +13,7 @@ Mercurial Revision: https://hg.mozilla.org/mozilla-central/rev/4e7b3c485e549e7e3
1 file changed, 6 insertions(+)
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
-index 4e6b30a721..731aa89c4c 100644
+index 54a023fecb..e3dbf32b11 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
@@ -992,6 +992,12 @@ rtc_library("threading") {
diff --git a/third_party/libwebrtc/moz-patch-stack/s0094.patch b/third_party/libwebrtc/moz-patch-stack/s0094.patch
@@ -9,10 +9,10 @@ Mercurial Revision: https://hg.mozilla.org/mozilla-central/rev/ee2f06666bcc6d22c
1 file changed, 2 insertions(+)
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
-index 731aa89c4c..aca465a29f 100644
+index e3dbf32b11..5631595e2c 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
-@@ -1655,6 +1655,7 @@ if (!build_with_mozilla) {
+@@ -1657,6 +1657,7 @@ if (!build_with_mozilla) {
}
rtc_library("ssl_adapter") {
@@ -20,7 +20,7 @@ index 731aa89c4c..aca465a29f 100644
visibility = [ "*" ]
sources = [
"openssl_adapter.cc",
-@@ -1703,6 +1704,7 @@ rtc_library("ssl_adapter") {
+@@ -1705,6 +1706,7 @@ rtc_library("ssl_adapter") {
configs += [ "..:external_ssl_library" ]
}
}
diff --git a/third_party/libwebrtc/moz-patch-stack/s0102.patch b/third_party/libwebrtc/moz-patch-stack/s0102.patch
@@ -616,7 +616,7 @@ index 47e5c4d2ca..10fdbd3c1c 100644
if (rtc_build_libsrtp) {
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
-index aca465a29f..8309bcaadc 100644
+index 5631595e2c..a21820e9e7 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
@@ -9,8 +9,8 @@
@@ -630,7 +630,7 @@ index aca465a29f..8309bcaadc 100644
}
rtc_source_set("protobuf_utils") {
-@@ -1895,8 +1895,8 @@ if (!rtc_rusty_base64) {
+@@ -1897,8 +1897,8 @@ if (!rtc_rusty_base64) {
]
}
} else {
diff --git a/third_party/libwebrtc/moz-patch-stack/s0107.patch b/third_party/libwebrtc/moz-patch-stack/s0107.patch
@@ -116,10 +116,10 @@ index 12c65b29f3..22057def53 100644
public_configs = []
if (!build_with_chromium) {
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
-index 8309bcaadc..c99788fbef 100644
+index a21820e9e7..8208b5d0e1 100644
--- a/rtc_base/BUILD.gn
+++ b/rtc_base/BUILD.gn
-@@ -1534,6 +1534,7 @@ rtc_source_set("ssl_header") {
+@@ -1536,6 +1536,7 @@ rtc_source_set("ssl_header") {
}
rtc_library("digest") {
@@ -127,7 +127,7 @@ index 8309bcaadc..c99788fbef 100644
visibility = [ "*" ]
sources = [
"message_digest.cc",
-@@ -1555,8 +1556,10 @@ rtc_library("digest") {
+@@ -1557,8 +1558,10 @@ rtc_library("digest") {
configs += [ "..:external_ssl_library" ]
}
}
@@ -138,7 +138,7 @@ index 8309bcaadc..c99788fbef 100644
visibility = [ "*" ]
sources = [
"crypto_random.cc",
-@@ -1577,6 +1580,7 @@ rtc_library("crypto_random") {
+@@ -1579,6 +1582,7 @@ rtc_library("crypto_random") {
configs += [ "..:external_ssl_library" ]
}
}
diff --git a/third_party/libwebrtc/p2p/client/basic_port_allocator.cc b/third_party/libwebrtc/p2p/client/basic_port_allocator.cc
@@ -268,8 +268,8 @@ BasicPortAllocatorSession::BasicPortAllocatorSession(
turn_port_prune_policy_(allocator->turn_port_prune_policy()) {
TRACE_EVENT0("webrtc",
"BasicPortAllocatorSession::BasicPortAllocatorSession");
- allocator_->network_manager()->SignalNetworksChanged.connect(
- this, &BasicPortAllocatorSession::OnNetworksChanged);
+ allocator_->network_manager()->SubscribeNetworksChanged(
+ SafeInvocable(network_safety_.flag(), [this] { OnNetworksChanged(); }));
allocator_->network_manager()->StartUpdating();
}
diff --git a/third_party/libwebrtc/rtc_base/BUILD.gn b/third_party/libwebrtc/rtc_base/BUILD.gn
@@ -1200,6 +1200,7 @@ if (!build_with_mozilla) {
"network.h",
]
deps = [
+ ":callback_list",
":checks",
":ifaddrs_converter",
":ip_address",
@@ -1226,6 +1227,7 @@ if (!build_with_mozilla) {
"//third_party/abseil-cpp/absl/algorithm:container",
"//third_party/abseil-cpp/absl/base:core_headers",
"//third_party/abseil-cpp/absl/base:nullability",
+ "//third_party/abseil-cpp/absl/functional:any_invocable",
"//third_party/abseil-cpp/absl/memory",
"//third_party/abseil-cpp/absl/strings",
"//third_party/abseil-cpp/absl/strings:string_view",
diff --git a/third_party/libwebrtc/rtc_base/network.h b/third_party/libwebrtc/rtc_base/network.h
@@ -20,6 +20,7 @@
#include <vector>
#include "absl/base/nullability.h"
+#include "absl/functional/any_invocable.h"
#include "absl/strings/string_view.h"
#include "api/array_view.h"
#include "api/environment/environment.h"
@@ -27,6 +28,7 @@
#include "api/scoped_refptr.h"
#include "api/sequence_checker.h"
#include "api/task_queue/pending_task_safety_flag.h"
+#include "rtc_base/callback_list.h"
#include "rtc_base/checks.h"
#include "rtc_base/ip_address.h"
#include "rtc_base/mdns_responder_interface.h"
@@ -124,6 +126,8 @@ class NetworkMask {
class RTC_EXPORT NetworkManager : public DefaultLocalAddressProvider,
public MdnsResponderProvider {
public:
+ NetworkManager()
+ : networks_changed_trampoline_(this), error_trampoline_(this) {}
// This enum indicates whether adapter enumeration is allowed.
enum EnumerationPermission {
ENUMERATION_ALLOWED, // Adapter enumeration is allowed. Getting 0 network
@@ -188,6 +192,33 @@ class RTC_EXPORT NetworkManager : public DefaultLocalAddressProvider,
MdnsResponderInterface* GetMdnsResponder() const override;
virtual void set_vpn_list(const std::vector<NetworkMask>& /* vpn */) {}
+ void SubscribeNetworksChanged(absl::AnyInvocable<void()> callback) {
+ networks_changed_trampoline_.Subscribe(std::move(callback));
+ }
+ void NotifyNetworksChanged() { SignalNetworksChanged(); }
+ void SubscribeError(absl::AnyInvocable<void()> callback) {
+ error_trampoline_.Subscribe(std::move(callback));
+ }
+ void NotifyError() { SignalError(); }
+
+ private:
+ template <auto member_signal>
+ class SignalTrampoline : public sigslot::has_slots<> {
+ public:
+ explicit SignalTrampoline(NetworkManager* that) {
+ (that->*member_signal).connect(this, &SignalTrampoline::Notify);
+ }
+ void Notify() { callbacks_.Send(); }
+ void Subscribe(absl::AnyInvocable<void()> callback) {
+ callbacks_.AddReceiver(std::move(callback));
+ }
+
+ private:
+ CallbackList<> callbacks_;
+ };
+ SignalTrampoline<&NetworkManager::SignalNetworksChanged>
+ networks_changed_trampoline_;
+ SignalTrampoline<&NetworkManager::SignalError> error_trampoline_;
};
// Represents a Unix-type network interface, with a name and single address.
diff --git a/third_party/libwebrtc/rtc_base/network_unittest.cc b/third_party/libwebrtc/rtc_base/network_unittest.cc
@@ -426,8 +426,7 @@ TEST_F(NetworkTest, DISABLED_TestCreateNetworks) {
TEST_F(NetworkTest, TestUpdateNetworks) {
PhysicalSocketServer socket_server;
BasicNetworkManager manager(env_, &socket_server);
- manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
- &NetworkTest::OnNetworksChanged);
+ manager.SubscribeNetworksChanged([this] { OnNetworksChanged(); });
EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED,
manager.enumeration_permission());
manager.StartUpdating();
@@ -573,8 +572,7 @@ void SetupNetworks(std::vector<std::unique_ptr<Network>>* list) {
TEST_F(NetworkTest, TestIPv6MergeNetworkList) {
PhysicalSocketServer socket_server;
BasicNetworkManager manager(env_, &socket_server);
- manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
- &NetworkTest::OnNetworksChanged);
+ manager.SubscribeNetworksChanged([this]() { OnNetworksChanged(); });
std::vector<std::unique_ptr<Network>> networks;
SetupNetworks(&networks);
std::vector<const Network*> original_list = CopyNetworkPointers(networks);
@@ -595,8 +593,7 @@ TEST_F(NetworkTest, TestIPv6MergeNetworkList) {
TEST_F(NetworkTest, TestNoChangeMerge) {
PhysicalSocketServer socket_server;
BasicNetworkManager manager(env_, &socket_server);
- manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
- &NetworkTest::OnNetworksChanged);
+ manager.SubscribeNetworksChanged([this]() { OnNetworksChanged(); });
std::vector<std::unique_ptr<Network>> networks;
SetupNetworks(&networks);
std::vector<const Network*> original_list = CopyNetworkPointers(networks);
@@ -626,8 +623,7 @@ TEST_F(NetworkTest, TestNoChangeMerge) {
TEST_F(NetworkTest, MergeWithChangedIP) {
PhysicalSocketServer socket_server;
BasicNetworkManager manager(env_, &socket_server);
- manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
- &NetworkTest::OnNetworksChanged);
+ manager.SubscribeNetworksChanged([this]() { OnNetworksChanged(); });
std::vector<std::unique_ptr<Network>> original_list;
SetupNetworks(&original_list);
// Make a network that we're going to change.
@@ -663,8 +659,7 @@ TEST_F(NetworkTest, MergeWithChangedIP) {
TEST_F(NetworkTest, TestMultipleIPMergeNetworkList) {
PhysicalSocketServer socket_server;
BasicNetworkManager manager(env_, &socket_server);
- manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
- &NetworkTest::OnNetworksChanged);
+ manager.SubscribeNetworksChanged([this]() { OnNetworksChanged(); });
std::vector<std::unique_ptr<Network>> original_list;
SetupNetworks(&original_list);
const Network* const network_ptr = original_list[2].get();
@@ -717,8 +712,7 @@ TEST_F(NetworkTest, TestMultipleIPMergeNetworkList) {
TEST_F(NetworkTest, TestMultiplePublicNetworksOnOneInterfaceMerge) {
PhysicalSocketServer socket_server;
BasicNetworkManager manager(env_, &socket_server);
- manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
- &NetworkTest::OnNetworksChanged);
+ manager.SubscribeNetworksChanged([this]() { OnNetworksChanged(); });
std::vector<std::unique_ptr<Network>> original_list;
SetupNetworks(&original_list);
bool changed = false;
@@ -1253,8 +1247,7 @@ TEST_F(NetworkTest, TestNetworkMonitoring) {
FakeNetworkMonitorFactory factory;
PhysicalSocketServer socket_server;
BasicNetworkManager manager(env_, &socket_server, &factory);
- manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
- &NetworkTest::OnNetworksChanged);
+ manager.SubscribeNetworksChanged([this]() { OnNetworksChanged(); });
manager.StartUpdating();
FakeNetworkMonitor* network_monitor = GetNetworkMonitor(manager);
EXPECT_TRUE(network_monitor && network_monitor->started());
@@ -1285,8 +1278,7 @@ TEST_F(NetworkTest, MAYBE_DefaultLocalAddress) {
FakeNetworkMonitorFactory factory;
PhysicalSocketServer socket_server;
TestBasicNetworkManager manager(env_, &socket_server, &factory);
- manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
- &NetworkTest::OnNetworksChanged);
+ manager.SubscribeNetworksChanged([this]() { OnNetworksChanged(); });
manager.StartUpdating();
EXPECT_THAT(WaitUntil([&] { return callback_called_; }, IsTrue()), IsRtcOk());