You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
-[Feature Activation and Rollout Plan](#feature-activation-and-rollout-plan)
25
25
-[Privacy and Security Considerations](#privacy-and-security-considerations)
26
26
-[Performance Impact](#performance-impact)
27
27
-[Interoperability](#interoperability)
@@ -48,7 +48,7 @@ This makes the current caret movement visually inconsistent:
48
48
49
49
This behavior is confusing and disorienting, particularly for users who routinely work with bidirectional content.
50
50
51
-
This explainer proposes implementing **visual caret navigation** in Chromium -- arrow key movement that always follows the on-screen direction, so that Right moves the caret rightward and Left moves it leftward regardless of text or line direction. The feature will be gated behind a feature flag for incremental rollout.
51
+
This explainer proposes implementing **visual caret movement** in Chromium -- arrow key movement that always follows the on-screen direction, so that Right moves the caret rightward and Left moves it leftward regardless of text or line direction. The feature will be gated behind a feature flag for incremental rollout.
52
52
53
53
## The Bidirectional Text Problem
54
54
@@ -88,31 +88,33 @@ Visual movement solves this by moving the caret based on its **screen position**
88
88
89
89
## Goals
90
90
91
-
1.**Provide visual caret movement** — Right always moves rightward, Left always moves leftward — matching the mental model that user research confirms almost all participants expect.
91
+
1.**Provide visual caret movement** — Right always moves rightward, Left always moves leftward — matching the mental model that most users of bidirectional text would expect.
92
92
93
93
2.**Predictable caret behavior at bidi boundaries** — The caret should move smoothly in the arrow key's direction when crossing between LTR and RTL text runs.
94
94
95
95
3.**Align with Firefox and Safari,** which already use visual caret movement by default.
96
96
97
97
4.**Gate behind a feature flag** for safe incremental rollout, with no behavior change for users who do not opt in.
98
98
99
-
5.**Correctly handle all bidi scenarios**: simple LTR/RTL boundaries, multiple bidi runs, nested bidi embeddings, bidi control characters, CSS `direction`/`unicode-bidi` overrides, and cross-line navigation.
99
+
5.**Correctly handle all bidi scenarios**: simple LTR/RTL boundaries, multiple bidi runs, nested bidi embeddings, bidi control characters, CSS `direction`/`unicode-bidi` overrides, and cross-line movement.
100
100
101
101
## Non-Goals
102
102
103
103
1.**Changing selection extension behavior.** Shift+Arrow selection operates on logical DOM offsets. True visual selection across bidi boundaries would require multi-range selection support in Chromium, which does not exist today. This is a potential future extension but is out of scope.
104
104
105
105
## Proposed Solution
106
106
107
-
When the `BidiVisualOrderCaretNavigation` feature flag is enabled, Chromium's arrow key handling switches to visual (screen-order) caret movement. The implementation works by leveraging Blink's existing inline layout fragments, which are already stored in visual display order after bidi reordering. This allows the algorithm to walk through text in the order it appears on screen rather than the order it is stored in memory.
107
+
When the `BidiVisualOrderCaretMovement` feature flag is enabled, Chromium's arrow key handling switches to visual (screen-order) caret movement. The implementation works by leveraging Blink's existing inline layout fragments, which are already stored in visual display order after bidi reordering. This allows the algorithm to walk through text in the order it appears on screen rather than the order it is stored in memory.
108
108
109
109
At a high level:
110
110
111
111
1. When a user presses an arrow key, the caret's current position is resolved to the layout fragment it belongs to.
112
-
2. The caret advances in the visual direction within that fragment. For LTR text, moving right increments the position; for RTL text, moving right decrements it.
112
+
2. The caret advances in the visual direction within that fragment. For LTR text, moving right increments the position; for RTL text, moving right decrements it — in both cases the caret moves rightward on screen.
113
113
3. When the caret reaches the edge of a fragment, it uses the **bidi level** of the current and adjacent fragments to determine which edge to enter — ensuring the caret crosses bidi boundaries smoothly without jumping.
114
114
4. At line boundaries, the caret moves to the next or previous line as expected.
115
115
116
+
Word-level movement (Ctrl+Left/Right on Windows, Option+Left/Right on macOS) and `Selection.modify()` with `'word'` granularity also follow the same visual direction.
117
+
116
118
## The API Surface
117
119
118
120
The existing [`Selection.modify()`](https://w3c.github.io/selection-api/#dom-selection-modify) API already distinguishes visual and logical directions:
With this feature enabled, `'left'` and `'right'` will perform true visual movement in bidi text, while `'forward'` and `'backward'` will continue to perform logical movement. This matches the behavior of Firefox and Safari.
131
133
132
-
## Feature Activation
134
+
## Feature Activation and Rollout Plan
133
135
134
136
The feature is currently gated behind a disabled-by-default runtime flag:
1.**Phase 1 (current):** Feature flag disabled by default. Developers and testers can opt in via the command-line flag above.
143
+
2.**Phase 2:** Expose a `chrome://flags` entry so that users can enable visual caret movement without command-line flags.
144
+
3.**Phase 3:** Enable by default for all users.
140
145
141
-
This feature introduces no new privacy or security concerns.
146
+
Until the feature is enabled, caret behavior remains unchanged — existing logical movement continues to work exactly as it does today. No user-visible changes occur without explicit opt-in during Phases 1 and 2.
142
147
143
-
-**No new APIs that expose user information.** The `Selection.modify()` API already exists; this feature changes the behavior of existing direction parameters, not the API surface.
144
-
-**Feature flag gated.** The feature is disabled by default and requires explicit opt-in during the experimental phase.
148
+
## Privacy and Security Considerations
149
+
150
+
This feature introduces no new privacy or security concerns. The `Selection.modify()` API already exists; this feature changes the behavior of existing direction parameters, not the API surface. No new APIs are introduced and no user information is exposed.
145
151
146
152
## Performance Impact
147
153
148
154
This feature introduces minimal overhead. Each caret movement requires one additional lookup to resolve the visual position from the layout fragments, which is negligible.
149
155
150
156
## Interoperability
151
157
152
-
This feature aligns Chromium with the default behavior of both Firefox (Gecko) and Safari (WebKit), which use visual caret movement for bidirectional text. Chrome is currently the only major browser that uses logical movement by default. By adopting visual caret movement, this feature improves cross-browser consistency for developers and users working with bidirectional content. The existing [`Selection.modify()`](https://w3c.github.io/selection-api/#dom-selection-modify) API semantics for `'left'`/`'right'` directions are preserved and made consistent with their documented visual behavior.
158
+
This feature aligns Chromium with the default behavior of both Firefox (Gecko) and Safari (WebKit), which use visual caret movement for bidirectional text. Chrome is currently the only major browser that uses logical movement by default. By adopting visual caret movement, this feature improves cross-browser consistency for developers and users working with bidirectional content.
159
+
160
+
The [`Selection.modify()`](https://w3c.github.io/selection-api/#dom-selection-modify) API already defines `'left'`/`'right'` as visual directions and `'forward'`/`'backward'` as logical directions. Currently in Chromium, `'left'`/`'right'` behave the same as `'forward'`/`'backward'` (logical movement). With this feature enabled, `'left'`/`'right'` will perform true visual movement, making their behavior consistent with the spec and with Firefox and Safari.
153
161
154
162
Beyond browsers, visual caret movement is also the default in macOS native text editing (TextKit) and GTK on Linux, and is an option in Microsoft Word.
155
163
@@ -159,21 +167,21 @@ No alternatives were considered. Visual caret movement is the established defaul
159
167
160
168
## Standards Position
161
169
162
-
-**W3C:** No specification mandates logical or visual caret movement. The CSS Text Module and the `Selection` API leave movement behavior to UA implementation.
163
-
-**WHATWG:** The `Selection.modify()` method's `'left'`/`'right'` parameters are already defined as visual directions, distinct from `'forward'`/`'backward'` (logical). This feature makes `'left'`/`'right'` behave consistently with their documented semantics.
170
+
-**W3C:** No specification mandates logical or visual caret movement. The CSS Text Module and the Selection API leave movement behavior to UA implementation. However, the [`Selection.modify()`](https://w3c.github.io/selection-api/#dom-selection-modify) method's `'left'`/`'right'` parameters are already defined as visual directions, distinct from `'forward'`/`'backward'` (logical). This feature makes `'left'`/`'right'` behave consistently with their documented semantics.
164
171
165
172
## Target Users
166
173
167
174
- Users who create or consume content in bidirectional scripts (Arabic, Hebrew etc.)
168
175
- Web developers building multilingual editing experiences
169
176
- Accessibility users who rely on consistent and predictable caret behavior
170
177
171
-
User research with Arabic–English bilingual users confirms that almost all participants expect visual caret movement — Left always moves left, Right always moves right — regardless of script direction.
178
+
An unmoderated usability study with Arabic–English bilingual users found that the overwhelming expectation is visual caret movement — Left always moves left, Right always moves right — regardless of script direction.
5.**Chromium M76 switch to logical caret movement:**[PSA: Changing Left/Right Caret Movement from Visual to Logical](https://groups.google.com/a/chromium.org/g/blink-dev/c/Rm1CGy6RBAI/m/uYN8IiZlCgAJ)
187
+
6.[[Research findings] Bidirectional text editing](https://microsoftapc-my.sharepoint.com/:w:/g/personal/prashasingh_microsoft_com/IQBmQdITYWCYRqBUtV0ygufVAc_2_w2NVqNE5-fvB3pxIxg?e=wcaccI)
0 commit comments