From 12a0884f511c8ae475e60aa9113001820579ecf9 Mon Sep 17 00:00:00 2001 From: Chad Kimes Date: Sat, 2 Jan 2016 11:07:12 -0500 Subject: [PATCH 1/2] Add 'input' event for HTMLInputElement --- components/script/dom/htmlinputelement.rs | 32 ++++++++++++++++++++ components/script/dom/htmltextareaelement.rs | 32 +++----------------- 2 files changed, 37 insertions(+), 27 deletions(-) diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index 9413699ede7..5a17dbd9101 100644 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -14,6 +14,7 @@ use dom::bindings::codegen::Bindings::KeyboardEventBinding::KeyboardEventMethods use dom::bindings::global::GlobalRef; use dom::bindings::inheritance::Castable; use dom::bindings::js::{JS, LayoutJS, Root, RootedReference}; +use dom::bindings::refcounted::Trusted; use dom::document::Document; use dom::element::{AttributeMutation, Element, RawLayoutElementHelpers, LayoutElementHelpers}; use dom::event::{Event, EventBubbles, EventCancelable}; @@ -28,6 +29,8 @@ use dom::node::{document_from_node, window_from_node}; use dom::nodelist::NodeList; use dom::virtualmethods::VirtualMethods; use msg::constellation_msg::ConstellationChan; +use script_task::ScriptTaskEventCategory::InputEvent; +use script_task::{CommonScriptMsg, Runnable}; use script_traits::ScriptMsg as ConstellationMsg; use selectors::states::*; use std::borrow::ToOwned; @@ -690,6 +693,18 @@ impl VirtualMethods for HTMLInputElement { }, DispatchInput => { self.value_changed.set(true); + + if event.IsTrusted() { + let window = window_from_node(self); + let window = window.r(); + let chan = window.user_interaction_task_source(); + let handler = Trusted::new(self.upcast::(), chan.clone()); + let dispatcher = ChangeEventRunnable { + element: handler, + }; + let _ = chan.send(CommonScriptMsg::RunnableMsg(InputEvent, box dispatcher)); + } + self.force_relayout(); event.PreventDefault(); } @@ -920,3 +935,20 @@ impl Activatable for HTMLInputElement { } } } + +pub struct ChangeEventRunnable { + pub element: Trusted, +} + +impl Runnable for ChangeEventRunnable { + fn handler(self: Box) { + let target = self.element.root(); + let window = window_from_node(target.r()); + let window = window.r(); + let event = Event::new(GlobalRef::Window(window), + atom!("input"), + EventBubbles::DoesNotBubble, + EventCancelable::NotCancelable); + target.upcast::().dispatch_event(&event); + } +} diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index e850508d657..4607d8214ef 100644 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -8,18 +8,18 @@ use dom::bindings::codegen::Bindings::EventBinding::EventMethods; use dom::bindings::codegen::Bindings::HTMLTextAreaElementBinding; use dom::bindings::codegen::Bindings::HTMLTextAreaElementBinding::HTMLTextAreaElementMethods; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; -use dom::bindings::global::GlobalRef; use dom::bindings::inheritance::Castable; use dom::bindings::js::{LayoutJS, Root}; use dom::bindings::refcounted::Trusted; +use dom::bindings::reflector::{Reflectable}; use dom::document::Document; use dom::element::RawLayoutElementHelpers; use dom::element::{AttributeMutation, Element}; -use dom::event::{Event, EventBubbles, EventCancelable}; -use dom::eventtarget::EventTarget; +use dom::event::{Event}; use dom::htmlelement::HTMLElement; use dom::htmlfieldsetelement::HTMLFieldSetElement; use dom::htmlformelement::{FormControl, HTMLFormElement}; +use dom::htmlinputelement::ChangeEventRunnable; use dom::keyboardevent::KeyboardEvent; use dom::node::{ChildrenMutation, Node, NodeDamage, UnbindContext}; use dom::node::{document_from_node, window_from_node}; @@ -27,7 +27,7 @@ use dom::nodelist::NodeList; use dom::virtualmethods::VirtualMethods; use msg::constellation_msg::ConstellationChan; use script_task::ScriptTaskEventCategory::InputEvent; -use script_task::{CommonScriptMsg, Runnable}; +use script_task::{CommonScriptMsg}; use script_traits::ScriptMsg as ConstellationMsg; use selectors::states::*; use std::cell::Cell; @@ -233,17 +233,6 @@ impl HTMLTextAreaElement { let doc = document_from_node(self); doc.content_changed(self.upcast(), NodeDamage::OtherNodeDamage) } - - fn dispatch_change_event(&self) { - let window = window_from_node(self); - let window = window.r(); - let event = Event::new(GlobalRef::Window(window), - atom!("input"), - EventBubbles::DoesNotBubble, - EventCancelable::NotCancelable); - - self.upcast::().dispatch_event(&event); - } } impl VirtualMethods for HTMLTextAreaElement { @@ -330,7 +319,7 @@ impl VirtualMethods for HTMLTextAreaElement { let window = window_from_node(self); let window = window.r(); let chan = window.user_interaction_task_source(); - let handler = Trusted::new(self, chan.clone()); + let handler = Trusted::new(self.upcast::(), chan.clone()); let dispatcher = ChangeEventRunnable { element: handler, }; @@ -352,14 +341,3 @@ impl VirtualMethods for HTMLTextAreaElement { } impl FormControl for HTMLTextAreaElement {} - -pub struct ChangeEventRunnable { - element: Trusted, -} - -impl Runnable for ChangeEventRunnable { - fn handler(self: Box) { - let target = self.element.root(); - target.dispatch_change_event(); - } -} From 0e663e0f2fe4148dfad7e7895881ff76986621e4 Mon Sep 17 00:00:00 2001 From: Chad Kimes Date: Sat, 2 Jan 2016 11:31:22 -0500 Subject: [PATCH 2/2] De-duplicate input event send code --- components/script/dom/htmlinputelement.rs | 24 ++++++++++++-------- components/script/dom/htmltextareaelement.rs | 14 ++---------- 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index 5a17dbd9101..1a24d32f313 100644 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -695,14 +695,7 @@ impl VirtualMethods for HTMLInputElement { self.value_changed.set(true); if event.IsTrusted() { - let window = window_from_node(self); - let window = window.r(); - let chan = window.user_interaction_task_source(); - let handler = Trusted::new(self.upcast::(), chan.clone()); - let dispatcher = ChangeEventRunnable { - element: handler, - }; - let _ = chan.send(CommonScriptMsg::RunnableMsg(InputEvent, box dispatcher)); + ChangeEventRunnable::send(self.upcast::()); } self.force_relayout(); @@ -937,7 +930,20 @@ impl Activatable for HTMLInputElement { } pub struct ChangeEventRunnable { - pub element: Trusted, + element: Trusted, +} + +impl ChangeEventRunnable { + pub fn send(node: &Node) { + let window = window_from_node(node); + let window = window.r(); + let chan = window.user_interaction_task_source(); + let handler = Trusted::new(node, chan.clone()); + let dispatcher = ChangeEventRunnable { + element: handler, + }; + let _ = chan.send(CommonScriptMsg::RunnableMsg(InputEvent, box dispatcher)); + } } impl Runnable for ChangeEventRunnable { diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index 4607d8214ef..3c66ac6174a 100644 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -10,7 +10,6 @@ use dom::bindings::codegen::Bindings::HTMLTextAreaElementBinding::HTMLTextAreaEl use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; use dom::bindings::inheritance::Castable; use dom::bindings::js::{LayoutJS, Root}; -use dom::bindings::refcounted::Trusted; use dom::bindings::reflector::{Reflectable}; use dom::document::Document; use dom::element::RawLayoutElementHelpers; @@ -22,12 +21,10 @@ use dom::htmlformelement::{FormControl, HTMLFormElement}; use dom::htmlinputelement::ChangeEventRunnable; use dom::keyboardevent::KeyboardEvent; use dom::node::{ChildrenMutation, Node, NodeDamage, UnbindContext}; -use dom::node::{document_from_node, window_from_node}; +use dom::node::{document_from_node}; use dom::nodelist::NodeList; use dom::virtualmethods::VirtualMethods; use msg::constellation_msg::ConstellationChan; -use script_task::ScriptTaskEventCategory::InputEvent; -use script_task::{CommonScriptMsg}; use script_traits::ScriptMsg as ConstellationMsg; use selectors::states::*; use std::cell::Cell; @@ -316,14 +313,7 @@ impl VirtualMethods for HTMLTextAreaElement { self.value_changed.set(true); if event.IsTrusted() { - let window = window_from_node(self); - let window = window.r(); - let chan = window.user_interaction_task_source(); - let handler = Trusted::new(self.upcast::(), chan.clone()); - let dispatcher = ChangeEventRunnable { - element: handler, - }; - let _ = chan.send(CommonScriptMsg::RunnableMsg(InputEvent, box dispatcher)); + ChangeEventRunnable::send(self.upcast::()); } self.force_relayout();