| <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" onload="doTest()"> |
| <style> |
| .background { fill: lime } |
| .workspace { fill: red } |
| .test { fill: lime } |
| </style> |
| <defs> |
| <!-- 'Dummy' path --> |
| <path id="moveFarAway" d="M300,300 h0"/> |
| |
| <path id="moveToUpperLeft" d="M100,100 h0"/> |
| |
| <path id="pathWhoseDAttrChanges" d="M360,360 h0"/> |
| |
| <!-- The first of these two elems w/ same ID should be used. --> |
| <path id="moveToMiddleLeft" d="M100,150 h0"/> |
| <path id="moveToMiddleLeft" d="M350,350 h0"/> |
| |
| <!-- The first of these two elems w/ same ID initially wins, but then |
| it gets removed via script. --> |
| <path id="moveToMiddleCenter" d="M340,340 h0"/> |
| <path id="moveToMiddleCenter" d="M150,150 h0"/> |
| |
| <!-- This elem doesn't do what its id would suggest, but we'll use JS to |
| add an earlier elem with the same ID that *does* do what it says. --> |
| <path id="moveToMiddleRight" d="M330,330 h0"/> |
| |
| <path id="moveToLowerLeft" d="M100,200 h0"/> |
| <path id="moveToLowerCenter" d="M150,200 h0"/> |
| |
| </defs> |
| |
| <script type="text/javascript"> |
| const SVGNS = "http://www.w3.org/2000/svg"; |
| const XLINKNS = "http://www.w3.org/1999/xlink"; |
| |
| if (window.testRunner) |
| testRunner.waitUntilDone(); |
| |
| function insertPathElem(aPathId, aPathSpec) { |
| var newPath = document.createElementNS(SVGNS, "path"); |
| newPath.setAttribute("id", aPathId); |
| newPath.setAttribute("d", aPathSpec); |
| |
| // Insert new path into defs |
| var defsElem = document.getElementsByTagName("defs")[0]; |
| defsElem.insertBefore(newPath, defsElem.firstChild); |
| } |
| |
| function doTest() { |
| // Seek already, so we'll have sampled the initial 'stale' state |
| document.documentElement.setCurrentTime(1); |
| |
| // Make tweaks |
| var mpathToModify = document.getElementById("modifyMyTarget"); |
| mpathToModify.setAttributeNS(XLINKNS, "href", "#moveToUpperLeft"); |
| |
| var mpathWhoseHrefNeedsClearing = document.getElementById("unsetMyTarget"); |
| mpathWhoseHrefNeedsClearing.removeAttributeNS(XLINKNS, "href"); |
| |
| var pathToTweak = document.getElementById("pathWhoseDAttrChanges"); |
| pathToTweak.setAttribute("d", "M200 100 h0"); |
| |
| var mpathToDelete = document.getElementById("removeMe"); |
| mpathToDelete.parentNode.removeChild(mpathToDelete); |
| |
| var pathToDelete = document.getElementById("moveToMiddleCenter"); |
| pathToDelete.parentNode.removeChild(pathToDelete); |
| |
| insertPathElem("moveToMiddleRight", "M200,150 h0"); |
| insertPathElem("moveToLowerRight", "M200,200 h0"); |
| |
| setTimeout(function() { |
| document.documentElement.setCurrentTime(1); |
| document.documentElement.pauseAnimations(); |
| if (window.testRunner) |
| testRunner.notifyDone(); |
| }, 0); |
| } |
| </script> |
| |
| <!-- Big green background to match lime.svg --> |
| <rect class="background" width="100%" height="100%" /> |
| <!-- Red "workspace" (should be covered up, if tests pass) --> |
| <rect class="workspace" x="100" y="100" width="150" height="150"/> |
| |
| <!-- FIRST ROW: Test behavior... --> |
| <!-- ...when mpath's 'xlink:href' attr is modified. --> |
| <rect class="test" x="0" y="0" width="50" height="50"> |
| <animateMotion begin="1" dur="1" fill="freeze"> |
| <mpath id="modifyMyTarget" xlink:href="#moveFarAway"/> |
| </animateMotion> |
| </rect> |
| |
| <!-- ...when mpath's 'xlink:href' is unset. --> |
| <rect class="test" x="150" y="100" width="50" height="50"> |
| <animateMotion begin="1" dur="1" fill="freeze"> |
| <mpath id="unsetMyTarget" xlink:href="#moveFarAway"/> |
| </animateMotion> |
| </rect> |
| |
| <!-- ...when the target-path's "d" attr is modified. --> |
| <rect class="test" x="0" y="0" width="50" height="50"> |
| <animateMotion begin="1" dur="1" fill="freeze"> |
| <mpath xlink:href="#pathWhoseDAttrChanges"/> |
| </animateMotion> |
| </rect> |
| |
| <!-- SECOND ROW: Test behavior... --> |
| <!-- ...when there are two paths with same ID (first should win) --> |
| <rect class="test" x="0" y="0" width="50" height="50"> |
| <animateMotion begin="1" dur="1" fill="freeze"> |
| <mpath xlink:href="#moveToMiddleLeft"/> |
| </animateMotion> |
| </rect> |
| |
| <!-- ...when there are two paths with same ID, and the first is removed. --> |
| <rect class="test" x="0" y="0" width="50" height="50"> |
| <animateMotion begin="1" dur="1" fill="freeze"> |
| <mpath xlink:href="#moveToMiddleCenter"/> |
| </animateMotion> |
| </rect> |
| |
| <!-- ...when an earlier path is added with our target ID. --> |
| <rect class="test" x="0" y="0" width="50" height="50"> |
| <animateMotion begin="1" dur="1" fill="freeze"> |
| <mpath xlink:href="#moveToMiddleRight"/> |
| </animateMotion> |
| </rect> |
| |
| <!-- THIRD ROW: Test behavior... --> |
| <!-- ...when there are two mpath children (first should win). --> |
| <rect class="test" x="0" y="0" width="50" height="50"> |
| <animateMotion begin="1" dur="1" fill="freeze"> |
| <mpath xlink:href="#moveToLowerLeft"/> |
| <mpath xlink:href="#moveFarAway"/> |
| </animateMotion> |
| </rect> |
| |
| <!-- ...when there are two mpath children, and the first is removed. --> |
| <rect class="test" x="0" y="0" width="50" height="50"> |
| <animateMotion begin="1" dur="1" fill="freeze"> |
| <mpath id="removeMe" xlink:href="#moveFarAway"/> |
| <mpath xlink:href="#moveToLowerCenter"/> |
| </animateMotion> |
| </rect> |
| <!-- ...when there's an mpath child that initially matches nothing, until |
| a node with the right ID is inserted into the DOM. --> |
| <rect class="test" x="0" y="0" width="50" height="50"> |
| <animateMotion begin="1" dur="1" fill="freeze"> |
| <mpath xlink:href="#moveToLowerRight"/> |
| </animateMotion> |
| </rect> |
| </svg> |