mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 465498 - HTML5 <audio>: setting 'currentTime' throws exception sometimes; r+sr=roc
This commit is contained in:
parent
1c77fcd712
commit
048708e0c1
@ -378,12 +378,13 @@ void
|
|||||||
nsWaveStateMachine::Seek(float aTime)
|
nsWaveStateMachine::Seek(float aTime)
|
||||||
{
|
{
|
||||||
nsAutoMonitor monitor(mMonitor);
|
nsAutoMonitor monitor(mMonitor);
|
||||||
mNextState = mState;
|
mTimeOffset = aTime;
|
||||||
mTimeOffset = NS_MIN(aTime, BytesToTime(mWaveLength));
|
if (mState == STATE_LOADING_METADATA) {
|
||||||
if (mTimeOffset < 0.0) {
|
mNextState = STATE_SEEKING;
|
||||||
mTimeOffset = 0.0;
|
} else {
|
||||||
|
mNextState = mState;
|
||||||
|
ChangeState(STATE_SEEKING);
|
||||||
}
|
}
|
||||||
ChangeState(STATE_SEEKING);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
float
|
float
|
||||||
@ -443,7 +444,9 @@ nsWaveStateMachine::Run()
|
|||||||
|
|
||||||
if (loaded) {
|
if (loaded) {
|
||||||
mMetadataValid = PR_TRUE;
|
mMetadataValid = PR_TRUE;
|
||||||
event = NS_NEW_RUNNABLE_METHOD(nsWaveDecoder, mDecoder, MetadataLoaded);
|
if (mNextState != STATE_SEEKING) {
|
||||||
|
event = NS_NEW_RUNNABLE_METHOD(nsWaveDecoder, mDecoder, MetadataLoaded);
|
||||||
|
}
|
||||||
newState = mNextState;
|
newState = mNextState;
|
||||||
} else {
|
} else {
|
||||||
event = NS_NEW_RUNNABLE_METHOD(nsWaveDecoder, mDecoder, MediaErrorDecode);
|
event = NS_NEW_RUNNABLE_METHOD(nsWaveDecoder, mDecoder, MediaErrorDecode);
|
||||||
@ -572,6 +575,11 @@ nsWaveStateMachine::Run()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mTimeOffset = NS_MIN(mTimeOffset, BytesToTime(mWaveLength));
|
||||||
|
if (mTimeOffset < 0.0) {
|
||||||
|
mTimeOffset = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
PRInt64 position = RoundDownToSample(TimeToBytes(mTimeOffset)) + mWavePCMOffset;
|
PRInt64 position = RoundDownToSample(TimeToBytes(mTimeOffset)) + mWavePCMOffset;
|
||||||
NS_ABORT_IF_FALSE(position >= 0 && position <= mWaveLength + mWavePCMOffset, "Invalid seek position");
|
NS_ABORT_IF_FALSE(position >= 0 && position <= mWaveLength + mWavePCMOffset, "Invalid seek position");
|
||||||
|
|
||||||
@ -593,7 +601,16 @@ nsWaveStateMachine::Run()
|
|||||||
monitor.Enter();
|
monitor.Enter();
|
||||||
|
|
||||||
if (mState != STATE_SHUTDOWN) {
|
if (mState != STATE_SHUTDOWN) {
|
||||||
ChangeState(mNextState);
|
State nextState = mNextState;
|
||||||
|
// Special case: if a seek was requested during metadata load,
|
||||||
|
// mNextState will have been clobbered. This can only happen when
|
||||||
|
// we're instantiating a decoder to service a seek request after
|
||||||
|
// playback has ended, so we know that the clobbered mNextState
|
||||||
|
// was PAUSED.
|
||||||
|
if (nextState == STATE_SEEKING) {
|
||||||
|
nextState = STATE_PAUSED;
|
||||||
|
}
|
||||||
|
ChangeState(nextState);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -955,10 +972,15 @@ nsWaveDecoder::GetCurrentTime()
|
|||||||
nsresult
|
nsresult
|
||||||
nsWaveDecoder::Seek(float aTime)
|
nsWaveDecoder::Seek(float aTime)
|
||||||
{
|
{
|
||||||
|
if (!mPlaybackStateMachine) {
|
||||||
|
Load(mURI, nsnull, nsnull);
|
||||||
|
}
|
||||||
|
|
||||||
if (mPlaybackStateMachine) {
|
if (mPlaybackStateMachine) {
|
||||||
mPlaybackStateMachine->Seek(aTime);
|
mPlaybackStateMachine->Seek(aTime);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NS_ERROR_FAILURE;
|
return NS_ERROR_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,6 +45,7 @@ include $(topsrcdir)/config/rules.mk
|
|||||||
|
|
||||||
_TEST_FILES = test_autoplay.html \
|
_TEST_FILES = test_autoplay.html \
|
||||||
test_bug461281.html \
|
test_bug461281.html \
|
||||||
|
test_bug465498.html \
|
||||||
test_constants.html \
|
test_constants.html \
|
||||||
test_controls.html \
|
test_controls.html \
|
||||||
test_currentTime.html \
|
test_currentTime.html \
|
||||||
@ -69,6 +70,7 @@ _TEST_FILES = test_autoplay.html \
|
|||||||
test_volume.html \
|
test_volume.html \
|
||||||
test_wav_8bit.html \
|
test_wav_8bit.html \
|
||||||
test_wav_ended1.html \
|
test_wav_ended1.html \
|
||||||
|
test_wav_onloadedmetadata.html \
|
||||||
test_wav_seek_past_end.html \
|
test_wav_seek_past_end.html \
|
||||||
test_wav_seek_then_play.html \
|
test_wav_seek_then_play.html \
|
||||||
320x240.ogg \
|
320x240.ogg \
|
||||||
|
52
content/media/video/test/test_bug465498.html
Normal file
52
content/media/video/test/test_bug465498.html
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Wave Media test: Bug 465498 - Seeking after playback ended</title>
|
||||||
|
<script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
|
||||||
|
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=465498">Mozilla Bug 465498</a>
|
||||||
|
<audio id='v'
|
||||||
|
onloadedmetadata='return startTest();'
|
||||||
|
onended='return playbackEnded();'
|
||||||
|
onseeked='return endTest();'>
|
||||||
|
<source type='audio/x-wav' src='r11025_s16_c1.wav'>
|
||||||
|
</audio>
|
||||||
|
<pre id="test">
|
||||||
|
<script class="testbody" type="text/javascript">
|
||||||
|
var v = document.getElementById('v');
|
||||||
|
var haveSeeked = false;
|
||||||
|
|
||||||
|
function startTest() {
|
||||||
|
v.play();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function playbackEnded() {
|
||||||
|
ok(v.currentTime >= 0.9 && v.currentTime <= 1.1,
|
||||||
|
"Checking currentTime at end: " + v.currentTime);
|
||||||
|
ok(v.ended, "Checking playback has ended");
|
||||||
|
|
||||||
|
v.currentTime = 0;
|
||||||
|
haveSeeked = true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function endTest() {
|
||||||
|
if (!haveSeeked)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
ok(v.currentTime == 0, "Checking currentTime after seek: " + v.currentTime);
|
||||||
|
ok(!v.ended, "Checking ended is false");
|
||||||
|
SimpleTest.finish();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
SimpleTest.waitForExplicitFinish();
|
||||||
|
</script>
|
||||||
|
</pre>
|
||||||
|
</body>
|
||||||
|
</html>
|
89
content/media/video/test/test_wav_onloadedmetadata.html
Normal file
89
content/media/video/test/test_wav_onloadedmetadata.html
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
<!DOCTYPE HTML>
|
||||||
|
<html>
|
||||||
|
<!--
|
||||||
|
https://bugzilla.mozilla.org/show_bug.cgi?id=467972
|
||||||
|
-->
|
||||||
|
<head>
|
||||||
|
<title>Wav Test for Bug 467972</title>
|
||||||
|
<script type="application/javascript" src="/MochiKit/MochiKit.js"></script>
|
||||||
|
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||||
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=467972">Mozilla Bug 467972</a>
|
||||||
|
|
||||||
|
<video id="v"
|
||||||
|
src="r11025_s16_c1.wav"
|
||||||
|
onloadedmetadata="return loadedMetaData();"
|
||||||
|
onended="playbackEnded();"
|
||||||
|
onloadedfirstframe="return loadedFirstFrame();"
|
||||||
|
onseeking="seekStarted();"
|
||||||
|
onseeked="seekEnded();"
|
||||||
|
controls></video>
|
||||||
|
|
||||||
|
<p id="display"></p>
|
||||||
|
<div id="content" style="display: none">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<pre id="test">
|
||||||
|
<script type="application/javascript">
|
||||||
|
|
||||||
|
/** Test for Bug 467972 **/
|
||||||
|
|
||||||
|
|
||||||
|
var gEnded = false;
|
||||||
|
var gSeekStarted = false;
|
||||||
|
var gSeekEnded = false;
|
||||||
|
var gLoadedFirstFrameCount = 0;
|
||||||
|
var gLoadedMetaDataCount = 0;
|
||||||
|
|
||||||
|
function get(id) {
|
||||||
|
return document.getElementById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
function video() {
|
||||||
|
return get('v');
|
||||||
|
}
|
||||||
|
|
||||||
|
function seekStarted() {
|
||||||
|
gSeekStarted = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function seekEnded() {
|
||||||
|
gSeekEnded = true;
|
||||||
|
video().play();
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadedFirstFrame() {
|
||||||
|
gLoadedFirstFrameCount++;
|
||||||
|
ok(gLoadedFirstFrameCount <= 1, "No more than 1 onloadedfirstframe events");
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadedMetaData() {
|
||||||
|
gLoadedMetaDataCount++;
|
||||||
|
ok(gLoadedMetaDataCount <= 1, "No more than 1 onloadedmetadata events");
|
||||||
|
video().play();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function playbackEnded() {
|
||||||
|
if (!gEnded) {
|
||||||
|
video().currentTime = 0;
|
||||||
|
gEnded = true;
|
||||||
|
} else {
|
||||||
|
ok(gSeekEnded, "Should have received seekended");
|
||||||
|
ok(gSeekStarted, "Should have received seekstarted");
|
||||||
|
ok(gLoadedFirstFrameCount == 1, "Should have 1 onloadedfirstframe event");
|
||||||
|
ok(gLoadedMetaDataCount == 1, "Should have 1 onloadedmetadata event");
|
||||||
|
SimpleTest.finish();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
SimpleTest.waitForExplicitFinish();
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</pre>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user