v11.2.4
Highlights
🐛 A page with iframes no longer kills the DevTools session on iOS 26
iOS 26 announces a Target.targetCreated per subframe, with type "frame", and the CDP bridge adopted every announced target as the session's current one — so the session walked off its page target onto the last iframe and stayed there. Nothing moved it back: a frame target is neither committed nor destroyed while its page is fine.
What the frame target answered from then on depends on site isolation. An in-process frame replies Page domain already enabled and Missing node for given nodeId; a site-isolated frame runs FrameInspectorController, which has no Page/Network/Audit at all — and with site isolation off registers no agents whatsoever, so every request came back as -32601 'Runtime' domain was not found, for Runtime, Network, Page, CSS, Debugger and Audit alike, and the session was dead for the rest of its life. This is a distinct failure from a target that went away, which answers -32000 Missing target for given targetId and was already handled.
The session is now routed only to targets announced as pages — in create() as well, since a frame target can be the very first targetInfo a session sees at attach time. Adopted targets are tracked, so a subframe going away no longer fires a load event and a document update that reset panels the frontend had filled from the page.
Reproduced and verified on iOS 26.6.1 with Chrome's DevTools frontend attached to a Safari tab, on a page with cross-origin iframes.
pymobiledevice3 webinspector cdp
# then open http://127.0.0.1:9222/, and attach to a page that embeds cross-origin iframesWhat's Changed
Full Changelog: v11.2.3...v11.2.4