| 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 14 matching lines...) Expand all Loading... |
| 25 */ | 25 */ |
| 26 | 26 |
| 27 #include "core/html/shadow/MediaControls.h" | 27 #include "core/html/shadow/MediaControls.h" |
| 28 | 28 |
| 29 #include "bindings/core/v8/ExceptionStatePlaceholder.h" | 29 #include "bindings/core/v8/ExceptionStatePlaceholder.h" |
| 30 #include "core/dom/ClientRect.h" | 30 #include "core/dom/ClientRect.h" |
| 31 #include "core/dom/Fullscreen.h" | 31 #include "core/dom/Fullscreen.h" |
| 32 #include "core/events/MouseEvent.h" | 32 #include "core/events/MouseEvent.h" |
| 33 #include "core/frame/Settings.h" | 33 #include "core/frame/Settings.h" |
| 34 #include "core/html/HTMLMediaElement.h" | 34 #include "core/html/HTMLMediaElement.h" |
| 35 #include "core/html/TimeRanges.h" |
| 35 #include "core/html/track/TextTrackContainer.h" | 36 #include "core/html/track/TextTrackContainer.h" |
| 36 #include "core/layout/LayoutTheme.h" | 37 #include "core/layout/LayoutTheme.h" |
| 37 #include "platform/EventDispatchForbiddenScope.h" | 38 #include "platform/EventDispatchForbiddenScope.h" |
| 38 | 39 |
| 39 namespace blink { | 40 namespace blink { |
| 40 | 41 |
| 41 // If you change this value, then also update the corresponding value in | 42 // If you change this value, then also update the corresponding value in |
| 42 // LayoutTests/media/media-controls.js. | 43 // LayoutTests/media/media-controls.js. |
| 43 static const double timeWithoutMouseMovementBeforeHidingMediaControls = 3; | 44 static const double timeWithoutMouseMovementBeforeHidingMediaControls = 3; |
| 44 | 45 |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 , m_textTrackList(nullptr) | 120 , m_textTrackList(nullptr) |
| 120 , m_castButton(nullptr) | 121 , m_castButton(nullptr) |
| 121 , m_fullScreenButton(nullptr) | 122 , m_fullScreenButton(nullptr) |
| 122 , m_hideMediaControlsTimer(this, &MediaControls::hideMediaControlsTimerFired
) | 123 , m_hideMediaControlsTimer(this, &MediaControls::hideMediaControlsTimerFired
) |
| 123 , m_hideTimerBehaviorFlags(IgnoreNone) | 124 , m_hideTimerBehaviorFlags(IgnoreNone) |
| 124 , m_isMouseOverControls(false) | 125 , m_isMouseOverControls(false) |
| 125 , m_isPausedForScrubbing(false) | 126 , m_isPausedForScrubbing(false) |
| 126 , m_panelWidthChangedTimer(this, &MediaControls::panelWidthChangedTimerFired
) | 127 , m_panelWidthChangedTimer(this, &MediaControls::panelWidthChangedTimerFired
) |
| 127 , m_panelWidth(0) | 128 , m_panelWidth(0) |
| 128 , m_allowHiddenVolumeControls(RuntimeEnabledFeatures::newMediaPlaybackUiEnab
led()) | 129 , m_allowHiddenVolumeControls(RuntimeEnabledFeatures::newMediaPlaybackUiEnab
led()) |
| 130 , m_bufferedRangesPaintInvalidationTimer(this, &MediaControls::bufferedRange
sPaintInvalidationTimerFired) |
| 129 { | 131 { |
| 130 } | 132 } |
| 131 | 133 |
| 132 MediaControls* MediaControls::create(HTMLMediaElement& mediaElement) | 134 MediaControls* MediaControls::create(HTMLMediaElement& mediaElement) |
| 133 { | 135 { |
| 134 MediaControls* controls = new MediaControls(mediaElement); | 136 MediaControls* controls = new MediaControls(mediaElement); |
| 135 controls->setShadowPseudoId(AtomicString("-webkit-media-controls")); | 137 controls->setShadowPseudoId(AtomicString("-webkit-media-controls")); |
| 136 controls->initializeControls(); | 138 controls->initializeControls(); |
| 137 return controls; | 139 return controls; |
| 138 } | 140 } |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 268 | 270 |
| 269 // If the player has entered an error state, force it into the paused state. | 271 // If the player has entered an error state, force it into the paused state. |
| 270 if (mediaElement().error()) | 272 if (mediaElement().error()) |
| 271 mediaElement().pause(); | 273 mediaElement().pause(); |
| 272 | 274 |
| 273 updatePlayState(); | 275 updatePlayState(); |
| 274 | 276 |
| 275 updateCurrentTimeDisplay(); | 277 updateCurrentTimeDisplay(); |
| 276 | 278 |
| 277 m_timeline->setDuration(duration); | 279 m_timeline->setDuration(duration); |
| 278 m_timeline->setPosition(mediaElement().currentTime()); | 280 updateTimelinePosition(); |
| 279 | 281 |
| 280 updateVolume(); | 282 updateVolume(); |
| 281 | 283 |
| 282 refreshClosedCaptionsButtonVisibility(); | 284 refreshClosedCaptionsButtonVisibility(); |
| 283 | 285 |
| 284 m_fullScreenButton->setIsWanted(shouldShowFullscreenButton(mediaElement())); | 286 m_fullScreenButton->setIsWanted(shouldShowFullscreenButton(mediaElement())); |
| 285 | 287 |
| 286 refreshCastButtonVisibilityWithoutUpdate(); | 288 refreshCastButtonVisibilityWithoutUpdate(); |
| 287 } | 289 } |
| 288 | 290 |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 354 void MediaControls::playbackStarted() | 356 void MediaControls::playbackStarted() |
| 355 { | 357 { |
| 356 BatchedControlUpdate batch(this); | 358 BatchedControlUpdate batch(this); |
| 357 | 359 |
| 358 if (!RuntimeEnabledFeatures::newMediaPlaybackUiEnabled()) { | 360 if (!RuntimeEnabledFeatures::newMediaPlaybackUiEnabled()) { |
| 359 m_currentTimeDisplay->setIsWanted(true); | 361 m_currentTimeDisplay->setIsWanted(true); |
| 360 m_durationDisplay->setIsWanted(false); | 362 m_durationDisplay->setIsWanted(false); |
| 361 } | 363 } |
| 362 | 364 |
| 363 updatePlayState(); | 365 updatePlayState(); |
| 364 m_timeline->setPosition(mediaElement().currentTime()); | 366 updateTimelinePosition(); |
| 365 updateCurrentTimeDisplay(); | 367 updateCurrentTimeDisplay(); |
| 366 | 368 |
| 367 startHideMediaControlsTimer(); | 369 startHideMediaControlsTimer(); |
| 368 } | 370 } |
| 369 | 371 |
| 370 void MediaControls::playbackProgressed() | 372 void MediaControls::playbackProgressed() |
| 371 { | 373 { |
| 372 m_timeline->setPosition(mediaElement().currentTime()); | 374 updateTimelinePosition(); |
| 373 updateCurrentTimeDisplay(); | 375 updateCurrentTimeDisplay(); |
| 374 | 376 |
| 375 if (shouldHideMediaControls()) | 377 if (shouldHideMediaControls()) |
| 376 makeTransparent(); | 378 makeTransparent(); |
| 377 } | 379 } |
| 378 | 380 |
| 379 void MediaControls::playbackStopped() | 381 void MediaControls::playbackStopped() |
| 380 { | 382 { |
| 381 updatePlayState(); | 383 updatePlayState(); |
| 382 m_timeline->setPosition(mediaElement().currentTime()); | 384 updateTimelinePosition(); |
| 383 updateCurrentTimeDisplay(); | 385 updateCurrentTimeDisplay(); |
| 384 makeOpaque(); | 386 makeOpaque(); |
| 385 | 387 |
| 386 stopHideMediaControlsTimer(); | 388 stopHideMediaControlsTimer(); |
| 387 } | 389 } |
| 388 | 390 |
| 389 void MediaControls::updatePlayState() | 391 void MediaControls::updatePlayState() |
| 390 { | 392 { |
| 391 if (m_isPausedForScrubbing) | 393 if (m_isPausedForScrubbing) |
| 392 return; | 394 return; |
| 393 | 395 |
| 394 if (m_overlayPlayButton) | 396 if (m_overlayPlayButton) |
| 395 m_overlayPlayButton->updateDisplayType(); | 397 m_overlayPlayButton->updateDisplayType(); |
| 396 m_playButton->updateDisplayType(); | 398 m_playButton->updateDisplayType(); |
| 399 |
| 400 startOrStopBufferedRangesPaintInvalidationTimer(); |
| 397 } | 401 } |
| 398 | 402 |
| 399 void MediaControls::beginScrubbing() | 403 void MediaControls::beginScrubbing() |
| 400 { | 404 { |
| 401 if (!mediaElement().paused()) { | 405 if (!mediaElement().paused()) { |
| 402 m_isPausedForScrubbing = true; | 406 m_isPausedForScrubbing = true; |
| 403 mediaElement().pause(); | 407 mediaElement().pause(); |
| 404 } | 408 } |
| 405 } | 409 } |
| 406 | 410 |
| (...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 775 } | 779 } |
| 776 | 780 |
| 777 void MediaControls::networkStateChanged() | 781 void MediaControls::networkStateChanged() |
| 778 { | 782 { |
| 779 invalidate(m_playButton); | 783 invalidate(m_playButton); |
| 780 invalidate(m_overlayPlayButton); | 784 invalidate(m_overlayPlayButton); |
| 781 invalidate(m_muteButton); | 785 invalidate(m_muteButton); |
| 782 invalidate(m_fullScreenButton); | 786 invalidate(m_fullScreenButton); |
| 783 invalidate(m_timeline); | 787 invalidate(m_timeline); |
| 784 invalidate(m_volumeSlider); | 788 invalidate(m_volumeSlider); |
| 789 |
| 790 startOrStopBufferedRangesPaintInvalidationTimer(); |
| 791 } |
| 792 |
| 793 void MediaControls::startOrStopBufferedRangesPaintInvalidationTimer() |
| 794 { |
| 795 if (m_mediaElement->getNetworkState() == HTMLMediaElement::kNetworkLoading &
& m_mediaElement->paused()) { |
| 796 updateBufferedRanges(); |
| 797 // Start timer to invalidate m_timeline to repaint the buffered ranges w
hen the media is |
| 798 // loading in paused state. In play state, m_timeline will be invalidate
d on play progresses. |
| 799 if (!m_bufferedRangesPaintInvalidationTimer.isActive()) |
| 800 m_bufferedRangesPaintInvalidationTimer.startRepeating(0.5, BLINK_FRO
M_HERE); |
| 801 } else { |
| 802 m_bufferedRangesPaintInvalidationTimer.stop(); |
| 803 } |
| 804 } |
| 805 |
| 806 void MediaControls::updateTimelinePosition() |
| 807 { |
| 808 m_timeline->setPosition(mediaElement().currentTime()); |
| 809 // Synchronize buffered ranges when the current time changes. |
| 810 updateBufferedRanges(); |
| 811 }; |
| 812 |
| 813 void MediaControls::updateBufferedRanges() |
| 814 { |
| 815 TimeRanges* newBufferedRanges = m_mediaElement->buffered(); |
| 816 if (!m_lastBufferedRanges) { |
| 817 if (!newBufferedRanges->length()) |
| 818 return; |
| 819 } else if (*m_lastBufferedRanges != *newBufferedRanges) { |
| 820 return; |
| 821 } |
| 822 |
| 823 // Invalidate the timeline to repaint the buffered ranges. |
| 824 invalidate(m_timeline); |
| 825 m_lastBufferedRanges = newBufferedRanges->copy(); |
| 826 } |
| 827 |
| 828 void MediaControls::bufferedRangesPaintInvalidationTimerFired(TimerBase*) |
| 829 { |
| 830 updateBufferedRanges(); |
| 785 } | 831 } |
| 786 | 832 |
| 787 DEFINE_TRACE(MediaControls) | 833 DEFINE_TRACE(MediaControls) |
| 788 { | 834 { |
| 789 visitor->trace(m_mediaElement); | 835 visitor->trace(m_mediaElement); |
| 790 visitor->trace(m_panel); | 836 visitor->trace(m_panel); |
| 791 visitor->trace(m_overlayPlayButton); | 837 visitor->trace(m_overlayPlayButton); |
| 792 visitor->trace(m_overlayEnclosure); | 838 visitor->trace(m_overlayEnclosure); |
| 793 visitor->trace(m_playButton); | 839 visitor->trace(m_playButton); |
| 794 visitor->trace(m_currentTimeDisplay); | 840 visitor->trace(m_currentTimeDisplay); |
| 795 visitor->trace(m_timeline); | 841 visitor->trace(m_timeline); |
| 796 visitor->trace(m_muteButton); | 842 visitor->trace(m_muteButton); |
| 797 visitor->trace(m_volumeSlider); | 843 visitor->trace(m_volumeSlider); |
| 798 visitor->trace(m_toggleClosedCaptionsButton); | 844 visitor->trace(m_toggleClosedCaptionsButton); |
| 799 visitor->trace(m_fullScreenButton); | 845 visitor->trace(m_fullScreenButton); |
| 800 visitor->trace(m_durationDisplay); | 846 visitor->trace(m_durationDisplay); |
| 801 visitor->trace(m_enclosure); | 847 visitor->trace(m_enclosure); |
| 802 visitor->trace(m_textTrackList); | 848 visitor->trace(m_textTrackList); |
| 803 visitor->trace(m_castButton); | 849 visitor->trace(m_castButton); |
| 804 visitor->trace(m_overlayCastButton); | 850 visitor->trace(m_overlayCastButton); |
| 851 visitor->trace(m_lastBufferedRanges); |
| 805 HTMLDivElement::trace(visitor); | 852 HTMLDivElement::trace(visitor); |
| 806 } | 853 } |
| 807 | 854 |
| 808 } // namespace blink | 855 } // namespace blink |
| OLD | NEW |