WebKit Bugzilla
Attachment 345915 Details for
Bug 188094
: [Media] Avoid unnecessarily constructing *TrackList objects
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-188094-20180727085834.patch (text/plain), 22.04 KB, created by
Chris Dumez
on 2018-07-27 08:58:34 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Chris Dumez
Created:
2018-07-27 08:58:34 PDT
Size:
22.04 KB
patch
obsolete
>Subversion Revision: 234309 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 0ff7fc87e61852842c1494a36168dcf108441ef7..4d4556a02308bfd607ee2d54cb44d6f6a6143a55 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,49 @@ >+2018-07-27 Chris Dumez <cdumez@apple.com> >+ >+ [Media] Avoid unnecessarily constructing *TrackList objects >+ https://bugs.webkit.org/show_bug.cgi?id=188094 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ 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-26 Andy VanWagoner <andy@vanwagoner.family> > > [INTL] Remove INTL sub-feature compile flags >diff --git a/Source/WebCore/Modules/mediasource/MediaSource.cpp b/Source/WebCore/Modules/mediasource/MediaSource.cpp >index c88e394d39a0701f401ceb63ff964c060355d291..e85c91b25a691b06f6d9ee8911e950c9eb779177 100644 >--- a/Source/WebCore/Modules/mediasource/MediaSource.cpp >+++ b/Source/WebCore/Modules/mediasource/MediaSource.cpp >@@ -729,7 +729,7 @@ ExceptionOr<void> MediaSource::removeSourceBuffer(SourceBuffer& buffer) > // 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 @@ ExceptionOr<void> MediaSource::removeSourceBuffer(SourceBuffer& buffer) > // 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 @@ ExceptionOr<void> MediaSource::removeSourceBuffer(SourceBuffer& buffer) > // 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 ... >diff --git a/Source/WebCore/Modules/mediasource/SourceBuffer.cpp b/Source/WebCore/Modules/mediasource/SourceBuffer.cpp >index 868ac88262ab313427448d0f70a9c72108527b32..1fa3974797ae24175a2730f161fa110ea0f38606 100644 >--- a/Source/WebCore/Modules/mediasource/SourceBuffer.cpp >+++ b/Source/WebCore/Modules/mediasource/SourceBuffer.cpp >@@ -1088,7 +1088,7 @@ void SourceBuffer::sourceBufferPrivateDidReceiveInitializationSegment(const Init > // 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 @@ void SourceBuffer::sourceBufferPrivateDidReceiveInitializationSegment(const Init > // 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 @@ void SourceBuffer::sourceBufferPrivateDidReceiveInitializationSegment(const Init > // 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())); >diff --git a/Source/WebCore/html/HTMLMediaElement.cpp b/Source/WebCore/html/HTMLMediaElement.cpp >index 9155427e7543342e78710f56b58c545d24ed4109..e2f9a3701801a437bcb127260af96ff740a641bd 100644 >--- a/Source/WebCore/html/HTMLMediaElement.cpp >+++ b/Source/WebCore/html/HTMLMediaElement.cpp >@@ -4012,7 +4012,7 @@ void HTMLMediaElement::closeCaptionTracksChanged() > > void HTMLMediaElement::addAudioTrack(Ref<AudioTrack>&& track) > { >- audioTracks().append(WTFMove(track)); >+ ensureAudioTracks().append(WTFMove(track)); > } > > void HTMLMediaElement::addTextTrack(Ref<TextTrack>&& track) >@@ -4025,14 +4025,14 @@ void HTMLMediaElement::addTextTrack(Ref<TextTrack>&& track) > m_captionDisplayMode = page->group().captionPreferences().captionDisplayMode(); > } > >- textTracks().append(WTFMove(track)); >+ ensureTextTracks().append(WTFMove(track)); > > closeCaptionTracksChanged(); > } > > void HTMLMediaElement::addVideoTrack(Ref<VideoTrack>&& track) > { >- videoTracks().append(WTFMove(track)); >+ ensureVideoTracks().append(WTFMove(track)); > } > > void HTMLMediaElement::removeAudioTrack(Ref<AudioTrack>&& track) >@@ -4110,7 +4110,7 @@ ExceptionOr<TextTrack&> HTMLMediaElement::addTextTrack(const String& kind, const > return trackReference; > } > >-AudioTrackList& HTMLMediaElement::audioTracks() >+AudioTrackList& HTMLMediaElement::ensureAudioTracks() > { > if (!m_audioTracks) > m_audioTracks = AudioTrackList::create(this, ActiveDOMObject::scriptExecutionContext()); >@@ -4118,7 +4118,7 @@ AudioTrackList& HTMLMediaElement::audioTracks() > return *m_audioTracks; > } > >-TextTrackList& HTMLMediaElement::textTracks() >+TextTrackList& HTMLMediaElement::ensureTextTracks() > { > if (!m_textTracks) > m_textTracks = TextTrackList::create(this, ActiveDOMObject::scriptExecutionContext()); >@@ -4126,7 +4126,7 @@ TextTrackList& HTMLMediaElement::textTracks() > return *m_textTracks; > } > >-VideoTrackList& HTMLMediaElement::videoTracks() >+VideoTrackList& HTMLMediaElement::ensureVideoTracks() > { > if (!m_videoTracks) > m_videoTracks = VideoTrackList::create(this, ActiveDOMObject::scriptExecutionContext()); >@@ -4407,25 +4407,25 @@ void HTMLMediaElement::visibilityDidChange() > > void HTMLMediaElement::setSelectedTextTrack(TextTrack* trackToSelect) > { >- TextTrackList& trackList = textTracks(); >- if (!trackList.length()) >+ auto* trackList = textTracks(); >+ if (!trackList || !trackList->length()) > return; > > if (trackToSelect == TextTrack::captionMenuAutomaticItem()) { > 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 >diff --git a/Source/WebCore/html/HTMLMediaElement.h b/Source/WebCore/html/HTMLMediaElement.h >index cd61000d7e160a8656d55271396f35a488052936..768190969963f600b2f8c3c4811853327c685b22 100644 >--- a/Source/WebCore/html/HTMLMediaElement.h >+++ b/Source/WebCore/html/HTMLMediaElement.h >@@ -330,9 +330,12 @@ public: > #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; } > >diff --git a/Source/WebCore/html/HTMLMediaElement.idl b/Source/WebCore/html/HTMLMediaElement.idl >index 3ef613839ddf58228999e3e8b54d873004e2b04f..8afcc5ba0cd0b5a5cea429e85e6ba2579b64c357 100644 >--- a/Source/WebCore/html/HTMLMediaElement.idl >+++ b/Source/WebCore/html/HTMLMediaElement.idl >@@ -110,9 +110,9 @@ typedef ( > [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; > >diff --git a/Source/WebCore/html/shadow/MediaControlElements.cpp b/Source/WebCore/html/shadow/MediaControlElements.cpp >index c41025f58d6cdcb2ab9dea1099e75d58f393637b..9e63de19882e56e6e419e8f6d7020e1d54f01292 100644 >--- a/Source/WebCore/html/shadow/MediaControlElements.cpp >+++ b/Source/WebCore/html/shadow/MediaControlElements.cpp >@@ -760,7 +760,7 @@ void MediaControlClosedCaptionsTrackListElement::updateDisplay() > if (!mediaElement) > return; > >- if (!mediaElement->textTracks().length()) >+ if (!mediaElement->textTracks() || !mediaElement->textTracks()->length()) > return; > > rebuildTrackListMenu(); >@@ -821,14 +821,14 @@ void MediaControlClosedCaptionsTrackListElement::rebuildTrackListMenu() > 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 @@ void MediaControlTextTrackContainerElement::updateTextStrokeStyle() > // 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; >+ } > } > } > >diff --git a/Source/WebCore/html/track/TextTrack.cpp b/Source/WebCore/html/track/TextTrack.cpp >index 68fbeaf8dd64019e7725306ef57b55ada6981415..cb14e49f38b106a4a0f1b8dbc40ae0d4d1dea03b 100644 >--- a/Source/WebCore/html/track/TextTrack.cpp >+++ b/Source/WebCore/html/track/TextTrack.cpp >@@ -189,7 +189,7 @@ void TextTrack::setKind(Kind newKind) > // 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 @@ int TextTrack::trackIndex() > { > 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 @@ int TextTrack::trackIndexRelativeToRenderedTracks() > { > 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 @@ void TextTrack::setLanguage(const AtomicString& language) > // 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 > >diff --git a/Source/WebCore/html/track/VideoTrack.cpp b/Source/WebCore/html/track/VideoTrack.cpp >index 1a4a2931e3e2040d9c9effef0b5ab4386efd12a9..75c97e6ce90b628dc23647d22a6ffd9fa98512b3 100644 >--- a/Source/WebCore/html/track/VideoTrack.cpp >+++ b/Source/WebCore/html/track/VideoTrack.cpp >@@ -189,7 +189,7 @@ void VideoTrack::setKind(const AtomicString& kind) > > // 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 @@ void VideoTrack::setLanguage(const AtomicString& language) > // 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 >diff --git a/Source/WebCore/platform/cocoa/PlaybackSessionModelMediaElement.mm b/Source/WebCore/platform/cocoa/PlaybackSessionModelMediaElement.mm >index 87b5109a503eb45a5f3cea6e8bd795071684fc56..a11b70c1ed296ce0cd1ec1798df61d17fd0273d7 100644 >--- a/Source/WebCore/platform/cocoa/PlaybackSessionModelMediaElement.mm >+++ b/Source/WebCore/platform/cocoa/PlaybackSessionModelMediaElement.mm >@@ -66,15 +66,17 @@ void PlaybackSessionModelMediaElement::setMediaElement(HTMLMediaElement* mediaEl > 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); >- >- 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* audioTracks = m_mediaElement->audioTracks()) { >+ audioTracks->removeEventListener(events.addtrackEvent, *this, false); >+ audioTracks->removeEventListener(events.changeEvent, *this, false); >+ audioTracks->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 @@ void PlaybackSessionModelMediaElement::setMediaElement(HTMLMediaElement* mediaEl > 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 @@ void PlaybackSessionModelMediaElement::updateMediaSelectionOptions() > 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(); >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 188094
: 345915