Highlights
馃悰 Web Inspector CDP: the reply nudge no longer runs JavaScript in the page
v11.9.1 keeps the debugger responsive by nudging the page whenever iOS 26 WebKit withholds a reply until the next message. That nudge was a throwaway Runtime.evaluate("0"). An evaluation is a statement, so it ran script in the page on every late reply and could only ever be a safe nudge by accident: with the Pause button armed, pause-on-next-statement takes whatever runs next. In practice it never took that bare 0 (a literal has no statement pause point), but nothing guaranteed it. The nudge now re-sends Debugger.setBreakpointsActive at its current value - a real command with nothing to execute and nothing to change. Measured on a device, it frees a withheld step (reply and paused event together) in ~10 ms, exactly as the evaluation did, and it works in a session that never enabled the Debugger.
馃И The debugger's corners are now under test
Three device tests widen what a debugging session is checked against, each step bounded: an armed Pause with a late reply must still land on the user's code and hold it; every statement of a function in a ~12k-line file with await boundaries is stepped over end to end while fetching scopes and a watch at each pause as an IDE does; and the edge cases - rapid step-overs fired without waiting (they coalesce, as in Chrome), step-into down a recursion and step-out back up, a breakpoint deep in the file with the argument in scope, pause-on-exceptions landing in the throwing function, and navigating away mid-pause leaving the session alive.
Stress result on the shipped code: 164 step-overs straight through a 14k-line file with scope and watch fetches at every pause, none slow.
pymobiledevice3 webinspector cdp
# attach WebStorm or Chrome DevTools to a large script, arm Pause, step, set breakpoints deep in the fileWhat's Changed
- 257ccfe cdp: Nudge withheld replies without running JavaScript, and cover the debugger's corners (#1924) (@doronz88)
Full Changelog: v11.9.1...v11.9.2