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(doc, x, y, expected) { var query = doc + '.elementsFromPoint(' + x + ',' + y + ')'; var sequence = eval(query); assert_equals(nodeListToString(sequence), nodeListToString(expected), query); } function checkElementsFromPointFourCorners(doc, element, expectedTopLeft, expectedTopRight, expectedBottomLeft, expectedBottomRight) { var rect = eval(doc + '.getElementById(\'' + 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}; assertElementsFromPoint(doc, topLeft.x, topLeft.y, expectedTopLeft); assertElementsFromPoint(doc, topRight.x, topRight.y, expectedTopRight); assertElementsFromPoint(doc, bottomLeft.x, bottomLeft.y, expectedBottomLeft); assertElementsFromPoint(doc, bottomRight.x, bottomRight.y, expectedBottomRight); }