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));