OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2011, 2012 Apple Inc. All rights reserved. | 2 * Copyright (C) 2011, 2012 Apple Inc. All rights reserved. |
3 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. | 3 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
52 , m_textDisplayContainer(nullptr) | 52 , m_textDisplayContainer(nullptr) |
53 , m_overlayPlayButton(nullptr) | 53 , m_overlayPlayButton(nullptr) |
54 , m_overlayEnclosure(nullptr) | 54 , m_overlayEnclosure(nullptr) |
55 , m_playButton(nullptr) | 55 , m_playButton(nullptr) |
56 , m_currentTimeDisplay(nullptr) | 56 , m_currentTimeDisplay(nullptr) |
57 , m_timeline(nullptr) | 57 , m_timeline(nullptr) |
58 , m_muteButton(nullptr) | 58 , m_muteButton(nullptr) |
59 , m_volumeSlider(nullptr) | 59 , m_volumeSlider(nullptr) |
60 , m_toggleClosedCaptionsButton(nullptr) | 60 , m_toggleClosedCaptionsButton(nullptr) |
61 , m_fullScreenButton(nullptr) | 61 , m_fullScreenButton(nullptr) |
62 , m_castButton(nullptr) | |
63 , m_overlayCastButton(nullptr) | |
62 , m_durationDisplay(nullptr) | 64 , m_durationDisplay(nullptr) |
63 , m_enclosure(nullptr) | 65 , m_enclosure(nullptr) |
64 , m_hideMediaControlsTimer(this, &MediaControls::hideMediaControlsTimerFired ) | 66 , m_hideMediaControlsTimer(this, &MediaControls::hideMediaControlsTimerFired ) |
65 , m_isMouseOverControls(false) | 67 , m_isMouseOverControls(false) |
66 , m_isPausedForScrubbing(false) | 68 , m_isPausedForScrubbing(false) |
67 , m_wasLastEventTouch(false) | 69 , m_wasLastEventTouch(false) |
68 { | 70 { |
69 } | 71 } |
70 | 72 |
71 PassRefPtrWillBeRawPtr<MediaControls> MediaControls::create(HTMLMediaElement& me diaElement) | 73 PassRefPtrWillBeRawPtr<MediaControls> MediaControls::create(HTMLMediaElement& me diaElement) |
72 { | 74 { |
73 RefPtrWillBeRawPtr<MediaControls> controls = adoptRefWillBeNoop(new MediaCon trols(mediaElement)); | 75 RefPtrWillBeRawPtr<MediaControls> controls = adoptRefWillBeNoop(new MediaCon trols(mediaElement)); |
74 | 76 |
75 if (controls->initializeControls()) | 77 if (controls->initializeControls()) |
76 return controls.release(); | 78 return controls.release(); |
77 | 79 |
78 return nullptr; | 80 return nullptr; |
79 } | 81 } |
80 | 82 |
81 bool MediaControls::initializeControls() | 83 bool MediaControls::initializeControls() |
82 { | 84 { |
83 TrackExceptionState exceptionState; | 85 TrackExceptionState exceptionState; |
84 | 86 |
87 RefPtrWillBeRawPtr<MediaControlOverlayEnclosureElement> overlayEnclosure = M ediaControlOverlayEnclosureElement::create(*this); | |
88 | |
85 if (document().settings() && document().settings()->mediaControlsOverlayPlay ButtonEnabled()) { | 89 if (document().settings() && document().settings()->mediaControlsOverlayPlay ButtonEnabled()) { |
86 RefPtrWillBeRawPtr<MediaControlOverlayEnclosureElement> overlayEnclosure = MediaControlOverlayEnclosureElement::create(*this); | |
87 RefPtrWillBeRawPtr<MediaControlOverlayPlayButtonElement> overlayPlayButt on = MediaControlOverlayPlayButtonElement::create(*this); | 90 RefPtrWillBeRawPtr<MediaControlOverlayPlayButtonElement> overlayPlayButt on = MediaControlOverlayPlayButtonElement::create(*this); |
88 m_overlayPlayButton = overlayPlayButton.get(); | 91 m_overlayPlayButton = overlayPlayButton.get(); |
89 overlayEnclosure->appendChild(overlayPlayButton.release(), exceptionStat e); | 92 overlayEnclosure->appendChild(overlayPlayButton.release(), exceptionStat e); |
90 if (exceptionState.hadException()) | 93 if (exceptionState.hadException()) |
91 return false; | 94 return false; |
95 } | |
92 | 96 |
93 m_overlayEnclosure = overlayEnclosure.get(); | 97 RefPtrWillBeRawPtr<MediaControlCastButtonElement> overlayCastButton = MediaC ontrolCastButtonElement::create(*this, true); |
94 appendChild(overlayEnclosure.release(), exceptionState); | 98 m_overlayCastButton = overlayCastButton.get(); |
95 if (exceptionState.hadException()) | 99 overlayEnclosure->appendChild(overlayCastButton.release(), exceptionState); |
96 return false; | 100 if (exceptionState.hadException()) |
97 } | 101 return false; |
102 | |
103 m_overlayEnclosure = overlayEnclosure.get(); | |
104 appendChild(overlayEnclosure.release(), exceptionState); | |
105 if (exceptionState.hadException()) | |
106 return false; | |
98 | 107 |
99 // Create an enclosing element for the panel so we can visually offset the c ontrols correctly. | 108 // Create an enclosing element for the panel so we can visually offset the c ontrols correctly. |
100 RefPtrWillBeRawPtr<MediaControlPanelEnclosureElement> enclosure = MediaContr olPanelEnclosureElement::create(*this); | 109 RefPtrWillBeRawPtr<MediaControlPanelEnclosureElement> enclosure = MediaContr olPanelEnclosureElement::create(*this); |
101 | 110 |
102 RefPtrWillBeRawPtr<MediaControlPanelElement> panel = MediaControlPanelElemen t::create(*this); | 111 RefPtrWillBeRawPtr<MediaControlPanelElement> panel = MediaControlPanelElemen t::create(*this); |
103 | 112 |
104 RefPtrWillBeRawPtr<MediaControlPlayButtonElement> playButton = MediaControlP layButtonElement::create(*this); | 113 RefPtrWillBeRawPtr<MediaControlPlayButtonElement> playButton = MediaControlP layButtonElement::create(*this); |
105 m_playButton = playButton.get(); | 114 m_playButton = playButton.get(); |
106 panel->appendChild(playButton.release(), exceptionState); | 115 panel->appendChild(playButton.release(), exceptionState); |
107 if (exceptionState.hadException()) | 116 if (exceptionState.hadException()) |
(...skipping 29 matching lines...) Expand all Loading... | |
137 panel->appendChild(slider.release(), exceptionState); | 146 panel->appendChild(slider.release(), exceptionState); |
138 if (exceptionState.hadException()) | 147 if (exceptionState.hadException()) |
139 return false; | 148 return false; |
140 | 149 |
141 RefPtrWillBeRawPtr<MediaControlToggleClosedCaptionsButtonElement> toggleClos edCaptionsButton = MediaControlToggleClosedCaptionsButtonElement::create(*this); | 150 RefPtrWillBeRawPtr<MediaControlToggleClosedCaptionsButtonElement> toggleClos edCaptionsButton = MediaControlToggleClosedCaptionsButtonElement::create(*this); |
142 m_toggleClosedCaptionsButton = toggleClosedCaptionsButton.get(); | 151 m_toggleClosedCaptionsButton = toggleClosedCaptionsButton.get(); |
143 panel->appendChild(toggleClosedCaptionsButton.release(), exceptionState); | 152 panel->appendChild(toggleClosedCaptionsButton.release(), exceptionState); |
144 if (exceptionState.hadException()) | 153 if (exceptionState.hadException()) |
145 return false; | 154 return false; |
146 | 155 |
156 RefPtrWillBeRawPtr<MediaControlCastButtonElement> castButton = MediaControlC astButtonElement::create(*this, false); | |
157 m_castButton = castButton.get(); | |
158 panel->appendChild(castButton.release(), exceptionState); | |
159 if (exceptionState.hadException()) | |
160 return false; | |
161 | |
147 RefPtrWillBeRawPtr<MediaControlFullscreenButtonElement> fullscreenButton = M ediaControlFullscreenButtonElement::create(*this); | 162 RefPtrWillBeRawPtr<MediaControlFullscreenButtonElement> fullscreenButton = M ediaControlFullscreenButtonElement::create(*this); |
148 m_fullScreenButton = fullscreenButton.get(); | 163 m_fullScreenButton = fullscreenButton.get(); |
149 panel->appendChild(fullscreenButton.release(), exceptionState); | 164 panel->appendChild(fullscreenButton.release(), exceptionState); |
150 if (exceptionState.hadException()) | 165 if (exceptionState.hadException()) |
151 return false; | 166 return false; |
152 | 167 |
153 m_panel = panel.get(); | 168 m_panel = panel.get(); |
154 enclosure->appendChild(panel.release(), exceptionState); | 169 enclosure->appendChild(panel.release(), exceptionState); |
155 if (exceptionState.hadException()) | 170 if (exceptionState.hadException()) |
156 return false; | 171 return false; |
(...skipping 25 matching lines...) Expand all Loading... | |
182 m_volumeSlider->show(); | 197 m_volumeSlider->show(); |
183 updateVolume(); | 198 updateVolume(); |
184 | 199 |
185 refreshClosedCaptionsButtonVisibility(); | 200 refreshClosedCaptionsButtonVisibility(); |
186 | 201 |
187 if (mediaElement().hasVideo() && fullscreenIsSupported(document())) | 202 if (mediaElement().hasVideo() && fullscreenIsSupported(document())) |
188 m_fullScreenButton->show(); | 203 m_fullScreenButton->show(); |
189 else | 204 else |
190 m_fullScreenButton->hide(); | 205 m_fullScreenButton->hide(); |
191 | 206 |
207 refreshCastButtonVisibility(); | |
192 makeOpaque(); | 208 makeOpaque(); |
193 } | 209 } |
194 | 210 |
195 void MediaControls::show() | 211 void MediaControls::show() |
196 { | 212 { |
197 makeOpaque(); | 213 makeOpaque(); |
198 m_panel->setIsDisplayed(true); | 214 m_panel->setIsDisplayed(true); |
199 m_panel->show(); | 215 m_panel->show(); |
200 if (m_overlayPlayButton) | 216 if (m_overlayPlayButton) |
201 m_overlayPlayButton->updateDisplayType(); | 217 m_overlayPlayButton->updateDisplayType(); |
202 } | 218 } |
203 | 219 |
204 void MediaControls::mediaElementFocused() | 220 void MediaControls::mediaElementFocused() |
205 { | 221 { |
206 show(); | 222 show(); |
207 stopHideMediaControlsTimer(); | 223 resetHideMediaControlsTimer(); |
208 } | 224 } |
209 | 225 |
210 void MediaControls::hide() | 226 void MediaControls::hide() |
211 { | 227 { |
212 m_panel->setIsDisplayed(false); | 228 m_panel->setIsDisplayed(false); |
213 m_panel->hide(); | 229 m_panel->hide(); |
214 if (m_overlayPlayButton) | 230 if (m_overlayPlayButton) |
215 m_overlayPlayButton->hide(); | 231 m_overlayPlayButton->hide(); |
216 } | 232 } |
217 | 233 |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
344 m_toggleClosedCaptionsButton->show(); | 360 m_toggleClosedCaptionsButton->show(); |
345 else | 361 else |
346 m_toggleClosedCaptionsButton->hide(); | 362 m_toggleClosedCaptionsButton->hide(); |
347 } | 363 } |
348 | 364 |
349 void MediaControls::textTracksChanged() | 365 void MediaControls::textTracksChanged() |
350 { | 366 { |
351 refreshClosedCaptionsButtonVisibility(); | 367 refreshClosedCaptionsButtonVisibility(); |
352 } | 368 } |
353 | 369 |
370 void MediaControls::refreshCastButtonVisibility() | |
371 { | |
372 if (mediaElement().hasRemoteRoutes()) { | |
373 // The reason for the autoplay test is that some pages (e.g. vimeo.com) have an autoplay background video, which | |
374 // doesn't autoplay on Chrome for Android (we prevent it) so starts paus ed. In such cases we don't want to automatically | |
375 // show the cast button, since it looks strange and is unlikely to corre spond with anything the user wants to do. | |
376 // If a user does want to cast a paused autoplay video then they can sti ll do so by touching or clicking on the | |
377 // video, which will cause the cast button to appear. | |
378 if (!mediaElement().shouldShowControls() && !mediaElement().autoplay() & & mediaElement().paused()) { | |
379 showOverlayCastButton(); | |
380 } else if (mediaElement().shouldShowControls()) { | |
381 m_overlayCastButton->hide(); | |
382 m_castButton->show(); | |
383 } | |
384 } else { | |
385 m_castButton->hide(); | |
386 m_overlayCastButton->hide(); | |
387 } | |
388 } | |
389 | |
390 void MediaControls::showOverlayCastButton() | |
391 { | |
392 m_overlayCastButton->show(); | |
393 resetHideMediaControlsTimer(); | |
394 } | |
395 | |
354 void MediaControls::enteredFullscreen() | 396 void MediaControls::enteredFullscreen() |
355 { | 397 { |
356 m_fullScreenButton->setIsFullscreen(true); | 398 m_fullScreenButton->setIsFullscreen(true); |
357 stopHideMediaControlsTimer(); | 399 stopHideMediaControlsTimer(); |
358 startHideMediaControlsTimer(); | 400 startHideMediaControlsTimer(); |
359 } | 401 } |
360 | 402 |
361 void MediaControls::exitedFullscreen() | 403 void MediaControls::exitedFullscreen() |
362 { | 404 { |
363 m_fullScreenButton->setIsFullscreen(false); | 405 m_fullScreenButton->setIsFullscreen(false); |
364 stopHideMediaControlsTimer(); | 406 stopHideMediaControlsTimer(); |
365 startHideMediaControlsTimer(); | 407 startHideMediaControlsTimer(); |
366 } | 408 } |
367 | 409 |
410 void MediaControls::startedCasting() | |
411 { | |
412 m_castButton->setIsPlayingRemotely(true); | |
413 m_overlayCastButton->setIsPlayingRemotely(true); | |
414 } | |
415 | |
416 void MediaControls::stoppedCasting() | |
417 { | |
418 m_castButton->setIsPlayingRemotely(false); | |
419 m_overlayCastButton->setIsPlayingRemotely(false); | |
420 } | |
421 | |
368 void MediaControls::defaultEventHandler(Event* event) | 422 void MediaControls::defaultEventHandler(Event* event) |
369 { | 423 { |
370 HTMLDivElement::defaultEventHandler(event); | 424 HTMLDivElement::defaultEventHandler(event); |
371 m_wasLastEventTouch = event->isTouchEvent() || event->isGestureEvent() | 425 m_wasLastEventTouch = event->isTouchEvent() || event->isGestureEvent() |
372 || (event->isMouseEvent() && toMouseEvent(event)->fromTouch()); | 426 || (event->isMouseEvent() && toMouseEvent(event)->fromTouch()); |
373 | 427 |
374 if (event->type() == EventTypeNames::mouseover) { | 428 if (event->type() == EventTypeNames::mouseover) { |
375 if (!containsRelatedTarget(event)) { | 429 if (!containsRelatedTarget(event)) { |
376 m_isMouseOverControls = true; | 430 m_isMouseOverControls = true; |
377 if (!mediaElement().togglePlayStateWillPlay()) { | 431 if (!mediaElement().togglePlayStateWillPlay()) { |
(...skipping 29 matching lines...) Expand all Loading... | |
407 return; | 461 return; |
408 | 462 |
409 unsigned behaviorFlags = IgnoreFocus | IgnoreVideoHover; | 463 unsigned behaviorFlags = IgnoreFocus | IgnoreVideoHover; |
410 if (m_wasLastEventTouch) { | 464 if (m_wasLastEventTouch) { |
411 behaviorFlags |= IgnoreControlsHover; | 465 behaviorFlags |= IgnoreControlsHover; |
412 } | 466 } |
413 if (!shouldHideMediaControls(behaviorFlags)) | 467 if (!shouldHideMediaControls(behaviorFlags)) |
414 return; | 468 return; |
415 | 469 |
416 makeTransparent(); | 470 makeTransparent(); |
471 m_overlayCastButton->hide(); | |
417 } | 472 } |
418 | 473 |
419 void MediaControls::startHideMediaControlsTimer() | 474 void MediaControls::startHideMediaControlsTimer() |
420 { | 475 { |
421 m_hideMediaControlsTimer.startOneShot(timeWithoutMouseMovementBeforeHidingMe diaControls, FROM_HERE); | 476 m_hideMediaControlsTimer.startOneShot(timeWithoutMouseMovementBeforeHidingMe diaControls, FROM_HERE); |
422 } | 477 } |
423 | 478 |
424 void MediaControls::stopHideMediaControlsTimer() | 479 void MediaControls::stopHideMediaControlsTimer() |
425 { | 480 { |
426 m_hideMediaControlsTimer.stop(); | 481 m_hideMediaControlsTimer.stop(); |
427 } | 482 } |
428 | 483 |
484 void MediaControls::resetHideMediaControlsTimer() | |
485 { | |
486 stopHideMediaControlsTimer(); | |
487 if (!mediaElement().paused()) | |
488 startHideMediaControlsTimer(); | |
489 } | |
490 | |
491 | |
429 const AtomicString& MediaControls::shadowPseudoId() const | 492 const AtomicString& MediaControls::shadowPseudoId() const |
430 { | 493 { |
431 DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls")); | 494 DEFINE_STATIC_LOCAL(AtomicString, id, ("-webkit-media-controls")); |
432 return id; | 495 return id; |
433 } | 496 } |
434 | 497 |
435 bool MediaControls::containsRelatedTarget(Event* event) | 498 bool MediaControls::containsRelatedTarget(Event* event) |
436 { | 499 { |
437 if (!event->isMouseEvent()) | 500 if (!event->isMouseEvent()) |
438 return false; | 501 return false; |
439 EventTarget* relatedTarget = toMouseEvent(event)->relatedTarget(); | 502 EventTarget* relatedTarget = toMouseEvent(event)->relatedTarget(); |
440 if (!relatedTarget) | 503 if (!relatedTarget) |
441 return false; | 504 return false; |
442 return contains(relatedTarget->toNode()); | 505 return contains(relatedTarget->toNode()); |
443 } | 506 } |
444 | 507 |
445 void MediaControls::createTextTrackDisplay() | 508 void MediaControls::createTextTrackDisplay() |
446 { | 509 { |
447 if (m_textDisplayContainer) | 510 if (m_textDisplayContainer) |
448 return; | 511 return; |
449 | 512 |
450 RefPtrWillBeRawPtr<MediaControlTextTrackContainerElement> textDisplayContain er = MediaControlTextTrackContainerElement::create(*this); | 513 RefPtrWillBeRawPtr<MediaControlTextTrackContainerElement> textDisplayContain er = MediaControlTextTrackContainerElement::create(*this); |
451 m_textDisplayContainer = textDisplayContainer.get(); | 514 m_textDisplayContainer = textDisplayContainer.get(); |
452 | 515 |
453 // Insert it before (behind) all other control elements. | 516 // Insert it before (behind) all other control elements. |
454 if (m_overlayEnclosure && m_overlayPlayButton) | 517 m_overlayEnclosure -> insertBefore(textDisplayContainer.release(), m_overlay CastButton); |
Peter Beverloo
2014/09/15 12:59:38
Are you sure that this is right? Previously it wou
aberent
2014/09/16 09:44:18
No, I am not. Will fix.
| |
455 m_overlayEnclosure->insertBefore(textDisplayContainer.release(), m_overl ayPlayButton); | |
456 else | |
457 insertBefore(textDisplayContainer.release(), m_enclosure); | |
458 } | 518 } |
459 | 519 |
460 void MediaControls::showTextTrackDisplay() | 520 void MediaControls::showTextTrackDisplay() |
461 { | 521 { |
462 if (!m_textDisplayContainer) | 522 if (!m_textDisplayContainer) |
463 createTextTrackDisplay(); | 523 createTextTrackDisplay(); |
464 m_textDisplayContainer->show(); | 524 m_textDisplayContainer->show(); |
465 } | 525 } |
466 | 526 |
467 void MediaControls::hideTextTrackDisplay() | 527 void MediaControls::hideTextTrackDisplay() |
(...skipping 19 matching lines...) Expand all Loading... | |
487 visitor->trace(m_overlayPlayButton); | 547 visitor->trace(m_overlayPlayButton); |
488 visitor->trace(m_overlayEnclosure); | 548 visitor->trace(m_overlayEnclosure); |
489 visitor->trace(m_playButton); | 549 visitor->trace(m_playButton); |
490 visitor->trace(m_currentTimeDisplay); | 550 visitor->trace(m_currentTimeDisplay); |
491 visitor->trace(m_timeline); | 551 visitor->trace(m_timeline); |
492 visitor->trace(m_muteButton); | 552 visitor->trace(m_muteButton); |
493 visitor->trace(m_volumeSlider); | 553 visitor->trace(m_volumeSlider); |
494 visitor->trace(m_toggleClosedCaptionsButton); | 554 visitor->trace(m_toggleClosedCaptionsButton); |
495 visitor->trace(m_fullScreenButton); | 555 visitor->trace(m_fullScreenButton); |
496 visitor->trace(m_durationDisplay); | 556 visitor->trace(m_durationDisplay); |
497 visitor->trace(m_enclosure); | 557 visitor->trace(m_enclosure); |
Peter Beverloo
2014/09/15 12:59:38
+visitor->trace(m_castButton);
+visitor->trace(m_o
aberent
2014/09/16 09:44:18
Done.
| |
498 HTMLDivElement::trace(visitor); | 558 HTMLDivElement::trace(visitor); |
499 } | 559 } |
500 | 560 |
501 } | 561 } |
OLD | NEW |