| <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" |
| "http://www.w3.org/TR/html4/loose.dtd"> |
| |
| <html lang="en"> |
| <head> |
| <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |
| <title>Transform Origin</title> |
| <style type="text/css" media="screen"> |
| .container { |
| height: 100px; |
| width: 200px; |
| margin: 30px; |
| outline: 1px solid black; |
| } |
| .box { |
| height: 100%; |
| width: 100%; |
| padding: 5px; |
| margin: 5px; |
| border: 5px solid gray; |
| background-color: green; |
| -webkit-transform-origin: 20% 50%; |
| } |
| #results { |
| margin-top: 150px; |
| } |
| </style> |
| <script type="text/javascript" charset="utf-8"> |
| if (window.testRunner) { |
| testRunner.dumpAsText(); |
| testRunner.waitUntilDone(); |
| } |
| |
| var gTests = [ |
| { 'transform' : 'translate(80px, 90px)', 'result' : 'matrix(1, 0, 0, 1, 80, 90)' }, |
| { 'transform' : 'translate(10px, 50%)', 'result' : 'matrix(1, 0, 0, 1, 10, 60)' }, |
| { 'transform' : 'scale(1.2, 0.8)', 'result' : 'matrix(1.2, 0, 0, 0.8, 0, 0)' }, |
| { 'transform' : 'skew(-0.7rad, 20deg)', 'result' : 'matrix(1, 0.36397, -0.842288, 1, 0, 0)' }, |
| { 'transform' : 'rotate(45deg)', 'result' : 'matrix(0.707107, 0.707107, -0.707107, 0.707107, 0, 0)' }, |
| ]; |
| |
| function compareTransform(expected, computed) |
| { |
| var re = /^matrix\(([^,]+), ([^,]+), ([^,]+), ([^,]+), ([^,]+?)(?:px)?, ([^,]+?)(?:px)?\)$/; |
| var parsedExpected = re.exec(expected); |
| var parsedComputed = re.exec(computed); |
| for(var i = 1; i < 7; i++) { |
| // use +/- 0.05 to avoid problems with rounding |
| if (!(Math.abs(parsedComputed[i] - parsedExpected[i]) < 0.05)) |
| return false; |
| } |
| return true; |
| } |
| |
| function runTests() |
| { |
| var testBox = document.getElementById('test-box'); |
| var testSpan = document.getElementById('test-span'); |
| var resultsBox = document.getElementById('results'); |
| |
| gTests.forEach(function(curTest) { |
| // set one of our test transforms |
| testBox.style.webkitTransform = curTest.transform; |
| testSpan.style.webkitTransform = curTest.transform; |
| // read back computed style |
| var computedTransform = window.getComputedStyle(testBox).webkitTransform; |
| var computedSpanTransform = window.getComputedStyle(testSpan).webkitTransform; |
| // compare expected result to computed transformation matrix |
| var success = compareTransform(curTest.result, computedTransform); |
| var result; |
| if (success) |
| result = curTest.transform + ' expected <code>' + curTest.result + '</code> : PASS'; |
| else |
| result = curTest.transform + ' expected <code>' + curTest.result + '</code>, got <code>' + computedTransform + '</code> : FAIL'; |
| resultsBox.innerHTML += result + '<br>'; |
| |
| if (computedSpanTransform !== 'none') { |
| result = curTest.transform + ' applied to a non-box element: ' + ' expected <code>none</code> got <code>' + computedSpanTransform + '</code> : FAIL'; |
| resultsBox.innerHTML += result + '<br>'; |
| } |
| }); |
| |
| if (window.testRunner) |
| testRunner.notifyDone(); |
| } |
| </script> |
| </head> |
| <body onload="runTests()"> |
| |
| <div class="container"> |
| <div id="test-box" class="box"></div> |
| </div> |
| |
| <span id="test-span" class="box"></span> |
| |
| <div id="results"> |
| </div> |
| </body> |
| </html> |