aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/htmltextareaelement.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/htmltextareaelement.rs')
-rwxr-xr-xcomponents/script/dom/htmltextareaelement.rs33
1 files changed, 31 insertions, 2 deletions
diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs
index 47b9bb6ee0b..87e9fb532d3 100755
--- a/components/script/dom/htmltextareaelement.rs
+++ b/components/script/dom/htmltextareaelement.rs
@@ -39,6 +39,7 @@ pub struct HTMLTextAreaElement {
htmlelement: HTMLElement,
#[ignore_heap_size_of = "#7193"]
textinput: DOMRefCell<TextInput<IpcSender<ConstellationMsg>>>,
+ placeholder: DOMRefCell<DOMString>,
// https://html.spec.whatwg.org/multipage/#concept-textarea-dirty
value_changed: Cell<bool>,
}
@@ -58,7 +59,12 @@ impl LayoutHTMLTextAreaElementHelpers for LayoutJS<HTMLTextAreaElement> {
#[allow(unrooted_must_root)]
#[allow(unsafe_code)]
unsafe fn get_value_for_layout(self) -> String {
- String::from((*self.unsafe_get()).textinput.borrow_for_layout().get_content())
+ let text = (*self.unsafe_get()).textinput.borrow_for_layout().get_content();
+ String::from(if text.is_empty() {
+ (*self.unsafe_get()).placeholder.borrow_for_layout().clone()
+ } else {
+ text
+ })
}
#[allow(unrooted_must_root)]
@@ -105,6 +111,7 @@ impl HTMLTextAreaElement {
htmlelement:
HTMLElement::new_inherited_with_state(IN_ENABLED_STATE | IN_READ_WRITE_STATE,
local_name, prefix, document),
+ placeholder: DOMRefCell::new(DOMString::new()),
textinput: DOMRefCell::new(TextInput::new(
Lines::Multiple, DOMString::new(), chan, None, None, SelectionDirection::None)),
value_changed: Cell::new(false),
@@ -119,6 +126,14 @@ impl HTMLTextAreaElement {
document,
HTMLTextAreaElementBinding::Wrap)
}
+
+ fn update_placeholder_shown_state(&self) {
+ let has_placeholder = !self.placeholder.borrow().is_empty();
+ let has_value = !self.textinput.borrow().is_empty();
+ let el = self.upcast::<Element>();
+ el.set_placeholder_shown_state(has_placeholder && !has_value);
+ el.set_placeholder_shown_state(has_placeholder);
+ }
}
impl HTMLTextAreaElementMethods for HTMLTextAreaElement {
@@ -311,6 +326,16 @@ impl VirtualMethods for HTMLTextAreaElement {
}
}
},
+ local_name!("placeholder") => {
+ {
+ let mut placeholder = self.placeholder.borrow_mut();
+ placeholder.clear();
+ if let AttributeMutation::Set(_) = mutation {
+ placeholder.push_str(&attr.value());
+ }
+ }
+ self.update_placeholder_shown_state();
+ },
local_name!("readonly") => {
let el = self.upcast::<Element>();
match mutation {
@@ -375,10 +400,14 @@ impl VirtualMethods for HTMLTextAreaElement {
document_from_node(self).request_focus(self.upcast());
} else if event.type_() == atom!("keydown") && !event.DefaultPrevented() {
if let Some(kevent) = event.downcast::<KeyboardEvent>() {
- match self.textinput.borrow_mut().handle_keydown(kevent) {
+ // This can't be inlined, as holding on to textinput.borrow_mut()
+ // during self.implicit_submission will cause a panic.
+ let action = self.textinput.borrow_mut().handle_keydown(kevent);
+ match action {
KeyReaction::TriggerDefaultAction => (),
KeyReaction::DispatchInput => {
self.value_changed.set(true);
+ self.update_placeholder_shown_state();
if event.IsTrusted() {
let window = window_from_node(self);