<svg id="svg-root" width="100%" height="100%"
  viewBox="0 0 480 360" xmlns="http://www.w3.org/2000/svg"
  xmlns:xlink="http://www.w3.org/1999/xlink">
  <!--======================================================================-->
  <!--=  Copyright 2008 World Wide Web Consortium, (Massachusetts          =-->
  <!--=  Institute of Technology, European Research Consortium for         =-->
  <!--=  Informatics and Mathematics (ERCIM), Keio University).            =-->
  <!--=  All Rights Reserved.                                              =-->
  <!--=  See http://www.w3.org/Consortium/Legal/.                          =-->
  <!--======================================================================-->
  <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
    template-version="1.3" reviewer="CL" author="CM" status="accepted"
    version="$Revision: 1.2 $" testname="$RCSfile: types-dom-07-f.svg,v $">
    <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/types.html#BasicDOMInterfaces">
        <p>
          This tests that the contents of an animVal object are read only.
          This is tested for interfaces SVGAnimatedNumberList, SVGAnimatedLength,
          SVGAnimatedLengthList, SVGAnimatedAngle, SVGAnimatedRect,
          SVGAnimatedTransformList and SVGAnimatedPreserveAspectRatio.
        </p>
    </d:testDescription>
    <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
      <p>
        Run the test. No interaction required.
      </p>
    </d:operatorScript>
    <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
      <p>
        Once loaded, the test shows 7 rectangles
        representing seven sub-tests reflecting the result
        of checking that an animVal object's contents is read
        only.
        Each rectangle will be either black to indicate that
        the sub-test wasn't run, red to indicate that the
        sub-test failed, and green to indicate that the
        sub-test passed.
      </p>
      <p>
        The test is passed if all 7 rectangles are green.
      </p>
    </d:passCriteria>
  </d:SVGTestCase>
  <title id="test-title">$RCSfile: types-dom-07-f.svg,v $</title>
  <defs>
    <font-face
      font-family="SVGFreeSansASCII"
      unicode-range="U+0-7F">
      <font-face-src>
        <font-face-uri xlink:href="../custom/resources/SVGFreeSans.svg#ascii"/>
      </font-face-src>
    </font-face>
  </defs>
  <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">

    <text x='210' y='55' text-anchor='end'>animVal is read only:</text>
 
    <g font-size='14' transform='translate(500)rotate(90)'>
      <rect id='r1a' x='40' y='60' width='20' height='20'/>
      <text x='70' y='75'>SVGAnimatedNumberList</text>
      <rect id='r2a' x='40' y='90' width='20' height='20'/>
      <text x='70' y='105'>SVGAnimatedLength</text>
      <rect id='r3a' x='40' y='120' width='20' height='20'/>
      <text x='70' y='135'>SVGAnimatedLengthList</text>
      <rect id='r4a' x='40' y='150' width='20' height='20'/>
      <text x='70' y='165'>SVGAnimatedAngle</text>
      <rect id='r5a' x='40' y='180' width='20' height='20'/>
      <text x='70' y='195'>SVGAnimatedRect</text>
      <rect id='r6a' x='40' y='210' width='20' height='20'/>
      <text x='70' y='225'>SVGAnimatedTransformList</text>
      <rect id='r7a' x='40' y='240' width='20' height='20'/>
      <text x='70' y='255'>SVGAnimatedPreserveAspectRatio</text>
    </g>

    <g display='none'>
      <text id='text' rotate='0 20 40'>abc</text>
      <circle id='circle' r='50'/>
      <marker id='marker' orient='1.5708rad'/>
      <svg id='svg' viewBox='10 20 30 40'/>
    </g>

    <script><![CDATA[
      function $(id) { return document.getElementById(id); }

      var text = $('text'),
          circle = $('circle'),
          marker = $('marker'),
          svg = $('svg');

      function expect_exception(id, fn, code) {
        try {
          fn();
        } catch (e) {
          if (e.code == code) {
            $(id).setAttribute('fill', 'green');
            return;
          }
        }
        $(id).setAttribute('fill', 'red');
      }

      // SVGAnimatedNumberList: rotate on text
      expect_exception
        ('r1a',
         function() { text.rotate.animVal.clear(); },
         7 /* DOMException.NO_MODIFICATION_ALLOWED_ERR */);

      // SVGAnimatedLength: r on circle
      expect_exception
        ('r2a',
         function() { circle.r.animVal.value = 123; },
         7 /* DOMException.NO_MODIFICATION_ALLOWED_ERR */);

      // SVGAnimatedLengthList: x on text
      expect_exception
        ('r3a',
         function() { text.x.animVal.clear(); },
         7 /* DOMException.NO_MODIFICATION_ALLOWED_ERR */);

      // SVGAnimatedAngle: orient on marker
      expect_exception
        ('r4a',
         function() { marker.orientAngle.animVal.value = 123; },
         7 /* DOMException.NO_MODIFICATION_ALLOWED_ERR */);

      // SVGAnimatedRect: viewBox on svg
      expect_exception
        ('r5a',
         function() { svg.viewBox.animVal.x = 123; },
         7 /* DOMException.NO_MODIFICATION_ALLOWED_ERR */);

      // SVGAnimatedTransformList: transform on circle
      expect_exception
        ('r6a',
         function() { circle.transform.animVal.clear(); },
         7 /* DOMException.NO_MODIFICATION_ALLOWED_ERR */);

      // SVGAnimatedPreserveAspectRatio: preserveAspectRatio on svg
      expect_exception
        ('r7a',
         function() { svg.preserveAspectRatio.animVal.align = 1; },
         7 /* DOMException.NO_MODIFICATION_ALLOWED_ERR */);
    ]]></script>

  </g>
  <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
    <text id="revision" x="10" y="340" stroke="none"
      fill="black">$Revision: 1.2 $</text>
  </g>
  <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
  <!-- comment out this watermark once the test is approved --><!--
  <g id="draft-watermark">
    <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
    <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
      text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
  </g>-->
</svg>
