Diff
Modified: trunk/Source/WebCore/ChangeLog (234311 => 234312)
--- trunk/Source/WebCore/ChangeLog 2018-07-27 16:50:19 UTC (rev 234311)
+++ trunk/Source/WebCore/ChangeLog 2018-07-27 16:58:20 UTC (rev 234312)
@@ -1,3 +1,49 @@
+2018-07-27 Chris Dumez <[email protected]>
+
+ [Media] Avoid unnecessarily constructing *TrackList objects
+ https://bugs.webkit.org/show_bug.cgi?id=188094
+
+ Reviewed by Eric Carlson.
+
+ Avoid unnecessarily constructing *TrackList objects as this is preventing us from making them
+ ActiveDOMObjects.
+
+ * Modules/mediasource/MediaSource.cpp:
+ (WebCore::MediaSource::removeSourceBuffer):
+ * Modules/mediasource/SourceBuffer.cpp:
+ (WebCore::SourceBuffer::sourceBufferPrivateDidReceiveInitializationSegment):
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::addAudioTrack):
+ (WebCore::HTMLMediaElement::addTextTrack):
+ (WebCore::HTMLMediaElement::addVideoTrack):
+ (WebCore::HTMLMediaElement::ensureAudioTracks):
+ (WebCore::HTMLMediaElement::ensureTextTracks):
+ (WebCore::HTMLMediaElement::ensureVideoTracks):
+ (WebCore::HTMLMediaElement::setSelectedTextTrack):
+ (WebCore::HTMLMediaElement::audioTracks): Deleted.
+ (WebCore::HTMLMediaElement::textTracks): Deleted.
+ (WebCore::HTMLMediaElement::videoTracks): Deleted.
+ * html/HTMLMediaElement.h:
+ (WebCore::HTMLMediaElement::audioTracks const):
+ (WebCore::HTMLMediaElement::textTracks const):
+ (WebCore::HTMLMediaElement::videoTracks const):
+ * html/HTMLMediaElement.idl:
+ * html/shadow/MediaControlElements.cpp:
+ (WebCore::MediaControlClosedCaptionsTrackListElement::updateDisplay):
+ (WebCore::MediaControlClosedCaptionsTrackListElement::rebuildTrackListMenu):
+ (WebCore::MediaControlTextTrackContainerElement::updateTextStrokeStyle):
+ * html/track/TextTrack.cpp:
+ (WebCore::TextTrack::setKind):
+ (WebCore::TextTrack::trackIndex):
+ (WebCore::TextTrack::trackIndexRelativeToRenderedTracks):
+ (WebCore::TextTrack::setLanguage):
+ * html/track/VideoTrack.cpp:
+ (WebCore::VideoTrack::setKind):
+ (WebCore::VideoTrack::setLanguage):
+ * platform/cocoa/PlaybackSessionModelMediaElement.mm:
+ (WebCore::PlaybackSessionModelMediaElement::setMediaElement):
+ (WebCore::PlaybackSessionModelMediaElement::updateMediaSelectionOptions):
+
2018-07-27 Basuke Suzuki <[email protected]>
[Curl] Set correct source info to ResourceResponse.
Modified: trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp (234311 => 234312)
--- trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp 2018-07-27 16:50:19 UTC (rev 234311)
+++ trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp 2018-07-27 16:58:20 UTC (rev 234312)
@@ -729,7 +729,7 @@
// 5.4 If the removed enabled audio track flag equals true, then queue a task to fire a simple event
// named change at the HTMLMediaElement audioTracks list.
if (removedEnabledAudioTrack)
- mediaElement()->audioTracks().scheduleChangeEvent();
+ mediaElement()->ensureAudioTracks().scheduleChangeEvent();
}
// 6. Let SourceBuffer videoTracks list equal the VideoTrackList object returned by sourceBuffer.videoTracks.
@@ -769,7 +769,7 @@
// 7.4 If the removed selected video track flag equals true, then queue a task to fire a simple event
// named change at the HTMLMediaElement videoTracks list.
if (removedSelectedVideoTrack)
- mediaElement()->videoTracks().scheduleChangeEvent();
+ mediaElement()->ensureVideoTracks().scheduleChangeEvent();
}
// 8. Let SourceBuffer textTracks list equal the TextTrackList object returned by sourceBuffer.textTracks.
@@ -809,7 +809,7 @@
// 9.4 If the removed enabled text track flag equals true, then queue a task to fire a simple event
// named change at the HTMLMediaElement textTracks list.
if (removedEnabledTextTrack)
- mediaElement()->textTracks().scheduleChangeEvent();
+ mediaElement()->ensureTextTracks().scheduleChangeEvent();
}
// 10. If sourceBuffer is in activeSourceBuffers, then remove sourceBuffer from activeSourceBuffers ...
Modified: trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp (234311 => 234312)
--- trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp 2018-07-27 16:50:19 UTC (rev 234311)
+++ trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp 2018-07-27 16:58:20 UTC (rev 234312)
@@ -1088,7 +1088,7 @@
// 5.2.7 Queue a task to fire a trusted event named addtrack, that does not bubble and is
// not cancelable, and that uses the TrackEvent interface, at the AudioTrackList object
// referenced by the audioTracks attribute on the HTMLMediaElement.
- m_source->mediaElement()->audioTracks().append(newAudioTrack.copyRef());
+ m_source->mediaElement()->ensureAudioTracks().append(newAudioTrack.copyRef());
// 5.2.8 Create a new track buffer to store coded frames for this track.
ASSERT(!m_trackBufferMap.contains(newAudioTrack->id()));
@@ -1127,7 +1127,7 @@
// 5.3.7 Queue a task to fire a trusted event named addtrack, that does not bubble and is
// not cancelable, and that uses the TrackEvent interface, at the VideoTrackList object
// referenced by the videoTracks attribute on the HTMLMediaElement.
- m_source->mediaElement()->videoTracks().append(newVideoTrack.copyRef());
+ m_source->mediaElement()->ensureVideoTracks().append(newVideoTrack.copyRef());
// 5.3.8 Create a new track buffer to store coded frames for this track.
ASSERT(!m_trackBufferMap.contains(newVideoTrack->id()));
@@ -1163,7 +1163,7 @@
// 5.4.6 Queue a task to fire a trusted event named addtrack, that does not bubble and is
// not cancelable, and that uses the TrackEvent interface, at the TextTrackList object
// referenced by the textTracks attribute on the HTMLMediaElement.
- m_source->mediaElement()->textTracks().append(WTFMove(newTextTrack));
+ m_source->mediaElement()->ensureTextTracks().append(WTFMove(newTextTrack));
// 5.4.7 Create a new track buffer to store coded frames for this track.
ASSERT(!m_trackBufferMap.contains(textTrackPrivate.id()));
Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (234311 => 234312)
--- trunk/Source/WebCore/html/HTMLMediaElement.cpp 2018-07-27 16:50:19 UTC (rev 234311)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp 2018-07-27 16:58:20 UTC (rev 234312)
@@ -4012,7 +4012,7 @@
void HTMLMediaElement::addAudioTrack(Ref<AudioTrack>&& track)
{
- audioTracks().append(WTFMove(track));
+ ensureAudioTracks().append(WTFMove(track));
}
void HTMLMediaElement::addTextTrack(Ref<TextTrack>&& track)
@@ -4025,7 +4025,7 @@
m_captionDisplayMode = page->group().captionPreferences().captionDisplayMode();
}
- textTracks().append(WTFMove(track));
+ ensureTextTracks().append(WTFMove(track));
closeCaptionTracksChanged();
}
@@ -4032,7 +4032,7 @@
void HTMLMediaElement::addVideoTrack(Ref<VideoTrack>&& track)
{
- videoTracks().append(WTFMove(track));
+ ensureVideoTracks().append(WTFMove(track));
}
void HTMLMediaElement::removeAudioTrack(Ref<AudioTrack>&& track)
@@ -4110,7 +4110,7 @@
return trackReference;
}
-AudioTrackList& HTMLMediaElement::audioTracks()
+AudioTrackList& HTMLMediaElement::ensureAudioTracks()
{
if (!m_audioTracks)
m_audioTracks = AudioTrackList::create(this, ActiveDOMObject::scriptExecutionContext());
@@ -4118,7 +4118,7 @@
return *m_audioTracks;
}
-TextTrackList& HTMLMediaElement::textTracks()
+TextTrackList& HTMLMediaElement::ensureTextTracks()
{
if (!m_textTracks)
m_textTracks = TextTrackList::create(this, ActiveDOMObject::scriptExecutionContext());
@@ -4126,7 +4126,7 @@
return *m_textTracks;
}
-VideoTrackList& HTMLMediaElement::videoTracks()
+VideoTrackList& HTMLMediaElement::ensureVideoTracks()
{
if (!m_videoTracks)
m_videoTracks = VideoTrackList::create(this, ActiveDOMObject::scriptExecutionContext());
@@ -4407,8 +4407,8 @@
void HTMLMediaElement::setSelectedTextTrack(TextTrack* trackToSelect)
{
- TextTrackList& trackList = textTracks();
- if (!trackList.length())
+ auto* trackList = textTracks();
+ if (!trackList || !trackList->length())
return;
if (trackToSelect == TextTrack::captionMenuAutomaticItem()) {
@@ -4415,17 +4415,17 @@
if (captionDisplayMode() != CaptionUserPreferences::Automatic)
m_textTracks->scheduleChangeEvent();
} else if (trackToSelect == TextTrack::captionMenuOffItem()) {
- for (int i = 0, length = trackList.length(); i < length; ++i)
- trackList.item(i)->setMode(TextTrack::Mode::Disabled);
+ for (int i = 0, length = trackList->length(); i < length; ++i)
+ trackList->item(i)->setMode(TextTrack::Mode::Disabled);
- if (captionDisplayMode() != CaptionUserPreferences::ForcedOnly && !trackList.isChangeEventScheduled())
+ if (captionDisplayMode() != CaptionUserPreferences::ForcedOnly && !trackList->isChangeEventScheduled())
m_textTracks->scheduleChangeEvent();
} else {
- if (!trackToSelect || !trackList.contains(*trackToSelect))
+ if (!trackToSelect || !trackList->contains(*trackToSelect))
return;
- for (int i = 0, length = trackList.length(); i < length; ++i) {
- auto& track = *trackList.item(i);
+ for (int i = 0, length = trackList->length(); i < length; ++i) {
+ auto& track = *trackList->item(i);
if (&track != trackToSelect)
track.setMode(TextTrack::Mode::Disabled);
else
Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (234311 => 234312)
--- trunk/Source/WebCore/html/HTMLMediaElement.h 2018-07-27 16:50:19 UTC (rev 234311)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h 2018-07-27 16:58:20 UTC (rev 234312)
@@ -330,9 +330,12 @@
#if ENABLE(VIDEO_TRACK)
ExceptionOr<TextTrack&> addTextTrack(const String& kind, const String& label, const String& language);
- AudioTrackList& audioTracks();
- TextTrackList& textTracks();
- VideoTrackList& videoTracks();
+ AudioTrackList& ensureAudioTracks();
+ TextTrackList& ensureTextTracks();
+ VideoTrackList& ensureVideoTracks();
+ AudioTrackList* audioTracks() const { return m_audioTracks.get(); }
+ TextTrackList* textTracks() const { return m_textTracks.get(); }
+ VideoTrackList* videoTracks() const { return m_videoTracks.get(); }
CueList currentlyActiveCues() const { return m_currentlyActiveCues; }
Modified: trunk/Source/WebCore/html/HTMLMediaElement.idl (234311 => 234312)
--- trunk/Source/WebCore/html/HTMLMediaElement.idl 2018-07-27 16:50:19 UTC (rev 234311)
+++ trunk/Source/WebCore/html/HTMLMediaElement.idl 2018-07-27 16:58:20 UTC (rev 234312)
@@ -110,9 +110,9 @@
[Conditional=ENCRYPTED_MEDIA, EnabledAtRuntime=EncryptedMediaAPI] Promise<void> setMediaKeys(MediaKeys? mediaKeys);
[Conditional=VIDEO_TRACK, MayThrowException] TextTrack addTextTrack(DOMString kind, optional DOMString label = "", optional DOMString language = "");
- [Conditional=VIDEO_TRACK] readonly attribute AudioTrackList audioTracks;
- [Conditional=VIDEO_TRACK] readonly attribute TextTrackList textTracks;
- [Conditional=VIDEO_TRACK] readonly attribute VideoTrackList videoTracks;
+ [Conditional=VIDEO_TRACK, ImplementedAs=ensureAudioTracks] readonly attribute AudioTrackList audioTracks;
+ [Conditional=VIDEO_TRACK, ImplementedAs=ensureTextTracks] readonly attribute TextTrackList textTracks;
+ [Conditional=VIDEO_TRACK, ImplementedAs=ensureVideoTracks] readonly attribute VideoTrackList videoTracks;
[Reflect] attribute DOMString mediaGroup;
Modified: trunk/Source/WebCore/html/shadow/MediaControlElements.cpp (234311 => 234312)
--- trunk/Source/WebCore/html/shadow/MediaControlElements.cpp 2018-07-27 16:50:19 UTC (rev 234311)
+++ trunk/Source/WebCore/html/shadow/MediaControlElements.cpp 2018-07-27 16:58:20 UTC (rev 234312)
@@ -760,7 +760,7 @@
if (!mediaElement)
return;
- if (!mediaElement->textTracks().length())
+ if (!mediaElement->textTracks() || !mediaElement->textTracks()->length())
return;
rebuildTrackListMenu();
@@ -821,14 +821,14 @@
if (!mediaElement)
return;
- TextTrackList& trackList = mediaElement->textTracks();
- if (!trackList.length())
+ auto* trackList = mediaElement->textTracks();
+ if (!trackList || !trackList->length())
return;
if (!document().page())
return;
auto& captionPreferences = document().page()->group().captionPreferences();
- Vector<RefPtr<TextTrack>> tracksForMenu = captionPreferences.sortedTrackListForMenu(&trackList);
+ Vector<RefPtr<TextTrack>> tracksForMenu = captionPreferences.sortedTrackListForMenu(trackList);
auto captionsHeader = HTMLHeadingElement::create(h3Tag, document());
captionsHeader->appendChild(document().createTextNode(textTrackSubtitlesText()));
@@ -1269,12 +1269,13 @@
// FIXME: Since it is possible to have more than one text track enabled, the following code may not find the correct language.
// The default UI only allows a user to enable one track at a time, so it should be OK for now, but we should consider doing
// this differently, see <https://bugs.webkit.org/show_bug.cgi?id=169875>.
- auto& tracks = mediaElement->textTracks();
- for (unsigned i = 0; i < tracks.length(); ++i) {
- auto track = tracks.item(i);
- if (track && track->mode() == TextTrack::Mode::Showing) {
- language = track->validBCP47Language();
- break;
+ if (auto* tracks = mediaElement->textTracks()) {
+ for (unsigned i = 0; i < tracks->length(); ++i) {
+ auto track = tracks->item(i);
+ if (track && track->mode() == TextTrack::Mode::Showing) {
+ language = track->validBCP47Language();
+ break;
+ }
}
}
Modified: trunk/Source/WebCore/html/track/TextTrack.cpp (234311 => 234312)
--- trunk/Source/WebCore/html/track/TextTrack.cpp 2018-07-27 16:50:19 UTC (rev 234311)
+++ trunk/Source/WebCore/html/track/TextTrack.cpp 2018-07-27 16:58:20 UTC (rev 234312)
@@ -189,7 +189,7 @@
// 4. Queue a task to fire a simple event named change at the TextTrackList object referenced by
// the textTracks attribute on the HTMLMediaElement.
if (mediaElement())
- mediaElement()->textTracks().scheduleChangeEvent();
+ mediaElement()->ensureTextTracks().scheduleChangeEvent();
#endif
if (m_client && oldKind != m_kind)
@@ -440,7 +440,7 @@
{
ASSERT(m_mediaElement);
if (!m_trackIndex)
- m_trackIndex = m_mediaElement->textTracks().getTrackIndex(*this);
+ m_trackIndex = m_mediaElement->ensureTextTracks().getTrackIndex(*this);
return m_trackIndex.value();
}
@@ -467,7 +467,7 @@
{
ASSERT(m_mediaElement);
if (!m_renderedTrackIndex)
- m_renderedTrackIndex = m_mediaElement->textTracks().getTrackIndexRelativeToRenderedTracks(*this);
+ m_renderedTrackIndex = m_mediaElement->ensureTextTracks().getTrackIndexRelativeToRenderedTracks(*this);
return m_renderedTrackIndex.value();
}
@@ -564,7 +564,7 @@
// 4. Queue a task to fire a simple event named change at the TextTrackList object referenced by
// the textTracks attribute on the HTMLMediaElement.
if (mediaElement())
- mediaElement()->textTracks().scheduleChangeEvent();
+ mediaElement()->ensureTextTracks().scheduleChangeEvent();
}
#endif
Modified: trunk/Source/WebCore/html/track/VideoTrack.cpp (234311 => 234312)
--- trunk/Source/WebCore/html/track/VideoTrack.cpp 2018-07-27 16:50:19 UTC (rev 234311)
+++ trunk/Source/WebCore/html/track/VideoTrack.cpp 2018-07-27 16:58:20 UTC (rev 234312)
@@ -189,7 +189,7 @@
// 4. Queue a task to fire a simple event named change at the VideoTrackList object referenced by
// the videoTracks attribute on the HTMLMediaElement.
- mediaElement()->videoTracks().scheduleChangeEvent();
+ mediaElement()->ensureVideoTracks().scheduleChangeEvent();
}
void VideoTrack::setLanguage(const AtomicString& language)
@@ -211,7 +211,7 @@
// 4. Queue a task to fire a simple event named change at the VideoTrackList object referenced by
// the videoTracks attribute on the HTMLMediaElement.
if (mediaElement())
- mediaElement()->videoTracks().scheduleChangeEvent();
+ mediaElement()->ensureVideoTracks().scheduleChangeEvent();
}
#endif
Modified: trunk/Source/WebCore/platform/cocoa/PlaybackSessionModelMediaElement.mm (234311 => 234312)
--- trunk/Source/WebCore/platform/cocoa/PlaybackSessionModelMediaElement.mm 2018-07-27 16:50:19 UTC (rev 234311)
+++ trunk/Source/WebCore/platform/cocoa/PlaybackSessionModelMediaElement.mm 2018-07-27 16:58:20 UTC (rev 234312)
@@ -66,15 +66,17 @@
if (m_mediaElement && m_isListening) {
for (auto& eventName : observedEventNames())
m_mediaElement->removeEventListener(eventName, *this, false);
- auto& audioTracks = m_mediaElement->audioTracks();
- audioTracks.removeEventListener(events.addtrackEvent, *this, false);
- audioTracks.removeEventListener(events.changeEvent, *this, false);
- audioTracks.removeEventListener(events.removetrackEvent, *this, false);
+ if (auto* audioTracks = m_mediaElement->audioTracks()) {
+ audioTracks->removeEventListener(events.addtrackEvent, *this, false);
+ audioTracks->removeEventListener(events.changeEvent, *this, false);
+ audioTracks->removeEventListener(events.removetrackEvent, *this, false);
+ }
- auto& textTracks = m_mediaElement->audioTracks();
- textTracks.removeEventListener(events.addtrackEvent, *this, false);
- textTracks.removeEventListener(events.changeEvent, *this, false);
- textTracks.removeEventListener(events.removetrackEvent, *this, false);
+ if (auto* textTracks = m_mediaElement->audioTracks()) {
+ textTracks->removeEventListener(events.addtrackEvent, *this, false);
+ textTracks->removeEventListener(events.changeEvent, *this, false);
+ textTracks->removeEventListener(events.removetrackEvent, *this, false);
+ }
}
m_isListening = false;
@@ -87,12 +89,12 @@
for (auto& eventName : observedEventNames())
m_mediaElement->addEventListener(eventName, *this, false);
- auto& audioTracks = m_mediaElement->audioTracks();
+ auto& audioTracks = m_mediaElement->ensureAudioTracks();
audioTracks.addEventListener(events.addtrackEvent, *this, false);
audioTracks.addEventListener(events.changeEvent, *this, false);
audioTracks.addEventListener(events.removetrackEvent, *this, false);
- auto& textTracks = m_mediaElement->audioTracks();
+ auto& textTracks = m_mediaElement->ensureTextTracks();
textTracks.addEventListener(events.addtrackEvent, *this, false);
textTracks.addEventListener(events.changeEvent, *this, false);
textTracks.addEventListener(events.removetrackEvent, *this, false);
@@ -332,15 +334,15 @@
return;
auto& captionPreferences = m_mediaElement->document().page()->group().captionPreferences();
- auto& textTracks = m_mediaElement->textTracks();
- if (textTracks.length())
- m_legibleTracksForMenu = captionPreferences.sortedTrackListForMenu(&textTracks);
+ auto* textTracks = m_mediaElement->textTracks();
+ if (textTracks && textTracks->length())
+ m_legibleTracksForMenu = captionPreferences.sortedTrackListForMenu(textTracks);
else
m_legibleTracksForMenu.clear();
- auto& audioTracks = m_mediaElement->audioTracks();
- if (audioTracks.length() > 1)
- m_audioTracksForMenu = captionPreferences.sortedTrackListForMenu(&audioTracks);
+ auto* audioTracks = m_mediaElement->audioTracks();
+ if (audioTracks && audioTracks->length() > 1)
+ m_audioTracksForMenu = captionPreferences.sortedTrackListForMenu(audioTracks);
else
m_audioTracksForMenu.clear();