Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(123)

Side by Side Diff: Source/core/html/HTMLMediaElement.cpp

Issue 291163004: Implement media cast buttons (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Reenable previously crashing tests - now fixed Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/core/html/HTMLMediaElement.h ('k') | Source/core/html/shadow/MediaControlElementTypes.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 1904 matching lines...) Expand 10 before | Expand all | Expand 10 after
2269 2271
2270 if (!m_paused) { 2272 if (!m_paused) {
2271 m_paused = true; 2273 m_paused = true;
2272 scheduleTimeupdateEvent(false); 2274 scheduleTimeupdateEvent(false);
2273 scheduleEvent(EventTypeNames::pause); 2275 scheduleEvent(EventTypeNames::pause);
2274 } 2276 }
2275 2277
2276 updatePlayState(); 2278 updatePlayState();
2277 } 2279 }
2278 2280
2281 void HTMLMediaElement::requestRemotePlayback()
2282 {
2283 ASSERT(m_remoteRoutesAvailable);
2284 webMediaPlayer()->requestRemotePlayback();
2285 }
2286
2287 void HTMLMediaElement::requestRemotePlaybackControl()
2288 {
2289 ASSERT(m_remoteRoutesAvailable);
2290 webMediaPlayer()->requestRemotePlaybackControl();
2291 }
2292
2279 void HTMLMediaElement::closeMediaSource() 2293 void HTMLMediaElement::closeMediaSource()
2280 { 2294 {
2281 if (!m_mediaSource) 2295 if (!m_mediaSource)
2282 return; 2296 return;
2283 2297
2284 m_mediaSource->close(); 2298 m_mediaSource->close();
2285 m_mediaSource = nullptr; 2299 m_mediaSource = nullptr;
2286 } 2300 }
2287 2301
2288 bool HTMLMediaElement::loop() const 2302 bool HTMLMediaElement::loop() const
(...skipping 884 matching lines...) Expand 10 before | Expand all | Expand 10 after
3173 void HTMLMediaElement::mediaPlayerRequestSeek(double time) 3187 void HTMLMediaElement::mediaPlayerRequestSeek(double time)
3174 { 3188 {
3175 // The player is the source of this seek request. 3189 // The player is the source of this seek request.
3176 if (m_mediaController) { 3190 if (m_mediaController) {
3177 m_mediaController->setCurrentTime(time); 3191 m_mediaController->setCurrentTime(time);
3178 return; 3192 return;
3179 } 3193 }
3180 setCurrentTime(time, ASSERT_NO_EXCEPTION); 3194 setCurrentTime(time, ASSERT_NO_EXCEPTION);
3181 } 3195 }
3182 3196
3197 void HTMLMediaElement::remoteRouteAvailabilityChanged(bool routesAvailable)
3198 {
3199 m_remoteRoutesAvailable = routesAvailable;
3200 if (hasMediaControls())
3201 mediaControls()->refreshCastButtonVisibility();
3202 }
3203
3204 void HTMLMediaElement::connectedToRemoteDevice()
3205 {
3206 m_playingRemotely = true;
3207 if (hasMediaControls())
3208 mediaControls()->startedCasting();
3209 }
3210
3211 void HTMLMediaElement::disconnectedFromRemoteDevice()
3212 {
3213 m_playingRemotely = false;
3214 if (hasMediaControls())
3215 mediaControls()->stoppedCasting();
3216 }
3217
3183 // MediaPlayerPresentation methods 3218 // MediaPlayerPresentation methods
3184 void HTMLMediaElement::mediaPlayerRepaint() 3219 void HTMLMediaElement::mediaPlayerRepaint()
3185 { 3220 {
3186 if (m_webLayer) 3221 if (m_webLayer)
3187 m_webLayer->invalidate(); 3222 m_webLayer->invalidate();
3188 3223
3189 updateDisplayState(); 3224 updateDisplayState();
3190 if (renderer()) 3225 if (renderer())
3191 renderer()->setShouldDoFullPaintInvalidation(true); 3226 renderer()->setShouldDoFullPaintInvalidation(true);
3192 } 3227 }
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
3428 AudioSourceProviderClientLockScope scope(*this); 3463 AudioSourceProviderClientLockScope scope(*this);
3429 clearMediaPlayerAndAudioSourceProviderClientWithoutLocking(); 3464 clearMediaPlayerAndAudioSourceProviderClientWithoutLocking();
3430 } 3465 }
3431 3466
3432 stopPeriodicTimers(); 3467 stopPeriodicTimers();
3433 m_loadTimer.stop(); 3468 m_loadTimer.stop();
3434 3469
3435 m_pendingActionFlags &= ~flags; 3470 m_pendingActionFlags &= ~flags;
3436 m_loadState = WaitingForSource; 3471 m_loadState = WaitingForSource;
3437 3472
3473 // We can't cast if we don't have a media player.
3474 m_remoteRoutesAvailable = false;
3475 m_playingRemotely = false;
3476 if (hasMediaControls()) {
3477 mediaControls()->refreshCastButtonVisibility();
3478 }
3479
3438 if (m_textTracks) 3480 if (m_textTracks)
3439 configureTextTrackDisplay(AssumeNoVisibleChange); 3481 configureTextTrackDisplay(AssumeNoVisibleChange);
3440 } 3482 }
3441 3483
3442 void HTMLMediaElement::stop() 3484 void HTMLMediaElement::stop()
3443 { 3485 {
3444 WTF_LOG(Media, "HTMLMediaElement::stop(%p)", this); 3486 WTF_LOG(Media, "HTMLMediaElement::stop(%p)", this);
3445 3487
3446 m_active = false; 3488 m_active = false;
3447 userCancelledLoad(); 3489 userCancelledLoad();
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
3628 ensureUserAgentShadowRoot().appendChild(mediaControls); 3670 ensureUserAgentShadowRoot().appendChild(mediaControls);
3629 3671
3630 if (!shouldShowControls() || !inDocument()) 3672 if (!shouldShowControls() || !inDocument())
3631 mediaControls->hide(); 3673 mediaControls->hide();
3632 3674
3633 return true; 3675 return true;
3634 } 3676 }
3635 3677
3636 void HTMLMediaElement::configureMediaControls() 3678 void HTMLMediaElement::configureMediaControls()
3637 { 3679 {
3638 if (!shouldShowControls() || !inDocument()) { 3680 if (!inDocument()) {
3639 if (hasMediaControls()) 3681 if (hasMediaControls())
3640 mediaControls()->hide(); 3682 mediaControls()->hide();
3641 return; 3683 return;
3642 } 3684 }
3643 3685
3644 if (!createMediaControls()) 3686 if (!createMediaControls())
3645 return; 3687 return;
3646 3688
3647 mediaControls()->reset(); 3689 mediaControls()->reset();
3648 mediaControls()->show(); 3690 if (shouldShowControls())
3691 mediaControls()->show();
3692 else
3693 mediaControls()->hide();
3649 } 3694 }
3650 3695
3651 void HTMLMediaElement::configureTextTrackDisplay(VisibilityChangeAssumption assu mption) 3696 void HTMLMediaElement::configureTextTrackDisplay(VisibilityChangeAssumption assu mption)
3652 { 3697 {
3653 ASSERT(m_textTracks); 3698 ASSERT(m_textTracks);
3654 WTF_LOG(Media, "HTMLMediaElement::configureTextTrackDisplay(%p)", this); 3699 WTF_LOG(Media, "HTMLMediaElement::configureTextTrackDisplay(%p)", this);
3655 3700
3656 if (m_processingPreferenceChange) 3701 if (m_processingPreferenceChange)
3657 return; 3702 return;
3658 3703
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
3711 } 3756 }
3712 3757
3713 void HTMLMediaElement::createMediaPlayer() 3758 void HTMLMediaElement::createMediaPlayer()
3714 { 3759 {
3715 AudioSourceProviderClientLockScope scope(*this); 3760 AudioSourceProviderClientLockScope scope(*this);
3716 3761
3717 closeMediaSource(); 3762 closeMediaSource();
3718 3763
3719 m_player = MediaPlayer::create(this); 3764 m_player = MediaPlayer::create(this);
3720 3765
3766 // We haven't yet found out if any remote routes are available.
3767 m_remoteRoutesAvailable = false;
3768 m_playingRemotely = false;
3769
3721 #if ENABLE(WEB_AUDIO) 3770 #if ENABLE(WEB_AUDIO)
3722 if (m_audioSourceNode && audioSourceProvider()) { 3771 if (m_audioSourceNode && audioSourceProvider()) {
3723 // When creating the player, make sure its AudioSourceProvider knows abo ut the client. 3772 // When creating the player, make sure its AudioSourceProvider knows abo ut the client.
3724 audioSourceProvider()->setClient(m_audioSourceNode); 3773 audioSourceProvider()->setClient(m_audioSourceNode);
3725 } 3774 }
3726 #endif 3775 #endif
3727 } 3776 }
3728 3777
3729 #if ENABLE(WEB_AUDIO) 3778 #if ENABLE(WEB_AUDIO)
3730 void HTMLMediaElement::setAudioSourceNode(AudioSourceProviderClient* sourceNode) 3779 void HTMLMediaElement::setAudioSourceNode(AudioSourceProviderClient* sourceNode)
(...skipping 16 matching lines...) Expand all
3747 3796
3748 const AtomicString& HTMLMediaElement::mediaGroup() const 3797 const AtomicString& HTMLMediaElement::mediaGroup() const
3749 { 3798 {
3750 return fastGetAttribute(mediagroupAttr); 3799 return fastGetAttribute(mediagroupAttr);
3751 } 3800 }
3752 3801
3753 void HTMLMediaElement::setMediaGroup(const AtomicString& group) 3802 void HTMLMediaElement::setMediaGroup(const AtomicString& group)
3754 { 3803 {
3755 // When a media element is created with a mediagroup attribute, and when a m edia element's mediagroup 3804 // When a media element is created with a mediagroup attribute, and when a m edia element's mediagroup
3756 // attribute is set, changed, or removed, the user agent must run the follow ing steps: 3805 // attribute is set, changed, or removed, the user agent must run the follow ing steps:
3757 // 1. Let m [this] be the media element in question. 3806 // 1. Let _R [this] be the media element in question.
3758 // 2. Let m have no current media controller, if it currently has one. 3807 // 2. Let m have no current media controller, if it currently has one.
3759 setControllerInternal(nullptr); 3808 setControllerInternal(nullptr);
3760 3809
3761 // 3. If m's mediagroup attribute is being removed, then abort these steps. 3810 // 3. If m's mediagroup attribute is being removed, then abort these steps.
3762 if (group.isNull() || group.isEmpty()) 3811 if (group.isNull() || group.isEmpty())
3763 return; 3812 return;
3764 3813
3765 // 4. If there is another media element whose Document is the same as m's Do cument (even if one or both 3814 // 4. If there is another media element whose Document is the same as m's Do cument (even if one or both
3766 // of these elements are not actually in the Document), 3815 // of these elements are not actually in the Document),
3767 WeakMediaElementSet elements = documentToElementSetMap().get(&document()); 3816 WeakMediaElementSet elements = documentToElementSetMap().get(&document());
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
3976 4025
3977 #if ENABLE(WEB_AUDIO) 4026 #if ENABLE(WEB_AUDIO)
3978 void HTMLMediaElement::clearWeakMembers(Visitor* visitor) 4027 void HTMLMediaElement::clearWeakMembers(Visitor* visitor)
3979 { 4028 {
3980 if (!visitor->isAlive(m_audioSourceNode) && audioSourceProvider()) 4029 if (!visitor->isAlive(m_audioSourceNode) && audioSourceProvider())
3981 audioSourceProvider()->setClient(0); 4030 audioSourceProvider()->setClient(0);
3982 } 4031 }
3983 #endif 4032 #endif
3984 4033
3985 } 4034 }
OLDNEW
« no previous file with comments | « Source/core/html/HTMLMediaElement.h ('k') | Source/core/html/shadow/MediaControlElementTypes.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698