Fixes #4508 dispatching input event at HTMLTextareaElement

This commit is contained in:
Matt McCoy 2015-01-27 21:16:56 -05:00
parent 203240c1d8
commit 7cb851dda1

View file

@ -12,19 +12,22 @@ use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLElementCast, NodeCast}; use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLElementCast, NodeCast};
use dom::bindings::codegen::InheritTypes::{HTMLTextAreaElementDerived, HTMLFieldSetElementDerived}; use dom::bindings::codegen::InheritTypes::{HTMLTextAreaElementDerived, HTMLFieldSetElementDerived};
use dom::bindings::codegen::InheritTypes::{KeyboardEventCast, TextDerived}; use dom::bindings::codegen::InheritTypes::{KeyboardEventCast, TextDerived};
use dom::bindings::js::{JSRef, LayoutJS, Temporary, OptionalRootable}; use dom::bindings::global::GlobalRef;
use dom::bindings::js::{JS, JSRef, LayoutJS, Temporary, OptionalRootable};
use dom::bindings::refcounted::Trusted;
use dom::document::{Document, DocumentHelpers}; use dom::document::{Document, DocumentHelpers};
use dom::element::{Element, AttributeHandlers}; use dom::element::{Element, AttributeHandlers};
use dom::event::Event; use dom::event::{Event, EventBubbles, EventCancelable};
use dom::eventtarget::{EventTarget, EventTargetTypeId}; use dom::eventtarget::{EventTarget, EventTargetTypeId};
use dom::element::ElementTypeId; use dom::element::ElementTypeId;
use dom::htmlelement::{HTMLElement, HTMLElementTypeId}; use dom::htmlelement::{HTMLElement, HTMLElementTypeId};
use dom::htmlformelement::FormControl; use dom::htmlformelement::FormControl;
use dom::keyboardevent::KeyboardEvent; use dom::keyboardevent::KeyboardEvent;
use dom::node::{DisabledStateHelpers, Node, NodeHelpers, NodeDamage, NodeTypeId}; use dom::node::{DisabledStateHelpers, Node, NodeHelpers, NodeDamage, NodeTypeId};
use dom::node::{document_from_node}; use dom::node::{document_from_node, window_from_node};
use textinput::{TextInput, Lines, KeyReaction}; use textinput::{TextInput, Lines, KeyReaction};
use dom::virtualmethods::VirtualMethods; use dom::virtualmethods::VirtualMethods;
use script_task::{ScriptMsg, Runnable};
use util::str::DOMString; use util::str::DOMString;
use string_cache::Atom; use string_cache::Atom;
@ -183,6 +186,13 @@ impl<'a> HTMLTextAreaElementMethods for JSRef<'a, HTMLTextAreaElement> {
// TODO move the cursor to the end of the field // TODO move the cursor to the end of the field
self.textinput.borrow_mut().set_content(value); self.textinput.borrow_mut().set_content(value);
self.value_changed.set(true); self.value_changed.set(true);
let window = window_from_node(self).root();
let window = window.r();
let chan = window.script_chan();
let handler = Trusted::new(window.get_cx(), self, chan.clone());
chan.send(ScriptMsg::RunnableMsg(box handler));
self.force_relayout(); self.force_relayout();
} }
} }
@ -207,6 +217,7 @@ impl<'a> HTMLTextAreaElementHelpers for JSRef<'a, HTMLTextAreaElement> {
trait PrivateHTMLTextAreaElementHelpers { trait PrivateHTMLTextAreaElementHelpers {
fn force_relayout(self); fn force_relayout(self);
fn dispatch_change_event(self);
} }
impl<'a> PrivateHTMLTextAreaElementHelpers for JSRef<'a, HTMLTextAreaElement> { impl<'a> PrivateHTMLTextAreaElementHelpers for JSRef<'a, HTMLTextAreaElement> {
@ -215,6 +226,16 @@ impl<'a> PrivateHTMLTextAreaElementHelpers for JSRef<'a, HTMLTextAreaElement> {
let node: JSRef<Node> = NodeCast::from_ref(self); let node: JSRef<Node> = NodeCast::from_ref(self);
doc.r().content_changed(node, NodeDamage::OtherNodeDamage) doc.r().content_changed(node, NodeDamage::OtherNodeDamage)
} }
fn dispatch_change_event(self) {
let window = window_from_node(self).root();
let window = window.r();
let event = Event::new(GlobalRef::Window(window),
"input".to_owned(),
EventBubbles::DoesNotBubble,
EventCancelable::NotCancelable).root();
self.handle_event(event.r());
}
} }
impl<'a> VirtualMethods for JSRef<'a, HTMLTextAreaElement> { impl<'a> VirtualMethods for JSRef<'a, HTMLTextAreaElement> {
@ -344,3 +365,10 @@ impl<'a> FormControl<'a> for JSRef<'a, HTMLTextAreaElement> {
ElementCast::from_ref(self) ElementCast::from_ref(self)
} }
} }
impl Runnable for Trusted<HTMLTextAreaElement> {
fn handler(self: Box<Trusted<HTMLTextAreaElement>>) {
let target = self.to_temporary().root();
target.r().dispatch_change_event();
}
}