aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/htmltextareaelement.rs
diff options
context:
space:
mode:
authorMatthew Rasmus <mattr@zzntd.com>2014-11-30 15:37:27 -0800
committerMatthew Rasmus <mattr@zzntd.com>2014-12-05 12:31:31 -0800
commitf5bd8f830acd54617b74a7eed25992119e449462 (patch)
tree0571cd0f16d8e5034428813338b0314fae5ca6fe /components/script/dom/htmltextareaelement.rs
parented37b53a62defe1d3d08de18166d41a20bd86912 (diff)
downloadservo-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.rs34
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 => (),
+ }
+ });
}
}
}