Index: third_party/WebKit/Source/core/html/HTMLMediaElement.cpp |
diff --git a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp |
index 5a14ea40e1bed286a555021ffa380d58d79e775f..a091b899d24fb69894bdff796aa08f77eaced9ab 100644 |
--- a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp |
+++ b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp |
@@ -651,6 +651,16 @@ void HTMLMediaElement::setSrc(const AtomicString& url) |
setAttribute(srcAttr, url); |
} |
+void HTMLMediaElement::setSrcObjectURL(const AtomicString& url) |
+{ |
+ // The srcObject IDL attribute, on setting, must set the element's assigned |
+ // media provider object to the new value, and then invoke the element's |
+ // media element load algorithm. |
+ m_srcObjectURL = url; |
+ m_currentSrc = KURL(); |
+ invokeLoadAlgorithm(); |
+} |
+ |
HTMLMediaElement::NetworkState HTMLMediaElement::getNetworkState() const |
{ |
return m_networkState; |
@@ -858,68 +868,101 @@ void HTMLMediaElement::selectMediaResource() |
{ |
WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p)", this); |
- enum Mode { attribute, children }; |
- |
- // 3 - If the media element has a src attribute, then let mode be attribute. |
- Mode mode = attribute; |
- if (!fastHasAttribute(srcAttr)) { |
- // Otherwise, if the media element does not have a src attribute but has a source |
- // element child, then let mode be children and let candidate be the first such |
- // source element child in tree order. |
- if (HTMLSourceElement* element = Traversal<HTMLSourceElement>::firstChild(*this)) { |
- mode = children; |
- m_nextChildNodeToConsider = element; |
- m_currentSourceNode = nullptr; |
- } else { |
- // Otherwise the media element has neither a src attribute nor a source element |
- // child: set the networkState to NETWORK_EMPTY, and abort these steps; the |
- // synchronous section ends. |
- m_loadState = WaitingForSource; |
- setShouldDelayLoadEvent(false); |
- setNetworkState(NETWORK_EMPTY); |
- updateDisplayState(); |
+ enum Mode { Object, Attribute, Children, Nothing }; |
+ Mode mode = Nothing; |
+ |
+ // 6 - If the media element has an assigned media provider object, then let |
+ // mode be object. |
+ if (!m_srcObjectURL.isEmpty()) { |
+ mode = Object; |
+ } else if (fastHasAttribute(srcAttr)) { |
+ // Otherwise, if the media element has no assigned media provider object |
+ // but has a src attribute, then let mode be attribute. |
+ mode = Attribute; |
+ } else if (HTMLSourceElement* element = Traversal<HTMLSourceElement>::firstChild(*this)) { |
+ // Otherwise, if the media element does not have an assigned media |
+ // provider object and does not have a src attribute, but does have a |
+ // source element child, then let mode be children and let candidate be |
+ // the first such source element child in tree order. |
+ mode = Children; |
+ m_nextChildNodeToConsider = element; |
+ m_currentSourceNode = nullptr; |
+ } else { |
+ // Otherwise the media element has no assigned media provider object and |
+ // has neither a src attribute nor a source element child: set the |
+ // networkState to NETWORK_EMPTY, and abort these steps; the synchronous |
+ // section ends. |
+ m_loadState = WaitingForSource; |
+ setShouldDelayLoadEvent(false); |
+ setNetworkState(NETWORK_EMPTY); |
+ updateDisplayState(); |
- WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), nothing to load", this); |
- return; |
- } |
+ WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), nothing to load", this); |
+ return; |
} |
- // 4 - Set the media element's delaying-the-load-event flag to true (this delays the load event), |
- // and set its networkState to NETWORK_LOADING. |
- setShouldDelayLoadEvent(true); |
+ // 7 - Set the media element's networkState to NETWORK_LOADING. |
setNetworkState(NETWORK_LOADING); |
- // 5 - Queue a task to fire a simple event named loadstart at the media element. |
+ // 8 - Queue a task to fire a simple event named loadstart at the media element. |
scheduleEvent(EventTypeNames::loadstart); |
- // 6 - If mode is attribute, then run these substeps |
- if (mode == attribute) { |
- m_loadState = LoadingFromSrcAttr; |
+ // 9 - Run the appropriate steps... |
+ switch (mode) { |
+ case Object: |
+ loadSourceFromObject(); |
+ WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), using 'srcObject' attribute", this); |
+ break; |
+ case Attribute: |
+ loadSourceFromAttribute(); |
+ WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), using 'src' attribute url", this); |
+ break; |
+ case Children: |
+ loadNextSourceChild(); |
+ WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), using source element", this); |
+ break; |
+ default: |
+ ASSERT_NOT_REACHED(); |
+ } |
+} |
- const AtomicString& srcValue = fastGetAttribute(srcAttr); |
- // If the src attribute's value is the empty string ... jump down to the failed step below |
- if (srcValue.isEmpty()) { |
- mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); |
- WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), empty 'src'", this); |
- return; |
- } |
+void HTMLMediaElement::loadSourceFromObject() |
+{ |
+ ASSERT(!m_srcObjectURL.isEmpty()); |
+ m_loadState = LoadingFromSrcObject; |
+ loadSourceFromURL(m_srcObjectURL); |
+} |
- KURL mediaURL = document().completeURL(srcValue); |
- if (!isSafeToLoadURL(mediaURL, Complain)) { |
- mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); |
- return; |
- } |
+void HTMLMediaElement::loadSourceFromAttribute() |
+{ |
+ m_loadState = LoadingFromSrcAttr; |
+ const AtomicString& srcValue = fastGetAttribute(srcAttr); |
- // No type is available when the url comes from the 'src' attribute so MediaPlayer |
- // will have to pick a media engine based on the file extension. |
- ContentType contentType((String())); |
- loadResource(mediaURL, contentType); |
- WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), using 'src' attribute url", this); |
+ // If the src attribute's value is the empty string ... jump down to the failed step below |
+ if (srcValue.isEmpty()) { |
+ mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); |
+ WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), empty 'src'", this); |
+ return; |
+ } |
+ |
+ loadSourceFromURL(srcValue); |
+} |
+ |
+void HTMLMediaElement::loadSourceFromURL(const AtomicString& url) |
+{ |
+ m_loadState = LoadingFromSrcAttr; |
+ |
+ KURL mediaURL = document().completeURL(url); |
+ if (!isSafeToLoadURL(mediaURL, Complain)) { |
+ mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); |
return; |
} |
- // Otherwise, the source elements will be used |
- loadNextSourceChild(); |
+ // No type is available when the url comes from the 'src' or 'srcObject' |
+ // attribute so MediaPlayer will have to pick a media engine based on the |
+ // file extension. |
+ ContentType contentType((String())); |
+ loadResource(mediaURL, contentType); |
} |
void HTMLMediaElement::loadNextSourceChild() |