Skip to content

Commit 2c47a09

Browse files
committed
perf: collapse visible error selector scans
1 parent 6cd5bae commit 2c47a09

3 files changed

Lines changed: 30 additions & 18 deletions

File tree

browser_tests/fixtures/utils/errorSurfaces.ts

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,22 +39,24 @@ function installVisibleErrorRecorder(config: {
3939
if (target.__cnVisibleErrors !== undefined) return
4040
const seen = new Set<string>()
4141
const errors: VisibleError[] = []
42+
const combinedSelector = selectors.map(({ selector }) => selector).join(',')
4243
target.__cnVisibleErrors = errors
4344
const sample = () => {
44-
for (const { surface, selector } of selectors) {
45-
for (const element of document.querySelectorAll(selector)) {
46-
if (
47-
!(element instanceof HTMLElement) ||
48-
!element.checkVisibility({
49-
checkOpacity: true,
50-
checkVisibilityCSS: true
51-
})
52-
)
53-
continue
54-
const text = (element.innerText || element.textContent || '')
55-
.replace(/\s+/g, ' ')
56-
.trim()
57-
.slice(0, 300)
45+
for (const element of document.querySelectorAll(combinedSelector)) {
46+
if (
47+
!(element instanceof HTMLElement) ||
48+
!element.checkVisibility({
49+
checkOpacity: true,
50+
checkVisibilityCSS: true
51+
})
52+
)
53+
continue
54+
const text = (element.innerText || element.textContent || '')
55+
.replace(/\s+/g, ' ')
56+
.trim()
57+
.slice(0, 300)
58+
for (const { surface, selector } of selectors) {
59+
if (!element.matches(selector)) continue
5860
const key = `${surface}\u0000${text}`
5961
if (seen.has(key)) continue
6062
seen.add(key)

browser_tests/tests/customNodes/connectivity.spec.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,9 @@ async function runPairsInIsolatedPages(
131131
const results: PairResult[] = []
132132
const errors: string[] = []
133133
for (const pair of pairs) {
134+
const pairKey = `${pair.producer.nodeType}.${pair.producer.slotName} -> ${pair.consumer.nodeType}.${pair.consumer.slotName}`
135+
const pairStart = Date.now()
136+
console.log(`connectivity isolated pair: ${pairKey} starting`)
134137
const probe = await page.context().newPage()
135138
try {
136139
await trackVisibleErrors(probe)
@@ -163,6 +166,9 @@ async function runPairsInIsolatedPages(
163166
}
164167
} finally {
165168
if (!probe.isClosed()) await probe.close()
169+
console.log(
170+
`connectivity isolated pair: ${pairKey} completed in ${Date.now() - pairStart}ms`
171+
)
166172
}
167173
}
168174
return { results, errors }
@@ -279,7 +285,11 @@ test('connectivity: representative edges cover every pairable slot through model
279285
isolatedPairs.length * ISOLATED_MS_PER_PAIR
280286
)
281287
const sweepStart = Date.now()
288+
const sharedStart = Date.now()
282289
const sharedResults = await runPairsInPage(comfyPage.page, sharedPairs)
290+
console.log(
291+
`connectivity shared sweep: ${sharedPairs.length} pairs in ${Date.now() - sharedStart}ms`
292+
)
283293
const isolated = await runPairsInIsolatedPages(comfyPage.page, isolatedPairs)
284294
const results = [...sharedResults, ...isolated.results]
285295
const sweepMs = Date.now() - sweepStart

browser_tests/tests/customNodes/errorSurfaces.pure.spec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ test('DOM churn is sampled at a fixed rate, not per mutation', async ({
134134
typeof globalThis & { __recorderQueries?: number }
135135
).__recorderQueries
136136
)
137-
await expect(state()).resolves.toBe(4)
137+
await expect(state()).resolves.toBe(1)
138138

139139
await probe.evaluate(() => {
140140
let parent = document.getElementById('root')!
@@ -145,11 +145,11 @@ test('DOM churn is sampled at a fixed rate, not per mutation', async ({
145145
parent = child
146146
}
147147
})
148-
await expect(state()).resolves.toBe(4)
148+
await expect(state()).resolves.toBe(1)
149149
await probe.clock.runFor(99)
150-
await expect(state()).resolves.toBe(4)
150+
await expect(state()).resolves.toBe(1)
151151
await probe.clock.runFor(1)
152-
await expect(state()).resolves.toBe(8)
152+
await expect(state()).resolves.toBe(2)
153153
await expect(
154154
expectNoVisibleErrors(probe, 'after DOM churn')
155155
).resolves.toBeUndefined()

0 commit comments

Comments
 (0)