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::{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();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue