v11.10.0
Highlights
This release is all about the Chrome DevTools Protocol bridge (pymobiledevice3 webinspector cdp): editor-grade debugging of Safari pages and JSContexts from Chrome DevTools, VS Code and WebStorm, plus the groundwork to keep it correct.
🐛 Step-over on a JSContext no longer stalls in WebStorm
Stepping through a JSContext in WebStorm (and other strict Chrome-protocol clients) stopped advancing after the first step. WebKit emits no Debugger.resumed event and puts inspector-internal frames on the paused call stack, neither of which Chrome does; the bridge now synthesizes the missing Debugger.resumed to keep the paused/resumed alternation and strips WebKit's native entry frame and InjectedScript harness so a pause matches what node --inspect reports.
✨ Chrome's Fetch domain for request mocking and Basic auth
The bridge now translates Chrome's Fetch domain onto WebKit's request interception, so a client can mock, modify or block requests and answer an HTTP Basic auth challenge with no on-device dialog.
pymobiledevice3 webinspector cdp✨ Full Node.js inspector surface on JSContexts
An editor attaching to a JSContext does so as a Node.js target. The bridge now presents the events those clients rely on: uncaught exceptions and rejections as Runtime.exceptionThrown (VS Code renders exceptions from nothing else), Runtime.addBinding/bindingCalled, inspect() as Runtime.inspectRequested, context teardown, and pre-load URL breakpoints that bind and hit.
✨ Record a protocol trace for bug reports
--trace records every protocol message in both directions, so a debugging problem can be reported with the exact wire log.
pymobiledevice3 webinspector cdp --trace /tmp/cdp-trace.jsonl✨ The bridge is now checked against the WebKit and Chrome protocol definitions
A conformance test reads the bridge's source and checks every protocol name it uses against vendored copies of WebKit's and Chrome's (and Node's) protocol definitions. It already caught a real bug: dark-mode emulation was sent as Page.setForcedAppearance, which iOS 26 no longer has, and now maps onto Page.overrideUserPreference.
🐛 Correct iframe-to-frame correlation
On iOS 26 the frame tree is ordered by creation, not document order; the bridge now correlates an <iframe> element to the frame it hosts by identity, so a cross-origin frame is driven correctly.
What's Changed
- 17f405c cdp: Synthesize Debugger.resumed so stepping keeps its paused/resumed alternation (#1928) (@doronz88)
- 361fb2f cdp: Strip WebKit's InjectedScript harness from a paused call stack (#1928) (@doronz88)
- b14ef61 cdp: Drop WebKit's native entry frame from a paused call stack (#1928) (@doronz88)
- c05b221 cdp: Present the Node.js inspector surface on JSContexts and pages (#1927) (@doronz88)
- f3b0122 cdp: Vendor Node's inspector protocol and check the bridge against it (#1927) (@doronz88)
- 28001f6 cdp: Check the bridge against the WebKit and Chrome protocol definitions (#1926) (@doronz88)
- e52c93c cdp: Emulate user preferences through Page.overrideUserPreference (#1926) (@doronz88)
- 7a060c7 cdp: Add the Fetch domain over WebKit interception, for request mocking and Basic auth (#1922) (@doronz88)
- e070816 cdp: Correlate an iframe to its frame by identity, not document order (#1921) (@doronz88)
- 9745fbf cdp: Record a full protocol trace with
webinspector cdp --trace(#1925) (@doronz88)
Full Changelog: v11.9.2...v11.10.0