Index: LayoutTests/fast/events/touch/resources/compositor-touch-hit-rects.js |
diff --git a/LayoutTests/fast/events/touch/resources/compositor-touch-hit-rects.js b/LayoutTests/fast/events/touch/resources/compositor-touch-hit-rects.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fd055edd2d877f351a40a0609284a3951e4bea7a |
--- /dev/null |
+++ b/LayoutTests/fast/events/touch/resources/compositor-touch-hit-rects.js |
@@ -0,0 +1,129 @@ |
+function listener() { |
+} |
+ |
+function log(msg) { |
+ var span = document.createElement("span"); |
+ document.getElementById("console").appendChild(span); |
+ span.innerHTML = msg + '<br />'; |
+} |
+ |
+function sortRects(a, b) { |
+ return a.layerRelativeRect.left - b.layerRelativeRect.left; |
+} |
+ |
+var preRunHandlerForTest = {}; |
+ |
+function testElement(element) { |
+ element.addEventListener('touchstart', listener, false); |
+ |
+ // Run any test-specific handler AFTER adding the touch event listener |
+ // (which itself causes rects to be recomputed). |
+ if (element.id in preRunHandlerForTest) |
+ preRunHandlerForTest[element.id](element); |
+ |
+ logRects(element.id); |
+ element.removeEventListener('touchstart', listener, false); |
+} |
+ |
+function logRects(testName, opt_noOverlay) { |
+ if (!window.internals) { |
+ log(testName + ': not run'); |
+ return; |
+ } |
+ |
+ var rects = window.internals.touchEventTargetLayerRects(document); |
+ if (rects.length == 0) |
+ log(testName + ': no rects'); |
+ |
+ var sortedRects = new Array(); |
+ for ( var i = 0; i < rects.length; ++i) |
+ sortedRects[i] = rects[i]; |
+ sortedRects.sort(sortRects); |
+ for ( var i = 0; i < sortedRects.length; ++i) { |
+ var node = sortedRects[i].layerRootNode; |
+ var name = node.nodeName; |
+ if (node.id) |
+ name += '#' + node.id; |
+ var r = sortedRects[i].layerRelativeRect; |
+ log(testName + "[" + i + "]: " + name + " (" + r.left + ", " + r.top + ", " + r.width + ", " + r.height + ")"); |
+ |
+ if (visualize && !opt_noOverlay && window.location.hash != '#nooverlay') { |
+ var patch = document.createElement("div"); |
+ patch.className = "overlay generated display-when-done"; |
+ patch.style.left = r.left + "px"; |
+ patch.style.top = r.top + "px"; |
+ patch.style.width = r.width + "px"; |
+ patch.style.height = r.height + "px"; |
+ |
+ if (node === document) { |
+ patch.style.position = "absolute"; |
+ document.body.appendChild(patch); |
+ } else { |
+ // Use a zero-size container to avoid changing the position of |
+ // the existing elements. |
+ var container = document.createElement("div"); |
+ container.className = "overlay-container generated"; |
+ patch.style.position = "relative"; |
+ node.appendChild(container); |
+ container.style.top = (node.offsetTop - container.offsetTop) + "px"; |
+ container.style.left = (node.offsetLeft - container.offsetLeft) + "px"; |
+ container.classList.add("display-when-done"); |
+ container.appendChild(patch); |
+ } |
+ } |
+ } |
+ |
+ log(''); |
+} |
+ |
+function checkForRectUpdate(expectUpdate, operation) { |
+ if (window.internals) |
+ var oldCount = window.internals |
+ .touchEventTargetLayerRectsUpdateCount(document); |
+ |
+ operation(); |
+ |
+ if (window.internals) { |
+ var newCount = window.internals |
+ .touchEventTargetLayerRectsUpdateCount(document); |
+ if ((oldCount != newCount) != !!expectUpdate) |
+ log('FAIL: ' + (expectUpdate ? 'rects not updated' : 'rects updated unexpectedly')); |
+ } |
+} |
+ |
+// Set this to true in order to visualize the results in an image. |
+// Elements that are expected to be included in hit rects have a red border. |
+// The actual hit rects are in a green tranlucent overlay. |
+var visualize = false; |
+ |
+if (window.testRunner) { |
+ window.testRunner.dumpAsText(visualize); |
+ document.documentElement.setAttribute('dumpRenderTree', 'true'); |
+} else { |
+ // Note, this test can be run interactively in content-shell with |
+ // --expose-internals-for-testing. In that case we almost certainly |
+ // want to visualize the results. |
+ visualize = true; |
+} |
+ |
+if (window.internals) { |
+ window.internals.settings.setMockScrollbarsEnabled(true); |
+ window.internals.settings.setForceCompositingMode(true); |
+} |
+ |
+window.onload = function() { |
+ // Run each general test case. |
+ var tests = document.querySelectorAll('.testcase'); |
+ for ( var i = 0; i < tests.length; i++) |
+ testElement(tests[i]); |
+ |
+ if (window.additionalTests) |
+ additionalTests(); |
+ |
+ if (!visualize && window.internals) { |
+ var testContainer = document.getElementById("tests"); |
+ testContainer.parentNode.removeChild(testContainer); |
+ } |
+ |
+ document.documentElement.setAttribute('done', 'true'); |
+}; |