Title: [273191] trunk/Source/WebCore
Revision
273191
Author
drou...@apple.com
Date
2021-02-19 21:29:42 -0800 (Fri, 19 Feb 2021)

Log Message

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):

Modified Paths

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();
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to