1 <html xmlns=
"http://www.w3.org/1999/xhtml">
3 https://bugzilla.mozilla.org/show_bug.cgi?id=506856
6 <title>Test for read-only times of SVG animated lengths
</title>
7 <script src=
"/tests/SimpleTest/SimpleTest.js"></script>
8 <link rel=
"stylesheet" type=
"text/css" href=
"/tests/SimpleTest/test.css" />
11 <a target=
"_blank" href=
"https://bugzilla.mozilla.org/show_bug.cgi?id=506856">Mozilla Bug
506856</a>
13 <div id=
"content" style=
"display: none">
14 <svg id=
"svg" xmlns=
"http://www.w3.org/2000/svg"
15 width=
"100px" height=
"100px" viewBox=
"0 0 100 100"
16 onload=
"this.pauseAnimations()">
17 <!-- Note: Need a viewBox on the SVG element, or else our percent-length
18 basis will be '0' (based off of the viewport width, which is 0 in this
19 case since we're in a display:none iframe. We use viewport width because
20 the lack of a viewbox forces us into the not-mViewBox::IsValid() case of
21 SVGSVGElement::GetLength).
23 And we don't want a percent-length basis of 0, because then when we call
24 convertToSpecifiedUnits to convert out of percent units, we divide by 0
25 and get unexpected results.
27 <circle cx=
"-100" cy=
"-100" r=
"15" fill=
"blue" id=
"circle">
28 <animate attributeName=
"cx" from=
"0" to=
"100" dur=
"4s" begin=
"1s; 10s"
29 fill=
"freeze" id=
"animate"/>
30 <animate attributeName=
"cy" from=
"-100" to=
"-100" dur=
"4s" begin=
"1s; 10s"
36 <script class=
"testbody" type=
"text/javascript">
38 /** Test read-only times of animated lengths **/
40 /* Global Variables */
41 const svgns =
"http://www.w3.org/2000/svg";
42 var svg = document.getElementById(
"svg");
43 var circle = document.getElementById(
"circle");
45 SimpleTest.waitForExplicitFinish();
48 ok(svg.animationsPaused(),
"should be paused by <svg> load handler");
49 is(svg.getCurrentTime(),
0,
"should be paused at 0 in <svg> load handler");
51 // Sanity check: check initial values
52 is(circle.cx.baseVal.value, -
100);
53 is(circle.cx.animVal.value, -
100);
54 is(circle.cy.baseVal.value, -
100);
55 is(circle.cy.animVal.value, -
100);
57 // (
1): Check before animation that animVal's are readonly
58 ok(checkReadOnly(circle.cx),
59 "(1) animVal cx is editable when not animated");
60 ok(checkReadOnly(circle.cy),
61 "(1) animVal cy is editable when not animated");
63 // Skip to mid-way through the animation
64 svg.setCurrentTime(
4);
66 // (
2): Check that whilst animations are active the animVal's are readonly
67 ok(checkReadOnly(circle.cx),
68 "(2) animVal cx is editable when animated");
69 ok(checkReadOnly(circle.cy),
70 "(2) animVal cy is editable when animated");
73 svg.setCurrentTime(
6);
75 // (
3): Check that frozen animations are readonly and have different values
76 ok(checkReadOnly(circle.cx),
77 "(3) animVal cx is editable when frozen");
78 checkDiffValue(circle.cx);
80 // (
4): Check that finished animations are readonly and have same values
81 ok(checkReadOnly(circle.cy),
82 "(4) animVal cy is editable when inactive");
83 checkSameValue(circle.cy);
88 function checkReadOnly(animLength) {
89 var exceptionCaught = false;
90 var oldAnimValue = animLength.animVal.value;
94 animLength.animVal.value = (animLength.animVal.value ==
77) ?
88 :
77;
96 if (e.name ==
"NoModificationAllowedError" &&
97 e.code == DOMException.NO_MODIFICATION_ALLOWED_ERR) {
98 exceptionCaught = true;
100 ok(false,
"Got unexpected exception " + e);
104 is(animLength.animVal.value, oldAnimValue,
105 "No exception thrown, but animVal was changed.");
106 if (animLength.animVal.value != oldAnimValue) return false;
108 // valueInSpecifiedUnits
110 exceptionCaught = false;
111 animLength.animVal.valueInSpecifiedUnits = -
100;
112 } catch (e) { exceptionCaught = true; }
113 ok(exceptionCaught,
"animVal.valueInSpecifiedUnits failed to throw.");
114 if (!exceptionCaught) return false;
118 exceptionCaught = false;
119 animLength.animVal.valueAsString =
"-100px";
120 } catch (e) { exceptionCaught = true; }
121 ok(exceptionCaught,
"animVal.valueAsString failed to throw.");
122 if (!exceptionCaught) return false;
124 // newValueSpecifiedUnits
126 exceptionCaught = false;
127 animLength.animVal.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PX, -
100);
128 } catch (e) { exceptionCaught = true; }
129 ok(exceptionCaught,
"animVal.newValueSpecifiedUnits failed to throw.");
130 if (!exceptionCaught) return false;
132 // convertToSpecifiedUnits
134 exceptionCaught = false;
135 animLength.animVal.convertToSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_NUMBER);
136 } catch (e) { exceptionCaught = true; }
137 ok(exceptionCaught,
"animVal.convertToSpecifiedUnits failed to throw.");
139 return exceptionCaught;
142 function checkSameValue(animLength) {
144 animLength.baseVal.value =
1;
145 is(animLength.animVal.value,
1,
146 "un-animated animVal.value not changed after setting baseValue.value");
148 // valueInSpecifiedUnits
149 animLength.baseVal.valueInSpecifiedUnits =
2;
150 is(animLength.animVal.value,
2,
151 "un-animated animVal.value not changed after setting "
152 +
"baseValue.valueInSpecifiedUnits");
155 animLength.baseVal.valueAsString =
"3";
156 is(animLength.animVal.value,
3,
157 "un-animated animVal.value not changed after setting "
158 +
"baseValue.valueAsString");
160 // newValueSpecifiedUnits
161 animLength.baseVal.newValueSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_CM,
4);
162 is(animLength.animVal.valueInSpecifiedUnits,
4,
163 "un-animated animVal.value not changed after setting "
164 +
"baseValue.newValueSpecifiedUnits");
166 // convertToSpecifiedUnits
167 animLength.baseVal.convertToSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_MM);
168 is(animLength.animVal.valueInSpecifiedUnits,
40,
169 "un-animated animVal.value not changed after calling "
170 +
"baseValue.convertToSpecifiedUnits");
173 function checkDiffValue(animLength) {
174 // We assume here that the animation is not additive and hence changing the
175 // baseValue will not be reflected in the animValue
176 var origValue = animLength.animVal.value;
179 animLength.baseVal.value =
1;
180 is(animLength.animVal.value, origValue,
181 "animated animVal.value changed after setting baseValue.value");
183 // valueInSpecifiedUnits
184 animLength.baseVal.valueInSpecifiedUnits =
2;
185 is(animLength.animVal.value, origValue,
186 "animated animVal.value changed after setting "
187 +
"baseValue.valueInSpecifiedUnits");
190 animLength.baseVal.valueAsString =
"3";
191 is(animLength.animVal.value, origValue,
192 "animated animVal.value changed after setting baseValue.valueAsString");
194 // newValueSpecifiedUnits
195 // (Note: we'd like to convert to MM here and CM in the next step for
196 // consistency with the other tests. However, internally that will cause the
197 // animVal to be converted to MM and back again which, given certain dpi
198 // values such as we get in Linux, this may lead to rounding errors so that
199 //
100 becomes
99.99999237060547. So instead we convert to something
200 // independent of dpi)
201 animLength.baseVal.newValueSpecifiedUnits(
202 SVGLength.SVG_LENGTHTYPE_PERCENTAGE,
40);
203 is(animLength.animVal.value, origValue,
204 "animated animVal.value changed after setting "
205 +
"baseValue.newValueSpecifiedUnits");
207 // convertToSpecifiedUnits
208 animLength.baseVal.convertToSpecifiedUnits(SVGLength.SVG_LENGTHTYPE_PX);
209 is(animLength.animVal.value, origValue,
210 "animated animVal.value changed after calling "
211 +
"baseValue.convertToSpecifiedUnits");
214 window.addEventListener(
"load", main);