Merge SignalPortPruned and SignalPortsRemoved.
These two signals have the same purpose and is kind of redundant.
Rename to SignalPortsPruned.

BUG=
R=pthatcher@webrtc.org, zhihuang@webrtc.org

Review URL: https://codereview.webrtc.org/2176743003 .

Cr-Commit-Position: refs/heads/master@{#13562}
diff --git a/webrtc/p2p/base/p2ptransportchannel.cc b/webrtc/p2p/base/p2ptransportchannel.cc
index 5238da8..c12e8db 100644
--- a/webrtc/p2p/base/p2ptransportchannel.cc
+++ b/webrtc/p2p/base/p2ptransportchannel.cc
@@ -136,9 +136,7 @@
 
   session->set_generation(static_cast<uint32_t>(allocator_sessions_.size()));
   session->SignalPortReady.connect(this, &P2PTransportChannel::OnPortReady);
-  session->SignalPortsRemoved.connect(this,
-                                      &P2PTransportChannel::OnPortsRemoved);
-  session->SignalPortPruned.connect(this, &P2PTransportChannel::OnPortPruned);
+  session->SignalPortsPruned.connect(this, &P2PTransportChannel::OnPortsPruned);
   session->SignalCandidatesReady.connect(
       this, &P2PTransportChannel::OnCandidatesReady);
   session->SignalCandidatesRemoved.connect(
@@ -149,7 +147,7 @@
   // We now only want to apply new candidates that we receive to the ports
   // created by this new session because these are replacing those of the
   // previous sessions.
-  removed_ports_.insert(removed_ports_.end(), ports_.begin(), ports_.end());
+  pruned_ports_.insert(pruned_ports_.end(), ports_.begin(), ports_.end());
   ports_.clear();
 
   allocator_sessions_.push_back(std::move(session));
@@ -242,7 +240,7 @@
     }
     // Update role on removed ports as well, because they may still have
     // connections alive that should be using the correct role.
-    for (PortInterface* port : removed_ports_) {
+    for (PortInterface* port : pruned_ports_) {
       port->SetIceRole(ice_role);
     }
   }
@@ -250,7 +248,7 @@
 
 void P2PTransportChannel::SetIceTiebreaker(uint64_t tiebreaker) {
   ASSERT(worker_thread_ == rtc::Thread::Current());
-  if (!ports_.empty() || !removed_ports_.empty()) {
+  if (!ports_.empty() || !pruned_ports_.empty()) {
     LOG(LS_ERROR)
         << "Attempt to change tiebreaker after Port has been allocated.";
     return;
@@ -1678,20 +1676,19 @@
   ASSERT(worker_thread_ == rtc::Thread::Current());
 
   ports_.erase(std::remove(ports_.begin(), ports_.end(), port), ports_.end());
-  removed_ports_.erase(
-      std::remove(removed_ports_.begin(), removed_ports_.end(), port),
-      removed_ports_.end());
+  pruned_ports_.erase(
+      std::remove(pruned_ports_.begin(), pruned_ports_.end(), port),
+      pruned_ports_.end());
   LOG(INFO) << "Removed port because it is destroyed: " << ports_.size()
             << " remaining";
 }
 
-void P2PTransportChannel::OnPortsRemoved(
+void P2PTransportChannel::OnPortsPruned(
     PortAllocatorSession* session,
     const std::vector<PortInterface*>& ports) {
   ASSERT(worker_thread_ == rtc::Thread::Current());
-  LOG(LS_INFO) << "Remove " << ports.size() << " ports";
   for (PortInterface* port : ports) {
-    if (RemovePort(port)) {
+    if (OnPortPruned(port)) {
       LOG(INFO) << "Removed port: " << port->ToString() << " " << ports_.size()
                 << " remaining";
     }
@@ -1730,22 +1727,14 @@
                         MSG_REGATHER_ON_FAILED_NETWORKS);
 }
 
-void P2PTransportChannel::OnPortPruned(PortAllocatorSession* session,
-                                       PortInterface* port) {
-  if (RemovePort(port)) {
-    LOG(INFO) << "Removed port because it is pruned: " << port->ToString()
-              << " " << ports_.size() << " remaining";
-  }
-}
-
-bool P2PTransportChannel::RemovePort(PortInterface* port) {
+bool P2PTransportChannel::OnPortPruned(PortInterface* port) {
   auto it = std::find(ports_.begin(), ports_.end(), port);
   // Don't need to do anything if the port has been deleted from the port list.
   if (it == ports_.end()) {
     return false;
   }
   ports_.erase(it);
-  removed_ports_.push_back(port);
+  pruned_ports_.push_back(port);
   return true;
 }
 
diff --git a/webrtc/p2p/base/p2ptransportchannel.h b/webrtc/p2p/base/p2ptransportchannel.h
index 692b098..f363adc 100644
--- a/webrtc/p2p/base/p2ptransportchannel.h
+++ b/webrtc/p2p/base/p2ptransportchannel.h
@@ -276,11 +276,8 @@
   void AddConnection(Connection* connection);
 
   void OnPortReady(PortAllocatorSession *session, PortInterface* port);
-  // TODO(honghaiz): Merge the two methods OnPortsRemoved and OnPortPruned but
-  // still log the reason of removing.
-  void OnPortsRemoved(PortAllocatorSession* session,
-                      const std::vector<PortInterface*>& ports);
-  void OnPortPruned(PortAllocatorSession* session, PortInterface* port);
+  void OnPortsPruned(PortAllocatorSession* session,
+                     const std::vector<PortInterface*>& ports);
   void OnCandidatesReady(PortAllocatorSession *session,
                          const std::vector<Candidate>& candidates);
   void OnCandidatesRemoved(PortAllocatorSession* session,
@@ -294,11 +291,11 @@
                         bool port_muxed);
 
   // When a port is destroyed, remove it from both lists |ports_|
-  // and |removed_ports_|.
+  // and |pruned_ports_|.
   void OnPortDestroyed(PortInterface* port);
-  // When removing a port, move it from |ports_| to |removed_ports_|.
+  // When pruning a port, move it from |ports_| to |pruned_ports_|.
   // Returns true if the port is found and removed from |ports_|.
-  bool RemovePort(PortInterface* port);
+  bool OnPortPruned(PortInterface* port);
   void OnRoleConflict(PortInterface* port);
 
   void OnConnectionStateChange(Connection* connection);
@@ -366,11 +363,11 @@
   // |ports_| contains ports that are used to form new connections when
   // new remote candidates are added.
   std::vector<PortInterface*> ports_;
-  // |removed_ports_| contains ports that have been removed from |ports_| and
+  // |pruned_ports_| contains ports that have been removed from |ports_| and
   // are not being used to form new connections, but that aren't yet destroyed.
   // They may have existing connections, and they still fire signals such as
   // SignalUnknownAddress.
-  std::vector<PortInterface*> removed_ports_;
+  std::vector<PortInterface*> pruned_ports_;
 
   // |connections_| is a sorted list with the first one always be the
   // |selected_connection_| when it's not nullptr. The combination of
diff --git a/webrtc/p2p/base/p2ptransportchannel_unittest.cc b/webrtc/p2p/base/p2ptransportchannel_unittest.cc
index 6673f8f..c9600dd 100644
--- a/webrtc/p2p/base/p2ptransportchannel_unittest.cc
+++ b/webrtc/p2p/base/p2ptransportchannel_unittest.cc
@@ -3550,7 +3550,7 @@
   // Make a fake signal to remove the ports in the p2ptransportchannel. then
   // change the ICE role and expect it to be updated.
   std::vector<PortInterface*> ports(1, conn->port());
-  ch.allocator_session()->SignalPortsRemoved(ch.allocator_session(), ports);
+  ch.allocator_session()->SignalPortsPruned(ch.allocator_session(), ports);
   ch.SetIceRole(ICEROLE_CONTROLLED);
   EXPECT_EQ(ICEROLE_CONTROLLED, conn->port()->GetIceRole());
 }
diff --git a/webrtc/p2p/base/portallocator.h b/webrtc/p2p/base/portallocator.h
index 152474d..5deae7f 100644
--- a/webrtc/p2p/base/portallocator.h
+++ b/webrtc/p2p/base/portallocator.h
@@ -191,11 +191,12 @@
   virtual bool CandidatesAllocationDone() const = 0;
 
   sigslot::signal2<PortAllocatorSession*, PortInterface*> SignalPortReady;
-  // Ports should be signaled to be removed when the networks of the ports
-  // failed (either because the interface is down, or because there is no
-  // connection on the interface).
+  // Fires this signal when the network of the ports failed (either because the
+  // interface is down, or because there is no connection on the interface),
+  // or when TURN ports are pruned because a higher-priority TURN port becomes
+  // ready(pairable).
   sigslot::signal2<PortAllocatorSession*, const std::vector<PortInterface*>&>
-      SignalPortsRemoved;
+      SignalPortsPruned;
   sigslot::signal2<PortAllocatorSession*,
                    const std::vector<Candidate>&> SignalCandidatesReady;
   // Candidates should be signaled to be removed when the port that generated
@@ -203,11 +204,6 @@
   sigslot::signal2<PortAllocatorSession*, const std::vector<Candidate>&>
       SignalCandidatesRemoved;
   sigslot::signal1<PortAllocatorSession*> SignalCandidatesAllocationDone;
-  // A TURN port is pruned if a higher-priority TURN port becomes ready
-  // (pairable). When it is pruned, it will not be used for creating
-  // connections and its candidates will not be sent to the remote side
-  // if they have not been sent.
-  sigslot::signal2<PortAllocatorSession*, PortInterface*> SignalPortPruned;
 
   virtual uint32_t generation() { return generation_; }
   virtual void set_generation(uint32_t generation) { generation_ = generation; }
diff --git a/webrtc/p2p/client/basicportallocator.cc b/webrtc/p2p/client/basicportallocator.cc
index 5e4930c..46c2892 100644
--- a/webrtc/p2p/client/basicportallocator.cc
+++ b/webrtc/p2p/client/basicportallocator.cc
@@ -695,12 +695,12 @@
   // Note: We should check whether any candidates may become ready after this
   // because there we will check whether the candidate is generated by the ready
   // ports, which may include this port.
-  bool pruned_port = false;
+  bool pruned = false;
   if (CandidatePairable(c, port) && !data->has_pairable_candidate()) {
     data->set_has_pairable_candidate(true);
 
     if (prune_turn_ports_ && port->Type() == RELAY_PORT_TYPE) {
-      pruned_port = PruneTurnPorts(port);
+      pruned = PruneTurnPorts(port);
     }
     // If the current port is not pruned yet, SignalPortReady.
     if (!data->pruned()) {
@@ -726,7 +726,7 @@
   }
 
   // If we have pruned any port, maybe need to signal port allocation done.
-  if (pruned_port) {
+  if (pruned) {
     MaybeSignalCandidatesAllocationDone();
   }
 }
@@ -745,7 +745,6 @@
 }
 
 bool BasicPortAllocatorSession::PruneTurnPorts(Port* newly_pairable_turn_port) {
-  bool pruned_port = false;
   // Note: We determine the same network based only on their network names. So
   // if an IPv4 address and an IPv6 address have the same network name, they
   // are considered the same network here.
@@ -754,18 +753,24 @@
   // |port| is already in the list of ports, so the best port cannot be nullptr.
   RTC_CHECK(best_turn_port != nullptr);
 
+  bool pruned = false;
+  std::vector<PortInterface*> pruned_ports;
   for (PortData& data : ports_) {
     if (data.port()->Network()->name() == network_name &&
         data.port()->Type() == RELAY_PORT_TYPE && !data.pruned() &&
         ComparePort(data.port(), best_turn_port) < 0) {
       data.set_pruned();
-      pruned_port = true;
+      pruned = true;
       if (data.port() != newly_pairable_turn_port) {
-        SignalPortPruned(this, data.port());
+        pruned_ports.push_back(data.port());
       }
     }
   }
-  return pruned_port;
+  if (!pruned_ports.empty()) {
+    LOG(LS_INFO) << "Pruned " << pruned_ports.size() << " ports";
+    SignalPortsPruned(this, pruned_ports);
+  }
+  return pruned;
 }
 
 void BasicPortAllocatorSession::OnPortComplete(Port* port) {
@@ -946,7 +951,8 @@
     }
   }
   if (!ports_to_remove.empty()) {
-    SignalPortsRemoved(this, ports_to_remove);
+    LOG(LS_INFO) << "Removed " << ports_to_remove.size() << " ports";
+    SignalPortsPruned(this, ports_to_remove);
   }
   if (!candidates_to_remove.empty()) {
     SignalCandidatesRemoved(this, candidates_to_remove);
diff --git a/webrtc/p2p/client/basicportallocator_unittest.cc b/webrtc/p2p/client/basicportallocator_unittest.cc
index 4696f23..9f91aa0 100644
--- a/webrtc/p2p/client/basicportallocator_unittest.cc
+++ b/webrtc/p2p/client/basicportallocator_unittest.cc
@@ -239,8 +239,8 @@
         sid, content_name, component, ice_ufrag, ice_pwd);
     session->SignalPortReady.connect(this,
                                      &BasicPortAllocatorTest::OnPortReady);
-    session->SignalPortPruned.connect(this,
-                                      &BasicPortAllocatorTest::OnPortPruned);
+    session->SignalPortsPruned.connect(this,
+                                       &BasicPortAllocatorTest::OnPortsPruned);
     session->SignalCandidatesReady.connect(
         this, &BasicPortAllocatorTest::OnCandidatesReady);
     session->SignalCandidatesAllocationDone.connect(
@@ -415,13 +415,18 @@
     EXPECT_NE(ready_ports.end(),
               std::find(ready_ports.begin(), ready_ports.end(), port));
   }
-  void OnPortPruned(PortAllocatorSession* ses, PortInterface* port) {
-    LOG(LS_INFO) << "OnPortPruned: " << port->ToString();
-    ports_.erase(std::remove(ports_.begin(), ports_.end(), port), ports_.end());
-    // Make sure the pruned port is not in ReadyPorts.
+  void OnPortsPruned(PortAllocatorSession* ses,
+                     const std::vector<PortInterface*>& ports_pruned) {
+    LOG(LS_INFO) << "Number of ports pruned: " << ports_pruned.size();
     auto ready_ports = ses->ReadyPorts();
-    EXPECT_EQ(ready_ports.end(),
-              std::find(ready_ports.begin(), ready_ports.end(), port));
+    auto new_end = ports_.end();
+    for (PortInterface* port : ports_pruned) {
+      new_end = std::remove(ports_.begin(), new_end, port);
+      // Make sure the pruned port is not in ReadyPorts.
+      EXPECT_EQ(ready_ports.end(),
+                std::find(ready_ports.begin(), ready_ports.end(), port));
+    }
+    ports_.erase(new_end, ports_.end());
   }
 
   void OnCandidatesReady(PortAllocatorSession* ses,