Title: [260379] trunk/Source/WebCore
Revision
260379
Author
[email protected]
Date
2020-04-20 11:14:37 -0700 (Mon, 20 Apr 2020)

Log Message

Use a WeakHashSet to store MediaStreamPrivate observers
https://bugs.webkit.org/show_bug.cgi?id=210494

Reviewed by Eric Carlson.

Remove observers from the MediaStream and migrate existing client (MediaRecorder) to MediaStreamPrivate::Observer.
Make use of WeakHashSet in MediaStreamPrivate to improve robustness of the code.
Any time the MediaStreamPrivate tracks are modified, observers will be notified.
MediaStream needs now to decide when to send an event when its MediaStreamPrivate notifies of new/deleted tracks,
Modernize a bit the code to use more references.
Covered by existing tests.

* Modules/mediarecorder/MediaRecorder.cpp:
(WebCore::MediaRecorder::MediaRecorder):
(WebCore::MediaRecorder::~MediaRecorder):
(WebCore::MediaRecorder::handleTrackChange):
* Modules/mediarecorder/MediaRecorder.h:
* Modules/mediastream/MediaStream.cpp:
(WebCore::createTrackPrivateVector):
(WebCore::MediaStream::MediaStream):
(WebCore::MediaStream::~MediaStream):
(WebCore::MediaStream::addTrack):
(WebCore::MediaStream::removeTrack):
(WebCore::MediaStream::getTrackById):
(WebCore::MediaStream::didAddTrack):
(WebCore::MediaStream::didRemoveTrack):
(WebCore::MediaStream::addTrackFromPlatform):
(WebCore::MediaStream::internalAddTrack):
(WebCore::MediaStream::internalTakeTrack):
* Modules/mediastream/MediaStream.h:
* Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp:
(WebCore::LibWebRTCMediaEndpoint::removeRemoteTrack):
* platform/mediastream/MediaStreamPrivate.cpp:
(WebCore::MediaStreamPrivate::MediaStreamPrivate):
(WebCore::MediaStreamPrivate::addObserver):
(WebCore::MediaStreamPrivate::removeObserver):
(WebCore::MediaStreamPrivate::forEachObserver):
(WebCore::MediaStreamPrivate::computeActiveState):
(WebCore::MediaStreamPrivate::updateActiveState):
(WebCore::MediaStreamPrivate::addTrack):
(WebCore::MediaStreamPrivate::removeTrack):
(WebCore::MediaStreamPrivate::trackEnded):
* platform/mediastream/MediaStreamPrivate.h:
* testing/Internals.cpp:
(WebCore::Internals::removeMediaStreamTrack):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (260378 => 260379)


--- trunk/Source/WebCore/ChangeLog	2020-04-20 18:11:24 UTC (rev 260378)
+++ trunk/Source/WebCore/ChangeLog	2020-04-20 18:14:37 UTC (rev 260379)
@@ -1,3 +1,51 @@
+2020-04-20  Youenn Fablet  <[email protected]>
+
+        Use a WeakHashSet to store MediaStreamPrivate observers
+        https://bugs.webkit.org/show_bug.cgi?id=210494
+
+        Reviewed by Eric Carlson.
+
+        Remove observers from the MediaStream and migrate existing client (MediaRecorder) to MediaStreamPrivate::Observer.
+        Make use of WeakHashSet in MediaStreamPrivate to improve robustness of the code.
+        Any time the MediaStreamPrivate tracks are modified, observers will be notified.
+        MediaStream needs now to decide when to send an event when its MediaStreamPrivate notifies of new/deleted tracks,
+        Modernize a bit the code to use more references.
+        Covered by existing tests.
+
+        * Modules/mediarecorder/MediaRecorder.cpp:
+        (WebCore::MediaRecorder::MediaRecorder):
+        (WebCore::MediaRecorder::~MediaRecorder):
+        (WebCore::MediaRecorder::handleTrackChange):
+        * Modules/mediarecorder/MediaRecorder.h:
+        * Modules/mediastream/MediaStream.cpp:
+        (WebCore::createTrackPrivateVector):
+        (WebCore::MediaStream::MediaStream):
+        (WebCore::MediaStream::~MediaStream):
+        (WebCore::MediaStream::addTrack):
+        (WebCore::MediaStream::removeTrack):
+        (WebCore::MediaStream::getTrackById):
+        (WebCore::MediaStream::didAddTrack):
+        (WebCore::MediaStream::didRemoveTrack):
+        (WebCore::MediaStream::addTrackFromPlatform):
+        (WebCore::MediaStream::internalAddTrack):
+        (WebCore::MediaStream::internalTakeTrack):
+        * Modules/mediastream/MediaStream.h:
+        * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp:
+        (WebCore::LibWebRTCMediaEndpoint::removeRemoteTrack):
+        * platform/mediastream/MediaStreamPrivate.cpp:
+        (WebCore::MediaStreamPrivate::MediaStreamPrivate):
+        (WebCore::MediaStreamPrivate::addObserver):
+        (WebCore::MediaStreamPrivate::removeObserver):
+        (WebCore::MediaStreamPrivate::forEachObserver):
+        (WebCore::MediaStreamPrivate::computeActiveState):
+        (WebCore::MediaStreamPrivate::updateActiveState):
+        (WebCore::MediaStreamPrivate::addTrack):
+        (WebCore::MediaStreamPrivate::removeTrack):
+        (WebCore::MediaStreamPrivate::trackEnded):
+        * platform/mediastream/MediaStreamPrivate.h:
+        * testing/Internals.cpp:
+        (WebCore::Internals::removeMediaStreamTrack):
+
 2020-04-19  Simon Fraser  <[email protected]>
 
         Content disappears on CSS parallax example

Modified: trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.cpp (260378 => 260379)


--- trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.cpp	2020-04-20 18:11:24 UTC (rev 260378)
+++ trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.cpp	2020-04-20 18:14:37 UTC (rev 260379)
@@ -91,12 +91,12 @@
     m_tracks = WTF::map(m_stream->getTracks(), [] (auto&& track) -> Ref<MediaStreamTrackPrivate> {
         return track->privateTrack();
     });
-    m_stream->addObserver(this);
+    m_stream->privateStream().addObserver(*this);
 }
 
 MediaRecorder::~MediaRecorder()
 {
-    m_stream->removeObserver(this);
+    m_stream->privateStream().removeObserver(*this);
     stopRecordingInternal();
 }
 
@@ -194,7 +194,7 @@
     m_private->stopRecording();
 }
 
-void MediaRecorder::didAddOrRemoveTrack()
+void MediaRecorder::handleTrackChange()
 {
     queueTaskKeepingObjectAlive(*this, TaskSource::Networking, [this] {
         if (!m_isActive || state() == RecordingState::Inactive)

Modified: trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.h (260378 => 260379)


--- trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.h	2020-04-20 18:11:24 UTC (rev 260378)
+++ trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.h	2020-04-20 18:14:37 UTC (rev 260379)
@@ -42,7 +42,7 @@
     : public ActiveDOMObject
     , public RefCounted<MediaRecorder>
     , public EventTargetWithInlineData
-    , private MediaStream::Observer
+    , private MediaStreamPrivate::Observer
     , private MediaStreamTrackPrivate::Observer {
     WTF_MAKE_ISO_ALLOCATED(MediaRecorder);
 public:
@@ -98,8 +98,11 @@
     void dispatchError(Exception&&);
 
     // MediaStream::Observer
-    void didAddOrRemoveTrack() final;
-    
+    void didAddTrack(MediaStreamTrackPrivate&) final { handleTrackChange(); }
+    void didRemoveTrack(MediaStreamTrackPrivate&) final { handleTrackChange(); }
+
+    void handleTrackChange();
+
     // MediaStreamTrackPrivate::Observer
     void trackEnded(MediaStreamTrackPrivate&) final;
     void trackMutedChanged(MediaStreamTrackPrivate&) final { };

Modified: trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp (260378 => 260379)


--- trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp	2020-04-20 18:11:24 UTC (rev 260378)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStream.cpp	2020-04-20 18:14:37 UTC (rev 260379)
@@ -33,15 +33,11 @@
 #include "Document.h"
 #include "Event.h"
 #include "EventNames.h"
-#include "Frame.h"
-#include "FrameLoader.h"
 #include "Logging.h"
 #include "MediaStreamTrackEvent.h"
-#include "NetworkingContext.h"
 #include "Page.h"
 #include "RealtimeMediaSource.h"
 #include <wtf/IsoMallocInlines.h>
-#include <wtf/URL.h>
 
 namespace WebCore {
 
@@ -69,11 +65,9 @@
 
 static inline MediaStreamTrackPrivateVector createTrackPrivateVector(const MediaStreamTrackVector& tracks)
 {
-    MediaStreamTrackPrivateVector trackPrivates;
-    trackPrivates.reserveCapacity(tracks.size());
-    for (auto& track : tracks)
-        trackPrivates.append(&track->privateTrack());
-    return trackPrivates;
+    return map(tracks, [](auto& track) {
+        return makeRefPtr(&track->privateTrack());
+    });
 }
 
 MediaStream::MediaStream(Document& document, const MediaStreamTrackVector& tracks)
@@ -83,10 +77,8 @@
     // This constructor preserves MediaStreamTrack instances and must be used by calls originating
     // from the _javascript_ MediaStream constructor.
 
-    for (auto& track : tracks) {
-        track->addObserver(*this);
+    for (auto& track : tracks)
         m_trackSet.add(track->id(), track);
-    }
 
     setIsActive(m_private->active());
     m_private->addObserver(*this);
@@ -99,11 +91,8 @@
 {
     ALWAYS_LOG(LOGIDENTIFIER);
 
-    for (auto& trackPrivate : m_private->tracks()) {
-        auto track = MediaStreamTrack::create(document, *trackPrivate);
-        track->addObserver(*this);
-        m_trackSet.add(track->id(), WTFMove(track));
-    }
+    for (auto& trackPrivate : m_private->tracks())
+        m_trackSet.add(trackPrivate->id(), MediaStreamTrack::create(document, *trackPrivate));
 
     setIsActive(m_private->active());
     m_private->addObserver(*this);
@@ -116,9 +105,7 @@
     // mediaState(), are short circuited.
     m_isActive = false;
     m_private->removeObserver(*this);
-    for (auto& track : m_trackSet.values())
-        track->removeObserver(*this);
-    if (Document* document = this->document()) {
+    if (auto* document = this->document()) {
         if (m_isWaitingUntilMediaCanStart)
             document->removeMediaCanStartListener(*this);
     }
@@ -140,30 +127,27 @@
 void MediaStream::addTrack(MediaStreamTrack& track)
 {
     ALWAYS_LOG(LOGIDENTIFIER, track.logIdentifier());
-
-    if (!internalAddTrack(track, StreamModifier::DomAPI))
+    if (getTrackById(track.privateTrack().id()))
         return;
 
-    for (auto& observer : m_observers)
-        observer->didAddOrRemoveTrack();
+    internalAddTrack(track);
+    m_private->addTrack(track.privateTrack());
 }
 
 void MediaStream::removeTrack(MediaStreamTrack& track)
 {
     ALWAYS_LOG(LOGIDENTIFIER, track.logIdentifier());
-
-    if (!internalRemoveTrack(track.id(), StreamModifier::DomAPI))
-        return;
-
-    for (auto& observer : m_observers)
-        observer->didAddOrRemoveTrack();
+    if (auto taken = internalTakeTrack(track.id())) {
+        ASSERT(taken.get() == &track);
+        m_private->removeTrack(track.privateTrack());
+    }
 }
 
 MediaStreamTrack* MediaStream::getTrackById(String id)
 {
-    auto it = m_trackSet.find(id);
-    if (it != m_trackSet.end())
-        return it->value.get();
+    auto iterator = m_trackSet.find(id);
+    if (iterator != m_trackSet.end())
+        return iterator->value.get();
 
     return nullptr;
 }
@@ -183,11 +167,6 @@
     return copyToVector(m_trackSet.values());
 }
 
-void MediaStream::trackDidEnd()
-{
-    m_private->updateActiveState(MediaStreamPrivate::NotifyClientOption::Notify);
-}
-
 void MediaStream::activeStatusChanged()
 {
     updateActiveState();
@@ -199,13 +178,18 @@
     if (!context)
         return;
 
-    if (!getTrackById(trackPrivate.id()))
-        internalAddTrack(MediaStreamTrack::create(*context, trackPrivate), StreamModifier::Platform);
+    if (getTrackById(trackPrivate.id()))
+        return;
+
+    auto track = MediaStreamTrack::create(*context, trackPrivate);
+    internalAddTrack(track.copyRef());
+    dispatchEvent(MediaStreamTrackEvent::create(eventNames().addtrackEvent, Event::CanBubble::No, Event::IsCancelable::No, WTFMove(track)));
 }
 
 void MediaStream::didRemoveTrack(MediaStreamTrackPrivate& trackPrivate)
 {
-    internalRemoveTrack(trackPrivate.id(), StreamModifier::Platform);
+    if (auto track = internalTakeTrack(trackPrivate.id()))
+        dispatchEvent(MediaStreamTrackEvent::create(eventNames().removetrackEvent, Event::CanBubble::No, Event::IsCancelable::No, WTFMove(track)));
 }
 
 void MediaStream::addTrackFromPlatform(Ref<MediaStreamTrack>&& track)
@@ -212,47 +196,26 @@
 {
     ALWAYS_LOG(LOGIDENTIFIER, track->logIdentifier());
 
-    auto* privateTrack = &track->privateTrack();
-    internalAddTrack(WTFMove(track), StreamModifier::Platform);
-    m_private->addTrack(privateTrack, MediaStreamPrivate::NotifyClientOption::Notify);
+    auto& privateTrack = track->privateTrack();
+    internalAddTrack(track.copyRef());
+    m_private->addTrack(privateTrack);
+    dispatchEvent(MediaStreamTrackEvent::create(eventNames().addtrackEvent, Event::CanBubble::No, Event::IsCancelable::No, WTFMove(track)));
 }
 
-bool MediaStream::internalAddTrack(Ref<MediaStreamTrack>&& trackToAdd, StreamModifier streamModifier)
+void MediaStream::internalAddTrack(Ref<MediaStreamTrack>&& trackToAdd)
 {
-    auto result = m_trackSet.add(trackToAdd->id(), WTFMove(trackToAdd));
-    if (!result.isNewEntry)
-        return false;
-
-    ASSERT(result.iterator->value);
-    auto& track = *result.iterator->value;
-    track.addObserver(*this);
-
+    ASSERT(!m_trackSet.contains(trackToAdd->id()));
+    m_trackSet.add(trackToAdd->id(), WTFMove(trackToAdd));
     updateActiveState();
-
-    if (streamModifier == StreamModifier::DomAPI)
-        m_private->addTrack(&track.privateTrack(), MediaStreamPrivate::NotifyClientOption::DontNotify);
-    else
-        dispatchEvent(MediaStreamTrackEvent::create(eventNames().addtrackEvent, Event::CanBubble::No, Event::IsCancelable::No, &track));
-
-    return true;
 }
 
-bool MediaStream::internalRemoveTrack(const String& trackId, StreamModifier streamModifier)
+RefPtr<MediaStreamTrack> MediaStream::internalTakeTrack(const String& trackId)
 {
     auto track = m_trackSet.take(trackId);
-    if (!track)
-        return false;
+    if (track)
+        updateActiveState();
 
-    track->removeObserver(*this);
-
-    updateActiveState();
-
-    if (streamModifier == StreamModifier::DomAPI)
-        m_private->removeTrack(track->privateTrack(), MediaStreamPrivate::NotifyClientOption::DontNotify);
-    else
-        dispatchEvent(MediaStreamTrackEvent::create(eventNames().removetrackEvent, Event::CanBubble::No, Event::IsCancelable::No, WTFMove(track)));
-
-    return true;
+    return track;
 }
 
 void MediaStream::setIsActive(bool active)
@@ -372,19 +335,6 @@
     return tracks;
 }
 
-void MediaStream::addObserver(MediaStream::Observer* observer)
-{
-    if (m_observers.find(observer) == notFound)
-        m_observers.append(observer);
-}
-
-void MediaStream::removeObserver(MediaStream::Observer* observer)
-{
-    size_t pos = m_observers.find(observer);
-    if (pos != notFound)
-        m_observers.remove(pos);
-}
-
 Document* MediaStream::document() const
 {
     return downcast<Document>(scriptExecutionContext());

Modified: trunk/Source/WebCore/Modules/mediastream/MediaStream.h (260378 => 260379)


--- trunk/Source/WebCore/Modules/mediastream/MediaStream.h	2020-04-20 18:11:24 UTC (rev 260378)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStream.h	2020-04-20 18:14:37 UTC (rev 260379)
@@ -40,7 +40,6 @@
 #include "URLRegistry.h"
 #include <wtf/HashMap.h>
 #include <wtf/LoggerHelper.h>
-#include <wtf/RefCounted.h>
 #include <wtf/RefPtr.h>
 
 namespace WebCore {
@@ -50,7 +49,6 @@
 class MediaStream final
     : public EventTargetWithInlineData
     , public ActiveDOMObject
-    , public MediaStreamTrack::Observer
     , public MediaStreamPrivate::Observer
     , private MediaCanStartListener
 #if !RELEASE_LOG_DISABLED
@@ -59,12 +57,6 @@
     , public RefCounted<MediaStream> {
     WTF_MAKE_ISO_ALLOCATED(MediaStream);
 public:
-    class Observer {
-    public:
-        virtual ~Observer() = default;
-        virtual void didAddOrRemoveTrack() = 0;
-    };
-
     static Ref<MediaStream> create(Document&);
     static Ref<MediaStream> create(Document&, MediaStream&);
     static Ref<MediaStream> create(Document&, const MediaStreamTrackVector&);
@@ -98,17 +90,10 @@
     using RefCounted<MediaStream>::ref;
     using RefCounted<MediaStream>::deref;
 
-    void addObserver(Observer*);
-    void removeObserver(Observer*);
-
     void addTrackFromPlatform(Ref<MediaStreamTrack>&&);
 
     Document* document() const;
 
-    enum class StreamModifier { DomAPI, Platform };
-    bool internalAddTrack(Ref<MediaStreamTrack>&&, StreamModifier);
-    WEBCORE_EXPORT bool internalRemoveTrack(const String&, StreamModifier);
-
 protected:
     MediaStream(Document&, const MediaStreamTrackVector&);
     MediaStream(Document&, Ref<MediaStreamPrivate>&&);
@@ -121,14 +106,13 @@
 #endif
 
 private:
+    void internalAddTrack(Ref<MediaStreamTrack>&&);
+    WEBCORE_EXPORT RefPtr<MediaStreamTrack> internalTakeTrack(const String&);
 
     // EventTarget
     void refEventTarget() final { ref(); }
     void derefEventTarget() final { deref(); }
 
-    // MediaStreamTrack::Observer
-    void trackDidEnd() final;
-
     // MediaStreamPrivate::Observer
     void activeStatusChanged() final;
     void didAddTrack(MediaStreamTrackPrivate&) final;
@@ -156,8 +140,6 @@
 
     HashMap<String, RefPtr<MediaStreamTrack>> m_trackSet;
 
-    Vector<Observer*> m_observers;
-
     MediaProducer::MediaStateFlags m_state { MediaProducer::IsNotPlaying };
 
     bool m_isActive { false };

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp (260378 => 260379)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp	2020-04-20 18:11:24 UTC (rev 260378)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp	2020-04-20 18:14:37 UTC (rev 260379)
@@ -417,7 +417,7 @@
 
     for (auto& id : m_remoteStreamsFromRemoteTrack.get(&track)) {
         if (auto stream = m_remoteStreamsById.get(id))
-            stream->privateStream().removeTrack(track.privateTrack(), MediaStreamPrivate::NotifyClientOption::Notify);
+            stream->privateStream().removeTrack(track.privateTrack());
     }
 
     track.source().setMuted(true);

Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp (260378 => 260379)


--- trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp	2020-04-20 18:11:24 UTC (rev 260378)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp	2020-04-20 18:14:37 UTC (rev 260379)
@@ -39,6 +39,7 @@
 #include "GraphicsContext.h"
 #include "IntRect.h"
 #include "Logging.h"
+#include <wtf/Algorithms.h>
 #include <wtf/MainThread.h>
 #include <wtf/RefCounted.h>
 #include <wtf/Vector.h>
@@ -78,8 +79,8 @@
         track->addObserver(*this);
         m_trackSet.add(track->id(), track);
     }
-
-    updateActiveState(NotifyClientOption::DontNotify);
+    m_isActive = computeActiveState();
+    updateActiveVideoTrack();
 }
 
 MediaStreamPrivate::~MediaStreamPrivate()
@@ -88,26 +89,23 @@
         track->removeObserver(*this);
 }
 
-void MediaStreamPrivate::addObserver(MediaStreamPrivate::Observer& observer)
+void MediaStreamPrivate::addObserver(Observer& observer)
 {
-    RELEASE_ASSERT(isMainThread());
-    m_observers.add(&observer);
+    ASSERT(isMainThread());
+    m_observers.add(observer);
 }
 
-void MediaStreamPrivate::removeObserver(MediaStreamPrivate::Observer& observer)
+void MediaStreamPrivate::removeObserver(Observer& observer)
 {
-    RELEASE_ASSERT(isMainThread());
-    m_observers.remove(&observer);
+    ASSERT(isMainThread());
+    m_observers.remove(observer);
 }
 
-void MediaStreamPrivate::forEachObserver(const WTF::Function<void(Observer&)>& apply) const
+void MediaStreamPrivate::forEachObserver(const Function<void(Observer&)>& apply)
 {
-    RELEASE_ASSERT(isMainThread());
-    for (auto* observer : copyToVector(m_observers)) {
-        if (!m_observers.contains(observer))
-            continue;
-        apply(*observer);
-    }
+    ASSERT(isMainThread());
+    auto protectedThis = makeRef(*this);
+    m_observers.forEach(apply);
 }
 
 MediaStreamTrackPrivateVector MediaStreamPrivate::tracks() const
@@ -127,16 +125,15 @@
         callback(*track);
 }
 
-void MediaStreamPrivate::updateActiveState(NotifyClientOption notifyClientOption)
+bool MediaStreamPrivate::computeActiveState()
 {
-    bool newActiveState = false;
-    for (auto& track : m_trackSet.values()) {
-        if (!track->ended()) {
-            newActiveState = true;
-            break;
-        }
-    }
+    return WTF::anyOf(m_trackSet, [](auto& track) { return !track.value->ended(); });
+}
 
+void MediaStreamPrivate::updateActiveState()
+{
+    bool newActiveState = computeActiveState();
+
     updateActiveVideoTrack();
 
     // A stream is active if it has at least one un-ended track.
@@ -145,14 +142,12 @@
 
     m_isActive = newActiveState;
 
-    if (notifyClientOption == NotifyClientOption::Notify) {
-        forEachObserver([](auto& observer) {
-            observer.activeStatusChanged();
-        });
-    }
+    forEachObserver([](auto& observer) {
+        observer.activeStatusChanged();
+    });
 }
 
-void MediaStreamPrivate::addTrack(RefPtr<MediaStreamTrackPrivate>&& track, NotifyClientOption notifyClientOption)
+void MediaStreamPrivate::addTrack(Ref<MediaStreamTrackPrivate>&& track)
 {
     if (m_trackSet.contains(track->id()))
         return;
@@ -159,20 +154,19 @@
 
     ALWAYS_LOG(LOGIDENTIFIER, track->logIdentifier());
 
+    auto& trackRef = track.get();
     track->addObserver(*this);
-    m_trackSet.add(track->id(), track);
+    m_trackSet.add(track->id(), WTFMove(track));
 
-    if (notifyClientOption == NotifyClientOption::Notify) {
-        forEachObserver([&track](auto& observer) {
-            observer.didAddTrack(*track.get());
-        });
-    }
+    forEachObserver([&trackRef](auto& observer) {
+        observer.didAddTrack(trackRef);
+    });
 
-    updateActiveState(notifyClientOption);
+    updateActiveState();
     characteristicsChanged();
 }
 
-void MediaStreamPrivate::removeTrack(MediaStreamTrackPrivate& track, NotifyClientOption notifyClientOption)
+void MediaStreamPrivate::removeTrack(MediaStreamTrackPrivate& track)
 {
     if (!m_trackSet.remove(track.id()))
         return;
@@ -180,13 +174,11 @@
     ALWAYS_LOG(LOGIDENTIFIER, track.logIdentifier());
     track.removeObserver(*this);
 
-    if (notifyClientOption == NotifyClientOption::Notify) {
-        forEachObserver([&track](auto& observer) {
-            observer.didRemoveTrack(track);
-        });
-    }
+    forEachObserver([&track](auto& observer) {
+        observer.didRemoveTrack(track);
+    });
 
-    updateActiveState(NotifyClientOption::Notify);
+    updateActiveState();
     characteristicsChanged();
 }
 
@@ -315,7 +307,7 @@
 #endif
 
     ALWAYS_LOG(LOGIDENTIFIER, track.logIdentifier());
-    updateActiveState(NotifyClientOption::Notify);
+    updateActiveState();
     characteristicsChanged();
 }
 

Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h (260378 => 260379)


--- trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h	2020-04-20 18:11:24 UTC (rev 260378)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h	2020-04-20 18:14:37 UTC (rev 260379)
@@ -44,6 +44,7 @@
 #include <wtf/RefPtr.h>
 #include <wtf/UUID.h>
 #include <wtf/Vector.h>
+#include <wtf/WeakHashSet.h>
 
 namespace WebCore {
 
@@ -58,7 +59,7 @@
 #endif
 {
 public:
-    class Observer {
+    class Observer : public CanMakeWeakPtr<Observer> {
     public:
         virtual ~Observer() = default;
 
@@ -74,8 +75,6 @@
 
     virtual ~MediaStreamPrivate();
 
-    enum class NotifyClientOption { Notify, DontNotify };
-
     void addObserver(Observer&);
     void removeObserver(Observer&);
 
@@ -88,10 +87,10 @@
     MediaStreamTrackPrivate* activeVideoTrack() { return m_activeVideoTrack; }
 
     bool active() const { return m_isActive; }
-    void updateActiveState(NotifyClientOption);
+    void updateActiveState();
 
-    void addTrack(RefPtr<MediaStreamTrackPrivate>&&, NotifyClientOption = NotifyClientOption::Notify);
-    void removeTrack(MediaStreamTrackPrivate&, NotifyClientOption = NotifyClientOption::Notify);
+    void addTrack(Ref<MediaStreamTrackPrivate>&&);
+    WEBCORE_EXPORT void removeTrack(MediaStreamTrackPrivate&);
 
     void startProducingData();
     void stopProducingData();
@@ -123,7 +122,8 @@
     void characteristicsChanged();
     void updateActiveVideoTrack();
 
-    void forEachObserver(const WTF::Function<void(Observer&)>&) const;
+    bool computeActiveState();
+    void forEachObserver(const Function<void(Observer&)>&);
 
 #if !RELEASE_LOG_DISABLED
     const char* logClassName() const final { return "MediaStreamPrivate"; }
@@ -130,7 +130,7 @@
     WTFLogChannel& logChannel() const final;
 #endif
 
-    HashSet<Observer*> m_observers;
+    WeakHashSet<Observer> m_observers;
     String m_id;
     MediaStreamTrackPrivate* m_activeVideoTrack { nullptr };
     HashMap<String, RefPtr<MediaStreamTrackPrivate>> m_trackSet;

Modified: trunk/Source/WebCore/testing/Internals.cpp (260378 => 260379)


--- trunk/Source/WebCore/testing/Internals.cpp	2020-04-20 18:11:24 UTC (rev 260378)
+++ trunk/Source/WebCore/testing/Internals.cpp	2020-04-20 18:14:37 UTC (rev 260379)
@@ -5054,7 +5054,7 @@
 
 void Internals::removeMediaStreamTrack(MediaStream& stream, MediaStreamTrack& track)
 {
-    stream.internalRemoveTrack(track.id(), MediaStream::StreamModifier::Platform);
+    stream.privateStream().removeTrack(track.privateTrack());
 }
 
 void Internals::simulateMediaStreamTrackCaptureSourceFailure(MediaStreamTrack& track)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to