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)