<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="resources/SVGTestCase.js"></script>
<script src="../../resources/js-test-pre.js"></script>
<script src="../../fast/repaint/resources/repaint.js"></script>
<style type="text/css" media="screen">
  .column {
    margin: 10px;
    display: inline-block;
    vertical-align: top;
  }
  .container {
    position: relative;
    height: 200px;
    width: 200px;
    margin: 10px;
    background-color: silver;
    border: 1px solid black;
  }
  #wrapper {
      position: relative;
      top: 0;
      left: 0;
      height: 60px;
      width: 60px;
      -webkit-transform-origin: top left; /* to match SVG */
  }
</style>
</head>
<body>
<div class="column">
  <div class="container">
    <svg id="svg1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" style="width:200px; height:200px;">
      <rect id="rect1" x="0" y="0" height="60" width="60" fill="green"/>
    </svg>
  </div>
  <div class="container">
    <svg id="svg2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" style="width:200px; height:200px;">
      <rect id="rect2" x="0" y="0" height="60" width="60" fill="green" transform="translate(1000, 1000) rotate(90)"/>
    </svg>
  </div>
</div>
<div class="column">
  <div class="container">
    <svg id="svg1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" style="width:200px; height:200px;">
      <rect id="rect3" x="0" y="0" height="60" width="60" fill="green"/>
    </svg>
  </div>
  <div class="container">
    <svg id="svg2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" style="width:200px; height:200px;">
      <rect id="rect4" x="0" y="0" height="60" width="60" fill="green" transform="translate(1000, 1000) rotate(90)"/>
    </svg>
  </div>
</div>
<div class="column">
  <div class="container">
    <div id="wrapper">
      <svg id="svg3" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200" style="width:200px; height:200px;">
        <rect id="rect5" x="0" y="0" height="60" width="60" fill="green"/>
      </svg>
    </div>
  </div>
</div>
<h1>SVG 1.1 dynamic update tests</h1>
<p id="description"></p>
<p>Also, to pass the test, the rectangles should be rotated with 45deg</p>
<div id="console"></div>
<script>
// [Expected rendering result] 'Test passed' message - and a series of PASS messages

description("Tests dynamic updates of the '-webkit-transform' on SVG element");
//createSVGTestCase();

function dumpRect(r) {
  return "[" + r.x
        + " " + r.y
        + " " + r.width 
        + " " + r.height
        + "]";
}

function dumpMatrix(matrix) {
  return "[" + matrix.a.toFixed(1)
        + " " + matrix.b.toFixed(1)
        + " " + matrix.c.toFixed(1)
        + " " + matrix.d.toFixed(1)
        + " " + matrix.e.toFixed(1)
        + " " + matrix.f.toFixed(1)
        + "]";
}

function dumpTransform(transform) {
  var transformTypes = {
    "0": "SVG_TRANSFORM_UNKNOWN",
    "1": "SVG_TRANSFORM_MATRIX",
    "2": "SVG_TRANSFORM_TRANSLATE",
    "3": "SVG_TRANSFORM_SCALE",
    "4": "SVG_TRANSFORM_ROTATE",
    "5": "SVG_TRANSFORM_SKEWX",
    "6": "SVG_TRANSFORM_SKEWY"
  };

  return "type=" + transformTypes[transform.type] + " matrix=" + dumpMatrix(transform.matrix);
}

var rect1 = document.getElementById("rect1");
var rect2 = document.getElementById("rect2");
var rect3 = document.getElementById("rect3");
var rect4 = document.getElementById("rect4");
var rect5 = document.getElementById("rect5");

var wrapper = document.getElementById("wrapper");

debug("");
debug("Transform via style attribute");
rect1.setAttribute("style", "-webkit-transform: translate(100px, 25px) scale(2) rotate(45deg)");

shouldBeEqualToString("rect1.style.webkitTransform", "translate(100px, 25px) scale(2) rotate(45deg)");
shouldBeEqualToString("dumpMatrix(rect1.getCTM())", "[1.4 1.4 -1.4 1.4 100.0 25.0]");
shouldBeEqualToString("dumpMatrix(new WebKitCSSMatrix(rect1.style.webkitTransform))", "[1.4 1.4 -1.4 1.4 100.0 25.0]");
shouldBe("dumpMatrix(new WebKitCSSMatrix(rect1.style.webkitTransform))", "dumpMatrix(rect1.getCTM())");
shouldBe("rect1.transform.baseVal.numberOfItems", "0");
shouldBeNull("rect1.getAttribute('transform')");


shouldBeEqualToString("dumpMatrix(rect2.getCTM())", "[0.0 1.0 -1.0 0.0 1000.0 1000.0]");
shouldBeEqualToString("dumpMatrix(new WebKitCSSMatrix(rect2.style.webkitTransform))", "[1.0 0.0 0.0 1.0 0.0 0.0]");

rect2.setAttribute("style", "-webkit-transform: translate(100px, 25px) scale(2) rotate(45deg)");

shouldBeEqualToString("rect2.style.webkitTransform", "translate(100px, 25px) scale(2) rotate(45deg)");
shouldBeEqualToString("dumpMatrix(rect2.getCTM())", "[1.4 1.4 -1.4 1.4 100.0 25.0]");
shouldBeEqualToString("dumpMatrix(new WebKitCSSMatrix(rect2.style.webkitTransform))", "[1.4 1.4 -1.4 1.4 100.0 25.0]");
shouldBe("dumpMatrix(new WebKitCSSMatrix(rect2.style.webkitTransform))", "dumpMatrix(rect2.getCTM())");
shouldBe("rect2.transform.baseVal.numberOfItems", "2");
shouldBeEqualToString("rect2.getAttribute('transform')", "translate(1000, 1000) rotate(90)");
shouldBeEqualToString("dumpTransform(rect2.transform.baseVal.getItem(0))", "type=SVG_TRANSFORM_TRANSLATE matrix=[1.0 0.0 0.0 1.0 1000.0 1000.0]");
shouldBeEqualToString("dumpTransform(rect2.transform.baseVal.getItem(1))", "type=SVG_TRANSFORM_ROTATE matrix=[0.0 1.0 -1.0 0.0 0.0 0.0]");

debug("");
debug("Transform via CSS");
rect3.style.webkitTransform = "translate(100px, 25px) scale(2) rotate(45deg)";

shouldBeEqualToString("rect3.style.webkitTransform", "translate(100px, 25px) scale(2) rotate(45deg)");
shouldBeEqualToString("dumpMatrix(rect3.getCTM())", "[1.4 1.4 -1.4 1.4 100.0 25.0]");
shouldBeEqualToString("dumpMatrix(new WebKitCSSMatrix(rect3.style.webkitTransform))", "[1.4 1.4 -1.4 1.4 100.0 25.0]");
shouldBe("dumpMatrix(new WebKitCSSMatrix(rect3.style.webkitTransform))", "dumpMatrix(rect3.getCTM())");
shouldBe("rect3.transform.baseVal.numberOfItems", "0");
shouldBeNull("rect3.getAttribute('transform')");


shouldBeEqualToString("dumpMatrix(rect2.getCTM())", "[1.4 1.4 -1.4 1.4 100.0 25.0]");
shouldBeEqualToString("dumpMatrix(new WebKitCSSMatrix(rect2.style.webkitTransform))", "[1.4 1.4 -1.4 1.4 100.0 25.0]");

rect4.style.webkitTransform = "translate(100px, 25px) scale(2) rotate(45deg)";

shouldBeEqualToString("rect4.style.webkitTransform", "translate(100px, 25px) scale(2) rotate(45deg)");
shouldBeEqualToString("dumpMatrix(rect4.getCTM())", "[1.4 1.4 -1.4 1.4 100.0 25.0]");
shouldBeEqualToString("dumpMatrix(new WebKitCSSMatrix(rect4.style.webkitTransform))", "[1.4 1.4 -1.4 1.4 100.0 25.0]");
shouldBe("dumpMatrix(new WebKitCSSMatrix(rect4.style.webkitTransform))", "dumpMatrix(rect4.getCTM())");
shouldBe("rect4.transform.baseVal.numberOfItems", "2");
shouldBeEqualToString("rect4.getAttribute('transform')", "translate(1000, 1000) rotate(90)");
shouldBeEqualToString("dumpTransform(rect4.transform.baseVal.getItem(0))", "type=SVG_TRANSFORM_TRANSLATE matrix=[1.0 0.0 0.0 1.0 1000.0 1000.0]");
shouldBeEqualToString("dumpTransform(rect4.transform.baseVal.getItem(1))", "type=SVG_TRANSFORM_ROTATE matrix=[0.0 1.0 -1.0 0.0 0.0 0.0]");

debug("");
debug("Transform on wrapper div");
wrapper.style.webkitTransform = "translate(100px, 25px) scale(2) rotate(45deg)";
shouldBeEqualToString("rect5.style.webkitTransform", "");
shouldBeEqualToString("dumpMatrix(rect5.getCTM())", "[1.0 0.0 0.0 1.0 0.0 0.0]");
shouldBeEqualToString("dumpMatrix(new WebKitCSSMatrix(rect5.style.webkitTransform))", "[1.0 0.0 0.0 1.0 0.0 0.0]");
shouldBe("dumpMatrix(new WebKitCSSMatrix(rect5.style.webkitTransform))", "dumpMatrix(rect5.getCTM())");
shouldBe("rect5.transform.baseVal.numberOfItems", "0");
shouldBeNull("rect5.getAttribute('transform')");

debug("");
var successfullyParsed = true;
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
