Because of out-of-process iframes, each frame sends a separate accessibility tree to the browser process, which is sometimes forwarded to automation extensions like ChromeVox. To be able to reconstruct the composed accessibility tree across frames, we need each accessibility tree to have a unique ID and trees need to identify the IDs of their parents and children.
Currently RenderFrames don't have unique IDs, so renderers send the routing ID of their own frame and of parent and child frames back to the browser process, where they need to be converted into (globally-unique) AXTreeIDs.
Instead, each RenderFrame could have a base::UnguessableToken that's synchronized across all processes, which could be used to directly reference other frames uniquely, no translation required. On the browser side, we could *verify* these ids but we wouldn't need to *translate* them. This means less rewriting of structs.
Benefits:
* We can implement Onion Soup (having Blink talk directly to the browser process without a content layer) without "leaking" concepts like routing IDs into Blink
* RenderFrameHostImpl doesn't need to rewrite a AXContentNodeData into an AXNodeData
* Then we can get rid of AXContentNodeData and just use AXNodeData everywhere
* Mojo Apps (native aura/views apps in a separate process) could each have a unique AXTreeID too
* Eventually we might be able to route mojo messages directly from Blink to an extension like ChromeVox and bypass the browser process, as long as we were careful about not trusting AXTreeIDs.
Comment 1 by jamescook@chromium.org
, Sep 21