diff --git a/components/script/textinput.rs b/components/script/textinput.rs index 937ab38ed5d6..4d8479346f39 100644 --- a/components/script/textinput.rs +++ b/components/script/textinput.rs @@ -871,13 +871,12 @@ impl TextInput { fn offset_to_text_point(&self, abs_point: usize) -> TextPoint { let mut index = abs_point; let mut line = 0; - let last_line_idx = self.lines.len() - 1; self.lines.iter().enumerate().fold(0, |acc, (i, val)| { if i != last_line_idx { - let line_end = max(val.len(), 1); - let new_acc = acc + line_end; - if abs_point > new_acc && index > line_end { + let line_end = val.len(); + let new_acc = acc + line_end + 1; + if abs_point >= new_acc && index > line_end { index -= line_end + 1; line += 1; } diff --git a/tests/unit/script/textinput.rs b/tests/unit/script/textinput.rs index 2167efb0b6d1..dfc6970334d1 100644 --- a/tests/unit/script/textinput.rs +++ b/tests/unit/script/textinput.rs @@ -600,6 +600,27 @@ fn test_textinput_set_selection_with_direction() { assert!(textinput.selection_origin.is_some()); assert_eq!(textinput.selection_origin.unwrap().line, 0); assert_eq!(textinput.selection_origin.unwrap().index, 6); + + textinput = text_input(Lines::Multiple, "\n\n"); + textinput.set_selection_range(0, 1, SelectionDirection::Forward); + assert_eq!(textinput.edit_point.line, 1); + assert_eq!(textinput.edit_point.index, 0); + assert_eq!(textinput.selection_direction, SelectionDirection::Forward); + + assert!(textinput.selection_origin.is_some()); + assert_eq!(textinput.selection_origin.unwrap().line, 0); + assert_eq!(textinput.selection_origin.unwrap().index, 0); + + textinput = text_input(Lines::Multiple, "\n"); + textinput.set_selection_range(0, 1, SelectionDirection::Forward); + assert_eq!(textinput.edit_point.line, 1); + assert_eq!(textinput.edit_point.index, 0); + assert_eq!(textinput.selection_direction, SelectionDirection::Forward); + + assert!(textinput.selection_origin.is_some()); + assert_eq!(textinput.selection_origin.unwrap().line, 0); + assert_eq!(textinput.selection_origin.unwrap().index, 0); + } #[test] @@ -629,4 +650,11 @@ fn test_selection_bounds() { assert_eq!(TextPoint { line: 0, index: 6 }, textinput.selection_end()); assert_eq!(3, textinput.selection_start_offset()); assert_eq!(6, textinput.selection_end_offset()); + + textinput = text_input(Lines::Multiple, "\n\n"); + textinput.set_selection_range(0, 1, SelectionDirection::Forward); + assert_eq!(TextPoint { line: 0, index: 0 }, textinput.selection_origin_or_edit_point()); + assert_eq!(TextPoint { line: 0, index: 0 }, textinput.selection_start()); + assert_eq!(TextPoint { line: 1, index: 0 }, textinput.selection_end()); + } diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index bd3460282f01..59de29a29987 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -353734,6 +353734,12 @@ {} ] ], + "selection/setSelectionRange.html": [ + [ + "/selection/setSelectionRange.html", + {} + ] + ], "selection/type.html": [ [ "/selection/type.html", @@ -581157,6 +581163,10 @@ "856ba9771d2c1e2eaae00dcf6b8378a42003cc7a", "testharness" ], + "selection/setSelectionRange.html": [ + "a047ea5e4c00894fcc30e972f84bcedc4a8226cf", + "testharness" + ], "selection/test-iframe.html": [ "3803c785b4a2fe2bbf9ecb895e6d3e1ae9e40164", "support" diff --git a/tests/wpt/metadata/selection/setSelectionRange.html.ini b/tests/wpt/metadata/selection/setSelectionRange.html.ini new file mode 100644 index 000000000000..380ea37b61c3 --- /dev/null +++ b/tests/wpt/metadata/selection/setSelectionRange.html.ini @@ -0,0 +1,4 @@ +[setSelectionRange.html] + type: testharness + [setSelectionRange on line boundaries] + expected: FAIL \ No newline at end of file diff --git a/tests/wpt/web-platform-tests/selection/setSelectionRange.html b/tests/wpt/web-platform-tests/selection/setSelectionRange.html new file mode 100644 index 000000000000..bdf52a77f873 --- /dev/null +++ b/tests/wpt/web-platform-tests/selection/setSelectionRange.html @@ -0,0 +1,18 @@ + + + + + + +