| 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 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 setMediaGroup(value); | 420 setMediaGroup(value); |
| 421 } else { | 421 } else { |
| 422 HTMLElement::parseAttribute(name, value); | 422 HTMLElement::parseAttribute(name, value); |
| 423 } | 423 } |
| 424 } | 424 } |
| 425 | 425 |
| 426 void HTMLMediaElement::finishParsingChildren() | 426 void HTMLMediaElement::finishParsingChildren() |
| 427 { | 427 { |
| 428 HTMLElement::finishParsingChildren(); | 428 HTMLElement::finishParsingChildren(); |
| 429 | 429 |
| 430 if (!RuntimeEnabledFeatures::videoTrackEnabled()) | |
| 431 return; | |
| 432 | |
| 433 if (Traversal<HTMLTrackElement>::firstChild(*this)) | 430 if (Traversal<HTMLTrackElement>::firstChild(*this)) |
| 434 scheduleDelayedAction(LoadTextTrackResource); | 431 scheduleDelayedAction(LoadTextTrackResource); |
| 435 } | 432 } |
| 436 | 433 |
| 437 bool HTMLMediaElement::rendererIsNeeded(const RenderStyle& style) | 434 bool HTMLMediaElement::rendererIsNeeded(const RenderStyle& style) |
| 438 { | 435 { |
| 439 return controls() ? HTMLElement::rendererIsNeeded(style) : false; | 436 return controls() ? HTMLElement::rendererIsNeeded(style) : false; |
| 440 } | 437 } |
| 441 | 438 |
| 442 RenderObject* HTMLMediaElement::createRenderer(RenderStyle*) | 439 RenderObject* HTMLMediaElement::createRenderer(RenderStyle*) |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 490 | 487 |
| 491 void HTMLMediaElement::scheduleDelayedAction(DelayedActionType actionType) | 488 void HTMLMediaElement::scheduleDelayedAction(DelayedActionType actionType) |
| 492 { | 489 { |
| 493 WTF_LOG(Media, "HTMLMediaElement::scheduleDelayedAction"); | 490 WTF_LOG(Media, "HTMLMediaElement::scheduleDelayedAction"); |
| 494 | 491 |
| 495 if ((actionType & LoadMediaResource) && !(m_pendingActionFlags & LoadMediaRe
source)) { | 492 if ((actionType & LoadMediaResource) && !(m_pendingActionFlags & LoadMediaRe
source)) { |
| 496 prepareForLoad(); | 493 prepareForLoad(); |
| 497 m_pendingActionFlags |= LoadMediaResource; | 494 m_pendingActionFlags |= LoadMediaResource; |
| 498 } | 495 } |
| 499 | 496 |
| 500 if (RuntimeEnabledFeatures::videoTrackEnabled() && (actionType & LoadTextTra
ckResource)) | 497 if (actionType & LoadTextTrackResource) |
| 501 m_pendingActionFlags |= LoadTextTrackResource; | 498 m_pendingActionFlags |= LoadTextTrackResource; |
| 502 | 499 |
| 503 if (!m_loadTimer.isActive()) | 500 if (!m_loadTimer.isActive()) |
| 504 m_loadTimer.startOneShot(0, FROM_HERE); | 501 m_loadTimer.startOneShot(0, FROM_HERE); |
| 505 } | 502 } |
| 506 | 503 |
| 507 void HTMLMediaElement::scheduleNextSourceChild() | 504 void HTMLMediaElement::scheduleNextSourceChild() |
| 508 { | 505 { |
| 509 // Schedule the timer to try the next <source> element WITHOUT resetting sta
te ala prepareForLoad. | 506 // Schedule the timer to try the next <source> element WITHOUT resetting sta
te ala prepareForLoad. |
| 510 m_pendingActionFlags |= LoadMediaResource; | 507 m_pendingActionFlags |= LoadMediaResource; |
| 511 m_loadTimer.startOneShot(0, FROM_HERE); | 508 m_loadTimer.startOneShot(0, FROM_HERE); |
| 512 } | 509 } |
| 513 | 510 |
| 514 void HTMLMediaElement::scheduleEvent(const AtomicString& eventName) | 511 void HTMLMediaElement::scheduleEvent(const AtomicString& eventName) |
| 515 { | 512 { |
| 516 scheduleEvent(Event::createCancelable(eventName)); | 513 scheduleEvent(Event::createCancelable(eventName)); |
| 517 } | 514 } |
| 518 | 515 |
| 519 void HTMLMediaElement::scheduleEvent(PassRefPtr<Event> event) | 516 void HTMLMediaElement::scheduleEvent(PassRefPtr<Event> event) |
| 520 { | 517 { |
| 521 #if LOG_MEDIA_EVENTS | 518 #if LOG_MEDIA_EVENTS |
| 522 WTF_LOG(Media, "HTMLMediaElement::scheduleEvent - scheduling '%s'", event->t
ype().ascii().data()); | 519 WTF_LOG(Media, "HTMLMediaElement::scheduleEvent - scheduling '%s'", event->t
ype().ascii().data()); |
| 523 #endif | 520 #endif |
| 524 m_asyncEventQueue->enqueueEvent(event); | 521 m_asyncEventQueue->enqueueEvent(event); |
| 525 } | 522 } |
| 526 | 523 |
| 527 void HTMLMediaElement::loadTimerFired(Timer<HTMLMediaElement>*) | 524 void HTMLMediaElement::loadTimerFired(Timer<HTMLMediaElement>*) |
| 528 { | 525 { |
| 529 if (RuntimeEnabledFeatures::videoTrackEnabled() && (m_pendingActionFlags & L
oadTextTrackResource)) | 526 if (m_pendingActionFlags & LoadTextTrackResource) |
| 530 configureTextTracks(); | 527 configureTextTracks(); |
| 531 | 528 |
| 532 if (m_pendingActionFlags & LoadMediaResource) { | 529 if (m_pendingActionFlags & LoadMediaResource) { |
| 533 if (m_loadState == LoadingFromSourceElement) | 530 if (m_loadState == LoadingFromSourceElement) |
| 534 loadNextSourceChild(); | 531 loadNextSourceChild(); |
| 535 else | 532 else |
| 536 loadInternal(); | 533 loadInternal(); |
| 537 } | 534 } |
| 538 | 535 |
| 539 m_pendingActionFlags = 0; | 536 m_pendingActionFlags = 0; |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 656 // FIXME: Make this less subtle. The position only becomes 0 because of
the createMediaPlayer() call | 653 // FIXME: Make this less subtle. The position only becomes 0 because of
the createMediaPlayer() call |
| 657 // above. | 654 // above. |
| 658 refreshCachedTime(); | 655 refreshCachedTime(); |
| 659 invalidateCachedTime(); | 656 invalidateCachedTime(); |
| 660 | 657 |
| 661 // 4.9 - Set the timeline offset to Not-a-Number (NaN). | 658 // 4.9 - Set the timeline offset to Not-a-Number (NaN). |
| 662 // 4.10 - Update the duration attribute to Not-a-Number (NaN). | 659 // 4.10 - Update the duration attribute to Not-a-Number (NaN). |
| 663 | 660 |
| 664 | 661 |
| 665 updateMediaController(); | 662 updateMediaController(); |
| 666 if (RuntimeEnabledFeatures::videoTrackEnabled()) | 663 updateActiveTextTrackCues(0); |
| 667 updateActiveTextTrackCues(0); | |
| 668 } | 664 } |
| 669 | 665 |
| 670 // 5 - Set the playbackRate attribute to the value of the defaultPlaybackRat
e attribute. | 666 // 5 - Set the playbackRate attribute to the value of the defaultPlaybackRat
e attribute. |
| 671 setPlaybackRate(defaultPlaybackRate(), IGNORE_EXCEPTION); | 667 setPlaybackRate(defaultPlaybackRate(), IGNORE_EXCEPTION); |
| 672 | 668 |
| 673 // 6 - Set the error attribute to null and the autoplaying flag to true. | 669 // 6 - Set the error attribute to null and the autoplaying flag to true. |
| 674 m_error = nullptr; | 670 m_error = nullptr; |
| 675 m_autoplaying = true; | 671 m_autoplaying = true; |
| 676 | 672 |
| 677 // 7 - Invoke the media element's resource selection algorithm. | 673 // 7 - Invoke the media element's resource selection algorithm. |
| (...skipping 18 matching lines...) Expand all Loading... |
| 696 // event may have already fired by then. | 692 // event may have already fired by then. |
| 697 setShouldDelayLoadEvent(true); | 693 setShouldDelayLoadEvent(true); |
| 698 | 694 |
| 699 configureMediaControls(); | 695 configureMediaControls(); |
| 700 } | 696 } |
| 701 | 697 |
| 702 void HTMLMediaElement::loadInternal() | 698 void HTMLMediaElement::loadInternal() |
| 703 { | 699 { |
| 704 // HTMLMediaElement::textTracksAreReady will need "... the text tracks whose
mode was not in the | 700 // HTMLMediaElement::textTracksAreReady will need "... the text tracks whose
mode was not in the |
| 705 // disabled state when the element's resource selection algorithm last start
ed". | 701 // disabled state when the element's resource selection algorithm last start
ed". |
| 706 if (RuntimeEnabledFeatures::videoTrackEnabled()) { | 702 m_textTracksWhenResourceSelectionBegan.clear(); |
| 707 m_textTracksWhenResourceSelectionBegan.clear(); | 703 if (m_textTracks) { |
| 708 if (m_textTracks) { | 704 for (unsigned i = 0; i < m_textTracks->length(); ++i) { |
| 709 for (unsigned i = 0; i < m_textTracks->length(); ++i) { | 705 TextTrack* track = m_textTracks->item(i); |
| 710 TextTrack* track = m_textTracks->item(i); | 706 if (track->mode() != TextTrack::disabledKeyword()) |
| 711 if (track->mode() != TextTrack::disabledKeyword()) | 707 m_textTracksWhenResourceSelectionBegan.append(track); |
| 712 m_textTracksWhenResourceSelectionBegan.append(track); | |
| 713 } | |
| 714 } | 708 } |
| 715 } | 709 } |
| 716 | 710 |
| 717 selectMediaResource(); | 711 selectMediaResource(); |
| 718 } | 712 } |
| 719 | 713 |
| 720 void HTMLMediaElement::selectMediaResource() | 714 void HTMLMediaElement::selectMediaResource() |
| 721 { | 715 { |
| 722 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource"); | 716 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource"); |
| 723 | 717 |
| (...skipping 814 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1538 void HTMLMediaElement::setReadyState(MediaPlayer::ReadyState state) | 1532 void HTMLMediaElement::setReadyState(MediaPlayer::ReadyState state) |
| 1539 { | 1533 { |
| 1540 WTF_LOG(Media, "HTMLMediaElement::setReadyState(%d) - current state is %d,",
static_cast<int>(state), static_cast<int>(m_readyState)); | 1534 WTF_LOG(Media, "HTMLMediaElement::setReadyState(%d) - current state is %d,",
static_cast<int>(state), static_cast<int>(m_readyState)); |
| 1541 | 1535 |
| 1542 // Set "wasPotentiallyPlaying" BEFORE updating m_readyState, potentiallyPlay
ing() uses it | 1536 // Set "wasPotentiallyPlaying" BEFORE updating m_readyState, potentiallyPlay
ing() uses it |
| 1543 bool wasPotentiallyPlaying = potentiallyPlaying(); | 1537 bool wasPotentiallyPlaying = potentiallyPlaying(); |
| 1544 | 1538 |
| 1545 ReadyState oldState = m_readyState; | 1539 ReadyState oldState = m_readyState; |
| 1546 ReadyState newState = static_cast<ReadyState>(state); | 1540 ReadyState newState = static_cast<ReadyState>(state); |
| 1547 | 1541 |
| 1548 bool tracksAreReady = !RuntimeEnabledFeatures::videoTrackEnabled() || textTr
acksAreReady(); | 1542 bool tracksAreReady = textTracksAreReady(); |
| 1549 | 1543 |
| 1550 if (newState == oldState && m_tracksAreReady == tracksAreReady) | 1544 if (newState == oldState && m_tracksAreReady == tracksAreReady) |
| 1551 return; | 1545 return; |
| 1552 | 1546 |
| 1553 m_tracksAreReady = tracksAreReady; | 1547 m_tracksAreReady = tracksAreReady; |
| 1554 | 1548 |
| 1555 if (tracksAreReady) | 1549 if (tracksAreReady) |
| 1556 m_readyState = newState; | 1550 m_readyState = newState; |
| 1557 else { | 1551 else { |
| 1558 // If a media file has text tracks the readyState may not progress beyon
d HAVE_FUTURE_DATA until | 1552 // If a media file has text tracks the readyState may not progress beyon
d HAVE_FUTURE_DATA until |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1637 } | 1631 } |
| 1638 | 1632 |
| 1639 if (shouldUpdateDisplayState) { | 1633 if (shouldUpdateDisplayState) { |
| 1640 updateDisplayState(); | 1634 updateDisplayState(); |
| 1641 if (hasMediaControls()) | 1635 if (hasMediaControls()) |
| 1642 mediaControls()->refreshClosedCaptionsButtonVisibility(); | 1636 mediaControls()->refreshClosedCaptionsButtonVisibility(); |
| 1643 } | 1637 } |
| 1644 | 1638 |
| 1645 updatePlayState(); | 1639 updatePlayState(); |
| 1646 updateMediaController(); | 1640 updateMediaController(); |
| 1647 if (RuntimeEnabledFeatures::videoTrackEnabled()) | 1641 updateActiveTextTrackCues(currentTime()); |
| 1648 updateActiveTextTrackCues(currentTime()); | |
| 1649 } | 1642 } |
| 1650 | 1643 |
| 1651 void HTMLMediaElement::progressEventTimerFired(Timer<HTMLMediaElement>*) | 1644 void HTMLMediaElement::progressEventTimerFired(Timer<HTMLMediaElement>*) |
| 1652 { | 1645 { |
| 1653 ASSERT(m_player); | 1646 ASSERT(m_player); |
| 1654 if (m_networkState != NETWORK_LOADING) | 1647 if (m_networkState != NETWORK_LOADING) |
| 1655 return; | 1648 return; |
| 1656 | 1649 |
| 1657 double time = WTF::currentTime(); | 1650 double time = WTF::currentTime(); |
| 1658 double timedelta = time - m_previousProgressTime; | 1651 double timedelta = time - m_previousProgressTime; |
| (...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2170 | 2163 |
| 2171 if (!m_seeking) | 2164 if (!m_seeking) |
| 2172 scheduleTimeupdateEvent(true); | 2165 scheduleTimeupdateEvent(true); |
| 2173 | 2166 |
| 2174 if (!m_playbackRate) | 2167 if (!m_playbackRate) |
| 2175 return; | 2168 return; |
| 2176 | 2169 |
| 2177 if (!m_paused && hasMediaControls()) | 2170 if (!m_paused && hasMediaControls()) |
| 2178 mediaControls()->playbackProgressed(); | 2171 mediaControls()->playbackProgressed(); |
| 2179 | 2172 |
| 2180 if (RuntimeEnabledFeatures::videoTrackEnabled()) | 2173 updateActiveTextTrackCues(currentTime()); |
| 2181 updateActiveTextTrackCues(currentTime()); | |
| 2182 } | 2174 } |
| 2183 | 2175 |
| 2184 void HTMLMediaElement::scheduleTimeupdateEvent(bool periodicEvent) | 2176 void HTMLMediaElement::scheduleTimeupdateEvent(bool periodicEvent) |
| 2185 { | 2177 { |
| 2186 double now = WTF::currentTime(); | 2178 double now = WTF::currentTime(); |
| 2187 double timedelta = now - m_lastTimeUpdateEventWallTime; | 2179 double timedelta = now - m_lastTimeUpdateEventWallTime; |
| 2188 | 2180 |
| 2189 // throttle the periodic events | 2181 // throttle the periodic events |
| 2190 if (periodicEvent && timedelta < maxTimeupdateEventFrequency) | 2182 if (periodicEvent && timedelta < maxTimeupdateEventFrequency) |
| 2191 return; | 2183 return; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 2220 } else { | 2212 } else { |
| 2221 if (paused()) | 2213 if (paused()) |
| 2222 play(); | 2214 play(); |
| 2223 else | 2215 else |
| 2224 pause(); | 2216 pause(); |
| 2225 } | 2217 } |
| 2226 } | 2218 } |
| 2227 | 2219 |
| 2228 void HTMLMediaElement::mediaPlayerDidAddTextTrack(WebInbandTextTrack* webTrack) | 2220 void HTMLMediaElement::mediaPlayerDidAddTextTrack(WebInbandTextTrack* webTrack) |
| 2229 { | 2221 { |
| 2230 if (!RuntimeEnabledFeatures::videoTrackEnabled()) | |
| 2231 return; | |
| 2232 | |
| 2233 // 4.8.10.12.2 Sourcing in-band text tracks | 2222 // 4.8.10.12.2 Sourcing in-band text tracks |
| 2234 // 1. Associate the relevant data with a new text track and its correspondin
g new TextTrack object. | 2223 // 1. Associate the relevant data with a new text track and its correspondin
g new TextTrack object. |
| 2235 RefPtr<InbandTextTrack> textTrack = InbandTextTrack::create(document(), webT
rack); | 2224 RefPtr<InbandTextTrack> textTrack = InbandTextTrack::create(document(), webT
rack); |
| 2236 | 2225 |
| 2237 // 2. Set the new text track's kind, label, and language based on the semant
ics of the relevant data, | 2226 // 2. Set the new text track's kind, label, and language based on the semant
ics of the relevant data, |
| 2238 // as defined by the relevant specification. If there is no label in that da
ta, then the label must | 2227 // as defined by the relevant specification. If there is no label in that da
ta, then the label must |
| 2239 // be set to the empty string. | 2228 // be set to the empty string. |
| 2240 // 3. Associate the text track list of cues with the rules for updating the
text track rendering appropriate | 2229 // 3. Associate the text track list of cues with the rules for updating the
text track rendering appropriate |
| 2241 // for the format in question. | 2230 // for the format in question. |
| 2242 // 4. If the new text track's kind is metadata, then set the text track in-b
and metadata track dispatch type | 2231 // 4. If the new text track's kind is metadata, then set the text track in-b
and metadata track dispatch type |
| (...skipping 12 matching lines...) Expand all Loading... |
| 2255 | 2244 |
| 2256 // 8. Add the new text track to the media element's list of text tracks. | 2245 // 8. Add the new text track to the media element's list of text tracks. |
| 2257 // 9. Fire an event with the name addtrack, that does not bubble and is not
cancelable, and that uses the TrackEvent | 2246 // 9. Fire an event with the name addtrack, that does not bubble and is not
cancelable, and that uses the TrackEvent |
| 2258 // interface, with the track attribute initialized to the text track's TextT
rack object, at the media element's | 2247 // interface, with the track attribute initialized to the text track's TextT
rack object, at the media element's |
| 2259 // textTracks attribute's TextTrackList object. | 2248 // textTracks attribute's TextTrackList object. |
| 2260 addTextTrack(textTrack.get()); | 2249 addTextTrack(textTrack.get()); |
| 2261 } | 2250 } |
| 2262 | 2251 |
| 2263 void HTMLMediaElement::mediaPlayerDidRemoveTextTrack(WebInbandTextTrack* webTrac
k) | 2252 void HTMLMediaElement::mediaPlayerDidRemoveTextTrack(WebInbandTextTrack* webTrac
k) |
| 2264 { | 2253 { |
| 2265 if (!RuntimeEnabledFeatures::videoTrackEnabled()) | |
| 2266 return; | |
| 2267 | |
| 2268 if (!m_textTracks) | 2254 if (!m_textTracks) |
| 2269 return; | 2255 return; |
| 2270 | 2256 |
| 2271 // This cast is safe because we created the InbandTextTrack with the WebInba
ndTextTrack | 2257 // This cast is safe because we created the InbandTextTrack with the WebInba
ndTextTrack |
| 2272 // passed to mediaPlayerDidAddTextTrack. | 2258 // passed to mediaPlayerDidAddTextTrack. |
| 2273 RefPtr<InbandTextTrack> textTrack = static_cast<InbandTextTrack*>(webTrack->
client()); | 2259 RefPtr<InbandTextTrack> textTrack = static_cast<InbandTextTrack*>(webTrack->
client()); |
| 2274 if (!textTrack) | 2260 if (!textTrack) |
| 2275 return; | 2261 return; |
| 2276 | 2262 |
| 2277 removeTextTrack(textTrack.get()); | 2263 removeTextTrack(textTrack.get()); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 2302 { | 2288 { |
| 2303 if (m_textTracks) { | 2289 if (m_textTracks) { |
| 2304 TrackDisplayUpdateScope scope(this); | 2290 TrackDisplayUpdateScope scope(this); |
| 2305 m_textTracks->removeAllInbandTracks(); | 2291 m_textTracks->removeAllInbandTracks(); |
| 2306 closeCaptionTracksChanged(); | 2292 closeCaptionTracksChanged(); |
| 2307 } | 2293 } |
| 2308 } | 2294 } |
| 2309 | 2295 |
| 2310 PassRefPtr<TextTrack> HTMLMediaElement::addTextTrack(const AtomicString& kind, c
onst AtomicString& label, const AtomicString& language, ExceptionState& exceptio
nState) | 2296 PassRefPtr<TextTrack> HTMLMediaElement::addTextTrack(const AtomicString& kind, c
onst AtomicString& label, const AtomicString& language, ExceptionState& exceptio
nState) |
| 2311 { | 2297 { |
| 2312 ASSERT(RuntimeEnabledFeatures::videoTrackEnabled()); | |
| 2313 | |
| 2314 // 4.8.10.12.4 Text track API | 2298 // 4.8.10.12.4 Text track API |
| 2315 // The addTextTrack(kind, label, language) method of media elements, when in
voked, must run the following steps: | 2299 // The addTextTrack(kind, label, language) method of media elements, when in
voked, must run the following steps: |
| 2316 | 2300 |
| 2317 // 1. If kind is not one of the following strings, then throw a SyntaxError
exception and abort these steps | 2301 // 1. If kind is not one of the following strings, then throw a SyntaxError
exception and abort these steps |
| 2318 if (!TextTrack::isValidKindKeyword(kind)) { | 2302 if (!TextTrack::isValidKindKeyword(kind)) { |
| 2319 exceptionState.throwDOMException(SyntaxError, "The 'kind' provided ('" +
kind + "') is invalid."); | 2303 exceptionState.throwDOMException(SyntaxError, "The 'kind' provided ('" +
kind + "') is invalid."); |
| 2320 return nullptr; | 2304 return nullptr; |
| 2321 } | 2305 } |
| 2322 | 2306 |
| 2323 // 2. If the label argument was omitted, let label be the empty string. | 2307 // 2. If the label argument was omitted, let label be the empty string. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2338 textTrack->setReadinessState(TextTrack::Loaded); | 2322 textTrack->setReadinessState(TextTrack::Loaded); |
| 2339 | 2323 |
| 2340 // ... its text track mode to the text track hidden mode, and its text track
list of cues to an empty list ... | 2324 // ... its text track mode to the text track hidden mode, and its text track
list of cues to an empty list ... |
| 2341 textTrack->setMode(TextTrack::hiddenKeyword()); | 2325 textTrack->setMode(TextTrack::hiddenKeyword()); |
| 2342 | 2326 |
| 2343 return textTrack.release(); | 2327 return textTrack.release(); |
| 2344 } | 2328 } |
| 2345 | 2329 |
| 2346 TextTrackList* HTMLMediaElement::textTracks() | 2330 TextTrackList* HTMLMediaElement::textTracks() |
| 2347 { | 2331 { |
| 2348 ASSERT(RuntimeEnabledFeatures::videoTrackEnabled()); | |
| 2349 | |
| 2350 if (!m_textTracks) | 2332 if (!m_textTracks) |
| 2351 m_textTracks = TextTrackList::create(this); | 2333 m_textTracks = TextTrackList::create(this); |
| 2352 | 2334 |
| 2353 return m_textTracks.get(); | 2335 return m_textTracks.get(); |
| 2354 } | 2336 } |
| 2355 | 2337 |
| 2356 void HTMLMediaElement::didAddTrackElement(HTMLTrackElement* trackElement) | 2338 void HTMLMediaElement::didAddTrackElement(HTMLTrackElement* trackElement) |
| 2357 { | 2339 { |
| 2358 if (!RuntimeEnabledFeatures::videoTrackEnabled()) | |
| 2359 return; | |
| 2360 | |
| 2361 // 4.8.10.12.3 Sourcing out-of-band text tracks | 2340 // 4.8.10.12.3 Sourcing out-of-band text tracks |
| 2362 // When a track element's parent element changes and the new parent is a med
ia element, | 2341 // When a track element's parent element changes and the new parent is a med
ia element, |
| 2363 // then the user agent must add the track element's corresponding text track
to the | 2342 // then the user agent must add the track element's corresponding text track
to the |
| 2364 // media element's list of text tracks ... [continues in TextTrackList::appe
nd] | 2343 // media element's list of text tracks ... [continues in TextTrackList::appe
nd] |
| 2365 RefPtr<TextTrack> textTrack = trackElement->track(); | 2344 RefPtr<TextTrack> textTrack = trackElement->track(); |
| 2366 if (!textTrack) | 2345 if (!textTrack) |
| 2367 return; | 2346 return; |
| 2368 | 2347 |
| 2369 addTextTrack(textTrack.get()); | 2348 addTextTrack(textTrack.get()); |
| 2370 | 2349 |
| 2371 // Do not schedule the track loading until parsing finishes so we don't star
t before all tracks | 2350 // Do not schedule the track loading until parsing finishes so we don't star
t before all tracks |
| 2372 // in the markup have been added. | 2351 // in the markup have been added. |
| 2373 if (isFinishedParsingChildren()) | 2352 if (isFinishedParsingChildren()) |
| 2374 scheduleDelayedAction(LoadTextTrackResource); | 2353 scheduleDelayedAction(LoadTextTrackResource); |
| 2375 | 2354 |
| 2376 if (hasMediaControls()) | 2355 if (hasMediaControls()) |
| 2377 mediaControls()->closedCaptionTracksChanged(); | 2356 mediaControls()->closedCaptionTracksChanged(); |
| 2378 } | 2357 } |
| 2379 | 2358 |
| 2380 void HTMLMediaElement::didRemoveTrackElement(HTMLTrackElement* trackElement) | 2359 void HTMLMediaElement::didRemoveTrackElement(HTMLTrackElement* trackElement) |
| 2381 { | 2360 { |
| 2382 if (!RuntimeEnabledFeatures::videoTrackEnabled()) | |
| 2383 return; | |
| 2384 | |
| 2385 #if !LOG_DISABLED | 2361 #if !LOG_DISABLED |
| 2386 KURL url = trackElement->getNonEmptyURLAttribute(srcAttr); | 2362 KURL url = trackElement->getNonEmptyURLAttribute(srcAttr); |
| 2387 WTF_LOG(Media, "HTMLMediaElement::didRemoveTrackElement - 'src' is %s", urlF
orLoggingMedia(url).utf8().data()); | 2363 WTF_LOG(Media, "HTMLMediaElement::didRemoveTrackElement - 'src' is %s", urlF
orLoggingMedia(url).utf8().data()); |
| 2388 #endif | 2364 #endif |
| 2389 | 2365 |
| 2390 RefPtr<TextTrack> textTrack = trackElement->track(); | 2366 RefPtr<TextTrack> textTrack = trackElement->track(); |
| 2391 if (!textTrack) | 2367 if (!textTrack) |
| 2392 return; | 2368 return; |
| 2393 | 2369 |
| 2394 textTrack->setHasBeenConfigured(false); | 2370 textTrack->setHasBeenConfigured(false); |
| (...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2751 // inserted in a video or audio element will have no effect. | 2727 // inserted in a video or audio element will have no effect. |
| 2752 m_currentSourceNode = nullptr; | 2728 m_currentSourceNode = nullptr; |
| 2753 WTF_LOG(Media, "HTMLMediaElement::sourceRemoved - m_currentSourceNode se
t to 0"); | 2729 WTF_LOG(Media, "HTMLMediaElement::sourceRemoved - m_currentSourceNode se
t to 0"); |
| 2754 } | 2730 } |
| 2755 } | 2731 } |
| 2756 | 2732 |
| 2757 void HTMLMediaElement::mediaPlayerTimeChanged() | 2733 void HTMLMediaElement::mediaPlayerTimeChanged() |
| 2758 { | 2734 { |
| 2759 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerTimeChanged"); | 2735 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerTimeChanged"); |
| 2760 | 2736 |
| 2761 if (RuntimeEnabledFeatures::videoTrackEnabled()) | 2737 updateActiveTextTrackCues(currentTime()); |
| 2762 updateActiveTextTrackCues(currentTime()); | |
| 2763 | 2738 |
| 2764 invalidateCachedTime(); | 2739 invalidateCachedTime(); |
| 2765 | 2740 |
| 2766 // 4.8.10.9 steps 12-14. Needed if no ReadyState change is associated with t
he seek. | 2741 // 4.8.10.9 steps 12-14. Needed if no ReadyState change is associated with t
he seek. |
| 2767 if (m_seeking && m_readyState >= HAVE_CURRENT_DATA && !m_player->seeking()) | 2742 if (m_seeking && m_readyState >= HAVE_CURRENT_DATA && !m_player->seeking()) |
| 2768 finishSeek(); | 2743 finishSeek(); |
| 2769 | 2744 |
| 2770 // Always call scheduleTimeupdateEvent when the media engine reports a time
discontinuity, | 2745 // Always call scheduleTimeupdateEvent when the media engine reports a time
discontinuity, |
| 2771 // it will only queue a 'timeupdate' event if we haven't already posted one
at the current | 2746 // it will only queue a 'timeupdate' event if we haven't already posted one
at the current |
| 2772 // movie time. | 2747 // movie time. |
| (...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3115 | 3090 |
| 3116 // 5 - Set the element's delaying-the-load-event flag to false. This stops d
elaying the load event. | 3091 // 5 - Set the element's delaying-the-load-event flag to false. This stops d
elaying the load event. |
| 3117 setShouldDelayLoadEvent(false); | 3092 setShouldDelayLoadEvent(false); |
| 3118 | 3093 |
| 3119 // 6 - Abort the overall resource selection algorithm. | 3094 // 6 - Abort the overall resource selection algorithm. |
| 3120 m_currentSourceNode = nullptr; | 3095 m_currentSourceNode = nullptr; |
| 3121 | 3096 |
| 3122 // Reset m_readyState since m_player is gone. | 3097 // Reset m_readyState since m_player is gone. |
| 3123 m_readyState = HAVE_NOTHING; | 3098 m_readyState = HAVE_NOTHING; |
| 3124 updateMediaController(); | 3099 updateMediaController(); |
| 3125 if (RuntimeEnabledFeatures::videoTrackEnabled()) | 3100 updateActiveTextTrackCues(0); |
| 3126 updateActiveTextTrackCues(0); | |
| 3127 } | 3101 } |
| 3128 | 3102 |
| 3129 void HTMLMediaElement::clearMediaPlayerAndAudioSourceProviderClient() | 3103 void HTMLMediaElement::clearMediaPlayerAndAudioSourceProviderClient() |
| 3130 { | 3104 { |
| 3131 #if ENABLE(WEB_AUDIO) | 3105 #if ENABLE(WEB_AUDIO) |
| 3132 if (m_audioSourceNode) | 3106 if (m_audioSourceNode) |
| 3133 m_audioSourceNode->lock(); | 3107 m_audioSourceNode->lock(); |
| 3134 | 3108 |
| 3135 if (audioSourceProvider()) | 3109 if (audioSourceProvider()) |
| 3136 audioSourceProvider()->setClient(0); | 3110 audioSourceProvider()->setClient(0); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3231 document().renderView()->compositor()->setCompositingLayersNeedRebuild()
; | 3205 document().renderView()->compositor()->setCompositingLayersNeedRebuild()
; |
| 3232 } | 3206 } |
| 3233 | 3207 |
| 3234 blink::WebLayer* HTMLMediaElement::platformLayer() const | 3208 blink::WebLayer* HTMLMediaElement::platformLayer() const |
| 3235 { | 3209 { |
| 3236 return m_webLayer; | 3210 return m_webLayer; |
| 3237 } | 3211 } |
| 3238 | 3212 |
| 3239 bool HTMLMediaElement::hasClosedCaptions() const | 3213 bool HTMLMediaElement::hasClosedCaptions() const |
| 3240 { | 3214 { |
| 3241 if (RuntimeEnabledFeatures::videoTrackEnabled() && m_textTracks) { | 3215 if (m_textTracks) { |
| 3242 for (unsigned i = 0; i < m_textTracks->length(); ++i) { | 3216 for (unsigned i = 0; i < m_textTracks->length(); ++i) { |
| 3243 if (m_textTracks->item(i)->readinessState() == TextTrack::FailedToLo
ad) | 3217 if (m_textTracks->item(i)->readinessState() == TextTrack::FailedToLo
ad) |
| 3244 continue; | 3218 continue; |
| 3245 | 3219 |
| 3246 if (m_textTracks->item(i)->kind() == TextTrack::captionsKeyword() | 3220 if (m_textTracks->item(i)->kind() == TextTrack::captionsKeyword() |
| 3247 || m_textTracks->item(i)->kind() == TextTrack::subtitlesKeyword(
)) | 3221 || m_textTracks->item(i)->kind() == TextTrack::subtitlesKeyword(
)) |
| 3248 return true; | 3222 return true; |
| 3249 } | 3223 } |
| 3250 } | 3224 } |
| 3251 return false; | 3225 return false; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 3268 | 3242 |
| 3269 void HTMLMediaElement::setClosedCaptionsVisible(bool closedCaptionVisible) | 3243 void HTMLMediaElement::setClosedCaptionsVisible(bool closedCaptionVisible) |
| 3270 { | 3244 { |
| 3271 WTF_LOG(Media, "HTMLMediaElement::setClosedCaptionsVisible(%s)", boolString(
closedCaptionVisible)); | 3245 WTF_LOG(Media, "HTMLMediaElement::setClosedCaptionsVisible(%s)", boolString(
closedCaptionVisible)); |
| 3272 | 3246 |
| 3273 if (!m_player || !hasClosedCaptions()) | 3247 if (!m_player || !hasClosedCaptions()) |
| 3274 return; | 3248 return; |
| 3275 | 3249 |
| 3276 m_closedCaptionsVisible = closedCaptionVisible; | 3250 m_closedCaptionsVisible = closedCaptionVisible; |
| 3277 | 3251 |
| 3278 if (RuntimeEnabledFeatures::videoTrackEnabled()) { | 3252 m_processingPreferenceChange = true; |
| 3279 m_processingPreferenceChange = true; | 3253 markCaptionAndSubtitleTracksAsUnconfigured(); |
| 3280 markCaptionAndSubtitleTracksAsUnconfigured(); | 3254 m_processingPreferenceChange = false; |
| 3281 m_processingPreferenceChange = false; | |
| 3282 | 3255 |
| 3283 updateTextTrackDisplay(); | 3256 updateTextTrackDisplay(); |
| 3284 } | |
| 3285 } | 3257 } |
| 3286 | 3258 |
| 3287 unsigned HTMLMediaElement::webkitAudioDecodedByteCount() const | 3259 unsigned HTMLMediaElement::webkitAudioDecodedByteCount() const |
| 3288 { | 3260 { |
| 3289 if (!m_player) | 3261 if (!m_player) |
| 3290 return 0; | 3262 return 0; |
| 3291 return m_player->audioDecodedByteCount(); | 3263 return m_player->audioDecodedByteCount(); |
| 3292 } | 3264 } |
| 3293 | 3265 |
| 3294 unsigned HTMLMediaElement::webkitVideoDecodedByteCount() const | 3266 unsigned HTMLMediaElement::webkitVideoDecodedByteCount() const |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3394 m_haveVisibleTextTrack = haveVisibleTextTrack; | 3366 m_haveVisibleTextTrack = haveVisibleTextTrack; |
| 3395 m_closedCaptionsVisible = m_haveVisibleTextTrack; | 3367 m_closedCaptionsVisible = m_haveVisibleTextTrack; |
| 3396 | 3368 |
| 3397 if (!m_haveVisibleTextTrack && !hasMediaControls()) | 3369 if (!m_haveVisibleTextTrack && !hasMediaControls()) |
| 3398 return; | 3370 return; |
| 3399 if (!hasMediaControls() && !createMediaControls()) | 3371 if (!hasMediaControls() && !createMediaControls()) |
| 3400 return; | 3372 return; |
| 3401 | 3373 |
| 3402 mediaControls()->changedClosedCaptionsVisibility(); | 3374 mediaControls()->changedClosedCaptionsVisibility(); |
| 3403 | 3375 |
| 3404 if (RuntimeEnabledFeatures::videoTrackEnabled()) { | 3376 updateActiveTextTrackCues(currentTime()); |
| 3405 updateActiveTextTrackCues(currentTime()); | 3377 updateTextTrackDisplay(); |
| 3406 updateTextTrackDisplay(); | |
| 3407 } | |
| 3408 } | 3378 } |
| 3409 | 3379 |
| 3410 void HTMLMediaElement::markCaptionAndSubtitleTracksAsUnconfigured() | 3380 void HTMLMediaElement::markCaptionAndSubtitleTracksAsUnconfigured() |
| 3411 { | 3381 { |
| 3412 if (!m_textTracks) | 3382 if (!m_textTracks) |
| 3413 return; | 3383 return; |
| 3414 | 3384 |
| 3415 // Mark all tracks as not "configured" so that configureTextTracks() | 3385 // Mark all tracks as not "configured" so that configureTextTracks() |
| 3416 // will reconsider which tracks to display in light of new user preferences | 3386 // will reconsider which tracks to display in light of new user preferences |
| 3417 // (e.g. default tracks should not be displayed if the user has turned off | 3387 // (e.g. default tracks should not be displayed if the user has turned off |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3671 { | 3641 { |
| 3672 m_mediaSource->setWebMediaSourceAndOpen(adoptPtr(webMediaSource)); | 3642 m_mediaSource->setWebMediaSourceAndOpen(adoptPtr(webMediaSource)); |
| 3673 } | 3643 } |
| 3674 | 3644 |
| 3675 bool HTMLMediaElement::isInteractiveContent() const | 3645 bool HTMLMediaElement::isInteractiveContent() const |
| 3676 { | 3646 { |
| 3677 return fastHasAttribute(controlsAttr); | 3647 return fastHasAttribute(controlsAttr); |
| 3678 } | 3648 } |
| 3679 | 3649 |
| 3680 } | 3650 } |
| OLD | NEW |