Changeset 273191 in webkit
- Timestamp:
- Feb 19, 2021 9:29:42 PM (3 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r273185 r273191 1 2021-02-19 Devin Rousso <drousso@apple.com> 2 3 Allow track lists other than Subtitles/Captions/Descriptions to be sorted 4 https://bugs.webkit.org/show_bug.cgi?id=222207 5 <rdar://problem/74539660> 6 7 Reviewed by Eric Carlson. 8 9 * html/track/TextTrac.h: 10 * page/CaptionUserPreferences.h: 11 * page/CaptionUserPreferences.cpp: 12 (WebCore::CaptionUserPreferences::sortedTrackListForMenu): 13 * page/CaptionUserPreferencesMediaAF.h: 14 * platform/cocoa/PlaybackSessionModelMediaElement.mm: 15 (WebCore::PlaybackSessionModelMediaElement::updateMediaSelectionOptions): 16 * page/CaptionUserPreferencesMediaAF.cpp: 17 (WebCore::CaptionUserPreferencesMediaAF::sortedTrackListForMenu): 18 19 * Modules/modern-media-controls/media/overflow-support.js: 20 (OverflowSupport.prototype.get tracksToMonitor): 21 * Modules/mediacontrols/MediaControlsHost.cpp: 22 (WebCore::MediaControlsHost::sortedTrackListForMenu): 23 (WebCore::MediaControlsHost::showMediaControlsContextMenu): 24 1 25 2021-02-19 Patrick Angle <pangle@apple.com> 2 26 -
trunk/Source/WebCore/Modules/mediacontrols/MediaControlsHost.cpp
r273024 r273191 52 52 #include <wtf/Variant.h> 53 53 54 namespace WebCore {55 56 54 #if USE(APPLE_INTERNAL_SDK) 57 55 #include <WebKitAdditions/MediaControlsHostAdditions.cpp> 56 #endif 57 58 namespace WebCore { 59 60 #if defined(MediaControlsHostAdditions_members) 61 MediaControlsHostAdditions_members 58 62 #endif 59 63 … … 109 113 return { }; 110 114 111 return page->group().captionPreferences().sortedTrackListForMenu(&trackList );115 return page->group().captionPreferences().sortedTrackListForMenu(&trackList, { TextTrack::Kind::Subtitles, TextTrack::Kind::Captions, TextTrack::Kind::Descriptions }); 112 116 } 113 117 … … 403 407 404 408 auto& captionPreferences = page->group().captionPreferences(); 405 auto sortedTextTracks = captionPreferences.sortedTrackListForMenu(textTracks );409 auto sortedTextTracks = captionPreferences.sortedTrackListForMenu(textTracks, { TextTrack::Kind::Subtitles, TextTrack::Kind::Captions, TextTrack::Kind::Descriptions }); 406 410 bool allTracksDisabled = notFound == sortedTextTracks.findMatching([] (const auto& textTrack) { 407 411 return textTrack->mode() == TextTrack::Mode::Showing; -
trunk/Source/WebCore/Modules/modern-media-controls/media/overflow-support.js
r273024 r273191 36 36 } 37 37 38 get tracksToMonitor() 39 { 40 let tracksToMonitor = []; 41 window["WebKitAdditions.OverflowSupport.prototype.get_tracksToMonitor"]?.(this, tracksToMonitor); 42 return tracksToMonitor; 43 } 44 38 45 get control() 39 46 { -
trunk/Source/WebCore/html/track/TextTrack.h
r262695 r273191 234 234 }; 235 235 236 }; 236 template<> struct DefaultHash<WebCore::TextTrack::Kind> : IntHash<WebCore::TextTrack::Kind> { }; 237 template<> struct HashTraits<WebCore::TextTrack::Kind> : StrongEnumHashTraits<WebCore::TextTrack::Kind> { }; 238 239 } // namespace WTF 237 240 238 241 SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::TextTrack) -
trunk/Source/WebCore/page/CaptionUserPreferences.cpp
r271153 r273191 226 226 } 227 227 228 Vector<RefPtr<TextTrack>> CaptionUserPreferences::sortedTrackListForMenu(TextTrackList* trackList )228 Vector<RefPtr<TextTrack>> CaptionUserPreferences::sortedTrackListForMenu(TextTrackList* trackList, HashSet<TextTrack::Kind> kinds) 229 229 { 230 230 ASSERT(trackList); … … 234 234 for (unsigned i = 0, length = trackList->length(); i < length; ++i) { 235 235 TextTrack* track = trackList->item(i); 236 auto kind = track->kind(); 237 if (kind == TextTrack::Kind::Captions || kind == TextTrack::Kind::Descriptions || kind == TextTrack::Kind::Subtitles) 236 if (kinds.contains(track->kind())) 238 237 tracksForMenu.append(track); 239 238 } … … 243 242 }); 244 243 245 tracksForMenu.insert(0, &TextTrack::captionMenuOffItem()); 246 tracksForMenu.insert(1, &TextTrack::captionMenuAutomaticItem()); 244 if (kinds.contains(TextTrack::Kind::Subtitles) || kinds.contains(TextTrack::Kind::Captions) || kinds.contains(TextTrack::Kind::Descriptions)) { 245 tracksForMenu.insert(0, &TextTrack::captionMenuOffItem()); 246 tracksForMenu.insert(1, &TextTrack::captionMenuAutomaticItem()); 247 } 247 248 248 249 return tracksForMenu; -
trunk/Source/WebCore/page/CaptionUserPreferences.h
r262695 r273191 31 31 #include "TextTrack.h" 32 32 #include "Timer.h" 33 #include <wtf/HashSet.h> 33 34 34 35 namespace WebCore { … … 86 87 virtual String displayNameForTrack(TextTrack*) const; 87 88 MediaSelectionOption mediaSelectionOptionForTrack(TextTrack*) const; 88 virtual Vector<RefPtr<TextTrack>> sortedTrackListForMenu(TextTrackList* );89 virtual Vector<RefPtr<TextTrack>> sortedTrackListForMenu(TextTrackList*, HashSet<TextTrack::Kind>); 89 90 90 91 virtual String displayNameForTrack(AudioTrack*) const; -
trunk/Source/WebCore/page/CaptionUserPreferencesMediaAF.cpp
r264585 r273191 780 780 } 781 781 782 Vector<RefPtr<TextTrack>> CaptionUserPreferencesMediaAF::sortedTrackListForMenu(TextTrackList* trackList )782 Vector<RefPtr<TextTrack>> CaptionUserPreferencesMediaAF::sortedTrackListForMenu(TextTrackList* trackList, HashSet<TextTrack::Kind> kinds) 783 783 { 784 784 ASSERT(trackList); … … 789 789 bool prefersAccessibilityTracks = userPrefersCaptions(); 790 790 bool filterTrackList = shouldFilterTrackMenu(); 791 bool requestingCaptionsOrDescriptionsOrSubtitles = kinds.contains(TextTrack::Kind::Subtitles) || kinds.contains(TextTrack::Kind::Captions) || kinds.contains(TextTrack::Kind::Descriptions); 791 792 792 793 for (unsigned i = 0, length = trackList->length(); i < length; ++i) { … … 800 801 } 801 802 802 auto kind = track->kind(); 803 if (kind != TextTrack::Kind::Captions && kind != TextTrack::Kind::Descriptions && kind != TextTrack::Kind::Subtitles) 803 if (!kinds.contains(track->kind())) 804 804 continue; 805 805 806 if (track->containsOnlyForcedSubtitles()) { 807 LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - skipping '%s' track with language '%s' because it contains only forced subtitles", track->kindKeyword().string().utf8().data(), language.utf8().data()); 808 continue; 809 } 810 811 if (track->isEasyToRead()) { 812 LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - adding '%s' track with language '%s' because it is 'easy to read'", track->kindKeyword().string().utf8().data(), language.utf8().data()); 806 if (requestingCaptionsOrDescriptionsOrSubtitles) { 807 if (track->containsOnlyForcedSubtitles()) { 808 LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - skipping '%s' track with language '%s' because it contains only forced subtitles", track->kindKeyword().string().utf8().data(), language.utf8().data()); 809 continue; 810 } 811 812 if (track->isEasyToRead()) { 813 LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - adding '%s' track with language '%s' because it is 'easy to read'", track->kindKeyword().string().utf8().data(), language.utf8().data()); 814 if (!language.isEmpty()) 815 languagesIncluded.add(language); 816 tracksForMenu.append(track); 817 continue; 818 } 819 820 if (track->mode() == TextTrack::Mode::Showing) { 821 LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - adding '%s' track with language '%s' because it is already visible", track->kindKeyword().string().utf8().data(), language.utf8().data()); 822 if (!language.isEmpty()) 823 languagesIncluded.add(language); 824 tracksForMenu.append(track); 825 continue; 826 } 827 828 if (!language.isEmpty() && track->isMainProgramContent()) { 829 bool isAccessibilityTrack = track->kind() == TextTrack::Kind::Captions; 830 if (prefersAccessibilityTracks) { 831 // In the first pass, include only caption tracks if the user prefers accessibility tracks. 832 if (!isAccessibilityTrack && filterTrackList) { 833 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()); 834 continue; 835 } 836 } else { 837 // In the first pass, only include the first non-CC or SDH track with each language if the user prefers translation tracks. 838 if (isAccessibilityTrack && filterTrackList) { 839 LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - skipping '%s' track with language '%s' because it is an accessibility track", track->kindKeyword().string().utf8().data(), language.utf8().data()); 840 continue; 841 } 842 if (languagesIncluded.contains(language) && filterTrackList) { 843 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()); 844 continue; 845 } 846 } 847 } 848 813 849 if (!language.isEmpty()) 814 850 languagesIncluded.add(language); 815 tracksForMenu.append(track);816 continue;817 851 } 818 852 819 if (track->mode() == TextTrack::Mode::Showing) { 820 LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - adding '%s' track with language '%s' because it is already visible", track->kindKeyword().string().utf8().data(), language.utf8().data()); 821 if (!language.isEmpty()) 853 tracksForMenu.append(track); 854 855 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"); 856 } 857 858 if (requestingCaptionsOrDescriptionsOrSubtitles) { 859 // Now that we have filtered for the user's accessibility/translation preference, add all tracks with a unique language without regard to track type. 860 for (unsigned i = 0, length = trackList->length(); i < length; ++i) { 861 TextTrack* track = trackList->item(i); 862 String language = displayNameForLanguageLocale(track->language()); 863 864 if (tracksForMenu.contains(track)) 865 continue; 866 867 if (!kinds.contains(track->kind())) 868 continue; 869 870 // All candidates with no languge were added the first time through. 871 if (language.isEmpty()) 872 continue; 873 874 if (track->containsOnlyForcedSubtitles()) 875 continue; 876 877 if (!languagesIncluded.contains(language) && track->isMainProgramContent()) { 822 878 languagesIncluded.add(language); 823 tracksForMenu.append(track); 824 continue; 825 } 826 827 if (!language.isEmpty() && track->isMainProgramContent()) { 828 bool isAccessibilityTrack = track->kind() == TextTrack::Kind::Captions; 829 if (prefersAccessibilityTracks) { 830 // In the first pass, include only caption tracks if the user prefers accessibility tracks. 831 if (!isAccessibilityTrack && filterTrackList) { 832 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()); 833 continue; 834 } 835 } else { 836 // In the first pass, only include the first non-CC or SDH track with each language if the user prefers translation tracks. 837 if (isAccessibilityTrack && filterTrackList) { 838 LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - skipping '%s' track with language '%s' because it is an accessibility track", track->kindKeyword().string().utf8().data(), language.utf8().data()); 839 continue; 840 } 841 if (languagesIncluded.contains(language) && filterTrackList) { 842 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()); 843 continue; 844 } 879 tracksForMenu.append(track); 880 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()); 845 881 } 846 882 } 847 848 if (!language.isEmpty())849 languagesIncluded.add(language);850 tracksForMenu.append(track);851 852 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");853 }854 855 // Now that we have filtered for the user's accessibility/translation preference, add all tracks with a unique language without regard to track type.856 for (unsigned i = 0, length = trackList->length(); i < length; ++i) {857 TextTrack* track = trackList->item(i);858 String language = displayNameForLanguageLocale(track->language());859 860 if (tracksForMenu.contains(track))861 continue;862 863 auto kind = track->kind();864 if (kind != TextTrack::Kind::Captions && kind != TextTrack::Kind::Descriptions && kind != TextTrack::Kind::Subtitles)865 continue;866 867 // All candidates with no languge were added the first time through.868 if (language.isEmpty())869 continue;870 871 if (track->containsOnlyForcedSubtitles())872 continue;873 874 if (!languagesIncluded.contains(language) && track->isMainProgramContent()) {875 languagesIncluded.add(language);876 tracksForMenu.append(track);877 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());878 }879 883 } 880 884 … … 884 888 std::sort(tracksForMenu.begin(), tracksForMenu.end(), textTrackCompare); 885 889 886 tracksForMenu.insert(0, &TextTrack::captionMenuOffItem()); 887 tracksForMenu.insert(1, &TextTrack::captionMenuAutomaticItem()); 890 if (requestingCaptionsOrDescriptionsOrSubtitles) { 891 tracksForMenu.insert(0, &TextTrack::captionMenuOffItem()); 892 tracksForMenu.insert(1, &TextTrack::captionMenuAutomaticItem()); 893 } 888 894 889 895 return tracksForMenu; -
trunk/Source/WebCore/page/CaptionUserPreferencesMediaAF.h
r262695 r273191 67 67 String captionsStyleSheetOverride() const override; 68 68 Vector<RefPtr<AudioTrack>> sortedTrackListForMenu(AudioTrackList*) override; 69 Vector<RefPtr<TextTrack>> sortedTrackListForMenu(TextTrackList* ) override;69 Vector<RefPtr<TextTrack>> sortedTrackListForMenu(TextTrackList*, HashSet<TextTrack::Kind>) override; 70 70 String displayNameForTrack(AudioTrack*) const override; 71 71 String displayNameForTrack(TextTrack*) const override; -
trunk/Source/WebCore/platform/cocoa/PlaybackSessionModelMediaElement.mm
r272890 r273191 380 380 auto* textTracks = m_mediaElement->textTracks(); 381 381 if (textTracks && textTracks->length()) 382 m_legibleTracksForMenu = captionPreferences.sortedTrackListForMenu(textTracks );382 m_legibleTracksForMenu = captionPreferences.sortedTrackListForMenu(textTracks, { TextTrack::Kind::Subtitles, TextTrack::Kind::Captions, TextTrack::Kind::Descriptions }); 383 383 else 384 384 m_legibleTracksForMenu.clear();
Note: See TracChangeset
for help on using the changeset viewer.