fix(timeout): cap defensive CDP guards so click can't hang multi-minute
Reported: a single `click @ref` could hang 5+ minutes, with multiple queued click invocations adding up to 7+ minutes — worst case 30s timeout × 3 CDP calls × N parallel processes: - verify_ref_identity (Accessibility.getPartialAXTree) → default 30s - resolveNode / getBoxModel → default 30s - wait_for_paint_settled (Runtime.evaluate awaitPromise) → default 30s The latter two are best-effort defenses added in fork.3-5 to fix SPA race / DOM-reuse bugs. They should never block a real click for 30s — the unguarded code path was always faster than the guarded path-that-hangs. - verify_ref_identity capped at 1s (skips check on timeout) - wait_for_paint_settled capped at 500ms (skips wait on timeout) Both skip-on-timeout intentionally: the worst case is the click behaves like fork.2 (race-prone but fast), which is strictly better than the user pkilling stuck processes. Also rewrites the misleading "Chrome 144+ chrome://inspect tip" in the auto-connect failure message — the toggle exposes target discovery only, not the /json/version HTTP API the auto-connect flow expects (verified by user: lsof shows :9222 listening but curl /json/version returns 404).
This commit is contained in:
@@ -903,8 +903,15 @@ async fn wait_for_paint_settled(client: &CdpClient, session_id: &str) {
|
||||
requestAnimationFrame(() => \
|
||||
requestAnimationFrame(() => \
|
||||
queueMicrotask(() => resolve(true)))))";
|
||||
let _ = client
|
||||
.send_command_typed::<_, Value>(
|
||||
// Tight 500ms timeout. RAF normally fires at 16ms, two RAFs total ~33ms.
|
||||
// If the tab is hidden / throttled / page is doing something pathological
|
||||
// and RAF doesn't fire in 500ms, we'd rather return now than stall the
|
||||
// user's click. Without this cap, a stuck RAF inherited the default 30s
|
||||
// CDP timeout and was the main contributor to the "click hangs 5+ min"
|
||||
// user report.
|
||||
let _ = tokio::time::timeout(
|
||||
std::time::Duration::from_millis(500),
|
||||
client.send_command_typed::<_, Value>(
|
||||
"Runtime.evaluate",
|
||||
&EvaluateParams {
|
||||
expression: script.to_string(),
|
||||
@@ -912,8 +919,9 @@ async fn wait_for_paint_settled(client: &CdpClient, session_id: &str) {
|
||||
await_promise: Some(true),
|
||||
},
|
||||
Some(session_id),
|
||||
)
|
||||
.await;
|
||||
),
|
||||
)
|
||||
.await;
|
||||
}
|
||||
|
||||
async fn dispatch_click(
|
||||
|
||||
Reference in New Issue
Block a user