Diff
Modified: trunk/Source/WebCore/ChangeLog (235756 => 235757)
--- trunk/Source/WebCore/ChangeLog 2018-09-06 21:09:14 UTC (rev 235756)
+++ trunk/Source/WebCore/ChangeLog 2018-09-06 21:14:07 UTC (rev 235757)
@@ -1,3 +1,28 @@
+2018-09-06 Youenn Fablet <you...@apple.com>
+
+ Move replaceTrack logic to RTCRtpSender backend
+ https://bugs.webkit.org/show_bug.cgi?id=189359
+
+ Reviewed by Eric Carlson.
+
+ Move replaceTrack handling from LibWebRTCPeerConnectionBackend to LibWebRTCRtpSenderBackend.
+ This will allow using SetTrack when fully implementing unified plan.
+ No change of behavior.
+
+ * Modules/mediastream/RTCRtpSender.cpp:
+ (WebCore::RTCRtpSender::replaceTrack):
+ * Modules/mediastream/RTCRtpSender.h:
+ * Modules/mediastream/RTCRtpSender.idl:
+ * Modules/mediastream/RTCRtpSenderBackend.h:
+ * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp:
+ (WebCore::LibWebRTCPeerConnectionBackend::replaceTrack): Deleted.
+ (WebCore::LibWebRTCPeerConnectionBackend::enqueueReplaceTrackTask): Deleted.
+ * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h:
+ * Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp:
+ (WebCore::updateTrackSource):
+ (WebCore::LibWebRTCRtpSenderBackend::replaceTrack):
+ * Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h:
+
2018-09-06 Andy Estes <aes...@apple.com>
[Apple Pay] Rename the -apple-pay-button-type value "checkout" to "check-out"
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp (235756 => 235757)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp 2018-09-06 21:09:14 UTC (rev 235756)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp 2018-09-06 21:14:07 UTC (rev 235757)
@@ -77,7 +77,7 @@
m_track = WTFMove(track);
}
-void RTCRtpSender::replaceTrack(RefPtr<MediaStreamTrack>&& withTrack, DOMPromiseDeferred<void>&& promise)
+void RTCRtpSender::replaceTrack(ScriptExecutionContext& context, RefPtr<MediaStreamTrack>&& withTrack, DOMPromiseDeferred<void>&& promise)
{
if (isStopped()) {
promise.reject(InvalidStateError);
@@ -89,7 +89,7 @@
return;
}
- m_backend->replaceTrack(*this, WTFMove(withTrack), WTFMove(promise));
+ m_backend->replaceTrack(context, *this, WTFMove(withTrack), WTFMove(promise));
}
RTCRtpParameters RTCRtpSender::getParameters()
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h (235756 => 235757)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h 2018-09-06 21:09:14 UTC (rev 235756)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h 2018-09-06 21:14:07 UTC (rev 235757)
@@ -54,7 +54,7 @@
void setTrack(Ref<MediaStreamTrack>&&);
void setTrackToNull();
- void replaceTrack(RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&);
+ void replaceTrack(ScriptExecutionContext&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&);
RTCRtpParameters getParameters();
void setParameters(const RTCRtpParameters&, DOMPromiseDeferred<void>&&);
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.idl (235756 => 235757)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.idl 2018-09-06 21:09:14 UTC (rev 235756)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.idl 2018-09-06 21:14:07 UTC (rev 235757)
@@ -40,5 +40,5 @@
// FIXME 169662: missing setStreams
RTCRtpParameters getParameters();
Promise<void> setParameters(RTCRtpParameters parameters);
- Promise<void> replaceTrack(MediaStreamTrack? withTrack);
+ [CallWith=ScriptExecutionContext] Promise<void> replaceTrack(MediaStreamTrack? withTrack);
};
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpSenderBackend.h (235756 => 235757)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpSenderBackend.h 2018-09-06 21:09:14 UTC (rev 235756)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpSenderBackend.h 2018-09-06 21:14:07 UTC (rev 235757)
@@ -33,10 +33,11 @@
class MediaStreamTrack;
class RTCRtpSender;
+class ScriptExecutionContext;
class RTCRtpSenderBackend {
public:
- virtual void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&) = 0;
+ virtual void replaceTrack(ScriptExecutionContext&, RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&) = 0;
virtual RTCRtpParameters getParameters() const = 0;
virtual void setParameters(const RTCRtpParameters&, DOMPromiseDeferred<void>&&) = 0;
virtual ~RTCRtpSenderBackend() = default;
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp (235756 => 235757)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp 2018-09-06 21:09:14 UTC (rev 235756)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp 2018-09-06 21:14:07 UTC (rev 235757)
@@ -383,58 +383,6 @@
return source.setSource(track->privateTrack());
}
-void LibWebRTCPeerConnectionBackend::replaceTrack(RTCRtpSender& sender, RefPtr<MediaStreamTrack>&& track, DOMPromiseDeferred<void>&& promise)
-{
- auto* currentTrack = sender.track();
-
- ASSERT(!track || !currentTrack || currentTrack->source().type() == track->source().type());
- if (currentTrack) {
- switch (currentTrack->source().type()) {
- case RealtimeMediaSource::Type::None:
- ASSERT_NOT_REACHED();
- promise.reject(InvalidModificationError);
- break;
- case RealtimeMediaSource::Type::Audio:
- if (!updateTrackSource(*backendFromRTPSender(sender).audioSource(), track.get())) {
- promise.reject(InvalidModificationError);
- return;
- }
- break;
- case RealtimeMediaSource::Type::Video:
- if (!updateTrackSource(*backendFromRTPSender(sender).videoSource(), track.get())) {
- promise.reject(InvalidModificationError);
- return;
- }
- break;
- }
- }
- enqueueReplaceTrackTask(sender, WTFMove(track), WTFMove(promise));
-}
-
-void LibWebRTCPeerConnectionBackend::enqueueReplaceTrackTask(RTCRtpSender& sender, RefPtr<MediaStreamTrack>&& withTrack, DOMPromiseDeferred<void>&& promise)
-{
- m_peerConnection.scriptExecutionContext()->postTask([protectedConnection = makeRef(m_peerConnection), protectedSender = makeRef(sender), promise = WTFMove(promise), withTrack = WTFMove(withTrack), this](ScriptExecutionContext&) mutable {
- if (protectedConnection->isClosed())
- return;
-
- if (!withTrack) {
- protectedSender->setTrackToNull();
- promise.resolve();
- return;
- }
-
- bool hasTrack = protectedSender->track();
- protectedSender->setTrack(withTrack.releaseNonNull());
- if (!hasTrack) {
- if (!m_endpoint->addTrack(backendFromRTPSender(protectedSender), *protectedSender->track(), { })) {
- promise.reject(Exception { TypeError, "Unable to add track"_s });
- return;
- }
- }
- promise.resolve();
- });
-}
-
void LibWebRTCPeerConnectionBackend::applyRotationForOutgoingVideoSources()
{
for (auto& transceiver : m_peerConnection.getTransceivers()) {
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h (235756 => 235757)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h 2018-09-06 21:09:14 UTC (rev 235756)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h 2018-09-06 21:14:07 UTC (rev 235757)
@@ -106,7 +106,6 @@
Ref<RTCRtpTransceiver> completeAddTransceiver(Ref<RTCRtpSender>&&, const RTCRtpTransceiverInit&, const String& trackId, const String& trackKind);
- void enqueueReplaceTrackTask(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&);
Ref<RTCRtpReceiver> createReceiver(const String& trackKind, const String& trackId);
Ref<LibWebRTCMediaEndpoint> m_endpoint;
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp (235756 => 235757)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp 2018-09-06 21:09:14 UTC (rev 235756)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp 2018-09-06 21:14:07 UTC (rev 235757)
@@ -31,17 +31,73 @@
#include "LibWebRTCUtils.h"
#include "RTCPeerConnection.h"
#include "RTCRtpSender.h"
+#include "ScriptExecutionContext.h"
namespace WebCore {
-void LibWebRTCRtpSenderBackend::replaceTrack(RTCRtpSender& sender, RefPtr<MediaStreamTrack>&& track, DOMPromiseDeferred<void>&& promise)
+template<typename Source>
+static inline bool updateTrackSource(Source& source, MediaStreamTrack* track)
{
+ if (!track) {
+ source.stop();
+ return true;
+ }
+ return source.setSource(track->privateTrack());
+}
+
+void LibWebRTCRtpSenderBackend::replaceTrack(ScriptExecutionContext& context, RTCRtpSender& sender, RefPtr<MediaStreamTrack>&& track, DOMPromiseDeferred<void>&& promise)
+{
if (!m_peerConnectionBackend) {
promise.reject(Exception { InvalidStateError, "No WebRTC backend"_s });
return;
}
- m_peerConnectionBackend->replaceTrack(sender, WTFMove(track), WTFMove(promise));
+ auto* currentTrack = sender.track();
+
+ ASSERT(!track || !currentTrack || currentTrack->source().type() == track->source().type());
+ if (currentTrack) {
+ switch (currentTrack->source().type()) {
+ case RealtimeMediaSource::Type::None:
+ ASSERT_NOT_REACHED();
+ promise.reject(InvalidModificationError);
+ break;
+ case RealtimeMediaSource::Type::Audio:
+ if (!updateTrackSource(*audioSource(), track.get())) {
+ promise.reject(InvalidModificationError);
+ return;
+ }
+ break;
+ case RealtimeMediaSource::Type::Video:
+ if (!updateTrackSource(*videoSource(), track.get())) {
+ promise.reject(InvalidModificationError);
+ return;
+ }
+ break;
+ }
+ }
+
+ context.postTask([protectedSender = makeRef(sender), promise = WTFMove(promise), track = WTFMove(track), this](ScriptExecutionContext&) mutable {
+ if (protectedSender->isStopped())
+ return;
+
+ if (!track) {
+ protectedSender->setTrackToNull();
+ promise.resolve();
+ return;
+ }
+
+ bool hasTrack = protectedSender->track();
+ protectedSender->setTrack(track.releaseNonNull());
+ if (!hasTrack) {
+ // FIXME: In case of unified plan, we should use m_rtcSender->SetTrack and no longer need m_peerConnectionBackend.
+ auto result = m_peerConnectionBackend->addTrack(protectedSender.ptr(), *protectedSender->track(), { });
+ if (result.hasException()) {
+ promise.reject(result.releaseException());
+ return;
+ }
+ }
+ promise.resolve();
+ });
}
RTCRtpParameters LibWebRTCRtpSenderBackend::getParameters() const
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h (235756 => 235757)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h 2018-09-06 21:09:14 UTC (rev 235756)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h 2018-09-06 21:14:07 UTC (rev 235757)
@@ -92,7 +92,7 @@
}
private:
- void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&) final;
+ void replaceTrack(ScriptExecutionContext&, RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&) final;
RTCRtpParameters getParameters() const final;
void setParameters(const RTCRtpParameters&, DOMPromiseDeferred<void>&&) final;