diff options
Diffstat (limited to 'components/script/dom/htmlinputelement.rs')
-rwxr-xr-x | components/script/dom/htmlinputelement.rs | 79 |
1 files changed, 36 insertions, 43 deletions
diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index 05ca796abd2..353117c39a0 100755 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -551,7 +551,36 @@ impl HTMLInputElementMethods for HTMLInputElement { // https://html.spec.whatwg.org/multipage/#dom-input-value fn SetValue(&self, value: DOMString) -> ErrorResult { - self.update_text_contents(value, true) + match self.value_mode() { + ValueMode::Value => { + // Steps 1-2. + let old_value = mem::replace(self.textinput.borrow_mut().single_line_content_mut(), value); + // Step 3. + self.value_dirty.set(true); + // Step 4. + self.sanitize_value(); + // Step 5. + if *self.textinput.borrow().single_line_content() != old_value { + self.textinput.borrow_mut().clear_selection_to_limit(Direction::Forward); + } + } + ValueMode::Default | + ValueMode::DefaultOn => { + self.upcast::<Element>().set_string_attribute(&local_name!("value"), value); + } + ValueMode::Filename => { + if value.is_empty() { + let window = window_from_node(self); + let fl = FileList::new(&window, vec![]); + self.filelist.set(Some(&fl)); + } else { + return Err(Error::InvalidState); + } + } + } + + self.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage); + Ok(()) } // https://html.spec.whatwg.org/multipage/#dom-input-defaultvalue @@ -906,8 +935,7 @@ impl HTMLInputElement { InputType::Image => (), _ => () } - - self.update_text_contents(self.DefaultValue(), true) + self.SetValue(self.DefaultValue()) .expect("Failed to reset input value to default."); self.value_dirty.set(false); self.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage); @@ -1056,44 +1084,6 @@ impl HTMLInputElement { fn selection(&self) -> TextControlSelection<Self> { TextControlSelection::new(&self, &self.textinput) } - - fn update_text_contents(&self, mut value: DOMString, update_text_cursor: bool) -> ErrorResult { - match self.value_mode() { - ValueMode::Value => { - // Step 3. - self.value_dirty.set(true); - - // Step 4. - self.sanitize_value(&mut value); - - let mut textinput = self.textinput.borrow_mut(); - - if *textinput.single_line_content() != value { - // Steps 1-2 - textinput.set_content(value, update_text_cursor); - - // Step 5. - textinput.clear_selection_to_limit(Direction::Forward, update_text_cursor); - } - } - ValueMode::Default | - ValueMode::DefaultOn => { - self.upcast::<Element>().set_string_attribute(&local_name!("value"), value); - } - ValueMode::Filename => { - if value.is_empty() { - let window = window_from_node(self); - let fl = FileList::new(&window, vec![]); - self.filelist.set(Some(&fl)); - } else { - return Err(Error::InvalidState); - } - } - } - - self.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage); - Ok(()) - } } impl VirtualMethods for HTMLInputElement { @@ -1103,6 +1093,7 @@ impl VirtualMethods for HTMLInputElement { fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) { self.super_type().unwrap().attribute_mutated(attr, mutation); + match attr.local_name() { &local_name!("disabled") => { let disabled_state = match mutation { @@ -1207,7 +1198,7 @@ impl VirtualMethods for HTMLInputElement { // Steps 7-9 if !previously_selectable && self.selection_api_applies() { - textinput.clear_selection_to_limit(Direction::Backward, true); + self.textinput.borrow_mut().clear_selection_to_limit(Direction::Backward); } }, AttributeMutation::Removed => { @@ -1231,7 +1222,9 @@ impl VirtualMethods for HTMLInputElement { let mut value = value.map_or(DOMString::new(), DOMString::from); self.sanitize_value(&mut value); - self.textinput.borrow_mut().set_content(value, true); + + self.textinput.borrow_mut().set_content( + value.map_or(DOMString::new(), DOMString::from)); self.update_placeholder_shown_state(); }, &local_name!("name") if self.input_type() == InputType::Radio => { |