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

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

Issue 192013002: Move deferred loading logic from WebMediaPlayerClientImpl to HTMLMediaElement. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Clean up unnecessary logic and state. Created 6 years, 9 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 | Annotate | Revision Log
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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 #include "wtf/text/CString.h" 78 #include "wtf/text/CString.h"
79 79
80 #if ENABLE(WEB_AUDIO) 80 #if ENABLE(WEB_AUDIO)
81 #include "platform/audio/AudioSourceProvider.h" 81 #include "platform/audio/AudioSourceProvider.h"
82 #include "modules/webaudio/MediaElementAudioSourceNode.h" 82 #include "modules/webaudio/MediaElementAudioSourceNode.h"
83 #endif 83 #endif
84 84
85 using namespace std; 85 using namespace std;
86 using blink::WebInbandTextTrack; 86 using blink::WebInbandTextTrack;
87 using blink::WebMimeRegistry; 87 using blink::WebMimeRegistry;
88 using blink::WebMediaPlayer;
philipj_slow 2014/03/08 19:38:40 Move up one line to keep list sorted.
acolwell GONE FROM CHROMIUM 2014/03/10 21:53:31 Done.
88 89
89 namespace WebCore { 90 namespace WebCore {
90 91
91 #if !LOG_DISABLED 92 #if !LOG_DISABLED
92 static String urlForLoggingMedia(const KURL& url) 93 static String urlForLoggingMedia(const KURL& url)
93 { 94 {
94 static const unsigned maximumURLLengthForLogging = 128; 95 static const unsigned maximumURLLengthForLogging = 128;
95 96
96 if (url.string().length() < maximumURLLengthForLogging) 97 if (url.string().length() < maximumURLLengthForLogging)
97 return url.string(); 98 return url.string();
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 , m_pausedInternal(false) 273 , m_pausedInternal(false)
273 , m_closedCaptionsVisible(false) 274 , m_closedCaptionsVisible(false)
274 , m_completelyLoaded(false) 275 , m_completelyLoaded(false)
275 , m_havePreparedToPlay(false) 276 , m_havePreparedToPlay(false)
276 , m_tracksAreReady(true) 277 , m_tracksAreReady(true)
277 , m_haveVisibleTextTrack(false) 278 , m_haveVisibleTextTrack(false)
278 , m_processingPreferenceChange(false) 279 , m_processingPreferenceChange(false)
279 , m_lastTextTrackUpdateTime(-1) 280 , m_lastTextTrackUpdateTime(-1)
280 , m_textTracks(nullptr) 281 , m_textTracks(nullptr)
281 , m_ignoreTrackDisplayUpdate(0) 282 , m_ignoreTrackDisplayUpdate(0)
283 , m_delayingLoad(false)
282 #if ENABLE(WEB_AUDIO) 284 #if ENABLE(WEB_AUDIO)
283 , m_audioSourceNode(0) 285 , m_audioSourceNode(0)
284 #endif 286 #endif
285 { 287 {
286 ASSERT(RuntimeEnabledFeatures::mediaEnabled()); 288 ASSERT(RuntimeEnabledFeatures::mediaEnabled());
287 289
288 WTF_LOG(Media, "HTMLMediaElement::HTMLMediaElement"); 290 WTF_LOG(Media, "HTMLMediaElement::HTMLMediaElement");
289 ScriptWrappable::init(this); 291 ScriptWrappable::init(this);
290 292
291 if (document.settings() && document.settings()->mediaPlaybackRequiresUserGes ture()) 293 if (document.settings() && document.settings()->mediaPlaybackRequiresUserGes ture())
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 else if (equalIgnoringCase(value, "metadata")) 408 else if (equalIgnoringCase(value, "metadata"))
407 m_preload = MediaPlayer::MetaData; 409 m_preload = MediaPlayer::MetaData;
408 else { 410 else {
409 // The spec does not define an "invalid value default" but "auto" is suggested as the 411 // The spec does not define an "invalid value default" but "auto" is suggested as the
410 // "missing value default", so use it for everything except "none" a nd "metadata" 412 // "missing value default", so use it for everything except "none" a nd "metadata"
411 m_preload = MediaPlayer::Auto; 413 m_preload = MediaPlayer::Auto;
412 } 414 }
413 415
414 // The attribute must be ignored if the autoplay attribute is present 416 // The attribute must be ignored if the autoplay attribute is present
415 if (!autoplay() && m_player) 417 if (!autoplay() && m_player)
416 m_player->setPreload(m_preload); 418 setPlayerPreload();
417 419
418 } else if (name == mediagroupAttr) 420 } else if (name == mediagroupAttr)
419 setMediaGroup(value); 421 setMediaGroup(value);
420 else if (name == onbeforeloadAttr) 422 else if (name == onbeforeloadAttr)
421 setAttributeEventListener(EventTypeNames::beforeload, createAttributeEve ntListener(this, name, value)); 423 setAttributeEventListener(EventTypeNames::beforeload, createAttributeEve ntListener(this, name, value));
422 else 424 else
423 HTMLElement::parseAttribute(name, value); 425 HTMLElement::parseAttribute(name, value);
424 } 426 }
425 427
426 void HTMLMediaElement::finishParsingChildren() 428 void HTMLMediaElement::finishParsingChildren()
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after
832 834
833 // The resource fetch algorithm 835 // The resource fetch algorithm
834 m_networkState = NETWORK_LOADING; 836 m_networkState = NETWORK_LOADING;
835 837
836 // Set m_currentSrc *before* changing to the cache url, the fact that we are loading from the app 838 // Set m_currentSrc *before* changing to the cache url, the fact that we are loading from the app
837 // cache is an internal detail not exposed through the media element API. 839 // cache is an internal detail not exposed through the media element API.
838 m_currentSrc = url; 840 m_currentSrc = url;
839 841
840 WTF_LOG(Media, "HTMLMediaElement::loadResource - m_currentSrc -> %s", urlFor LoggingMedia(m_currentSrc).utf8().data()); 842 WTF_LOG(Media, "HTMLMediaElement::loadResource - m_currentSrc -> %s", urlFor LoggingMedia(m_currentSrc).utf8().data());
841 843
842 blink::WebMediaPlayer::LoadType loadType = blink::WebMediaPlayer::LoadTypeUR L;
843
844 startProgressEventTimer(); 844 startProgressEventTimer();
845 845
846 // Reset display mode to force a recalculation of what to show because we ar e resetting the player. 846 // Reset display mode to force a recalculation of what to show because we ar e resetting the player.
847 setDisplayMode(Unknown); 847 setDisplayMode(Unknown);
848 848
849 if (!autoplay()) 849 if (!autoplay())
850 m_player->setPreload(m_preload); 850 setPlayerPreload();
851 851
852 if (fastHasAttribute(mutedAttr)) 852 if (fastHasAttribute(mutedAttr))
853 m_muted = true; 853 m_muted = true;
854 updateVolume(); 854 updateVolume();
855 855
856 ASSERT(!m_mediaSource); 856 ASSERT(!m_mediaSource);
857 857
858 bool attemptLoad = true; 858 bool attemptLoad = true;
859 859
860 if (url.protocolIs(mediaSourceBlobProtocol)) { 860 if (url.protocolIs(mediaSourceBlobProtocol)) {
861 if (isMediaStreamURL(url.string())) { 861 if (isMediaStreamURL(url.string())) {
862 loadType = blink::WebMediaPlayer::LoadTypeMediaStream;
863 m_userGestureRequiredForPlay = false; 862 m_userGestureRequiredForPlay = false;
864 } else { 863 } else {
865 m_mediaSource = HTMLMediaSource::lookup(url.string()); 864 m_mediaSource = HTMLMediaSource::lookup(url.string());
866 865
867 if (m_mediaSource) { 866 if (m_mediaSource) {
868 loadType = blink::WebMediaPlayer::LoadTypeMediaSource;
869
870 if (!m_mediaSource->attachToElement(this)) { 867 if (!m_mediaSource->attachToElement(this)) {
871 // Forget our reference to the MediaSource, so we leave it a lone 868 // Forget our reference to the MediaSource, so we leave it a lone
872 // while processing remainder of load failure. 869 // while processing remainder of load failure.
873 m_mediaSource = nullptr; 870 m_mediaSource = nullptr;
874 attemptLoad = false; 871 attemptLoad = false;
875 } 872 }
876 } 873 }
877 } 874 }
878 } 875 }
879 876
880 if (attemptLoad && canLoadURL(url, contentType, keySystem)) { 877 if (attemptLoad && canLoadURL(url, contentType, keySystem)) {
881 m_player->load(loadType, url); 878 ASSERT(!webMediaPlayer());
879
880 if (m_preload == MediaPlayer::None) {
881 m_delayingLoad = true;
philipj_slow 2014/03/08 19:38:40 http://www.whatwg.org/specs/web-apps/current-work/
acolwell GONE FROM CHROMIUM 2014/03/10 21:53:31 I just want to keep this CL as a simple move of ex
philipj_slow 2014/03/12 05:21:01 Sounds great!
882 } else {
883 m_player->load(loadType(), m_currentSrc, corsMode());
884 }
882 } else { 885 } else {
883 mediaLoadingFailed(MediaPlayer::FormatError); 886 mediaLoadingFailed(MediaPlayer::FormatError);
884 } 887 }
885 888
886 // If there is no poster to display, allow the media engine to render video frames as soon as 889 // If there is no poster to display, allow the media engine to render video frames as soon as
887 // they are available. 890 // they are available.
888 updateDisplayState(); 891 updateDisplayState();
889 892
890 if (renderer()) 893 if (renderer())
891 renderer()->updateFromElement(); 894 renderer()->updateFromElement();
(...skipping 782 matching lines...) Expand 10 before | Expand all | Expand 10 after
1674 { 1677 {
1675 return m_player ? m_player->supportsSave() : false; 1678 return m_player ? m_player->supportsSave() : false;
1676 } 1679 }
1677 1680
1678 void HTMLMediaElement::prepareToPlay() 1681 void HTMLMediaElement::prepareToPlay()
1679 { 1682 {
1680 WTF_LOG(Media, "HTMLMediaElement::prepareToPlay(%p)", this); 1683 WTF_LOG(Media, "HTMLMediaElement::prepareToPlay(%p)", this);
1681 if (m_havePreparedToPlay) 1684 if (m_havePreparedToPlay)
1682 return; 1685 return;
1683 m_havePreparedToPlay = true; 1686 m_havePreparedToPlay = true;
1684 m_player->prepareToPlay(); 1687
1688 if (m_delayingLoad)
1689 startDelayedLoad();
1685 } 1690 }
1686 1691
1687 void HTMLMediaElement::seek(double time, ExceptionState& exceptionState) 1692 void HTMLMediaElement::seek(double time, ExceptionState& exceptionState)
1688 { 1693 {
1689 WTF_LOG(Media, "HTMLMediaElement::seek(%f)", time); 1694 WTF_LOG(Media, "HTMLMediaElement::seek(%f)", time);
1690 1695
1691 // 4.8.10.9 Seeking 1696 // 4.8.10.9 Seeking
1692 1697
1693 // 1 - If the media element's readyState is HAVE_NOTHING, then raise an Inva lidStateError exception. 1698 // 1 - If the media element's readyState is HAVE_NOTHING, then raise an Inva lidStateError exception.
1694 if (m_readyState == HAVE_NOTHING || !m_player) { 1699 if (m_readyState == HAVE_NOTHING || !m_player) {
(...skipping 1437 matching lines...) Expand 10 before | Expand all | Expand 10 after
3132 m_audioSourceNode->unlock(); 3137 m_audioSourceNode->unlock();
3133 #endif 3138 #endif
3134 } 3139 }
3135 3140
3136 void HTMLMediaElement::clearMediaPlayer(int flags) 3141 void HTMLMediaElement::clearMediaPlayer(int flags)
3137 { 3142 {
3138 forgetResourceSpecificTracks(); 3143 forgetResourceSpecificTracks();
3139 3144
3140 closeMediaSource(); 3145 closeMediaSource();
3141 3146
3147 m_delayingLoad = false;
3148
3142 clearMediaPlayerAndAudioSourceProviderClient(); 3149 clearMediaPlayerAndAudioSourceProviderClient();
3143 3150
3144 stopPeriodicTimers(); 3151 stopPeriodicTimers();
3145 m_loadTimer.stop(); 3152 m_loadTimer.stop();
3146 3153
3147 m_pendingActionFlags &= ~flags; 3154 m_pendingActionFlags &= ~flags;
3148 m_loadState = WaitingForSource; 3155 m_loadState = WaitingForSource;
3149 3156
3150 if (m_textTracks) 3157 if (m_textTracks)
3151 configureTextTrackDisplay(AssumeNoVisibleChange); 3158 configureTextTrackDisplay(AssumeNoVisibleChange);
(...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after
3595 3602
3596 void HTMLMediaElement::applyMediaFragmentURI() 3603 void HTMLMediaElement::applyMediaFragmentURI()
3597 { 3604 {
3598 if (m_fragmentStartTime != MediaPlayer::invalidTime()) { 3605 if (m_fragmentStartTime != MediaPlayer::invalidTime()) {
3599 m_sentEndEvent = false; 3606 m_sentEndEvent = false;
3600 UseCounter::count(document(), UseCounter::HTMLMediaElementSeekToFragment Start); 3607 UseCounter::count(document(), UseCounter::HTMLMediaElementSeekToFragment Start);
3601 seek(m_fragmentStartTime, IGNORE_EXCEPTION); 3608 seek(m_fragmentStartTime, IGNORE_EXCEPTION);
3602 } 3609 }
3603 } 3610 }
3604 3611
3605 MediaPlayerClient::CORSMode HTMLMediaElement::mediaPlayerCORSMode() const 3612 WebMediaPlayer::CORSMode HTMLMediaElement::corsMode() const
3606 { 3613 {
3607 const AtomicString& crossOriginMode = fastGetAttribute(crossoriginAttr); 3614 const AtomicString& crossOriginMode = fastGetAttribute(crossoriginAttr);
3608 if (crossOriginMode.isNull()) 3615 if (crossOriginMode.isNull())
3609 return Unspecified; 3616 return WebMediaPlayer::CORSModeUnspecified;
3610 if (equalIgnoringCase(crossOriginMode, "use-credentials")) 3617 if (equalIgnoringCase(crossOriginMode, "use-credentials"))
3611 return UseCredentials; 3618 return WebMediaPlayer::CORSModeUseCredentials;
3612 return Anonymous; 3619 return WebMediaPlayer::CORSModeAnonymous;
3613 } 3620 }
3614 3621
3615 void HTMLMediaElement::mediaPlayerSetWebLayer(blink::WebLayer* webLayer) 3622 void HTMLMediaElement::mediaPlayerSetWebLayer(blink::WebLayer* webLayer)
3616 { 3623 {
3617 if (webLayer == m_webLayer) 3624 if (webLayer == m_webLayer)
3618 return; 3625 return;
3619 3626
3620 // If either of the layers is null we need to enable or disable compositing. This is done by triggering a style recalc. 3627 // If either of the layers is null we need to enable or disable compositing. This is done by triggering a style recalc.
3621 if (!m_webLayer || !webLayer) 3628 if (!m_webLayer || !webLayer)
3622 scheduleLayerUpdate(); 3629 scheduleLayerUpdate();
(...skipping 17 matching lines...) Expand all
3640 void HTMLMediaElement::mediaPlayerMediaSourceOpened(blink::WebMediaSource* webMe diaSource) 3647 void HTMLMediaElement::mediaPlayerMediaSourceOpened(blink::WebMediaSource* webMe diaSource)
3641 { 3648 {
3642 m_mediaSource->setWebMediaSourceAndOpen(adoptPtr(webMediaSource)); 3649 m_mediaSource->setWebMediaSourceAndOpen(adoptPtr(webMediaSource));
3643 } 3650 }
3644 3651
3645 bool HTMLMediaElement::isInteractiveContent() const 3652 bool HTMLMediaElement::isInteractiveContent() const
3646 { 3653 {
3647 return fastHasAttribute(controlsAttr); 3654 return fastHasAttribute(controlsAttr);
3648 } 3655 }
3649 3656
3657 void HTMLMediaElement::setPlayerPreload()
3658 {
3659 m_player->setPreload(m_preload);
philipj_slow 2014/03/08 19:38:40 I had to look for a while before I understood why
acolwell GONE FROM CHROMIUM 2014/03/10 21:53:31 Agreed. I was surprised about this as well especia
3660
3661 if (m_delayingLoad && m_preload != MediaPlayer::None)
3662 startDelayedLoad();
3650 } 3663 }
3664
3665 void HTMLMediaElement::startDelayedLoad()
3666 {
3667 ASSERT(m_delayingLoad);
3668
3669 m_delayingLoad = false;
3670
3671 m_player->load(loadType(), m_currentSrc, corsMode());
3672 }
3673
3674 WebMediaPlayer::LoadType HTMLMediaElement::loadType() const
philipj_slow 2014/03/08 19:38:40 Maybe move these functions up together with their
acolwell GONE FROM CHROMIUM 2014/03/10 21:53:31 Done.
3675 {
3676 if (m_mediaSource)
3677 return WebMediaPlayer::LoadTypeMediaSource;
3678
3679 if (isMediaStreamURL(m_currentSrc.string()))
3680 return WebMediaPlayer::LoadTypeMediaStream;
3681
3682 return WebMediaPlayer::LoadTypeURL;
3683 }
3684
3685 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698