|
1 <html xmlns="http://www.w3.org/1999/xhtml"> |
|
2 <head> |
|
3 <title>Test for backwards seeking behavior </title> |
|
4 <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> |
|
5 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> |
|
6 </head> |
|
7 <body> |
|
8 <p id="display"></p> |
|
9 <div id="content" style="display: none"> |
|
10 <svg id="svg" xmlns="http://www.w3.org/2000/svg" /> |
|
11 </div> |
|
12 <pre id="test"> |
|
13 <script class="testbody" type="text/javascript"> |
|
14 <![CDATA[ |
|
15 /** Test for backwards seeking behavior **/ |
|
16 |
|
17 var gSvg = document.getElementById("svg"); |
|
18 |
|
19 SimpleTest.waitForExplicitFinish(); |
|
20 |
|
21 function main() |
|
22 { |
|
23 // Pause our document, so that the setCurrentTime calls are the only |
|
24 // thing affecting document time |
|
25 gSvg.pauseAnimations(); |
|
26 |
|
27 // We define a series of scenarios, sample times, and expected return values |
|
28 // from getStartTime. |
|
29 // |
|
30 // Each scenario is basically a variation on the following arrangement: |
|
31 // |
|
32 // <svg> |
|
33 // <set ... dur="1s" begin="<A-BEGIN>"/> |
|
34 // <set ... dur="1s" begin="<B-BEGIN>"/> |
|
35 // </svg> |
|
36 // |
|
37 // Each test then consists of the following: |
|
38 // animA: attributes to be applied to a |
|
39 // animB: attributes to be applied to b |
|
40 // times: a series of triples which consist of: |
|
41 // <sample time, a's expected start time, b's expected start time> |
|
42 // * The sample time is the time passed to setCurrentTime and so is |
|
43 // in seconds. |
|
44 // * The expected start times are compared with the return value of |
|
45 // getStartTime. To check for an unresolved start time where |
|
46 // getStartTime would normally throw an exception use |
|
47 // 'unresolved'. |
|
48 // * We also allow the special notation to indicate a call to |
|
49 // beginElement |
|
50 // <'beginElementAt', id of animation element, offset> |
|
51 // |
|
52 // In the diagrams below '^' means the time before the seek and '*' is the |
|
53 // seek time. |
|
54 var testCases = Array(); |
|
55 |
|
56 // 0: Simple case |
|
57 // |
|
58 // A: +------- |
|
59 // B: +------- begin: a.begin |
|
60 // * ^ |
|
61 testCases[0] = { |
|
62 'animA': {'begin':'1s', 'id':'a'}, |
|
63 'animB': {'begin':'a.begin'}, |
|
64 'times': [ [0, 1, 1], |
|
65 [1, 1, 1], |
|
66 [2, 'unresolved', 'unresolved'], |
|
67 [0, 1, 1], |
|
68 [1.5, 1, 1], |
|
69 [1, 1, 1], |
|
70 [2, 'unresolved', 'unresolved'] ] |
|
71 }; |
|
72 |
|
73 // 1: Restored times should be live |
|
74 // |
|
75 // When we restore times they should be live. So we have the following |
|
76 // scenario. |
|
77 // |
|
78 // A: +------- |
|
79 // B: +------- begin: a.begin |
|
80 // * ^ |
|
81 // |
|
82 // Then we call beginElement at an earlier time which should give us the |
|
83 // following. |
|
84 // |
|
85 // A: +------- |
|
86 // B: +------- |
|
87 // * ^ |
|
88 // |
|
89 // If the times are not live however we'll end up with this |
|
90 // |
|
91 // A: +------- |
|
92 // B: +-+------- |
|
93 // * ^ |
|
94 testCases[1] = { |
|
95 'animA': {'begin':'1s', 'id':'a', 'restart':'whenNotActive'}, |
|
96 'animB': {'begin':'a.begin', 'restart':'always'}, |
|
97 'times': [ [0, 1, 1], |
|
98 [2, 'unresolved', 'unresolved'], |
|
99 [0.25, 1, 1], |
|
100 ['beginElementAt', 'a', 0.25], // = start time of 0.5 |
|
101 [0.25, 0.5, 0.5], |
|
102 [1, 0.5, 0.5], |
|
103 [1.5, 'unresolved', 'unresolved'] ] |
|
104 }; |
|
105 |
|
106 // 2: Multiple intervals A |
|
107 // |
|
108 // A: +- +- |
|
109 // B: +- +- begin: a.begin+4s |
|
110 // * ^ |
|
111 testCases[2] = { |
|
112 'animA': {'begin':'1s; 3s', 'id':'a'}, |
|
113 'animB': {'begin':'a.begin+4s'}, |
|
114 'times': [ [0, 1, 5], |
|
115 [3, 3, 5], |
|
116 [6.5, 'unresolved', 7], |
|
117 [4, 'unresolved', 5], |
|
118 [6, 'unresolved', 7], |
|
119 [2, 3, 5], |
|
120 ['beginElementAt', 'a', 0], |
|
121 [2, 2, 5], |
|
122 [5, 'unresolved', 5], |
|
123 [6, 'unresolved', 6], |
|
124 [7, 'unresolved', 7], |
|
125 [8, 'unresolved', 'unresolved'] ] |
|
126 }; |
|
127 |
|
128 for (var i = 0; i < testCases.length; i++) { |
|
129 gSvg.setCurrentTime(0); |
|
130 var test = testCases[i]; |
|
131 |
|
132 // Create animation elements |
|
133 var animA = createAnim(test.animA); |
|
134 var animB = createAnim(test.animB); |
|
135 |
|
136 // Run samples |
|
137 for (var j = 0; j < test.times.length; j++) { |
|
138 var times = test.times[j]; |
|
139 if (times[0] == 'beginElementAt') { |
|
140 var anim = getElement(times[1]); |
|
141 anim.beginElementAt(times[2]); |
|
142 } else { |
|
143 gSvg.setCurrentTime(times[0]); |
|
144 checkStartTime(animA, times[1], times[0], i, 'a'); |
|
145 checkStartTime(animB, times[2], times[0], i, 'b'); |
|
146 } |
|
147 } |
|
148 |
|
149 // Tidy up |
|
150 animA.parentNode.removeChild(animA); |
|
151 animB.parentNode.removeChild(animB); |
|
152 } |
|
153 |
|
154 SimpleTest.finish(); |
|
155 } |
|
156 |
|
157 function createAnim(attr) |
|
158 { |
|
159 const svgns = "http://www.w3.org/2000/svg"; |
|
160 var anim = document.createElementNS(svgns, 'set'); |
|
161 anim.setAttribute('attributeName','x'); |
|
162 anim.setAttribute('to','10'); |
|
163 anim.setAttribute('dur','1s'); |
|
164 for (name in attr) { |
|
165 anim.setAttribute(name, attr[name]); |
|
166 } |
|
167 return gSvg.appendChild(anim); |
|
168 } |
|
169 |
|
170 function checkStartTime(anim, expectedStartTime, sampleTime, caseNum, id) |
|
171 { |
|
172 var startTime = 'unresolved'; |
|
173 try { |
|
174 startTime = anim.getStartTime(); |
|
175 } catch (e) { |
|
176 if (e.name != "InvalidStateError" || |
|
177 e.code != DOMException.INVALID_STATE_ERR) |
|
178 throw e; |
|
179 } |
|
180 |
|
181 var msg = "Test case " + caseNum + ", t=" + sampleTime + " animation '" + |
|
182 id + "': Unexpected getStartTime:"; |
|
183 is(startTime, expectedStartTime, msg); |
|
184 } |
|
185 |
|
186 window.addEventListener("load", main, false); |
|
187 ]]> |
|
188 </script> |
|
189 </pre> |
|
190 </body> |
|
191 </html> |