wpt / svg / animations / smil-clock-value-parsing.html

Status: FAIL | Duration: 56ms | Subtests: 0/18 | Open test on wpt.live | wpt.fyi

Data from commit:
a50cb89 wpt: run reference-named files which are themselves tests (#836) (2026-09-03)

SubtestStatusMessage
SMIL clock values: out-of-range minutes/seconds validation and fractional seconds support, dur="00:30:01"FAIL
SMIL clock values: out-of-range minutes/seconds validation and fractional seconds support, dur="00:59:59"FAIL
SMIL clock values: out-of-range minutes/seconds validation and fractional seconds support, dur="00:00:01.50"FAIL
SMIL clock values: out-of-range minutes/seconds validation and fractional seconds support, dur="00:01.50"FAIL
SMIL clock values: out-of-range minutes/seconds validation and fractional seconds support, dur="00:00:59.50"FAIL
SMIL clock values: out-of-range minutes/seconds validation and fractional seconds support, dur="00:59.50"FAIL
SMIL clock values: out-of-range minutes/seconds validation and fractional seconds support, dur="101:00:01"FAIL
SMIL clock values: out-of-range minutes/seconds validation and fractional seconds support, dur="01:99:01"FAIL
SMIL clock values: out-of-range minutes/seconds validation and fractional seconds support, dur="99:01"FAIL
SMIL clock values: out-of-range minutes/seconds validation and fractional seconds support, dur="01:30:99"FAIL
SMIL clock values: out-of-range minutes/seconds validation and fractional seconds support, dur="30:99"FAIL
SMIL clock values: out-of-range minutes/seconds validation and fractional seconds support, dur="00:59:59."FAIL
SMIL clock values: out-of-range minutes/seconds validation and fractional seconds support, dur="00:59:9.9"FAIL
SMIL clock values: out-of-range minutes/seconds validation and fractional seconds support, dur="00:59:.9"FAIL
SMIL clock values: out-of-range minutes/seconds validation and fractional seconds support, dur="00:59:009"FAIL
SMIL clock values: out-of-range minutes/seconds validation and fractional seconds support, dur=":30:01"FAIL
SMIL clock values: out-of-range minutes/seconds validation and fractional seconds support, dur="01::01"FAIL
SMIL clock values: out-of-range minutes/seconds validation and fractional seconds support, dur="5:30"FAIL

/svg/animations/smil-clock-value-parsing.html

<!DOCTYPE html>
<title>SMIL clock values: out-of-range minutes/seconds validation and fractional seconds support</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<link rel="help" href="https://www.w3.org/TR/SMIL/smil-timing.html#q22">
<svg height="0"></svg>
<script>
const TESTS = [
  // Valid dur="00:30:01" (30 min 1 sec). At t=60s the animation should be running.
  { value: "00:30:01" },
  // Valid boundary dur="00:59:59". Should animate.
  { value: "00:59:59" },
  // Fractional seconds in HH:MM:SS form: dur="00:00:01.50" is 1.5s.
  // At t=60s, animation should be fully done (fill="freeze" at to=200).
  { value: "00:00:01.50", frozen: true },
  // Fractional seconds in MM:SS form: dur="00:01.50" is 1.5s
  { value: "00:01.50", frozen: true },
  // Fractional seconds near 60 boundary in HH:MM:SS form: dur="00:00:59.50" is 59.5s.
  { value: "00:00:59.50", frozen: true },
  // Fractional seconds near 60 boundary in MM:SS form: dur="00:59.50" is 59.5s.
  { value: "00:59.50", frozen: true },
  // More than 99 hours. Should animate.
  { value: "101:00:01" },

  // Invalid minutes in HH:MM:SS form.
  { value: "01:99:01", error: "minutes > 59 in HH:MM:SS" },
  // Invalid minutes in MM:SS form.
  { value: "99:01", error: "minutes > 59 in MM:SS" },
  // Invalid seconds in HH:MM:SS form.
  { value: "01:30:99", error: "seconds > 59 in HH:MM:SS" },
  // Invalid seconds in MM:SS form.
  { value: "30:99", error: "seconds > 59 in MM:SS" },
  // Invalid fraction, no digits after full stop.
  { value: "00:59:59.", error: "a fraction needs to have at least one digit" },
  // Invalid seconds in HH:MM:SS.ff form. No leading zero.
  { value: "00:59:9.9", error: "seconds < 10 should have a leading zero" },
  // Missing seconds in HH:MM:SS.ff form.
  { value: "00:59:.9", error: "seconds needs to be specified" },
  // Invalid seconds in HH:MM:SS form.
  { value: "00:59:009", error: "seconds without fraction should be two digits" },
  // Missing hour field in HH:MM:SS form.
  { value: ":30:01", error: "hours can't be missing in HH:MM:SS" },
  // Missing minutes field in HH:MM:SS form.
  { value: "01::01", error: "minutes can't be missing in HH:MM:SS" },
  // Single digit minutes field in MM:SS form.
  { value: "5:30", error: "minutes should always be two digits" },
];

promise_setup(async () => {
  const svgNs = 'http://www.w3.org/2000/svg';
  const template = document.createElementNS(svgNs, 'rect');
  [['fill', 'green'], ['width', '20'], ['height', '20'], ['class', 'test']].forEach(([name, value]) => {
    template.setAttribute(name, value);
  });
  const anim = template.appendChild(document.createElementNS(svgNs, 'animate'));
  [['attributeName', 'x'], ['from', '0'], ['to', '200'], ['fill', 'freeze']].forEach(([name, value]) => {
    anim.setAttribute(name, value);
  });
  const svgRoot = document.querySelector('svg');
  TESTS.forEach(test => {
    const testElement = template.cloneNode(true);
    const testAnimate = testElement.firstElementChild;
    testAnimate.setAttribute('dur', test.value);
    svgRoot.appendChild(testElement);

    promise_test(async () => {
      if (test.error) {
        assert_equals(testElement.x.animVal.value, 0,
                      `dur="${test.value}" should be invalid (${test.error})`);
      } else {
        if (test.frozen) {
          assert_equals(testElement.x.animVal.value, 200,
                        `dur="${test.value}" should be valid and animate (frozen)`);
        } else {
          assert_not_equals(testElement.x.animVal.value, 0,
                            `dur="${test.value}" should be valid and animate`);
        }
      }
    }, `${document.title}, dur="${test.value}"`);
  });
  svgRoot.pauseAnimations();
  svgRoot.setCurrentTime(60);

  return new Promise(resolve => {
    window.addEventListener('load', () => {
      requestAnimationFrame(resolve);
    }, {once: true});
  });
});
</script>