diff options
author | Matthew Rasmus <mattr@zzntd.com> | 2014-11-30 15:37:27 -0800 |
---|---|---|
committer | Matthew Rasmus <mattr@zzntd.com> | 2014-12-05 12:31:31 -0800 |
commit | f5bd8f830acd54617b74a7eed25992119e449462 (patch) | |
tree | 0571cd0f16d8e5034428813338b0314fae5ca6fe /components/script/dom/htmltextareaelement.rs | |
parent | ed37b53a62defe1d3d08de18166d41a20bd86912 (diff) | |
download | servo-f5bd8f830acd54617b74a7eed25992119e449462.tar.gz servo-f5bd8f830acd54617b74a7eed25992119e449462.zip |
HTMLTextArea: Implements a dirty value flag
Diffstat (limited to 'components/script/dom/htmltextareaelement.rs')
-rw-r--r-- | components/script/dom/htmltextareaelement.rs | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index 67498ba6a17..59cbf9e6dd7 100644 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -27,10 +27,15 @@ use dom::virtualmethods::VirtualMethods; use servo_util::str::DOMString; use string_cache::Atom; +use std::cell::Cell; + #[dom_struct] pub struct HTMLTextAreaElement { htmlelement: HTMLElement, textinput: DOMRefCell<TextInput>, + + // https://html.spec.whatwg.org/multipage/forms.html#concept-textarea-dirty + value_changed: Cell<bool>, } impl HTMLTextAreaElementDerived for EventTarget { @@ -55,6 +60,7 @@ impl HTMLTextAreaElement { HTMLTextAreaElement { htmlelement: HTMLElement::new_inherited(HTMLTextAreaElementTypeId, localName, prefix, document), textinput: DOMRefCell::new(TextInput::new(Multiple, "".to_string())), + value_changed: Cell::new(false), } } @@ -125,7 +131,13 @@ impl<'a> HTMLTextAreaElementMethods for JSRef<'a, HTMLTextAreaElement> { // https://html.spec.whatwg.org/multipage/forms.html#dom-textarea-defaultvalue fn SetDefaultValue(self, value: DOMString) { let node: JSRef<Node> = NodeCast::from_ref(self); - node.SetTextContent(Some(value)) + node.SetTextContent(Some(value)); + + // if the element's dirty value flag is false, then the element's + // raw value must be set to the value of the element's textContent IDL attribute + if !self.value_changed.get() { + self.SetValue(node.GetTextContent().unwrap()); + } } // https://html.spec.whatwg.org/multipage/forms.html#dom-textarea-value @@ -136,6 +148,7 @@ impl<'a> HTMLTextAreaElementMethods for JSRef<'a, HTMLTextAreaElement> { // https://html.spec.whatwg.org/multipage/forms.html#dom-textarea-value fn SetValue(self, value: DOMString) { self.textinput.borrow_mut().set_content(value); + self.force_relayout(); } } @@ -242,16 +255,17 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLTextAreaElement> { let doc = document_from_node(*self).root(); doc.request_focus(ElementCast::from_ref(*self)); } else if "keydown" == event.Type().as_slice() && !event.DefaultPrevented() { - let keyevent: Option<JSRef<KeyboardEvent>> = KeyboardEventCast::to_ref(event); - keyevent.map(|event| { - match self.textinput.borrow_mut().handle_keydown(event) { - TriggerDefaultAction => (), - DispatchInput => { - self.force_relayout(); - } - Nothing => (), + let keyevent: Option<JSRef<KeyboardEvent>> = KeyboardEventCast::to_ref(event); + keyevent.map(|event| { + match self.textinput.borrow_mut().handle_keydown(event) { + TriggerDefaultAction => (), + DispatchInput => { + self.force_relayout(); + self.value_changed.set(true); } - }); + Nothing => (), + } + }); } } } |