aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/atoms/static_atoms.txt2
-rw-r--r--components/script/dom/xrsession.rs49
2 files changed, 50 insertions, 1 deletions
diff --git a/components/atoms/static_atoms.txt b/components/atoms/static_atoms.txt
index c8773667e74..c6873dfc171 100644
--- a/components/atoms/static_atoms.txt
+++ b/components/atoms/static_atoms.txt
@@ -102,6 +102,8 @@ search
seeked
seeking
select
+selectend
+selectstart
serif
signalingstatechange
srclang
diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs
index dacfc373540..42e001a26e8 100644
--- a/components/script/dom/xrsession.rs
+++ b/components/script/dom/xrsession.rs
@@ -33,6 +33,7 @@ use crate::dom::promise::Promise;
use crate::dom::webglframebuffer::WebGLFramebufferAttachmentRoot;
use crate::dom::xrframe::XRFrame;
use crate::dom::xrinputsource::XRInputSource;
+use crate::dom::xrinputsourceevent::XRInputSourceEvent;
use crate::dom::xrreferencespace::XRReferenceSpace;
use crate::dom::xrrenderstate::XRRenderState;
use crate::dom::xrsessionevent::XRSessionEvent;
@@ -48,7 +49,7 @@ use profile_traits::ipc;
use std::cell::Cell;
use std::mem;
use std::rc::Rc;
-use webxr_api::{self, Event as XREvent, Frame, Session};
+use webxr_api::{self, Event as XREvent, Frame, SelectEvent, Session};
#[dom_struct]
pub struct XRSession {
@@ -170,6 +171,52 @@ impl XRSession {
let event = XRSessionEvent::new(&self.global(), atom!("end"), false, false, self);
event.upcast::<Event>().fire(self.upcast());
},
+ XREvent::Select(input, kind, frame) => {
+ // https://immersive-web.github.io/webxr/#primary-action
+ let source = self
+ .input_sources
+ .borrow_mut()
+ .iter()
+ .find(|s| s.id() == input)
+ .map(|x| DomRoot::from_ref(&**x));
+ if let Some(source) = source {
+ let frame = XRFrame::new(&self.global(), self, frame);
+ frame.set_active(true);
+ if kind == SelectEvent::Start {
+ let event = XRInputSourceEvent::new(
+ &self.global(),
+ atom!("selectstart"),
+ false,
+ false,
+ &frame,
+ &source,
+ );
+ event.upcast::<Event>().fire(self.upcast());
+ } else {
+ if kind == SelectEvent::Select {
+ let event = XRInputSourceEvent::new(
+ &self.global(),
+ atom!("select"),
+ false,
+ false,
+ &frame,
+ &source,
+ );
+ event.upcast::<Event>().fire(self.upcast());
+ }
+ let event = XRInputSourceEvent::new(
+ &self.global(),
+ atom!("selectend"),
+ false,
+ false,
+ &frame,
+ &source,
+ );
+ event.upcast::<Event>().fire(self.upcast());
+ }
+ frame.set_active(false);
+ }
+ },
_ => (), // XXXManishearth TBD
}
}