diff options
author | Ravi Shankar <wafflespeanut@gmail.com> | 2016-12-27 13:01:45 +0530 |
---|---|---|
committer | Ravi Shankar <wafflespeanut@gmail.com> | 2016-12-27 15:57:23 +0530 |
commit | 08662cc64e0674b910c1579ca550afd77e559eca (patch) | |
tree | 6234a48fca1a3d199d93483e0d4f5b426a7510cc | |
parent | b10bfeaeb6dff4031f62ee14b05102db0db53b2c (diff) | |
download | servo-08662cc64e0674b910c1579ca550afd77e559eca.tar.gz servo-08662cc64e0674b910c1579ca550afd77e559eca.zip |
Allow 'keypress' event to emerge from input and textarea elements
-rw-r--r-- | components/script/dom/document.rs | 57 | ||||
-rwxr-xr-x | components/script/dom/htmlinputelement.rs | 4 | ||||
-rwxr-xr-x | components/script/dom/htmltextareaelement.rs | 4 |
3 files changed, 32 insertions, 33 deletions
diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 6f8f2435311..0f427cdb069 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -13,7 +13,6 @@ use dom::bindings::codegen::Bindings::DOMRectBinding::DOMRectMethods; use dom::bindings::codegen::Bindings::DocumentBinding; use dom::bindings::codegen::Bindings::DocumentBinding::{DocumentMethods, DocumentReadyState}; use dom::bindings::codegen::Bindings::ElementBinding::ElementMethods; -use dom::bindings::codegen::Bindings::EventBinding::EventMethods; use dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use dom::bindings::codegen::Bindings::EventHandlerBinding::OnErrorEventHandlerNonNull; use dom::bindings::codegen::Bindings::NodeBinding::NodeMethods; @@ -41,7 +40,7 @@ use dom::documenttype::DocumentType; use dom::domimplementation::DOMImplementation; use dom::element::{Element, ElementCreator, ElementPerformFullscreenEnter, ElementPerformFullscreenExit}; use dom::errorevent::ErrorEvent; -use dom::event::{Event, EventBubbles, EventCancelable}; +use dom::event::{Event, EventBubbles, EventCancelable, EventDefault}; use dom::eventdispatcher::EventStatus; use dom::eventtarget::EventTarget; use dom::focusevent::FocusEvent; @@ -1308,10 +1307,10 @@ impl Document { props.key_code); let event = keyevent.upcast::<Event>(); event.fire(target); - let mut prevented = event.DefaultPrevented(); + let mut cancel_state = event.get_cancel_state(); // https://w3c.github.io/uievents/#keys-cancelable-keys - if state != KeyState::Released && props.is_printable() && !prevented { + if state != KeyState::Released && props.is_printable() && cancel_state != EventDefault::Prevented { // https://w3c.github.io/uievents/#keypress-event-order let event = KeyboardEvent::new(&self.window, DOMString::from("keypress"), @@ -1334,40 +1333,40 @@ impl Document { 0); let ev = event.upcast::<Event>(); ev.fire(target); - prevented = ev.DefaultPrevented(); + cancel_state = ev.get_cancel_state(); // TODO: if keypress event is canceled, prevent firing input events } - if !prevented { + if cancel_state == EventDefault::Allowed { constellation.send(ConstellationMsg::SendKeyEvent(ch, key, state, modifiers)).unwrap(); - } - // This behavior is unspecced - // We are supposed to dispatch synthetic click activation for Space and/or Return, - // however *when* we do it is up to us - // I'm dispatching it after the key event so the script has a chance to cancel it - // https://www.w3.org/Bugs/Public/show_bug.cgi?id=27337 - match key { - Key::Space if !prevented && state == KeyState::Released => { - let maybe_elem = target.downcast::<Element>(); - if let Some(el) = maybe_elem { - synthetic_click_activation(el, - false, - false, - false, - false, - ActivationSource::NotFromClick) + // This behavior is unspecced + // We are supposed to dispatch synthetic click activation for Space and/or Return, + // however *when* we do it is up to us. + // Here, we're dispatching it after the key event so the script has a chance to cancel it + // https://www.w3.org/Bugs/Public/show_bug.cgi?id=27337 + match key { + Key::Space if state == KeyState::Released => { + let maybe_elem = target.downcast::<Element>(); + if let Some(el) = maybe_elem { + synthetic_click_activation(el, + false, + false, + false, + false, + ActivationSource::NotFromClick) + } } - } - Key::Enter if !prevented && state == KeyState::Released => { - let maybe_elem = target.downcast::<Element>(); - if let Some(el) = maybe_elem { - if let Some(a) = el.as_maybe_activatable() { - a.implicit_submission(ctrl, alt, shift, meta); + Key::Enter if state == KeyState::Released => { + let maybe_elem = target.downcast::<Element>(); + if let Some(el) = maybe_elem { + if let Some(a) = el.as_maybe_activatable() { + a.implicit_submission(ctrl, alt, shift, meta); + } } } + _ => (), } - _ => (), } self.window.reflow(ReflowGoal::ForDisplay, diff --git a/components/script/dom/htmlinputelement.rs b/components/script/dom/htmlinputelement.rs index eb344ef0a79..8784c1f39df 100755 --- a/components/script/dom/htmlinputelement.rs +++ b/components/script/dom/htmlinputelement.rs @@ -1117,11 +1117,11 @@ impl VirtualMethods for HTMLInputElement { } self.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage); - event.PreventDefault(); + event.mark_as_handled(); } RedrawSelection => { self.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage); - event.PreventDefault(); + event.mark_as_handled(); } Nothing => (), } diff --git a/components/script/dom/htmltextareaelement.rs b/components/script/dom/htmltextareaelement.rs index fd5b42fa25c..74db028859a 100755 --- a/components/script/dom/htmltextareaelement.rs +++ b/components/script/dom/htmltextareaelement.rs @@ -415,11 +415,11 @@ impl VirtualMethods for HTMLTextAreaElement { } self.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage); - event.PreventDefault(); + event.mark_as_handled(); } KeyReaction::RedrawSelection => { self.upcast::<Node>().dirty(NodeDamage::OtherNodeDamage); - event.PreventDefault(); + event.mark_as_handled(); } KeyReaction::Nothing => (), } |