Diff
Modified: trunk/Source/WebCore/ChangeLog (235681 => 235682)
--- trunk/Source/WebCore/ChangeLog 2018-09-05 18:52:34 UTC (rev 235681)
+++ trunk/Source/WebCore/ChangeLog 2018-09-05 18:54:54 UTC (rev 235682)
@@ -1,3 +1,25 @@
+2018-09-05 Youenn Fablet <[email protected]>
+
+ Move replaceTrack logic to LibWebRTCPeerConnectionBackend
+ https://bugs.webkit.org/show_bug.cgi?id=189281
+
+ Reviewed by Eric Carlson.
+
+ Move replaceTrack handling code from RTCPeerConnection to LibWebRTCPeerConnectionBackend.
+ This makes the logic easier to understand.
+ Future refactoring will further try to put more handling in RTCRtpSenderBackend.
+ No change of behavior.
+
+ * Modules/mediastream/RTCPeerConnection.cpp:
+ * Modules/mediastream/RTCPeerConnection.h:
+ * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp:
+ (WebCore::tryUpdatingTrackSource):
+ (WebCore::LibWebRTCPeerConnectionBackend::replaceTrack):
+ (WebCore::LibWebRTCPeerConnectionBackend::enqueueReplaceTrackTask):
+ * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h:
+ * Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp:
+ (WebCore::LibWebRTCRtpSenderBackend::replaceTrack):
+
2018-09-05 Zalan Bujtas <[email protected]>
[LFC] LayoutContext::displayBoxForLayoutBox() should return a Display::Box&
Modified: trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp (235681 => 235682)
--- trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp 2018-09-05 18:52:34 UTC (rev 235681)
+++ trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp 2018-09-05 18:54:54 UTC (rev 235682)
@@ -530,26 +530,6 @@
dispatchEvent(event);
}
-void RTCPeerConnection::enqueueReplaceTrackTask(RTCRtpSender& sender, RefPtr<MediaStreamTrack>&& withTrack, DOMPromiseDeferred<void>&& promise)
-{
- scriptExecutionContext()->postTask([protectedThis = makeRef(*this), protectedSender = makeRef(sender), promise = WTFMove(promise), withTrack = WTFMove(withTrack)](ScriptExecutionContext&) mutable {
- if (protectedThis->isClosed())
- return;
-
- if (!withTrack) {
- protectedSender->setTrackToNull();
- promise.resolve();
- return;
- }
-
- bool hasTrack = protectedSender->track();
- protectedSender->setTrack(withTrack.releaseNonNull());
- if (!hasTrack)
- protectedThis->m_backend->addTrack(protectedSender.ptr(), *protectedSender->track(), { });
- promise.resolve();
- });
-}
-
void RTCPeerConnection::dispatchEvent(Event& event)
{
DEBUG_LOG(LOGIDENTIFIER, "dispatching '", event.type(), "'");
Modified: trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h (235681 => 235682)
--- trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h 2018-09-05 18:52:34 UTC (rev 235681)
+++ trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.h 2018-09-05 18:54:54 UTC (rev 235682)
@@ -150,8 +150,6 @@
void disableICECandidateFiltering() { m_backend->disableICECandidateFiltering(); }
void enableICECandidateFiltering() { m_backend->enableICECandidateFiltering(); }
- void enqueueReplaceTrackTask(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&);
-
void clearController() { m_controller = nullptr; }
// ActiveDOMObject.
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp (235681 => 235682)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp 2018-09-05 18:52:34 UTC (rev 235681)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp 2018-09-05 18:54:54 UTC (rev 235682)
@@ -408,47 +408,69 @@
return source->setSource(track->privateTrack());
}
+template<typename Source>
+static inline bool tryUpdatingTrackSource(MediaStreamTrack& currentTrack, MediaStreamTrack* newTrack, const Vector<Source>& sources)
+{
+ for (auto& source : sources) {
+ if (&source->source() == ¤tTrack.privateTrack()) {
+ if (!updateTrackSource(source, newTrack))
+ return false;
+ return true;
+ }
+ }
+ return false;
+}
+
void LibWebRTCPeerConnectionBackend::replaceTrack(RTCRtpSender& sender, RefPtr<MediaStreamTrack>&& track, DOMPromiseDeferred<void>&& promise)
{
- ASSERT(sender.track());
-
auto* currentTrack = sender.track();
- ASSERT(!track || currentTrack->source().type() == track->source().type());
- switch (currentTrack->source().type()) {
- case RealtimeMediaSource::Type::None:
- ASSERT_NOT_REACHED();
- promise.reject(InvalidModificationError);
- break;
- case RealtimeMediaSource::Type::Audio: {
- for (auto& audioSource : m_audioSources) {
- if (&audioSource->source() == ¤tTrack->privateTrack()) {
- if (!updateTrackSource(audioSource, track.get())) {
- promise.reject(InvalidModificationError);
- return;
- }
- connection().enqueueReplaceTrackTask(sender, WTFMove(track), WTFMove(promise));
+ 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 (!tryUpdatingTrackSource(*currentTrack, track.get(), m_audioSources)) {
+ promise.reject(InvalidModificationError);
return;
}
+ break;
+ case RealtimeMediaSource::Type::Video:
+ if (!tryUpdatingTrackSource(*currentTrack, track.get(), m_videoSources)) {
+ promise.reject(InvalidModificationError);
+ return;
+ }
+ break;
}
- promise.reject(InvalidModificationError);
- break;
}
- case RealtimeMediaSource::Type::Video: {
- for (auto& videoSource : m_videoSources) {
- if (&videoSource->source() == ¤tTrack->privateTrack()) {
- if (!updateTrackSource(videoSource, track.get())) {
- promise.reject(InvalidModificationError);
- return;
- }
- connection().enqueueReplaceTrackTask(sender, WTFMove(track), WTFMove(promise));
+ 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.reject(InvalidModificationError);
- break;
- }
- }
+ promise.resolve();
+ });
}
void LibWebRTCPeerConnectionBackend::applyRotationForOutgoingVideoSources()
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h (235681 => 235682)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h 2018-09-05 18:52:34 UTC (rev 235681)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h 2018-09-05 18:54:54 UTC (rev 235682)
@@ -112,6 +112,8 @@
Ref<RTCRtpTransceiver> completeAddTransceiver(Ref<RTCRtpSender>&&, const RTCRtpTransceiverInit&, const String& trackId, const String& trackKind);
+ void enqueueReplaceTrackTask(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, DOMPromiseDeferred<void>&&);
+
Ref<LibWebRTCMediaEndpoint> m_endpoint;
bool m_isLocalDescriptionSet { false };
bool m_isRemoteDescriptionSet { false };
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp (235681 => 235682)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp 2018-09-05 18:52:34 UTC (rev 235681)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp 2018-09-05 18:54:54 UTC (rev 235682)
@@ -41,11 +41,6 @@
return;
}
- if (!sender.track() && track) {
- m_peerConnectionBackend->connection().enqueueReplaceTrackTask(sender, track.releaseNonNull(), WTFMove(promise));
- return;
- }
-
m_peerConnectionBackend->replaceTrack(sender, WTFMove(track), WTFMove(promise));
}
Modified: trunk/Source/WebCore/css/FontFaceSet.h (235681 => 235682)
--- trunk/Source/WebCore/css/FontFaceSet.h 2018-09-05 18:52:34 UTC (rev 235681)
+++ trunk/Source/WebCore/css/FontFaceSet.h 2018-09-05 18:54:54 UTC (rev 235682)
@@ -35,7 +35,7 @@
class DOMException;
-class FontFaceSet final : public RefCounted<FontFaceSet>, private CSSFontFaceSetClient, public EventTargetWithInlineData, private ActiveDOMObject {
+class FontFaceSet final : public RefCounted<FontFaceSet>, private CSSFontFaceSetClient, public EventTargetWithInlineData, private ActiveDOMObject {
public:
static Ref<FontFaceSet> create(Document&, const Vector<RefPtr<FontFace>>& initialFaces);
static Ref<FontFaceSet> create(Document&, CSSFontFaceSet& backing);