| 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 |