<!DOCTYPE html>
<title>Test DOM APIs which flush the style properly, with d property</title>
<meta charset=utf-8>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

<style>
svg {
  width: 10%;
  height: 10%;
  background: #eee;
}
svg path {
  fill: none;
  stroke: #000;
}
</style>

<div id="log"></div>

<svg viewBox="0 0 20 20" id="svgroot"></svg>

<script>
'use strict';

function createPath(t) {
  const target = document.createElementNS("http://www.w3.org/2000/svg", "path");
  document.getElementById('svgroot').appendChild(target);

  if (t && typeof t.add_cleanup === "function") {
    t.add_cleanup(function() {
      target.remove();
    });
  }

  // Set an initial d and flush style first to make sure the following DOM APIs
  // do flush again.
  target.style.d = 'path("M 0 0")';
  assert_equals(getComputedStyle(target).d, 'path("M 0 0")', "the initial d");
  return target;
}

test(function(t) {
  const target = createPath(t);
  target.style.d = 'path("M5,5 L10,5 L10,10")';
  assert_equals(target.getTotalLength(), 10, "the total length");
}, "getTotalLength() with d property");

test(function(t) {
  const target = createPath(t);
  target.style.d = 'path("M5,5 L10,5 L10,10")';
  // The first segment of path is (5,5) to (10,5), its length is 5.
  // The second segment of path is (10,5) to (10,10), its length is 5.
  // So, the length 8 is on the 2nd segment, at (10,8).
  const point = target.getPointAtLength(8);
  assert_equals(point.x, 10, "x-axis position");
  assert_equals(point.y, 8, "y-axis position");
}, "getPointAtLength() with d property");

test(function(t) {
  const target = createPath(t);
  const svgPoint = document.getElementById("svgroot").createSVGPoint();
  svgPoint.x = 10;
  svgPoint.y = 8;

  target.style.d = 'path("M5,5 L10,5 L10,10")';
  assert_equals(target.isPointInFill(svgPoint), true);
}, "isPointInFill() with d property");

test(function(t) {
  const target = createPath(t);
  const svgPoint = document.getElementById("svgroot").createSVGPoint();
  svgPoint.x = 10;
  svgPoint.y = 8;

  target.style.d = 'path("M5,5 L10,5 L10,10")';
  assert_equals(target.isPointInStroke(svgPoint), true);
}, "isPointInStroke() with d property");

</script>
