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