<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><!-- webkit-test-runner [ experimental:WebAnimationsCSSIntegrationEnabled=false ] -->
<html>
  <head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8">
    <title>-webkit-transform-origin vs. Transform Functions</title>
    <style type="text/css" media="screen">
    #a {
      top: 0px;
      left: 0px;
      position: absolute;
      -webkit-perspective: 800;
      width: 800px;
      height: 600px;
    }
    #b1 {
      top: 80px;
      left: 300px;
      width: 200px;
      height: 200px;
      position: absolute;
      background-color: #282;
      -webkit-animation-duration: 2s;
      -webkit-animation-iteration-count: infinite;
      -webkit-animation-timing-function: linear;
      -webkit-transform-origin: center center 200px;
    }
    @-webkit-keyframes b1 {
        from { -webkit-transform: rotateY(0deg); }
        5%  { -webkit-transform: rotateY(90deg); }
        20%  { -webkit-transform: rotateY(90deg); }
        50%  { -webkit-transform: rotateY(180deg); }
        75%  { -webkit-transform: rotateY(270deg); }
        to   { -webkit-transform: rotateY(360deg); }
    }
    #b2 {
      top: 320px;
      left: 300px;
      width: 200px;
      height: 200px;
      position: absolute;
      background-color: #282;
      -webkit-animation-duration: 2s;
      -webkit-animation-iteration-count: infinite;
      -webkit-animation-timing-function: linear;
    }
    @-webkit-keyframes b2 {
        from { -webkit-transform: translateZ(200px) rotateY(0deg) translateZ(-200px) }
        5%  { -webkit-transform: translateZ(200px) rotateY(90deg) translateZ(-200px) }
        20%  { -webkit-transform: translateZ(200px) rotateY(90deg) translateZ(-200px) }
        50%  { -webkit-transform: translateZ(200px) rotateY(180deg) translateZ(-200px) }
        75%  { -webkit-transform: translateZ(200px) rotateY(270deg) translateZ(-200px) }
        to   { -webkit-transform: translateZ(200px) rotateY(360deg) translateZ(-200px) }
    }
    </style>
    
    <script type="text/javascript" charset="utf-8">
      if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
      }

      resultEntries = [];

      const expected = {
          "b1" : [ 0,0,-1,0, 0,1,0,0, 1,0,0,0, 0,0,0,1 ],
          "b2" : [ 0,0,-1,0, 0,1,0,0, 1,0,0,0, -200,0,200,1 ]
      };

      const tolerance = 0.2;
      function isEqual(actual, desired)
      {
          var diff = Math.abs(actual - desired);
          return diff <= tolerance;
      }

      var numSnapshots = 0;

      function snapshot(id)
      {
          var e = document.getElementById(id);
          var t = window.getComputedStyle(e).webkitTransform;
          var a = t.split("(");
          var array = a[1].split(",");
          var pass = true;
          for (i = 0; i < 16; ++i) {
              var actual = parseFloat(array[i]);
              var expect = expected[id][i];
              if (!isEqual(actual, expect)) {
                  resultEntries.push("FAIL(element '"+id+"' matrix["+i+"]' was:"+actual+", expected:"+expect+")<br>");
                  pass = false;
              }
          }
          
          if (pass)
            resultEntries.push("PASS(element '"+id+"' matches expected value)<br>");
          
          numSnapshots++;
          if (numSnapshots == 2) {
              resultEntries.sort();
              document.getElementById('result').innerHTML = resultEntries.join("");
              if (window.testRunner)
                  testRunner.notifyDone();
          }
      }
      
      function snapshotOnTimeout(id) {
          setTimeout("snapshot('" + id + "')", 250);
      }

      function startAnimation(id)
      {
          var element = document.getElementById(id);
          element.addEventListener('webkitAnimationStart', function() {
              // delay to give hardware animations a chance to start
              window.setTimeout("snapshotOnTimeout('" + id + "')", 0);
          }, false);
          element.style.webkitAnimationName = id;
      }

      function start()
      {
          startAnimation('b1');
          startAnimation('b2');
      }

    </script>
  </head>
  <body onload="start()">
    <div id="a">
        <div id="b1"> </div>
        <div style="-webkit-transform:translateZ(-200px); -webkit-transform-style:preserve-3d;">
            <div id="b2"> </div>
        </div>
    </div>
  </body>
  <div id="result"> </div>
</html>
