mirror of
https://github.com/servo/servo.git
synced 2025-07-23 07:13:52 +01:00
Fix bug of TextInput.adjust_horizontal causing stack overflow or wraparound
When the edit_point is in the first position of a multiline TextInput adjust_horizontal(-1) moves the edit_point to the end of the first line. When the first line is empty this causes a stack overflow. When the edit_point is in the last position adjust_horizontal(1) causes a stack overflow.
This commit is contained in:
parent
f99c0e2c15
commit
b5e7cba598
1 changed files with 10 additions and 19 deletions
|
@ -178,29 +178,20 @@ impl TextInput {
|
||||||
/// adjusted vertically and the process repeats with the remaining adjustment requested.
|
/// adjusted vertically and the process repeats with the remaining adjustment requested.
|
||||||
fn adjust_horizontal(&mut self, adjust: int) {
|
fn adjust_horizontal(&mut self, adjust: int) {
|
||||||
if adjust < 0 {
|
if adjust < 0 {
|
||||||
if self.multiline {
|
let remaining = self.edit_point.index;
|
||||||
let remaining = self.edit_point.index;
|
if adjust.abs() as uint > remaining && self.edit_point.line > 0 {
|
||||||
if adjust.abs() as uint > remaining {
|
self.adjust_vertical(-1);
|
||||||
self.edit_point.index = 0;
|
self.edit_point.index = self.current_line_length();
|
||||||
self.adjust_vertical(-1);
|
self.adjust_horizontal(adjust + remaining as int);
|
||||||
self.edit_point.index = self.current_line_length();
|
|
||||||
self.adjust_horizontal(adjust + remaining as int);
|
|
||||||
} else {
|
|
||||||
self.edit_point.index = (self.edit_point.index as int + adjust) as uint;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
self.edit_point.index = max(0, self.edit_point.index as int + adjust) as uint;
|
self.edit_point.index = max(0, self.edit_point.index as int + adjust) as uint;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if self.multiline {
|
let remaining = self.current_line_length() - self.edit_point.index;
|
||||||
let remaining = self.current_line_length() - self.edit_point.index;
|
if adjust as uint > remaining && self.edit_point.line < self.lines.len() - 1 {
|
||||||
if adjust as uint > remaining {
|
self.edit_point.index = 0;
|
||||||
self.edit_point.index = 0;
|
self.adjust_vertical(1);
|
||||||
self.adjust_vertical(1);
|
self.adjust_horizontal(adjust - remaining as int);
|
||||||
self.adjust_horizontal(adjust - remaining as int);
|
|
||||||
} else {
|
|
||||||
self.edit_point.index += adjust as uint;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
self.edit_point.index = min(self.current_line_length(),
|
self.edit_point.index = min(self.current_line_length(),
|
||||||
self.edit_point.index + adjust as uint);
|
self.edit_point.index + adjust as uint);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue