| <!DOCTYPE html> |
| <html> |
| <head> |
| <meta name="viewport" content="initial-scale=1, minimum-scale=1, maximum-scale=1"> |
| <style> |
| * { |
| margin: 0; |
| padding: 0; |
| } |
| |
| body { |
| height: 2048px; |
| width: 2048px; |
| cursor: crosshair; /* Debugging */ |
| } |
| |
| .box { |
| width: 200px; |
| height: 100px; |
| border: 10px solid gray; |
| } |
| |
| .line { |
| width:150px; |
| height:20px; |
| background: gray; |
| } |
| |
| .target { |
| background: lightGreen !important; /* Elements we click on are green */ |
| } |
| |
| #absolute { |
| position: absolute; |
| left: 100px; |
| top: 125px; |
| } |
| |
| #relative { |
| position: relative; |
| left: 40px; |
| top: -50px; |
| } |
| |
| #fixed { |
| position: fixed; |
| top: 50px; |
| left: 200px; |
| height: 50px; |
| } |
| |
| #filler { |
| position: absolute; |
| top: 0; |
| width: 100%; |
| height: 100%; |
| } |
| |
| table { |
| margin-top: 300px; |
| margin-left: 40px; |
| width: 400px; |
| } |
| |
| th { height: 30px; } |
| |
| #table-content { |
| position: relative; |
| border: 10px solid gray; |
| } |
| |
| #columns { |
| position: absolute; |
| width: 400px; |
| height: 200px; |
| top: 220px; |
| left: 500px; |
| border: 1px solid black; |
| -webkit-column-count: 3; |
| -webkit-column-fill: auto; |
| column-count: 3; |
| column-fill: auto; |
| } |
| |
| .column-line { |
| width: 100px; |
| height: 20px; |
| background: gray; |
| } |
| |
| #transformed { |
| position: absolute; |
| top: 470px; |
| height: 120px; |
| width: 200px; |
| -webkit-transform: translate(100px, 50px) rotate(20deg); |
| } |
| |
| #overflow { |
| overflow: hidden; /* No scrollbars */ |
| position: absolute; |
| width: 300px; |
| height: 200px; |
| top: 450px; |
| left: 470px; |
| border: 1px solid black; |
| direction: rtl; |
| } |
| |
| #overflow-contents { |
| height: 500px; |
| width: 120%; |
| } |
| |
| #inside-overflow { |
| height: 550px; |
| width: 50%; |
| } |
| |
| #results { |
| position: absolute; |
| left: 30px; |
| top: 750px; |
| } |
| |
| #mouse-position { |
| position: absolute; |
| left: 30px; |
| top: 670px; |
| color: gray; |
| } |
| |
| #subpixel-test { |
| width: 4.5px; |
| } |
| </style> |
| </head> |
| <body> |
| |
| <!-- |
| This test is modeled after <LayoutTests/fast/events/offsetX-offsetY.html>, |
| but it is designed to not depend on inline text content to position the |
| targets on which we click. |
| --> |
| |
| <!-- Filler, to force scrolling --> |
| <div id="filler"></div> |
| |
| <!-- Absolute, Relative, and Fixed position --> |
| <div id="absolute" class="box target"> |
| <span style="position:absolute;left:0;top:0">Absolute</span> |
| <div id="relative" class="box target">Relative</div> |
| <div id="fixed" class="box target">Fixed</div> |
| </div> |
| |
| <!-- Table --> |
| <table id="table" border="2" cellpadding="3" cellpadding="2"> |
| <tr><th>x</th><th>x</th></tr> |
| <tr> |
| <td><div id="table-content" class="line target">Table Content</div></td> |
| <td> |
| <div class="line"></div><div class="line"></div> |
| <div class="line"></div><div class="line"></div> |
| <div class="line"></div><div class="line"></div> |
| </td> |
| </tr> |
| </table> |
| |
| <!-- Columns --> |
| <div id="columns"> |
| <div class="column-line"></div><div class="column-line"></div> |
| <div class="column-line"></div><div class="column-line"></div> |
| <div class="column-line"></div><div class="column-line"></div> |
| <div class="column-line"></div><div class="column-line"></div> |
| <div class="column-line"></div><div class="column-line"></div> |
| <div class="column-line"></div><div class="column-line"></div> |
| <div id="in-columns" class="column-line target">In Columns</div> |
| <div class="column-line"></div><div class="column-line"></div> |
| <div class="column-line"></div><div class="column-line"></div> |
| <div class="column-line"></div><div class="column-line"></div> |
| <div class="column-line"></div><div class="column-line"></div> |
| <div class="column-line"></div><div class="column-line"></div> |
| <div class="column-line"></div><div class="column-line"></div> |
| <div class="column-line"></div><div class="column-line"></div> |
| </div> |
| |
| <!-- Transformed --> |
| <div id="transformed" class="box target">Transformed</div> |
| |
| <!-- Overflowed Content --> |
| <div id="overflow"> |
| <div id="overflow-contents"> |
| <div class="line"></div><div class="line"></div><div class="line"></div> |
| <div class="line"></div><div class="line"></div><div class="line"></div> |
| <div class="line"></div><div class="line"></div><div class="line"></div> |
| <div id="inside-overflow" class="target">In RTL overflow</div> |
| <div class="line"></div><div class="line"></div><div class="line"></div> |
| </div> |
| </div> |
| |
| <!-- Debugging --> |
| <div id="results"></div> |
| <div id="mouse-position"></div> |
| |
| <!-- Test for subpixel support --> |
| <div id="subpixel-test"></div> |
| <script> |
| // Debug mode. |
| if (!window.testRunner) { |
| document.body.onmousemove = function(e) { |
| var resultBox = document.getElementById('mouse-position'); |
| var offsets = 'element id: ' + e.target.id + '<br> clientX: ' + e.clientX + ' clientY: ' + e.clientY + '<br>'; |
| offsets += 'offsetX: ' + e.offsetX + ' offsetY: ' + e.offsetY; |
| resultBox.innerHTML = offsets; |
| } |
| } |
| |
| function log(s) { |
| var resultsDiv = document.getElementById('results'); |
| resultsDiv.innerHTML += s + '<br>'; |
| } |
| |
| function dispatchEvent(clientX, clientY, expectedElementID, expectedOffsetX, expectedOffsetY) { |
| var e = document.createEvent("MouseEvent"); |
| e.initMouseEvent("click", true, true, window, 1, 1, 1, clientX, clientY, false, false, false, false, 0, document); |
| e.expectedElementID = expectedElementID; |
| e.expectedOffsetX = expectedOffsetX; |
| e.expectedOffsetY = expectedOffsetY; |
| var target = document.elementFromPoint(e.clientX, e.clientY); |
| target.dispatchEvent(e); |
| } |
| |
| function clicked(event) { |
| var element = event.target; |
| var result; |
| if (element.id === event.expectedElementID && event.offsetX === event.expectedOffsetX && event.offsetY === event.expectedOffsetY) { |
| result = 'PASS:'; |
| result += ' event at (' + event.clientX + ', ' + event.clientY + ')'; |
| result += ' hit ' + element.id; |
| result += ' at offset (' + event.offsetX + ', ' + event.offsetY + ')'; |
| } else { |
| result = 'FAIL:'; |
| result += ' event at (' + event.clientX + ', ' + event.clientY + ')'; |
| result += ' expected to hit ' + event.expectedElementID; |
| result += ' at (' + event.expectedOffsetX + ', ' + event.expectedOffsetY + ')'; |
| result += ' but hit ' + element.id + ' at (' + event.offsetX + ', ' + event.offsetY + ')'; |
| } |
| log(result); |
| } |
| |
| if (window.testRunner) { |
| window.testRunner.dumpAsText(); |
| window.testRunner.waitUntilDone(); |
| } |
| |
| // Start the test. |
| document.body.addEventListener('click', clicked, false); |
| window.addEventListener('load', function() { |
| var r = document.getElementById('subpixel-test').getBoundingClientRect(); |
| var hasSubpixelSupport = r.right - r.left == 4.5; |
| |
| setTimeout(function() { |
| // Scroll body and inner overflow box. |
| window.scrollTo(20, 100); |
| var overflowContent = document.getElementById('overflow'); |
| overflowContent.scrollLeft = 80; |
| overflowContent.scrollTop = 60; |
| setTimeout(function() { |
| // Dispatch events. |
| dispatchEvent(109, 57, 'absolute', 29, 32); |
| dispatchEvent(161, 13, 'relative', 31, 28); |
| dispatchEvent(40, 297, 'table-content', 15, 18); |
| dispatchEvent(122, 407, 'transformed', 18, 15); |
| dispatchEvent(573, 480, 'inside-overflow', 2, 9); |
| dispatchEvent(707, 174, 'in-columns', hasSubpixelSupport ? 87 : 88, 13); |
| dispatchEvent(241, 67, 'fixed', 41, 17); |
| dispatchEvent(244, 102, 'fixed', 44, 52); |
| dispatchEvent(388, 88, 'fixed', 188, 38); |
| |
| // End asynchronous test. |
| if (window.testRunner) |
| window.testRunner.notifyDone(); |
| }, 0); |
| }, 0); |
| }, false); |
| </script> |
| </body> |
| </html> |