f9b7d9dac24e9b5a506281dd82fdd5bb766db071
[WebKit-https.git] / LayoutTests / touchadjustment / resources / touchadjustment.js
1 /* function for finding the absolute bounds of a node */
2 function findAbsoluteBounds(node)
3 {
4     var bounds = {left: 0, top: 0};
5     bounds.width = node.clientWidth;
6     bounds.height = node.clientHeight;
7     do {
8         bounds.left += node.offsetLeft;
9         bounds.top += node.offsetTop;
10     } while (node = node.offsetParent);
11     return bounds;
12 }
13
14 function nodeToString(node)
15 {
16     if (node === undefined)
17         return 'undefined';
18     if (node === null)
19         return 'null';
20     if (!node.nodeName)
21         return 'not a node';
22     if (node.nodeType == 3)
23         return "'"+node.nodeValue+"'";
24     return node.nodeName + (node.id ? ('#' + node.id) : '');
25 }
26
27 function boundsToString(bounds)
28 {
29     return "("+bounds.left+","+bounds.top+")x("+bounds.width+","+bounds.height+")";
30 }
31
32 function pointToString(point)
33 {
34     return "("+point.x+","+point.y+")";
35 }
36
37
38 function shouldBeNode(adjustedNode, targetNode) {
39     if (typeof targetNode == "string") {
40         var adjustedNodeString = nodeToString(adjustedNode);
41         if (targetNode == adjustedNodeString) {
42             testPassed("adjusted node was " + targetNode + ".");
43         }
44         else {
45             testFailed("adjusted node should be " + targetNode  + ". Was " + adjustedNodeString + ".");
46         }
47         return;
48     }
49     if (targetNode == adjustedNode) {
50         testPassed("adjusted node was " + nodeToString(targetNode) + ".");
51     }
52     else {
53         testFailed("adjusted node should be " + nodeToString(targetNode)  + ". Was " + nodeToString(adjustedNode) + ".");
54     }
55 }
56
57 function shouldBeWithin(adjustedPoint, targetArea) {
58     if (adjustedPoint.x >= targetArea.left && adjustedPoint.y >= targetArea.top
59         && adjustedPoint.x <= (targetArea.left + targetArea.width)
60         && adjustedPoint.y <= (targetArea.top + targetArea.height)) {
61         testPassed("adjusted point was within " + boundsToString(targetArea));
62     } else {
63         testFailed("adjusted node should be within " + boundsToString(targetArea)  + ". Was " + pointToString(adjustedPoint));
64     }
65 }
66
67 function testTouchPoint(touchpoint, targetNode, allowTextNodes)
68 {
69     var adjustedNode = internals.touchNodeAdjustedToBestClickableNode(touchpoint.left, touchpoint.top, touchpoint.width, touchpoint.height, document);
70     if (!allowTextNodes && adjustedNode && adjustedNode.nodeType == 3)
71         adjustedNode = adjustedNode.parentNode;
72     shouldBeNode(adjustedNode, targetNode);
73 }
74
75 function testTouchPointContextMenu(touchpoint, targetNode, allowTextNodes)
76 {
77     var adjustedNode = internals.touchNodeAdjustedToBestContextMenuNode(touchpoint.left, touchpoint.top, touchpoint.width, touchpoint.height, document);
78     if (!allowTextNodes && adjustedNode && adjustedNode.nodeType == 3)
79         adjustedNode = adjustedNode.parentNode;
80     shouldBeNode(adjustedNode, targetNode);
81 }
82
83 function adjustTouchPoint(touchpoint)
84 {
85     var adjustedPoint = internals.touchPositionAdjustedToBestClickableNode(touchpoint.left, touchpoint.top, touchpoint.width, touchpoint.height, document);
86     return adjustedPoint;
87 }
88
89 function adjustTouchPointContextMenu(touchpoint)
90 {
91     var adjustedPoint = internals.touchPositionAdjustedToBestContextMenuNode(touchpoint.left, touchpoint.top, touchpoint.width, touchpoint.height, document);
92     return adjustedPoint;
93 }
94
95 function touchPoint(x, y, radiusX, radiusY)
96 {
97     if (!radiusY)
98         radiusY = radiusX;
99     var touchpoint = new Object();
100     touchpoint.left = x - radiusX;
101     touchpoint.top = y - radiusY;
102     touchpoint.width = radiusX * 2;
103     touchpoint.height = radiusY * 2;
104     return touchpoint;
105 }
106
107 function offsetTouchPoint(bounds, relativePosition, touchOffset, touchRadiusX, touchRadiusY)
108 {
109     if (!touchRadiusY)
110         touchRadiusY = touchRadiusX;
111
112     var touchpoint = {left : bounds.left, top: bounds.top };
113  
114     // Set center point for touch.
115     switch (relativePosition) {
116     case 'center':
117         touchpoint.left += bounds.width / 2;
118         touchpoint.top += bounds.height / 2;
119         break;
120     case 'left':
121         touchpoint.left -= touchOffset;
122         touchpoint.top += bounds.height / 2;
123         break;
124     case 'right':
125         touchpoint.left += bounds.width + touchOffset;
126         touchpoint.top +=  bounds.height / 2;
127         break;
128     case 'top-left':
129         touchpoint.left -= touchOffset;
130         touchpoint.top -= touchOffset;
131         break;
132     case 'top-right':
133         touchpoint.left += bounds.width + touchOffset;
134         touchpoint.top -= touchOffset;
135         break;
136     case 'bottom-left':
137         touchpoint.left -= touchOffset;
138         touchpoint.top += bounds.height + touchOffset;
139         break;
140     case 'bottom-right':
141         touchpoint.left += bounds.width + touchOffset;
142         touchpoint.top += bounds.height + touchOffset;
143         break;
144     case 'top':
145         touchpoint.left += bounds.width / 2;
146         touchpoint.top -= touchOffset;
147         break;
148     case 'bottom':
149         touchpoint.left += bounds.width / 2;
150         touchpoint.top += bounds.height + touchOffset;
151     }
152     // Adjust from touch center to top-left corner.
153     touchpoint.left -= touchRadiusX;
154     touchpoint.top -= touchRadiusY;
155
156     touchpoint.width = 2 * touchRadiusX;
157     touchpoint.height = 2 * touchRadiusY;
158
159     return touchpoint;
160 }