diff options
author | Paul Rouget <me@paulrouget.com> | 2016-02-17 09:34:59 +0100 |
---|---|---|
committer | Paul Rouget <me@paulrouget.com> | 2016-02-18 03:49:31 +0100 |
commit | c7195cb456e766681b9ab3bfffd1b4edb0f5d454 (patch) | |
tree | 8d516b7a9e1cacff1881c84f5abf8c0969690d60 /components/script/dom/focusevent.rs | |
parent | 64ad9e17d9323862833daa60290b037ea8334424 (diff) | |
download | servo-c7195cb456e766681b9ab3bfffd1b4edb0f5d454.tar.gz servo-c7195cb456e766681b9ab3bfffd1b4edb0f5d454.zip |
Implement focus and blur events
Diffstat (limited to 'components/script/dom/focusevent.rs')
-rw-r--r-- | components/script/dom/focusevent.rs | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/components/script/dom/focusevent.rs b/components/script/dom/focusevent.rs new file mode 100644 index 00000000000..5ad61305637 --- /dev/null +++ b/components/script/dom/focusevent.rs @@ -0,0 +1,84 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use dom::bindings::codegen::Bindings::FocusEventBinding; +use dom::bindings::codegen::Bindings::FocusEventBinding::FocusEventMethods; +use dom::bindings::codegen::Bindings::UIEventBinding::UIEventMethods; +use dom::bindings::error::Fallible; +use dom::bindings::global::GlobalRef; +use dom::bindings::inheritance::Castable; +use dom::bindings::js::{JS, MutNullableHeap, Root, RootedReference}; +use dom::bindings::reflector::reflect_dom_object; +use dom::event::{EventBubbles, EventCancelable}; +use dom::eventtarget::EventTarget; +use dom::uievent::UIEvent; +use dom::window::Window; +use std::default::Default; +use util::str::DOMString; + +#[dom_struct] +pub struct FocusEvent { + uievent: UIEvent, + related_target: MutNullableHeap<JS<EventTarget>>, +} + +impl FocusEvent { + fn new_inherited() -> FocusEvent { + FocusEvent { + uievent: UIEvent::new_inherited(), + related_target: Default::default(), + } + } + + pub fn new(window: &Window, + type_: DOMString, + can_bubble: EventBubbles, + cancelable: EventCancelable, + view: Option<&Window>, + detail: i32, + related_target: Option<&EventTarget>) -> Root<FocusEvent> { + let event = box FocusEvent::new_inherited(); + let ev = reflect_dom_object(event, GlobalRef::Window(window), FocusEventBinding::Wrap); + ev.upcast::<UIEvent>().InitUIEvent(type_, + can_bubble == EventBubbles::Bubbles, + cancelable == EventCancelable::Cancelable, + view, detail); + ev.related_target.set(related_target); + ev + } + + pub fn Constructor(global: GlobalRef, + type_: DOMString, + init: &FocusEventBinding::FocusEventInit) -> Fallible<Root<FocusEvent>> { + let bubbles = if init.parent.parent.bubbles { + EventBubbles::Bubbles + } else { + EventBubbles::DoesNotBubble + }; + let cancelable = if init.parent.parent.cancelable { + EventCancelable::Cancelable + } else { + EventCancelable::NotCancelable + }; + let event = FocusEvent::new(global.as_window(), type_, + bubbles, + cancelable, + init.parent.view.r(), + init.parent.detail, + init.relatedTarget.r()); + Ok(event) + } +} + +impl FocusEventMethods for FocusEvent { + // https://w3c.github.io/uievents/#widl-FocusEvent-relatedTarget + fn GetRelatedTarget(&self) -> Option<Root<EventTarget>> { + self.related_target.get() + } + + // https://dom.spec.whatwg.org/#dom-event-istrusted + fn IsTrusted(&self) -> bool { + self.uievent.IsTrusted() + } +} |