Changeset 196010 in webkit


Ignore:
Timestamp:
Feb 2, 2016 8:38:02 AM (8 years ago)
Author:
eric.carlson@apple.com
Message:

Allow ports to disable automatic text track selection
https://bugs.webkit.org/show_bug.cgi?id=153761
<rdar://problem/24416768>

Reviewed by Darin Adler.

Source/WebCore:

Test: media/track/track-manual-mode.html

  • Modules/mediacontrols/MediaControlsHost.cpp:

(WebCore::MediaControlsHost::manualKeyword): New.
(WebCore::MediaControlsHost::captionDisplayMode): Support 'manual' mode.

  • Modules/mediacontrols/MediaControlsHost.h:
  • Modules/mediacontrols/mediaControlsApple.js:

(Controller.prototype.buildCaptionMenu): Check the 'off' item when in manual mode.

  • html/HTMLMediaElement.cpp:

(WebCore::HTMLMediaElement::addTextTrack): Update m_captionDisplayMode when called for the first

time so it is always correct. Set the track's manual selection mode as appropriate.

(WebCore::HTMLMediaElement::captionPreferencesChanged): Set each track's manual selection

mode as appropriate.

  • html/track/TextTrack.cpp:

(WebCore::TextTrack::kind): Return 'subtitles' for forced tracks when in manual mode.

  • html/track/TextTrack.h:
  • html/track/TrackBase.h:

(WebCore::TrackBase::kind): Make virtual.

  • page/CaptionUserPreferences.cpp:

(WebCore::CaptionUserPreferences::beginBlockingNotifications): New.
(WebCore::CaptionUserPreferences::endBlockingNotifications): Ditto.
(WebCore::CaptionUserPreferences::notify): Don't notify when blocked.

  • page/CaptionUserPreferences.h:
  • page/CaptionUserPreferencesMediaAF.cpp:

(WebCore::CaptionUserPreferencesMediaAF::CaptionUserPreferencesMediaAF): Set manual mode

when appropriate.

(WebCore::CaptionUserPreferencesMediaAF::captionDisplayMode): Check manual mode.
(WebCore::CaptionUserPreferencesMediaAF::setCaptionDisplayMode): Ditto.
(WebCore::CaptionUserPreferencesMediaAF::setPreferredLanguage): Ditto.
(WebCore::CaptionUserPreferencesMediaAF::textTrackSelectionScore): Return zero when in manual mode.
(WebCore::CaptionUserPreferencesMediaAF::sortedTrackListForMenu): Consider manual mode. Fix

typos in logging.

  • platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:

(WebCore::mediaDescriptionForKind): Return 'auxiliary' when in manual mode.

  • testing/Internals.cpp:

(WebCore::Internals::setCaptionDisplayMode): Support manual mode.

LayoutTests:

  • media/track/track-manual-mode-expected.txt: Added.
  • media/track/track-manual-mode.html: Added.
Location:
trunk
Files:
2 added
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r196008 r196010  
     12016-02-02  Eric Carlson  <eric.carlson@apple.com>
     2
     3        Allow ports to disable automatic text track selection
     4        https://bugs.webkit.org/show_bug.cgi?id=153761
     5        <rdar://problem/24416768>
     6
     7        Reviewed by Darin Adler.
     8
     9        * media/track/track-manual-mode-expected.txt: Added.
     10        * media/track/track-manual-mode.html: Added.
     11
    1122016-02-02  Zalan Bujtas  <zalan@apple.com>
    213
  • trunk/Source/WebCore/ChangeLog

    r196009 r196010  
     12016-02-02  Eric Carlson  <eric.carlson@apple.com>
     2
     3        Allow ports to disable automatic text track selection
     4        https://bugs.webkit.org/show_bug.cgi?id=153761
     5        <rdar://problem/24416768>
     6
     7        Reviewed by Darin Adler.
     8
     9        Test: media/track/track-manual-mode.html
     10
     11        * Modules/mediacontrols/MediaControlsHost.cpp:
     12        (WebCore::MediaControlsHost::manualKeyword): New.
     13        (WebCore::MediaControlsHost::captionDisplayMode): Support 'manual' mode.
     14        * Modules/mediacontrols/MediaControlsHost.h:
     15
     16        * Modules/mediacontrols/mediaControlsApple.js:
     17        (Controller.prototype.buildCaptionMenu): Check the 'off' item when in manual mode.
     18
     19        * html/HTMLMediaElement.cpp:
     20        (WebCore::HTMLMediaElement::addTextTrack): Update m_captionDisplayMode when called for the first
     21          time so it is always correct. Set the track's manual selection mode as appropriate.
     22        (WebCore::HTMLMediaElement::captionPreferencesChanged): Set each track's manual selection
     23          mode as appropriate.
     24
     25        * html/track/TextTrack.cpp:
     26        (WebCore::TextTrack::kind): Return 'subtitles' for forced tracks when in manual mode.
     27        * html/track/TextTrack.h:
     28
     29        * html/track/TrackBase.h:
     30        (WebCore::TrackBase::kind): Make virtual.
     31
     32        * page/CaptionUserPreferences.cpp:
     33        (WebCore::CaptionUserPreferences::beginBlockingNotifications): New.
     34        (WebCore::CaptionUserPreferences::endBlockingNotifications): Ditto.
     35        (WebCore::CaptionUserPreferences::notify): Don't notify when blocked.
     36        * page/CaptionUserPreferences.h:
     37
     38        * page/CaptionUserPreferencesMediaAF.cpp:
     39        (WebCore::CaptionUserPreferencesMediaAF::CaptionUserPreferencesMediaAF): Set manual mode
     40          when appropriate.
     41        (WebCore::CaptionUserPreferencesMediaAF::captionDisplayMode): Check manual mode.
     42        (WebCore::CaptionUserPreferencesMediaAF::setCaptionDisplayMode): Ditto.
     43        (WebCore::CaptionUserPreferencesMediaAF::setPreferredLanguage): Ditto.
     44        (WebCore::CaptionUserPreferencesMediaAF::textTrackSelectionScore): Return zero when in manual mode.
     45        (WebCore::CaptionUserPreferencesMediaAF::sortedTrackListForMenu): Consider manual mode. Fix
     46          typos in logging.
     47
     48        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
     49        (WebCore::mediaDescriptionForKind): Return 'auxiliary' when in manual mode.
     50
     51        * testing/Internals.cpp:
     52        (WebCore::Internals::setCaptionDisplayMode): Support manual mode.
     53
    1542016-02-02  Adrien Plazas  <aplazas@igalia.com>
    255
  • trunk/Source/WebCore/Modules/mediacontrols/MediaControlsHost.cpp

    r195487 r196010  
    6262}
    6363
     64const AtomicString& MediaControlsHost::manualKeyword()
     65{
     66    static NeverDestroyed<const AtomicString> alwaysOn("manual", AtomicString::ConstructFromLiteral);
     67    return alwaysOn;
     68}
     69
     70
    6471Ref<MediaControlsHost> MediaControlsHost::create(HTMLMediaElement* mediaElement)
    6572{
     
    152159    case CaptionUserPreferences::AlwaysOn:
    153160        return alwaysOnKeyword();
     161    case CaptionUserPreferences::Manual:
     162        return manualKeyword();
    154163    default:
    155164        ASSERT_NOT_REACHED();
  • trunk/Source/WebCore/Modules/mediacontrols/MediaControlsHost.h

    r185472 r196010  
    5353    static const AtomicString& forcedOnlyKeyword();
    5454    static const AtomicString& alwaysOnKeyword();
     55    static const AtomicString& manualKeyword();
    5556
    5657    Vector<RefPtr<TextTrack>> sortedTrackListForMenu(TextTrackList*);
  • trunk/Source/WebCore/Modules/mediacontrols/mediaControlsApple.js

    r195912 r196010  
    18371837            }
    18381838
    1839             if (offMenu && displayMode === 'forced-only' && !trackMenuItemSelected) {
     1839            if (offMenu && (displayMode === 'forced-only' || displayMode === 'manual') && !trackMenuItemSelected) {
    18401840                offMenu.classList.add(this.ClassNames.selected);
    18411841                offMenu.setAttribute('tabindex', '0');
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r195953 r196010  
    35773577    if (!m_requireCaptionPreferencesChangedCallbacks) {
    35783578        m_requireCaptionPreferencesChangedCallbacks = true;
    3579         document().registerForCaptionPreferencesChangedCallbacks(this);
    3580     }
    3581 
     3579        Document& document = this->document();
     3580        document.registerForCaptionPreferencesChangedCallbacks(this);
     3581        if (Page* page = document.page())
     3582            m_captionDisplayMode = page->group().captionPreferences()->captionDisplayMode();
     3583    }
     3584
     3585    track->setManualSelectionMode(m_captionDisplayMode == CaptionUserPreferences::Manual);
    35823586    textTracks()->append(track);
    35833587
     
    57245728        return;
    57255729
     5730    if (m_captionDisplayMode == CaptionUserPreferences::Manual || displayMode == CaptionUserPreferences::Manual) {
     5731        for (unsigned i = 0; i < m_textTracks->length(); ++i)
     5732            m_textTracks->item(i)->setManualSelectionMode(displayMode == CaptionUserPreferences::Manual);
     5733    }
     5734
    57265735    m_captionDisplayMode = displayMode;
    57275736    setWebkitClosedCaptionsVisible(m_captionDisplayMode == CaptionUserPreferences::AlwaysOn);
  • trunk/Source/WebCore/html/track/TextTrack.cpp

    r194819 r196010  
    174174}
    175175
     176AtomicString TextTrack::kind() const
     177{
     178    AtomicString kind = TrackBase::kind();
     179    if (!m_manualSelectionMode || kind != forcedKeyword())
     180        return kind;
     181
     182    return subtitlesKeyword();
     183}
     184
    176185void TextTrack::setKind(const AtomicString& newKind)
    177186{
  • trunk/Source/WebCore/html/track/TextTrack.h

    r188660 r196010  
    8383    static const AtomicString& showingKeyword();
    8484
    85     virtual void setKind(const AtomicString&) override;
     85    void setKind(const AtomicString&) override;
     86    AtomicString kind() const override;
    8687
    8788    virtual AtomicString inBandMetadataTrackDispatchType() const { return emptyString(); }
     
    143144    virtual MediaTime startTimeVariance() const { return MediaTime::zeroTime(); }
    144145
     146    void setManualSelectionMode(bool mode) { m_manualSelectionMode = mode; }
     147
    145148    using RefCounted<TrackBase>::ref;
    146149    using RefCounted<TrackBase>::deref;
     
    172175    int m_renderedTrackIndex;
    173176    bool m_hasBeenConfigured;
     177    bool m_manualSelectionMode { false };
    174178};
    175179
  • trunk/Source/WebCore/html/track/TrackBase.h

    r165676 r196010  
    5252    virtual void setId(const AtomicString& id) { m_id = id; }
    5353
    54     AtomicString kind() const { return m_kind; }
     54    virtual AtomicString kind() const { return m_kind; }
    5555    virtual void setKind(const AtomicString&);
    5656
  • trunk/Source/WebCore/page/CaptionUserPreferences.cpp

    r194819 r196010  
    6363}
    6464
     65void CaptionUserPreferences::beginBlockingNotifications()
     66{
     67    ++m_blockNotificationsCounter;
     68}
     69
     70void CaptionUserPreferences::endBlockingNotifications()
     71{
     72    ASSERT(m_blockNotificationsCounter);
     73    --m_blockNotificationsCounter;
     74}
     75
    6576void CaptionUserPreferences::notify()
    6677{
     78    if (m_blockNotificationsCounter)
     79        return;
     80
    6781    m_havePreferences = true;
    6882    if (!m_timer.isActive())
  • trunk/Source/WebCore/page/CaptionUserPreferences.h

    r184799 r196010  
    5151        Automatic,
    5252        ForcedOnly,
    53         AlwaysOn
     53        AlwaysOn,
     54        Manual,
    5455    };
    5556    virtual CaptionDisplayMode captionDisplayMode() const;
     
    99100protected:
    100101    void updateCaptionStyleSheetOveride();
     102    void beginBlockingNotifications();
     103    void endBlockingNotifications();
    101104
    102105private:
     
    105108
    106109    PageGroup& m_pageGroup;
    107     CaptionDisplayMode m_displayMode;
     110    mutable CaptionDisplayMode m_displayMode;
    108111    Timer m_timer;
    109112    String m_userPreferredLanguage;
     
    111114    String m_captionsStyleSheetOverride;
    112115    String m_primaryAudioTrackLanguageOverride;
     116    unsigned m_blockNotificationsCounter { 0 };
    113117    bool m_testingMode;
    114118    bool m_havePreferences;
  • trunk/Source/WebCore/page/CaptionUserPreferencesMediaAF.cpp

    r194819 r196010  
    7676
    7777#define CTFontDescriptorCopyAttribute softLink_CTFontDescriptorCopyAttribute
    78 #endif
    79 #endif
     78
     79typedef Boolean (*MTEnableCaption2015BehaviorPtrType) ();
     80static MTEnableCaption2015BehaviorPtrType MTEnableCaption2015BehaviorPtr() { return nullptr; }
     81
     82#else
     83
     84SOFT_LINK_FRAMEWORK(MediaToolbox)
     85SOFT_LINK_OPTIONAL(MediaToolbox, MTEnableCaption2015Behavior, Boolean, (), ())
     86
     87#endif // PLATFORM(WIN)
     88
     89#endif // HAVE(MEDIA_ACCESSIBILITY_FRAMEWORK)
    8090
    8191namespace WebCore {
     
    101111#endif
    102112{
     113    static bool initialized;
     114    if (!initialized) {
     115        initialized = true;
     116
     117        MTEnableCaption2015BehaviorPtrType function = MTEnableCaption2015BehaviorPtr();
     118        if (!function || !function())
     119            return;
     120
     121        beginBlockingNotifications();
     122        CaptionUserPreferences::setCaptionDisplayMode(Manual);
     123        setUserPrefersCaptions(false);
     124        setUserPrefersSubtitles(false);
     125        setUserPrefersTextDescriptions(false);
     126        endBlockingNotifications();
     127    }
    103128}
    104129
     
    117142CaptionUserPreferences::CaptionDisplayMode CaptionUserPreferencesMediaAF::captionDisplayMode() const
    118143{
    119     if (testingMode() || !MediaAccessibilityLibrary())
    120         return CaptionUserPreferences::captionDisplayMode();
     144    CaptionDisplayMode internalMode = CaptionUserPreferences::captionDisplayMode();
     145    if (internalMode == Manual || testingMode() || !MediaAccessibilityLibrary())
     146        return internalMode;
    121147
    122148    MACaptionAppearanceDisplayType displayType = MACaptionAppearanceGetDisplayType(kMACaptionAppearanceDomainUser);
     
    142168        return;
    143169    }
     170
     171    if (captionDisplayMode() == Manual)
     172        return;
    144173
    145174    MACaptionAppearanceDisplayType displayType = kMACaptionAppearanceDisplayTypeForcedOnly;
     
    433462void CaptionUserPreferencesMediaAF::setPreferredLanguage(const String& language)
    434463{
     464    if (CaptionUserPreferences::captionDisplayMode() == Manual)
     465        return;
     466
    435467    if (testingMode() || !MediaAccessibilityLibrary()) {
    436468        CaptionUserPreferences::setPreferredLanguage(language);
     
    662694{
    663695    CaptionDisplayMode displayMode = captionDisplayMode();
     696    if (displayMode == Manual)
     697        return 0;
     698
    664699    bool legacyOverride = mediaElement->webkitClosedCaptionsVisible();
    665700    if (displayMode == AlwaysOn && (!userPrefersSubtitles() && !userPrefersCaptions() && !legacyOverride))
     
    805840    Vector<RefPtr<TextTrack>> tracksForMenu;
    806841    HashSet<String> languagesIncluded;
     842    CaptionDisplayMode displayMode = captionDisplayMode();
    807843    bool prefersAccessibilityTracks = userPrefersCaptions();
    808844    bool filterTrackList = shouldFilterTrackMenu();
     
    812848        String language = displayNameForLanguageLocale(track->language());
    813849
     850        if (displayMode == Manual) {
     851            LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - adding '%s' track with language '%s' because selection mode is 'manual'", track->kind().string().utf8().data(), language.utf8().data());
     852            tracksForMenu.append(track);
     853            continue;
     854        }
     855
    814856        const AtomicString& kind = track->kind();
    815857        if (kind != TextTrack::captionsKeyword() && kind != TextTrack::descriptionsKeyword() && kind != TextTrack::subtitlesKeyword())
     
    817859
    818860        if (track->containsOnlyForcedSubtitles()) {
    819             LOG(Media, "CaptionUserPreferencesMac::sortedTrackListForMenu - skipping '%s' track with language '%s' because it contains only forced subtitles", track->kind().string().utf8().data(), language.utf8().data());
     861            LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - skipping '%s' track with language '%s' because it contains only forced subtitles", track->kind().string().utf8().data(), language.utf8().data());
    820862            continue;
    821863        }
    822864       
    823865        if (track->isEasyToRead()) {
    824             LOG(Media, "CaptionUserPreferencesMac::sortedTrackListForMenu - adding '%s' track with language '%s' because it is 'easy to read'", track->kind().string().utf8().data(), language.utf8().data());
     866            LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - adding '%s' track with language '%s' because it is 'easy to read'", track->kind().string().utf8().data(), language.utf8().data());
    825867            if (!language.isEmpty())
    826868                languagesIncluded.add(language);
     
    830872
    831873        if (track->mode() == TextTrack::showingKeyword()) {
    832             LOG(Media, "CaptionUserPreferencesMac::sortedTrackListForMenu - adding '%s' track with language '%s' because it is already visible", track->kind().string().utf8().data(), language.utf8().data());
     874            LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - adding '%s' track with language '%s' because it is already visible", track->kind().string().utf8().data(), language.utf8().data());
    833875            if (!language.isEmpty())
    834876                languagesIncluded.add(language);
     
    862904        tracksForMenu.append(track);
    863905
    864         LOG(Media, "CaptionUserPreferencesMac::sortedTrackListForMenu - adding '%s' track with language '%s', is%s main program content", track->kind().string().utf8().data(), language.utf8().data(), track->isMainProgramContent() ? "" : " NOT");
     906        LOG(Media, "CaptionUserPreferencesMediaAF::sortedTrackListForMenu - adding '%s' track with language '%s', is%s main program content", track->kind().string().utf8().data(), language.utf8().data(), track->isMainProgramContent() ? "" : " NOT");
    865907    }
    866908
     
    869911        TextTrack* track = trackList->item(i);
    870912        String language = displayNameForLanguageLocale(track->language());
     913
     914        if (tracksForMenu.contains(track))
     915            continue;
    871916
    872917        const AtomicString& kind = track->kind();
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm

    r195951 r196010  
    256256SOFT_LINK_POINTER(AVFoundation, AVMediaCharacteristicDescribesMusicAndSoundForAccessibility, NSString*)
    257257SOFT_LINK_POINTER(AVFoundation, AVMediaCharacteristicTranscribesSpokenDialogForAccessibility, NSString*)
     258SOFT_LINK_POINTER(AVFoundation, AVMediaCharacteristicIsAuxiliaryContent, NSString*)
    258259
    259260#define AVURLAssetHTTPCookiesKey getAVURLAssetHTTPCookiesKey()
     
    267268#define AVMediaCharacteristicDescribesMusicAndSoundForAccessibility getAVMediaCharacteristicDescribesMusicAndSoundForAccessibility()
    268269#define AVMediaCharacteristicTranscribesSpokenDialogForAccessibility getAVMediaCharacteristicTranscribesSpokenDialogForAccessibility()
     270#define AVMediaCharacteristicIsAuxiliaryContent getAVMediaCharacteristicIsAuxiliaryContent()
    269271#endif
    270272
     
    306308#endif
    307309
     310SOFT_LINK_FRAMEWORK(MediaToolbox)
     311SOFT_LINK_OPTIONAL(MediaToolbox, MTEnableCaption2015Behavior, Boolean, (), ())
     312
    308313using namespace WebCore;
    309314
     
    733738static const NSArray* mediaDescriptionForKind(PlatformTextTrack::TrackKind kind)
    734739{
     740    static bool manualSelectionMode = MTEnableCaption2015BehaviorPtr() && MTEnableCaption2015BehaviorPtr()();
     741    if (manualSelectionMode)
     742        return @[ AVMediaCharacteristicIsAuxiliaryContent ];
     743
    735744    // FIXME: Match these to correct types:
    736745    if (kind == PlatformTextTrack::Caption)
  • trunk/Source/WebCore/testing/Internals.cpp

    r195916 r196010  
    27852785    else if (equalLettersIgnoringASCIICase(mode, "alwayson"))
    27862786        captionPreferences->setCaptionDisplayMode(CaptionUserPreferences::AlwaysOn);
     2787    else if (equalLettersIgnoringASCIICase(mode, "manual"))
     2788        captionPreferences->setCaptionDisplayMode(CaptionUserPreferences::Manual);
    27872789    else
    27882790        ec = SYNTAX_ERR;
Note: See TracChangeset for help on using the changeset viewer.