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

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

Issue 545933002: Implement HTMLMediaElement::srcObject. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Addressed sofs easy comments. 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
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 30 matching lines...) Expand all
41 #include "core/frame/LocalFrame.h" 41 #include "core/frame/LocalFrame.h"
42 #include "core/frame/Settings.h" 42 #include "core/frame/Settings.h"
43 #include "core/frame/UseCounter.h" 43 #include "core/frame/UseCounter.h"
44 #include "core/frame/csp/ContentSecurityPolicy.h" 44 #include "core/frame/csp/ContentSecurityPolicy.h"
45 #include "core/html/HTMLMediaSource.h" 45 #include "core/html/HTMLMediaSource.h"
46 #include "core/html/HTMLSourceElement.h" 46 #include "core/html/HTMLSourceElement.h"
47 #include "core/html/HTMLTrackElement.h" 47 #include "core/html/HTMLTrackElement.h"
48 #include "core/html/MediaController.h" 48 #include "core/html/MediaController.h"
49 #include "core/html/MediaError.h" 49 #include "core/html/MediaError.h"
50 #include "core/html/MediaFragmentURIParser.h" 50 #include "core/html/MediaFragmentURIParser.h"
51 #include "core/html/MediaProvider.h"
51 #include "core/html/TimeRanges.h" 52 #include "core/html/TimeRanges.h"
52 #include "core/html/shadow/MediaControls.h" 53 #include "core/html/shadow/MediaControls.h"
53 #include "core/html/track/AudioTrack.h" 54 #include "core/html/track/AudioTrack.h"
54 #include "core/html/track/AudioTrackList.h" 55 #include "core/html/track/AudioTrackList.h"
55 #include "core/html/track/InbandTextTrack.h" 56 #include "core/html/track/InbandTextTrack.h"
56 #include "core/html/track/TextTrackCueList.h" 57 #include "core/html/track/TextTrackCueList.h"
57 #include "core/html/track/TextTrackList.h" 58 #include "core/html/track/TextTrackList.h"
58 #include "core/html/track/VideoTrack.h" 59 #include "core/html/track/VideoTrack.h"
59 #include "core/html/track/VideoTrackList.h" 60 #include "core/html/track/VideoTrackList.h"
60 #include "core/loader/FrameLoader.h" 61 #include "core/loader/FrameLoader.h"
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 , m_networkState(NETWORK_EMPTY) 319 , m_networkState(NETWORK_EMPTY)
319 , m_readyState(HAVE_NOTHING) 320 , m_readyState(HAVE_NOTHING)
320 , m_readyStateMaximum(HAVE_NOTHING) 321 , m_readyStateMaximum(HAVE_NOTHING)
321 , m_volume(1.0f) 322 , m_volume(1.0f)
322 , m_lastSeekTime(0) 323 , m_lastSeekTime(0)
323 , m_previousProgressTime(std::numeric_limits<double>::max()) 324 , m_previousProgressTime(std::numeric_limits<double>::max())
324 , m_duration(std::numeric_limits<double>::quiet_NaN()) 325 , m_duration(std::numeric_limits<double>::quiet_NaN())
325 , m_lastTimeUpdateEventWallTime(0) 326 , m_lastTimeUpdateEventWallTime(0)
326 , m_defaultPlaybackStartPosition(0) 327 , m_defaultPlaybackStartPosition(0)
327 , m_loadState(WaitingForSource) 328 , m_loadState(WaitingForSource)
329 , m_srcObject(nullptr)
328 , m_deferredLoadState(NotDeferred) 330 , m_deferredLoadState(NotDeferred)
329 , m_deferredLoadTimer(this, &HTMLMediaElement::deferredLoadTimerFired) 331 , m_deferredLoadTimer(this, &HTMLMediaElement::deferredLoadTimerFired)
330 , m_webLayer(0) 332 , m_webLayer(0)
331 , m_preload(MediaPlayer::Auto) 333 , m_preload(MediaPlayer::Auto)
332 , m_displayMode(Unknown) 334 , m_displayMode(Unknown)
333 , m_cachedTime(MediaPlayer::invalidTime()) 335 , m_cachedTime(MediaPlayer::invalidTime())
334 , m_fragmentStartTime(MediaPlayer::invalidTime()) 336 , m_fragmentStartTime(MediaPlayer::invalidTime())
335 , m_fragmentEndTime(MediaPlayer::invalidTime()) 337 , m_fragmentEndTime(MediaPlayer::invalidTime())
336 , m_pendingActionFlags(0) 338 , m_pendingActionFlags(0)
337 , m_userGestureRequiredForPlay(false) 339 , m_userGestureRequiredForPlay(false)
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
672 } 674 }
673 675
674 m_pendingActionFlags = 0; 676 m_pendingActionFlags = 0;
675 } 677 }
676 678
677 PassRefPtrWillBeRawPtr<MediaError> HTMLMediaElement::error() const 679 PassRefPtrWillBeRawPtr<MediaError> HTMLMediaElement::error() const
678 { 680 {
679 return m_error; 681 return m_error;
680 } 682 }
681 683
684 MediaProvider* HTMLMediaElement::srcObject() const
685 {
686 return m_srcObject.get();
687 }
688
689 void HTMLMediaElement::setSrcObject(MediaProvider* mediaProvider)
690 {
691 WTF_LOG(Media, "HTMLMediaElement::setSrcObject(%p)", this);
692 m_srcObject = mediaProvider;
693 clearMediaPlayer(LoadMediaResource);
694 load();
695 }
696
682 void HTMLMediaElement::setSrc(const AtomicString& url) 697 void HTMLMediaElement::setSrc(const AtomicString& url)
683 { 698 {
684 setAttribute(srcAttr, url); 699 setAttribute(srcAttr, url);
685 } 700 }
686 701
687 HTMLMediaElement::NetworkState HTMLMediaElement::networkState() const 702 HTMLMediaElement::NetworkState HTMLMediaElement::networkState() const
688 { 703 {
689 return m_networkState; 704 return m_networkState;
690 } 705 }
691 706
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
843 } 858 }
844 } 859 }
845 860
846 selectMediaResource(); 861 selectMediaResource();
847 } 862 }
848 863
849 void HTMLMediaElement::selectMediaResource() 864 void HTMLMediaElement::selectMediaResource()
850 { 865 {
851 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p)", this); 866 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p)", this);
852 867
853 enum Mode { attribute, children }; 868 enum Mode { Object, Attribute, Children };
854 869
855 // 3 - If the media element has a src attribute, then let mode be attribute. 870 // 6 - If the media element has an assigned media provider object, then let mode be object.
856 Mode mode = attribute; 871 Mode mode;
857 if (!fastHasAttribute(srcAttr)) { 872 if (srcObject()) {
858 // Otherwise, if the media element does not have a src attribute but has a source 873 mode = Object;
859 // element child, then let mode be children and let candidate be the fir st such 874 } else if (fastHasAttribute(srcAttr)) {
860 // source element child in tree order. 875 // Otherwise, if the media element has no assigned media provider object but has a src attribute, then let mode be attribute.
861 if (HTMLSourceElement* element = Traversal<HTMLSourceElement>::firstChil d(*this)) { 876 mode = Attribute;
862 mode = children; 877 } else if (Traversal<HTMLSourceElement>::firstChild(*this)) {
863 m_nextChildNodeToConsider = element; 878 // Otherwise, if the media element does not have an assigned media provi der object and does not have a src attribute,
864 m_currentSourceNode = nullptr; 879 // but does have a source element child, then let mode be children and l et candidate be the first such source element child in tree order.
865 } else { 880 mode = Children;
866 // Otherwise the media element has neither a src attribute nor a sou rce element 881 HTMLSourceElement* element = Traversal<HTMLSourceElement>::firstChild(*t his);
867 // child: set the networkState to NETWORK_EMPTY, and abort these ste ps; the 882 m_nextChildNodeToConsider = element;
868 // synchronous section ends. 883 m_currentSourceNode = nullptr;
869 m_loadState = WaitingForSource; 884 } else {
870 setShouldDelayLoadEvent(false); 885 // Otherwise the media element has no source.
871 m_networkState = NETWORK_EMPTY; 886 // set the networkState to NETWORK_EMPTY, and abort these steps; the
887 // synchronous section ends.
888 m_loadState = WaitingForSource;
889 setShouldDelayLoadEvent(false);
890 m_networkState = NETWORK_EMPTY;
872 891
873 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), nothing t o load", this); 892 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), nothing to lo ad", this);
874 return; 893 return;
875 }
876 } 894 }
877 895
878 // 4 - Set the media element's delaying-the-load-event flag to true (this de lays the load event), 896 // 7 - Set the media element's delaying-the-load-event flag to true (this de lays the load event),
879 // and set its networkState to NETWORK_LOADING. 897 // and set its networkState to NETWORK_LOADING.
880 setShouldDelayLoadEvent(true); 898 setShouldDelayLoadEvent(true);
881 m_networkState = NETWORK_LOADING; 899 m_networkState = NETWORK_LOADING;
882 900
883 // 5 - Queue a task to fire a simple event named loadstart at the media elem ent. 901 // 8 - Queue a task to fire a simple event named loadstart at the media elem ent.
884 scheduleEvent(EventTypeNames::loadstart); 902 scheduleEvent(EventTypeNames::loadstart);
885 903
886 // 6 - If mode is attribute, then run these substeps 904 // 9 - Run the appropriate steps from the following list.
887 if (mode == attribute) { 905 switch (mode) {
888 m_loadState = LoadingFromSrcAttr; 906 case Object:
907 loadFromObject();
908 break;
909 case Attribute:
910 loadFromAttribute();
911 break;
912 case Children:
913 loadNextSourceChild();
914 break;
915 }
916 }
889 917
890 // If the src attribute's value is the empty string ... jump down to the failed step below 918 void HTMLMediaElement::loadFromObject()
891 KURL mediaURL = getNonEmptyURLAttribute(srcAttr); 919 {
892 if (mediaURL.isEmpty()) { 920 m_loadState = LoadingFromSrcObject;
893 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError);
894 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), empty 'sr c'", this);
895 return;
896 }
897 921
898 if (!isSafeToLoadURL(mediaURL, Complain)) { 922 KURL mediaURL = document().completeURL(m_srcObject->getObjectUrl());
899 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); 923 ASSERT(isSafeToLoadURL(mediaURL, Complain));
900 return;
901 }
902 924
903 // No type or key system information is available when the url comes 925 loadResource(mediaURL);
904 // from the 'src' attribute so MediaPlayer 926
905 // will have to pick a media engine based on the file extension. 927 // Set the currentSrc attribute to the empty string.
906 ContentType contentType((String())); 928 // FIXME |m_currentSrc| is set in loadResource and then reset here. The reas on is that MediaProviders currently
907 loadResource(mediaURL, contentType, String()); 929 // uses a url for loading, and uses the same algorithm as if the src attribu te is set with createObjectURL.
908 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), using 'src' a ttribute url", this); 930 m_currentSrc = KURL();
931 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource, using 'srcObject' att ribute.");
932 return;
933 }
934
935 void HTMLMediaElement::loadFromAttribute()
936 {
937 m_loadState = LoadingFromSrcAttr;
938
939 // If the src attribute's value is the empty string ... jump down to the fai led step below
940 KURL mediaURL = getNonEmptyURLAttribute(srcAttr);
941 if (mediaURL.isEmpty()) {
942 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError);
943 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), empty 'src'", this);
909 return; 944 return;
910 } 945 }
911 946
912 // Otherwise, the source elements will be used 947 if (!isSafeToLoadURL(mediaURL, Complain)) {
913 loadNextSourceChild(); 948 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError);
949 return;
950 }
951
952 loadResource(mediaURL);
953 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), using 'src' attri bute url", this);
954 return;
914 } 955 }
915 956
916 void HTMLMediaElement::loadNextSourceChild() 957 void HTMLMediaElement::loadNextSourceChild()
917 { 958 {
918 ContentType contentType((String())); 959 ContentType contentType(emptyString());
919 String keySystem; 960 String keySystem;
920 KURL mediaURL = selectNextSourceChild(&contentType, &keySystem, Complain); 961 KURL mediaURL = selectNextSourceChild(&contentType, &keySystem, Complain);
921 if (!mediaURL.isValid()) { 962 if (!mediaURL.isValid()) {
922 waitForSourceChange(); 963 waitForSourceChange();
923 return; 964 return;
924 } 965 }
925 966
926 // Recreate the media player for the new url 967 // Recreate the media player for the new url
927 createMediaPlayer(); 968 createMediaPlayer();
928 969
929 m_loadState = LoadingFromSourceElement; 970 m_loadState = LoadingFromSourceElement;
930 loadResource(mediaURL, contentType, keySystem); 971 loadResource(mediaURL, contentType, keySystem);
931 } 972 }
932 973
974 void HTMLMediaElement::loadResource(const KURL& url)
975 {
976 // No type or key system information is available when the url comes
977 // from the 'src' attribute or a srcObject.
978 ContentType contentType(emptyString());
979 loadResource(url, contentType, String());
980 }
981
933 void HTMLMediaElement::loadResource(const KURL& url, ContentType& contentType, c onst String& keySystem) 982 void HTMLMediaElement::loadResource(const KURL& url, ContentType& contentType, c onst String& keySystem)
934 { 983 {
935 ASSERT(isSafeToLoadURL(url, Complain)); 984 ASSERT(isSafeToLoadURL(url, Complain));
936 985
937 WTF_LOG(Media, "HTMLMediaElement::loadResource(%p, %s, %s, %s)", this, urlFo rLoggingMedia(url).utf8().data(), contentType.raw().utf8().data(), keySystem.utf 8().data()); 986 WTF_LOG(Media, "HTMLMediaElement::loadResource(%p, %s, %s, %s)", this, urlFo rLoggingMedia(url).utf8().data(), contentType.raw().utf8().data(), keySystem.utf 8().data());
938 987
939 LocalFrame* frame = document().frame(); 988 LocalFrame* frame = document().frame();
940 if (!frame) { 989 if (!frame) {
941 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); 990 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError);
942 return; 991 return;
(...skipping 2981 matching lines...) Expand 10 before | Expand all | Expand 10 after
3924 mediaControls()->mediaElementFocused(); 3973 mediaControls()->mediaElementFocused();
3925 } 3974 }
3926 HTMLElement::defaultEventHandler(event); 3975 HTMLElement::defaultEventHandler(event);
3927 } 3976 }
3928 3977
3929 void HTMLMediaElement::trace(Visitor* visitor) 3978 void HTMLMediaElement::trace(Visitor* visitor)
3930 { 3979 {
3931 visitor->trace(m_playedTimeRanges); 3980 visitor->trace(m_playedTimeRanges);
3932 visitor->trace(m_asyncEventQueue); 3981 visitor->trace(m_asyncEventQueue);
3933 visitor->trace(m_error); 3982 visitor->trace(m_error);
3983 visitor->trace(m_srcObject);
3934 visitor->trace(m_currentSourceNode); 3984 visitor->trace(m_currentSourceNode);
3935 visitor->trace(m_nextChildNodeToConsider); 3985 visitor->trace(m_nextChildNodeToConsider);
3936 visitor->trace(m_mediaSource); 3986 visitor->trace(m_mediaSource);
3937 visitor->trace(m_audioTracks); 3987 visitor->trace(m_audioTracks);
3938 visitor->trace(m_videoTracks); 3988 visitor->trace(m_videoTracks);
3939 visitor->trace(m_textTracks); 3989 visitor->trace(m_textTracks);
3940 visitor->trace(m_textTracksWhenResourceSelectionBegan); 3990 visitor->trace(m_textTracksWhenResourceSelectionBegan);
3941 visitor->trace(m_mediaController); 3991 visitor->trace(m_mediaController);
3942 #if ENABLE(WEB_AUDIO) 3992 #if ENABLE(WEB_AUDIO)
3943 visitor->registerWeakMembers<HTMLMediaElement, &HTMLMediaElement::clearWeakM embers>(this); 3993 visitor->registerWeakMembers<HTMLMediaElement, &HTMLMediaElement::clearWeakM embers>(this);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
3976 4026
3977 #if ENABLE(WEB_AUDIO) 4027 #if ENABLE(WEB_AUDIO)
3978 void HTMLMediaElement::clearWeakMembers(Visitor* visitor) 4028 void HTMLMediaElement::clearWeakMembers(Visitor* visitor)
3979 { 4029 {
3980 if (!visitor->isAlive(m_audioSourceNode) && audioSourceProvider()) 4030 if (!visitor->isAlive(m_audioSourceNode) && audioSourceProvider())
3981 audioSourceProvider()->setClient(0); 4031 audioSourceProvider()->setClient(0);
3982 } 4032 }
3983 #endif 4033 #endif
3984 4034
3985 } 4035 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698