feat: add webContents.caretBrowsingEnabled - #52696
Draft
snackzone wants to merge 2 commits into
Draft
Conversation
|
💖 Thanks for opening this pull request! 💖 Semantic PR titlesWe use semantic commit messages to streamline the release process. Before your pull request can be merged, you should update your pull request title to start with a semantic prefix. Examples of commit messages with semantic prefixes:
Commit signingThis repo enforces commit signatures for all incoming PRs. PR tipsThings that will help get your PR across the finish line:
We get a lot of pull requests on this repo, so please be patient and we will get back to you as soon as we can. |
Exposes the existing Blink renderer preference `caret_browsing_enabled` as a settable property on webContents. Blink already applies this preference on every renderer preferences sync, so toggling it takes effect immediately without a reload. Enables assistive-technology use cases that need a keyboard-navigable caret in page content, which Chrome offers but Electron had no API for. The specs arrow through non-editable prose rather than only reading the preference back, because Blink honors the caret movement editor commands in non-editable content only when caret browsing is on — so that is what actually observes the renderer having received the preference. Refs electron#31339 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
snackzone
force-pushed
the
zm-caret-browsing-api
branch
3 times, most recently
from
August 7, 2026 23:39
581c824 to
415bc00
Compare
Blink draws and moves a caret once caret_browsing_enabled is set, but assistive technology is never told, so a screen reader stays silent. Notify ui::AXPlatform too, as Chrome does in renderer_preferences_util.cc. It is process-wide while the preference is per-WebContents, so refcount the instances that enable it. * Caret attributes gate on AXPlatform::IsCaretBrowsingEnabled() before falling back to AXNode::HasVisibleCaretOrSelection(), which is false for a collapsed caret in non-editable content; untold, macOS reports NSNotFound and Windows never fires IA2_EVENT_TEXT_CARET_MOVED. * A mirror would let one window disabling caret browsing degrade accessibility in another; Chrome's input is a uniform profile pref. * Reconcile from a cached flag, before the preference-equality early return and at construction: a <webview> guest inherits the embedder's preferences via BrowserPluginGuest::InitInternal(), so a delta taken from the preference transition would release an uncounted reference. * The destructor releases from the cached flag before its early returns, since web_contents() may be gone and the state must not stay pinned. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
snackzone
force-pushed
the
zm-caret-browsing-api
branch
from
August 8, 2026 00:10
415bc00 to
261fdb3
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description of Change
Adds the ability to enable Chromium's Caret Browsing mode via
webcontents.caretBrowsingEnabled,setCaretBrowsingEnabled(), andisCaretBrowsingEnabled(). Closes #31339.Contributors guide: https://github.com/electron/electron/blob/main/CONTRIBUTING.md
Using a coding agent / AI? Read the policy: https://github.com/electron/governance/blob/main/policy/ai.md
NOTE: PRs submitted that do not follow this template will be automatically closed.
-->
Checklist
npm testpassesRelease Notes
Notes: Added webContents.caretBrowsingEnabled for toggling caret browsing in a WebContents.