Changeset 155048 in webkit


Ignore:
Timestamp:
Sep 4, 2013 10:39:03 AM (11 years ago)
Author:
commit-queue@webkit.org
Message:

[GTK] add support for subtitles on webkit2GTK
https://bugs.webkit.org/show_bug.cgi?id=117008

By activating subtitles support on webkit2GTK, the video player
recognizes and use text <tracks> inside <video> elements.

Patch by Danilo Cesar Lemes de Paula <danilo.cesar@collabora.co.uk> on 2013-09-04
Reviewed by Martin Robinson.

Source/WebCore:

Layout tests (track-menu) should cover this change.

  • css/mediaControlsGtk.css:

(audio::-webkit-media-controls-toggle-closed-captions-button, video::-webkit-media-controls-toggle-closed-captions-button):
(video::-webkit-media-controls-closed-captions-container):
(video::-webkit-media-controls-closed-captions-track-list):
(video::-webkit-media-controls-closed-captions-track-list h3):
(video::-webkit-media-controls-closed-captions-track-list ul):
(video::-webkit-media-controls-closed-captions-track-list li):
(video::-webkit-media-controls-closed-captions-track-list li.selected):

  • html/shadow/MediaControlElements.cpp:

(WebCore::MediaControlToggleClosedCaptionsButtonElement::MediaControlToggleClosedCaptionsButtonElement):
(WebCore::MediaControlToggleClosedCaptionsButtonElement::defaultEventHandler):

  • html/shadow/MediaControlElements.h:
  • html/shadow/MediaControlsGtk.cpp:

(WebCore::MediaControlsGtkEventListener::create):
(WebCore::MediaControlsGtkEventListener::cast):
(WebCore::MediaControlsGtkEventListener::MediaControlsGtkEventListener):
(WebCore::MediaControlsGtk::MediaControlsGtk):
(WebCore::MediaControlsGtk::initializeControls):
(WebCore::MediaControlsGtk::setMediaController):
(WebCore::MediaControlsGtk::reset):
(WebCore::MediaControlsGtk::makeTransparent):
(WebCore::MediaControlsGtk::toggleClosedCaptionTrackList):
(WebCore::MediaControlsGtk::showClosedCaptionTrackList):
(WebCore::MediaControlsGtk::hideClosedCaptionTrackList):
(WebCore::MediaControlsGtk::handleClickEvent):
(WebCore::MediaControlsGtk::eventListener):
(WebCore::MediaControlsGtkEventListener::handleEvent):
(WebCore::MediaControlsGtkEventListener::operator==):

  • html/shadow/MediaControlsGtk.h:
  • page/CaptionUserPreferences.cpp:

(WebCore::trackDisplayName):

  • platform/gtk/LocalizedStringsGtk.cpp:

(WebCore::textTrackSubtitlesText):
(WebCore::textTrackOffMenuItemText):
(WebCore::textTrackNoLabelText):

  • platform/gtk/RenderThemeGtk.h:

LayoutTests:

  • platform/gtk/TestExpectations:
Location:
trunk
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r155042 r155048  
     12013-09-04  Danilo Cesar Lemes de Paula  <danilo.cesar@collabora.co.uk>
     2
     3        [GTK] add support for subtitles on webkit2GTK
     4        https://bugs.webkit.org/show_bug.cgi?id=117008
     5
     6        By activating subtitles support on webkit2GTK, the video player
     7        recognizes and use text <tracks> inside <video> elements.
     8
     9        Reviewed by Martin Robinson.
     10
     11        * platform/gtk/TestExpectations:
     12
    1132013-09-04  Zoltan Arvai  <zarvai@inf.u-szeged.hu>
    214
  • trunk/LayoutTests/platform/gtk/TestExpectations

    r155037 r155048  
    797797webkit.org/b/102257 fast/dom/Window/open-window-min-size.html [ Timeout ]
    798798
    799 # GTK still has the CC toggle button, not the menu of tracks.
    800 webkit.org/b/101670 media/video-controls-captions-trackmenu.html [ Skip ]
    801 webkit.org/b/101670 media/video-controls-captions-trackmenu-sorted.html [ Skip ]
    802 webkit.org/b/101670 media/video-controls-captions-trackmenu-localized.html [ Skip ]
    803 webkit.org/b/101670 media/video-controls-captions-trackmenu-hide-on-click.html [ Skip ]
    804 webkit.org/b/101670 media/video-controls-captions-trackmenu-hide-on-click-outside.html [ Skip ]
    805 webkit.org/b/101670 media/track/track-user-preferences.html [ Skip ]
    806 webkit.org/b/101670 media/video-controls-captions-trackmenu-includes-enabled-track.html [ Skip ]
    807 
    808799webkit.org/b/107194 storage/indexeddb/database-quota.html [ Timeout ]
    809800webkit.org/b/107194 storage/indexeddb/pending-activity-workers.html [ Timeout ]
     
    911902# LayoutTestController::applicationCacheDiskUsageForOrigin isn't implemented.
    912903webkit.org/b/57127 http/tests/appcache/origin-usage.html [ Failure ]
     904
     905# GTK is moving from toggle button to a menu of tracks.
     906webkit.org/b/101670 media/video-controls-captions-trackmenu.html [ Failure ]
     907webkit.org/b/101670 media/track/track-user-preferences.html [ Failure ]
     908webkit.org/b/101670 media/video-controls-captions-trackmenu-includes-enabled-track.html [ Failure ]
    913909
    914910Bug(GTK) http/tests/loading/bad-scheme-subframe.html [ Failure ]
     
    12211217webkit.org/b/87355 canvas/philip/tests/2d.text.draw.fontface.notinpage.html [ Failure ]
    12221218
     1219# GTK is moving from the simple toggle button to a menu of tracks
    12231220webkit.org/b/95428 media/video-controls-captions.html [ Failure ]
    12241221
  • trunk/Source/WebCore/ChangeLog

    r155047 r155048  
     12013-09-04  Danilo Cesar Lemes de Paula  <danilo.cesar@collabora.co.uk>
     2
     3        [GTK] add support for subtitles on webkit2GTK
     4        https://bugs.webkit.org/show_bug.cgi?id=117008
     5
     6        By activating subtitles support on webkit2GTK, the video player
     7        recognizes and use text <tracks> inside <video> elements.
     8
     9        Reviewed by Martin Robinson.
     10
     11        Layout tests (track-menu) should cover this change.
     12
     13        * css/mediaControlsGtk.css:
     14        (audio::-webkit-media-controls-toggle-closed-captions-button, video::-webkit-media-controls-toggle-closed-captions-button):
     15        (video::-webkit-media-controls-closed-captions-container):
     16        (video::-webkit-media-controls-closed-captions-track-list):
     17        (video::-webkit-media-controls-closed-captions-track-list h3):
     18        (video::-webkit-media-controls-closed-captions-track-list ul):
     19        (video::-webkit-media-controls-closed-captions-track-list li):
     20        (video::-webkit-media-controls-closed-captions-track-list li.selected):
     21        * html/shadow/MediaControlElements.cpp:
     22        (WebCore::MediaControlToggleClosedCaptionsButtonElement::MediaControlToggleClosedCaptionsButtonElement):
     23        (WebCore::MediaControlToggleClosedCaptionsButtonElement::defaultEventHandler):
     24        * html/shadow/MediaControlElements.h:
     25        * html/shadow/MediaControlsGtk.cpp:
     26        (WebCore::MediaControlsGtkEventListener::create):
     27        (WebCore::MediaControlsGtkEventListener::cast):
     28        (WebCore::MediaControlsGtkEventListener::MediaControlsGtkEventListener):
     29        (WebCore::MediaControlsGtk::MediaControlsGtk):
     30        (WebCore::MediaControlsGtk::initializeControls):
     31        (WebCore::MediaControlsGtk::setMediaController):
     32        (WebCore::MediaControlsGtk::reset):
     33        (WebCore::MediaControlsGtk::makeTransparent):
     34        (WebCore::MediaControlsGtk::toggleClosedCaptionTrackList):
     35        (WebCore::MediaControlsGtk::showClosedCaptionTrackList):
     36        (WebCore::MediaControlsGtk::hideClosedCaptionTrackList):
     37        (WebCore::MediaControlsGtk::handleClickEvent):
     38        (WebCore::MediaControlsGtk::eventListener):
     39        (WebCore::MediaControlsGtkEventListener::handleEvent):
     40        (WebCore::MediaControlsGtkEventListener::operator==):
     41        * html/shadow/MediaControlsGtk.h:
     42        * page/CaptionUserPreferences.cpp:
     43        (WebCore::trackDisplayName):
     44        * platform/gtk/LocalizedStringsGtk.cpp:
     45        (WebCore::textTrackSubtitlesText):
     46        (WebCore::textTrackOffMenuItemText):
     47        (WebCore::textTrackNoLabelText):
     48        * platform/gtk/RenderThemeGtk.h:
     49
    1502013-09-03  Darin Adler  <darin@apple.com>
    251
  • trunk/Source/WebCore/css/mediaControlsGtk.css

    r143463 r155048  
    223223    line-height: 30px;
    224224    margin: 0 9px 0 -7px;
     225    background-repeat:no-repeat;
     226    background-position:center;
     227    background-image: url('data:image/svg+xml,<svg id="svg7384" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><metadata id="metadata90"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title>Gnome Symbolic Icon Theme</dc:title></cc:Work></rdf:RDF></metadata><g id="layer9" transform="translate(-101,-357)"><path id="path12148" style="block-progression:tb;color:#bebebe;direction:ltr;text-indent:0;text-align:start;enable-background:accumulate;text-transform:none;" fill="#bebebe" d="m104.75,357.06c-2.0602,0-3.75,1.6898-3.75,3.75v4.4375c0,2.0602,1.6898,3.75,3.75,3.75h4.9375l3.75,2.6562,1.5938,1.125v-1.9688l-0.0313-2.5c1.1106-0.59715,1.9688-1.6526,1.9688-3.0625v-4.4375c0-2.0602-1.6898-3.75-3.75-3.75h-8.4688zm0,2,8.4688,0c0.9868,0,1.75,0.7632,1.75,1.75v4.4375c0,0.86273-0.63508,1.541-1.125,1.625l-0.84,0.12v0.84375,1.0312l-2.4062-1.6875-0.25-0.1875h-0.3125-5.2812c-0.9868,0-1.75-0.7632-1.75-1.75v-4.4375c0-0.9868,0.7632-1.75,1.75-1.75z"/></g></svg>');
     228}
     229
     230video::-webkit-media-controls-closed-captions-container {
     231    -webkit-appearance: media-closed-captions-container;
     232    position: absolute;
     233    display: block;
     234    right: 38px;
     235    bottom: 35px;
     236    max-width: -webkit-calc(100% - 48px); /* right + 10px */
     237    max-height: -webkit-calc(100% - 35px); /* bottom + 10px */
     238    overflow-x: hidden;
     239    overflow-y: auto;
     240    background-color: rgba(20, 20, 20, 0.8);
     241    border-radius: 10px;
     242    cursor: default;
     243    z-index: 2;
     244}
     245
     246video::-webkit-media-controls-closed-captions-track-list {
     247    display: block;
     248    font-family: "Helvetica Bold", Helvetica;
     249    font-size: 10pt;
     250    -webkit-user-select: none;
     251}
     252
     253video::-webkit-media-controls-closed-captions-track-list h3 {
     254    margin: 1px 30px;
     255    color: #757575;
     256    text-shadow: 0 1px 0 black;
     257    padding-top: 0px;
     258    font-weight: bold;
     259    font-size: 10pt;
     260}
     261
     262video::-webkit-media-controls-closed-captions-track-list ul {
     263    list-style-type: none;
     264    margin: 0 0 4px 0;
     265    padding: 0;
     266    font-weight: bold;
     267}
     268
     269video::-webkit-media-controls-closed-captions-track-list li {
     270    position: relative;
     271    color: white;
     272    background-image: none;
     273    text-shadow: 0 1px 0 black;
     274    margin: 0;
     275    padding-left: 37px;
     276    padding-right: 35px;
     277    padding-top: 0.15em;
     278    padding-bottom: 0.2em;
     279    box-sizing: border-box;
     280    overflow: hidden;
     281    white-space: nowrap;
     282    text-overflow: ellipsis;
     283    border-top: 1px solid rgba(0, 0, 0, 0);
     284    border-bottom: 1px solid rgba(0, 0, 0, 0);
     285}
     286video::-webkit-media-controls-closed-captions-track-list li.selected {
     287    background-color: rgba(230, 230, 230, 0.15);
    225288}
    226289
  • trunk/Source/WebCore/html/shadow/MediaControlElements.cpp

    r154937 r155048  
    678678MediaControlToggleClosedCaptionsButtonElement::MediaControlToggleClosedCaptionsButtonElement(Document* document, MediaControls* controls)
    679679    : MediaControlInputElement(document, MediaShowClosedCaptionsButton)
    680 #if PLATFORM(MAC) || PLATFORM(WIN)
     680#if PLATFORM(MAC) || PLATFORM(WIN) || PLATFORM(GTK)
    681681    , m_controls(controls)
    682682#endif
    683683{
    684 #if !PLATFORM(MAC) && !PLATFORM(WIN)
     684#if !PLATFORM(MAC) && !PLATFORM(WIN) || !PLATFORM(GTK)
    685685    UNUSED_PARAM(controls);
    686686#endif
     
    712712        // we have to use #if.
    713713        // https://bugs.webkit.org/show_bug.cgi?id=101877
    714 #if !PLATFORM(MAC) && !PLATFORM(WIN)
     714#if !PLATFORM(MAC) && !PLATFORM(WIN) && !PLATFORM(GTK)
    715715        mediaController()->setClosedCaptionsVisible(!mediaController()->closedCaptionsVisible());
    716716        setChecked(mediaController()->closedCaptionsVisible());
  • trunk/Source/WebCore/html/shadow/MediaControlElements.h

    r152975 r155048  
    281281    virtual void defaultEventHandler(Event*) OVERRIDE;
    282282
    283 #if PLATFORM(MAC) || PLATFORM(WIN)
     283#if PLATFORM(MAC) || PLATFORM(WIN) || PLATFORM(GTK)
    284284    MediaControls* m_controls;
    285285#endif
  • trunk/Source/WebCore/html/shadow/MediaControlsGtk.cpp

    r154877 r155048  
    3232#include "MediaControlsGtk.h"
    3333
     34#include "Chrome.h"
     35#include "MouseEvent.h"
     36
    3437namespace WebCore {
     38
     39class MediaControlsGtkEventListener : public EventListener {
     40public:
     41    static PassRefPtr<MediaControlsGtkEventListener> create(MediaControlsGtk* mediaControls) { return adoptRef(new MediaControlsGtkEventListener(mediaControls)); }
     42    static const MediaControlsGtkEventListener* cast(const EventListener* listener)
     43    {
     44        return listener->type() == GObjectEventListenerType
     45            ? static_cast<const MediaControlsGtkEventListener*>(listener)
     46            : 0;
     47    }
     48
     49    virtual bool operator==(const EventListener& other);
     50
     51private:
     52    MediaControlsGtkEventListener(MediaControlsGtk* mediaControls)
     53        : EventListener(GObjectEventListenerType)
     54        , m_mediaControls(mediaControls)
     55    {
     56    }
     57
     58    virtual void handleEvent(ScriptExecutionContext*, Event*);
     59
     60    MediaControlsGtk* m_mediaControls;
     61};
    3562
    3663MediaControlsGtk::MediaControlsGtk(Document* document)
     
    3865    , m_durationDisplay(0)
    3966    , m_enclosure(0)
     67    , m_eventListener(0)
     68    , m_closedCaptionsTrackList(0)
     69    , m_closedCaptionsContainer(0)
    4070{
    4171}
     
    92122
    93123    if (document->page()->theme()->supportsClosedCaptioning()) {
     124        RefPtr<MediaControlClosedCaptionsContainerElement> closedCaptionsContainer = MediaControlClosedCaptionsContainerElement::create(document);
     125
     126        RefPtr<MediaControlClosedCaptionsTrackListElement> closedCaptionsTrackList = MediaControlClosedCaptionsTrackListElement::create(document, this);
     127        m_closedCaptionsTrackList = closedCaptionsTrackList.get();
     128        closedCaptionsContainer->appendChild(closedCaptionsTrackList.release(), exceptionCode, AttachLazily);
     129        if (exceptionCode)
     130            return false;
     131
    94132        RefPtr<MediaControlToggleClosedCaptionsButtonElement> toggleClosedCaptionsButton = MediaControlToggleClosedCaptionsButtonElement::create(document, this);
    95133        m_toggleClosedCaptionsButton = toggleClosedCaptionsButton.get();
     
    97135        if (exceptionCode)
    98136            return false;
     137
     138        m_closedCaptionsContainer = closedCaptionsContainer.get();
     139        appendChild(closedCaptionsContainer.release(), exceptionCode, AttachLazily);
     140        if (exceptionCode)
     141            return false;
    99142    }
    100143
     
    148191    if (m_enclosure)
    149192        m_enclosure->setMediaController(controller);
     193    if (m_closedCaptionsContainer)
     194        m_closedCaptionsContainer->setMediaController(controller);
     195    if (m_closedCaptionsTrackList)
     196        m_closedCaptionsTrackList->setMediaController(controller);
    150197}
    151198
     
    159206    m_durationDisplay->setInnerText(page->theme()->formatMediaControlsTime(duration), ASSERT_NO_EXCEPTION);
    160207    m_durationDisplay->setCurrentValue(duration);
     208
     209    if (m_toggleClosedCaptionsButton) {
     210        if (m_mediaController->hasClosedCaptions())
     211            m_toggleClosedCaptionsButton->show();
     212        else
     213            m_toggleClosedCaptionsButton->hide();
     214    }
    161215
    162216    MediaControls::reset();
     
    209263    if (m_volumeSliderContainer)
    210264        m_volumeSliderContainer->hide();
     265
     266    hideClosedCaptionTrackList();
    211267}
    212268
     
    237293#endif
    238294
    239 }
    240 
     295void MediaControlsGtk::toggleClosedCaptionTrackList()
     296{
     297    if (!m_mediaController->hasClosedCaptions())
     298        return;
     299
     300    if (!m_closedCaptionsContainer || !m_closedCaptionsTrackList)
     301        return;
     302
     303    if (m_closedCaptionsContainer->isShowing()) {
     304        hideClosedCaptionTrackList();
     305        return;
     306    }
     307
     308    m_closedCaptionsTrackList->updateDisplay();
     309    showClosedCaptionTrackList();
     310}
     311
     312void MediaControlsGtk::showClosedCaptionTrackList()
     313{
     314    m_volumeSliderContainer->hide();
     315
     316    if (!m_closedCaptionsContainer || m_closedCaptionsContainer->isShowing())
     317        return;
     318
     319    m_closedCaptionsContainer->show();
     320    m_panel->setInlineStyleProperty(CSSPropertyPointerEvents, CSSValueNone);
     321
     322    RefPtr<EventListener> listener = eventListener();
     323
     324    // Check for clicks outside the media-control
     325    document().addEventListener(eventNames().clickEvent, listener, true);
     326    // Check for clicks inside the media-control box
     327    addEventListener(eventNames().clickEvent, listener, true);
     328}
     329
     330void MediaControlsGtk::hideClosedCaptionTrackList()
     331{
     332    if (!m_closedCaptionsContainer || !m_closedCaptionsContainer->isShowing())
     333        return;
     334
     335    m_closedCaptionsContainer->hide();
     336    m_panel->removeInlineStyleProperty(CSSPropertyPointerEvents);
     337
     338    EventListener* listener = eventListener().get();
     339
     340    document().removeEventListener(eventNames().clickEvent, listener, true);
     341    removeEventListener(eventNames().clickEvent, listener, true);
     342}
     343
     344void MediaControlsGtk::handleClickEvent(Event *event)
     345{
     346    Node* currentTarget = event->currentTarget()->toNode();
     347    Node* target = event->target()->toNode();
     348
     349    if ((currentTarget == &document() && !shadowHost()->contains(target))
     350        || (currentTarget == this && !m_closedCaptionsContainer->contains(target))) {
     351        hideClosedCaptionTrackList();
     352        event->stopImmediatePropagation();
     353        event->setDefaultHandled();
     354    }
     355}
     356
     357PassRefPtr<MediaControlsGtkEventListener> MediaControlsGtk::eventListener()
     358{
     359    if (!m_eventListener)
     360        m_eventListener = MediaControlsGtkEventListener::create(this);
     361
     362    return m_eventListener;
     363}
     364
     365void MediaControlsGtkEventListener::handleEvent(ScriptExecutionContext*, Event* event)
     366{
     367    if (event->type() == eventNames().clickEvent)
     368        m_mediaControls->handleClickEvent(event);
     369
     370    return;
     371}
     372
     373bool MediaControlsGtkEventListener::operator==(const EventListener& listener)
     374{
     375    if (const MediaControlsGtkEventListener* mediaControlsGtkEventListener = MediaControlsGtkEventListener::cast(&listener))
     376        return m_mediaControls == mediaControlsGtkEventListener->m_mediaControls;
     377    return false;
     378}
     379
     380}
    241381#endif
  • trunk/Source/WebCore/html/shadow/MediaControlsGtk.h

    r154000 r155048  
    3636namespace WebCore {
    3737
     38class MediaControlsGtkEventListener;
     39
    3840class MediaControlsGtk : public MediaControls {
    3941public:
     
    4850    virtual void showVolumeSlider() OVERRIDE;
    4951    virtual void makeTransparent() OVERRIDE;
     52    virtual void toggleClosedCaptionTrackList() OVERRIDE;
     53
     54    void handleClickEvent(Event*);
    5055
    5156#if ENABLE(VIDEO_TRACK)
     
    5560protected:
    5661    explicit MediaControlsGtk(Document*);
    57 
    5862    bool initializeControls(Document*);
    5963
    6064private:
     65    void showClosedCaptionTrackList();
     66    void hideClosedCaptionTrackList();
     67
     68    PassRefPtr<MediaControlsGtkEventListener> eventListener();
     69
    6170    MediaControlTimeRemainingDisplayElement* m_durationDisplay;
    6271    MediaControlPanelEnclosureElement* m_enclosure;
    6372    MediaControlVolumeSliderContainerElement* m_volumeSliderContainer;
     73    MediaControlClosedCaptionsTrackListElement* m_closedCaptionsTrackList;
     74    MediaControlClosedCaptionsContainerElement* m_closedCaptionsContainer;
     75
     76    RefPtr<MediaControlsGtkEventListener> m_eventListener;
    6477};
    6578
  • trunk/Source/WebCore/page/CaptionUserPreferences.cpp

    r153927 r155048  
    158158static String trackDisplayName(TextTrack* track)
    159159{
     160    if (track == TextTrack::captionMenuOffItem())
     161        return textTrackOffMenuItemText();
     162    if (track == TextTrack::captionMenuAutomaticItem())
     163        return textTrackAutomaticMenuItemText();
     164
    160165    if (track->label().isEmpty() && track->language().isEmpty())
    161166        return textTrackNoLabelText();
     
    185190
    186191    nonCopyingSort(tracksForMenu.begin(), tracksForMenu.end(), textTrackCompare);
     192    tracksForMenu.insert(0, TextTrack::captionMenuOffItem());
     193    tracksForMenu.insert(1, TextTrack::captionMenuAutomaticItem());
    187194
    188195    return tracksForMenu;
  • trunk/Source/WebCore/platform/gtk/LocalizedStringsGtk.cpp

    r154994 r155048  
    796796String textTrackSubtitlesText()
    797797{
    798     return String::fromUTF8(C_("Subtitles", "Menu section heading for subtitles"));
     798    return String::fromUTF8(C_("Menu section heading for subtitles", "Subtitles"));
    799799}
    800800
    801801String textTrackOffMenuItemText()
    802802{
    803     return String::fromUTF8(C_("Off", "Menu item label for the track that represents disabling closed captions"));
     803    return String::fromUTF8(C_("Menu item label for the track that represents disabling closed captions", "Off"));
    804804}
    805805
     
    811811String textTrackNoLabelText()
    812812{
    813     return String::fromUTF8(C_("No label", "Menu item label for a closed captions track that has no other name"));
     813    return String::fromUTF8(C_("Menu item label for a closed captions track that has no other name", "No label"));
    814814}
    815815#endif
  • trunk/Source/WebCore/platform/gtk/RenderThemeGtk.h

    r151783 r155048  
    8888    virtual String extraMediaControlsStyleSheet();
    8989    virtual String formatMediaControlsCurrentTime(float currentTime, float duration) const;
     90    virtual bool supportsClosedCaptioning() const OVERRIDE { return true; }
    9091
    9192#if ENABLE(FULLSCREEN_API)
Note: See TracChangeset for help on using the changeset viewer.