Index: LayoutTests/fast/events/elementsFromPoint-iframes.html |
diff --git a/LayoutTests/fast/events/elementsFromPoint-iframes.html b/LayoutTests/fast/events/elementsFromPoint-iframes.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7dbda36cccce7ba19a8be7c3964ebcb8578b78e2 |
--- /dev/null |
+++ b/LayoutTests/fast/events/elementsFromPoint-iframes.html |
@@ -0,0 +1,70 @@ |
+<!DOCTYPE HTML> |
+<script src="../../resources/js-test.js"></script> |
+<style> |
+html, body { |
+ margin: 0; |
+ padding: 0; |
+} |
+body { |
+ height: 500px; |
+} |
+#iframe { |
+ width: 200px; |
+ height: 200px; |
+} |
+#iframeScrollbars { |
+ position: absolute; |
+ top: 0; |
+ left: 0; |
+ transform: translate(50px, 50px); |
+ width: 150px; |
+ height: 150px; |
+ overflow-y: scroll; |
Rick Byers
2015/02/20 20:02:24
great test case - I've also seen hit-testing probl
|
+ overflow-x: scroll; |
+} |
+</style> |
+<iframe id="iframe" src="data:text/html,<div id='div' style='width: 100px; height: 100px; background: red'></div>"></iframe> |
+<iframe id="iframeScrollbars" src="data:text/html,<div id='big' style='width: 500px; height: 500px; background: blue;'></div><div id='div' style='position: absolute; top: 0; left: 0; width: 100px; height: 100px; background: green;'>"></iframe> |
+<div id="console"></div> |
+<script> |
+window.jsTestIsAsync = true; |
+if (window.testRunner) |
+ testRunner.dumpAsText(); |
+ |
+function assertElementInSequence(sequence, value, expectedInSequence) { |
+ if (expectedInSequence) |
+ shouldBeGreaterThanOrEqual(sequence + '.indexOf(' + value + ')', '0'); |
+ else |
+ shouldBeEqualToNumber(sequence + '.indexOf(' + value + ')', -1); |
+} |
+ |
+function checkElementsFromPointFourCorners(evalDoc, evalElement) { |
+ var element = eval(evalElement); |
+ var shouldReceivePointerEvents = window.getComputedStyle(element).pointerEvents != "none"; |
+ var rect = element.getBoundingClientRect(); |
+ |
+ var topLeft = (rect.left + 1) + ', ' + (rect.top + 1); |
+ var topRight = (rect.right - 1) + ', ' + (rect.top + 1); |
+ var bottomLeft = (rect.left + 1) + ', ' + (rect.bottom - 1); |
+ var bottomRight = (rect.right - 1) + ', ' + (rect.bottom - 1); |
+ assertElementInSequence(evalDoc + '.elementsFromPoint(' + topLeft + ')', evalElement, shouldReceivePointerEvents); |
+ assertElementInSequence(evalDoc + '.elementsFromPoint(' + topRight + ')', evalElement, shouldReceivePointerEvents); |
+ assertElementInSequence(evalDoc + '.elementsFromPoint(' + bottomLeft + ')', evalElement, shouldReceivePointerEvents); |
+ assertElementInSequence(evalDoc + '.elementsFromPoint(' + bottomRight + ')', evalElement, shouldReceivePointerEvents); |
+} |
+ |
+onload = function() { |
+ checkElementsFromPointFourCorners('document', 'iframe'); |
+ checkElementsFromPointFourCorners('document.getElementById(\'iframe\').contentDocument', 'document.getElementById(\'iframe\').contentDocument.getElementById(\'div\')'); |
+ checkElementsFromPointFourCorners('document', 'iframeScrollbars'); |
+ checkElementsFromPointFourCorners('document.getElementById(\'iframeScrollbars\').contentDocument', 'document.getElementById(\'iframeScrollbars\').contentDocument.getElementById(\'div\')'); |
+ |
+ // Ensure that elements outside the inner document's viewport are not returned. |
+ shouldBeEqualToNumber('document.getElementById(\'iframeScrollbars\').contentDocument.elementsFromPoint(-1, -1).length', 0); |
+ shouldBeEqualToNumber('document.getElementById(\'iframeScrollbars\').contentDocument.elementsFromPoint(1, 1).length', 2); |
+ shouldBeEqualToNumber('document.getElementById(\'iframeScrollbars\').contentDocument.elementsFromPoint(500, 500).length', 0); |
+ shouldBeEqualToNumber('document.getElementById(\'iframeScrollbars\').contentDocument.elementsFromPoint(140, 140).length', 0); |
+ |
+ finishJSTest(); |
+} |
+</script> |