From a90a42012bfcd4393ac447938efadfd5b4583be0 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Wed, 8 Jan 2020 18:14:10 +0530 Subject: [PATCH] Add XRInputSourcesChangeEvent --- components/script/dom/mod.rs | 1 + .../webidls/XRInputSourcesChangeEvent.webidl | 19 +++ .../script/dom/xrinputsourceschangeevent.rs | 116 ++++++++++++++++++ 3 files changed, 136 insertions(+) create mode 100644 components/script/dom/webidls/XRInputSourcesChangeEvent.webidl create mode 100644 components/script/dom/xrinputsourceschangeevent.rs diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs index 014a82e8a734..0fdf4a80b695 100644 --- a/components/script/dom/mod.rs +++ b/components/script/dom/mod.rs @@ -565,6 +565,7 @@ pub mod xrframe; pub mod xrinputsource; pub mod xrinputsourcearray; pub mod xrinputsourceevent; +pub mod xrinputsourceschangeevent; pub mod xrpose; pub mod xrreferencespace; pub mod xrrenderstate; diff --git a/components/script/dom/webidls/XRInputSourcesChangeEvent.webidl b/components/script/dom/webidls/XRInputSourcesChangeEvent.webidl new file mode 100644 index 000000000000..aba56f8b0a67 --- /dev/null +++ b/components/script/dom/webidls/XRInputSourcesChangeEvent.webidl @@ -0,0 +1,19 @@ +/* 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 https://mozilla.org/MPL/2.0/. */ + +// https://immersive-web.github.io/webxr/#xrinputsourceschangedevent-interface + +[SecureContext, Exposed=Window, Pref="dom.webxr.test"] +interface XRInputSourcesChangeEvent : Event { + constructor(DOMString type, XRInputSourcesChangeEventInit eventInitDict); + [SameObject] readonly attribute XRSession session; + /* [SameObject] */ readonly attribute /* FrozenArray */ any added; + /* [SameObject] */ readonly attribute /* FrozenArray */ any removed; +}; + +dictionary XRInputSourcesChangeEventInit : EventInit { + required XRSession session; + required sequence added; + required sequence removed; +}; diff --git a/components/script/dom/xrinputsourceschangeevent.rs b/components/script/dom/xrinputsourceschangeevent.rs new file mode 100644 index 000000000000..f89bdeba9d1b --- /dev/null +++ b/components/script/dom/xrinputsourceschangeevent.rs @@ -0,0 +1,116 @@ +/* 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 https://mozilla.org/MPL/2.0/. */ + +use crate::dom::bindings::codegen::Bindings::EventBinding::EventBinding::EventMethods; +use crate::dom::bindings::codegen::Bindings::XRInputSourcesChangeEventBinding::{ + self, XRInputSourcesChangeEventMethods, +}; +use crate::dom::bindings::inheritance::Castable; +use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::root::{Dom, DomRoot}; +use crate::dom::bindings::str::DOMString; +use crate::dom::event::Event; +use crate::dom::globalscope::GlobalScope; +use crate::dom::window::Window; +use crate::dom::xrinputsource::XRInputSource; +use crate::dom::xrsession::XRSession; +use crate::script_runtime::JSContext; +use dom_struct::dom_struct; +use js::conversions::ToJSValConvertible; +use js::jsapi::Heap; +use js::jsval::{JSVal, UndefinedValue}; +use servo_atoms::Atom; + +#[dom_struct] +pub struct XRInputSourcesChangeEvent { + event: Event, + session: Dom, + #[ignore_malloc_size_of = "mozjs"] + added: Heap, + #[ignore_malloc_size_of = "mozjs"] + removed: Heap, +} + +impl XRInputSourcesChangeEvent { + #[allow(unrooted_must_root)] + fn new_inherited(session: &XRSession) -> XRInputSourcesChangeEvent { + XRInputSourcesChangeEvent { + event: Event::new_inherited(), + session: Dom::from_ref(session), + added: Heap::default(), + removed: Heap::default(), + } + } + + #[allow(unsafe_code)] + pub fn new( + global: &GlobalScope, + type_: Atom, + bubbles: bool, + cancelable: bool, + session: &XRSession, + added: &[DomRoot], + removed: &[DomRoot], + ) -> DomRoot { + let changeevent = reflect_dom_object( + Box::new(XRInputSourcesChangeEvent::new_inherited(session)), + global, + XRInputSourcesChangeEventBinding::Wrap, + ); + { + let event = changeevent.upcast::(); + event.init_event(type_, bubbles, cancelable); + } + + let cx = global.get_cx(); + unsafe { + rooted!(in(*cx) let mut added_val = UndefinedValue()); + rooted!(in(*cx) let mut removed_val = UndefinedValue()); + added.to_jsval(*cx, added_val.handle_mut()); + removed.to_jsval(*cx, removed_val.handle_mut()); + changeevent.added.set(added_val.get()); + changeevent.added.set(removed_val.get()); + } + + changeevent + } + + pub fn Constructor( + window: &Window, + type_: DOMString, + init: &XRInputSourcesChangeEventBinding::XRInputSourcesChangeEventInit, + ) -> DomRoot { + XRInputSourcesChangeEvent::new( + &window.global(), + Atom::from(type_), + init.parent.bubbles, + init.parent.cancelable, + &init.session, + &*init.added, + &*init.removed, + ) + } +} + +impl XRInputSourcesChangeEventMethods for XRInputSourcesChangeEvent { + // https://immersive-web.github.io/webxr/#dom-xrinputsourceschangeevent-session + fn Session(&self) -> DomRoot { + DomRoot::from_ref(&*self.session) + } + + // https://immersive-web.github.io/webxr/#dom-xrinputsourceschangeevent-added + fn Added(&self, _cx: JSContext) -> JSVal { + self.added.get() + } + + // https://immersive-web.github.io/webxr/#dom-xrinputsourceschangeevent-removed + fn Removed(&self, _cx: JSContext) -> JSVal { + self.removed.get() + } + + // https://dom.spec.whatwg.org/#dom-event-istrusted + fn IsTrusted(&self) -> bool { + self.event.IsTrusted() + } +}