Changeset 103242 in webkit


Ignore:
Timestamp:
Dec 19, 2011, 9:25:37 AM (13 years ago)
Author:
[email protected]
Message:

Render text tracks
https://bugs.webkit.org/show_bug.cgi?id=62886

Reviewed by Sam Weinig.

Source/WebCore:

Test: media/track/track-cue-rendering.html

  • css/mediaControls.css:

(video::-webkit-media-text-track-container):
(video::-webkit-media-text-track-display):

  • html/HTMLMediaElement.cpp:

(WebCore::HTMLMediaElement::HTMLMediaElement): Initialize m_haveVisibleTextTrack.
(WebCore::HTMLMediaElement::updateActiveTextTrackCues): Trigger an update of the text

track display.

(WebCore::HTMLMediaElement::textTrackModeChanged): call configureTextTrackDisplay() so

the text track display is hidden or shown when necessary.

(WebCore::HTMLMediaElement::userIsInterestedInThisTrack): Minor cleanup.
(WebCore::HTMLMediaElement::createMediaControls): configureMediaControls() always called

reset after creating the controls, do it here instead.

(WebCore::HTMLMediaElement::configureMediaControls): Simplify and cleanup.
(WebCore::HTMLMediaElement::configureTextTrackDisplay): Show and hide text track display.

  • html/HTMLMediaElement.h:

(WebCore::HTMLMediaElement::currentlyVisibleCues):

  • html/shadow/MediaControlElements.cpp:

(WebCore::RenderTextTrackContainerElement::RenderTextTrackContainerElement): New.
(WebCore::RenderTextTrackContainerElement::layout): New. Call the display element so it can

update the position and font size.

(WebCore::MediaControlTextTrackContainerElement::MediaControlTextTrackContainerElement): New.
(WebCore::MediaControlTextTrackContainerElement::create): Ditto.
(WebCore::MediaControlTextTrackContainerElement::createRenderer): Ditto.
(WebCore::MediaControlTextTrackContainerElement::shadowPseudoId): Ditto.
(WebCore::MediaControlTextTrackContainerElement::updateSizes): Keep the cue display element

positioned above the bottom of the video box, and size the font according to the video height.

(WebCore::MediaControlTextTrackDisplayElement::MediaControlTextTrackDisplayElement): New.
(WebCore::MediaControlTextTrackDisplayElement::create): Ditto.
(WebCore::MediaControlTextTrackDisplayElement::shadowPseudoId): Ditto.

  • html/shadow/MediaControlElements.h:

(WebCore::MediaControlTextTrackContainerElement::displayType):
(WebCore::MediaControlTextTrackDisplayElement::displayType):

  • html/shadow/MediaControlRootElement.cpp:

(WebCore::MediaControlRootElement::MediaControlRootElement): New.
(WebCore::MediaControlRootElement::setMediaController): Ditto.
(WebCore::MediaControlRootElement::createTextTrackDisplay): Ditto.
(WebCore::MediaControlRootElement::showTextTrackDisplay): Ditto.
(WebCore::MediaControlRootElement::hideTextTrackDisplay): Ditto.
(WebCore::MediaControlRootElement::updateTextTrackDisplay): Ditto.

  • html/shadow/MediaControlRootElement.h:
  • html/shadow/MediaControlRootElementChromium.cpp:

(WebCore::MediaControlRootElementChromium::MediaControlRootElementChromium): New.
(WebCore::MediaControlRootElement::createTextTrackDisplay): Ditto.
(WebCore::MediaControlRootElement::showTextTrackDisplay): Ditto.
(WebCore::MediaControlRootElement::hideTextTrackDisplay): Ditto.
(WebCore::MediaControlRootElement::updateTextTrackDisplay): Ditto.

  • html/shadow/MediaControlRootElementChromium.h:
  • html/shadow/MediaControls.h:

LayoutTests:

  • media/media-controls.js:

(mediaControlsElement): Don't always look for a controller element.
(mediaControlsButtonCoordinates):
(textTrackDisplayElement): Find the cue display element.

  • media/track/track-cue-rendering-expected.txt: Added.
  • media/track/track-cue-rendering.html: Added.
Location:
trunk
Files:
3 added
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r103241 r103242  
     12011-12-19  Eric Carlson  <[email protected]>
     2
     3        Render text tracks
     4        https://bugs.webkit.org/show_bug.cgi?id=62886
     5
     6        Reviewed by Sam Weinig.
     7
     8        * media/media-controls.js:
     9        (mediaControlsElement): Don't always look for a controller element.
     10        (mediaControlsButtonCoordinates):
     11        (textTrackDisplayElement): Find the cue display element.
     12
     13        * media/track/track-cue-rendering-expected.txt: Added.
     14        * media/track/track-cue-rendering.html: Added.
     15
    1162011-12-19  Csaba Osztrogonác  <[email protected]>
    217
  • trunk/LayoutTests/media/media-controls.js

    r95111 r103242  
    22function mediaControlsElement(first, id)
    33{
    4     var controlID = "-webkit-media-controls-" + id;
    54    for (var element = first; element; element = element.nextSibling) {
    65
     
    87        // text nodes for the time values, so guard against exceptions.
    98        try {
    10             if (internals.shadowPseudoId(element) == controlID)
     9            if (internals.shadowPseudoId(element) == id)
    1110                return element;
    1211        } catch (exception) { }
     
    2423function mediaControlsButtonCoordinates(element, id)
    2524{
    26     var button = mediaControlsElement(internals.shadowRoot(element).firstChild, id);
     25    var controlID = "-webkit-media-controls-" + id;
     26    var button = mediaControlsElement(internals.shadowRoot(element).firstChild, controlID);
    2727    if (!button)
    2828        throw "Failed to find media control element ID '" + id + "'";
     
    3333    return new Array(x, y);
    3434}
     35
     36function textTrackDisplayElement(parentElement)
     37{
     38    var controlID = "-webkit-media-text-track-display";
     39    var displayElement = mediaControlsElement(internals.shadowRoot(parentElement).firstChild, controlID);
     40    if (!displayElement)
     41        throw "Failed to find media control element ID '" + controlID + "'";
     42    return displayElement;
     43}
  • trunk/Source/WebCore/ChangeLog

    r103240 r103242  
     12011-12-19  Eric Carlson  <[email protected]>
     2
     3        Render text tracks
     4        https://bugs.webkit.org/show_bug.cgi?id=62886
     5
     6        Reviewed by Sam Weinig.
     7
     8        Test: media/track/track-cue-rendering.html
     9
     10        * css/mediaControls.css:
     11        (video::-webkit-media-text-track-container):
     12        (video::-webkit-media-text-track-display):
     13
     14        * html/HTMLMediaElement.cpp:
     15        (WebCore::HTMLMediaElement::HTMLMediaElement): Initialize m_haveVisibleTextTrack.
     16        (WebCore::HTMLMediaElement::updateActiveTextTrackCues): Trigger an update of the text
     17            track display.
     18        (WebCore::HTMLMediaElement::textTrackModeChanged): call configureTextTrackDisplay() so
     19            the text track display is hidden or shown when necessary.
     20        (WebCore::HTMLMediaElement::userIsInterestedInThisTrack): Minor cleanup.
     21        (WebCore::HTMLMediaElement::createMediaControls): configureMediaControls() always called
     22            reset after creating the controls, do it here instead.
     23        (WebCore::HTMLMediaElement::configureMediaControls): Simplify and cleanup.
     24        (WebCore::HTMLMediaElement::configureTextTrackDisplay): Show and hide text track display.
     25        * html/HTMLMediaElement.h:
     26        (WebCore::HTMLMediaElement::currentlyVisibleCues):
     27
     28        * html/shadow/MediaControlElements.cpp:
     29        (WebCore::RenderTextTrackContainerElement::RenderTextTrackContainerElement): New.
     30        (WebCore::RenderTextTrackContainerElement::layout): New. Call the display element so it can
     31            update the position and font size.
     32        (WebCore::MediaControlTextTrackContainerElement::MediaControlTextTrackContainerElement): New.
     33        (WebCore::MediaControlTextTrackContainerElement::create): Ditto.
     34        (WebCore::MediaControlTextTrackContainerElement::createRenderer): Ditto.
     35        (WebCore::MediaControlTextTrackContainerElement::shadowPseudoId): Ditto.
     36        (WebCore::MediaControlTextTrackContainerElement::updateSizes): Keep the cue display element
     37            positioned above the bottom of the video box, and size the font according to the video height.
     38        (WebCore::MediaControlTextTrackDisplayElement::MediaControlTextTrackDisplayElement): New.
     39        (WebCore::MediaControlTextTrackDisplayElement::create): Ditto.
     40        (WebCore::MediaControlTextTrackDisplayElement::shadowPseudoId): Ditto.
     41        * html/shadow/MediaControlElements.h:
     42        (WebCore::MediaControlTextTrackContainerElement::displayType):
     43        (WebCore::MediaControlTextTrackDisplayElement::displayType):
     44
     45        * html/shadow/MediaControlRootElement.cpp:
     46        (WebCore::MediaControlRootElement::MediaControlRootElement): New.
     47        (WebCore::MediaControlRootElement::setMediaController): Ditto.
     48        (WebCore::MediaControlRootElement::createTextTrackDisplay): Ditto.
     49        (WebCore::MediaControlRootElement::showTextTrackDisplay): Ditto.
     50        (WebCore::MediaControlRootElement::hideTextTrackDisplay): Ditto.
     51        (WebCore::MediaControlRootElement::updateTextTrackDisplay): Ditto.
     52        * html/shadow/MediaControlRootElement.h:
     53
     54        * html/shadow/MediaControlRootElementChromium.cpp:
     55        (WebCore::MediaControlRootElementChromium::MediaControlRootElementChromium): New.
     56        (WebCore::MediaControlRootElement::createTextTrackDisplay): Ditto.
     57        (WebCore::MediaControlRootElement::showTextTrackDisplay): Ditto.
     58        (WebCore::MediaControlRootElement::hideTextTrackDisplay): Ditto.
     59        (WebCore::MediaControlRootElement::updateTextTrackDisplay): Ditto.
     60        * html/shadow/MediaControlRootElementChromium.h:
     61        * html/shadow/MediaControls.h:
     62
    1632011-12-19  Eric Carlson  <[email protected]>
    264
  • trunk/Source/WebCore/css/mediaControls.css

    r102306 r103242  
    187187    display: none;
    188188}
     189
     190video::-webkit-media-text-track-container {
     191    position: absolute;
     192    width: 100%;
     193    overflow: hidden;
     194
     195    font-size: 22px;
     196    font-family: sans-serif;
     197    text-align: center;
     198   
     199    letter-spacing: normal;
     200    word-spacing: normal;
     201    text-transform: none;
     202    text-indent: 0;
     203    text-decoration: none;
     204    pointer-events: none;
     205    -webkit-user-select: none;
     206}
     207
     208video::-webkit-media-text-track-display {
     209    display: inline;
     210    background-color: rgba(0, 0, 0, 0.5);
     211    color: yellow;
     212    padding: 0px 2px;
     213}
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r102969 r103242  
    232232#if ENABLE(VIDEO_TRACK)
    233233    , m_tracksAreReady(true)
     234    , m_haveVisibleTextTrack(false)
    234235    , m_textTracks(0)
    235236#endif
     
    941942void HTMLMediaElement::updateActiveTextTrackCues(float movieTime)
    942943{
    943     Vector<CueIntervalTree::IntervalType> previouslyVisibleCues = m_currentlyVisibleCues;
    944 
    945     m_currentlyVisibleCues = m_cueTree.allOverlaps(m_cueTree.createInterval(movieTime, movieTime));
     944    CueList previouslyActiveCues = m_currentlyActiveCues;
     945    bool activeSetChanged = false;
     946
     947    m_currentlyActiveCues = m_cueTree.allOverlaps(m_cueTree.createInterval(movieTime, movieTime));
    946948   
    947949    // FIXME(72171): Events need to be sorted and filtered before dispatching.
    948950
    949     for (size_t i = 0; i < previouslyVisibleCues.size(); ++i) {
    950         if (!m_currentlyVisibleCues.contains(previouslyVisibleCues[i]))
    951             previouslyVisibleCues[i].data()->setIsActive(false);
    952     }
    953     for (size_t i = 0; i < m_currentlyVisibleCues.size(); ++i) {
    954         if (!previouslyVisibleCues.contains(m_currentlyVisibleCues[i]))
    955             m_currentlyVisibleCues[i].data()->setIsActive(true);
     951    for (size_t i = 0; i < previouslyActiveCues.size(); ++i) {
     952        if (!m_currentlyActiveCues.contains(previouslyActiveCues[i])) {
     953            previouslyActiveCues[i].data()->setIsActive(false);
     954            activeSetChanged = true;
     955        }
     956    }
     957    for (size_t i = 0; i < m_currentlyActiveCues.size(); ++i) {
     958        if (!previouslyActiveCues.contains(m_currentlyActiveCues[i])) {
     959            m_currentlyActiveCues[i].data()->setIsActive(true);
     960            activeSetChanged = true;
     961        }
    956962    }
    957963   
    958964    // FIXME(72173): Pause the media element for cues going past their endTime
    959965    // during a monotonic time increase.
     966
     967    if (activeSetChanged && hasMediaControls())
     968        mediaControls()->updateTextTrackDisplay();
    960969}
    961970
     
    983992void HTMLMediaElement::textTrackModeChanged(TextTrack* track)
    984993{
    985     // 4.8.10.12.3 Sourcing out-of-band text tracks
    986     // ... when a text track corresponding to a track element is created with text track
    987     // mode set to disabled and subsequently changes its text track mode to hidden, showing,
    988     // or showing by default for the first time, the user agent must immediately and synchronously
    989     // run the following algorithm ...
    990    
    991     if (track->trackType() != TextTrack::TrackElement)
    992         return;
    993    
    994     HTMLTrackElement* trackElement;
    995     for (Node* node = firstChild(); node; node = node->nextSibling()) {
    996         if (!node->hasTagName(trackTag))
    997             continue;
    998         trackElement = static_cast<HTMLTrackElement*>(node);
    999         if (trackElement->track() != track)
    1000             continue;
    1001 
    1002         // Mark this track as "configured" so configureTextTrack won't change the mode again.
    1003         trackElement->setHasBeenConfigured(true);
    1004         if (track->mode() != TextTrack::DISABLED && trackElement->readyState() == HTMLTrackElement::NONE)
    1005             trackElement->scheduleLoad();
    1006         break;
    1007     }
     994    if (track->trackType() == TextTrack::TrackElement) {
     995        // 4.8.10.12.3 Sourcing out-of-band text tracks
     996        // ... when a text track corresponding to a track element is created with text track
     997        // mode set to disabled and subsequently changes its text track mode to hidden, showing,
     998        // or showing by default for the first time, the user agent must immediately and synchronously
     999        // run the following algorithm ...
     1000
     1001        for (Node* node = firstChild(); node; node = node->nextSibling()) {
     1002            if (!node->hasTagName(trackTag))
     1003                continue;
     1004            HTMLTrackElement* trackElement = static_cast<HTMLTrackElement*>(node);
     1005            if (trackElement->track() != track)
     1006                continue;
     1007           
     1008            // Mark this track as "configured" so configureTextTrack won't change the mode again.
     1009            trackElement->setHasBeenConfigured(true);
     1010            if (track->mode() != TextTrack::DISABLED && trackElement->readyState() == HTMLTrackElement::NONE)
     1011                trackElement->scheduleLoad();
     1012            break;
     1013        }
     1014    }
     1015
     1016    configureTextTrackDisplay();
    10081017}
    10091018
     
    22902299    // If ... the user has indicated an interest in having a track with this text track kind, text track language, ...
    22912300    Settings* settings = document()->settings();
     2301    if (!settings)
     2302        return false;
    22922303
    22932304    if (kind == TextTrack::subtitlesKeyword() || kind == TextTrack::captionsKeyword()) {
    2294         if (!settings)
    2295             return false;
    22962305        if (kind == TextTrack::subtitlesKeyword() && !settings->shouldDisplaySubtitles())
    22972306            return false;
     
    23022311
    23032312    if (kind == TextTrack::descriptionsKeyword()) {
    2304         if (!settings || !settings->shouldDisplayTextDescriptions())
     2313        if (!settings->shouldDisplayTextDescriptions())
    23052314            return false;
    23062315        return userIsInterestedInThisLanguage(trackElement->srclang());
     
    34533462
    34543463    controls->setMediaController(m_mediaController ? m_mediaController.get() : static_cast<MediaControllerInterface*>(this));
     3464    controls->reset();
    34553465
    34563466    ensureShadowRoot()->appendChild(controls, ec);
     
    34673477    }
    34683478
    3469     if (!hasMediaControls()) {
    3470         if (!createMediaControls())
    3471             return;
    3472         mediaControls()->reset();
    3473     }
     3479    if (!hasMediaControls() && !createMediaControls())
     3480        return;
     3481
    34743482    mediaControls()->show();
    34753483#else
     
    34783486#endif
    34793487}
     3488
     3489#if ENABLE(VIDEO_TRACK)
     3490void HTMLMediaElement::configureTextTrackDisplay()
     3491{
     3492    ASSERT(m_textTracks);
     3493
     3494    bool haveVisibleTextTrack = false;
     3495    for (unsigned i = 0; i < m_textTracks->length(); ++i) {
     3496        if (m_textTracks->item(i)->mode() == TextTrack::SHOWING) {
     3497            haveVisibleTextTrack = true;
     3498            break;
     3499        }
     3500    }
     3501
     3502    if (m_haveVisibleTextTrack == haveVisibleTextTrack)
     3503        return;
     3504    m_haveVisibleTextTrack = haveVisibleTextTrack;
     3505
     3506    if (!m_haveVisibleTextTrack) {
     3507        if (hasMediaControls())
     3508            mediaControls()->hideTextTrackDisplay();
     3509        return;
     3510    }
     3511
     3512    if (!hasMediaControls() && !createMediaControls())
     3513        return;
     3514    mediaControls()->showTextTrackDisplay();
     3515}
     3516#endif
    34803517
    34813518void* HTMLMediaElement::preDispatchEventHandler(Event* event)
  • trunk/Source/WebCore/html/HTMLMediaElement.h

    r102968 r103242  
    6767#endif
    6868
     69#if ENABLE(VIDEO_TRACK)
     70typedef PODIntervalTree<double, TextTrackCue*> CueIntervalTree;
     71typedef Vector<CueIntervalTree::IntervalType> CueList;
     72#endif
     73
    6974// FIXME: The inheritance from MediaPlayerClient here should be private inheritance.
    7075// But it can't be until the Chromium WebMediaPlayerClientImpl class is fixed so it
     
    197202
    198203    TextTrackList* textTracks();
     204    CueList currentlyActiveCues() const { return m_currentlyActiveCues; }
    199205
    200206    virtual void trackWasAdded(HTMLTrackElement*);
     
    204210    void configureTextTracks();
    205211    bool textTracksAreReady() const;
     212    void configureTextTrackDisplay();
    206213
    207214    // TextTrackClient
     
    550557#if ENABLE(VIDEO_TRACK)
    551558    bool m_tracksAreReady : 1;
     559    bool m_haveVisibleTextTrack : 1;
     560
    552561    RefPtr<TextTrackList> m_textTracks;
    553562    Vector<RefPtr<TextTrack> > m_textTracksWhenResourceSelectionBegan;
    554    
    555     typedef PODIntervalTree <double, TextTrackCue*> CueIntervalTree;
    556563    CueIntervalTree m_cueTree;
    557     Vector<CueIntervalTree::IntervalType> m_currentlyVisibleCues;
     564    CueList m_currentlyActiveCues;
    558565#endif
    559566
  • trunk/Source/WebCore/html/shadow/MediaControlElements.cpp

    r101810 r103242  
    4848#include "RenderSlider.h"
    4949#include "RenderTheme.h"
     50#include "RenderVideo.h"
    5051#include "RenderView.h"
    5152#include "ScriptController.h"
     
    11161117}
    11171118
     1119// ----------------------------
     1120
     1121#if ENABLE(VIDEO_TRACK)
     1122
     1123class RenderTextTrackContainerElement : public RenderBlock {
     1124public:
     1125    RenderTextTrackContainerElement(Node*);
     1126   
     1127private:
     1128    virtual void layout();
     1129};
     1130
     1131RenderTextTrackContainerElement::RenderTextTrackContainerElement(Node* node)
     1132    : RenderBlock(node)
     1133{
     1134}
     1135
     1136void RenderTextTrackContainerElement::layout()
     1137{
     1138    RenderBlock::layout();
     1139    if (style()->display() == NONE)
     1140        return;
     1141
     1142    ASSERT(mediaControlElementType(node()) == MediaTextTrackDisplayContainer);
     1143
     1144    LayoutStateDisabler layoutStateDisabler(view());
     1145    static_cast<MediaControlTextTrackContainerElement*>(node())->updateSizes();
     1146}
     1147
     1148inline MediaControlTextTrackContainerElement::MediaControlTextTrackContainerElement(Document* document)
     1149    : MediaControlElement(document)
     1150    , m_fontSize(0)
     1151    , m_bottom(0)
     1152{
     1153}
     1154
     1155PassRefPtr<MediaControlTextTrackContainerElement> MediaControlTextTrackContainerElement::create(Document* document)
     1156{
     1157    RefPtr<MediaControlTextTrackContainerElement> element = adoptRef(new MediaControlTextTrackContainerElement(document));
     1158    element->hide();
     1159    return element.release();
     1160}
     1161
     1162RenderObject* MediaControlTextTrackContainerElement::createRenderer(RenderArena* arena, RenderStyle*)
     1163{
     1164    return new (arena) RenderTextTrackContainerElement(this);
     1165}
     1166
     1167const AtomicString& MediaControlTextTrackContainerElement::shadowPseudoId() const
     1168{
     1169    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-text-track-container"));
     1170    return id;
     1171}
     1172
     1173static const float mimimumFontSize = 16;
     1174static const float videoHeightFontSizeDivisor = 25;
     1175static const float trackBottomMultiplier = 0.9;
     1176   
     1177void MediaControlTextTrackContainerElement::updateSizes()
     1178{
     1179    HTMLMediaElement* mediaElement = toParentMediaElement(this);
     1180    if (!mediaElement || !mediaElement->renderer() || !mediaElement->renderer()->isVideo())
     1181        return;
     1182   
     1183    IntRect videoBox = toRenderVideo(mediaElement->renderer())->videoBox();
     1184    if (m_videoDisplaySize == videoBox)
     1185        return;
     1186    m_videoDisplaySize = videoBox;
     1187
     1188    float fontSize = m_videoDisplaySize.size().height() / videoHeightFontSizeDivisor;
     1189    if (fontSize < mimimumFontSize)
     1190        fontSize = mimimumFontSize;
     1191    if (fontSize != m_fontSize) {
     1192        m_fontSize = fontSize;
     1193        ensureInlineStyleDecl()->setProperty(CSSPropertyFontSize, String::number(fontSize) + "px");
     1194    }
     1195
     1196    LayoutUnit bottom = static_cast<LayoutUnit>(m_videoDisplaySize.y() + m_videoDisplaySize.height() - (m_videoDisplaySize.height() * trackBottomMultiplier));
     1197    if (bottom != m_bottom) {
     1198        m_bottom = bottom;
     1199        ensureInlineStyleDecl()->setProperty(CSSPropertyBottom, String::number(bottom) + "px");
     1200    }
     1201}
     1202
     1203// ----------------------------
     1204
     1205MediaControlTextTrackDisplayElement::MediaControlTextTrackDisplayElement(Document* document)
     1206    : MediaControlElement(document)
     1207{
     1208}
     1209
     1210PassRefPtr<MediaControlTextTrackDisplayElement> MediaControlTextTrackDisplayElement::create(Document* document)
     1211{
     1212    return adoptRef(new MediaControlTextTrackDisplayElement(document));
     1213}
     1214
     1215const AtomicString& MediaControlTextTrackDisplayElement::shadowPseudoId() const
     1216{
     1217    DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-text-track-display"));
     1218    return id;
     1219}
     1220
     1221#endif
     1222
     1223// ----------------------------
     1224
    11181225} // namespace WebCore
    11191226
  • trunk/Source/WebCore/html/shadow/MediaControlElements.h

    r101810 r103242  
    7070    MediaVolumeSliderThumb,
    7171    MediaVolumeSliderMuteButton,
     72    MediaTextTrackDisplayContainer,
     73    MediaTextTrackDisplay,
    7274};
    7375
     
    485487// ----------------------------
    486488
     489#if ENABLE(VIDEO_TRACK)
     490class MediaControlTextTrackContainerElement : public MediaControlElement {
     491public:
     492   
     493    static PassRefPtr<MediaControlTextTrackContainerElement> create(Document*);
     494   
     495    void updateSizes();
     496
     497private:
     498    MediaControlTextTrackContainerElement(Document*);
     499
     500    virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
     501    virtual MediaControlElementType displayType() const { return MediaTextTrackDisplayContainer; }
     502    virtual const AtomicString& shadowPseudoId() const;
     503
     504    IntRect m_videoDisplaySize;
     505    float m_fontSize;
     506    LayoutUnit m_bottom;
     507};
     508
     509// ----------------------------
     510
     511class MediaControlTextTrackDisplayElement : public MediaControlElement {
     512public:
     513    static PassRefPtr<MediaControlTextTrackDisplayElement> create(Document*);
     514
     515private:
     516    MediaControlTextTrackDisplayElement(Document*);
     517
     518    virtual MediaControlElementType displayType() const { return MediaTextTrackDisplay; }
     519    virtual const AtomicString& shadowPseudoId() const;
     520};
     521#endif
     522
     523// ----------------------------
     524
    487525} // namespace WebCore
    488526
  • trunk/Source/WebCore/html/shadow/MediaControlRootElement.cpp

    r101810 r103242  
    3232#include "Chrome.h"
    3333#include "HTMLMediaElement.h"
     34#include "HTMLNames.h"
    3435#include "MediaControlElements.h"
    3536#include "MouseEvent.h"
    3637#include "Page.h"
    3738#include "RenderTheme.h"
     39#include "Text.h"
     40
     41#if ENABLE(VIDEO_TRACK)
     42#include "TextTrackCue.h"
     43#endif
    3844
    3945using namespace std;
     
    6672    , m_fullScreenMaxVolumeButton(0)
    6773    , m_panel(0)
     74#if ENABLE(VIDEO_TRACK)
     75    , m_textDisplayContainer(0)
     76    , m_textTrackDisplay(0)
     77#endif
     78    , m_hideFullscreenControlsTimer(this, &MediaControlRootElement::hideFullscreenControlsTimerFired)
    6879    , m_isMouseOverControls(false)
    69     , m_hideFullscreenControlsTimer(this, &MediaControlRootElement::hideFullscreenControlsTimerFired)
    7080{
    7181}
     
    265275    if (m_panel)
    266276        m_panel->setMediaController(controller);
     277#if ENABLE(VIDEO_TRACK)
     278    if (m_textDisplayContainer)
     279        m_textDisplayContainer->setMediaController(controller);
     280    if (m_textTrackDisplay)
     281        m_textTrackDisplay->setMediaController(controller);
     282#endif
    267283    reset();
    268284}
     
    577593}
    578594
     595#if ENABLE(VIDEO_TRACK)
     596void MediaControlRootElement::createTextTrackDisplay()
     597{
     598    if (m_textDisplayContainer)
     599        return;
     600
     601    RefPtr<MediaControlTextTrackContainerElement> textDisplayContainer = MediaControlTextTrackContainerElement::create(document());
     602    m_textDisplayContainer = textDisplayContainer.get();
     603
     604    RefPtr<MediaControlTextTrackDisplayElement> textDisplay = MediaControlTextTrackDisplayElement::create(document());
     605    m_textDisplayContainer->hide();
     606    m_textTrackDisplay = textDisplay.get();
     607
     608    ExceptionCode ec;
     609    textDisplayContainer->appendChild(textDisplay.release(), ec, true);
     610    if (ec)
     611        return;
     612
     613    // Insert it before the first controller element so it always displays behind the controls.
     614    insertBefore(textDisplayContainer.release(), m_panel, ec, true);
     615}
     616
     617void MediaControlRootElement::showTextTrackDisplay()
     618{
     619    if (!m_textDisplayContainer)
     620        createTextTrackDisplay();
     621    m_textDisplayContainer->show();
     622}
     623
     624void MediaControlRootElement::hideTextTrackDisplay()
     625{
     626    if (!m_textDisplayContainer)
     627        createTextTrackDisplay();
     628    m_textDisplayContainer->hide();
     629}
     630
     631void MediaControlRootElement::updateTextTrackDisplay()
     632{
     633    if (!m_textDisplayContainer)
     634        createTextTrackDisplay();
     635
     636    CueList activeCues = toParentMediaElement(m_textDisplayContainer)->currentlyActiveCues();
     637    if (activeCues.isEmpty())
     638        return;
     639
     640    m_textTrackDisplay->removeChildren();
     641    bool nothingToDisplay = true;
     642    for (size_t i = 0; i < activeCues.size(); ++i) {
     643        TextTrackCue* cue = activeCues[i].data();
     644        ASSERT(cue->isActive());
     645        if (!cue->track() || cue->track()->mode() != TextTrack::SHOWING)
     646            continue;
     647
     648        String cueText = cue->getCueAsSource();
     649        if (!cueText.isEmpty()) {
     650            if (!nothingToDisplay)
     651                m_textTrackDisplay->appendChild(document()->createElement(HTMLNames::brTag, false), ASSERT_NO_EXCEPTION);
     652            m_textTrackDisplay->appendChild(document()->createTextNode(cueText), ASSERT_NO_EXCEPTION);
     653            nothingToDisplay = false;
     654        }
     655    }
     656
     657    if (!nothingToDisplay)
     658        m_textDisplayContainer->show();
     659    else
     660        m_textDisplayContainer->hide();
     661}
     662#endif
     663
    579664const AtomicString& MediaControlRootElement::shadowPseudoId() const
    580665{
  • trunk/Source/WebCore/html/shadow/MediaControlRootElement.h

    r101810 r103242  
    6767class RenderMedia;
    6868
     69#if ENABLE(VIDEO_TRACK)
     70class MediaControlTextTrackContainerElement;
     71class MediaControlTextTrackDisplayElement;
     72#endif
     73
    6974class MediaControlRootElement : public MediaControls {
    7075public:
     
    98103    void updateTimeDisplay();
    99104    void updateStatusDisplay();
     105
     106#if ENABLE(VIDEO_TRACK)
     107    void createTextTrackDisplay();
     108    void showTextTrackDisplay();
     109    void hideTextTrackDisplay();
     110    void updateTextTrackDisplay();
     111#endif
    100112
    101113    virtual bool shouldHideControls();
     
    135147    MediaControlFullscreenVolumeMaxButtonElement* m_fullScreenMaxVolumeButton;
    136148    MediaControlPanelElement* m_panel;
     149#if ENABLE(VIDEO_TRACK)
     150    MediaControlTextTrackContainerElement* m_textDisplayContainer;
     151    MediaControlTextTrackDisplayElement* m_textTrackDisplay;
     152#endif
     153    Timer<MediaControlRootElement> m_hideFullscreenControlsTimer;
    137154    bool m_isMouseOverControls;
    138     Timer<MediaControlRootElement> m_hideFullscreenControlsTimer;
    139155};
    140156
  • trunk/Source/WebCore/html/shadow/MediaControlRootElementChromium.cpp

    r101810 r103242  
    3030#include "MediaControlRootElementChromium.h"
    3131
     32#include "HTMLMediaElement.h"
     33#include "HTMLNames.h"
    3234#include "MediaControlElements.h"
    3335#include "MouseEvent.h"
    3436#include "Page.h"
    3537#include "RenderTheme.h"
     38#include "Text.h"
     39
     40#if ENABLE(VIDEO_TRACK)
     41#include "TextTrackCue.h"
     42#endif
    3643
    3744using namespace std;
     
    5057    , m_volumeSliderContainer(0)
    5158    , m_panel(0)
     59#if ENABLE(VIDEO_TRACK)
     60    , m_textDisplayContainer(0)
     61    , m_textTrackDisplay(0)
     62#endif
    5263    , m_opaque(true)
    5364    , m_isMouseOverControls(false)
     
    145156    if (m_panel)
    146157        m_panel->setMediaController(controller);
     158#if ENABLE(VIDEO_TRACK)
     159    if (m_textDisplayContainer)
     160        m_textDisplayContainer->setMediaController(controller);
     161    if (m_textTrackDisplay)
     162        m_textTrackDisplay->setMediaController(controller);
     163#endif
    147164    reset();
    148165}
     
    310327}
    311328
     329#if ENABLE(VIDEO_TRACK)
     330void MediaControlRootElementChromium::createTextTrackDisplay()
     331{
     332    if (m_textDisplayContainer)
     333        return;
     334
     335    RefPtr<MediaControlTextTrackContainerElement> textDisplayContainer = MediaControlTextTrackContainerElement::create(document());
     336    m_textDisplayContainer = textDisplayContainer.get();
     337
     338    RefPtr<MediaControlTextTrackDisplayElement> textDisplay = MediaControlTextTrackDisplayElement::create(document());
     339    m_textDisplayContainer->hide();
     340    m_textTrackDisplay = textDisplay.get();
     341
     342    ExceptionCode ec;
     343    textDisplayContainer->appendChild(textDisplay.release(), ec, true);
     344    if (ec)
     345        return;
     346
     347    // Insert it before the first controller element so it always displays behind the controls.
     348    insertBefore(textDisplayContainer.release(), m_panel, ec, true);
     349}
     350
     351void MediaControlRootElementChromium::showTextTrackDisplay()
     352{
     353    if (!m_textDisplayContainer)
     354        createTextTrackDisplay();
     355    m_textDisplayContainer->show();
     356}
     357
     358void MediaControlRootElementChromium::hideTextTrackDisplay()
     359{
     360    if (!m_textDisplayContainer)
     361        createTextTrackDisplay();
     362    m_textDisplayContainer->hide();
     363}
     364
     365void MediaControlRootElementChromium::updateTextTrackDisplay()
     366{
     367    if (!m_textDisplayContainer)
     368        createTextTrackDisplay();
     369
     370    CueList activeCues = toParentMediaElement(m_textDisplayContainer)->currentlyActiveCues();
     371    if (activeCues.isEmpty())
     372        return;
     373
     374    m_textTrackDisplay->removeChildren();
     375    bool nothingToDisplay = true;
     376    for (size_t i = 0; i < activeCues.size(); ++i) {
     377        TextTrackCue* cue = activeCues[i].data();
     378        ASSERT(cue->isActive());
     379        if (!cue->track() || cue->track()->mode() != TextTrack::SHOWING)
     380            continue;
     381
     382        String cueText = cue->getCueAsSource();
     383        if (!cueText.isEmpty()) {
     384            if (!nothingToDisplay)
     385                m_textTrackDisplay->appendChild(document()->createElement(HTMLNames::brTag, false), ASSERT_NO_EXCEPTION);
     386            m_textTrackDisplay->appendChild(document()->createTextNode(cueText), ASSERT_NO_EXCEPTION);
     387            nothingToDisplay = false;
     388        }
     389    }
     390
     391    if (!nothingToDisplay)
     392        m_textDisplayContainer->show();
     393    else
     394        m_textDisplayContainer->hide();
     395}
     396#endif
     397   
    312398const AtomicString& MediaControlRootElementChromium::shadowPseudoId() const
    313399{
  • trunk/Source/WebCore/html/shadow/MediaControlRootElementChromium.h

    r101810 r103242  
    5656class RenderMedia;
    5757
     58#if ENABLE(VIDEO_TRACK)
     59class MediaControlTextTrackContainerElement;
     60class MediaControlTextTrackDisplayElement;
     61#endif
     62
    5863class MediaControlRootElementChromium : public MediaControls {
    5964public:
     
    8893    void updateStatusDisplay();
    8994
     95#if ENABLE(VIDEO_TRACK)
     96    void createTextTrackDisplay();
     97    void showTextTrackDisplay();
     98    void hideTextTrackDisplay();
     99    void updateTextTrackDisplay();
     100#endif
     101
    90102    virtual bool shouldHideControls();
    91103
     
    109121    MediaControlVolumeSliderContainerElement* m_volumeSliderContainer;
    110122    MediaControlPanelElement* m_panel;
     123#if ENABLE(VIDEO_TRACK)
     124    MediaControlTextTrackContainerElement* m_textDisplayContainer;
     125    MediaControlTextTrackDisplayElement* m_textTrackDisplay;
     126#endif
    111127
    112128    bool m_opaque;
  • trunk/Source/WebCore/html/shadow/MediaControls.h

    r101810 r103242  
    7373    virtual bool shouldHideControls() = 0;
    7474
     75#if ENABLE(VIDEO_TRACK)
     76    virtual void showTextTrackDisplay() = 0;
     77    virtual void hideTextTrackDisplay() = 0;
     78    virtual void updateTextTrackDisplay() = 0;
     79#endif
     80
    7581protected:
    7682    MediaControls(Document*);
  • trunk/Source/WebCore/rendering/RenderMediaControls.cpp

    r95901 r103242  
    175175        case MediaControlsPanel:
    176176            ASSERT_NOT_REACHED();
     177        case MediaTextTrackDisplayContainer:
     178        case MediaTextTrackDisplay:
     179            ASSERT_NOT_REACHED();
    177180            break;
    178181    }
  • trunk/Source/WebCore/rendering/RenderMediaControlsChromium.cpp

    r99239 r103242  
    271271    case MediaShowClosedCaptionsButton:
    272272    case MediaHideClosedCaptionsButton:
     273    case MediaTextTrackDisplayContainer:
     274    case MediaTextTrackDisplay:
    273275        ASSERT_NOT_REACHED();
    274276        break;
Note: See TracChangeset for help on using the changeset viewer.