Diff
Modified: trunk/Source/WebCore/ChangeLog (273190 => 273191)
--- trunk/Source/WebCore/ChangeLog 2021-02-20 03:46:08 UTC (rev 273190)
+++ trunk/Source/WebCore/ChangeLog 2021-02-20 05:29:42 UTC (rev 273191)
@@ -1,3 +1,27 @@
+2021-02-19 Devin Rousso <drou...@apple.com>
+
+ Allow track lists other than Subtitles/Captions/Descriptions to be sorted
+ https://bugs.webkit.org/show_bug.cgi?id=222207
+ <rdar://problem/74539660>
+
+ Reviewed by Eric Carlson.
+
+ * html/track/TextTrac.h:
+ * page/CaptionUserPreferences.h:
+ * page/CaptionUserPreferences.cpp:
+ (WebCore::CaptionUserPreferences::sortedTrackListForMenu):
+ * page/CaptionUserPreferencesMediaAF.h:
+ * platform/cocoa/PlaybackSessionModelMediaElement.mm:
+ (WebCore::PlaybackSessionModelMediaElement::updateMediaSelectionOptions):
+ * page/CaptionUserPreferencesMediaAF.cpp:
+ (WebCore::CaptionUserPreferencesMediaAF::sortedTrackListForMenu):
+
+ * Modules/modern-media-controls/media/overflow-support.js:
+ (OverflowSupport.prototype.get tracksToMonitor):
+ * Modules/mediacontrols/MediaControlsHost.cpp:
+ (WebCore::MediaControlsHost::sortedTrackListForMenu):
+ (WebCore::MediaControlsHost::showMediaControlsContextMenu):
+
2021-02-19 Patrick Angle <pan...@apple.com>
Web Inspector: Implement Grid Overlay "Show line names" drawing
Modified: trunk/Source/WebCore/Modules/mediacontrols/MediaControlsHost.cpp (273190 => 273191)
--- trunk/Source/WebCore/Modules/mediacontrols/MediaControlsHost.cpp 2021-02-20 03:46:08 UTC (rev 273190)
+++ trunk/Source/WebCore/Modules/mediacontrols/MediaControlsHost.cpp 2021-02-20 05:29:42 UTC (rev 273191)
@@ -51,12 +51,16 @@
#include <wtf/UUID.h>
#include <wtf/Variant.h>
-namespace WebCore {
-
#if USE(APPLE_INTERNAL_SDK)
#include <WebKitAdditions/MediaControlsHostAdditions.cpp>
#endif
+namespace WebCore {
+
+#if defined(MediaControlsHostAdditions_members)
+MediaControlsHostAdditions_members
+#endif
+
const AtomString& MediaControlsHost::automaticKeyword()
{
static MainThreadNeverDestroyed<const AtomString> automatic("automatic", AtomString::ConstructFromLiteral);
@@ -108,7 +112,7 @@
if (!page)
return { };
- return page->group().captionPreferences().sortedTrackListForMenu(&trackList);
+ return page->group().captionPreferences().sortedTrackListForMenu(&trackList, { TextTrack::Kind::Subtitles, TextTrack::Kind::Captions, TextTrack::Kind::Descriptions });
}
Vector<RefPtr<AudioTrack>> MediaControlsHost::sortedTrackListForMenu(AudioTrackList& trackList)
@@ -402,7 +406,7 @@
textTracksItem.children.reserveCapacity(textTracks->length());
auto& captionPreferences = page->group().captionPreferences();
- auto sortedTextTracks = captionPreferences.sortedTrackListForMenu(textTracks);
+ auto sortedTextTracks = captionPreferences.sortedTrackListForMenu(textTracks, { TextTrack::Kind::Subtitles, TextTrack::Kind::Captions, TextTrack::Kind::Descriptions });
bool allTracksDisabled = notFound == sortedTextTracks.findMatching([] (const auto& textTrack) {
return textTrack->mode() == TextTrack::Mode::Showing;
});
Modified: trunk/Source/WebCore/Modules/modern-media-controls/media/overflow-support.js (273190 => 273191)
--- trunk/Source/WebCore/Modules/modern-media-controls/media/overflow-support.js 2021-02-20 03:46:08 UTC (rev 273190)
+++ trunk/Source/WebCore/Modules/modern-media-controls/media/overflow-support.js 2021-02-20 05:29:42 UTC (rev 273191)
@@ -35,6 +35,13 @@
return mediaEvents;
}
+ get tracksToMonitor()
+ {
+ let tracksToMonitor = [];
+ window["WebKitAdditions.OverflowSupport.prototype.get_tracksToMonitor"]?.(this, tracksToMonitor);
+ return tracksToMonitor;
+ }
+
get control()
{
return this.mediaController.controls.overflowButton;
Modified: trunk/Source/WebCore/html/track/TextTrack.h (273190 => 273191)
--- trunk/Source/WebCore/html/track/TextTrack.h 2021-02-20 03:46:08 UTC (rev 273190)
+++ trunk/Source/WebCore/html/track/TextTrack.h 2021-02-20 05:29:42 UTC (rev 273191)
@@ -233,8 +233,11 @@
}
};
-};
+template<> struct DefaultHash<WebCore::TextTrack::Kind> : IntHash<WebCore::TextTrack::Kind> { };
+template<> struct HashTraits<WebCore::TextTrack::Kind> : StrongEnumHashTraits<WebCore::TextTrack::Kind> { };
+} // namespace WTF
+
SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::TextTrack)
static bool isType(const WebCore::TrackBase& track) { return track.type() == WebCore::TrackBase::TextTrack; }
SPECIALIZE_TYPE_TRAITS_END()
Modified: trunk/Source/WebCore/page/CaptionUserPreferences.cpp (273190 => 273191)
--- trunk/Source/WebCore/page/CaptionUserPreferences.cpp 2021-02-20 03:46:08 UTC (rev 273190)
+++ trunk/Source/WebCore/page/CaptionUserPreferences.cpp 2021-02-20 05:29:42 UTC (rev 273191)
@@ -225,7 +225,7 @@
return { displayNameForTrack(track), type };
}
-Vector<RefPtr<TextTrack>> CaptionUserPreferences::sortedTrackListForMenu(TextTrackList* trackList)
+Vector<RefPtr<TextTrack>> CaptionUserPreferences::sortedTrackListForMenu(TextTrackList* trackList, HashSet<TextTrack::Kind> kinds)
{
ASSERT(trackList);
@@ -233,8 +233,7 @@
for (unsigned i = 0, length = trackList->length(); i < length; ++i) {
TextTrack* track = trackList->item(i);
- auto kind = track->kind();
- if (kind == TextTrack::Kind::Captions || kind == TextTrack::Kind::Descriptions || kind == TextTrack::Kind::Subtitles)
+ if (kinds.contains(track->kind()))
tracksForMenu.append(track);
}
@@ -242,8 +241,10 @@
return codePointCompare(trackDisplayName(a.get()), trackDisplayName(b.get())) < 0;
});
- tracksForMenu.insert(0, &TextTrack::captionMenuOffItem());
- tracksForMenu.insert(1, &TextTrack::captionMenuAutomaticItem());
+ if (kinds.contains(TextTrack::Kind::Subtitles) || kinds.contains(TextTrack::Kind::Captions) || kinds.contains(TextTrack::Kind::Descriptions)) {
+ tracksForMenu.insert(0, &TextTrack::captionMenuOffItem());
+ tracksForMenu.insert(1, &TextTrack::captionMenuAutomaticItem());
+ }
return tracksForMenu;
}
Modified: trunk/Source/WebCore/page/CaptionUserPreferences.h (273190 => 273191)
--- trunk/Source/WebCore/page/CaptionUserPreferences.h 2021-02-20 03:46:08 UTC (rev 273190)
+++ trunk/Source/WebCore/page/CaptionUserPreferences.h 2021-02-20 05:29:42 UTC (rev 273191)
@@ -30,6 +30,7 @@
#include "AudioTrack.h"
#include "TextTrack.h"
#include "Timer.h"
+#include <wtf/HashSet.h>
namespace WebCore {
@@ -85,7 +86,7 @@
virtual String displayNameForTrack(TextTrack*) const;
MediaSelectionOption mediaSelectionOptionForTrack(TextTrack*) const;
- virtual Vector<RefPtr<TextTrack>> sortedTrackListForMenu(TextTrackList*);
+ virtual Vector<RefPtr<TextTrack>> sortedTrackListForMenu(TextTrackList*, HashSet<TextTrack::Kind>);
virtual String displayNameForTrack(AudioTrack*) const;
MediaSelectionOption mediaSelectionOptionForTrack(AudioTrack*) const;
Modified: trunk/Source/WebCore/page/CaptionUserPreferencesMediaAF.cpp (273190 => 273191)
--- trunk/Source/WebCore/page/CaptionUserPreferencesMediaAF.cpp 2021-02-20 03:46:08 UTC (rev 273190)
+++ trunk/Source/WebCore/page/CaptionUserPreferencesMediaAF.cpp 2021-02-20 05:29:42 UTC (rev 273191)
@@ -779,7 +779,7 @@
return tracksForMenu;
}
-Vector<RefPtr<TextTrack>> CaptionUserPreferencesMediaAF::sortedTrackListForMenu(TextTrackList* trackList)
+Vector<RefPtr<TextTrack>> CaptionUserPreferencesMediaAF::sortedTrackListForMenu(TextTrackList* trackList, HashSet<TextTrack::Kind> kinds)
{
ASSERT(trackList);
@@ -788,6 +788,7 @@
CaptionDisplayMode displayMode = captionDisplayMode();
bool prefersAccessibilityTracks = userPrefersCaptions();
bool filterTrackList = shouldFilterTrackMenu();
+ bool requestingCaptionsOrDescriptionsOrSubtitles = kinds.contains(TextTrack::Kind::Subtitles) || kinds.contains(TextTrack::Kind::Captions) || kinds.contains(TextTrack::Kind::Descriptions);
for (unsigned i = 0, length = trackList->length(); i < length; ++i) {
TextTrack* track = trackList->item(i);
@@ -799,82 +800,85 @@
continue;
}
- auto kind = track->kind();
- if (kind != TextTrack::Kind::Captions && kind != TextTrack::Kind::Descriptions && kind != TextTrack::Kind::Subtitles)
+ if (!kinds.contains(track->kind()))
continue;
- if (track->containsOnlyForcedSubtitles()) {
- LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - skipping '%s' track with language '%s' because it contains only forced subtitles", track->kindKeyword().string().utf8().data(), language.utf8().data());
- continue;
- }
-
- if (track->isEasyToRead()) {
- LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - adding '%s' track with language '%s' because it is 'easy to read'", track->kindKeyword().string().utf8().data(), language.utf8().data());
- if (!language.isEmpty())
- languagesIncluded.add(language);
- tracksForMenu.append(track);
- continue;
- }
+ if (requestingCaptionsOrDescriptionsOrSubtitles) {
+ if (track->containsOnlyForcedSubtitles()) {
+ LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - skipping '%s' track with language '%s' because it contains only forced subtitles", track->kindKeyword().string().utf8().data(), language.utf8().data());
+ continue;
+ }
- if (track->mode() == TextTrack::Mode::Showing) {
- LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - adding '%s' track with language '%s' because it is already visible", track->kindKeyword().string().utf8().data(), language.utf8().data());
- if (!language.isEmpty())
- languagesIncluded.add(language);
- tracksForMenu.append(track);
- continue;
- }
+ if (track->isEasyToRead()) {
+ LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - adding '%s' track with language '%s' because it is 'easy to read'", track->kindKeyword().string().utf8().data(), language.utf8().data());
+ if (!language.isEmpty())
+ languagesIncluded.add(language);
+ tracksForMenu.append(track);
+ continue;
+ }
- if (!language.isEmpty() && track->isMainProgramContent()) {
- bool isAccessibilityTrack = track->kind() == TextTrack::Kind::Captions;
- if (prefersAccessibilityTracks) {
- // In the first pass, include only caption tracks if the user prefers accessibility tracks.
- if (!isAccessibilityTrack && filterTrackList) {
- LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - skipping '%s' track with language '%s' because it is NOT an accessibility track", track->kindKeyword().string().utf8().data(), language.utf8().data());
- continue;
+ if (track->mode() == TextTrack::Mode::Showing) {
+ LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - adding '%s' track with language '%s' because it is already visible", track->kindKeyword().string().utf8().data(), language.utf8().data());
+ if (!language.isEmpty())
+ languagesIncluded.add(language);
+ tracksForMenu.append(track);
+ continue;
+ }
+
+ if (!language.isEmpty() && track->isMainProgramContent()) {
+ bool isAccessibilityTrack = track->kind() == TextTrack::Kind::Captions;
+ if (prefersAccessibilityTracks) {
+ // In the first pass, include only caption tracks if the user prefers accessibility tracks.
+ if (!isAccessibilityTrack && filterTrackList) {
+ LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - skipping '%s' track with language '%s' because it is NOT an accessibility track", track->kindKeyword().string().utf8().data(), language.utf8().data());
+ continue;
+ }
+ } else {
+ // In the first pass, only include the first non-CC or SDH track with each language if the user prefers translation tracks.
+ if (isAccessibilityTrack && filterTrackList) {
+ LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - skipping '%s' track with language '%s' because it is an accessibility track", track->kindKeyword().string().utf8().data(), language.utf8().data());
+ continue;
+ }
+ if (languagesIncluded.contains(language) && filterTrackList) {
+ LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - skipping '%s' track with language '%s' because it is not the first with this language", track->kindKeyword().string().utf8().data(), language.utf8().data());
+ continue;
+ }
}
- } else {
- // In the first pass, only include the first non-CC or SDH track with each language if the user prefers translation tracks.
- if (isAccessibilityTrack && filterTrackList) {
- LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - skipping '%s' track with language '%s' because it is an accessibility track", track->kindKeyword().string().utf8().data(), language.utf8().data());
- continue;
- }
- if (languagesIncluded.contains(language) && filterTrackList) {
- LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - skipping '%s' track with language '%s' because it is not the first with this language", track->kindKeyword().string().utf8().data(), language.utf8().data());
- continue;
- }
}
+
+ if (!language.isEmpty())
+ languagesIncluded.add(language);
}
- if (!language.isEmpty())
- languagesIncluded.add(language);
tracksForMenu.append(track);
LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - adding '%s' track with language '%s', is%s main program content", track->kindKeyword().string().utf8().data(), language.utf8().data(), track->isMainProgramContent() ? "" : " NOT");
}
- // Now that we have filtered for the user's accessibility/translation preference, add all tracks with a unique language without regard to track type.
- for (unsigned i = 0, length = trackList->length(); i < length; ++i) {
- TextTrack* track = trackList->item(i);
- String language = displayNameForLanguageLocale(track->language());
+ if (requestingCaptionsOrDescriptionsOrSubtitles) {
+ // Now that we have filtered for the user's accessibility/translation preference, add all tracks with a unique language without regard to track type.
+ for (unsigned i = 0, length = trackList->length(); i < length; ++i) {
+ TextTrack* track = trackList->item(i);
+ String language = displayNameForLanguageLocale(track->language());
- if (tracksForMenu.contains(track))
- continue;
+ if (tracksForMenu.contains(track))
+ continue;
- auto kind = track->kind();
- if (kind != TextTrack::Kind::Captions && kind != TextTrack::Kind::Descriptions && kind != TextTrack::Kind::Subtitles)
- continue;
+ if (!kinds.contains(track->kind()))
+ continue;
- // All candidates with no languge were added the first time through.
- if (language.isEmpty())
- continue;
+ // All candidates with no languge were added the first time through.
+ if (language.isEmpty())
+ continue;
- if (track->containsOnlyForcedSubtitles())
- continue;
+ if (track->containsOnlyForcedSubtitles())
+ continue;
- if (!languagesIncluded.contains(language) && track->isMainProgramContent()) {
- languagesIncluded.add(language);
- tracksForMenu.append(track);
- LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - adding '%s' track with language '%s' because it is the only track with this language", track->kindKeyword().string().utf8().data(), language.utf8().data());
+ if (!languagesIncluded.contains(language) && track->isMainProgramContent()) {
+ languagesIncluded.add(language);
+ tracksForMenu.append(track);
+ LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - adding '%s' track with language '%s' because it is the only track with this language", track->kindKeyword().string().utf8().data(), language.utf8().data());
+ }
}
}
@@ -883,8 +887,10 @@
std::sort(tracksForMenu.begin(), tracksForMenu.end(), textTrackCompare);
- tracksForMenu.insert(0, &TextTrack::captionMenuOffItem());
- tracksForMenu.insert(1, &TextTrack::captionMenuAutomaticItem());
+ if (requestingCaptionsOrDescriptionsOrSubtitles) {
+ tracksForMenu.insert(0, &TextTrack::captionMenuOffItem());
+ tracksForMenu.insert(1, &TextTrack::captionMenuAutomaticItem());
+ }
return tracksForMenu;
}
Modified: trunk/Source/WebCore/page/CaptionUserPreferencesMediaAF.h (273190 => 273191)
--- trunk/Source/WebCore/page/CaptionUserPreferencesMediaAF.h 2021-02-20 03:46:08 UTC (rev 273190)
+++ trunk/Source/WebCore/page/CaptionUserPreferencesMediaAF.h 2021-02-20 05:29:42 UTC (rev 273191)
@@ -66,7 +66,7 @@
String captionsStyleSheetOverride() const override;
Vector<RefPtr<AudioTrack>> sortedTrackListForMenu(AudioTrackList*) override;
- Vector<RefPtr<TextTrack>> sortedTrackListForMenu(TextTrackList*) override;
+ Vector<RefPtr<TextTrack>> sortedTrackListForMenu(TextTrackList*, HashSet<TextTrack::Kind>) override;
String displayNameForTrack(AudioTrack*) const override;
String displayNameForTrack(TextTrack*) const override;
Modified: trunk/Source/WebCore/platform/cocoa/PlaybackSessionModelMediaElement.mm (273190 => 273191)
--- trunk/Source/WebCore/platform/cocoa/PlaybackSessionModelMediaElement.mm 2021-02-20 03:46:08 UTC (rev 273190)
+++ trunk/Source/WebCore/platform/cocoa/PlaybackSessionModelMediaElement.mm 2021-02-20 05:29:42 UTC (rev 273191)
@@ -379,7 +379,7 @@
auto& captionPreferences = m_mediaElement->document().page()->group().captionPreferences();
auto* textTracks = m_mediaElement->textTracks();
if (textTracks && textTracks->length())
- m_legibleTracksForMenu = captionPreferences.sortedTrackListForMenu(textTracks);
+ m_legibleTracksForMenu = captionPreferences.sortedTrackListForMenu(textTracks, { TextTrack::Kind::Subtitles, TextTrack::Kind::Captions, TextTrack::Kind::Descriptions });
else
m_legibleTracksForMenu.clear();