diff options
author | Matt McCoy <mattnenterprise@yahoo.com> | 2015-01-27 21:16:56 -0500 |
---|---|---|
committer | Matt McCoy <mattnenterprise@yahoo.com> | 2015-03-17 17:05:21 -0400 |
commit | 7cb851dda19e3d30543c58b26ad17d82554997d8 (patch) | |
tree | c45c360824d90766c6717da248a91d62c9217b2f | |
parent | 203240c1d82b780ce49261d8b47e6cbe6af50950 (diff) | |
download | servo-7cb851dda19e3d30543c58b26ad17d82554997d8.tar.gz servo-7cb851dda19e3d30543c58b26ad17d82554997d8.zip |
Fixes #4508 dispatching input event at HTMLTextareaElement
-rw-r--r-- | components/script/dom/htmltextareaelement.rs | 34 |
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 |