mirror of
https://github.com/servo/servo.git
synced 2025-08-20 04:45:33 +01:00
fix: Crashing due to input element hack (#36461)
This PR addresses a crash in text input element due to a hack to prevent text input being trimmed. The updated behavior will only add `zero width space` unicode character to the node if there's no text content instead of adding it constantly. Also by adding the same `zero width space` unicode character to text area when there's no text content within will allow text area element to properly display caret. <img width="197" alt="截圖 2025-04-11 中午12 51 00" src="https://github.com/user-attachments/assets/10bc7314-9aa3-49df-baac-ef26d39a96d8" /> This PR also addresses issues with multiple glyph runs: https://github.com/user-attachments/assets/658db56f-b166-47ec-bc77-c6c13114d669 Testing: This PR is tested using: - `./mach run -d 'data:text/html,<input id="input_element" value="xxxxxxxxxxxxxxxxxxxx">'` - `./mach run -d 'data:text/html,<textarea id="input_element" value="xxxxxxxxxxxxxxxxxxxx">'` without causing crashes, while the results should be covered by WPT tests Fixes: https://github.com/servo/servo/issues/36449 --------- Signed-off-by: DK Liao <dklassic@gmail.com>
This commit is contained in:
parent
972ca77ce1
commit
5df4c760d3
5 changed files with 14 additions and 11 deletions
|
@ -1223,9 +1223,7 @@ fn glyphs(
|
|||
glyphs
|
||||
}
|
||||
|
||||
// TODO: This implementation has not been tested against `TextFragment` with mutiple runs.
|
||||
// It is possible that the `glyphs` function above will need to be modified to
|
||||
// handle multiple runs correctly.
|
||||
// TODO: The implementation here does not account for multiple glyph runs properly.
|
||||
fn glyphs_advance_by_index(
|
||||
glyph_runs: &[Arc<GlyphStore>],
|
||||
index: fonts_traits::ByteIndex,
|
||||
|
@ -1233,11 +1231,13 @@ fn glyphs_advance_by_index(
|
|||
justification_adjustment: Au,
|
||||
) -> PhysicalPoint<Au> {
|
||||
let mut point = baseline_origin;
|
||||
let mut index = index;
|
||||
for run in glyph_runs {
|
||||
let total_advance = run.advance_for_byte_range(
|
||||
&ServoRange::new(fonts::ByteIndex(0), index),
|
||||
&ServoRange::new(fonts::ByteIndex(0), index.min(run.len())),
|
||||
justification_adjustment,
|
||||
);
|
||||
index = index - index.min(run.len());
|
||||
point.x += total_advance;
|
||||
}
|
||||
point
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue