Changeset 155048 in webkit
- Timestamp:
- Sep 4, 2013 10:39:03 AM (11 years ago)
- Location:
- trunk
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r155042 r155048 1 2013-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 1 13 2013-09-04 Zoltan Arvai <zarvai@inf.u-szeged.hu> 2 14 -
trunk/LayoutTests/platform/gtk/TestExpectations
r155037 r155048 797 797 webkit.org/b/102257 fast/dom/Window/open-window-min-size.html [ Timeout ] 798 798 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 808 799 webkit.org/b/107194 storage/indexeddb/database-quota.html [ Timeout ] 809 800 webkit.org/b/107194 storage/indexeddb/pending-activity-workers.html [ Timeout ] … … 911 902 # LayoutTestController::applicationCacheDiskUsageForOrigin isn't implemented. 912 903 webkit.org/b/57127 http/tests/appcache/origin-usage.html [ Failure ] 904 905 # GTK is moving from toggle button to a menu of tracks. 906 webkit.org/b/101670 media/video-controls-captions-trackmenu.html [ Failure ] 907 webkit.org/b/101670 media/track/track-user-preferences.html [ Failure ] 908 webkit.org/b/101670 media/video-controls-captions-trackmenu-includes-enabled-track.html [ Failure ] 913 909 914 910 Bug(GTK) http/tests/loading/bad-scheme-subframe.html [ Failure ] … … 1221 1217 webkit.org/b/87355 canvas/philip/tests/2d.text.draw.fontface.notinpage.html [ Failure ] 1222 1218 1219 # GTK is moving from the simple toggle button to a menu of tracks 1223 1220 webkit.org/b/95428 media/video-controls-captions.html [ Failure ] 1224 1221 -
trunk/Source/WebCore/ChangeLog
r155047 r155048 1 2013-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 1 50 2013-09-03 Darin Adler <darin@apple.com> 2 51 -
trunk/Source/WebCore/css/mediaControlsGtk.css
r143463 r155048 223 223 line-height: 30px; 224 224 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 230 video::-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 246 video::-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 253 video::-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 262 video::-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 269 video::-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 } 286 video::-webkit-media-controls-closed-captions-track-list li.selected { 287 background-color: rgba(230, 230, 230, 0.15); 225 288 } 226 289 -
trunk/Source/WebCore/html/shadow/MediaControlElements.cpp
r154937 r155048 678 678 MediaControlToggleClosedCaptionsButtonElement::MediaControlToggleClosedCaptionsButtonElement(Document* document, MediaControls* controls) 679 679 : MediaControlInputElement(document, MediaShowClosedCaptionsButton) 680 #if PLATFORM(MAC) || PLATFORM(WIN) 680 #if PLATFORM(MAC) || PLATFORM(WIN) || PLATFORM(GTK) 681 681 , m_controls(controls) 682 682 #endif 683 683 { 684 #if !PLATFORM(MAC) && !PLATFORM(WIN) 684 #if !PLATFORM(MAC) && !PLATFORM(WIN) || !PLATFORM(GTK) 685 685 UNUSED_PARAM(controls); 686 686 #endif … … 712 712 // we have to use #if. 713 713 // https://bugs.webkit.org/show_bug.cgi?id=101877 714 #if !PLATFORM(MAC) && !PLATFORM(WIN) 714 #if !PLATFORM(MAC) && !PLATFORM(WIN) && !PLATFORM(GTK) 715 715 mediaController()->setClosedCaptionsVisible(!mediaController()->closedCaptionsVisible()); 716 716 setChecked(mediaController()->closedCaptionsVisible()); -
trunk/Source/WebCore/html/shadow/MediaControlElements.h
r152975 r155048 281 281 virtual void defaultEventHandler(Event*) OVERRIDE; 282 282 283 #if PLATFORM(MAC) || PLATFORM(WIN) 283 #if PLATFORM(MAC) || PLATFORM(WIN) || PLATFORM(GTK) 284 284 MediaControls* m_controls; 285 285 #endif -
trunk/Source/WebCore/html/shadow/MediaControlsGtk.cpp
r154877 r155048 32 32 #include "MediaControlsGtk.h" 33 33 34 #include "Chrome.h" 35 #include "MouseEvent.h" 36 34 37 namespace WebCore { 38 39 class MediaControlsGtkEventListener : public EventListener { 40 public: 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 51 private: 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 }; 35 62 36 63 MediaControlsGtk::MediaControlsGtk(Document* document) … … 38 65 , m_durationDisplay(0) 39 66 , m_enclosure(0) 67 , m_eventListener(0) 68 , m_closedCaptionsTrackList(0) 69 , m_closedCaptionsContainer(0) 40 70 { 41 71 } … … 92 122 93 123 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 94 132 RefPtr<MediaControlToggleClosedCaptionsButtonElement> toggleClosedCaptionsButton = MediaControlToggleClosedCaptionsButtonElement::create(document, this); 95 133 m_toggleClosedCaptionsButton = toggleClosedCaptionsButton.get(); … … 97 135 if (exceptionCode) 98 136 return false; 137 138 m_closedCaptionsContainer = closedCaptionsContainer.get(); 139 appendChild(closedCaptionsContainer.release(), exceptionCode, AttachLazily); 140 if (exceptionCode) 141 return false; 99 142 } 100 143 … … 148 191 if (m_enclosure) 149 192 m_enclosure->setMediaController(controller); 193 if (m_closedCaptionsContainer) 194 m_closedCaptionsContainer->setMediaController(controller); 195 if (m_closedCaptionsTrackList) 196 m_closedCaptionsTrackList->setMediaController(controller); 150 197 } 151 198 … … 159 206 m_durationDisplay->setInnerText(page->theme()->formatMediaControlsTime(duration), ASSERT_NO_EXCEPTION); 160 207 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 } 161 215 162 216 MediaControls::reset(); … … 209 263 if (m_volumeSliderContainer) 210 264 m_volumeSliderContainer->hide(); 265 266 hideClosedCaptionTrackList(); 211 267 } 212 268 … … 237 293 #endif 238 294 239 } 240 295 void 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 312 void 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 330 void 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 344 void 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 357 PassRefPtr<MediaControlsGtkEventListener> MediaControlsGtk::eventListener() 358 { 359 if (!m_eventListener) 360 m_eventListener = MediaControlsGtkEventListener::create(this); 361 362 return m_eventListener; 363 } 364 365 void MediaControlsGtkEventListener::handleEvent(ScriptExecutionContext*, Event* event) 366 { 367 if (event->type() == eventNames().clickEvent) 368 m_mediaControls->handleClickEvent(event); 369 370 return; 371 } 372 373 bool 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 } 241 381 #endif -
trunk/Source/WebCore/html/shadow/MediaControlsGtk.h
r154000 r155048 36 36 namespace WebCore { 37 37 38 class MediaControlsGtkEventListener; 39 38 40 class MediaControlsGtk : public MediaControls { 39 41 public: … … 48 50 virtual void showVolumeSlider() OVERRIDE; 49 51 virtual void makeTransparent() OVERRIDE; 52 virtual void toggleClosedCaptionTrackList() OVERRIDE; 53 54 void handleClickEvent(Event*); 50 55 51 56 #if ENABLE(VIDEO_TRACK) … … 55 60 protected: 56 61 explicit MediaControlsGtk(Document*); 57 58 62 bool initializeControls(Document*); 59 63 60 64 private: 65 void showClosedCaptionTrackList(); 66 void hideClosedCaptionTrackList(); 67 68 PassRefPtr<MediaControlsGtkEventListener> eventListener(); 69 61 70 MediaControlTimeRemainingDisplayElement* m_durationDisplay; 62 71 MediaControlPanelEnclosureElement* m_enclosure; 63 72 MediaControlVolumeSliderContainerElement* m_volumeSliderContainer; 73 MediaControlClosedCaptionsTrackListElement* m_closedCaptionsTrackList; 74 MediaControlClosedCaptionsContainerElement* m_closedCaptionsContainer; 75 76 RefPtr<MediaControlsGtkEventListener> m_eventListener; 64 77 }; 65 78 -
trunk/Source/WebCore/page/CaptionUserPreferences.cpp
r153927 r155048 158 158 static String trackDisplayName(TextTrack* track) 159 159 { 160 if (track == TextTrack::captionMenuOffItem()) 161 return textTrackOffMenuItemText(); 162 if (track == TextTrack::captionMenuAutomaticItem()) 163 return textTrackAutomaticMenuItemText(); 164 160 165 if (track->label().isEmpty() && track->language().isEmpty()) 161 166 return textTrackNoLabelText(); … … 185 190 186 191 nonCopyingSort(tracksForMenu.begin(), tracksForMenu.end(), textTrackCompare); 192 tracksForMenu.insert(0, TextTrack::captionMenuOffItem()); 193 tracksForMenu.insert(1, TextTrack::captionMenuAutomaticItem()); 187 194 188 195 return tracksForMenu; -
trunk/Source/WebCore/platform/gtk/LocalizedStringsGtk.cpp
r154994 r155048 796 796 String textTrackSubtitlesText() 797 797 { 798 return String::fromUTF8(C_(" Subtitles", "Menu section heading for subtitles"));798 return String::fromUTF8(C_("Menu section heading for subtitles", "Subtitles")); 799 799 } 800 800 801 801 String textTrackOffMenuItemText() 802 802 { 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")); 804 804 } 805 805 … … 811 811 String textTrackNoLabelText() 812 812 { 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")); 814 814 } 815 815 #endif -
trunk/Source/WebCore/platform/gtk/RenderThemeGtk.h
r151783 r155048 88 88 virtual String extraMediaControlsStyleSheet(); 89 89 virtual String formatMediaControlsCurrentTime(float currentTime, float duration) const; 90 virtual bool supportsClosedCaptioning() const OVERRIDE { return true; } 90 91 91 92 #if ENABLE(FULLSCREEN_API)
Note: See TracChangeset
for help on using the changeset viewer.