servo/components
DK Liao e62aecb103
feat: Implement display for text selection and caret (#35830)
This PR introduces an initial, straightforward implementation for
displaying text selection and the caret.

This is achieved by passing the selection range and insertion point
index down to `TextFragment`, along with the starting offset of each
`TextFragment` to determine the proper range for displaying the caret
and text selection. Additionally, the `selected_style` was passed into
`TextFragment` to specify the background color.

During the final build phase, although whitespace is typically ignored
when constructing glyphs, we still need to retrieve it to render both
the caret and text selection at the correct location. This ensures that
whitespace is not overlooked when the `TextFragment` contains an
insertion point or selection range.

There are several improvements yet to be made, including:

- The caret is static and does not flash.
- The caret is not rendered when the input field is empty. (I suppose
there should be an easy fix somewhere but I haven't found it yet)

**Working Examples**

macOS


https://github.com/user-attachments/assets/f3622cbe-9fa6-40c0-b2d8-b3a8f9842c28

Windows


https://github.com/user-attachments/assets/9b008a0d-0011-4c76-a2e2-0e35869a216c

Linux

[Screencast from 03-07-2025 11_05_41
AM.webm](https://github.com/user-attachments/assets/09a311ad-f975-4450-a66c-b20be525a5ed)



---
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [x] These changes fix part of #33237 (But the cursor isn't blinking
yet)
- [x] These changes do not require tests because there's no behavior
change

Signed-off-by: DK Liao <dklassic@gmail.com>
2025-04-10 14:40:38 +00:00
..
allocator Organize component Cargo.toml dependencies (#36224) 2025-03-30 19:03:54 +00:00
background_hang_monitor Organize component Cargo.toml dependencies (#36224) 2025-03-30 19:03:54 +00:00
bluetooth Organize component Cargo.toml dependencies (#36224) 2025-03-30 19:03:54 +00:00
canvas compositing: Combine webrender_traits and compositing_traits (#36372) 2025-04-06 17:34:18 +00:00
compositing libservo: Move animation tracking from WindowMethods to delegates (#36400) 2025-04-09 19:41:53 +00:00
config dom: Implement ClipboardItem (#36336) 2025-04-06 23:47:57 +00:00
constellation compositing: Combine webrender_traits and compositing_traits (#36372) 2025-04-06 17:34:18 +00:00
deny_public_fields Add rust-version to all Cargo.toml files (#33483) 2024-09-17 16:39:07 +00:00
devtools Devtools: initial Debugger > Sources panel (#36164) 2025-04-08 09:22:53 +00:00
dom_struct script: Feature-gate all crown support. (#35055) 2025-01-18 21:36:15 +00:00
domobject_derive Update rustfmt to the 2024 style edition (#35764) 2025-03-03 11:26:53 +00:00
fonts compositing: Combine webrender_traits and compositing_traits (#36372) 2025-04-06 17:34:18 +00:00
geometry servoshell: Allow overriding screen resolution with a command-line argument (#34038) 2024-10-30 11:54:13 +00:00
hyper_serde Update rustfmt to the 2024 style edition (#35764) 2025-03-03 11:26:53 +00:00
jstraceable_derive Add rust-version to all Cargo.toml files (#33483) 2024-09-17 16:39:07 +00:00
layout_2020 feat: Implement display for text selection and caret (#35830) 2025-04-10 14:40:38 +00:00
layout_thread_2020 compositing: Combine webrender_traits and compositing_traits (#36372) 2025-04-06 17:34:18 +00:00
malloc_size_of Cleanup Stylo dependencies (#36046) 2025-03-19 08:53:26 +00:00
media compositing: Combine webrender_traits and compositing_traits (#36372) 2025-04-06 17:34:18 +00:00
metrics Move ScriptToConstellationMsg to constellation_traits (#36364) 2025-04-05 22:13:29 +00:00
net compositing: Combine webrender_traits and compositing_traits (#36372) 2025-04-06 17:34:18 +00:00
pixels Organize component Cargo.toml dependencies (#36224) 2025-03-30 19:03:54 +00:00
profile Make the memory reporting multi-process aware (#35863) 2025-04-05 05:42:12 +00:00
rand Migrate to the 2024 edition (#35755) 2025-03-13 10:28:11 +00:00
range Add rust-version to all Cargo.toml files (#33483) 2024-09-17 16:39:07 +00:00
script script: Correctly convert a jsval to a Promise (#36403) 2025-04-09 16:35:35 +00:00
script_bindings script: copy include! files from script_bindings to script's OUT_DIR (#36384) 2025-04-08 19:22:24 +00:00
servo libservo: Move animation tracking from WindowMethods to delegates (#36400) 2025-04-09 19:41:53 +00:00
shared feat: Implement display for text selection and caret (#35830) 2025-04-10 14:40:38 +00:00
timers Update rustfmt to the 2024 style edition (#35764) 2025-03-03 11:26:53 +00:00
url Check all ancestor navigable trustworthiness for mixed content (#36157) 2025-04-05 05:38:24 +00:00
webdriver_server constellation: Rename messages sent to the Constellation (#36341) 2025-04-04 19:39:38 +00:00
webgpu compositing: Combine webrender_traits and compositing_traits (#36372) 2025-04-06 17:34:18 +00:00
webxr Use Window in new methods instead of GlobalScope for interfaces with … (#36133) 2025-04-02 14:50:56 +00:00