Changeset 103242 in webkit
- Timestamp:
- Dec 19, 2011, 9:25:37 AM (13 years ago)
- Location:
- trunk
- Files:
-
- 3 added
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r103241 r103242 1 2011-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 1 16 2011-12-19 Csaba Osztrogonác <[email protected]> 2 17 -
trunk/LayoutTests/media/media-controls.js
r95111 r103242 2 2 function mediaControlsElement(first, id) 3 3 { 4 var controlID = "-webkit-media-controls-" + id;5 4 for (var element = first; element; element = element.nextSibling) { 6 5 … … 8 7 // text nodes for the time values, so guard against exceptions. 9 8 try { 10 if (internals.shadowPseudoId(element) == controlID)9 if (internals.shadowPseudoId(element) == id) 11 10 return element; 12 11 } catch (exception) { } … … 24 23 function mediaControlsButtonCoordinates(element, id) 25 24 { 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); 27 27 if (!button) 28 28 throw "Failed to find media control element ID '" + id + "'"; … … 33 33 return new Array(x, y); 34 34 } 35 36 function 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 1 2011-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 1 63 2011-12-19 Eric Carlson <[email protected]> 2 64 -
trunk/Source/WebCore/css/mediaControls.css
r102306 r103242 187 187 display: none; 188 188 } 189 190 video::-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 208 video::-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 232 232 #if ENABLE(VIDEO_TRACK) 233 233 , m_tracksAreReady(true) 234 , m_haveVisibleTextTrack(false) 234 235 , m_textTracks(0) 235 236 #endif … … 941 942 void HTMLMediaElement::updateActiveTextTrackCues(float movieTime) 942 943 { 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)); 946 948 947 949 // FIXME(72171): Events need to be sorted and filtered before dispatching. 948 950 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 } 956 962 } 957 963 958 964 // FIXME(72173): Pause the media element for cues going past their endTime 959 965 // during a monotonic time increase. 966 967 if (activeSetChanged && hasMediaControls()) 968 mediaControls()->updateTextTrackDisplay(); 960 969 } 961 970 … … 983 992 void HTMLMediaElement::textTrackModeChanged(TextTrack* track) 984 993 { 985 // 4.8.10.12.3 Sourcing out-of-band text tracks986 // ... when a text track corresponding to a track element is created with text track987 // 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 synchronously989 // 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(); 1008 1017 } 1009 1018 … … 2290 2299 // If ... the user has indicated an interest in having a track with this text track kind, text track language, ... 2291 2300 Settings* settings = document()->settings(); 2301 if (!settings) 2302 return false; 2292 2303 2293 2304 if (kind == TextTrack::subtitlesKeyword() || kind == TextTrack::captionsKeyword()) { 2294 if (!settings)2295 return false;2296 2305 if (kind == TextTrack::subtitlesKeyword() && !settings->shouldDisplaySubtitles()) 2297 2306 return false; … … 2302 2311 2303 2312 if (kind == TextTrack::descriptionsKeyword()) { 2304 if (!settings || !settings->shouldDisplayTextDescriptions())2313 if (!settings->shouldDisplayTextDescriptions()) 2305 2314 return false; 2306 2315 return userIsInterestedInThisLanguage(trackElement->srclang()); … … 3453 3462 3454 3463 controls->setMediaController(m_mediaController ? m_mediaController.get() : static_cast<MediaControllerInterface*>(this)); 3464 controls->reset(); 3455 3465 3456 3466 ensureShadowRoot()->appendChild(controls, ec); … … 3467 3477 } 3468 3478 3469 if (!hasMediaControls()) { 3470 if (!createMediaControls()) 3471 return; 3472 mediaControls()->reset(); 3473 } 3479 if (!hasMediaControls() && !createMediaControls()) 3480 return; 3481 3474 3482 mediaControls()->show(); 3475 3483 #else … … 3478 3486 #endif 3479 3487 } 3488 3489 #if ENABLE(VIDEO_TRACK) 3490 void 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 3480 3517 3481 3518 void* HTMLMediaElement::preDispatchEventHandler(Event* event) -
trunk/Source/WebCore/html/HTMLMediaElement.h
r102968 r103242 67 67 #endif 68 68 69 #if ENABLE(VIDEO_TRACK) 70 typedef PODIntervalTree<double, TextTrackCue*> CueIntervalTree; 71 typedef Vector<CueIntervalTree::IntervalType> CueList; 72 #endif 73 69 74 // FIXME: The inheritance from MediaPlayerClient here should be private inheritance. 70 75 // But it can't be until the Chromium WebMediaPlayerClientImpl class is fixed so it … … 197 202 198 203 TextTrackList* textTracks(); 204 CueList currentlyActiveCues() const { return m_currentlyActiveCues; } 199 205 200 206 virtual void trackWasAdded(HTMLTrackElement*); … … 204 210 void configureTextTracks(); 205 211 bool textTracksAreReady() const; 212 void configureTextTrackDisplay(); 206 213 207 214 // TextTrackClient … … 550 557 #if ENABLE(VIDEO_TRACK) 551 558 bool m_tracksAreReady : 1; 559 bool m_haveVisibleTextTrack : 1; 560 552 561 RefPtr<TextTrackList> m_textTracks; 553 562 Vector<RefPtr<TextTrack> > m_textTracksWhenResourceSelectionBegan; 554 555 typedef PODIntervalTree <double, TextTrackCue*> CueIntervalTree;556 563 CueIntervalTree m_cueTree; 557 Vector<CueIntervalTree::IntervalType> m_currentlyVisibleCues;564 CueList m_currentlyActiveCues; 558 565 #endif 559 566 -
trunk/Source/WebCore/html/shadow/MediaControlElements.cpp
r101810 r103242 48 48 #include "RenderSlider.h" 49 49 #include "RenderTheme.h" 50 #include "RenderVideo.h" 50 51 #include "RenderView.h" 51 52 #include "ScriptController.h" … … 1116 1117 } 1117 1118 1119 // ---------------------------- 1120 1121 #if ENABLE(VIDEO_TRACK) 1122 1123 class RenderTextTrackContainerElement : public RenderBlock { 1124 public: 1125 RenderTextTrackContainerElement(Node*); 1126 1127 private: 1128 virtual void layout(); 1129 }; 1130 1131 RenderTextTrackContainerElement::RenderTextTrackContainerElement(Node* node) 1132 : RenderBlock(node) 1133 { 1134 } 1135 1136 void 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 1148 inline MediaControlTextTrackContainerElement::MediaControlTextTrackContainerElement(Document* document) 1149 : MediaControlElement(document) 1150 , m_fontSize(0) 1151 , m_bottom(0) 1152 { 1153 } 1154 1155 PassRefPtr<MediaControlTextTrackContainerElement> MediaControlTextTrackContainerElement::create(Document* document) 1156 { 1157 RefPtr<MediaControlTextTrackContainerElement> element = adoptRef(new MediaControlTextTrackContainerElement(document)); 1158 element->hide(); 1159 return element.release(); 1160 } 1161 1162 RenderObject* MediaControlTextTrackContainerElement::createRenderer(RenderArena* arena, RenderStyle*) 1163 { 1164 return new (arena) RenderTextTrackContainerElement(this); 1165 } 1166 1167 const AtomicString& MediaControlTextTrackContainerElement::shadowPseudoId() const 1168 { 1169 DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-text-track-container")); 1170 return id; 1171 } 1172 1173 static const float mimimumFontSize = 16; 1174 static const float videoHeightFontSizeDivisor = 25; 1175 static const float trackBottomMultiplier = 0.9; 1176 1177 void 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 1205 MediaControlTextTrackDisplayElement::MediaControlTextTrackDisplayElement(Document* document) 1206 : MediaControlElement(document) 1207 { 1208 } 1209 1210 PassRefPtr<MediaControlTextTrackDisplayElement> MediaControlTextTrackDisplayElement::create(Document* document) 1211 { 1212 return adoptRef(new MediaControlTextTrackDisplayElement(document)); 1213 } 1214 1215 const 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 1118 1225 } // namespace WebCore 1119 1226 -
trunk/Source/WebCore/html/shadow/MediaControlElements.h
r101810 r103242 70 70 MediaVolumeSliderThumb, 71 71 MediaVolumeSliderMuteButton, 72 MediaTextTrackDisplayContainer, 73 MediaTextTrackDisplay, 72 74 }; 73 75 … … 485 487 // ---------------------------- 486 488 489 #if ENABLE(VIDEO_TRACK) 490 class MediaControlTextTrackContainerElement : public MediaControlElement { 491 public: 492 493 static PassRefPtr<MediaControlTextTrackContainerElement> create(Document*); 494 495 void updateSizes(); 496 497 private: 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 511 class MediaControlTextTrackDisplayElement : public MediaControlElement { 512 public: 513 static PassRefPtr<MediaControlTextTrackDisplayElement> create(Document*); 514 515 private: 516 MediaControlTextTrackDisplayElement(Document*); 517 518 virtual MediaControlElementType displayType() const { return MediaTextTrackDisplay; } 519 virtual const AtomicString& shadowPseudoId() const; 520 }; 521 #endif 522 523 // ---------------------------- 524 487 525 } // namespace WebCore 488 526 -
trunk/Source/WebCore/html/shadow/MediaControlRootElement.cpp
r101810 r103242 32 32 #include "Chrome.h" 33 33 #include "HTMLMediaElement.h" 34 #include "HTMLNames.h" 34 35 #include "MediaControlElements.h" 35 36 #include "MouseEvent.h" 36 37 #include "Page.h" 37 38 #include "RenderTheme.h" 39 #include "Text.h" 40 41 #if ENABLE(VIDEO_TRACK) 42 #include "TextTrackCue.h" 43 #endif 38 44 39 45 using namespace std; … … 66 72 , m_fullScreenMaxVolumeButton(0) 67 73 , m_panel(0) 74 #if ENABLE(VIDEO_TRACK) 75 , m_textDisplayContainer(0) 76 , m_textTrackDisplay(0) 77 #endif 78 , m_hideFullscreenControlsTimer(this, &MediaControlRootElement::hideFullscreenControlsTimerFired) 68 79 , m_isMouseOverControls(false) 69 , m_hideFullscreenControlsTimer(this, &MediaControlRootElement::hideFullscreenControlsTimerFired)70 80 { 71 81 } … … 265 275 if (m_panel) 266 276 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 267 283 reset(); 268 284 } … … 577 593 } 578 594 595 #if ENABLE(VIDEO_TRACK) 596 void 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 617 void MediaControlRootElement::showTextTrackDisplay() 618 { 619 if (!m_textDisplayContainer) 620 createTextTrackDisplay(); 621 m_textDisplayContainer->show(); 622 } 623 624 void MediaControlRootElement::hideTextTrackDisplay() 625 { 626 if (!m_textDisplayContainer) 627 createTextTrackDisplay(); 628 m_textDisplayContainer->hide(); 629 } 630 631 void 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 579 664 const AtomicString& MediaControlRootElement::shadowPseudoId() const 580 665 { -
trunk/Source/WebCore/html/shadow/MediaControlRootElement.h
r101810 r103242 67 67 class RenderMedia; 68 68 69 #if ENABLE(VIDEO_TRACK) 70 class MediaControlTextTrackContainerElement; 71 class MediaControlTextTrackDisplayElement; 72 #endif 73 69 74 class MediaControlRootElement : public MediaControls { 70 75 public: … … 98 103 void updateTimeDisplay(); 99 104 void updateStatusDisplay(); 105 106 #if ENABLE(VIDEO_TRACK) 107 void createTextTrackDisplay(); 108 void showTextTrackDisplay(); 109 void hideTextTrackDisplay(); 110 void updateTextTrackDisplay(); 111 #endif 100 112 101 113 virtual bool shouldHideControls(); … … 135 147 MediaControlFullscreenVolumeMaxButtonElement* m_fullScreenMaxVolumeButton; 136 148 MediaControlPanelElement* m_panel; 149 #if ENABLE(VIDEO_TRACK) 150 MediaControlTextTrackContainerElement* m_textDisplayContainer; 151 MediaControlTextTrackDisplayElement* m_textTrackDisplay; 152 #endif 153 Timer<MediaControlRootElement> m_hideFullscreenControlsTimer; 137 154 bool m_isMouseOverControls; 138 Timer<MediaControlRootElement> m_hideFullscreenControlsTimer;139 155 }; 140 156 -
trunk/Source/WebCore/html/shadow/MediaControlRootElementChromium.cpp
r101810 r103242 30 30 #include "MediaControlRootElementChromium.h" 31 31 32 #include "HTMLMediaElement.h" 33 #include "HTMLNames.h" 32 34 #include "MediaControlElements.h" 33 35 #include "MouseEvent.h" 34 36 #include "Page.h" 35 37 #include "RenderTheme.h" 38 #include "Text.h" 39 40 #if ENABLE(VIDEO_TRACK) 41 #include "TextTrackCue.h" 42 #endif 36 43 37 44 using namespace std; … … 50 57 , m_volumeSliderContainer(0) 51 58 , m_panel(0) 59 #if ENABLE(VIDEO_TRACK) 60 , m_textDisplayContainer(0) 61 , m_textTrackDisplay(0) 62 #endif 52 63 , m_opaque(true) 53 64 , m_isMouseOverControls(false) … … 145 156 if (m_panel) 146 157 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 147 164 reset(); 148 165 } … … 310 327 } 311 328 329 #if ENABLE(VIDEO_TRACK) 330 void 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 351 void MediaControlRootElementChromium::showTextTrackDisplay() 352 { 353 if (!m_textDisplayContainer) 354 createTextTrackDisplay(); 355 m_textDisplayContainer->show(); 356 } 357 358 void MediaControlRootElementChromium::hideTextTrackDisplay() 359 { 360 if (!m_textDisplayContainer) 361 createTextTrackDisplay(); 362 m_textDisplayContainer->hide(); 363 } 364 365 void 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 312 398 const AtomicString& MediaControlRootElementChromium::shadowPseudoId() const 313 399 { -
trunk/Source/WebCore/html/shadow/MediaControlRootElementChromium.h
r101810 r103242 56 56 class RenderMedia; 57 57 58 #if ENABLE(VIDEO_TRACK) 59 class MediaControlTextTrackContainerElement; 60 class MediaControlTextTrackDisplayElement; 61 #endif 62 58 63 class MediaControlRootElementChromium : public MediaControls { 59 64 public: … … 88 93 void updateStatusDisplay(); 89 94 95 #if ENABLE(VIDEO_TRACK) 96 void createTextTrackDisplay(); 97 void showTextTrackDisplay(); 98 void hideTextTrackDisplay(); 99 void updateTextTrackDisplay(); 100 #endif 101 90 102 virtual bool shouldHideControls(); 91 103 … … 109 121 MediaControlVolumeSliderContainerElement* m_volumeSliderContainer; 110 122 MediaControlPanelElement* m_panel; 123 #if ENABLE(VIDEO_TRACK) 124 MediaControlTextTrackContainerElement* m_textDisplayContainer; 125 MediaControlTextTrackDisplayElement* m_textTrackDisplay; 126 #endif 111 127 112 128 bool m_opaque; -
trunk/Source/WebCore/html/shadow/MediaControls.h
r101810 r103242 73 73 virtual bool shouldHideControls() = 0; 74 74 75 #if ENABLE(VIDEO_TRACK) 76 virtual void showTextTrackDisplay() = 0; 77 virtual void hideTextTrackDisplay() = 0; 78 virtual void updateTextTrackDisplay() = 0; 79 #endif 80 75 81 protected: 76 82 MediaControls(Document*); -
trunk/Source/WebCore/rendering/RenderMediaControls.cpp
r95901 r103242 175 175 case MediaControlsPanel: 176 176 ASSERT_NOT_REACHED(); 177 case MediaTextTrackDisplayContainer: 178 case MediaTextTrackDisplay: 179 ASSERT_NOT_REACHED(); 177 180 break; 178 181 } -
trunk/Source/WebCore/rendering/RenderMediaControlsChromium.cpp
r99239 r103242 271 271 case MediaShowClosedCaptionsButton: 272 272 case MediaHideClosedCaptionsButton: 273 case MediaTextTrackDisplayContainer: 274 case MediaTextTrackDisplay: 273 275 ASSERT_NOT_REACHED(); 274 276 break;
Note:
See TracChangeset
for help on using the changeset viewer.