Index: LayoutTests/fast/dom/elementsFromPoint/resources/elementsFromPoint.js |
diff --git a/LayoutTests/fast/dom/elementsFromPoint/resources/elementsFromPoint.js b/LayoutTests/fast/dom/elementsFromPoint/resources/elementsFromPoint.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e1b92e53c9956e21059ce831a5c4c07d930603ec |
--- /dev/null |
+++ b/LayoutTests/fast/dom/elementsFromPoint/resources/elementsFromPoint.js |
@@ -0,0 +1,88 @@ |
+function nodeToString(node) { |
+ var str = ''; |
+ if (node.nodeType == Node.ELEMENT_NODE) { |
+ str += node.nodeName; |
+ if (node.id) |
+ str += '#' + node.id; |
+ else if (node.class) |
+ str += '.' + node.class; |
+ } else if (node.nodeType == Node.TEXT_NODE) { |
+ str += '\'' + node.data + '\''; |
+ } else if (node.nodeType == Node.DOCUMENT_NODE) { |
+ str += '#document'; |
+ } |
+ return str; |
+} |
+ |
+function nodeListToString(nodes) { |
+ var nodeString = ''; |
+ |
+ for (var i = 0; i < nodes.length; i++) { |
+ var str = nodeToString(nodes[i]); |
+ if (!str) |
+ continue; |
+ nodeString += str; |
+ if (i + 1 < nodes.length) |
+ nodeString += ', '; |
+ } |
+ return nodeString; |
+} |
+ |
+function assertElementsFromPoint(actual, expected) { |
+ shouldBeEqualToString('nodeListToString(' + actual + ')', nodeListToString(expected)); |
+} |
+ |
+function assertElementInSequence(sequence, value, expectedInSequence) { |
+ if (expectedInSequence) |
+ shouldBeGreaterThanOrEqual(sequence + '.indexOf(' + value + ')', '0'); |
+ else |
+ shouldBeEqualToNumber(sequence + '.indexOf(' + value + ')', -1); |
+} |
+ |
+function checkElementsFromPointFourCorners(doc, evalElement) { |
+ var element = eval(evalElement); |
+ var shouldReceivePointerEvents = window.getComputedStyle(element).pointerEvents != 'none'; |
+ var rect = element.getBoundingClientRect(); |
+ |
+ var topLeft = {x: rect.left + 1, y: rect.top + 1}; |
+ var topRight = {x: rect.right - 1, y: rect.top + 1}; |
+ var bottomLeft = {x: rect.left + 1, y: rect.bottom - 1}; |
+ var bottomRight = {x: rect.right - 1, y: rect.bottom - 1}; |
+ |
+ var topLeftElements = doc + '.elementsFromPoint(' + topLeft.x + ', ' + topLeft.y + ')'; |
+ var topRightElements = doc + '.elementsFromPoint(' + topRight.x + ', ' + topRight.y + ')'; |
+ var bottomLeftElements = doc + '.elementsFromPoint(' + bottomLeft.x + ', ' + bottomLeft.y + ')'; |
+ var bottomRightElements = doc + '.elementsFromPoint(' + bottomRight.x + ', ' + bottomRight.y + ')'; |
+ |
+ assertElementInSequence(topLeftElements, evalElement, shouldReceivePointerEvents); |
+ assertAllElementsIntersectPoint(topLeftElements, topLeft); |
+ assertElementInSequence(topRightElements, evalElement, shouldReceivePointerEvents); |
+ assertAllElementsIntersectPoint(topRightElements, topRight); |
+ assertElementInSequence(bottomLeftElements, evalElement, shouldReceivePointerEvents); |
+ assertAllElementsIntersectPoint(bottomLeftElements, bottomLeft); |
+ assertElementInSequence(bottomRightElements, evalElement, shouldReceivePointerEvents); |
+ assertAllElementsIntersectPoint(bottomRightElements, bottomRight); |
+} |
+ |
+function assertAllElementsIntersectPoint(sequence, point) { |
+ var elementsEv; |
+ try { |
+ elementsEv = eval(sequence); |
+ } catch (e) { |
+ testFailed('Evaluating ' + sequence + ': Threw exception ' + e); |
+ return; |
+ } |
+ |
+ var numElements = elementsEv.length; |
+ for (var i = 0; i < numElements; i++) { |
+ var clientRect = elementsEv[i].getBoundingClientRect(); |
+ if (point.x < clientRect.left |
+ || point.x > clientRect.right |
+ || point.y < clientRect.top |
+ || point.y > clientRect.bottom) { |
+ testFailed(sequence + '[' + i + '].getBoundingClientRect() does not intersect (' + point.x + ', ' + point.y + ')'); |
+ return; |
+ } |
+ } |
+ testPassed('All elements in ' + sequence + ' intersect (' + point.x + ', ' + point.y + ')'); |
+} |