aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/focusevent.rs
diff options
context:
space:
mode:
authorPaul Rouget <me@paulrouget.com>2016-02-17 09:34:59 +0100
committerPaul Rouget <me@paulrouget.com>2016-02-18 03:49:31 +0100
commitc7195cb456e766681b9ab3bfffd1b4edb0f5d454 (patch)
tree8d516b7a9e1cacff1881c84f5abf8c0969690d60 /components/script/dom/focusevent.rs
parent64ad9e17d9323862833daa60290b037ea8334424 (diff)
downloadservo-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.rs84
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()
+ }
+}