<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="../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>
