Don't hide contorls of audio by click event.
[framework/web/webkit-efl.git] / Source / WebCore / html / shadow / MediaControlRootElement.cpp
1 /*
2  * Copyright (C) 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
3  * Copyright (C) 2011 Google Inc. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #include "config.h"
28
29 #if ENABLE(VIDEO)
30 #include "MediaControlRootElement.h"
31
32 #include "Chrome.h"
33 #include "HTMLMediaElement.h"
34 #include "HTMLNames.h"
35 #include "MediaControlElements.h"
36 #include "MouseEvent.h"
37 #include "Page.h"
38 #include "RenderTheme.h"
39 #include "Text.h"
40
41 #if ENABLE(VIDEO_TRACK)
42 #include "TextTrackCue.h"
43 #endif
44
45 using namespace std;
46
47 namespace WebCore {
48
49 static const double timeWithoutMouseMovementBeforeHidingControls = 3;
50
51 MediaControlRootElement::MediaControlRootElement(Document* document)
52     : MediaControls(document)
53     , m_mediaController(0)
54     , m_rewindButton(0)
55     , m_playButton(0)
56     , m_returnToRealTimeButton(0)
57     , m_statusDisplay(0)
58     , m_currentTimeDisplay(0)
59     , m_timeline(0)
60     , m_timeRemainingDisplay(0)
61     , m_timelineContainer(0)
62     , m_seekBackButton(0)
63     , m_seekForwardButton(0)
64     , m_toggleClosedCaptionsButton(0)
65     , m_panelMuteButton(0)
66     , m_volumeSlider(0)
67     , m_volumeSliderMuteButton(0)
68     , m_volumeSliderContainer(0)
69     , m_fullScreenButton(0)
70     , m_fullScreenMinVolumeButton(0)
71     , m_fullScreenVolumeSlider(0)
72     , m_fullScreenMaxVolumeButton(0)
73     , m_panel(0)
74 #if ENABLE(VIDEO_TRACK)
75     , m_textDisplayContainer(0)
76 #endif
77 #if ENABLE(TIZEN_GSTREAMER_VIDEO)
78     , m_hideControlsTimer(this, &MediaControlRootElement::hideControlsTimerFired)
79 #else
80     , m_hideFullscreenControlsTimer(this, &MediaControlRootElement::hideFullscreenControlsTimerFired)
81 #endif
82     , m_isMouseOverControls(false)
83     , m_isFullscreen(false)
84 {
85 }
86
87 PassRefPtr<MediaControls> MediaControls::create(Document* document)
88 {
89     return MediaControlRootElement::create(document);
90 }
91
92 PassRefPtr<MediaControlRootElement> MediaControlRootElement::create(Document* document)
93 {
94     if (!document->page())
95         return 0;
96
97     RefPtr<MediaControlRootElement> controls = adoptRef(new MediaControlRootElement(document));
98
99     RefPtr<MediaControlPanelElement> panel = MediaControlPanelElement::create(document);
100
101     ExceptionCode ec;
102
103     RefPtr<MediaControlRewindButtonElement> rewindButton = MediaControlRewindButtonElement::create(document);
104     controls->m_rewindButton = rewindButton.get();
105     panel->appendChild(rewindButton.release(), ec, true);
106     if (ec)
107         return 0;
108
109     RefPtr<MediaControlPlayButtonElement> playButton = MediaControlPlayButtonElement::create(document);
110     controls->m_playButton = playButton.get();
111     panel->appendChild(playButton.release(), ec, true);
112     if (ec)
113         return 0;
114
115     RefPtr<MediaControlReturnToRealtimeButtonElement> returnToRealtimeButton = MediaControlReturnToRealtimeButtonElement::create(document);
116     controls->m_returnToRealTimeButton = returnToRealtimeButton.get();
117     panel->appendChild(returnToRealtimeButton.release(), ec, true);
118     if (ec)
119         return 0;
120
121     if (document->page()->theme()->usesMediaControlStatusDisplay()) {
122         RefPtr<MediaControlStatusDisplayElement> statusDisplay = MediaControlStatusDisplayElement::create(document);
123         controls->m_statusDisplay = statusDisplay.get();
124         panel->appendChild(statusDisplay.release(), ec, true);
125         if (ec)
126             return 0;
127     }
128
129     RefPtr<MediaControlTimelineContainerElement> timelineContainer = MediaControlTimelineContainerElement::create(document);
130
131     RefPtr<MediaControlCurrentTimeDisplayElement> currentTimeDisplay = MediaControlCurrentTimeDisplayElement::create(document);
132     controls->m_currentTimeDisplay = currentTimeDisplay.get();
133     timelineContainer->appendChild(currentTimeDisplay.release(), ec, true);
134     if (ec)
135         return 0;
136
137     RefPtr<MediaControlTimelineElement> timeline = MediaControlTimelineElement::create(document, controls.get());
138     controls->m_timeline = timeline.get();
139     timelineContainer->appendChild(timeline.release(), ec, true);
140     if (ec)
141         return 0;
142
143     RefPtr<MediaControlTimeRemainingDisplayElement> timeRemainingDisplay = MediaControlTimeRemainingDisplayElement::create(document);
144     controls->m_timeRemainingDisplay = timeRemainingDisplay.get();
145     timelineContainer->appendChild(timeRemainingDisplay.release(), ec, true);
146     if (ec)
147         return 0;
148
149     controls->m_timelineContainer = timelineContainer.get();
150     panel->appendChild(timelineContainer.release(), ec, true);
151     if (ec)
152         return 0;
153
154     // FIXME: Only create when needed <http://webkit.org/b/57163>
155     RefPtr<MediaControlSeekBackButtonElement> seekBackButton = MediaControlSeekBackButtonElement::create(document);
156     controls->m_seekBackButton = seekBackButton.get();
157     panel->appendChild(seekBackButton.release(), ec, true);
158     if (ec)
159         return 0;
160
161     // FIXME: Only create when needed <http://webkit.org/b/57163>
162     RefPtr<MediaControlSeekForwardButtonElement> seekForwardButton = MediaControlSeekForwardButtonElement::create(document);
163     controls->m_seekForwardButton = seekForwardButton.get();
164     panel->appendChild(seekForwardButton.release(), ec, true);
165     if (ec)
166         return 0;
167
168     if (document->page()->theme()->supportsClosedCaptioning()) {
169         RefPtr<MediaControlToggleClosedCaptionsButtonElement> toggleClosedCaptionsButton = MediaControlToggleClosedCaptionsButtonElement::create(document);
170         controls->m_toggleClosedCaptionsButton = toggleClosedCaptionsButton.get();
171         panel->appendChild(toggleClosedCaptionsButton.release(), ec, true);
172         if (ec)
173             return 0;
174     }
175
176     // FIXME: Only create when needed <http://webkit.org/b/57163>
177     RefPtr<MediaControlFullscreenButtonElement> fullScreenButton = MediaControlFullscreenButtonElement::create(document, controls.get());
178     controls->m_fullScreenButton = fullScreenButton.get();
179     panel->appendChild(fullScreenButton.release(), ec, true);
180
181     // The mute button and the slider element should be in the same div.
182     RefPtr<HTMLDivElement> panelVolumeControlContainer = HTMLDivElement::create(document);
183
184     if (document->page()->theme()->usesMediaControlVolumeSlider()) {
185         RefPtr<MediaControlVolumeSliderContainerElement> volumeSliderContainer = MediaControlVolumeSliderContainerElement::create(document);
186
187         RefPtr<MediaControlVolumeSliderElement> slider = MediaControlVolumeSliderElement::create(document);
188         controls->m_volumeSlider = slider.get();
189         volumeSliderContainer->appendChild(slider.release(), ec, true);
190         if (ec)
191             return 0;
192
193         // This is a duplicate mute button, which is visible in some ports at the bottom of the volume bar.
194         // It's important only when the volume bar is displayed below the controls.
195         RefPtr<MediaControlVolumeSliderMuteButtonElement> volumeSliderMuteButton = MediaControlVolumeSliderMuteButtonElement::create(document);
196         controls->m_volumeSliderMuteButton = volumeSliderMuteButton.get();
197         volumeSliderContainer->appendChild(volumeSliderMuteButton.release(), ec, true);
198
199         if (ec)
200             return 0;
201
202         controls->m_volumeSliderContainer = volumeSliderContainer.get();
203         panelVolumeControlContainer->appendChild(volumeSliderContainer.release(), ec, true);
204         if (ec)
205             return 0;
206     }
207
208     RefPtr<MediaControlPanelMuteButtonElement> panelMuteButton = MediaControlPanelMuteButtonElement::create(document, controls.get());
209     controls->m_panelMuteButton = panelMuteButton.get();
210     panelVolumeControlContainer->appendChild(panelMuteButton.release(), ec, true);
211     if (ec)
212         return 0;
213
214     panel->appendChild(panelVolumeControlContainer, ec, true);
215     if (ec)
216         return 0;
217
218     // FIXME: Only create when needed <http://webkit.org/b/57163>
219     RefPtr<MediaControlFullscreenVolumeMinButtonElement> fullScreenMinVolumeButton = MediaControlFullscreenVolumeMinButtonElement::create(document);
220     controls->m_fullScreenMinVolumeButton = fullScreenMinVolumeButton.get();
221     panel->appendChild(fullScreenMinVolumeButton.release(), ec, true);
222     if (ec)
223         return 0;
224
225     RefPtr<MediaControlFullscreenVolumeSliderElement> fullScreenVolumeSlider = MediaControlFullscreenVolumeSliderElement::create(document);
226     controls->m_fullScreenVolumeSlider = fullScreenVolumeSlider.get();
227     panel->appendChild(fullScreenVolumeSlider.release(), ec, true);
228     if (ec)
229         return 0;
230
231     RefPtr<MediaControlFullscreenVolumeMaxButtonElement> fullScreenMaxVolumeButton = MediaControlFullscreenVolumeMaxButtonElement::create(document);
232     controls->m_fullScreenMaxVolumeButton = fullScreenMaxVolumeButton.get();
233     panel->appendChild(fullScreenMaxVolumeButton.release(), ec, true);
234     if (ec)
235         return 0;
236
237     controls->m_panel = panel.get();
238     controls->appendChild(panel.release(), ec, true);
239     if (ec)
240         return 0;
241
242     return controls.release();
243 }
244
245 void MediaControlRootElement::setMediaController(MediaControllerInterface* controller)
246 {
247     if (m_mediaController == controller)
248         return;
249     m_mediaController = controller;
250
251     if (m_rewindButton)
252         m_rewindButton->setMediaController(controller);
253     if (m_playButton)
254         m_playButton->setMediaController(controller);
255     if (m_returnToRealTimeButton)
256         m_returnToRealTimeButton->setMediaController(controller);
257     if (m_statusDisplay)
258         m_statusDisplay->setMediaController(controller);
259     if (m_currentTimeDisplay)
260         m_currentTimeDisplay->setMediaController(controller);
261     if (m_timeline)
262         m_timeline->setMediaController(controller);
263     if (m_timeRemainingDisplay)
264         m_timeRemainingDisplay->setMediaController(controller);
265     if (m_timelineContainer)
266         m_timelineContainer->setMediaController(controller);
267     if (m_seekBackButton)
268         m_seekBackButton->setMediaController(controller);
269     if (m_seekForwardButton)
270         m_seekForwardButton->setMediaController(controller);
271     if (m_toggleClosedCaptionsButton)
272         m_toggleClosedCaptionsButton->setMediaController(controller);
273     if (m_panelMuteButton)
274         m_panelMuteButton->setMediaController(controller);
275     if (m_volumeSlider)
276         m_volumeSlider->setMediaController(controller);
277     if (m_volumeSliderMuteButton)
278         m_volumeSliderMuteButton->setMediaController(controller);
279     if (m_volumeSliderContainer)
280         m_volumeSliderContainer->setMediaController(controller);
281     if (m_fullScreenButton)
282         m_fullScreenButton->setMediaController(controller);
283     if (m_fullScreenMinVolumeButton)
284         m_fullScreenMinVolumeButton->setMediaController(controller);
285     if (m_fullScreenVolumeSlider)
286         m_fullScreenVolumeSlider->setMediaController(controller);
287     if (m_fullScreenMaxVolumeButton)
288         m_fullScreenMaxVolumeButton->setMediaController(controller);
289     if (m_panel)
290         m_panel->setMediaController(controller);
291 #if ENABLE(VIDEO_TRACK)
292     if (m_textDisplayContainer)
293         m_textDisplayContainer->setMediaController(controller);
294 #endif
295     reset();
296 }
297
298 void MediaControlRootElement::show()
299 {
300     m_panel->setIsDisplayed(true);
301     m_panel->show();
302 }
303
304 void MediaControlRootElement::hide()
305 {
306     m_panel->setIsDisplayed(false);
307     m_panel->hide();
308     m_volumeSliderContainer->hide();
309 }
310
311 void MediaControlRootElement::makeOpaque()
312 {
313     m_panel->makeOpaque();
314 }
315
316 void MediaControlRootElement::makeTransparent()
317 {
318     m_panel->makeTransparent();
319     m_volumeSliderContainer->hide();
320 }
321
322 void MediaControlRootElement::reset()
323 {
324     Page* page = document()->page();
325     if (!page)
326         return;
327
328     updateStatusDisplay();
329
330     if (m_mediaController->supportsFullscreen())
331         m_fullScreenButton->show();
332     else
333         m_fullScreenButton->hide();
334
335     float duration = m_mediaController->duration();
336     if (isfinite(duration) || page->theme()->hasOwnDisabledStateHandlingFor(MediaSliderPart)) {
337         m_timeline->setDuration(duration);
338         m_timelineContainer->show();
339         m_timeline->setPosition(m_mediaController->currentTime());
340         updateTimeDisplay();
341     } else
342         m_timelineContainer->hide();
343
344     if (m_mediaController->hasAudio() || page->theme()->hasOwnDisabledStateHandlingFor(MediaMuteButtonPart))
345         m_panelMuteButton->show();
346     else
347         m_panelMuteButton->hide();
348
349     if (m_volumeSlider)
350         m_volumeSlider->setVolume(m_mediaController->volume());
351
352     if (m_toggleClosedCaptionsButton) {
353         if (m_mediaController->hasClosedCaptions())
354             m_toggleClosedCaptionsButton->show();
355         else
356             m_toggleClosedCaptionsButton->hide();
357     }
358
359     m_playButton->updateDisplayType();
360
361 #if ENABLE(FULLSCREEN_API)
362     if (m_fullScreenVolumeSlider)
363         m_fullScreenVolumeSlider->setVolume(m_mediaController->volume());
364
365     if (m_isFullscreen) {
366         if (m_mediaController->isLiveStream()) {
367             m_seekBackButton->hide();
368             m_seekForwardButton->hide();
369             m_rewindButton->show();
370             m_returnToRealTimeButton->show();
371         } else {
372             m_seekBackButton->show();
373             m_seekForwardButton->show();
374             m_rewindButton->hide();
375             m_returnToRealTimeButton->hide();
376         }
377     } else
378 #endif
379     if (!m_mediaController->isLiveStream()) {
380         m_returnToRealTimeButton->hide();
381         m_rewindButton->show();
382     } else {
383         m_returnToRealTimeButton->show();
384         m_rewindButton->hide();
385     }
386
387     makeOpaque();
388 }
389
390 void MediaControlRootElement::playbackStarted()
391 {
392     m_playButton->updateDisplayType();
393     m_timeline->setPosition(m_mediaController->currentTime());
394     updateTimeDisplay();
395
396 #if ENABLE(TIZEN_GSTREAMER_VIDEO)
397     m_hideControlsTimer.startOneShot(timeWithoutMouseMovementBeforeHidingControls);
398 #else
399     if (m_isFullscreen)
400         startHideFullscreenControlsTimer();
401 #endif
402 }
403
404 void MediaControlRootElement::playbackProgressed()
405 {
406     m_timeline->setPosition(m_mediaController->currentTime());
407     updateTimeDisplay();
408
409 #if !ENABLE(TIZEN_GSTREAMER_VIDEO)
410     if (!m_isMouseOverControls && m_mediaController->hasVideo())
411         makeTransparent();
412 #endif
413 }
414
415 void MediaControlRootElement::playbackStopped()
416 {
417     m_playButton->updateDisplayType();
418     m_timeline->setPosition(m_mediaController->currentTime());
419     updateTimeDisplay();
420     makeOpaque();
421
422 #if ENABLE(TIZEN_GSTREAMER_VIDEO)
423     m_hideControlsTimer.stop();
424 #else
425     stopHideFullscreenControlsTimer();
426 #endif
427 }
428
429 void MediaControlRootElement::updateTimeDisplay()
430 {
431     float now = m_mediaController->currentTime();
432     float duration = m_mediaController->duration();
433
434     Page* page = document()->page();
435     if (!page)
436         return;
437
438     // Allow the theme to format the time.
439     ExceptionCode ec;
440     m_currentTimeDisplay->setInnerText(page->theme()->formatMediaControlsCurrentTime(now, duration), ec);
441     m_currentTimeDisplay->setCurrentValue(now);
442
443 #if ENABLE(TIZEN_GSTREAMER_VIDEO)
444     m_timeRemainingDisplay->setInnerText(page->theme()->formatMediaControlsTime(duration), ec);
445     m_timeRemainingDisplay->setCurrentValue(duration);
446 #else
447     m_timeRemainingDisplay->setInnerText(page->theme()->formatMediaControlsRemainingTime(now, duration), ec);
448     m_timeRemainingDisplay->setCurrentValue(now - duration);
449 #endif
450 }
451
452 void MediaControlRootElement::reportedError()
453 {
454     Page* page = document()->page();
455     if (!page)
456         return;
457
458     if (!page->theme()->hasOwnDisabledStateHandlingFor(MediaSliderPart))
459         m_timelineContainer->hide();
460
461     if (!page->theme()->hasOwnDisabledStateHandlingFor(MediaMuteButtonPart))
462         m_panelMuteButton->hide();
463
464      m_fullScreenButton->hide();
465
466     if (m_volumeSliderContainer)
467         m_volumeSliderContainer->hide();
468     if (m_toggleClosedCaptionsButton && !page->theme()->hasOwnDisabledStateHandlingFor(MediaToggleClosedCaptionsButtonPart))
469         m_toggleClosedCaptionsButton->hide();
470 }
471
472 void MediaControlRootElement::updateStatusDisplay()
473 {
474     if (m_statusDisplay)
475         m_statusDisplay->update();
476 }
477
478 void MediaControlRootElement::loadedMetadata()
479 {
480     if (m_statusDisplay && m_mediaController->isLiveStream())
481         m_statusDisplay->hide();
482
483     reset();
484 }
485
486 void MediaControlRootElement::changedClosedCaptionsVisibility()
487 {
488     if (m_toggleClosedCaptionsButton)
489         m_toggleClosedCaptionsButton->updateDisplayType();
490 }
491
492 void MediaControlRootElement::changedMute()
493 {
494     m_panelMuteButton->changedMute();
495     if (m_volumeSliderMuteButton)
496         m_volumeSliderMuteButton->changedMute();
497 }
498
499 void MediaControlRootElement::changedVolume()
500 {
501     if (m_volumeSlider)
502         m_volumeSlider->setVolume(m_mediaController->volume());
503 }
504
505 void MediaControlRootElement::enteredFullscreen()
506 {
507     m_isFullscreen = true;
508
509     if (m_mediaController->isLiveStream()) {
510         m_seekBackButton->hide();
511         m_seekForwardButton->hide();
512         m_rewindButton->show();
513         m_returnToRealTimeButton->show();
514     } else {
515         m_seekBackButton->show();
516         m_seekForwardButton->show();
517         m_rewindButton->hide();
518         m_returnToRealTimeButton->hide();
519     }
520
521     m_panel->setCanBeDragged(true);
522     m_fullScreenButton->setIsFullscreen(true);
523
524     if (Page* page = document()->page()) {
525         page->chrome()->setCursorHiddenUntilMouseMoves(true);
526
527 #if ENABLE(TIZEN_GSTREAMER_VIDEO) && ENABLE(TIZEN_WEBKIT2_HISTORICAL_RESTORE_VISIBLE_CONTENT_RECT)
528         float scaleFactor = page->chrome()->contentsScaleFactor();
529         if (scaleFactor > 0)
530             m_panel->setInlineStyleProperty(CSSPropertyZoom, 1 / scaleFactor, CSSPrimitiveValue::CSS_NUMBER);
531 #endif
532     }
533
534 #if !ENABLE(TIZEN_GSTREAMER_VIDEO)
535     startHideFullscreenControlsTimer();
536 #endif
537 }
538
539 void MediaControlRootElement::exitedFullscreen()
540 {
541     m_isFullscreen = false;
542
543     // "show" actually means removal of display:none style, so we are just clearing styles
544     // when exiting fullscreen.
545     // FIXME: Clarify naming of show/hide <http://webkit.org/b/58157>
546     m_rewindButton->show();
547     m_seekBackButton->show();
548     m_seekForwardButton->show();
549     m_returnToRealTimeButton->show();
550
551     m_panel->setCanBeDragged(false);
552     m_fullScreenButton->setIsFullscreen(false);
553
554     // We will keep using the panel, but we want it to go back to the standard position.
555     // This will matter right away because we use the panel even when not fullscreen.
556     // And if we reenter fullscreen we also want the panel in the standard position.
557     m_panel->resetPosition();
558
559 #if ENABLE(TIZEN_GSTREAMER_VIDEO) && ENABLE(TIZEN_WEBKIT2_HISTORICAL_RESTORE_VISIBLE_CONTENT_RECT)
560     m_panel->removeInlineStyleProperty(CSSPropertyZoom);
561 #endif
562
563 #if !ENABLE(TIZEN_GSTREAMER_VIDEO)
564     stopHideFullscreenControlsTimer();
565 #endif
566 }
567
568 void MediaControlRootElement::showVolumeSlider()
569 {
570     if (!m_mediaController->hasAudio())
571         return;
572
573     if (m_volumeSliderContainer)
574         m_volumeSliderContainer->show();
575 }
576
577 bool MediaControlRootElement::shouldHideControls()
578 {
579     return !m_panel->hovered();
580 }
581
582 bool MediaControlRootElement::containsRelatedTarget(Event* event)
583 {
584     if (!event->isMouseEvent())
585         return false;
586     EventTarget* relatedTarget = static_cast<MouseEvent*>(event)->relatedTarget();
587     if (!relatedTarget)
588         return false;
589     return contains(relatedTarget->toNode());
590 }
591
592 void MediaControlRootElement::defaultEventHandler(Event* event)
593 {
594     MediaControls::defaultEventHandler(event);
595
596 #if ENABLE(TIZEN_GSTREAMER_VIDEO)
597     if (event->type() == eventNames().clickEvent && m_mediaController->hasVideo()) {
598         if (!containsRelatedTarget(event)) {
599             if (m_panel->isOpaque())
600                 makeTransparent();
601             else {
602                 makeOpaque();
603                 m_hideControlsTimer.startOneShot(timeWithoutMouseMovementBeforeHidingControls);
604             }
605         }
606     }
607 #else
608     if (event->type() == eventNames().mouseoverEvent) {
609         if (!containsRelatedTarget(event)) {
610             m_isMouseOverControls = true;
611             if (!m_mediaController->canPlay()) {
612                 makeOpaque();
613                 if (shouldHideControls())
614                     startHideFullscreenControlsTimer();
615             }
616         }
617     } else if (event->type() == eventNames().mouseoutEvent) {
618         if (!containsRelatedTarget(event)) {
619             m_isMouseOverControls = false;
620             stopHideFullscreenControlsTimer();
621         }
622     } else if (event->type() == eventNames().mousemoveEvent) {
623         if (m_isFullscreen) {
624             // When we get a mouse move in fullscreen mode, show the media controls, and start a timer
625             // that will hide the media controls after a 3 seconds without a mouse move.
626             makeOpaque();
627             if (shouldHideControls())
628                 startHideFullscreenControlsTimer();
629         }
630     }
631 #endif
632 }
633
634 #if ENABLE(TIZEN_GSTREAMER_VIDEO)
635 void MediaControlRootElement::hideControlsTimerFired(Timer<MediaControlRootElement>*)
636 {
637     if (m_mediaController->paused())
638         return;
639
640     if (!m_mediaController->hasVideo())
641         return;
642
643     if (Page* page = document()->page())
644         page->chrome()->setCursorHiddenUntilMouseMoves(true);
645
646     makeTransparent();
647 }
648 #else
649 void MediaControlRootElement::startHideFullscreenControlsTimer()
650 {
651     if (!m_isFullscreen)
652         return;
653
654     m_hideFullscreenControlsTimer.startOneShot(timeWithoutMouseMovementBeforeHidingControls);
655 }
656
657 void MediaControlRootElement::hideFullscreenControlsTimerFired(Timer<MediaControlRootElement>*)
658 {
659     if (m_mediaController->paused())
660         return;
661
662     if (!m_isFullscreen)
663         return;
664
665     if (!shouldHideControls())
666         return;
667
668     if (Page* page = document()->page())
669         page->chrome()->setCursorHiddenUntilMouseMoves(true);
670
671     makeTransparent();
672 }
673
674 void MediaControlRootElement::stopHideFullscreenControlsTimer()
675 {
676     m_hideFullscreenControlsTimer.stop();
677 }
678 #endif
679
680 #if ENABLE(VIDEO_TRACK)
681 void MediaControlRootElement::createTextTrackDisplay()
682 {
683     if (m_textDisplayContainer)
684         return;
685
686     RefPtr<MediaControlTextTrackContainerElement> textDisplayContainer = MediaControlTextTrackContainerElement::create(document());
687     m_textDisplayContainer = textDisplayContainer.get();
688
689     // Insert it before the first controller element so it always displays behind the controls.
690     ExceptionCode ec;
691     insertBefore(textDisplayContainer.release(), m_panel, ec, true);
692 }
693
694 void MediaControlRootElement::showTextTrackDisplay()
695 {
696     if (!m_textDisplayContainer)
697         createTextTrackDisplay();
698     m_textDisplayContainer->show();
699 }
700
701 void MediaControlRootElement::hideTextTrackDisplay()
702 {
703     if (!m_textDisplayContainer)
704         createTextTrackDisplay();
705     m_textDisplayContainer->hide();
706 }
707
708 void MediaControlRootElement::updateTextTrackDisplay()
709 {
710     if (!m_textDisplayContainer)
711         createTextTrackDisplay();
712
713     m_textDisplayContainer->updateDisplay();
714
715 }
716 #endif
717
718 const AtomicString& MediaControlRootElement::shadowPseudoId() const
719 {
720     DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls"));
721     return id;
722 }
723
724 void MediaControlRootElement::bufferingProgressed()
725 {
726     // We only need to update buffering progress when paused, during normal
727     // playback playbackProgressed() will take care of it.
728     if (m_mediaController->paused())
729         m_timeline->setPosition(m_mediaController->currentTime());
730 }
731
732 }
733
734 #endif