mirror of
https://github.com/servo/servo.git
synced 2025-08-03 12:40:06 +01:00
Fixes #4508 dispatching input event at HTMLTextareaElement
This commit is contained in:
parent
203240c1d8
commit
7cb851dda1
1 changed files with 31 additions and 3 deletions
|
@ -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();
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue