test_smilAnimateMotionOverrideRules.xhtml (7161B)
1 <html xmlns="http://www.w3.org/1999/xhtml"> 2 <!-- 3 https://bugzilla.mozilla.org/show_bug.cgi?id=436418 4 --> 5 <head> 6 <title>Test for overriding of path-defining attributes for animateMotion</title> 7 <script src="/tests/SimpleTest/SimpleTest.js"></script> 8 <script type="text/javascript" src="smilTestUtils.js" /> 9 <script type="text/javascript" src="smilAnimateMotionValueLists.js" /> 10 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 11 </head> 12 <body> 13 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=436418">Mozilla Bug 436418</a> 14 <p id="display"></p> 15 <div id="content" style="visibility: hidden"> 16 <svg xmlns="http://www.w3.org/2000/svg" id="svg" 17 width="200px" height="200px" 18 onload="this.pauseAnimations()"> 19 <!-- Paths for mpath to refer to --> 20 <path id="validPathElem" d="M10 10 h-10"/> 21 <path id="invalidPathElem" d="abc"/> 22 23 <!-- The rect whose motion is animated --> 24 <rect id="rect" x="20" y="20" width="200" height="200"/> 25 </svg> 26 </div> 27 <pre id="test"> 28 <script class="testbody" type="text/javascript"> 29 <![CDATA[ 30 31 // Constant strings (& string-arrays) 32 const SVGNS = "http://www.w3.org/2000/svg"; 33 const XLINKNS = "http://www.w3.org/1999/xlink"; 34 35 // Constant objects 36 const gSvg = document.getElementById("svg"); 37 const gRect = document.getElementById("rect"); 38 const gUnAnimatedCTM = gRect.getCTM(); 39 40 // Values for path-defining attributes, and their expected 41 // CTMs halfway through the animation 42 var gMpathValidTarget = "#validPathElem"; 43 var gMpathCTM = CTMUtil.generateCTM([ 5, 10, 0 ]); 44 45 var gMpathInvalidTargetA = "#invalidPathElem"; 46 var gMpathInvalidTargetB = "#nonExistentElem"; 47 48 var gInvalidAttrValue = "i-am-invalid"; // Invalid for all tested attributes 49 50 var gPathValidValue = "M20 20 h10"; 51 var gPathCTM = CTMUtil.generateCTM([ 25, 20, 0 ]); 52 53 var gValuesValidValue = "30 30; 40 30" 54 var gValuesCTM = CTMUtil.generateCTM([ 35, 30, 0 ]); 55 56 var gFromValidValue = "50 50"; 57 58 var gByValidValue = "10 2"; 59 var gPureByCTM = CTMUtil.generateCTM([ 5, 1, 0 ]); 60 var gFromByCTM = CTMUtil.generateCTM([ 55, 51, 0 ]); 61 62 var gToValidValue = "80 60"; 63 var gPureToCTM = CTMUtil.generateCTM([ 40, 30, 0 ]); 64 var gFromToCTM = CTMUtil.generateCTM([ 65, 55, 0 ]); 65 66 67 SimpleTest.waitForExplicitFinish(); 68 69 function createAnim() 70 { 71 var anim = document.createElementNS(SVGNS, "animateMotion"); 72 return gRect.appendChild(anim); 73 } 74 75 function removeElem(aElem) 76 { 77 aElem.remove(); 78 } 79 80 function createMpath(aAnimElement, aHrefVal) 81 { 82 var mpath = document.createElementNS(SVGNS, "mpath"); 83 mpath.setAttributeNS(XLINKNS, "href", aHrefVal); 84 return aAnimElement.appendChild(mpath); 85 } 86 87 function runTest() { 88 // Start out with valid values for all path-defining attributes 89 var attrSettings = { 90 "mpath" : gMpathValidTarget, 91 "path" : gPathValidValue, 92 "values" : gValuesValidValue, 93 "from" : gFromValidValue, 94 "to" : gToValidValue, 95 "by" : gByValidValue, 96 }; 97 98 // Test that <mpath> overrides everything below it 99 testAttrSettings(attrSettings, gMpathCTM, 100 "<mpath> should win"); 101 var mpathInvalidTargets = [gMpathInvalidTargetA, gMpathInvalidTargetB]; 102 for (var i in mpathInvalidTargets) { 103 var curInvalidValue = mpathInvalidTargets[i]; 104 attrSettings.mpath = curInvalidValue; 105 testAttrSettings(attrSettings, gUnAnimatedCTM, 106 "invalid <mpath> should block animation"); 107 } 108 delete attrSettings.mpath; 109 110 // Test that 'path' overrides everything below it 111 testAttrSettings(attrSettings, gPathCTM, 112 "'path' should win vs all but mpath"); 113 attrSettings.path = gInvalidAttrValue; 114 testAttrSettings(attrSettings, gUnAnimatedCTM, 115 "invalid 'path' should block animation vs all but mpath"); 116 delete attrSettings.path; 117 118 // Test that 'values' overrides everything below it 119 testAttrSettings(attrSettings, gValuesCTM, 120 "'values' should win vs from/by/to"); 121 attrSettings.values = gInvalidAttrValue; 122 testAttrSettings(attrSettings, gUnAnimatedCTM, 123 "invalid 'values' should block animation vs from/by/to"); 124 delete attrSettings.values; 125 126 // Test that 'from' & 'to' overrides 'by' 127 testAttrSettings(attrSettings, gFromToCTM, 128 "'from/to' should win vs 'by'"); 129 attrSettings.to = gInvalidAttrValue; 130 testAttrSettings(attrSettings, gUnAnimatedCTM, 131 "invalid 'to' should block animation vs 'by'"); 132 delete attrSettings.to; 133 134 // Test that 'from' & 'by' are effective 135 testAttrSettings(attrSettings, gFromByCTM, 136 "'from/by' should be visible"); 137 attrSettings.by = gInvalidAttrValue; 138 testAttrSettings(attrSettings, gUnAnimatedCTM, 139 "invalid 'by' should block animation"); 140 delete attrSettings.from; 141 142 // REINSERT "to" & fix up "by" so we can test pure-"to" vs pure-"by" 143 attrSettings.to = gToValidValue; 144 attrSettings.by = gByValidValue; 145 testAttrSettings(attrSettings, gPureToCTM, 146 "pure-'to' should be effective & beat pure-'by'"); 147 attrSettings.to = gInvalidAttrValue; 148 testAttrSettings(attrSettings, gUnAnimatedCTM, 149 "invalid pure-'to' should block animation vs pure-'by'"); 150 delete attrSettings.to; 151 152 // Test that pure-"by" is effective 153 testAttrSettings(attrSettings, gPureByCTM, 154 "pure-by should be visible"); 155 attrSettings.by = gInvalidAttrValue; 156 testAttrSettings(attrSettings, gUnAnimatedCTM, 157 "invalid 'by' should block animation"); 158 delete attrSettings.by; 159 160 // Make sure that our hash is empty now. 161 for (var unexpectedKey in attrSettings) { 162 ok(false, "Unexpected mapping remains in attrSettings: " + 163 unexpectedKey + "-->" + unexpectedValue); 164 } 165 } 166 167 function testAttrSettings(aAttrValueHash, aExpectedCTM, aErrMsg) 168 { 169 var isDebug = false; // XXdholbert 170 !isDebug || todo(false, "ENTERING testAttrSettings"); 171 // Set up animateMotion element 172 var animElement = document.createElementNS(SVGNS, "animateMotion"); 173 animElement.setAttribute("dur", "2s"); 174 for (var attrName in aAttrValueHash) { 175 !isDebug || todo(false, "setting '" + attrName +"' to '" + 176 aAttrValueHash[attrName] +"'"); 177 if (attrName == "mpath") { 178 createMpath(animElement, aAttrValueHash[attrName]); 179 } else { 180 animElement.setAttribute(attrName, aAttrValueHash[attrName]); 181 } 182 } 183 184 gRect.appendChild(animElement); 185 186 // Seek to halfway through animation 187 SMILUtil.getSVGRoot().setCurrentTime(1); // Seek halfway through animation 188 189 // Check CTM against expected value 190 CTMUtil.assertCTMEqual(gRect.getCTM(), aExpectedCTM, 191 CTMUtil.CTM_COMPONENTS_ALL, aErrMsg, false); 192 193 // CLEAN UP 194 SMILUtil.getSVGRoot().setCurrentTime(0); 195 removeElem(animElement); 196 } 197 198 // Main Function 199 function main() 200 { 201 // Start out with document paused 202 var svg = SMILUtil.getSVGRoot(); 203 ok(svg.animationsPaused(), "should be paused by <svg> load handler"); 204 is(svg.getCurrentTime(), 0, "should be paused at 0 in <svg> load handler"); 205 206 runTest(); 207 SimpleTest.finish(); 208 } 209 210 window.addEventListener("load", main); 211 ]]> 212 </script> 213 </pre> 214 </body> 215 </html>