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 if (m_overlayPlayButton) |
455 m_overlayEnclosure->insertBefore(textDisplayContainer.release(), m_overl
ayPlayButton); | 518 m_overlayEnclosure->insertBefore(textDisplayContainer.release(), m_overl
ayPlayButton); |
456 else | 519 else |
457 insertBefore(textDisplayContainer.release(), m_enclosure); | 520 m_overlayEnclosure->insertBefore(textDisplayContainer.release(), m_overl
ayCastButton); |
458 } | 521 } |
459 | 522 |
460 void MediaControls::showTextTrackDisplay() | 523 void MediaControls::showTextTrackDisplay() |
461 { | 524 { |
462 if (!m_textDisplayContainer) | 525 if (!m_textDisplayContainer) |
463 createTextTrackDisplay(); | 526 createTextTrackDisplay(); |
464 m_textDisplayContainer->show(); | 527 m_textDisplayContainer->show(); |
465 } | 528 } |
466 | 529 |
467 void MediaControls::hideTextTrackDisplay() | 530 void MediaControls::hideTextTrackDisplay() |
(...skipping 20 matching lines...) Expand all Loading... |
488 visitor->trace(m_overlayEnclosure); | 551 visitor->trace(m_overlayEnclosure); |
489 visitor->trace(m_playButton); | 552 visitor->trace(m_playButton); |
490 visitor->trace(m_currentTimeDisplay); | 553 visitor->trace(m_currentTimeDisplay); |
491 visitor->trace(m_timeline); | 554 visitor->trace(m_timeline); |
492 visitor->trace(m_muteButton); | 555 visitor->trace(m_muteButton); |
493 visitor->trace(m_volumeSlider); | 556 visitor->trace(m_volumeSlider); |
494 visitor->trace(m_toggleClosedCaptionsButton); | 557 visitor->trace(m_toggleClosedCaptionsButton); |
495 visitor->trace(m_fullScreenButton); | 558 visitor->trace(m_fullScreenButton); |
496 visitor->trace(m_durationDisplay); | 559 visitor->trace(m_durationDisplay); |
497 visitor->trace(m_enclosure); | 560 visitor->trace(m_enclosure); |
| 561 visitor->trace(m_castButton); |
| 562 visitor->trace(m_overlayCastButton); |
498 HTMLDivElement::trace(visitor); | 563 HTMLDivElement::trace(visitor); |
499 } | 564 } |
500 | 565 |
501 } | 566 } |
OLD | NEW |