Idle and streaming cost both depend on how much of the sidebar is mounted, so the scenario setup is now shared. --expand-projects seeds the persisted collapse state; --expand-sessions clicks every "Show more sessions" control, which cannot be seeded because pagination is component state. Both run before the measured window, so it stays input-free. Session expansion must run after the sidebar has populated, not straight after the load event, or the controls do not exist yet. Also replaces a spread push over collected trace events, which overflowed the call stack once a populated sidebar produced chunks of hundreds of thousands of events, and the equivalent spread in the heap-maximum calculation.
45 lines
1.6 KiB
JavaScript
45 lines
1.6 KiB
JavaScript
/**
|
|
* Scenario setup shared by the idle and streaming profilers.
|
|
*
|
|
* Idle and streaming cost both depend on how much of the sidebar is mounted,
|
|
* so both commands need the same way to reach a heavily populated sidebar.
|
|
* Setup always runs before the measured window.
|
|
*/
|
|
|
|
import { evaluateValue, wait } from "./cdp.mjs"
|
|
|
|
/**
|
|
* Expands every project. The sidebar persists the ids of collapsed projects,
|
|
* so an empty list expands everything. Requires a reload to take effect.
|
|
*/
|
|
export const expandProjects = async (client) => {
|
|
await evaluateValue(client, `localStorage.setItem("oc.sessions.projectCollapse", "[]")`)
|
|
}
|
|
|
|
/**
|
|
* Clicks every "Show more sessions" control until none remain.
|
|
*
|
|
* Session list pagination is component state, so unlike project collapse it
|
|
* cannot be seeded through storage. The controls only exist once the sidebar
|
|
* has populated, so call this after the page has settled, never straight after
|
|
* the load event.
|
|
*
|
|
* Matching is a case-insensitive substring test, which assumes the English UI
|
|
* locale; a non-English locale expands nothing and reports zero.
|
|
*/
|
|
export const expandSessionLists = async (client, { passes = 40, settleMs = 400 } = {}) => {
|
|
let totalClicked = 0
|
|
for (let pass = 0; pass < passes; pass += 1) {
|
|
const clicked = await evaluateValue(client, `(() => {
|
|
const controls = [...document.querySelectorAll("button")]
|
|
.filter((button) => (button.textContent ?? "").toLowerCase().includes("show more"))
|
|
for (const control of controls) control.click()
|
|
return controls.length
|
|
})()`)
|
|
if (!clicked) break
|
|
totalClicked += clicked
|
|
await wait(settleMs)
|
|
}
|
|
return totalClicked
|
|
}
|