| <!DOCTYPE html> |
| <html> |
| <body> |
| <script src="../resources/runner.js"></script> |
| |
| <style> |
| tr { height: 5px; font-size: 4px; } |
| </style> |
| |
| <table id="testElement"> |
| <tr> |
| <th>Sender</th> |
| <td>Message</td> |
| </tr> |
| </table> |
| |
| <script> |
| var isDone = false; |
| var startTime; |
| |
| // Before the test starts, add 5000 rows to the table, something like a |
| // message board with lots of replies on a long thread. |
| // Ensure test content is generated before page load, so that the test |
| // construction is not part of the collected traces. |
| let table = document.getElementById('testElement'); |
| for (let i = 0; i < 5000; i++) { |
| let tr = document.createElement('tr'); |
| table.appendChild(tr); |
| let sender = document.createElement('td'); |
| sender.innerHTML = 'user' + Math.floor(10000*Math.random()); |
| tr.appendChild(sender); |
| let message = document.createElement('td'); |
| message.innerHTML = '<div style="display:inline-block">Message content ' + |
| Math.floor(10000*Math.random()) + '</div> '; |
| let link = document.createElement('a'); |
| link.href = '#'; |
| link.id = 'link' + i; |
| link.innerHTML = 'Reply'; |
| message.appendChild(link); |
| tr.appendChild(message); |
| let moreStuff = document.createElement('td'); |
| moreStuff.innerHTML = '<a href="#"><img> Copy</a> <a href="3"><img> Remind me!</a> <a href="#"><img> Mute</a>'; |
| tr.appendChild(moreStuff); |
| let evenMoreStuff = document.createElement('td'); |
| evenMoreStuff.innerHTML = '<code>The</code> <code>quick</code> <code>brown</code> <code>fox</code> <code>jumps</code> <code>over</code> <code>the</code> <code>lazy</code> <code>dog</code>... <i><label>Name of dog: <span contenteditable role=textbox><b>fido</b></span></label></i><span><span><span><span>x</span><span>y</span><span>z</span></span?</span></span>'; |
| tr.appendChild(evenMoreStuff); |
| tr.appendChild(evenMoreStuff.cloneNode(/*deep*/ true)); |
| tr.appendChild(evenMoreStuff.cloneNode(/*deep*/ true)); |
| } |
| |
| function runTest() { |
| if (startTime) { |
| PerfTestRunner.measureValueAsync(PerfTestRunner.now() - startTime); |
| PerfTestRunner.addRunTestEndMarker(); |
| } |
| if (!isDone) { |
| PerfTestRunner.addRunTestStartMarker(); |
| startTime = PerfTestRunner.now(); |
| |
| let scrollTimes = 0; |
| |
| window.scrollTo(0, 0); |
| |
| let scrollInProcess = false; |
| let scroll = () => { |
| if (scrollInProcess) |
| return; |
| scrollInProcess = true; |
| |
| if (scrollTimes == 10) { |
| // Wait to allow the asynchronous accessibility code that's |
| // covered by traceEventsToMeasure to have a chance to run. |
| return setTimeout(runTest, 2500); |
| } |
| |
| requestAnimationFrame(() => { |
| scrollTimes ++; |
| document.addEventListener("scrollend", () => { |
| scrollInProcess = false; |
| setTimeout(scroll, 300); |
| }, { once: true }); |
| window.scrollBy({ |
| top: 3000, |
| behavior: 'smooth' |
| }); |
| }); |
| }; |
| |
| scroll(); |
| } |
| } |
| |
| PerfTestRunner.startMeasureValuesAsync({ |
| description: 'Test accessibility performance when scrolling some divs', |
| unit: 'ms', |
| done: function () { |
| isDone = true; |
| }, |
| run: function() { |
| runTest(); |
| }, |
| iterationCount: 3, |
| warmUpCount: 3, // Give time for a11y events coming from page |
| // construction to pass. |
| tracingCategories: 'accessibility', |
| traceEventsToMeasure: [ |
| 'TotalAccessibilityCleanLayoutLifecycleStages', |
| 'ProcessDeferredUpdatesLifecycleStage', |
| 'FinalizingTreeLifecycleStage', |
| 'SerializeLifecycleStage', |
| 'RenderAccessibilityImpl::SendPendingAccessibilityEvents', |
| 'BrowserAccessibilityManager::OnAccessibilityEvents', |
| 'SerializeLocationChanges', |
| "BrowserAccessibilityManager::OnLocationChanges" |
| ] |
| }); |
| </script> |
| |
| </html> |