Diff
Modified: branches/safari-609-branch/LayoutTests/ChangeLog (261531 => 261532)
--- branches/safari-609-branch/LayoutTests/ChangeLog 2020-05-12 00:30:39 UTC (rev 261531)
+++ branches/safari-609-branch/LayoutTests/ChangeLog 2020-05-12 00:34:35 UTC (rev 261532)
@@ -1,3 +1,16 @@
+2020-05-11 Russell Epstein <repst...@apple.com>
+
+ Apply patch. rdar://problem/62978903
+
+ 2020-05-11 Youenn Fablet <you...@apple.com>
+
+ MediaPlayerPrivateMediaStreamAVFObjC should unobserve the tracks from its audio and video track sets
+ https://bugs.webkit.org/show_bug.cgi?id=211444
+ <rdar://problem/62886221>
+
+ * fast/mediastream/MediaStream-removeTrack-while-playing-expected.txt: Added.
+ * fast/mediastream/MediaStream-removeTrack-while-playing.html: Added.
+
2020-05-11 Alan Coon <alanc...@apple.com>
Cherry-pick r260979. rdar://problem/62978869
Added: branches/safari-609-branch/LayoutTests/fast/mediastream/MediaStream-removeTrack-while-playing-expected.txt (0 => 261532)
--- branches/safari-609-branch/LayoutTests/fast/mediastream/MediaStream-removeTrack-while-playing-expected.txt (rev 0)
+++ branches/safari-609-branch/LayoutTests/fast/mediastream/MediaStream-removeTrack-while-playing-expected.txt 2020-05-12 00:34:35 UTC (rev 261532)
@@ -0,0 +1,4 @@
+
+
+PASS removeTrack while playing
+
Added: branches/safari-609-branch/LayoutTests/fast/mediastream/MediaStream-removeTrack-while-playing.html (0 => 261532)
--- branches/safari-609-branch/LayoutTests/fast/mediastream/MediaStream-removeTrack-while-playing.html (rev 0)
+++ branches/safari-609-branch/LayoutTests/fast/mediastream/MediaStream-removeTrack-while-playing.html 2020-05-12 00:34:35 UTC (rev 261532)
@@ -0,0 +1,30 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <title>Testing addTrack/removeTrack while playing</title>
+ <script src=""
+ <script src=""
+ </head>
+ <body>
+ <video id="video" autoplay playsInline></video>
+ <script>
+promise_test(async (test) => {
+ const localStream = await navigator.mediaDevices.getUserMedia({audio: true, video: true});
+ const audioTrack = localStream.getAudioTracks()[0];
+ const videoTrack = localStream.getVideoTracks()[0];
+
+ video.srcObject = localStream;
+ await video.play();
+ localStream._onremovetrack_ = () => { video.srcObject = null; };
+
+ if (window.internals) {
+ internals.removeMediaStreamTrackAndNotify(localStream, videoTrack);
+ internals.removeMediaStreamTrackAndNotify(localStream, audioTrack);
+ }
+ audioTrack.stop();
+ videoTrack.stop();
+}, "removeTrack while playing");
+ </script>
+ </body>
+</html>
Modified: branches/safari-609-branch/Source/WebCore/ChangeLog (261531 => 261532)
--- branches/safari-609-branch/Source/WebCore/ChangeLog 2020-05-12 00:30:39 UTC (rev 261531)
+++ branches/safari-609-branch/Source/WebCore/ChangeLog 2020-05-12 00:34:35 UTC (rev 261532)
@@ -1,3 +1,24 @@
+2020-05-11 Russell Epstein <repst...@apple.com>
+
+ Apply patch. rdar://problem/62978903
+
+ 2020-05-11 Youenn Fablet <you...@apple.com>
+
+ MediaPlayerPrivateMediaStreamAVFObjC should unobserve the tracks from its audio and video track sets
+ https://bugs.webkit.org/show_bug.cgi?id=211444
+ <rdar://problem/62886221>
+
+ Test: fast/mediastream/MediaStream-removeTrack-while-playing.html
+
+ * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
+ (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::~MediaPlayerPrivateMediaStreamAVFObjC):
+ We keep maps of audio and video tracks we are observing.
+ Use these two maps to properly unobserve all tracks at destruction time.
+ While this is not strictly needed since we are using weak pointers, this helps keeping the code healthy.
+ * platform/mediastream/MediaStreamTrackPrivate.cpp:
+ (WebCore::MediaStreamTrackPrivate::forEachObserver):
+ Add a debug ASSERT so that we ensure add/remove observers is done properly.
+
2020-05-11 Alan Coon <alanc...@apple.com>
Cherry-pick r258991. rdar://problem/62978907
Modified: branches/safari-609-branch/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm (261531 => 261532)
--- branches/safari-609-branch/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm 2020-05-12 00:30:39 UTC (rev 261531)
+++ branches/safari-609-branch/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm 2020-05-12 00:34:35 UTC (rev 261532)
@@ -202,8 +202,10 @@
if (m_mediaStreamPrivate) {
m_mediaStreamPrivate->removeObserver(*this);
- for (auto& track : m_mediaStreamPrivate->tracks())
- track->removeObserver(*this);
+ for (auto& track : m_audioTrackMap.values())
+ track->streamTrack().removeObserver(*this);
+ for (auto& track : m_videoTrackMap.values())
+ track->streamTrack().removeObserver(*this);
}
destroyLayers();
@@ -912,8 +914,9 @@
}
}
-void MediaPlayerPrivateMediaStreamAVFObjC::readyStateChanged(MediaStreamTrackPrivate&)
+void MediaPlayerPrivateMediaStreamAVFObjC::readyStateChanged(MediaStreamTrackPrivate& privateStream)
{
+ ASSERT(m_mediaStreamPrivate);
scheduleDeferredTask([this] {
updateReadyState();
});
Modified: branches/safari-609-branch/Source/WebCore/platform/mediastream/MediaStreamPrivate.h (261531 => 261532)
--- branches/safari-609-branch/Source/WebCore/platform/mediastream/MediaStreamPrivate.h 2020-05-12 00:30:39 UTC (rev 261531)
+++ branches/safari-609-branch/Source/WebCore/platform/mediastream/MediaStreamPrivate.h 2020-05-12 00:34:35 UTC (rev 261532)
@@ -88,7 +88,7 @@
void updateActiveState(NotifyClientOption);
void addTrack(RefPtr<MediaStreamTrackPrivate>&&, NotifyClientOption = NotifyClientOption::Notify);
- void removeTrack(MediaStreamTrackPrivate&, NotifyClientOption = NotifyClientOption::Notify);
+ WEBCORE_EXPORT void removeTrack(MediaStreamTrackPrivate&, NotifyClientOption = NotifyClientOption::Notify);
void startProducingData();
void stopProducingData();
Modified: branches/safari-609-branch/Source/WebCore/testing/Internals.cpp (261531 => 261532)
--- branches/safari-609-branch/Source/WebCore/testing/Internals.cpp 2020-05-12 00:30:39 UTC (rev 261531)
+++ branches/safari-609-branch/Source/WebCore/testing/Internals.cpp 2020-05-12 00:34:35 UTC (rev 261532)
@@ -4918,6 +4918,11 @@
track.source().setMuted(muted);
}
+void Internals::removeMediaStreamTrackAndNotify(MediaStream& stream, MediaStreamTrack& track)
+{
+ stream.privateStream().removeTrack(track.privateTrack());
+}
+
void Internals::removeMediaStreamTrack(MediaStream& stream, MediaStreamTrack& track)
{
stream.internalRemoveTrack(track.id(), MediaStream::StreamModifier::Platform);
Modified: branches/safari-609-branch/Source/WebCore/testing/Internals.h (261531 => 261532)
--- branches/safari-609-branch/Source/WebCore/testing/Internals.h 2020-05-12 00:30:39 UTC (rev 261531)
+++ branches/safari-609-branch/Source/WebCore/testing/Internals.h 2020-05-12 00:34:35 UTC (rev 261532)
@@ -746,6 +746,7 @@
void delayMediaStreamTrackSamples(MediaStreamTrack&, float);
void setMediaStreamTrackMuted(MediaStreamTrack&, bool);
void removeMediaStreamTrack(MediaStream&, MediaStreamTrack&);
+ void removeMediaStreamTrackAndNotify(MediaStream&, MediaStreamTrack&);
void simulateMediaStreamTrackCaptureSourceFailure(MediaStreamTrack&);
void setMediaStreamTrackIdentifier(MediaStreamTrack&, String&& id);
void setMediaStreamSourceInterrupted(MediaStreamTrack&, bool);
Modified: branches/safari-609-branch/Source/WebCore/testing/Internals.idl (261531 => 261532)
--- branches/safari-609-branch/Source/WebCore/testing/Internals.idl 2020-05-12 00:30:39 UTC (rev 261531)
+++ branches/safari-609-branch/Source/WebCore/testing/Internals.idl 2020-05-12 00:34:35 UTC (rev 261532)
@@ -723,6 +723,7 @@
[Conditional=MEDIA_STREAM] void delayMediaStreamTrackSamples(MediaStreamTrack track, float delay);
[Conditional=MEDIA_STREAM] void setMediaStreamTrackMuted(MediaStreamTrack track, boolean muted);
[Conditional=MEDIA_STREAM] void removeMediaStreamTrack(MediaStream stream, MediaStreamTrack track);
+ [Conditional=MEDIA_STREAM] void removeMediaStreamTrackAndNotify(MediaStream stream, MediaStreamTrack track);
[Conditional=MEDIA_STREAM] void simulateMediaStreamTrackCaptureSourceFailure(MediaStreamTrack track);
[Conditional=MEDIA_STREAM] void setMediaStreamTrackIdentifier(MediaStreamTrack track, DOMString identifier);
[Conditional=MEDIA_STREAM] void setMediaStreamSourceInterrupted(MediaStreamTrack track, boolean interrupted);