Title: [239238] trunk
Revision
239238
Author
you...@apple.com
Date
2018-12-14 15:52:40 -0800 (Fri, 14 Dec 2018)

Log Message

getSenders/getReceivers() should not return closed transceiver senders/receivers
https://bugs.webkit.org/show_bug.cgi?id=192706

Reviewed by Eric Carlson.

LayoutTests/imported/w3c:

* web-platform-tests/webrtc/RTCPeerConnection-setDescription-transceiver.html:
* web-platform-tests/webrtc/RTCRtpTransceiver.https.html:

Source/WebCore:

Updated as per https://github.com/w3c/webrtc-pc/commit/85284b76baebf9e149d194e692be16a21768a91a
This forces us to compute the sender/receiver list at getter call time.
Updated the internal call sites of senders to use the list of transceivers instead.

Covered by updated WPT tests.

* Modules/mediastream/RTCPeerConnection.cpp:
(WebCore::RTCPeerConnection::addTrack):
(WebCore::RTCPeerConnection::getSenders const):
(WebCore::RTCPeerConnection::getReceivers const):
* Modules/mediastream/RTCPeerConnection.h:
* Modules/mediastream/RTCRtpTransceiver.cpp:
(WebCore::RTCRtpTransceiver::stopped const):
(WebCore::RtpTransceiverSet::append):
(WebCore::RtpTransceiverSet::senders const):
(WebCore::RtpTransceiverSet::receivers const):
* Modules/mediastream/RTCRtpTransceiver.h:
(WebCore::RtpTransceiverSet::senders const): Deleted.
(WebCore::RtpTransceiverSet::receivers const): Deleted.
* Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp:
(WebCore::findExistingSender):
(WebCore::LibWebRTCPeerConnectionBackend::addTrack):

Modified Paths

Diff

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (239237 => 239238)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2018-12-14 23:23:10 UTC (rev 239237)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2018-12-14 23:52:40 UTC (rev 239238)
@@ -1,3 +1,13 @@
+2018-12-14  Youenn Fablet  <you...@apple.com>
+
+        getSenders/getReceivers() should not return closed transceiver senders/receivers
+        https://bugs.webkit.org/show_bug.cgi?id=192706
+
+        Reviewed by Eric Carlson.
+
+        * web-platform-tests/webrtc/RTCPeerConnection-setDescription-transceiver.html:
+        * web-platform-tests/webrtc/RTCRtpTransceiver.https.html:
+
 2018-12-13  Youenn Fablet  <you...@apple.com>
 
         RTCRtpTransceiver.stopped should be true when applying a remote description with the corresponding m section rejected

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setDescription-transceiver.html (239237 => 239238)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setDescription-transceiver.html	2018-12-14 23:23:10 UTC (rev 239237)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCPeerConnection-setDescription-transceiver.html	2018-12-14 23:52:40 UTC (rev 239238)
@@ -257,6 +257,8 @@
     await pc1.setRemoteDescription(answer);
 
     assert_true(pc1.getTransceivers()[0].stopped, 'Transceiver is stopped');
+    assert_equals(pc1.getReceivers().length, 0, 'getReceivers does not expose a receiver of a stopped transceiver');
+    assert_equals(pc1.getSenders().length, 0, 'getSenders does not expose a sender of a stopped transceiver');
   }, 'setRemoteDescription should stop the transceiver if its corresponding m section is rejected');
 
   /*

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCRtpTransceiver.https.html (239237 => 239238)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCRtpTransceiver.https.html	2018-12-14 23:23:10 UTC (rev 239237)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webrtc/RTCRtpTransceiver.https.html	2018-12-14 23:52:40 UTC (rev 239238)
@@ -1155,6 +1155,8 @@
       stoppedTransceiver.receiver.track._onended_ = resolve;
     });
     stoppedTransceiver.stop();
+    assert_equals(pc1.getReceivers().length, 0, 'getReceivers does not expose a receiver of a stopped transceiver');
+    assert_equals(pc1.getSenders().length, 0, 'getSenders does not expose a sender of a stopped transceiver');
 
     await onended;
 

Modified: trunk/Source/WebCore/ChangeLog (239237 => 239238)


--- trunk/Source/WebCore/ChangeLog	2018-12-14 23:23:10 UTC (rev 239237)
+++ trunk/Source/WebCore/ChangeLog	2018-12-14 23:52:40 UTC (rev 239238)
@@ -1,3 +1,33 @@
+2018-12-14  Youenn Fablet  <you...@apple.com>
+
+        getSenders/getReceivers() should not return closed transceiver senders/receivers
+        https://bugs.webkit.org/show_bug.cgi?id=192706
+
+        Reviewed by Eric Carlson.
+
+        Updated as per https://github.com/w3c/webrtc-pc/commit/85284b76baebf9e149d194e692be16a21768a91a
+        This forces us to compute the sender/receiver list at getter call time.
+        Updated the internal call sites of senders to use the list of transceivers instead.
+
+        Covered by updated WPT tests.
+
+        * Modules/mediastream/RTCPeerConnection.cpp:
+        (WebCore::RTCPeerConnection::addTrack):
+        (WebCore::RTCPeerConnection::getSenders const):
+        (WebCore::RTCPeerConnection::getReceivers const):
+        * Modules/mediastream/RTCPeerConnection.h:
+        * Modules/mediastream/RTCRtpTransceiver.cpp:
+        (WebCore::RTCRtpTransceiver::stopped const):
+        (WebCore::RtpTransceiverSet::append):
+        (WebCore::RtpTransceiverSet::senders const):
+        (WebCore::RtpTransceiverSet::receivers const):
+        * Modules/mediastream/RTCRtpTransceiver.h:
+        (WebCore::RtpTransceiverSet::senders const): Deleted.
+        (WebCore::RtpTransceiverSet::receivers const): Deleted.
+        * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp:
+        (WebCore::findExistingSender):
+        (WebCore::LibWebRTCPeerConnectionBackend::addTrack):
+
 2018-12-14  David Kilzer  <ddkil...@apple.com>
 
         clang-tidy: Fix unnecessary copy of objects for operator==() methods

Modified: trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp (239237 => 239238)


--- trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp	2018-12-14 23:23:10 UTC (rev 239237)
+++ trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp	2018-12-14 23:52:40 UTC (rev 239238)
@@ -114,8 +114,8 @@
     if (isClosed())
         return Exception { InvalidStateError };
 
-    for (RTCRtpSender& sender : m_transceiverSet->senders()) {
-        if (sender.trackId() == track->id())
+    for (auto& transceiver : m_transceiverSet->list()) {
+        if (transceiver->sender().trackId() == track->id())
             return Exception { InvalidAccessError };
     }
 
@@ -641,13 +641,13 @@
     PeerConnectionBackend::generateCertificate(document, parameters.returnValue(), WTFMove(promise));
 }
 
-const Vector<std::reference_wrapper<RTCRtpSender>>& RTCPeerConnection::getSenders() const
+Vector<std::reference_wrapper<RTCRtpSender>> RTCPeerConnection::getSenders() const
 {
     m_backend->collectTransceivers();
     return m_transceiverSet->senders();
 }
 
-const Vector<std::reference_wrapper<RTCRtpReceiver>>& RTCPeerConnection::getReceivers() const
+Vector<std::reference_wrapper<RTCRtpReceiver>> RTCPeerConnection::getReceivers() const
 {
     m_backend->collectTransceivers();
     return m_transceiverSet->receivers();

Modified: trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h (239237 => 239238)


--- trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h	2018-12-14 23:23:10 UTC (rev 239237)
+++ trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h	2018-12-14 23:52:40 UTC (rev 239238)
@@ -128,11 +128,10 @@
     void addInternalTransceiver(Ref<RTCRtpTransceiver>&& transceiver) { m_transceiverSet->append(WTFMove(transceiver)); }
 
     // 5.1 RTCPeerConnection extensions
-    const Vector<std::reference_wrapper<RTCRtpSender>>& getSenders() const;
-    const Vector<std::reference_wrapper<RTCRtpReceiver>>& getReceivers() const;
+    Vector<std::reference_wrapper<RTCRtpSender>> getSenders() const;
+    Vector<std::reference_wrapper<RTCRtpReceiver>> getReceivers() const;
     const Vector<RefPtr<RTCRtpTransceiver>>& getTransceivers() const;
 
-    const Vector<std::reference_wrapper<RTCRtpSender>>& currentSenders() const { return m_transceiverSet->senders(); }
     const Vector<RefPtr<RTCRtpTransceiver>>& currentTransceivers() const { return m_transceiverSet->list(); }
 
     ExceptionOr<Ref<RTCRtpSender>> addTrack(Ref<MediaStreamTrack>&&, const Vector<std::reference_wrapper<MediaStream>>&);

Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.cpp (239237 => 239238)


--- trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.cpp	2018-12-14 23:23:10 UTC (rev 239237)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.cpp	2018-12-14 23:52:40 UTC (rev 239238)
@@ -106,21 +106,40 @@
         m_backend->stop();
 }
 
+bool RTCRtpTransceiver::stopped() const
+{
+    if (m_backend)
+        return m_backend->stopped();
+    return m_stopped;
+}
+
 void RtpTransceiverSet::append(Ref<RTCRtpTransceiver>&& transceiver)
 {
-    m_senders.append(transceiver->sender());
-    m_receivers.append(transceiver->receiver());
-
     m_transceivers.append(WTFMove(transceiver));
 }
 
-bool RTCRtpTransceiver::stopped() const
+Vector<std::reference_wrapper<RTCRtpSender>> RtpTransceiverSet::senders() const
 {
-    if (m_backend)
-        return m_backend->stopped();
-    return m_stopped;
+    Vector<std::reference_wrapper<RTCRtpSender>> senders;
+    for (auto& transceiver : m_transceivers) {
+        if (transceiver->stopped())
+            continue;
+        senders.append(transceiver->sender());
+    }
+    return senders;
 }
 
+Vector<std::reference_wrapper<RTCRtpReceiver>> RtpTransceiverSet::receivers() const
+{
+    Vector<std::reference_wrapper<RTCRtpReceiver>> receivers;
+    for (auto& transceiver : m_transceivers) {
+        if (transceiver->stopped())
+            continue;
+        receivers.append(transceiver->receiver());
+    }
+    return receivers;
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(WEB_RTC)

Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.h (239237 => 239238)


--- trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.h	2018-12-14 23:23:10 UTC (rev 239237)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpTransceiver.h	2018-12-14 23:52:40 UTC (rev 239238)
@@ -91,14 +91,11 @@
     const Vector<RefPtr<RTCRtpTransceiver>>& list() const { return m_transceivers; }
     void append(Ref<RTCRtpTransceiver>&&);
 
-    const Vector<std::reference_wrapper<RTCRtpSender>>& senders() const { return m_senders; }
-    const Vector<std::reference_wrapper<RTCRtpReceiver>>& receivers() const { return m_receivers; }
+    Vector<std::reference_wrapper<RTCRtpSender>> senders() const;
+    Vector<std::reference_wrapper<RTCRtpReceiver>> receivers() const;
 
 private:
     Vector<RefPtr<RTCRtpTransceiver>> m_transceivers;
-
-    Vector<std::reference_wrapper<RTCRtpSender>> m_senders;
-    Vector<std::reference_wrapper<RTCRtpReceiver>> m_receivers;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp (239237 => 239238)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp	2018-12-14 23:23:10 UTC (rev 239237)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp	2018-12-14 23:52:40 UTC (rev 239238)
@@ -385,10 +385,11 @@
     return m_endpoint->remoteDescription();
 }
 
-static inline RefPtr<RTCRtpSender> findExistingSender(const Vector<std::reference_wrapper<RTCRtpSender>>& senders, LibWebRTCRtpSenderBackend& senderBackend)
+static inline RefPtr<RTCRtpSender> findExistingSender(const Vector<RefPtr<RTCRtpTransceiver>>& transceivers, LibWebRTCRtpSenderBackend& senderBackend)
 {
     ASSERT(senderBackend.rtcSender());
-    for (RTCRtpSender& sender : senders) {
+    for (auto& transceiver : transceivers) {
+        auto& sender = transceiver->sender();
         if (!sender.isStopped() && senderBackend.rtcSender() == backendFromRTPSender(sender).rtcSender())
             return makeRef(sender);
     }
@@ -402,7 +403,7 @@
         if (!m_endpoint->addTrack(*senderBackend, track, mediaStreamIds))
             return Exception { TypeError, "Unable to add track"_s };
 
-        if (auto sender = findExistingSender(m_peerConnection.currentSenders(), *senderBackend)) {
+        if (auto sender = findExistingSender(m_peerConnection.currentTransceivers(), *senderBackend)) {
             backendFromRTPSender(*sender).takeSource(*senderBackend);
             sender->setTrack(makeRef(track));
             sender->setMediaStreamIds(WTFMove(mediaStreamIds));
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to