mirror of
https://github.com/servo/servo.git
synced 2025-08-04 13:10:20 +01:00
parent
ac576910d2
commit
a7a5babb3a
5 changed files with 44 additions and 56 deletions
|
@ -34,7 +34,7 @@ use std::default::Default;
|
||||||
use std::ops::Range;
|
use std::ops::Range;
|
||||||
use style::attr::AttrValue;
|
use style::attr::AttrValue;
|
||||||
use style::element_state::ElementState;
|
use style::element_state::ElementState;
|
||||||
use textinput::{KeyReaction, Lines, SelectionDirection, TextInput};
|
use textinput::{Direction, KeyReaction, Lines, Selection, SelectionDirection, TextInput};
|
||||||
|
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct HTMLTextAreaElement {
|
pub struct HTMLTextAreaElement {
|
||||||
|
@ -232,10 +232,25 @@ impl HTMLTextAreaElementMethods for HTMLTextAreaElement {
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-textarea-value
|
// https://html.spec.whatwg.org/multipage/#dom-textarea-value
|
||||||
fn SetValue(&self, value: DOMString) {
|
fn SetValue(&self, value: DOMString) {
|
||||||
// TODO move the cursor to the end of the field
|
let mut textinput = self.textinput.borrow_mut();
|
||||||
self.textinput.borrow_mut().set_content(value);
|
|
||||||
|
// Step 1
|
||||||
|
let old_value = textinput.get_content();
|
||||||
|
let old_selection = textinput.selection_begin;
|
||||||
|
|
||||||
|
// Step 2
|
||||||
|
textinput.set_content(value);
|
||||||
|
|
||||||
|
// Step 3
|
||||||
self.value_changed.set(true);
|
self.value_changed.set(true);
|
||||||
|
|
||||||
|
if old_value != textinput.get_content() {
|
||||||
|
// Step 4
|
||||||
|
textinput.adjust_horizontal_to_limit(Direction::Forward, Selection::NotSelected);
|
||||||
|
} else {
|
||||||
|
textinput.selection_begin = old_selection;
|
||||||
|
}
|
||||||
|
|
||||||
self.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage);
|
self.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -542604,7 +542604,7 @@
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"html/semantics/forms/textfieldselection/selection-value-interactions.html": [
|
"html/semantics/forms/textfieldselection/selection-value-interactions.html": [
|
||||||
"c568d7fe10cb4c2071b5d38530ad601988a789ea",
|
"39fe9646bbc2741e9bd3296d4e01513c99106151",
|
||||||
"testharness"
|
"testharness"
|
||||||
],
|
],
|
||||||
"html/semantics/forms/textfieldselection/selection.html": [
|
"html/semantics/forms/textfieldselection/selection.html": [
|
||||||
|
|
|
@ -3,33 +3,3 @@
|
||||||
[Setting selectionStart to a value larger than selectionEnd should increase selectionEnd]
|
[Setting selectionStart to a value larger than selectionEnd should increase selectionEnd]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[Setting selectionEnd to a value smaller than selectionStart should decrease selectionStart]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[selectionStart edge-case values]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Initial .value set on textarea-appended should set selectionStart to end of value]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Initial .value set on textarea-not-appended should set selectionStart to end of value]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Initial .value set on textarea-appended-prefocused should set selectionStart to end of value]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Initial .value set on textarea-not-appended-prefocused should set selectionStart to end of value]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Initial .value set on textarea-appended should set selectionEnd to end of value]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Initial .value set on textarea-not-appended should set selectionEnd to end of value]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Initial .value set on textarea-appended-prefocused should set selectionEnd to end of value]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Initial .value set on textarea-not-appended-prefocused should set selectionEnd to end of value]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
|
|
|
@ -36,15 +36,9 @@
|
||||||
[test SelectionStart offset for textarea that is appended]
|
[test SelectionStart offset for textarea that is appended]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[test SelectionStart offset for textarea that is not appended]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[test SelectionEnd offset for input that is appended]
|
[test SelectionEnd offset for input that is appended]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[test SelectionEnd offset for textarea that is appended]
|
[test SelectionEnd offset for textarea that is appended]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
[test SelectionEnd offset for textarea that is not appended]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
|
|
|
@ -97,22 +97,31 @@ for (var tag of ['input', 'textarea']) {
|
||||||
var el = document.createElement(tag);
|
var el = document.createElement(tag);
|
||||||
document.body.appendChild(el);
|
document.body.appendChild(el);
|
||||||
this.add_cleanup(() => el.remove());
|
this.add_cleanup(() => el.remove());
|
||||||
el.value = "";
|
|
||||||
assert_equals(el.selectionStart, el.value.length,
|
for (let val of ["", "foo", "foobar"]) {
|
||||||
"element.selectionStart should be value.length");
|
el.value = val;
|
||||||
assert_equals(el.selectionEnd, el.value.length,
|
assert_equals(el.selectionStart, val.length,
|
||||||
"element.selectionEnd should be value.length");
|
"element.selectionStart should be value.length");
|
||||||
el.value = "foo";
|
assert_equals(el.selectionEnd, val.length,
|
||||||
assert_equals(el.selectionStart, el.value.length,
|
"element.selectionEnd should be value.length");
|
||||||
"element.selectionStart should be value.length");
|
}
|
||||||
assert_equals(el.selectionEnd, el.value.length,
|
}, `selection is collapsed to the end after changing values on ${tag}`);
|
||||||
"element.selectionEnd should be value.length");
|
|
||||||
el.value = "foobar";
|
test(function() {
|
||||||
assert_equals(el.selectionStart, el.value.length,
|
var el = document.createElement(tag);
|
||||||
"element.selectionStart should be value.length");
|
document.body.appendChild(el);
|
||||||
assert_equals(el.selectionEnd, el.value.length,
|
this.add_cleanup(() => el.remove());
|
||||||
"element.selectionEnd should be value.length");
|
|
||||||
}, `selection is always collapsed to the end after setting values on ${tag}`);
|
el.value = "foobar"
|
||||||
|
el.selectionStart = 2
|
||||||
|
el.selectionEnd = 4
|
||||||
|
el.value = "foobar"
|
||||||
|
|
||||||
|
assert_equals(el.selectionStart, 2,
|
||||||
|
"element.selectionStart should be unchanged");
|
||||||
|
assert_equals(el.selectionEnd, 4,
|
||||||
|
"element.selectionEnd should be unchanged");
|
||||||
|
}, `selection is not collapsed to the end when value is set to its existing value on ${tag}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue