Make PortInterface signals protected

This flushes out downstream usage of these objects.
"Protected" is used because the Subscribe and Notify functions
are defined on Port, not PortInterface.

Bug: webrtc:42222066
Change-Id: Icb6ec4e723d97f82b6eaee4221a05209834d4e86
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/421800
Reviewed-by: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#46125}
diff --git a/p2p/BUILD.gn b/p2p/BUILD.gn
index 6a7457d..4f4cf32 100644
--- a/p2p/BUILD.gn
+++ b/p2p/BUILD.gn
@@ -674,6 +674,7 @@
     "../rtc_base:dscp",
     "../rtc_base:net_helper",
     "../rtc_base:network",
+    "../rtc_base:sigslot_trampoline",
     "../rtc_base:socket",
     "../rtc_base:socket_address",
     "../rtc_base/network:sent_packet",
diff --git a/p2p/base/port.cc b/p2p/base/port.cc
index 1b2d53c..9f7c06f 100644
--- a/p2p/base/port.cc
+++ b/p2p/base/port.cc
@@ -109,9 +109,6 @@
       shared_socket_(shared_socket),
       network_cost_(args.network->GetCost(env_.field_trials())),
       role_conflict_callback_(nullptr),
-      unknown_address_trampoline_(this),
-      read_packet_trampoline_(this),
-      sent_packet_trampoline_(this),
       weak_factory_(this) {
   RTC_DCHECK_RUN_ON(thread_);
   RTC_DCHECK(factory_ != nullptr);
diff --git a/p2p/base/port.h b/p2p/base/port.h
index 0ab339e..5a00aa0 100644
--- a/p2p/base/port.h
+++ b/p2p/base/port.h
@@ -43,7 +43,6 @@
 #include "rtc_base/network.h"
 #include "rtc_base/network/received_packet.h"
 #include "rtc_base/network/sent_packet.h"
-#include "rtc_base/sigslot_trampoline.h"
 #include "rtc_base/socket_address.h"
 #include "rtc_base/system/rtc_export.h"
 #include "rtc_base/third_party/sigslot/sigslot.h"
@@ -585,10 +584,6 @@
   // Signals and trampolines. These will eventually be removed and replaced
   // with straight CallbackLists (or simple callbacks).
   // TODO: https://issues.webrtc.org/42222066 - replace and delete.
-
-  // Downstream code uses this signal. We will continue firing it along with the
-  // callback list. The signal can be deleted once all downstream usages are
-  // replaced with the new CallbackList implementation.
   sigslot::signal2<Port*, const Candidate&> SignalCandidateReady;
   sigslot::signal1<Port*> SignalPortComplete;
   // Downstream code uses this signal. We will continue firing it along with the
@@ -596,13 +591,6 @@
   // replaced with the new CallbackList implementation.
   sigslot::signal1<Port*> SignalPortError;
 
-  SignalTrampoline<PortInterface, &PortInterface::SignalUnknownAddress>
-      unknown_address_trampoline_;
-  SignalTrampoline<PortInterface, &PortInterface::SignalReadPacket>
-      read_packet_trampoline_;
-  SignalTrampoline<PortInterface, &PortInterface::SignalSentPacket>
-      sent_packet_trampoline_;
-
   // Keep as the last member variable.
   WeakPtrFactory<Port> weak_factory_ RTC_GUARDED_BY(thread_);
 };
diff --git a/p2p/base/port_interface.cc b/p2p/base/port_interface.cc
index b123fd2..d442ad4 100644
--- a/p2p/base/port_interface.cc
+++ b/p2p/base/port_interface.cc
@@ -14,7 +14,10 @@
 
 namespace webrtc {
 
-PortInterface::PortInterface() = default;
+PortInterface::PortInterface()
+    : unknown_address_trampoline_(this),
+      read_packet_trampoline_(this),
+      sent_packet_trampoline_(this) {}
 
 PortInterface::~PortInterface() = default;
 
diff --git a/p2p/base/port_interface.h b/p2p/base/port_interface.h
index 55b6650..15141d4 100644
--- a/p2p/base/port_interface.h
+++ b/p2p/base/port_interface.h
@@ -30,6 +30,7 @@
 #include "rtc_base/net_helper.h"
 #include "rtc_base/network.h"
 #include "rtc_base/network/sent_packet.h"
+#include "rtc_base/sigslot_trampoline.h"
 #include "rtc_base/socket.h"
 #include "rtc_base/socket_address.h"
 #include "rtc_base/third_party/sigslot/sigslot.h"
@@ -97,13 +98,6 @@
   // Indicates that we received a successful STUN binding request from an
   // address that doesn't correspond to any current connection.  To turn this
   // into a real connection, call CreateConnection.
-  sigslot::signal6<PortInterface*,
-                   const SocketAddress&,
-                   ProtocolType,
-                   IceMessage*,
-                   const std::string&,
-                   bool>
-      SignalUnknownAddress;
   virtual void SubscribeUnknownAddress(
       absl::AnyInvocable<void(PortInterface*,
                               const SocketAddress&,
@@ -131,8 +125,6 @@
       std::function<void(PortInterface*)> callback) = 0;
 
   // Signaled when Port discovers ice role conflict with the peer.
-  // TODO: bugs.webrtc.org/42222066 - remove slot.
-  sigslot::signal1<PortInterface*> SignalRoleConflict;
   virtual void SubscribeRoleConflict(absl::AnyInvocable<void()> callback) = 0;
   virtual void NotifyRoleConflict() = 0;
 
@@ -141,8 +133,6 @@
   // through their respective connection and instead delivers every packet
   // through this port.
   virtual void EnablePortPackets() = 0;
-  sigslot::signal4<PortInterface*, const char*, size_t, const SocketAddress&>
-      SignalReadPacket;
   virtual void SubscribeReadPacket(
       absl::AnyInvocable<
           void(PortInterface*, const char*, size_t, const SocketAddress&)>
@@ -153,7 +143,6 @@
                                 const SocketAddress&) = 0;
 
   // Emitted each time a packet is sent on this port.
-  sigslot::signal1<const SentPacketInfo&> SignalSentPacket;
   virtual void SubscribeSentPacket(
       absl::AnyInvocable<void(const SentPacketInfo&)> callback) = 0;
   virtual void NotifySentPacket(const SentPacketInfo& packet) = 0;
@@ -218,6 +207,26 @@
                                     absl::string_view remote_ufrag) = 0;
 
   virtual int16_t network_cost() const = 0;
+  // Since the Subscribe and Notify methods are defined on subclasses'
+  // interfaces, these signals need to be "protected", not "private".
+  // TODO: https://issues.webrtc.org/42222066 - replace and delete.
+  sigslot::signal6<PortInterface*,
+                   const SocketAddress&,
+                   ProtocolType,
+                   IceMessage*,
+                   const std::string&,
+                   bool>
+      SignalUnknownAddress;
+  sigslot::signal4<PortInterface*, const char*, size_t, const SocketAddress&>
+      SignalReadPacket;
+  sigslot::signal1<const SentPacketInfo&> SignalSentPacket;
+  SignalTrampoline<PortInterface, &PortInterface::SignalUnknownAddress>
+      unknown_address_trampoline_;
+  SignalTrampoline<PortInterface, &PortInterface::SignalReadPacket>
+      read_packet_trampoline_;
+  SignalTrampoline<PortInterface, &PortInterface::SignalSentPacket>
+      sent_packet_trampoline_;
+  sigslot::signal1<PortInterface*> SignalRoleConflict;
 
   // Connection and Port are entangled; functions exposed to Port only
   // should not be public.
diff --git a/p2p/base/port_unittest.cc b/p2p/base/port_unittest.cc
index 341379f..3f1cb15 100644
--- a/p2p/base/port_unittest.cc
+++ b/p2p/base/port_unittest.cc
@@ -3992,32 +3992,6 @@
   EXPECT_TRUE(port->GetConnection(address) != nullptr);
 }
 
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-class DeathChannel : public sigslot::has_slots<> {
- public:
-  explicit DeathChannel(std::unique_ptr<Port> port) : port_(std::move(port)) {}
-  void IgnoredSlot(PortInterface* /* port */) {}
-  void AddSignal() {
-    port_->SignalRoleConflict.connect(this, &DeathChannel::IgnoredSlot);
-  }
-  void AddCallback() {
-    port_->SubscribeRoleConflict([]() {});
-  }
-
- private:
-  std::unique_ptr<Port> port_;
-};
-
-class PortDeathTest : public PortTest {};
-
-TEST_F(PortDeathTest, AddSignalThenCallback) {
-  DeathChannel dc(CreateRawTestPort());
-  dc.AddSignal();
-  EXPECT_DEATH(dc.AddCallback(), "");
-}
-
-#endif  // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
 // TODO(webrtc:11463) : Move Connection tests into separate unit test
 // splitting out shared test code as needed.
 
diff --git a/p2p/base/tcp_port_unittest.cc b/p2p/base/tcp_port_unittest.cc
index 1b8136e..e98f685 100644
--- a/p2p/base/tcp_port_unittest.cc
+++ b/p2p/base/tcp_port_unittest.cc
@@ -249,7 +249,8 @@
 class SentPacketCounter : public sigslot::has_slots<> {
  public:
   explicit SentPacketCounter(TCPPort* p) {
-    p->SignalSentPacket.connect(this, &SentPacketCounter::OnSentPacket);
+    p->SubscribeSentPacket(
+        [this](const webrtc::SentPacketInfo& info) { OnSentPacket(info); });
   }
 
   int sent_packets() const { return sent_packets_; }