0

I am trying to work out why the code below no-longer works in Firefox or Chrome.

The files were last modified over ten years ago.

The static svg dispays, but the script does not run. To my considerable surprise, it does work as it should in Edge, as does a more complicated diagram with interactive elements.

There is probably some obscure setting I need to doctor in Firefox, but I don't know where to look. I don't know when I last tried one of these files, but I would be fairly sure they still worked a couple of years ago.

The code is probably full of daftnesses, as I have done very little javascript, and I probably should now be using requestanimationframe, but that is not the point - it has worked, and still does in Edge.

(Question edited to remove link to irrelevant SMIL version of the animation.)

This is the html file:

<html>
  <head>

    <title>
      SVG slider-crank animated by script
    </title>

  </head>

  <body onload="main()">

    <script type="text/javascript">
      <!--
        var    svgdoc = null;
        var     crank = null;
        var crosshead = null;
        var    conrod = null;
        var        pi = Math.PI;

        function main()
          {
          var timer = null;
          var angle = 0;
          var diagram = document.getElementById('svg');
          if (diagram && diagram.contentDocument)
            {
            svgdoc = diagram.contentDocument;
            }
          else
            {
            try
              {
              svgdoc = diagram.getSVGDocument();
              }
            catch(exception)
              {
              alert("Unable to get SVG document");
              }
            }
          crank     = svgdoc.getElementById('ShowCrank');
          crosshead = svgdoc.getElementById('ShowCrosshead');
          conrod    = svgdoc.getElementById('ShowConRod');
          timer = setInterval(function(){(angle = rotation(angle))}, 25);
          }

        function rotation(angle)
          {
          var step = 3;
           var theta = angle * pi / 180;
           var alpha = Math.asin(Math.sin(theta) / 5);
          var offset = 100 * (Math.cos(theta) -1)  - 500 * (Math.cos(alpha) - 1);
              crank.setAttributeNS(null, 'transform', ("rotate(" + angle + ", 800, 300)"));
          crosshead.setAttributeNS(null, 'transform', ("translate(" + offset + ", 0)"));
             conrod.setAttributeNS(null, 'transform', ("translate(" + offset + ", 0) rotate(" + (alpha * 180 / pi) + ", 400, 300)"));
          angle = angle < 360 - step ? angle + step : 0;
          return angle;
          }

      -->
    </script>

    <object id="svg" type="image/svg+xml" data="Slider_Crank.svg" width="1200" height="800">
      <param name="src" value="Slider_Crank.svg">
    </object>

  </body>

</html>


This is the svg file:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
  <svg version="1.1"
    baseProfile="full"
    xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:ev="http://www.w3.org/2001/xml-events"
    width="1200"
    height="800">

  <title>  Slider-Crank </title>

  <defs>
    <rect
                id="Slidebar"
      stroke-width="1"
            stroke="black"
              fill="silver"
      fill-opacity="1"
                 x="0"
                 y="-12"
             width="300"
            height="24"
    />
    <g id="Crosshead" stroke-width="1" stroke="black" fill-opacity="1">
      <rect
           fill="gold"
              x="-50"
              y="-25"
          width="100"
         height="50"
      />
      <circle cx="0" cy="0" r="15" fill="white"/>
    </g>
    <g id="Crank" stroke-width="1" stroke="black" fill-opacity="1">
      <path fill="silver"
             d="M 99.959 40.000
                A  40  40 0 0 0 99.959, -40.000
                A 450 450 0 0 1  9.950, -49.000
                A  50  50 0 1 0  9.950,  49.000
                A 450 450 0 0 1 99.959,  40.000
                z"/>
      <circle cx="100" cy="0" r="25" fill="white"/>
      <circle cx="0"    cy="0" r="30" fill="lightgrey"/>
    </g>
    <g id="ConRod" stroke-width="1" stroke="black" fill-opacity="0.7">
      <path fill="silver"
             d="M  12.387  21.715
                A 30 30 0 0 1  27.551  17.776
                L 453.475  22.035
                A 30 30 0 0 1 473.243  29.733
                A 40 40 0 0 1 473.243 -29.733
                A 30 30 0 0 1 453.475 -22.035
                L  27.551 -17.776
                A 30 30 0 0 1 12.387  -21.715
                A 25 25 0 0 1 12.387   21.715
                z"/>
      <circle cx="0"   cy="0" r="25" fill="silver"/>
      <circle cx="0"   cy="0" r="15" fill="white"/>
      <circle cx="500" cy="0" r="40" fill="silver"/>
      <circle cx="500" cy="0" r="25" fill="white"/>
    </g>

  </defs>

  <use id="ShowTopSlidebar"    xlink:href="#Slidebar"  x="150" y="263"/>
  <use id="ShowBottomSlidebar" xlink:href="#Slidebar"  x="150" y="337"/>
  <use id="ShowCrosshead"      xlink:href="#Crosshead" x="400" y="300"/>
  <use id="ShowCrank"          xlink:href="#Crank"     x="800" y="300"/>
  <use id="ShowConRod"         xlink:href="#ConRod"    x="400" y="300"/>

</svg>

  • Do you think the issue could be the `svgdoc = diagram.getSVGDocument();` as it looks like `getSVGDocument()` it is deprecated here: https://stackoverflow.com/questions/16626938/getsvgdocument-is-returning-null-in-chrome – Coola Oct 31 '19 at 18:17
  • 1
    Browsers security models have changed. Local files can no longer load/access other local files. – Robert Longson Oct 31 '19 at 18:23
  • What exact versions of firefox and chrome are failing? It works in both browsers for me in ff71.0b4 and chrome76.0 – hughes Oct 31 '19 at 18:23
  • 1
    Firefox had to fix this: https://www.mozilla.org/en-US/security/advisories/mfsa2019-21/#CVE-2019-11730 – Robert Longson Oct 31 '19 at 18:38
  • Thanks guys. Following the various links I found about:config setting 'security.fileuri.strict_origin_policy' fixes Firefox. I don't know how wise it is to leave it like that. – zed-vector Nov 01 '19 at 15:26

1 Answers1

0

Thanks to Robert Longson: Firefox about:config setting 'security.fileuri.strict_origin_policy'