Bug 492081: In SVG Animation (SMIL), update pause start time during setCurrentTime calls. r+sr=roc

This commit is contained in:
Daniel Holbert 2009-05-09 08:29:24 -07:00
Родитель ee0fba4163
Коммит 42595da179
3 изменённых файлов: 79 добавлений и 1 удалений

Просмотреть файл

@ -120,10 +120,12 @@ nsSMILTimeContainer::SetCurrentTime(nsSMILTime aSeekTo)
// #getCurrentTime_setCurrentTime_undefined_before_document_timeline_begin
// which says that if SetCurrentTime is called before the document timeline
// has begun we should still adjust the offset.
mParentOffset = GetParentTime() - aSeekTo;
nsSMILTime parentTime = GetParentTime();
mParentOffset = parentTime - aSeekTo;
if (mPauseState) {
mNeedsPauseSample = PR_TRUE;
mPauseStart = parentTime;
}
// Force an update to the current time in case we get a call to GetCurrentTime

Просмотреть файл

@ -46,6 +46,7 @@ include $(topsrcdir)/config/rules.mk
_TEST_FILES = test_smilRestart.xhtml \
test_smilGetStartTime.xhtml \
test_smilGetSimpleDuration.xhtml \
test_smilSetCurrentTime.xhtml \
test_smilSync.xhtml \
test_smilSyncTransform.xhtml \
$(NULL)

Просмотреть файл

@ -0,0 +1,75 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test for setCurrentTime Behavior </title>
<script type="text/javascript" src="/MochiKit/packed.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>
<p id="display"></p>
<div id="content" style="display: none">
<svg id="svg" xmlns="http://www.w3.org/2000/svg" />
</div>
<pre id="test">
<script class="testbody" type="text/javascript">
<![CDATA[
/** Test for basic setCurrentTime / getCurrentTime Behavior **/
/* Global Variables & Constants */
const PRECISION_LEVEL = 0.0000001; // Allow small level of floating-point error
const gTimes = [0, 1.5, 0.2, 0.99, -400.5, 10000000, -1];
const gWaitTime = 20;
var gSvg = document.getElementById("svg");
SimpleTest.waitForExplicitFinish();
function main() {
// Pause our document, so that the setCurrentTime calls are the only
// thing affecting document time
gSvg.pauseAnimations();
// Test that seeking takes effect immediately
for (var i = 0; i < gTimes.length; i++) {
gSvg.setCurrentTime(gTimes[i]);
assertFloatsEqual(gSvg.getCurrentTime(), gTimes[i]);
}
// Test that seeking isn't messed up by timeouts
// (using tail recursion to set up the chain of timeout function calls)
var func = function() {
checkTimesAfterIndex(0);
}
setTimeout(func, gWaitTime);
}
/* This method seeks to the time at gTimes[index],
* and then sets up a timeout to...
* - verify that the seek worked
* - make a recursive call for the next index.
*/
function checkTimesAfterIndex(index) {
if (index == gTimes.length) {
// base case -- we're done!
SimpleTest.finish();
return;
}
gSvg.setCurrentTime(gTimes[index]);
var func = function() {
assertFloatsEqual(gSvg.getCurrentTime(), gTimes[index]);
checkTimesAfterIndex(index + 1);
}
setTimeout(func, gWaitTime);
}
function assertFloatsEqual(aVal, aExpected) {
ok(Math.abs(aVal - aExpected) <= PRECISION_LEVEL,
"getCurrentTime returned " + aVal + " after seeking to " + aExpected)
}
window.addEventListener("load", main, false);
]]>
</script>
</pre>
</body>
</html>