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 519 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
530 { | 530 { |
531 if (name == srcAttr) { | 531 if (name == srcAttr) { |
532 // Trigger a reload, as long as the 'src' attribute is present. | 532 // Trigger a reload, as long as the 'src' attribute is present. |
533 if (!value.isNull()) { | 533 if (!value.isNull()) { |
534 clearMediaPlayer(LoadMediaResource); | 534 clearMediaPlayer(LoadMediaResource); |
535 scheduleDelayedAction(LoadMediaResource); | 535 scheduleDelayedAction(LoadMediaResource); |
536 } | 536 } |
537 } else if (name == controlsAttr) { | 537 } else if (name == controlsAttr) { |
538 configureMediaControls(); | 538 configureMediaControls(); |
539 } else if (name == preloadAttr) { | 539 } else if (name == preloadAttr) { |
540 if (equalIgnoringCase(value, "none")) | 540 if (equalIgnoringCase(value, "none")) { |
541 m_preload = MediaPlayer::None; | 541 m_preload = MediaPlayer::None; |
542 else if (equalIgnoringCase(value, "metadata")) | 542 } else if (equalIgnoringCase(value, "metadata")) { |
543 m_preload = MediaPlayer::MetaData; | 543 m_preload = MediaPlayer::MetaData; |
544 else { | 544 } else { |
545 // The spec does not define an "invalid value default" but "auto" is
suggested as the | 545 // The spec does not define an "invalid value default" but "auto" is
suggested as the |
546 // "missing value default", so use it for everything except "none" a
nd "metadata" | 546 // "missing value default", so use it for everything except "none" a
nd "metadata" |
547 m_preload = MediaPlayer::Auto; | 547 m_preload = MediaPlayer::Auto; |
548 } | 548 } |
549 | 549 |
550 // The attribute must be ignored if the autoplay attribute is present | 550 // The attribute must be ignored if the autoplay attribute is present |
551 if (!autoplay() && m_player) | 551 if (!autoplay() && m_player) |
552 setPlayerPreload(); | 552 setPlayerPreload(); |
553 | 553 |
554 } else if (name == mediagroupAttr && RuntimeEnabledFeatures::mediaController
Enabled()) { | 554 } else if (name == mediagroupAttr && RuntimeEnabledFeatures::mediaController
Enabled()) { |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
692 | 692 |
693 String HTMLMediaElement::canPlayType(const String& mimeType, const String& keySy
stem) const | 693 String HTMLMediaElement::canPlayType(const String& mimeType, const String& keySy
stem) const |
694 { | 694 { |
695 if (!keySystem.isNull()) | 695 if (!keySystem.isNull()) |
696 UseCounter::count(document(), UseCounter::CanPlayTypeKeySystem); | 696 UseCounter::count(document(), UseCounter::CanPlayTypeKeySystem); |
697 | 697 |
698 WebMimeRegistry::SupportsType support = supportsType(ContentType(mimeType),
keySystem); | 698 WebMimeRegistry::SupportsType support = supportsType(ContentType(mimeType),
keySystem); |
699 String canPlay; | 699 String canPlay; |
700 | 700 |
701 // 4.8.10.3 | 701 // 4.8.10.3 |
702 switch (support) | 702 switch (support) { |
703 { | 703 case WebMimeRegistry::IsNotSupported: |
704 case WebMimeRegistry::IsNotSupported: | 704 canPlay = emptyString(); |
705 canPlay = emptyString(); | 705 break; |
706 break; | 706 case WebMimeRegistry::MayBeSupported: |
707 case WebMimeRegistry::MayBeSupported: | 707 canPlay = "maybe"; |
708 canPlay = "maybe"; | 708 break; |
709 break; | 709 case WebMimeRegistry::IsSupported: |
710 case WebMimeRegistry::IsSupported: | 710 canPlay = "probably"; |
711 canPlay = "probably"; | 711 break; |
712 break; | |
713 } | 712 } |
714 | 713 |
715 WTF_LOG(Media, "HTMLMediaElement::canPlayType(%p, %s, %s) -> %s", this, mime
Type.utf8().data(), keySystem.utf8().data(), canPlay.utf8().data()); | 714 WTF_LOG(Media, "HTMLMediaElement::canPlayType(%p, %s, %s) -> %s", this, mime
Type.utf8().data(), keySystem.utf8().data(), canPlay.utf8().data()); |
716 | 715 |
717 return canPlay; | 716 return canPlay; |
718 } | 717 } |
719 | 718 |
720 void HTMLMediaElement::load() | 719 void HTMLMediaElement::load() |
721 { | 720 { |
722 WTF_LOG(Media, "HTMLMediaElement::load(%p)", this); | 721 WTF_LOG(Media, "HTMLMediaElement::load(%p)", this); |
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1216 // Explicitly cache vector sizes, as their content is constant from here. | 1215 // Explicitly cache vector sizes, as their content is constant from here. |
1217 size_t currentCuesSize = currentCues.size(); | 1216 size_t currentCuesSize = currentCues.size(); |
1218 size_t missedCuesSize = missedCues.size(); | 1217 size_t missedCuesSize = missedCues.size(); |
1219 size_t previousCuesSize = previousCues.size(); | 1218 size_t previousCuesSize = previousCues.size(); |
1220 | 1219 |
1221 // 6 - If all of the cues in current cues have their text track cue active | 1220 // 6 - If all of the cues in current cues have their text track cue active |
1222 // flag set, none of the cues in other cues have their text track cue active | 1221 // flag set, none of the cues in other cues have their text track cue active |
1223 // flag set, and missed cues is empty, then abort these steps. | 1222 // flag set, and missed cues is empty, then abort these steps. |
1224 bool activeSetChanged = missedCuesSize; | 1223 bool activeSetChanged = missedCuesSize; |
1225 | 1224 |
1226 for (size_t i = 0; !activeSetChanged && i < previousCuesSize; ++i) | 1225 for (size_t i = 0; !activeSetChanged && i < previousCuesSize; ++i) { |
1227 if (!currentCues.contains(previousCues[i]) && previousCues[i].data()->is
Active()) | 1226 if (!currentCues.contains(previousCues[i]) && previousCues[i].data()->is
Active()) |
1228 activeSetChanged = true; | 1227 activeSetChanged = true; |
| 1228 } |
1229 | 1229 |
1230 for (size_t i = 0; i < currentCuesSize; ++i) { | 1230 for (size_t i = 0; i < currentCuesSize; ++i) { |
1231 currentCues[i].data()->updateDisplayTree(movieTime); | 1231 currentCues[i].data()->updateDisplayTree(movieTime); |
1232 | 1232 |
1233 if (!currentCues[i].data()->isActive()) | 1233 if (!currentCues[i].data()->isActive()) |
1234 activeSetChanged = true; | 1234 activeSetChanged = true; |
1235 } | 1235 } |
1236 | 1236 |
1237 if (!activeSetChanged) | 1237 if (!activeSetChanged) |
1238 return; | 1238 return; |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1357 m_asyncEventQueue->enqueueEvent(event.release()); | 1357 m_asyncEventQueue->enqueueEvent(event.release()); |
1358 } | 1358 } |
1359 } | 1359 } |
1360 | 1360 |
1361 // 16 - Set the text track cue active flag of all the cues in the current | 1361 // 16 - Set the text track cue active flag of all the cues in the current |
1362 // cues, and unset the text track cue active flag of all the cues in the | 1362 // cues, and unset the text track cue active flag of all the cues in the |
1363 // other cues. | 1363 // other cues. |
1364 for (size_t i = 0; i < currentCuesSize; ++i) | 1364 for (size_t i = 0; i < currentCuesSize; ++i) |
1365 currentCues[i].data()->setIsActive(true); | 1365 currentCues[i].data()->setIsActive(true); |
1366 | 1366 |
1367 for (size_t i = 0; i < previousCuesSize; ++i) | 1367 for (size_t i = 0; i < previousCuesSize; ++i) { |
1368 if (!currentCues.contains(previousCues[i])) | 1368 if (!currentCues.contains(previousCues[i])) |
1369 previousCues[i].data()->setIsActive(false); | 1369 previousCues[i].data()->setIsActive(false); |
| 1370 } |
1370 | 1371 |
1371 // Update the current active cues. | 1372 // Update the current active cues. |
1372 m_currentlyActiveCues = currentCues; | 1373 m_currentlyActiveCues = currentCues; |
1373 | 1374 |
1374 if (activeSetChanged) | 1375 if (activeSetChanged) |
1375 updateTextTrackDisplay(); | 1376 updateTextTrackDisplay(); |
1376 } | 1377 } |
1377 | 1378 |
1378 bool HTMLMediaElement::textTracksAreReady() const | 1379 bool HTMLMediaElement::textTracksAreReady() const |
1379 { | 1380 { |
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1763 ReadyState oldState = m_readyState; | 1764 ReadyState oldState = m_readyState; |
1764 ReadyState newState = state; | 1765 ReadyState newState = state; |
1765 | 1766 |
1766 bool tracksAreReady = textTracksAreReady(); | 1767 bool tracksAreReady = textTracksAreReady(); |
1767 | 1768 |
1768 if (newState == oldState && m_tracksAreReady == tracksAreReady) | 1769 if (newState == oldState && m_tracksAreReady == tracksAreReady) |
1769 return; | 1770 return; |
1770 | 1771 |
1771 m_tracksAreReady = tracksAreReady; | 1772 m_tracksAreReady = tracksAreReady; |
1772 | 1773 |
1773 if (tracksAreReady) | 1774 if (tracksAreReady) { |
1774 m_readyState = newState; | 1775 m_readyState = newState; |
1775 else { | 1776 } else { |
1776 // If a media file has text tracks the readyState may not progress beyon
d HAVE_FUTURE_DATA until | 1777 // If a media file has text tracks the readyState may not progress beyon
d HAVE_FUTURE_DATA until |
1777 // the text tracks are ready, regardless of the state of the media file. | 1778 // the text tracks are ready, regardless of the state of the media file. |
1778 if (newState <= HAVE_METADATA) | 1779 if (newState <= HAVE_METADATA) |
1779 m_readyState = newState; | 1780 m_readyState = newState; |
1780 else | 1781 else |
1781 m_readyState = HAVE_CURRENT_DATA; | 1782 m_readyState = HAVE_CURRENT_DATA; |
1782 } | 1783 } |
1783 | 1784 |
1784 if (oldState > m_readyStateMaximum) | 1785 if (oldState > m_readyStateMaximum) |
1785 m_readyStateMaximum = oldState; | 1786 m_readyStateMaximum = oldState; |
(...skipping 1188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2974 | 2975 |
2975 source = toHTMLSourceElement(node); | 2976 source = toHTMLSourceElement(node); |
2976 | 2977 |
2977 // If candidate does not have a src attribute, or if its src attribute's
value is the empty string ... jump down to the failed step below | 2978 // If candidate does not have a src attribute, or if its src attribute's
value is the empty string ... jump down to the failed step below |
2978 mediaURL = source->getNonEmptyURLAttribute(srcAttr); | 2979 mediaURL = source->getNonEmptyURLAttribute(srcAttr); |
2979 #if !LOG_DISABLED | 2980 #if !LOG_DISABLED |
2980 if (shouldLog) | 2981 if (shouldLog) |
2981 WTF_LOG(Media, "HTMLMediaElement::selectNextSourceChild(%p) - 'src'
is %s", this, urlForLoggingMedia(mediaURL).utf8().data()); | 2982 WTF_LOG(Media, "HTMLMediaElement::selectNextSourceChild(%p) - 'src'
is %s", this, urlForLoggingMedia(mediaURL).utf8().data()); |
2982 #endif | 2983 #endif |
2983 if (mediaURL.isEmpty()) | 2984 if (mediaURL.isEmpty()) |
2984 goto check_again; | 2985 goto checkAgain; |
2985 | 2986 |
2986 type = source->type(); | 2987 type = source->type(); |
2987 // FIXME(82965): Add support for keySystem in <source> and set system fr
om source. | 2988 // FIXME(82965): Add support for keySystem in <source> and set system fr
om source. |
2988 if (type.isEmpty() && mediaURL.protocolIsData()) | 2989 if (type.isEmpty() && mediaURL.protocolIsData()) |
2989 type = mimeTypeFromDataURL(mediaURL); | 2990 type = mimeTypeFromDataURL(mediaURL); |
2990 if (!type.isEmpty() || !system.isEmpty()) { | 2991 if (!type.isEmpty() || !system.isEmpty()) { |
2991 #if !LOG_DISABLED | 2992 #if !LOG_DISABLED |
2992 if (shouldLog) | 2993 if (shouldLog) |
2993 WTF_LOG(Media, "HTMLMediaElement::selectNextSourceChild(%p) - 't
ype' is '%s' - key system is '%s'", this, type.utf8().data(), system.utf8().data
()); | 2994 WTF_LOG(Media, "HTMLMediaElement::selectNextSourceChild(%p) - 't
ype' is '%s' - key system is '%s'", this, type.utf8().data(), system.utf8().data
()); |
2994 #endif | 2995 #endif |
2995 if (!supportsType(ContentType(type), system)) | 2996 if (!supportsType(ContentType(type), system)) |
2996 goto check_again; | 2997 goto checkAgain; |
2997 } | 2998 } |
2998 | 2999 |
2999 // Is it safe to load this url? | 3000 // Is it safe to load this url? |
3000 if (!isSafeToLoadURL(mediaURL, actionIfInvalid)) | 3001 if (!isSafeToLoadURL(mediaURL, actionIfInvalid)) |
3001 goto check_again; | 3002 goto checkAgain; |
3002 | 3003 |
3003 // Making it this far means the <source> looks reasonable. | 3004 // Making it this far means the <source> looks reasonable. |
3004 canUseSourceElement = true; | 3005 canUseSourceElement = true; |
3005 | 3006 |
3006 check_again: | 3007 checkAgain: |
3007 if (!canUseSourceElement && actionIfInvalid == Complain && source) | 3008 if (!canUseSourceElement && actionIfInvalid == Complain && source) |
3008 source->scheduleErrorEvent(); | 3009 source->scheduleErrorEvent(); |
3009 } | 3010 } |
3010 | 3011 |
3011 if (canUseSourceElement) { | 3012 if (canUseSourceElement) { |
3012 if (contentType) | 3013 if (contentType) |
3013 *contentType = ContentType(type); | 3014 *contentType = ContentType(type); |
3014 if (keySystem) | 3015 if (keySystem) |
3015 *keySystem = system; | 3016 *keySystem = system; |
3016 m_currentSourceNode = source; | 3017 m_currentSourceNode = source; |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3140 } | 3141 } |
3141 // Queue a task to fire a simple event named ended at the media elem
ent. | 3142 // Queue a task to fire a simple event named ended at the media elem
ent. |
3142 if (!m_sentEndEvent) { | 3143 if (!m_sentEndEvent) { |
3143 m_sentEndEvent = true; | 3144 m_sentEndEvent = true; |
3144 scheduleEvent(EventTypeNames::ended); | 3145 scheduleEvent(EventTypeNames::ended); |
3145 } | 3146 } |
3146 // If the media element has a current media controller, then report
the controller state | 3147 // If the media element has a current media controller, then report
the controller state |
3147 // for the media element's current media controller. | 3148 // for the media element's current media controller. |
3148 updateMediaController(); | 3149 updateMediaController(); |
3149 } | 3150 } |
| 3151 } else { |
| 3152 m_sentEndEvent = false; |
3150 } | 3153 } |
3151 else | |
3152 m_sentEndEvent = false; | |
3153 | 3154 |
3154 updatePlayState(); | 3155 updatePlayState(); |
3155 } | 3156 } |
3156 | 3157 |
3157 void HTMLMediaElement::mediaPlayerDurationChanged() | 3158 void HTMLMediaElement::mediaPlayerDurationChanged() |
3158 { | 3159 { |
3159 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerDurationChanged(%p)", this); | 3160 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerDurationChanged(%p)", this); |
3160 // FIXME: Change MediaPlayerClient & WebMediaPlayer to convey | 3161 // FIXME: Change MediaPlayerClient & WebMediaPlayer to convey |
3161 // the currentTime when the duration change occured. The current | 3162 // the currentTime when the duration change occured. The current |
3162 // WebMediaPlayer implementations always clamp currentTime() to | 3163 // WebMediaPlayer implementations always clamp currentTime() to |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3427 | 3428 |
3428 closeMediaSource(); | 3429 closeMediaSource(); |
3429 | 3430 |
3430 // 4 - If the media element's readyState attribute has a value equal to HAVE
_NOTHING, set the | 3431 // 4 - If the media element's readyState attribute has a value equal to HAVE
_NOTHING, set the |
3431 // element's networkState attribute to the NETWORK_EMPTY value and queue a t
ask to fire a | 3432 // element's networkState attribute to the NETWORK_EMPTY value and queue a t
ask to fire a |
3432 // simple event named emptied at the element. Otherwise, set the element's n
etworkState | 3433 // simple event named emptied at the element. Otherwise, set the element's n
etworkState |
3433 // attribute to the NETWORK_IDLE value. | 3434 // attribute to the NETWORK_IDLE value. |
3434 if (m_readyState == HAVE_NOTHING) { | 3435 if (m_readyState == HAVE_NOTHING) { |
3435 m_networkState = NETWORK_EMPTY; | 3436 m_networkState = NETWORK_EMPTY; |
3436 scheduleEvent(EventTypeNames::emptied); | 3437 scheduleEvent(EventTypeNames::emptied); |
| 3438 } else { |
| 3439 m_networkState = NETWORK_IDLE; |
3437 } | 3440 } |
3438 else | |
3439 m_networkState = NETWORK_IDLE; | |
3440 | 3441 |
3441 // 5 - Set the element's delaying-the-load-event flag to false. This stops d
elaying the load event. | 3442 // 5 - Set the element's delaying-the-load-event flag to false. This stops d
elaying the load event. |
3442 setShouldDelayLoadEvent(false); | 3443 setShouldDelayLoadEvent(false); |
3443 | 3444 |
3444 // 6 - Abort the overall resource selection algorithm. | 3445 // 6 - Abort the overall resource selection algorithm. |
3445 m_currentSourceNode = nullptr; | 3446 m_currentSourceNode = nullptr; |
3446 | 3447 |
3447 // Reset m_readyState since m_player is gone. | 3448 // Reset m_readyState since m_player is gone. |
3448 m_readyState = HAVE_NOTHING; | 3449 m_readyState = HAVE_NOTHING; |
3449 invalidateCachedTime(); | 3450 invalidateCachedTime(); |
(...skipping 581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4031 | 4032 |
4032 #if ENABLE(WEB_AUDIO) | 4033 #if ENABLE(WEB_AUDIO) |
4033 void HTMLMediaElement::clearWeakMembers(Visitor* visitor) | 4034 void HTMLMediaElement::clearWeakMembers(Visitor* visitor) |
4034 { | 4035 { |
4035 if (!visitor->isAlive(m_audioSourceNode) && audioSourceProvider()) | 4036 if (!visitor->isAlive(m_audioSourceNode) && audioSourceProvider()) |
4036 audioSourceProvider()->setClient(0); | 4037 audioSourceProvider()->setClient(0); |
4037 } | 4038 } |
4038 #endif | 4039 #endif |
4039 | 4040 |
4040 } | 4041 } |
OLD | NEW |