diff --git a/components/script/textinput.rs b/components/script/textinput.rs index 2f36b08dbd9..54bc7131f48 100644 --- a/components/script/textinput.rs +++ b/components/script/textinput.rs @@ -442,12 +442,23 @@ impl TextInput { let target_line: isize = self.edit_point.line as isize + adjust; if target_line < 0 { - self.edit_point.index = 0; self.edit_point.line = 0; + self.edit_point.index = 0; + if self.selection_origin.is_some() && + (self.selection_direction == SelectionDirection::None || + self.selection_direction == SelectionDirection::Forward) + { + self.selection_origin = Some(TextPoint { line: 0, index: 0 }); + } return; } else if target_line as usize >= self.lines.len() { self.edit_point.line = self.lines.len() - 1; self.edit_point.index = self.current_line_length(); + if self.selection_origin.is_some() && + (self.selection_direction == SelectionDirection::Backward) + { + self.selection_origin = Some(self.edit_point); + } return; } @@ -456,6 +467,16 @@ impl TextInput { .count(); self.edit_point.line = target_line as usize; self.edit_point.index = len_of_first_n_chars(&self.lines[self.edit_point.line], col); + if let Some(origin) = self.selection_origin { + if ((self.selection_direction == SelectionDirection::None || + self.selection_direction == SelectionDirection::Forward) && + self.edit_point <= origin) || + (self.selection_direction == SelectionDirection::Backward && + origin <= self.edit_point) + { + self.selection_origin = Some(self.edit_point); + } + } self.assert_ok_selection(); } diff --git a/tests/unit/script/textinput.rs b/tests/unit/script/textinput.rs index f4e65a0e1d3..5a7dfcfeac9 100644 --- a/tests/unit/script/textinput.rs +++ b/tests/unit/script/textinput.rs @@ -318,6 +318,10 @@ fn test_textinput_adjust_vertical() { textinput.adjust_vertical(2, Selection::NotSelected); assert_eq!(textinput.edit_point().line, 2); assert_eq!(textinput.edit_point().index, 1); + + textinput.adjust_vertical(-1, Selection::Selected); + assert_eq!(textinput.edit_point().line, 1); + assert_eq!(textinput.edit_point().index, 1); } #[test]