Skip to content

Commit

Permalink
Fixes #4508 dispatching input event at HTMLTextareaElement
Browse files Browse the repository at this point in the history
  • Loading branch information
mattnenterprise committed Mar 17, 2015
1 parent 203240c commit 7cb851d
Showing 1 changed file with 31 additions and 3 deletions.
34 changes: 31 additions & 3 deletions components/script/dom/htmltextareaelement.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
}
}
Expand All @@ -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> {
Expand All @@ -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> {
Expand Down Expand Up @@ -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();
}
}

0 comments on commit 7cb851d

Please sign in to comment.