Diff
Modified: trunk/Source/WebCore/ChangeLog (253808 => 253809)
--- trunk/Source/WebCore/ChangeLog 2019-12-20 02:11:18 UTC (rev 253808)
+++ trunk/Source/WebCore/ChangeLog 2019-12-20 02:24:59 UTC (rev 253809)
@@ -1,5 +1,59 @@
2019-12-19 Doug Kelly <do...@apple.com>
+ Update TrackBase to store m_mediaElement as a WeakPtr
+ https://bugs.webkit.org/show_bug.cgi?id=205460
+
+ Reviewed by Eric Carlson.
+
+ Store the HTMLMediaElement in TrackBase and related classes as a WeakPtr to give some proper idea of pointer lifetime, since while the
+ HTMLMediaElement is optional, if set, it should be a valid HTMLMediaElement.
+
+ No new tests since no functionality changed.
+
+ * Modules/mediasource/SourceBuffer.cpp:
+ (WebCore::SourceBuffer::videoTracks):
+ (WebCore::SourceBuffer::audioTracks):
+ (WebCore::SourceBuffer::textTracks):
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::textTrackModeChanged):
+ (WebCore::HTMLMediaElement::mediaPlayerDidAddTextTrack):
+ (WebCore::HTMLMediaElement::ensureAudioTracks):
+ (WebCore::HTMLMediaElement::ensureTextTracks):
+ (WebCore::HTMLMediaElement::ensureVideoTracks):
+ * html/track/AudioTrack.cpp:
+ (WebCore::AudioTrack::willRemove):
+ (WebCore::AudioTrack::setMediaElement):
+ * html/track/AudioTrack.h:
+ * html/track/AudioTrackList.cpp:
+ (WebCore::AudioTrackList::AudioTrackList):
+ * html/track/AudioTrackList.h:
+ * html/track/InbandTextTrack.cpp:
+ (WebCore::InbandTextTrack::willRemove):
+ (WebCore::InbandTextTrack::setMediaElement):
+ * html/track/InbandTextTrack.h:
+ * html/track/TextTrackList.cpp:
+ (WebCore::TextTrackList::TextTrackList):
+ * html/track/TextTrackList.h:
+ * html/track/TrackBase.cpp:
+ (WebCore::TrackBase::element):
+ (WebCore::TrackBase::setMediaElement):
+ * html/track/TrackBase.h:
+ (WebCore::TrackBase::mediaElement):
+ * html/track/TrackListBase.cpp:
+ (WebCore::TrackListBase::TrackListBase):
+ (WebCore::TrackListBase::element const):
+ * html/track/TrackListBase.h:
+ (WebCore::TrackListBase::mediaElement const):
+ * html/track/VideoTrack.cpp:
+ (WebCore::VideoTrack::willRemove):
+ (WebCore::VideoTrack::setMediaElement):
+ * html/track/VideoTrack.h:
+ * html/track/VideoTrackList.cpp:
+ (WebCore::VideoTrackList::VideoTrackList):
+ * html/track/VideoTrackList.h:
+
+2019-12-19 Doug Kelly <do...@apple.com>
+
Invalid assert with tracks not associated to media element
https://bugs.webkit.org/show_bug.cgi?id=205360
Modified: trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp (253808 => 253809)
--- trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp 2019-12-20 02:11:18 UTC (rev 253808)
+++ trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp 2019-12-20 02:24:59 UTC (rev 253809)
@@ -58,6 +58,7 @@
#include <limits>
#include <wtf/CheckedArithmetic.h>
#include <wtf/IsoMallocInlines.h>
+#include <wtf/WeakPtr.h>
namespace WebCore {
@@ -1037,7 +1038,7 @@
VideoTrackList& SourceBuffer::videoTracks()
{
if (!m_videoTracks)
- m_videoTracks = VideoTrackList::create(m_source->mediaElement(), scriptExecutionContext());
+ m_videoTracks = VideoTrackList::create(makeWeakPtr(m_source->mediaElement()), scriptExecutionContext());
return *m_videoTracks;
}
@@ -1044,7 +1045,7 @@
AudioTrackList& SourceBuffer::audioTracks()
{
if (!m_audioTracks)
- m_audioTracks = AudioTrackList::create(m_source->mediaElement(), scriptExecutionContext());
+ m_audioTracks = AudioTrackList::create(makeWeakPtr(m_source->mediaElement()), scriptExecutionContext());
return *m_audioTracks;
}
@@ -1051,7 +1052,7 @@
TextTrackList& SourceBuffer::textTracks()
{
if (!m_textTracks)
- m_textTracks = TextTrackList::create(m_source->mediaElement(), scriptExecutionContext());
+ m_textTracks = TextTrackList::create(makeWeakPtr(m_source->mediaElement()), scriptExecutionContext());
return *m_textTracks;
}
Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (253808 => 253809)
--- trunk/Source/WebCore/html/HTMLMediaElement.cpp 2019-12-20 02:11:18 UTC (rev 253808)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp 2019-12-20 02:24:59 UTC (rev 253809)
@@ -1979,7 +1979,7 @@
// If this is the first added track, create the list of text tracks.
if (!m_textTracks)
- m_textTracks = TextTrackList::create(this, ActiveDOMObject::scriptExecutionContext());
+ m_textTracks = TextTrackList::create(makeWeakPtr(this), ActiveDOMObject::scriptExecutionContext());
// Mark this track as "configured" so configureTextTracks won't change the mode again.
track.setHasBeenConfigured(true);
@@ -4047,7 +4047,7 @@
// 4.8.10.12.2 Sourcing in-band text tracks
// 1. Associate the relevant data with a new text track and its corresponding new TextTrack object.
auto textTrack = InbandTextTrack::create(*ActiveDOMObject::scriptExecutionContext(), *this, track);
- textTrack->setMediaElement(this);
+ textTrack->setMediaElement(makeWeakPtr(this));
// 2. Set the new text track's kind, label, and language based on the semantics of the relevant data,
// as defined by the relevant specification. If there is no label in that data, then the label must
@@ -4204,7 +4204,7 @@
AudioTrackList& HTMLMediaElement::ensureAudioTracks()
{
if (!m_audioTracks)
- m_audioTracks = AudioTrackList::create(this, ActiveDOMObject::scriptExecutionContext());
+ m_audioTracks = AudioTrackList::create(makeWeakPtr(this), ActiveDOMObject::scriptExecutionContext());
return *m_audioTracks;
}
@@ -4212,7 +4212,7 @@
TextTrackList& HTMLMediaElement::ensureTextTracks()
{
if (!m_textTracks)
- m_textTracks = TextTrackList::create(this, ActiveDOMObject::scriptExecutionContext());
+ m_textTracks = TextTrackList::create(makeWeakPtr(this), ActiveDOMObject::scriptExecutionContext());
return *m_textTracks;
}
@@ -4220,7 +4220,7 @@
VideoTrackList& HTMLMediaElement::ensureVideoTracks()
{
if (!m_videoTracks)
- m_videoTracks = VideoTrackList::create(this, ActiveDOMObject::scriptExecutionContext());
+ m_videoTracks = VideoTrackList::create(makeWeakPtr(this), ActiveDOMObject::scriptExecutionContext());
return *m_videoTracks;
}
Modified: trunk/Source/WebCore/html/track/AudioTrack.cpp (253808 => 253809)
--- trunk/Source/WebCore/html/track/AudioTrack.cpp 2019-12-20 02:11:18 UTC (rev 253808)
+++ trunk/Source/WebCore/html/track/AudioTrack.cpp 2019-12-20 02:24:59 UTC (rev 253809)
@@ -160,7 +160,7 @@
void AudioTrack::willRemove()
{
- auto element = makeRefPtr(mediaElement());
+ auto element = makeRefPtr(mediaElement().get());
if (!element)
return;
element->removeAudioTrack(*this);
@@ -196,7 +196,7 @@
}
}
-void AudioTrack::setMediaElement(HTMLMediaElement* element)
+void AudioTrack::setMediaElement(WeakPtr<HTMLMediaElement> element)
{
TrackBase::setMediaElement(element);
#if !RELEASE_LOG_DISABLED
Modified: trunk/Source/WebCore/html/track/AudioTrack.h (253808 => 253809)
--- trunk/Source/WebCore/html/track/AudioTrack.h 2019-12-20 02:11:18 UTC (rev 253808)
+++ trunk/Source/WebCore/html/track/AudioTrack.h 2019-12-20 02:24:59 UTC (rev 253809)
@@ -65,7 +65,7 @@
size_t inbandTrackIndex() const;
void setPrivate(AudioTrackPrivate&);
- void setMediaElement(HTMLMediaElement*) override;
+ void setMediaElement(WeakPtr<HTMLMediaElement>) override;
private:
AudioTrack(AudioTrackClient&, AudioTrackPrivate&);
Modified: trunk/Source/WebCore/html/track/AudioTrackList.cpp (253808 => 253809)
--- trunk/Source/WebCore/html/track/AudioTrackList.cpp 2019-12-20 02:11:18 UTC (rev 253808)
+++ trunk/Source/WebCore/html/track/AudioTrackList.cpp 2019-12-20 02:24:59 UTC (rev 253809)
@@ -30,10 +30,11 @@
#include "AudioTrackList.h"
#include "AudioTrack.h"
+#include "HTMLMediaElement.h"
namespace WebCore {
-AudioTrackList::AudioTrackList(HTMLMediaElement* element, ScriptExecutionContext* context)
+AudioTrackList::AudioTrackList(WeakPtr<HTMLMediaElement> element, ScriptExecutionContext* context)
: TrackListBase(element, context)
{
}
Modified: trunk/Source/WebCore/html/track/AudioTrackList.h (253808 => 253809)
--- trunk/Source/WebCore/html/track/AudioTrackList.h 2019-12-20 02:11:18 UTC (rev 253808)
+++ trunk/Source/WebCore/html/track/AudioTrackList.h 2019-12-20 02:24:59 UTC (rev 253809)
@@ -35,7 +35,7 @@
class AudioTrackList final : public TrackListBase {
public:
- static Ref<AudioTrackList> create(HTMLMediaElement* owner, ScriptExecutionContext* context)
+ static Ref<AudioTrackList> create(WeakPtr<HTMLMediaElement> owner, ScriptExecutionContext* context)
{
return adoptRef(*new AudioTrackList(owner, context));
}
@@ -51,7 +51,7 @@
EventTargetInterface eventTargetInterface() const override;
private:
- AudioTrackList(HTMLMediaElement*, ScriptExecutionContext*);
+ AudioTrackList(WeakPtr<HTMLMediaElement>, ScriptExecutionContext*);
};
static_assert(sizeof(AudioTrackList) == sizeof(TrackListBase), "");
Modified: trunk/Source/WebCore/html/track/InbandTextTrack.cpp (253808 => 253809)
--- trunk/Source/WebCore/html/track/InbandTextTrack.cpp 2019-12-20 02:11:18 UTC (rev 253808)
+++ trunk/Source/WebCore/html/track/InbandTextTrack.cpp 2019-12-20 02:24:59 UTC (rev 253809)
@@ -159,7 +159,7 @@
void InbandTextTrack::willRemove()
{
- auto element = makeRefPtr(mediaElement());
+ auto element = makeRefPtr(mediaElement().get());
if (!element)
return;
element->removeTextTrack(*this);
@@ -197,7 +197,7 @@
return m_private->startTimeVariance();
}
-void InbandTextTrack::setMediaElement(HTMLMediaElement* element)
+void InbandTextTrack::setMediaElement(WeakPtr<HTMLMediaElement> element)
{
TrackBase::setMediaElement(element);
#if !RELEASE_LOG_DISABLED
Modified: trunk/Source/WebCore/html/track/InbandTextTrack.h (253808 => 253809)
--- trunk/Source/WebCore/html/track/InbandTextTrack.h 2019-12-20 02:11:18 UTC (rev 253808)
+++ trunk/Source/WebCore/html/track/InbandTextTrack.h 2019-12-20 02:24:59 UTC (rev 253809)
@@ -49,7 +49,7 @@
AtomString inBandMetadataTrackDispatchType() const override;
void setPrivate(InbandTextTrackPrivate&);
- void setMediaElement(HTMLMediaElement*) override;
+ void setMediaElement(WeakPtr<HTMLMediaElement>) override;
protected:
InbandTextTrack(ScriptExecutionContext&, TextTrackClient&, InbandTextTrackPrivate&);
Modified: trunk/Source/WebCore/html/track/TextTrackList.cpp (253808 => 253809)
--- trunk/Source/WebCore/html/track/TextTrackList.cpp 2019-12-20 02:11:18 UTC (rev 253808)
+++ trunk/Source/WebCore/html/track/TextTrackList.cpp 2019-12-20 02:24:59 UTC (rev 253809)
@@ -39,7 +39,7 @@
WTF_MAKE_ISO_ALLOCATED_IMPL(TextTrackList);
-TextTrackList::TextTrackList(HTMLMediaElement* element, ScriptExecutionContext* context)
+TextTrackList::TextTrackList(WeakPtr<HTMLMediaElement> element, ScriptExecutionContext* context)
: TrackListBase(element, context)
{
}
Modified: trunk/Source/WebCore/html/track/TextTrackList.h (253808 => 253809)
--- trunk/Source/WebCore/html/track/TextTrackList.h 2019-12-20 02:11:18 UTC (rev 253808)
+++ trunk/Source/WebCore/html/track/TextTrackList.h 2019-12-20 02:24:59 UTC (rev 253809)
@@ -36,7 +36,7 @@
class TextTrackList final : public TrackListBase {
WTF_MAKE_ISO_ALLOCATED(TextTrackList);
public:
- static Ref<TextTrackList> create(HTMLMediaElement* element, ScriptExecutionContext* context)
+ static Ref<TextTrackList> create(WeakPtr<HTMLMediaElement> element, ScriptExecutionContext* context)
{
return adoptRef(*new TextTrackList(element, context));
}
@@ -60,7 +60,7 @@
EventTargetInterface eventTargetInterface() const override;
private:
- TextTrackList(HTMLMediaElement*, ScriptExecutionContext*);
+ TextTrackList(WeakPtr<HTMLMediaElement>, ScriptExecutionContext*);
void invalidateTrackIndexesAfterTrack(TextTrack&);
Modified: trunk/Source/WebCore/html/track/TrackBase.cpp (253808 => 253809)
--- trunk/Source/WebCore/html/track/TrackBase.cpp 2019-12-20 02:11:18 UTC (rev 253808)
+++ trunk/Source/WebCore/html/track/TrackBase.cpp 2019-12-20 02:24:59 UTC (rev 253809)
@@ -75,10 +75,10 @@
Element* TrackBase::element()
{
- return m_mediaElement;
+ return m_mediaElement.get();
}
-void TrackBase::setMediaElement(HTMLMediaElement* element)
+void TrackBase::setMediaElement(WeakPtr<HTMLMediaElement> element)
{
m_mediaElement = element;
Modified: trunk/Source/WebCore/html/track/TrackBase.h (253808 => 253809)
--- trunk/Source/WebCore/html/track/TrackBase.h 2019-12-20 02:11:18 UTC (rev 253808)
+++ trunk/Source/WebCore/html/track/TrackBase.h 2019-12-20 02:24:59 UTC (rev 253809)
@@ -28,6 +28,7 @@
#if ENABLE(VIDEO_TRACK)
#include <wtf/LoggerHelper.h>
+#include <wtf/WeakPtr.h>
#include <wtf/text/AtomString.h>
namespace WebCore {
@@ -48,8 +49,8 @@
enum Type { BaseTrack, TextTrack, AudioTrack, VideoTrack };
Type type() const { return m_type; }
- virtual void setMediaElement(HTMLMediaElement*);
- HTMLMediaElement* mediaElement() { return m_mediaElement; }
+ virtual void setMediaElement(WeakPtr<HTMLMediaElement>);
+ WeakPtr<HTMLMediaElement> mediaElement() { return m_mediaElement; }
virtual Element* element();
virtual AtomString id() const { return m_id; }
@@ -82,7 +83,7 @@
protected:
TrackBase(Type, const AtomString& id, const AtomString& label, const AtomString& language);
- HTMLMediaElement* m_mediaElement { nullptr };
+ WeakPtr<HTMLMediaElement> m_mediaElement { nullptr };
#if ENABLE(MEDIA_SOURCE)
SourceBuffer* m_sourceBuffer { nullptr };
Modified: trunk/Source/WebCore/html/track/TrackListBase.cpp (253808 => 253809)
--- trunk/Source/WebCore/html/track/TrackListBase.cpp 2019-12-20 02:11:18 UTC (rev 253808)
+++ trunk/Source/WebCore/html/track/TrackListBase.cpp 2019-12-20 02:24:59 UTC (rev 253809)
@@ -39,7 +39,7 @@
WTF_MAKE_ISO_ALLOCATED_IMPL(TrackListBase);
-TrackListBase::TrackListBase(HTMLMediaElement* element, ScriptExecutionContext* context)
+TrackListBase::TrackListBase(WeakPtr<HTMLMediaElement> element, ScriptExecutionContext* context)
: ContextDestructionObserver(context)
, m_element(element)
, m_asyncEventQueue(MainThreadGenericEventQueue::create(*this))
@@ -63,7 +63,7 @@
Element* TrackListBase::element() const
{
- return m_element;
+ return m_element.get();
}
unsigned TrackListBase::length() const
Modified: trunk/Source/WebCore/html/track/TrackListBase.h (253808 => 253809)
--- trunk/Source/WebCore/html/track/TrackListBase.h 2019-12-20 02:11:18 UTC (rev 253808)
+++ trunk/Source/WebCore/html/track/TrackListBase.h 2019-12-20 02:24:59 UTC (rev 253809)
@@ -32,6 +32,7 @@
#include "GenericEventQueue.h"
#include <wtf/RefCounted.h>
#include <wtf/Vector.h>
+#include <wtf/WeakPtr.h>
namespace WebCore {
@@ -56,7 +57,7 @@
virtual void clearElement();
Element* element() const;
- HTMLMediaElement* mediaElement() const { return m_element; }
+ WeakPtr<HTMLMediaElement> mediaElement() const { return m_element; }
// Needs to be public so tracks can call it
void scheduleChangeEvent();
@@ -65,7 +66,7 @@
bool isAnyTrackEnabled() const;
protected:
- TrackListBase(HTMLMediaElement*, ScriptExecutionContext*);
+ TrackListBase(WeakPtr<HTMLMediaElement>, ScriptExecutionContext*);
void scheduleAddTrackEvent(Ref<TrackBase>&&);
void scheduleRemoveTrackEvent(Ref<TrackBase>&&);
@@ -79,7 +80,7 @@
void refEventTarget() final { ref(); }
void derefEventTarget() final { deref(); }
- HTMLMediaElement* m_element;
+ WeakPtr<HTMLMediaElement> m_element;
UniqueRef<MainThreadGenericEventQueue> m_asyncEventQueue;
};
Modified: trunk/Source/WebCore/html/track/VideoTrack.cpp (253808 => 253809)
--- trunk/Source/WebCore/html/track/VideoTrack.cpp 2019-12-20 02:11:18 UTC (rev 253808)
+++ trunk/Source/WebCore/html/track/VideoTrack.cpp 2019-12-20 02:24:59 UTC (rev 253809)
@@ -163,7 +163,7 @@
void VideoTrack::willRemove()
{
- auto element = makeRefPtr(mediaElement());
+ auto element = makeRefPtr(mediaElement().get());
if (!element)
return;
element->removeVideoTrack(*this);
@@ -244,7 +244,7 @@
ASSERT_NOT_REACHED();
}
-void VideoTrack::setMediaElement(HTMLMediaElement* element)
+void VideoTrack::setMediaElement(WeakPtr<HTMLMediaElement> element)
{
TrackBase::setMediaElement(element);
#if !RELEASE_LOG_DISABLED
Modified: trunk/Source/WebCore/html/track/VideoTrack.h (253808 => 253809)
--- trunk/Source/WebCore/html/track/VideoTrack.h 2019-12-20 02:11:18 UTC (rev 253808)
+++ trunk/Source/WebCore/html/track/VideoTrack.h 2019-12-20 02:24:59 UTC (rev 253809)
@@ -73,7 +73,7 @@
const MediaDescription& description() const;
void setPrivate(VideoTrackPrivate&);
- void setMediaElement(HTMLMediaElement*) override;
+ void setMediaElement(WeakPtr<HTMLMediaElement>) override;
private:
VideoTrack(VideoTrackClient&, VideoTrackPrivate&);
Modified: trunk/Source/WebCore/html/track/VideoTrackList.cpp (253808 => 253809)
--- trunk/Source/WebCore/html/track/VideoTrackList.cpp 2019-12-20 02:11:18 UTC (rev 253808)
+++ trunk/Source/WebCore/html/track/VideoTrackList.cpp 2019-12-20 02:24:59 UTC (rev 253809)
@@ -29,11 +29,12 @@
#include "VideoTrackList.h"
+#include "HTMLMediaElement.h"
#include "VideoTrack.h"
namespace WebCore {
-VideoTrackList::VideoTrackList(HTMLMediaElement* element, ScriptExecutionContext* context)
+VideoTrackList::VideoTrackList(WeakPtr<HTMLMediaElement> element, ScriptExecutionContext* context)
: TrackListBase(element, context)
{
}
Modified: trunk/Source/WebCore/html/track/VideoTrackList.h (253808 => 253809)
--- trunk/Source/WebCore/html/track/VideoTrackList.h 2019-12-20 02:11:18 UTC (rev 253808)
+++ trunk/Source/WebCore/html/track/VideoTrackList.h 2019-12-20 02:24:59 UTC (rev 253809)
@@ -35,7 +35,7 @@
class VideoTrackList final : public TrackListBase {
public:
- static Ref<VideoTrackList> create(HTMLMediaElement* owner, ScriptExecutionContext* context)
+ static Ref<VideoTrackList> create(WeakPtr<HTMLMediaElement> owner, ScriptExecutionContext* context)
{
return adoptRef(*new VideoTrackList(owner, context));
}
@@ -52,7 +52,7 @@
EventTargetInterface eventTargetInterface() const override;
private:
- VideoTrackList(HTMLMediaElement*, ScriptExecutionContext*);
+ VideoTrackList(WeakPtr<HTMLMediaElement>, ScriptExecutionContext*);
};
static_assert(sizeof(VideoTrackList) == sizeof(TrackListBase), "");