Changeset 127035 in webkit


Ignore:
Timestamp:
Aug 29, 2012 1:03:11 PM (12 years ago)
Author:
annacc@chromium.org
Message:

Create a toggle button for closed captions.
https://bugs.webkit.org/show_bug.cgi?id=94395

Reviewed by Eric Carlson.

This patch will create a button that toggles any captions or subtitles on or off.

Source/WebCore:

Test: media/video-controls-captions.html

  • css/mediaControlsChromium.css:

(audio::-webkit-media-controls-toggle-closed-captions-button, video::-webkit-media-controls-toggle-closed-captions-button):
New style for new button.

  • html/HTMLMediaElement.cpp:

(WebCore::HTMLMediaElement::HTMLMediaElement):
Initialize new variable for keeping track of user (button) disabled captions.

(WebCore::HTMLMediaElement::loadTimerFired):
Rename configureNewTextTracks() to configureTextTracks().

(WebCore::HTMLMediaElement::prepareForLoad):
Do not set closedCaptionsVisible to false, we should instead honor the
checks for default out-of-band tracks.

(WebCore::HTMLMediaElement::textTrackModeChanged):
Rename configureNewTextTracks() to configureTextTracks().

(WebCore::HTMLMediaElement::userIsInterestedInThisTrackKind):
Add checks for when user has requested to see or not see captions.

(WebCore::HTMLMediaElement::configureTextTracks):
Rename configureNewTextTracks() to configureTextTracks().

(WebCore::HTMLMediaElement::hasClosedCaptions):
Return true if we have any caption or subtitle text tracks.

(WebCore::HTMLMediaElement::setClosedCaptionsVisible):
Update the text track display and the closed captions button when the
closed captions button is toggled.

(WebCore::HTMLMediaElement::configureTextTrackDisplay):
If the visibility of any text tracks has changed, update the display and
the controls.

(WebCore::HTMLMediaElement::updateClosedCaptionsControls):
New function that updates both the text track display and the closed
captions button.

  • html/HTMLMediaElement.h:

(HTMLMediaElement):
New function updateClosedCaptionsControls()

Adding the button:

  • html/shadow/MediaControlRootElementChromium.cpp:

(WebCore::MediaControlRootElementChromium::MediaControlRootElementChromium):
(WebCore::MediaControlRootElementChromium::initializeControls):
(WebCore::MediaControlRootElementChromium::setMediaController):
(WebCore::MediaControlRootElementChromium::reset):
(WebCore::MediaControlRootElementChromium::reportedError):
(WebCore::MediaControlRootElementChromium::changedClosedCaptionsVisibility):
(WebCore::MediaControlRootElementChromium::createTextTrackDisplay):

  • html/shadow/MediaControlRootElementChromium.h:

(WebCore):
(MediaControlRootElementChromium):

Ensure that Linux and Windows render themes will support closed captions:

  • rendering/RenderThemeChromiumSkia.cpp:

(WebCore):
(WebCore::supportsClosedCaptioning):

  • rendering/RenderThemeChromiumSkia.h:

(RenderThemeChromiumSkia):

LayoutTests:

  • media/video-controls-captions-expected.txt: Added.
  • media/video-controls-captions.html: Added.
Location:
trunk
Files:
2 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r127033 r127035  
     12012-08-29  Anna Cavender  <annacc@chromium.org>
     2
     3        Create a toggle button for closed captions.
     4        https://bugs.webkit.org/show_bug.cgi?id=94395
     5
     6        Reviewed by Eric Carlson.
     7
     8        This patch will create a button that toggles any captions or subtitles on or off.
     9
     10        * media/video-controls-captions-expected.txt: Added.
     11        * media/video-controls-captions.html: Added.
     12
    1132012-08-29  Zhenyao Mo  <zmo@google.com>
    214
  • trunk/Source/WebCore/ChangeLog

    r127032 r127035  
     12012-08-29  Anna Cavender  <annacc@chromium.org>
     2
     3        Create a toggle button for closed captions.
     4        https://bugs.webkit.org/show_bug.cgi?id=94395
     5
     6        Reviewed by Eric Carlson.
     7
     8        This patch will create a button that toggles any captions or subtitles on or off.
     9
     10        Test: media/video-controls-captions.html
     11
     12        * css/mediaControlsChromium.css:
     13        (audio::-webkit-media-controls-toggle-closed-captions-button, video::-webkit-media-controls-toggle-closed-captions-button):
     14        New style for new button.
     15
     16        * html/HTMLMediaElement.cpp:
     17        (WebCore::HTMLMediaElement::HTMLMediaElement):
     18        Initialize new variable for keeping track of user (button) disabled captions.
     19
     20        (WebCore::HTMLMediaElement::loadTimerFired):
     21        Rename configureNewTextTracks() to configureTextTracks().
     22
     23        (WebCore::HTMLMediaElement::prepareForLoad):
     24        Do not set closedCaptionsVisible to false, we should instead honor the
     25        checks for default out-of-band tracks.
     26
     27        (WebCore::HTMLMediaElement::textTrackModeChanged):
     28        Rename configureNewTextTracks() to configureTextTracks().
     29
     30        (WebCore::HTMLMediaElement::userIsInterestedInThisTrackKind):
     31        Add checks for when user has requested to see or not see captions.
     32
     33        (WebCore::HTMLMediaElement::configureTextTracks):
     34        Rename configureNewTextTracks() to configureTextTracks().
     35
     36        (WebCore::HTMLMediaElement::hasClosedCaptions):
     37        Return true if we have any caption or subtitle text tracks.
     38
     39        (WebCore::HTMLMediaElement::setClosedCaptionsVisible):
     40        Update the text track display and the closed captions button when the
     41        closed captions button is toggled.
     42
     43        (WebCore::HTMLMediaElement::configureTextTrackDisplay):
     44        If the visibility of any text tracks has changed, update the display and
     45        the controls.
     46
     47        (WebCore::HTMLMediaElement::updateClosedCaptionsControls):
     48        New function that updates both the text track display and the closed
     49        captions button.
     50
     51        * html/HTMLMediaElement.h:
     52        (HTMLMediaElement):
     53        New function updateClosedCaptionsControls()
     54
     55        Adding the button:
     56        * html/shadow/MediaControlRootElementChromium.cpp:
     57        (WebCore::MediaControlRootElementChromium::MediaControlRootElementChromium):
     58        (WebCore::MediaControlRootElementChromium::initializeControls):
     59        (WebCore::MediaControlRootElementChromium::setMediaController):
     60        (WebCore::MediaControlRootElementChromium::reset):
     61        (WebCore::MediaControlRootElementChromium::reportedError):
     62        (WebCore::MediaControlRootElementChromium::changedClosedCaptionsVisibility):
     63        (WebCore::MediaControlRootElementChromium::createTextTrackDisplay):
     64        * html/shadow/MediaControlRootElementChromium.h:
     65        (WebCore):
     66        (MediaControlRootElementChromium):
     67
     68        Ensure that Linux and Windows render themes will support closed captions:
     69        * rendering/RenderThemeChromiumSkia.cpp:
     70        (WebCore):
     71        (WebCore::supportsClosedCaptioning):
     72        * rendering/RenderThemeChromiumSkia.h:
     73        (RenderThemeChromiumSkia):
     74
    1752012-08-29  Jessie Berlin  <jberlin@apple.com>
    276
  • trunk/Source/WebCore/css/mediaControlsChromium.css

    r123259 r127035  
    179179}
    180180
     181audio::-webkit-media-controls-toggle-closed-captions-button, video::-webkit-media-controls-toggle-closed-captions-button {
     182    -webkit-appearance: media-toggle-closed-captions-button;
     183    display: -webkit-box;
     184    border: none;
     185    box-sizing: border-box;
     186    width: 25px;
     187    height: 25px;
     188    line-height: 25px;
     189    margin-left: -5px;
     190    margin-right: 9px;
     191    padding: 0;
     192}
     193
    181194audio::-webkit-media-controls-fullscreen-button, video::-webkit-media-controls-fullscreen-button {
    182195    -webkit-appearance: media-enter-fullscreen-button;
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r126842 r127035  
    260260    , m_textTracks(0)
    261261    , m_ignoreTrackDisplayUpdate(0)
     262    , m_disableCaptions(false)
    262263#endif
    263264#if ENABLE(WEB_AUDIO)
     
    595596#if ENABLE(VIDEO_TRACK)
    596597    if (RuntimeEnabledFeatures::webkitVideoTrackEnabled() && (m_pendingLoadFlags & TextTrackResource))
    597         configureNewTextTracks();
     598        configureTextTracks();
    598599#endif
    599600
     
    742743    m_playedTimeRanges = TimeRanges::create();
    743744    m_lastSeekTime = 0;
    744     m_closedCaptionsVisible = false;
    745745
    746746    // The spec doesn't say to block the load event until we actually run the asynchronous section
     
    12991299                continue;
    13001300           
    1301             // Mark this track as "configured" so configureNewTextTracks won't change the mode again.
     1301            // Mark this track as "configured" so configureTextTracks won't change the mode again.
    13021302            trackElement->setHasBeenConfigured(true);
    13031303            if (track->mode() != TextTrack::disabledKeyword()) {
     
    27912791{
    27922792    // If ... the user has indicated an interest in having a track with this text track kind, text track language, ...
     2793    if (m_disableCaptions)
     2794        return false;
     2795
    27932796    Settings* settings = document()->settings();
    27942797    if (!settings)
     
    27962799
    27972800    if (kind == TextTrack::subtitlesKeyword())
    2798         return settings->shouldDisplaySubtitles();
     2801        return settings->shouldDisplaySubtitles() || m_closedCaptionsVisible;
    27992802    if (kind == TextTrack::captionsKeyword())
    2800         return settings->shouldDisplayCaptions();
     2803        return settings->shouldDisplayCaptions() || m_closedCaptionsVisible;
    28012804    if (kind == TextTrack::descriptionsKeyword())
    2802         return settings->shouldDisplayTextDescriptions();
     2805        return settings->shouldDisplayTextDescriptions() || m_closedCaptionsVisible;
    28032806
    28042807    return false;
     
    28962899}
    28972900
    2898 void HTMLMediaElement::configureNewTextTracks()
     2901void HTMLMediaElement::configureTextTracks()
    28992902{
    29002903    TrackGroup captionAndSubtitleTracks(TrackGroup::CaptionsAndSubtitles);
     
    39243927bool HTMLMediaElement::hasClosedCaptions() const
    39253928{
    3926     return m_player && m_player->hasClosedCaptions();
     3929    if (m_player && m_player->hasClosedCaptions())
     3930        return true;
     3931
     3932#if ENABLE(VIDEO_TRACK)
     3933    if (RuntimeEnabledFeatures::webkitVideoTrackEnabled() && m_textTracks)
     3934    for (unsigned i = 0; i < m_textTracks->length(); ++i) {
     3935        if (m_textTracks->item(i)->kind() == TextTrack::captionsKeyword()
     3936            || m_textTracks->item(i)->kind() == TextTrack::subtitlesKeyword())
     3937            return true;
     3938    }
     3939#endif
     3940    return false;
    39273941}
    39283942
     
    39363950    LOG(Media, "HTMLMediaElement::setClosedCaptionsVisible(%s)", boolString(closedCaptionVisible));
    39373951
    3938     if (!m_player ||!hasClosedCaptions())
     3952    if (!m_player || !hasClosedCaptions())
    39393953        return;
    39403954
    39413955    m_closedCaptionsVisible = closedCaptionVisible;
    39423956    m_player->setClosedCaptionsVisible(closedCaptionVisible);
     3957
     3958#if ENABLE(VIDEO_TRACK)
     3959    if (RuntimeEnabledFeatures::webkitVideoTrackEnabled()) {
     3960        m_disableCaptions = !m_closedCaptionsVisible;
     3961       
     3962        // Mark all track elements as not "configured" so that configureTextTracks()
     3963        // will reconsider which tracks to display in light of new user preferences
     3964        // (e.g. default tracks should not be displayed if the user has turned off
     3965        // captions and non-default tracks should be displayed based on language
     3966        // preferences if the user has turned captions on).
     3967        for (Node* node = firstChild(); node; node = node->nextSibling()) {
     3968            if (!node->hasTagName(trackTag))
     3969                continue;
     3970            HTMLTrackElement* trackElement = static_cast<HTMLTrackElement*>(node);
     3971            if (trackElement->kind() == TextTrack::captionsKeyword()
     3972                || trackElement->kind() == TextTrack::subtitlesKeyword())
     3973                trackElement->setHasBeenConfigured(false);
     3974        }
     3975
     3976        configureTextTracks();
     3977    }
     3978#else
    39433979    if (hasMediaControls())
    39443980        mediaControls()->changedClosedCaptionsVisibility();
     3981#endif
    39453982}
    39463983
     
    41064143        return;
    41074144    m_haveVisibleTextTrack = haveVisibleTextTrack;
     4145    m_closedCaptionsVisible = m_haveVisibleTextTrack;
    41084146
    41094147    if (!m_haveVisibleTextTrack && !hasMediaControls())
     
    41114149    if (!hasMediaControls() && !createMediaControls())
    41124150        return;
    4113     mediaControls()->updateTextTrackDisplay();
     4151
     4152    updateClosedCaptionsControls();
     4153}
     4154
     4155void HTMLMediaElement::updateClosedCaptionsControls()
     4156{
     4157    if (hasMediaControls()) {
     4158        mediaControls()->changedClosedCaptionsVisibility();
     4159
     4160        if (RuntimeEnabledFeatures::webkitVideoTrackEnabled())
     4161            mediaControls()->updateTextTrackDisplay();
     4162    }
    41144163}
    41154164#endif
  • trunk/Source/WebCore/html/HTMLMediaElement.h

    r126842 r127035  
    237237
    238238    void configureTextTrackGroupForLanguage(const TrackGroup&) const;
    239     void configureNewTextTracks();
     239    void configureTextTracks();
    240240    void configureTextTrackGroup(const TrackGroup&) const;
    241241
     
    243243    bool textTracksAreReady() const;
    244244    void configureTextTrackDisplay();
     245    void updateClosedCaptionsControls();
    245246
    246247    // TextTrackClient
     
    655656    CueList m_currentlyActiveCues;
    656657    int m_ignoreTrackDisplayUpdate;
     658    bool m_disableCaptions;
    657659#endif
    658660
  • trunk/Source/WebCore/html/shadow/MediaControlRootElementChromium.cpp

    r123969 r127035  
    8585    , m_panelMuteButton(0)
    8686    , m_volumeSlider(0)
     87    , m_toggleClosedCaptionsButton(0)
    8788    , m_fullscreenButton(0)
    8889    , m_panel(0)
     
    164165    if (ec)
    165166        return false;
     167
     168    if (document->page()->theme()->supportsClosedCaptioning()) {
     169        RefPtr<MediaControlToggleClosedCaptionsButtonElement> toggleClosedCaptionsButton = MediaControlToggleClosedCaptionsButtonElement::create(document);
     170        m_toggleClosedCaptionsButton = toggleClosedCaptionsButton.get();
     171        panel->appendChild(toggleClosedCaptionsButton.release(), ec, true);
     172        if (ec)
     173            return false;
     174    }
    166175
    167176    RefPtr<MediaControlFullscreenButtonElement> fullscreenButton = MediaControlFullscreenButtonElement::create(document, this);
     
    202211    if (m_volumeSlider)
    203212        m_volumeSlider->setMediaController(controller);
     213    if (m_toggleClosedCaptionsButton)
     214        m_toggleClosedCaptionsButton->setMediaController(controller);
    204215    if (m_fullscreenButton)
    205216        m_fullscreenButton->setMediaController(controller);
     
    266277    }
    267278
     279    if (m_toggleClosedCaptionsButton) {
     280        if (m_mediaController->hasClosedCaptions())
     281            m_toggleClosedCaptionsButton->show();
     282        else
     283            m_toggleClosedCaptionsButton->hide();
     284    }
     285
    268286    if (m_mediaController->supportsFullscreen() && m_mediaController->hasVideo())
    269287        m_fullscreenButton->show();
     
    333351    m_panelMuteButton->hide();
    334352    m_volumeSlider->hide();
     353    if (m_toggleClosedCaptionsButton)
     354        m_toggleClosedCaptionsButton->hide();
    335355    m_fullscreenButton->hide();
    336356}
     
    418438void MediaControlRootElementChromium::changedClosedCaptionsVisibility()
    419439{
     440    if (m_toggleClosedCaptionsButton)
     441        m_toggleClosedCaptionsButton->updateDisplayType();
    420442}
    421443
     
    466488    m_textDisplayContainer = textDisplayContainer.get();
    467489
     490    if (m_mediaController)
     491        m_textDisplayContainer->setMediaController(m_mediaController);
     492
    468493    // Insert it before the first controller element so it always displays behind the controls.
    469494    insertBefore(textDisplayContainer.release(), m_enclosure, ASSERT_NO_EXCEPTION, true);
  • trunk/Source/WebCore/html/shadow/MediaControlRootElementChromium.h

    r123969 r127035  
    4545class MediaControlTimelineElement;
    4646class MediaControlVolumeSliderElement;
     47class MediaControlToggleClosedCaptionsButtonElement;
    4748class MediaControlFullscreenButtonElement;
    4849class MediaControlTimeDisplayElement;
     
    147148    MediaControlPanelMuteButtonElement* m_panelMuteButton;
    148149    MediaControlVolumeSliderElement* m_volumeSlider;
     150    MediaControlToggleClosedCaptionsButtonElement* m_toggleClosedCaptionsButton;
    149151    MediaControlFullscreenButtonElement* m_fullscreenButton;
    150152    MediaControlPanelElement* m_panel;
  • trunk/Source/WebCore/rendering/RenderThemeChromiumSkia.cpp

    r126968 r127035  
    132132}
    133133
     134#if ENABLE(VIDEO_TRACK)
     135bool RenderThemeChromiumSkia::supportsClosedCaptioning() const
     136{
     137    return true;
     138}
     139#endif
     140
    134141Color RenderThemeChromiumSkia::platformActiveSelectionBackgroundColor() const
    135142{
  • trunk/Source/WebCore/rendering/RenderThemeChromiumSkia.h

    r125048 r127035  
    5555        virtual bool supportsDataListUI(const AtomicString& type) const OVERRIDE;
    5656
     57#if ENABLE(VIDEO_TRACK)
     58        virtual bool supportsClosedCaptioning() const OVERRIDE;
     59#endif
    5760        // The platform selection color.
    5861        virtual Color platformActiveSelectionBackgroundColor() const;
Note: See TracChangeset for help on using the changeset viewer.