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

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

Issue 331063006: Fix HTMLMediaElement "direction of playback" behavior. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 6 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
« no previous file with comments | « Source/core/html/HTMLMediaElement.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 2101 matching lines...) Expand 10 before | Expand all | Expand 10 after
2112 if (m_playbackRate != rate) { 2112 if (m_playbackRate != rate) {
2113 m_playbackRate = rate; 2113 m_playbackRate = rate;
2114 invalidateCachedTime(); 2114 invalidateCachedTime();
2115 scheduleEvent(EventTypeNames::ratechange); 2115 scheduleEvent(EventTypeNames::ratechange);
2116 } 2116 }
2117 2117
2118 if (m_player && potentiallyPlaying() && m_player->rate() != rate && !m_media Controller) 2118 if (m_player && potentiallyPlaying() && m_player->rate() != rate && !m_media Controller)
2119 m_player->setRate(rate); 2119 m_player->setRate(rate);
2120 } 2120 }
2121 2121
2122 HTMLMediaElement::DirectionOfPlayback HTMLMediaElement::directionOfPlayback() co nst
2123 {
2124 return m_playbackRate >= 0 ? Forward : Backward;
2125 }
2126
2122 void HTMLMediaElement::updatePlaybackRate() 2127 void HTMLMediaElement::updatePlaybackRate()
2123 { 2128 {
2124 double effectiveRate = m_mediaController ? m_mediaController->playbackRate() : m_playbackRate; 2129 double effectiveRate = m_mediaController ? m_mediaController->playbackRate() : m_playbackRate;
2125 if (m_player && potentiallyPlaying() && m_player->rate() != effectiveRate) 2130 if (m_player && potentiallyPlaying() && m_player->rate() != effectiveRate)
2126 m_player->setRate(effectiveRate); 2131 m_player->setRate(effectiveRate);
2127 } 2132 }
2128 2133
2129 bool HTMLMediaElement::ended() const 2134 bool HTMLMediaElement::ended() const
2130 { 2135 {
2131 // 4.8.10.8 Playing the media resource 2136 // 4.8.10.8 Playing the media resource
2132 // The ended attribute must return true if the media element has ended 2137 // The ended attribute must return true if the media element has ended
2133 // playback and the direction of playback is forwards, and false otherwise. 2138 // playback and the direction of playback is forwards, and false otherwise.
2134 return endedPlayback() && m_playbackRate > 0; 2139 return endedPlayback() && directionOfPlayback() == Forward;
2135 } 2140 }
2136 2141
2137 bool HTMLMediaElement::autoplay() const 2142 bool HTMLMediaElement::autoplay() const
2138 { 2143 {
2139 return fastHasAttribute(autoplayAttr); 2144 return fastHasAttribute(autoplayAttr);
2140 } 2145 }
2141 2146
2142 String HTMLMediaElement::preload() const 2147 String HTMLMediaElement::preload() const
2143 { 2148 {
2144 switch (m_preload) { 2149 switch (m_preload) {
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
2315 return; 2320 return;
2316 2321
2317 m_previousProgressTime = WTF::currentTime(); 2322 m_previousProgressTime = WTF::currentTime();
2318 m_playbackProgressTimer.startRepeating(maxTimeupdateEventFrequency, FROM_HER E); 2323 m_playbackProgressTimer.startRepeating(maxTimeupdateEventFrequency, FROM_HER E);
2319 } 2324 }
2320 2325
2321 void HTMLMediaElement::playbackProgressTimerFired(Timer<HTMLMediaElement>*) 2326 void HTMLMediaElement::playbackProgressTimerFired(Timer<HTMLMediaElement>*)
2322 { 2327 {
2323 ASSERT(m_player); 2328 ASSERT(m_player);
2324 2329
2325 if (m_fragmentEndTime != MediaPlayer::invalidTime() && currentTime() >= m_fr agmentEndTime && m_playbackRate > 0) { 2330 if (m_fragmentEndTime != MediaPlayer::invalidTime() && currentTime() >= m_fr agmentEndTime && directionOfPlayback() == Forward) {
2326 m_fragmentEndTime = MediaPlayer::invalidTime(); 2331 m_fragmentEndTime = MediaPlayer::invalidTime();
2327 if (!m_mediaController && !m_paused) { 2332 if (!m_mediaController && !m_paused) {
2328 UseCounter::count(document(), UseCounter::HTMLMediaElementPauseAtFra gmentEnd); 2333 UseCounter::count(document(), UseCounter::HTMLMediaElementPauseAtFra gmentEnd);
2329 // changes paused to true and fires a simple event named pause at th e media element. 2334 // changes paused to true and fires a simple event named pause at th e media element.
2330 pause(); 2335 pause();
2331 } 2336 }
2332 } 2337 }
2333 2338
2334 if (!m_seeking) 2339 if (!m_seeking)
2335 scheduleTimeupdateEvent(true); 2340 scheduleTimeupdateEvent(true);
(...skipping 676 matching lines...) Expand 10 before | Expand all | Expand 10 after
3012 // Always call scheduleTimeupdateEvent when the media engine reports a time discontinuity, 3017 // Always call scheduleTimeupdateEvent when the media engine reports a time discontinuity,
3013 // it will only queue a 'timeupdate' event if we haven't already posted one at the current 3018 // it will only queue a 'timeupdate' event if we haven't already posted one at the current
3014 // movie time. 3019 // movie time.
3015 scheduleTimeupdateEvent(false); 3020 scheduleTimeupdateEvent(false);
3016 3021
3017 double now = currentTime(); 3022 double now = currentTime();
3018 double dur = duration(); 3023 double dur = duration();
3019 3024
3020 // When the current playback position reaches the end of the media resource when the direction of 3025 // When the current playback position reaches the end of the media resource when the direction of
3021 // playback is forwards, then the user agent must follow these steps: 3026 // playback is forwards, then the user agent must follow these steps:
3022 if (!std::isnan(dur) && dur && now >= dur && m_playbackRate > 0) { 3027 if (!std::isnan(dur) && dur && now >= dur && directionOfPlayback() == Forwar d) {
3023 // If the media element has a loop attribute specified and does not have a current media controller, 3028 // If the media element has a loop attribute specified and does not have a current media controller,
3024 if (loop() && !m_mediaController) { 3029 if (loop() && !m_mediaController) {
3025 m_sentEndEvent = false; 3030 m_sentEndEvent = false;
3026 // then seek to the earliest possible position of the media resourc e and abort these steps. 3031 // then seek to the earliest possible position of the media resourc e and abort these steps.
3027 seek(0, IGNORE_EXCEPTION); 3032 seek(0, IGNORE_EXCEPTION);
3028 } else { 3033 } else {
3029 // If the media element does not have a current media controller, an d the media element 3034 // If the media element does not have a current media controller, an d the media element
3030 // has still ended playback, and the direction of playback is still forwards, and paused 3035 // has still ended playback, and the direction of playback is still forwards, and paused
3031 // is false, 3036 // is false,
3032 if (!m_mediaController && !m_paused) { 3037 if (!m_mediaController && !m_paused) {
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
3192 3197
3193 // A media element is said to have ended playback when the element's 3198 // A media element is said to have ended playback when the element's
3194 // readyState attribute is HAVE_METADATA or greater, 3199 // readyState attribute is HAVE_METADATA or greater,
3195 if (m_readyState < HAVE_METADATA) 3200 if (m_readyState < HAVE_METADATA)
3196 return false; 3201 return false;
3197 3202
3198 // and the current playback position is the end of the media resource and th e direction 3203 // and the current playback position is the end of the media resource and th e direction
3199 // of playback is forwards, Either the media element does not have a loop at tribute specified, 3204 // of playback is forwards, Either the media element does not have a loop at tribute specified,
3200 // or the media element has a current media controller. 3205 // or the media element has a current media controller.
3201 double now = currentTime(); 3206 double now = currentTime();
3202 if (m_playbackRate > 0) 3207 if (directionOfPlayback() == Forward)
3203 return dur > 0 && now >= dur && (!loop() || m_mediaController); 3208 return dur > 0 && now >= dur && (!loop() || m_mediaController);
3204 3209
3205 // or the current playback position is the earliest possible position and th e direction 3210 // or the current playback position is the earliest possible position and th e direction
3206 // of playback is backwards 3211 // of playback is backwards
3207 if (m_playbackRate < 0) 3212 ASSERT(directionOfPlayback() == Backward);
3208 return now <= 0; 3213 return now <= 0;
3209
3210 return false;
3211 } 3214 }
3212 3215
3213 bool HTMLMediaElement::stoppedDueToErrors() const 3216 bool HTMLMediaElement::stoppedDueToErrors() const
3214 { 3217 {
3215 if (m_readyState >= HAVE_METADATA && m_error) { 3218 if (m_readyState >= HAVE_METADATA && m_error) {
3216 RefPtr<TimeRanges> seekableRanges = seekable(); 3219 RefPtr<TimeRanges> seekableRanges = seekable();
3217 if (!seekableRanges->contain(currentTime())) 3220 if (!seekableRanges->contain(currentTime()))
3218 return true; 3221 return true;
3219 } 3222 }
3220 3223
(...skipping 725 matching lines...) Expand 10 before | Expand all | Expand 10 after
3946 3949
3947 #if ENABLE(WEB_AUDIO) 3950 #if ENABLE(WEB_AUDIO)
3948 void HTMLMediaElement::clearWeakMembers(Visitor* visitor) 3951 void HTMLMediaElement::clearWeakMembers(Visitor* visitor)
3949 { 3952 {
3950 if (!visitor->isAlive(m_audioSourceNode) && audioSourceProvider()) 3953 if (!visitor->isAlive(m_audioSourceNode) && audioSourceProvider())
3951 audioSourceProvider()->setClient(0); 3954 audioSourceProvider()->setClient(0);
3952 } 3955 }
3953 #endif 3956 #endif
3954 3957
3955 } 3958 }
OLDNEW
« no previous file with comments | « Source/core/html/HTMLMediaElement.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698