3 <title>Test offsetX/offsetY on various types of elements</title>
4 <script type="text/javascript" charset="utf-8">
5 if (window.testRunner) {
6 testRunner.dumpAsText();
7 testRunner.waitUntilDone();
10 function mousemoved(e)
12 var resultBox = document.getElementById('mousepos');
13 var offsets = 'element id: ' + e.target.id + '<br> clientX: ' + e.clientX + ' clientY: ' + e.clientY + '<br>';
14 offsets += 'offsetX: ' + e.offsetX + ' offsetY: ' + e.offsetY;
15 resultBox.innerHTML = offsets;
20 var resultsDiv = document.getElementById('results');
21 resultsDiv.innerHTML += s + '<br>';
26 // Scroll so that frame view offsets are non-zero
27 window.scrollTo(20, 100);
29 document.getElementById('overflow').scrollLeft = 80;
30 document.getElementById('overflow').scrollTop = 60;
32 // In non-test mode, show the mouse coords for testing
33 if (!window.testRunner)
34 document.body.addEventListener('mousemove', mousemoved, false);
38 var positions = sumPositions(document.getElementById('abs-box'));
39 var clientX = positions.offsetLeft - positions.scrollLeft + offsetX;
40 var clientY = positions.offsetTop - positions.scrollTop + offsetY;
41 dispatchEvent(clientX, clientY, 'abs-box', offsetX, offsetY);
45 positions = sumPositions(document.getElementById('rel-box'));
46 clientX = positions.offsetLeft + positions.clientLeft - positions.scrollLeft + offsetX;
47 clientY = positions.offsetTop + positions.clientLeft - positions.scrollTop + offsetY;
48 dispatchEvent(clientX, clientY, 'rel-box', offsetX, offsetY);
52 positions = sumPositions(document.getElementById('fixed-box'));
53 clientX = positions.offsetLeft + offsetX;
54 clientY = positions.offsetTop + offsetY;
55 dispatchEvent(clientX, clientY, 'fixed-box', offsetX, offsetY);
59 positions = sumPositions(document.getElementById('with-bordertopextra'));
60 clientX = positions.offsetLeft - positions.scrollLeft + offsetX;
61 clientY = positions.offsetTop - positions.scrollTop + offsetY;
62 dispatchEvent(clientX, clientY, 'with-bordertopextra', offsetX, offsetY);
66 positions = sumPositions(document.getElementById('in-columns'));
67 clientX = positions.offsetLeft + positions.clientLeft - positions.scrollLeft + offsetX;
68 clientY = positions.offsetTop + positions.clientTop - positions.scrollTop + offsetY;
69 dispatchEvent(clientX, clientY, 'in-columns', offsetX, offsetY);
73 positions = sumPositions(document.getElementById('inside-overflow'));
74 clientY = positions.offsetTop + positions.clientTop - positions.scrollTop + offsetY;
76 var content = document.getElementById('overflow-contents');
77 positions = sumPositions(content);
78 var inside = document.getElementById('inside-overflow');
79 var overflow = document.getElementById('overflow');
80 clientX = positions.offsetLeft + overflow.clientLeft + content.clientWidth - inside.clientWidth - window.scrollX + offsetX;
81 dispatchEvent(clientX, clientY, 'inside-overflow', offsetX, offsetY);
85 positions = sumPositions(document.getElementById('transformed'));
86 var sin20 = Math.sin(-20 * Math.PI / 180);
87 var cos20 = Math.cos(-20 * Math.PI / 180);
88 clientX = positions.offsetLeft + positions.clientLeft - positions.scrollLeft + 100 + Math.round(100 - (100 - offsetX) * cos20 - (60 - offsetY) * sin20);
89 clientY = positions.offsetTop + positions.clientTop - positions.scrollTop + 50 + Math.round(60 + (100 - offsetX) * sin20 - (60 - offsetY) * cos20);
90 dispatchEvent(clientX, clientY, 'transformed', offsetX, offsetY);
92 if (window.testRunner)
93 testRunner.notifyDone();
96 function sumPositions(element)
105 offsetLeft += element.offsetLeft;
106 offsetTop += element.offsetTop;
107 clientLeft += element.clientLeft;
108 clientTop += element.clientTop;
109 scrollLeft += element.scrollLeft;
110 scrollTop += element.scrollTop;
111 element = element.offsetParent;
113 return { 'offsetLeft': offsetLeft, 'offsetTop': offsetTop, 'clientLeft': clientLeft, 'clientTop': clientTop, 'scrollLeft': scrollLeft, 'scrollTop': scrollTop };
116 function dispatchEvent(clientX, clientY, expectedElementID, expectedOffsetX, expectedOffsetY)
118 var ev = document.createEvent("MouseEvent");
119 ev.initMouseEvent("click", true, true, window, 1, 1, 1, clientX, clientY, false, false, false, false, 0, document);
120 ev.expectedElement = expectedElementID;
121 ev.expectedOffsetX = expectedOffsetX;
122 ev.expectedOffsetY = expectedOffsetY;
123 var target = document.elementFromPoint(ev.clientX, ev.clientY);
124 target.dispatchEvent(ev);
127 function clicked(event)
129 var element = event.target;
132 if (element.id == event.expectedElement &&
133 event.offsetX == event.expectedOffsetX &&
134 event.offsetY == event.expectedOffsetY)
135 result = 'PASS: event hit ' + element.id + ' at offset (' + event.offsetX + ', ' + event.offsetY + ')';
137 result = 'FAIL: event at (' + event.clientX + ', ' + event.clientY + ') expected to hit ' + event.expectedElement + ' at (' + event.expectedOffsetX + ', ' + event.expectedOffsetY + ') but hit ' + element.id + ' at (' + event.offsetX + ', ' + event.offsetY + ')';
142 window.addEventListener('load', function() {
143 window.setTimeout(test, 0);
146 <style type="text/css" media="screen">
159 background-color: gray;
168 border: 15px solid gray;
177 background-color: #CCC;
186 background-color: #AAA;
191 -webkit-column-count: 3;
195 border: 2px solid black;
204 background-color: gray;
210 background-color: #DDD;
211 -webkit-transform: translate(100px, 50px) rotate(20deg);
220 border: 2px solid black;
227 background-color: #BBB;
232 background-color: gray;
250 /* -webkit-transform: rotate(10deg);*/
254 <body onclick="clicked(event)">
256 <div id="filler" style="position: absolute; top: 0; width: 100%; height: 100%"></div>
258 <!-- Test assumes offsetX/offsetY are relative to border box, but see
259 http://www.quirksmode.org/dom/w3c_cssom.html#mousepos -->
270 <table border="2" cellspacing="3" cellpadding="2" style="width: 400px; margin-top: 280px; margin-left: 40px;">
271 <tr><th>First</th><th>Second</th></tr>
272 <tr style="vertical-align: center;"><td>This cell has borderTopExtra<div class="box" id="with-bordertopextra" style="position: relative; height: 20px; margin: 4px;"></div></td><td>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
277 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. <span id="in-columns">In columns</span> Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
280 <div id="transformed">
285 <div id="overflow-contents">
286 <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p>
287 <div id="inside-overflow">In RTL overflow</div>
288 <p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
291 <div id="results"></div>
292 <div id="mousepos"></div>