2010-07-02 22:52:51 -07:00
|
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
|
|
<head>
|
|
|
|
<title>Test for backwards seeking behavior </title>
|
|
|
|
<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 backwards seeking behavior **/
|
|
|
|
|
|
|
|
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();
|
|
|
|
|
|
|
|
// We define a series of scenarios, sample times, and expected return values
|
|
|
|
// from getStartTime.
|
|
|
|
//
|
|
|
|
// Each scenario is basically a variation on the following arrangement:
|
|
|
|
//
|
|
|
|
// <svg>
|
|
|
|
// <set ... dur="1s" begin="<A-BEGIN>"/>
|
|
|
|
// <set ... dur="1s" begin="<B-BEGIN>"/>
|
|
|
|
// </svg>
|
|
|
|
//
|
|
|
|
// Each test then consists of the following:
|
|
|
|
// animA: attributes to be applied to a
|
|
|
|
// animB: attributes to be applied to b
|
|
|
|
// times: a series of triples which consist of:
|
|
|
|
// <sample time, a's expected start time, b's expected start time>
|
|
|
|
// * The sample time is the time passed to setCurrentTime and so is
|
|
|
|
// in seconds.
|
|
|
|
// * The expected start times are compared with the return value of
|
|
|
|
// getStartTime. To check for an unresolved start time where
|
|
|
|
// getStartTime would normally throw an exception use
|
|
|
|
// 'unresolved'.
|
|
|
|
// * We also allow the special notation to indicate a call to
|
|
|
|
// beginElement
|
|
|
|
// <'beginElementAt', id of animation element, offset>
|
|
|
|
//
|
|
|
|
// In the diagrams below '^' means the time before the seek and '*' is the
|
|
|
|
// seek time.
|
|
|
|
var testCases = Array();
|
|
|
|
|
|
|
|
// 0: Simple case
|
|
|
|
//
|
|
|
|
// A: +-------
|
|
|
|
// B: +------- begin: a.begin
|
|
|
|
// * ^
|
|
|
|
testCases[0] = {
|
|
|
|
'animA': {'begin':'1s', 'id':'a'},
|
|
|
|
'animB': {'begin':'a.begin'},
|
|
|
|
'times': [ [0, 1, 1],
|
|
|
|
[1, 1, 1],
|
|
|
|
[2, 'unresolved', 'unresolved'],
|
|
|
|
[0, 1, 1],
|
|
|
|
[1.5, 1, 1],
|
|
|
|
[1, 1, 1],
|
|
|
|
[2, 'unresolved', 'unresolved'] ]
|
|
|
|
};
|
|
|
|
|
|
|
|
// 1: Restored times should be live
|
|
|
|
//
|
|
|
|
// When we restore times they should be live. So we have the following
|
|
|
|
// scenario.
|
|
|
|
//
|
|
|
|
// A: +-------
|
|
|
|
// B: +------- begin: a.begin
|
|
|
|
// * ^
|
|
|
|
//
|
|
|
|
// Then we call beginElement at an earlier time which should give us the
|
|
|
|
// following.
|
|
|
|
//
|
|
|
|
// A: +-------
|
|
|
|
// B: +-------
|
|
|
|
// * ^
|
|
|
|
//
|
|
|
|
// If the times are not live however we'll end up with this
|
|
|
|
//
|
|
|
|
// A: +-------
|
|
|
|
// B: +-+-------
|
|
|
|
// * ^
|
|
|
|
testCases[1] = {
|
|
|
|
'animA': {'begin':'1s', 'id':'a', 'restart':'whenNotActive'},
|
|
|
|
'animB': {'begin':'a.begin', 'restart':'always'},
|
|
|
|
'times': [ [0, 1, 1],
|
|
|
|
[2, 'unresolved', 'unresolved'],
|
|
|
|
[0.25, 1, 1],
|
|
|
|
['beginElementAt', 'a', 0.25], // = start time of 0.5
|
|
|
|
[0.25, 0.5, 0.5],
|
|
|
|
[1, 0.5, 0.5],
|
|
|
|
[1.5, 'unresolved', 'unresolved'] ]
|
|
|
|
};
|
|
|
|
|
|
|
|
// 2: Multiple intervals A
|
|
|
|
//
|
|
|
|
// A: +- +-
|
|
|
|
// B: +- +- begin: a.begin+4s
|
|
|
|
// * ^
|
|
|
|
testCases[2] = {
|
|
|
|
'animA': {'begin':'1s; 3s', 'id':'a'},
|
|
|
|
'animB': {'begin':'a.begin+4s'},
|
|
|
|
'times': [ [0, 1, 5],
|
|
|
|
[3, 3, 5],
|
|
|
|
[6.5, 'unresolved', 7],
|
|
|
|
[4, 'unresolved', 5],
|
|
|
|
[6, 'unresolved', 7],
|
|
|
|
[2, 3, 5],
|
|
|
|
['beginElementAt', 'a', 0],
|
|
|
|
[2, 2, 5],
|
|
|
|
[5, 'unresolved', 5],
|
|
|
|
[6, 'unresolved', 6],
|
|
|
|
[7, 'unresolved', 7],
|
|
|
|
[8, 'unresolved', 'unresolved'] ]
|
|
|
|
};
|
|
|
|
|
|
|
|
for (var i = 0; i < testCases.length; i++) {
|
|
|
|
gSvg.setCurrentTime(0);
|
|
|
|
var test = testCases[i];
|
|
|
|
|
|
|
|
// Create animation elements
|
|
|
|
var animA = createAnim(test.animA);
|
|
|
|
var animB = createAnim(test.animB);
|
|
|
|
|
|
|
|
// Run samples
|
|
|
|
for (var j = 0; j < test.times.length; j++) {
|
|
|
|
var times = test.times[j];
|
|
|
|
if (times[0] == 'beginElementAt') {
|
|
|
|
var anim = getElement(times[1]);
|
|
|
|
anim.beginElementAt(times[2]);
|
|
|
|
} else {
|
|
|
|
gSvg.setCurrentTime(times[0]);
|
|
|
|
checkStartTime(animA, times[1], times[0], i, 'a');
|
|
|
|
checkStartTime(animB, times[2], times[0], i, 'b');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Tidy up
|
2011-08-12 09:21:37 -07:00
|
|
|
animA.parentNode.removeChild(animA);
|
|
|
|
animB.parentNode.removeChild(animB);
|
2010-07-02 22:52:51 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
SimpleTest.finish();
|
|
|
|
}
|
|
|
|
|
|
|
|
function createAnim(attr)
|
|
|
|
{
|
|
|
|
const svgns = "http://www.w3.org/2000/svg";
|
|
|
|
var anim = document.createElementNS(svgns, 'set');
|
|
|
|
anim.setAttribute('attributeName','x');
|
|
|
|
anim.setAttribute('to','10');
|
|
|
|
anim.setAttribute('dur','1s');
|
|
|
|
for (name in attr) {
|
|
|
|
anim.setAttribute(name, attr[name]);
|
|
|
|
}
|
|
|
|
return gSvg.appendChild(anim);
|
|
|
|
}
|
|
|
|
|
|
|
|
function checkStartTime(anim, expectedStartTime, sampleTime, caseNum, id)
|
|
|
|
{
|
|
|
|
var startTime = 'unresolved';
|
|
|
|
try {
|
|
|
|
startTime = anim.getStartTime();
|
|
|
|
} catch (e) {
|
2012-04-26 09:42:26 -07:00
|
|
|
if (e.name != "InvalidStateError" ||
|
|
|
|
e.code != DOMException.INVALID_STATE_ERR)
|
2010-07-02 22:52:51 -07:00
|
|
|
throw e;
|
|
|
|
}
|
|
|
|
|
|
|
|
var msg = "Test case " + caseNum + ", t=" + sampleTime + " animation '" +
|
|
|
|
id + "': Unexpected getStartTime:";
|
|
|
|
is(startTime, expectedStartTime, msg);
|
|
|
|
}
|
|
|
|
|
|
|
|
window.addEventListener("load", main, false);
|
|
|
|
]]>
|
|
|
|
</script>
|
|
|
|
</pre>
|
|
|
|
</body>
|
|
|
|
</html>
|