| 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 + ')'); |
| } |