OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights
reserved. | 2 * Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights
reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 , m_seeking(false) | 345 , m_seeking(false) |
346 , m_sentStalledEvent(false) | 346 , m_sentStalledEvent(false) |
347 , m_sentEndEvent(false) | 347 , m_sentEndEvent(false) |
348 , m_pausedInternal(false) | 348 , m_pausedInternal(false) |
349 , m_closedCaptionsVisible(false) | 349 , m_closedCaptionsVisible(false) |
350 , m_completelyLoaded(false) | 350 , m_completelyLoaded(false) |
351 , m_havePreparedToPlay(false) | 351 , m_havePreparedToPlay(false) |
352 , m_tracksAreReady(true) | 352 , m_tracksAreReady(true) |
353 , m_haveVisibleTextTrack(false) | 353 , m_haveVisibleTextTrack(false) |
354 , m_processingPreferenceChange(false) | 354 , m_processingPreferenceChange(false) |
| 355 , m_remoteRoutesAvailable(false) |
| 356 , m_playingRemotely(false) |
355 #if ENABLE(OILPAN) | 357 #if ENABLE(OILPAN) |
356 , m_isFinalizing(false) | 358 , m_isFinalizing(false) |
357 , m_closeMediaSourceWhenFinalizing(false) | 359 , m_closeMediaSourceWhenFinalizing(false) |
358 #endif | 360 #endif |
359 , m_lastTextTrackUpdateTime(-1) | 361 , m_lastTextTrackUpdateTime(-1) |
360 , m_audioTracks(AudioTrackList::create(*this)) | 362 , m_audioTracks(AudioTrackList::create(*this)) |
361 , m_videoTracks(VideoTrackList::create(*this)) | 363 , m_videoTracks(VideoTrackList::create(*this)) |
362 , m_textTracks(nullptr) | 364 , m_textTracks(nullptr) |
363 , m_ignoreTrackDisplayUpdate(0) | 365 , m_ignoreTrackDisplayUpdate(0) |
364 #if ENABLE(WEB_AUDIO) | 366 #if ENABLE(WEB_AUDIO) |
(...skipping 1892 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2257 | 2259 |
2258 if (!m_paused) { | 2260 if (!m_paused) { |
2259 m_paused = true; | 2261 m_paused = true; |
2260 scheduleTimeupdateEvent(false); | 2262 scheduleTimeupdateEvent(false); |
2261 scheduleEvent(EventTypeNames::pause); | 2263 scheduleEvent(EventTypeNames::pause); |
2262 } | 2264 } |
2263 | 2265 |
2264 updatePlayState(); | 2266 updatePlayState(); |
2265 } | 2267 } |
2266 | 2268 |
| 2269 void HTMLMediaElement::requestRemotePlayback() |
| 2270 { |
| 2271 ASSERT(m_remoteRoutesAvailable); |
| 2272 webMediaPlayer()->requestRemotePlayback(); |
| 2273 } |
| 2274 |
| 2275 void HTMLMediaElement::requestRemotePlaybackControl() |
| 2276 { |
| 2277 ASSERT(m_remoteRoutesAvailable); |
| 2278 webMediaPlayer()->requestRemotePlaybackControl(); |
| 2279 } |
| 2280 |
2267 void HTMLMediaElement::closeMediaSource() | 2281 void HTMLMediaElement::closeMediaSource() |
2268 { | 2282 { |
2269 if (!m_mediaSource) | 2283 if (!m_mediaSource) |
2270 return; | 2284 return; |
2271 | 2285 |
2272 m_mediaSource->close(); | 2286 m_mediaSource->close(); |
2273 m_mediaSource = nullptr; | 2287 m_mediaSource = nullptr; |
2274 } | 2288 } |
2275 | 2289 |
2276 bool HTMLMediaElement::loop() const | 2290 bool HTMLMediaElement::loop() const |
(...skipping 890 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3167 void HTMLMediaElement::mediaPlayerRequestSeek(double time) | 3181 void HTMLMediaElement::mediaPlayerRequestSeek(double time) |
3168 { | 3182 { |
3169 // The player is the source of this seek request. | 3183 // The player is the source of this seek request. |
3170 if (m_mediaController) { | 3184 if (m_mediaController) { |
3171 m_mediaController->setCurrentTime(time, IGNORE_EXCEPTION); | 3185 m_mediaController->setCurrentTime(time, IGNORE_EXCEPTION); |
3172 return; | 3186 return; |
3173 } | 3187 } |
3174 setCurrentTime(time, IGNORE_EXCEPTION); | 3188 setCurrentTime(time, IGNORE_EXCEPTION); |
3175 } | 3189 } |
3176 | 3190 |
| 3191 void HTMLMediaElement::remoteRouteAvailabilityChanged(bool routesAvailable) |
| 3192 { |
| 3193 m_remoteRoutesAvailable = routesAvailable; |
| 3194 if (hasMediaControls()) |
| 3195 mediaControls()->refreshCastButtonVisibility(); |
| 3196 } |
| 3197 |
| 3198 void HTMLMediaElement::connectedToRemoteDevice() |
| 3199 { |
| 3200 m_playingRemotely = true; |
| 3201 if (hasMediaControls()) |
| 3202 mediaControls()->startedCasting(); |
| 3203 } |
| 3204 |
| 3205 void HTMLMediaElement::disconnectedFromRemoteDevice() |
| 3206 { |
| 3207 m_playingRemotely = false; |
| 3208 if (hasMediaControls()) |
| 3209 mediaControls()->stoppedCasting(); |
| 3210 } |
| 3211 |
3177 // MediaPlayerPresentation methods | 3212 // MediaPlayerPresentation methods |
3178 void HTMLMediaElement::mediaPlayerRepaint() | 3213 void HTMLMediaElement::mediaPlayerRepaint() |
3179 { | 3214 { |
3180 if (m_webLayer) | 3215 if (m_webLayer) |
3181 m_webLayer->invalidate(); | 3216 m_webLayer->invalidate(); |
3182 | 3217 |
3183 updateDisplayState(); | 3218 updateDisplayState(); |
3184 if (renderer()) | 3219 if (renderer()) |
3185 renderer()->setShouldDoFullPaintInvalidation(true); | 3220 renderer()->setShouldDoFullPaintInvalidation(true); |
3186 } | 3221 } |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3422 AudioSourceProviderClientLockScope scope(*this); | 3457 AudioSourceProviderClientLockScope scope(*this); |
3423 clearMediaPlayerAndAudioSourceProviderClientWithoutLocking(); | 3458 clearMediaPlayerAndAudioSourceProviderClientWithoutLocking(); |
3424 } | 3459 } |
3425 | 3460 |
3426 stopPeriodicTimers(); | 3461 stopPeriodicTimers(); |
3427 m_loadTimer.stop(); | 3462 m_loadTimer.stop(); |
3428 | 3463 |
3429 m_pendingActionFlags &= ~flags; | 3464 m_pendingActionFlags &= ~flags; |
3430 m_loadState = WaitingForSource; | 3465 m_loadState = WaitingForSource; |
3431 | 3466 |
| 3467 // We can't cast if we don't have a media player. |
| 3468 m_remoteRoutesAvailable = false; |
| 3469 m_playingRemotely = false; |
| 3470 if (hasMediaControls()) { |
| 3471 mediaControls()->refreshCastButtonVisibility(); |
| 3472 } |
| 3473 |
3432 if (m_textTracks) | 3474 if (m_textTracks) |
3433 configureTextTrackDisplay(AssumeNoVisibleChange); | 3475 configureTextTrackDisplay(AssumeNoVisibleChange); |
3434 } | 3476 } |
3435 | 3477 |
3436 void HTMLMediaElement::stop() | 3478 void HTMLMediaElement::stop() |
3437 { | 3479 { |
3438 WTF_LOG(Media, "HTMLMediaElement::stop"); | 3480 WTF_LOG(Media, "HTMLMediaElement::stop"); |
3439 | 3481 |
3440 m_active = false; | 3482 m_active = false; |
3441 userCancelledLoad(); | 3483 userCancelledLoad(); |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3622 ensureUserAgentShadowRoot().appendChild(mediaControls); | 3664 ensureUserAgentShadowRoot().appendChild(mediaControls); |
3623 | 3665 |
3624 if (!shouldShowControls() || !inDocument()) | 3666 if (!shouldShowControls() || !inDocument()) |
3625 mediaControls->hide(); | 3667 mediaControls->hide(); |
3626 | 3668 |
3627 return true; | 3669 return true; |
3628 } | 3670 } |
3629 | 3671 |
3630 void HTMLMediaElement::configureMediaControls() | 3672 void HTMLMediaElement::configureMediaControls() |
3631 { | 3673 { |
3632 if (!shouldShowControls() || !inDocument()) { | 3674 if (!inDocument()) { |
3633 if (hasMediaControls()) | 3675 if (hasMediaControls()) |
3634 mediaControls()->hide(); | 3676 mediaControls()->hide(); |
3635 return; | 3677 return; |
3636 } | 3678 } |
3637 | 3679 |
3638 if (!createMediaControls()) | 3680 if (!createMediaControls()) |
3639 return; | 3681 return; |
3640 | 3682 |
3641 mediaControls()->reset(); | 3683 mediaControls()->reset(); |
3642 mediaControls()->show(); | 3684 if (shouldShowControls()) |
| 3685 mediaControls()->show(); |
| 3686 else |
| 3687 mediaControls()->hide(); |
3643 } | 3688 } |
3644 | 3689 |
3645 void HTMLMediaElement::configureTextTrackDisplay(VisibilityChangeAssumption assu
mption) | 3690 void HTMLMediaElement::configureTextTrackDisplay(VisibilityChangeAssumption assu
mption) |
3646 { | 3691 { |
3647 ASSERT(m_textTracks); | 3692 ASSERT(m_textTracks); |
3648 WTF_LOG(Media, "HTMLMediaElement::configureTextTrackDisplay"); | 3693 WTF_LOG(Media, "HTMLMediaElement::configureTextTrackDisplay"); |
3649 | 3694 |
3650 if (m_processingPreferenceChange) | 3695 if (m_processingPreferenceChange) |
3651 return; | 3696 return; |
3652 | 3697 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3705 } | 3750 } |
3706 | 3751 |
3707 void HTMLMediaElement::createMediaPlayer() | 3752 void HTMLMediaElement::createMediaPlayer() |
3708 { | 3753 { |
3709 AudioSourceProviderClientLockScope scope(*this); | 3754 AudioSourceProviderClientLockScope scope(*this); |
3710 | 3755 |
3711 closeMediaSource(); | 3756 closeMediaSource(); |
3712 | 3757 |
3713 m_player = MediaPlayer::create(this); | 3758 m_player = MediaPlayer::create(this); |
3714 | 3759 |
| 3760 // We haven't yet found out if any remote routes are available. |
| 3761 m_remoteRoutesAvailable = false; |
| 3762 m_playingRemotely = false; |
| 3763 |
3715 #if ENABLE(WEB_AUDIO) | 3764 #if ENABLE(WEB_AUDIO) |
3716 if (m_audioSourceNode && audioSourceProvider()) { | 3765 if (m_audioSourceNode && audioSourceProvider()) { |
3717 // When creating the player, make sure its AudioSourceProvider knows abo
ut the client. | 3766 // When creating the player, make sure its AudioSourceProvider knows abo
ut the client. |
3718 audioSourceProvider()->setClient(m_audioSourceNode); | 3767 audioSourceProvider()->setClient(m_audioSourceNode); |
3719 } | 3768 } |
3720 #endif | 3769 #endif |
3721 } | 3770 } |
3722 | 3771 |
3723 #if ENABLE(WEB_AUDIO) | 3772 #if ENABLE(WEB_AUDIO) |
3724 void HTMLMediaElement::setAudioSourceNode(AudioSourceProviderClient* sourceNode) | 3773 void HTMLMediaElement::setAudioSourceNode(AudioSourceProviderClient* sourceNode) |
(...skipping 16 matching lines...) Expand all Loading... |
3741 | 3790 |
3742 const AtomicString& HTMLMediaElement::mediaGroup() const | 3791 const AtomicString& HTMLMediaElement::mediaGroup() const |
3743 { | 3792 { |
3744 return fastGetAttribute(mediagroupAttr); | 3793 return fastGetAttribute(mediagroupAttr); |
3745 } | 3794 } |
3746 | 3795 |
3747 void HTMLMediaElement::setMediaGroup(const AtomicString& group) | 3796 void HTMLMediaElement::setMediaGroup(const AtomicString& group) |
3748 { | 3797 { |
3749 // When a media element is created with a mediagroup attribute, and when a m
edia element's mediagroup | 3798 // When a media element is created with a mediagroup attribute, and when a m
edia element's mediagroup |
3750 // attribute is set, changed, or removed, the user agent must run the follow
ing steps: | 3799 // attribute is set, changed, or removed, the user agent must run the follow
ing steps: |
3751 // 1. Let m [this] be the media element in question. | 3800 // 1. Let _R [this] be the media element in question. |
3752 // 2. Let m have no current media controller, if it currently has one. | 3801 // 2. Let m have no current media controller, if it currently has one. |
3753 setControllerInternal(nullptr); | 3802 setControllerInternal(nullptr); |
3754 | 3803 |
3755 // 3. If m's mediagroup attribute is being removed, then abort these steps. | 3804 // 3. If m's mediagroup attribute is being removed, then abort these steps. |
3756 if (group.isNull() || group.isEmpty()) | 3805 if (group.isNull() || group.isEmpty()) |
3757 return; | 3806 return; |
3758 | 3807 |
3759 // 4. If there is another media element whose Document is the same as m's Do
cument (even if one or both | 3808 // 4. If there is another media element whose Document is the same as m's Do
cument (even if one or both |
3760 // of these elements are not actually in the Document), | 3809 // of these elements are not actually in the Document), |
3761 WeakMediaElementSet elements = documentToElementSetMap().get(&document()); | 3810 WeakMediaElementSet elements = documentToElementSetMap().get(&document()); |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3970 | 4019 |
3971 #if ENABLE(WEB_AUDIO) | 4020 #if ENABLE(WEB_AUDIO) |
3972 void HTMLMediaElement::clearWeakMembers(Visitor* visitor) | 4021 void HTMLMediaElement::clearWeakMembers(Visitor* visitor) |
3973 { | 4022 { |
3974 if (!visitor->isAlive(m_audioSourceNode) && audioSourceProvider()) | 4023 if (!visitor->isAlive(m_audioSourceNode) && audioSourceProvider()) |
3975 audioSourceProvider()->setClient(0); | 4024 audioSourceProvider()->setClient(0); |
3976 } | 4025 } |
3977 #endif | 4026 #endif |
3978 | 4027 |
3979 } | 4028 } |
OLD | NEW |