aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt McCoy <mattnenterprise@yahoo.com>2015-01-27 21:16:56 -0500
committerMatt McCoy <mattnenterprise@yahoo.com>2015-03-17 17:05:21 -0400
commit7cb851dda19e3d30543c58b26ad17d82554997d8 (patch)
treec45c360824d90766c6717da248a91d62c9217b2f
parent203240c1d82b780ce49261d8b47e6cbe6af50950 (diff)
downloadservo-7cb851dda19e3d30543c58b26ad17d82554997d8.tar.gz
servo-7cb851dda19e3d30543c58b26ad17d82554997d8.zip
Fixes #4508 dispatching input event at HTMLTextareaElement
-rw-r--r--components/script/dom/htmltextareaelement.rs34
1 files changed, 31 insertions, 3 deletions
diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs
index 0e7b6de2642..763d6aa9c64 100644
--- a/components/script/dom/htmltextareaelement.rs
+++ b/components/script/dom/htmltextareaelement.rs
@@ -12,19 +12,22 @@ use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods;
use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLElementCast, NodeCast};
use dom::bindings::codegen::InheritTypes::{HTMLTextAreaElementDerived, HTMLFieldSetElementDerived};
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::element::{Element, AttributeHandlers};
-use dom::event::Event;
+use dom::event::{Event, EventBubbles, EventCancelable};
use dom::eventtarget::{EventTarget, EventTargetTypeId};
use dom::element::ElementTypeId;
use dom::htmlelement::{HTMLElement, HTMLElementTypeId};
use dom::htmlformelement::FormControl;
use dom::keyboardevent::KeyboardEvent;
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 dom::virtualmethods::VirtualMethods;
+use script_task::{ScriptMsg, Runnable};
use util::str::DOMString;
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
self.textinput.borrow_mut().set_content(value);
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();
}
}
@@ -207,6 +217,7 @@ impl<'a> HTMLTextAreaElementHelpers for JSRef<'a, HTMLTextAreaElement> {
trait PrivateHTMLTextAreaElementHelpers {
fn force_relayout(self);
+ fn dispatch_change_event(self);
}
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);
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> {
@@ -344,3 +365,10 @@ impl<'a> FormControl<'a> for JSRef<'a, HTMLTextAreaElement> {
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();
+ }
+} \ No newline at end of file