<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>
