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 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
45 #include "core/frame/UseCounter.h" | 45 #include "core/frame/UseCounter.h" |
46 #include "core/frame/csp/ContentSecurityPolicy.h" | 46 #include "core/frame/csp/ContentSecurityPolicy.h" |
47 #include "core/html/HTMLMediaSource.h" | 47 #include "core/html/HTMLMediaSource.h" |
48 #include "core/html/HTMLSourceElement.h" | 48 #include "core/html/HTMLSourceElement.h" |
49 #include "core/html/HTMLTrackElement.h" | 49 #include "core/html/HTMLTrackElement.h" |
50 #include "core/html/MediaController.h" | 50 #include "core/html/MediaController.h" |
51 #include "core/html/MediaError.h" | 51 #include "core/html/MediaError.h" |
52 #include "core/html/MediaFragmentURIParser.h" | 52 #include "core/html/MediaFragmentURIParser.h" |
53 #include "core/html/TimeRanges.h" | 53 #include "core/html/TimeRanges.h" |
54 #include "core/html/shadow/MediaControls.h" | 54 #include "core/html/shadow/MediaControls.h" |
55 #include "core/html/track/AudioTrack.h" | |
56 #include "core/html/track/AudioTrackList.h" | |
55 #include "core/html/track/InbandTextTrack.h" | 57 #include "core/html/track/InbandTextTrack.h" |
56 #include "core/html/track/TextTrackCueList.h" | 58 #include "core/html/track/TextTrackCueList.h" |
57 #include "core/html/track/TextTrackList.h" | 59 #include "core/html/track/TextTrackList.h" |
60 #include "core/html/track/VideoTrack.h" | |
61 #include "core/html/track/VideoTrackList.h" | |
58 #include "core/loader/FrameLoader.h" | 62 #include "core/loader/FrameLoader.h" |
59 #include "core/rendering/RenderVideo.h" | 63 #include "core/rendering/RenderVideo.h" |
60 #include "core/rendering/RenderView.h" | 64 #include "core/rendering/RenderView.h" |
61 #include "core/rendering/compositing/RenderLayerCompositor.h" | 65 #include "core/rendering/compositing/RenderLayerCompositor.h" |
62 #include "platform/ContentType.h" | 66 #include "platform/ContentType.h" |
63 #include "platform/Language.h" | 67 #include "platform/Language.h" |
64 #include "platform/Logging.h" | 68 #include "platform/Logging.h" |
65 #include "platform/MIMETypeFromURL.h" | 69 #include "platform/MIMETypeFromURL.h" |
66 #include "platform/MIMETypeRegistry.h" | 70 #include "platform/MIMETypeRegistry.h" |
67 #include "platform/NotImplemented.h" | 71 #include "platform/NotImplemented.h" |
(...skipping 10 matching lines...) Expand all Loading... | |
78 #include "wtf/text/CString.h" | 82 #include "wtf/text/CString.h" |
79 | 83 |
80 #if ENABLE(WEB_AUDIO) | 84 #if ENABLE(WEB_AUDIO) |
81 #include "platform/audio/AudioSourceProvider.h" | 85 #include "platform/audio/AudioSourceProvider.h" |
82 #include "modules/webaudio/MediaElementAudioSourceNode.h" | 86 #include "modules/webaudio/MediaElementAudioSourceNode.h" |
83 #endif | 87 #endif |
84 | 88 |
85 using namespace std; | 89 using namespace std; |
86 using blink::WebInbandTextTrack; | 90 using blink::WebInbandTextTrack; |
87 using blink::WebMimeRegistry; | 91 using blink::WebMimeRegistry; |
92 using blink::WebMediaPlayerClient; | |
88 | 93 |
89 namespace WebCore { | 94 namespace WebCore { |
90 | 95 |
91 #if !LOG_DISABLED | 96 #if !LOG_DISABLED |
92 static String urlForLoggingMedia(const KURL& url) | 97 static String urlForLoggingMedia(const KURL& url) |
93 { | 98 { |
94 static const unsigned maximumURLLengthForLogging = 128; | 99 static const unsigned maximumURLLengthForLogging = 128; |
95 | 100 |
96 if (url.string().length() < maximumURLLengthForLogging) | 101 if (url.string().length() < maximumURLLengthForLogging) |
97 return url.string(); | 102 return url.string(); |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
156 ~TrackDisplayUpdateScope() | 161 ~TrackDisplayUpdateScope() |
157 { | 162 { |
158 ASSERT(m_mediaElement); | 163 ASSERT(m_mediaElement); |
159 m_mediaElement->endIgnoringTrackDisplayUpdateRequests(); | 164 m_mediaElement->endIgnoringTrackDisplayUpdateRequests(); |
160 } | 165 } |
161 | 166 |
162 private: | 167 private: |
163 HTMLMediaElement* m_mediaElement; | 168 HTMLMediaElement* m_mediaElement; |
164 }; | 169 }; |
165 | 170 |
171 static const AtomicString& VideoKindToString(WebMediaPlayerClient::VideoTrackKin d kind) | |
172 { | |
173 switch (kind) { | |
174 case WebMediaPlayerClient::VideoTrackKindNone: | |
175 return emptyAtom; | |
176 case WebMediaPlayerClient::VideoTrackKindAlternative: | |
177 return VideoTrack::alternativeKeyword(); | |
178 case WebMediaPlayerClient::VideoTrackKindCaptions: | |
179 return VideoTrack::captionsKeyword(); | |
180 case WebMediaPlayerClient::VideoTrackKindMain: | |
181 return VideoTrack::mainKeyword(); | |
182 case WebMediaPlayerClient::VideoTrackKindSign: | |
183 return VideoTrack::signKeyword(); | |
184 case WebMediaPlayerClient::VideoTrackKindSubtitles: | |
185 return VideoTrack::subtitlesKeyword(); | |
186 case WebMediaPlayerClient::VideoTrackKindCommentary: | |
187 return VideoTrack::commentaryKeyword(); | |
188 } | |
189 | |
190 ASSERT_NOT_REACHED(); | |
191 return emptyAtom; | |
192 } | |
193 | |
194 static const AtomicString& AudioKindToString(WebMediaPlayerClient::AudioTrackKin d kind) | |
195 { | |
196 switch (kind) { | |
197 case WebMediaPlayerClient::AudioTrackKindNone: | |
198 return emptyAtom; | |
199 case WebMediaPlayerClient::AudioTrackKindAlternative: | |
200 return AudioTrack::alternativeKeyword(); | |
201 case WebMediaPlayerClient::AudioTrackKindDescriptions: | |
202 return AudioTrack::descriptionsKeyword(); | |
203 case WebMediaPlayerClient::AudioTrackKindMain: | |
204 return AudioTrack::mainKeyword(); | |
205 case WebMediaPlayerClient::AudioTrackKindMainDescriptions: | |
206 return AudioTrack::mainDescriptionsKeyword(); | |
207 case WebMediaPlayerClient::AudioTrackKindTranslation: | |
208 return AudioTrack::translationKeyword(); | |
209 case WebMediaPlayerClient::AudioTrackKindCommentary: | |
210 return AudioTrack::commentaryKeyword(); | |
211 } | |
212 | |
213 ASSERT_NOT_REACHED(); | |
214 return emptyAtom; | |
215 } | |
216 | |
166 static bool canLoadURL(const KURL& url, const ContentType& contentType, const St ring& keySystem) | 217 static bool canLoadURL(const KURL& url, const ContentType& contentType, const St ring& keySystem) |
167 { | 218 { |
168 DEFINE_STATIC_LOCAL(const String, codecs, ("codecs")); | 219 DEFINE_STATIC_LOCAL(const String, codecs, ("codecs")); |
169 | 220 |
170 String contentMIMEType = contentType.type().lower(); | 221 String contentMIMEType = contentType.type().lower(); |
171 String contentTypeCodecs = contentType.parameter(codecs); | 222 String contentTypeCodecs = contentType.parameter(codecs); |
172 | 223 |
173 // If the MIME type is missing or is not meaningful, try to figure it out fr om the URL. | 224 // If the MIME type is missing or is not meaningful, try to figure it out fr om the URL. |
174 if (contentMIMEType.isEmpty() || contentMIMEType == "application/octet-strea m" || contentMIMEType == "text/plain") { | 225 if (contentMIMEType.isEmpty() || contentMIMEType == "application/octet-strea m" || contentMIMEType == "text/plain") { |
175 if (url.protocolIsData()) | 226 if (url.protocolIsData()) |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
302 { | 353 { |
303 WTF_LOG(Media, "HTMLMediaElement::~HTMLMediaElement"); | 354 WTF_LOG(Media, "HTMLMediaElement::~HTMLMediaElement"); |
304 | 355 |
305 m_asyncEventQueue->close(); | 356 m_asyncEventQueue->close(); |
306 | 357 |
307 setShouldDelayLoadEvent(false); | 358 setShouldDelayLoadEvent(false); |
308 | 359 |
309 if (m_textTracks) | 360 if (m_textTracks) |
310 m_textTracks->clearOwner(); | 361 m_textTracks->clearOwner(); |
311 | 362 |
363 if (m_audioTracks) | |
364 m_audioTracks->shutdown(); | |
365 | |
366 if (m_videoTracks) | |
367 m_videoTracks->shutdown(); | |
368 | |
312 if (m_mediaController) { | 369 if (m_mediaController) { |
313 m_mediaController->removeMediaElement(this); | 370 m_mediaController->removeMediaElement(this); |
314 m_mediaController = nullptr; | 371 m_mediaController = nullptr; |
315 } | 372 } |
316 | 373 |
317 closeMediaSource(); | 374 closeMediaSource(); |
318 | 375 |
319 removeElementFromDocumentMap(this, &document()); | 376 removeElementFromDocumentMap(this, &document()); |
320 | 377 |
321 // Destroying the player may cause a resource load to be canceled, | 378 // Destroying the player may cause a resource load to be canceled, |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
361 // previous document. A proper fix would provide a mechanism to allow this | 418 // previous document. A proper fix would provide a mechanism to allow this |
362 // object to refresh the MediaPlayer's LocalFrame and FrameLoader references on | 419 // object to refresh the MediaPlayer's LocalFrame and FrameLoader references on |
363 // document changes so that playback can be resumed properly. | 420 // document changes so that playback can be resumed properly. |
364 userCancelledLoad(); | 421 userCancelledLoad(); |
365 | 422 |
366 // Decrement the load event delay count on oldDocument now that m_player has been destroyed | 423 // Decrement the load event delay count on oldDocument now that m_player has been destroyed |
367 // and there is no risk of dispatching a load event from within the destruct or. | 424 // and there is no risk of dispatching a load event from within the destruct or. |
368 oldDocument.decrementLoadEventDelayCount(); | 425 oldDocument.decrementLoadEventDelayCount(); |
369 | 426 |
370 ActiveDOMObject::didMoveToNewExecutionContext(&document()); | 427 ActiveDOMObject::didMoveToNewExecutionContext(&document()); |
428 | |
429 // Notify track lists so they don't stop firing events when moved to a new d ocument | |
430 // and the original document gets destroyed. | |
431 if (m_audioTracks) | |
432 m_audioTracks->didMoveToNewExecutionContext(&document()); | |
433 | |
434 if (m_videoTracks) | |
435 m_videoTracks->didMoveToNewExecutionContext(&document()); | |
436 | |
371 HTMLElement::didMoveToNewDocument(oldDocument); | 437 HTMLElement::didMoveToNewDocument(oldDocument); |
372 } | 438 } |
373 | 439 |
374 bool HTMLMediaElement::hasCustomFocusLogic() const | 440 bool HTMLMediaElement::hasCustomFocusLogic() const |
375 { | 441 { |
376 return true; | 442 return true; |
377 } | 443 } |
378 | 444 |
379 bool HTMLMediaElement::supportsFocus() const | 445 bool HTMLMediaElement::supportsFocus() const |
380 { | 446 { |
(...skipping 1178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1559 finishSeek(); | 1625 finishSeek(); |
1560 } else { | 1626 } else { |
1561 if (wasPotentiallyPlaying && m_readyState < HAVE_FUTURE_DATA) { | 1627 if (wasPotentiallyPlaying && m_readyState < HAVE_FUTURE_DATA) { |
1562 // 4.8.10.8 | 1628 // 4.8.10.8 |
1563 scheduleTimeupdateEvent(false); | 1629 scheduleTimeupdateEvent(false); |
1564 scheduleEvent(EventTypeNames::waiting); | 1630 scheduleEvent(EventTypeNames::waiting); |
1565 } | 1631 } |
1566 } | 1632 } |
1567 | 1633 |
1568 if (m_readyState >= HAVE_METADATA && oldState < HAVE_METADATA) { | 1634 if (m_readyState >= HAVE_METADATA && oldState < HAVE_METADATA) { |
1635 createPlaceholderTracksIfNecessary(); | |
1636 | |
1569 prepareMediaFragmentURI(); | 1637 prepareMediaFragmentURI(); |
1638 | |
1639 selectInitialTracksIfNecessary(); | |
1640 | |
1570 scheduleEvent(EventTypeNames::durationchange); | 1641 scheduleEvent(EventTypeNames::durationchange); |
1571 if (isVideo()) | 1642 if (isVideo()) |
1572 scheduleEvent(EventTypeNames::resize); | 1643 scheduleEvent(EventTypeNames::resize); |
1573 scheduleEvent(EventTypeNames::loadedmetadata); | 1644 scheduleEvent(EventTypeNames::loadedmetadata); |
1574 if (hasMediaControls()) | 1645 if (hasMediaControls()) |
1575 mediaControls()->reset(); | 1646 mediaControls()->reset(); |
1576 if (renderer()) | 1647 if (renderer()) |
1577 renderer()->updateFromElement(); | 1648 renderer()->updateFromElement(); |
1578 } | 1649 } |
1579 | 1650 |
(...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2182 m_lastTimeUpdateEventWallTime = now; | 2253 m_lastTimeUpdateEventWallTime = now; |
2183 m_lastTimeUpdateEventMovieTime = movieTime; | 2254 m_lastTimeUpdateEventMovieTime = movieTime; |
2184 } | 2255 } |
2185 } | 2256 } |
2186 | 2257 |
2187 bool HTMLMediaElement::canPlay() const | 2258 bool HTMLMediaElement::canPlay() const |
2188 { | 2259 { |
2189 return paused() || ended() || m_readyState < HAVE_METADATA; | 2260 return paused() || ended() || m_readyState < HAVE_METADATA; |
2190 } | 2261 } |
2191 | 2262 |
2263 AudioTrackList& HTMLMediaElement::audioTracks() | |
2264 { | |
2265 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); | |
2266 | |
2267 if (!m_audioTracks) | |
2268 m_audioTracks = AudioTrackList::create(this); | |
2269 | |
2270 return *m_audioTracks; | |
2271 } | |
2272 | |
2273 void HTMLMediaElement::audioTrackChanged(const AtomicString& audioTrackID, bool enabled) | |
2274 { | |
2275 WTF_LOG(Media, "HTMLMediaElement::audioTrackChanged('%s', %d)", audioTrackID .ascii().data(), enabled); | |
2276 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); | |
2277 ASSERT(!audioTrackID.isEmpty()); | |
2278 | |
2279 audioTracks().scheduleChangeEvent(); | |
2280 | |
2281 // FIXME: Add call on m_mediaSource to notify it of track changes once the S ourceBuffer.audioTracks attribute is added. | |
2282 | |
2283 if (webMediaPlayer()) | |
2284 webMediaPlayer()->enabledAudioTrackChange(audioTrackID, enabled); | |
2285 } | |
2286 | |
2287 VideoTrackList& HTMLMediaElement::videoTracks() | |
2288 { | |
2289 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); | |
2290 | |
2291 if (!m_videoTracks) | |
2292 m_videoTracks = VideoTrackList::create(this); | |
2293 | |
2294 return *m_videoTracks; | |
2295 } | |
2296 | |
2297 void HTMLMediaElement::selectedVideoTrackChanged(const AtomicString& selectedTra ckID) | |
2298 { | |
2299 WTF_LOG(Media, "HTMLMediaElement::selectedVideoTrackChanged('%s')", selected TrackID.ascii().data()); | |
2300 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); | |
2301 | |
2302 AtomicString unselectedTrackID; | |
2303 | |
2304 int oldSelectedIndex = videoTracks().selectedIndex(); | |
2305 if (oldSelectedIndex != -1) | |
2306 unselectedTrackID = videoTracks().anonymousIndexedGetter(oldSelectedInde x)->id(); | |
2307 | |
2308 ASSERT(unselectedTrackID != selectedTrackID); | |
2309 | |
2310 videoTracks().trackSelected(selectedTrackID); | |
2311 | |
2312 // FIXME: Add call on m_mediaSource to notify it of track changes once the S ourceBuffer.videoTracks attribute is added. | |
2313 | |
2314 ASSERT(!unselectedTrackID.isEmpty() || !selectedTrackID.isEmpty()); | |
2315 | |
2316 if (webMediaPlayer()) | |
2317 webMediaPlayer()->selectedVideoTrackChange(unselectedTrackID, selectedTr ackID); | |
2318 } | |
2319 | |
2320 void HTMLMediaElement::addVideoTrack(const AtomicString& id, blink::WebMediaPlay erClient::VideoTrackKind kind, const AtomicString& label, const AtomicString& la nguage, bool selected) | |
2321 { | |
2322 AtomicString kindString = VideoKindToString(kind); | |
2323 WTF_LOG(Media, "HTMLMediaElement::addVideoTrack('%s', '%s', '%s', '%s', %d)" , | |
2324 id.ascii().data(), kindString.ascii().data(), label.ascii().data(), lang uage.ascii().data(), selected); | |
2325 ASSERT(!id.isEmpty()); | |
2326 | |
2327 RefPtr<VideoTrack> videoTrack = VideoTrack::create(this, id, kindString, lab el, language); | |
2328 videoTracks().add(videoTrack.get()); | |
2329 | |
2330 if (selected) | |
2331 videoTrack->setSelected(true); | |
2332 } | |
2333 | |
2334 void HTMLMediaElement::removeVideoTrack(const AtomicString& id) | |
2335 { | |
2336 WTF_LOG(Media, "HTMLMediaElement::removeVideoTrack('%s')", id.ascii().data() ); | |
2337 ASSERT(!id.isEmpty()); | |
2338 | |
2339 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) | |
2340 return; | |
2341 | |
2342 videoTracks().remove(id); | |
2343 } | |
2344 | |
2345 void HTMLMediaElement::addAudioTrack(const AtomicString& id, blink::WebMediaPlay erClient::AudioTrackKind kind, const AtomicString& label, const AtomicString& la nguage, bool enabled) | |
2346 { | |
2347 AtomicString kindString = AudioKindToString(kind); | |
2348 WTF_LOG(Media, "HTMLMediaElement::addAudioTrack('%s', '%s', '%s', '%s', %d)" , | |
2349 id.ascii().data(), kindString.ascii().data(), label.ascii().data(), lang uage.ascii().data(), enabled); | |
2350 ASSERT(!id.isEmpty()); | |
2351 | |
2352 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) | |
2353 return; | |
2354 | |
2355 RefPtr<AudioTrack> audioTrack = AudioTrack::create(this, id, kindString, lab el, language); | |
2356 audioTracks().add(audioTrack.get()); | |
2357 | |
2358 if (enabled) | |
2359 audioTrack->setEnabled(true); | |
2360 } | |
2361 | |
2362 void HTMLMediaElement::removeAudioTrack(const AtomicString& id) | |
2363 { | |
2364 WTF_LOG(Media, "HTMLMediaElement::removeAudioTrack('%s')", id.ascii().data() ); | |
2365 ASSERT(!id.isEmpty()); | |
2366 | |
2367 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) | |
2368 return; | |
2369 | |
2370 audioTracks().remove(id); | |
2371 } | |
2372 | |
2192 void HTMLMediaElement::mediaPlayerDidAddTextTrack(WebInbandTextTrack* webTrack) | 2373 void HTMLMediaElement::mediaPlayerDidAddTextTrack(WebInbandTextTrack* webTrack) |
2193 { | 2374 { |
2194 if (!RuntimeEnabledFeatures::videoTrackEnabled()) | 2375 if (!RuntimeEnabledFeatures::videoTrackEnabled()) |
2195 return; | 2376 return; |
2196 | 2377 |
2197 // 4.8.10.12.2 Sourcing in-band text tracks | 2378 // 4.8.10.12.2 Sourcing in-band text tracks |
2198 // 1. Associate the relevant data with a new text track and its correspondin g new TextTrack object. | 2379 // 1. Associate the relevant data with a new text track and its correspondin g new TextTrack object. |
2199 RefPtr<InbandTextTrack> textTrack = InbandTextTrack::create(document(), webT rack); | 2380 RefPtr<InbandTextTrack> textTrack = InbandTextTrack::create(document(), webT rack); |
2200 | 2381 |
2201 // 2. Set the new text track's kind, label, and language based on the semant ics of the relevant data, | 2382 // 2. Set the new text track's kind, label, and language based on the semant ics of the relevant data, |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2257 void HTMLMediaElement::removeTextTrack(TextTrack* track) | 2438 void HTMLMediaElement::removeTextTrack(TextTrack* track) |
2258 { | 2439 { |
2259 TrackDisplayUpdateScope scope(this); | 2440 TrackDisplayUpdateScope scope(this); |
2260 m_textTracks->remove(track); | 2441 m_textTracks->remove(track); |
2261 | 2442 |
2262 closeCaptionTracksChanged(); | 2443 closeCaptionTracksChanged(); |
2263 } | 2444 } |
2264 | 2445 |
2265 void HTMLMediaElement::forgetResourceSpecificTracks() | 2446 void HTMLMediaElement::forgetResourceSpecificTracks() |
2266 { | 2447 { |
2448 // Implements the "forget the media element's media-resource-specific tracks " algorithm. | |
2449 // The order is explicitly specified as text, then audio, and finally video. Also | |
2450 // 'removetrack' events should not be fired. | |
2267 if (m_textTracks) { | 2451 if (m_textTracks) { |
2268 TrackDisplayUpdateScope scope(this); | 2452 TrackDisplayUpdateScope scope(this); |
2269 m_textTracks->removeAllInbandTracks(); | 2453 m_textTracks->removeAllInbandTracks(); |
2270 closeCaptionTracksChanged(); | 2454 closeCaptionTracksChanged(); |
2271 } | 2455 } |
2456 | |
2457 if (m_audioTracks) | |
2458 m_audioTracks->removeAll(); | |
2459 | |
2460 if (m_videoTracks) | |
2461 m_videoTracks->removeAll(); | |
2272 } | 2462 } |
2273 | 2463 |
2274 PassRefPtr<TextTrack> HTMLMediaElement::addTextTrack(const AtomicString& kind, c onst AtomicString& label, const AtomicString& language, ExceptionState& exceptio nState) | 2464 PassRefPtr<TextTrack> HTMLMediaElement::addTextTrack(const AtomicString& kind, c onst AtomicString& label, const AtomicString& language, ExceptionState& exceptio nState) |
2275 { | 2465 { |
2276 ASSERT(RuntimeEnabledFeatures::videoTrackEnabled()); | 2466 ASSERT(RuntimeEnabledFeatures::videoTrackEnabled()); |
2277 | 2467 |
2278 // 4.8.10.12.4 Text track API | 2468 // 4.8.10.12.4 Text track API |
2279 // The addTextTrack(kind, label, language) method of media elements, when in voked, must run the following steps: | 2469 // The addTextTrack(kind, label, language) method of media elements, when in voked, must run the following steps: |
2280 | 2470 |
2281 // 1. If kind is not one of the following strings, then throw a SyntaxError exception and abort these steps | 2471 // 1. If kind is not one of the following strings, then throw a SyntaxError exception and abort these steps |
(...skipping 1291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3573 m_fragmentStartTime = MediaPlayer::invalidTime(); | 3763 m_fragmentStartTime = MediaPlayer::invalidTime(); |
3574 | 3764 |
3575 double end = fragmentParser.endTime(); | 3765 double end = fragmentParser.endTime(); |
3576 if (end != MediaFragmentURIParser::invalidTimeValue() && end > 0 && end > m_ fragmentStartTime) { | 3766 if (end != MediaFragmentURIParser::invalidTimeValue() && end > 0 && end > m_ fragmentStartTime) { |
3577 m_fragmentEndTime = end; | 3767 m_fragmentEndTime = end; |
3578 if (m_fragmentEndTime > dur) | 3768 if (m_fragmentEndTime > dur) |
3579 m_fragmentEndTime = dur; | 3769 m_fragmentEndTime = dur; |
3580 } else | 3770 } else |
3581 m_fragmentEndTime = MediaPlayer::invalidTime(); | 3771 m_fragmentEndTime = MediaPlayer::invalidTime(); |
3582 | 3772 |
3773 // FIXME: Add support for selecting tracks by ID with the Media Fragments tr ack dimension. | |
3774 | |
3583 if (m_fragmentStartTime != MediaPlayer::invalidTime() && m_readyState < HAVE _FUTURE_DATA) | 3775 if (m_fragmentStartTime != MediaPlayer::invalidTime() && m_readyState < HAVE _FUTURE_DATA) |
3584 prepareToPlay(); | 3776 prepareToPlay(); |
3585 } | 3777 } |
3586 | 3778 |
3587 void HTMLMediaElement::applyMediaFragmentURI() | 3779 void HTMLMediaElement::applyMediaFragmentURI() |
3588 { | 3780 { |
3589 if (m_fragmentStartTime != MediaPlayer::invalidTime()) { | 3781 if (m_fragmentStartTime != MediaPlayer::invalidTime()) { |
3590 m_sentEndEvent = false; | 3782 m_sentEndEvent = false; |
3591 UseCounter::count(document(), UseCounter::HTMLMediaElementSeekToFragment Start); | 3783 UseCounter::count(document(), UseCounter::HTMLMediaElementSeekToFragment Start); |
3592 seek(m_fragmentStartTime, IGNORE_EXCEPTION); | 3784 seek(m_fragmentStartTime, IGNORE_EXCEPTION); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3631 void HTMLMediaElement::mediaPlayerMediaSourceOpened(blink::WebMediaSource* webMe diaSource) | 3823 void HTMLMediaElement::mediaPlayerMediaSourceOpened(blink::WebMediaSource* webMe diaSource) |
3632 { | 3824 { |
3633 m_mediaSource->setWebMediaSourceAndOpen(adoptPtr(webMediaSource)); | 3825 m_mediaSource->setWebMediaSourceAndOpen(adoptPtr(webMediaSource)); |
3634 } | 3826 } |
3635 | 3827 |
3636 bool HTMLMediaElement::isInteractiveContent() const | 3828 bool HTMLMediaElement::isInteractiveContent() const |
3637 { | 3829 { |
3638 return fastHasAttribute(controlsAttr); | 3830 return fastHasAttribute(controlsAttr); |
3639 } | 3831 } |
3640 | 3832 |
3833 void HTMLMediaElement::createPlaceholderTracksIfNecessary() | |
3834 { | |
3835 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) | |
3836 return; | |
3837 | |
3838 // Create a placeholder audio track if |m_player| says it has audio but it d idn't explicitly announce the tracks. | |
3839 if (m_player->hasAudio() && !audioTracks().length()) | |
3840 addAudioTrack("audio", WebMediaPlayerClient::AudioTrackKindMain, "Audio Track", "", true); | |
3841 | |
3842 // Create a placeholder video track if |m_player| says it has video but it d idn't explicitly announce the tracks. | |
3843 if (m_player->hasVideo() && !videoTracks().length()) | |
philipj_slow
2014/03/14 03:51:59
hasVideo() can only be true for HTMLVideoElement,
acolwell GONE FROM CHROMIUM
2014/03/18 22:02:15
This is m_player->hasVideo() not hasVideo(). It re
philipj_slow
2014/03/20 16:17:40
You're right.
| |
3844 addVideoTrack("video", WebMediaPlayerClient::VideoTrackKindMain, "Video Track", "", true); | |
3641 } | 3845 } |
3846 | |
3847 void HTMLMediaElement::selectInitialTracksIfNecessary() | |
3848 { | |
3849 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) | |
3850 return; | |
3851 | |
3852 // Enable the first audio track if an audio track hasn't been enabled yet. | |
3853 if (audioTracks().length() > 0 && !audioTracks().hasEnabledTrack()) | |
3854 audioTracks().anonymousIndexedGetter(0)->setEnabled(true); | |
3855 | |
3856 // Select the first video track if a video track hasn't been selected yet. | |
3857 if (videoTracks().length() > 0 && videoTracks().selectedIndex() == -1) | |
3858 videoTracks().anonymousIndexedGetter(0)->setSelected(true); | |
3859 } | |
3860 | |
3861 } | |
OLD | NEW |