| // Helper for running touch-action rect tests and dumping the touch |
| // action regions from cc::Layers. |
| |
| // When running these tests manually, the touch action rects can be |
| // visualized using the inspector: open devtools and press 'esc' to open |
| // the bottom drawer, then go to the 'Rendering' tab (may need to be |
| // enabled by clicking the 3-dot menu on the drawer), then check |
| // "Scrolling performance issues" and the touch-action rects will appear |
| // in blue. |
| |
| 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.hitTestRect.top - b.hitTestRect.top |
| || a.hitTestRect.left - b.hitTestRect.left |
| || a.hitTestRect.width - b.hitTestRect.width |
| || a.hitTestRect.height - b.hitTestRect.height; |
| } |
| |
| var preRunHandlerForTest = {}; |
| |
| function testElement(element) { |
| element.addEventListener('touchstart', listener, {passive: 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); |
| |
| if (window.internals) |
| internals.forceCompositingUpdate(document); |
| |
| logRects(element.id); |
| |
| // If we're running manually, leave the handlers in place so the user |
| // can use dev tools 'show potential scroll bottlenecks' for visualization. |
| if (window.internals) |
| element.removeEventListener('touchstart', listener, false); |
| } |
| |
| function logRects(testName, opt_noOverlay) { |
| if (!window.internals) { |
| log(testName + ': not run'); |
| return; |
| } |
| |
| var rects = 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 rect = sortedRects[i].layerRect; |
| // Logging width/height for layer identification assistance. |
| var rect_string = `${rect.width}x${rect.height}`; |
| var hit = sortedRects[i].hitTestRect; |
| var hit_string = `${hit.x},${hit.y} ${hit.width}x${hit.height}`; |
| log(`${testName}: layer(${rect_string}) has hit test rect (${hit_string})`); |
| } |
| |
| log(''); |
| } |
| |
| if (window.testRunner) { |
| testRunner.dumpAsText(); |
| document.documentElement.setAttribute('dumpRenderTree', 'true'); |
| } |
| |
| window.onload = function() { |
| // Run each general test case. |
| var tests = document.querySelectorAll('.testcase'); |
| |
| // Add document wide touchend and touchcancel listeners and ensure the |
| // listeners do not affect compositor hit test rects. |
| document.documentElement.addEventListener('touchend', listener, false); |
| document.documentElement.addEventListener('touchcancel', listener, false); |
| |
| for ( var i = 0; i < tests.length; i++) { |
| // Force a compositing update before testing each case to ensure that |
| // any subsequent touch rect updates are actually done because of |
| // the event handler changes in the test itself. |
| if (window.internals) |
| internals.forceCompositingUpdate(document); |
| testElement(tests[i]); |
| } |
| |
| if (window.additionalTests) |
| additionalTests(); |
| |
| if (window.internals) { |
| var testContainer = document.getElementById("tests"); |
| testContainer.parentNode.removeChild(testContainer); |
| } |
| |
| document.documentElement.setAttribute('done', 'true'); |
| }; |