aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/fakexrinputcontroller.rs27
-rw-r--r--components/script/dom/webidls/FakeXRInputController.webidl4
-rw-r--r--components/script/dom/xrinputsourcearray.rs31
-rw-r--r--components/script/dom/xrinputsourceschangeevent.rs2
-rw-r--r--components/script/dom/xrsession.rs3
5 files changed, 63 insertions, 4 deletions
diff --git a/components/script/dom/fakexrinputcontroller.rs b/components/script/dom/fakexrinputcontroller.rs
index 67e6f72cf70..7c145a3ed20 100644
--- a/components/script/dom/fakexrinputcontroller.rs
+++ b/components/script/dom/fakexrinputcontroller.rs
@@ -6,6 +6,9 @@ use crate::dom::bindings::codegen::Bindings::FakeXRDeviceBinding::FakeXRRigidTra
use crate::dom::bindings::codegen::Bindings::FakeXRInputControllerBinding::{
self, FakeXRInputControllerMethods,
};
+use crate::dom::bindings::codegen::Bindings::XRInputSourceBinding::{
+ XRHandedness, XRTargetRayMode,
+};
use crate::dom::bindings::error::Fallible;
use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
use crate::dom::bindings::root::DomRoot;
@@ -13,7 +16,9 @@ use crate::dom::fakexrdevice::get_origin;
use crate::dom::globalscope::GlobalScope;
use dom_struct::dom_struct;
use ipc_channel::ipc::IpcSender;
-use webxr_api::{InputId, MockDeviceMsg, MockInputMsg, SelectEvent, SelectKind};
+use webxr_api::{
+ Handedness, InputId, MockDeviceMsg, MockInputMsg, SelectEvent, SelectKind, TargetRayMode,
+};
#[dom_struct]
pub struct FakeXRInputController {
@@ -103,4 +108,24 @@ impl FakeXRInputControllerMethods for FakeXRInputController {
SelectEvent::Select,
))
}
+
+ /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-sethandedness
+ fn SetHandedness(&self, handedness: XRHandedness) {
+ let h = match handedness {
+ XRHandedness::None => Handedness::None,
+ XRHandedness::Left => Handedness::Left,
+ XRHandedness::Right => Handedness::Right,
+ };
+ let _ = self.send_message(MockInputMsg::SetHandedness(h));
+ }
+
+ /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-settargetraymode
+ fn SetTargetRayMode(&self, target_ray_mode: XRTargetRayMode) {
+ let t = match target_ray_mode {
+ XRTargetRayMode::Gaze => TargetRayMode::Gaze,
+ XRTargetRayMode::Tracked_pointer => TargetRayMode::TrackedPointer,
+ XRTargetRayMode::Screen => TargetRayMode::Screen,
+ };
+ let _ = self.send_message(MockInputMsg::SetTargetRayMode(t));
+ }
}
diff --git a/components/script/dom/webidls/FakeXRInputController.webidl b/components/script/dom/webidls/FakeXRInputController.webidl
index a50950cdee3..164012f3d83 100644
--- a/components/script/dom/webidls/FakeXRInputController.webidl
+++ b/components/script/dom/webidls/FakeXRInputController.webidl
@@ -6,8 +6,8 @@
[Exposed=Window, Pref="dom.webxr.test"]
interface FakeXRInputController {
- // void setHandedness(XRHandedness handedness);
- // void setTargetRayMode(XRTargetRayMode targetRayMode);
+ void setHandedness(XRHandedness handedness);
+ void setTargetRayMode(XRTargetRayMode targetRayMode);
// void setProfiles(sequence<DOMString> profiles);
[Throws] void setGripOrigin(FakeXRRigidTransformInit gripOrigin, optional boolean emulatedPosition = false);
void clearGripOrigin();
diff --git a/components/script/dom/xrinputsourcearray.rs b/components/script/dom/xrinputsourcearray.rs
index 45e0f2851e4..66e4045e44a 100644
--- a/components/script/dom/xrinputsourcearray.rs
+++ b/components/script/dom/xrinputsourcearray.rs
@@ -101,6 +101,37 @@ impl XRInputSourceArray {
event.upcast::<Event>().fire(session.upcast());
}
+ pub fn add_remove_input_source(&self, session: &XRSession, id: InputId, info: InputSource) {
+ let mut input_sources = self.input_sources.borrow_mut();
+ let global = self.global();
+ let root;
+ let removed = if let Some(i) = input_sources.iter().find(|i| i.id() == id) {
+ root = [DomRoot::from_ref(&**i)];
+ &root as &[_]
+ } else {
+ warn!("Could not find removed input source with id {:?}", id);
+ &[]
+ };
+ input_sources.retain(|i| i.id() != id);
+ let input = XRInputSource::new(&global, &session, info);
+ input_sources.push(Dom::from_ref(&input));
+
+ let added = [input];
+
+ let event = XRInputSourcesChangeEvent::new(
+ &global,
+ atom!("inputsourceschange"),
+ false,
+ true,
+ session,
+ &added,
+ removed,
+ );
+ // release the refcell guard
+ drop(input_sources);
+ event.upcast::<Event>().fire(session.upcast());
+ }
+
pub fn find(&self, id: InputId) -> Option<DomRoot<XRInputSource>> {
self.input_sources
.borrow()
diff --git a/components/script/dom/xrinputsourceschangeevent.rs b/components/script/dom/xrinputsourceschangeevent.rs
index 3b68a3b8d2a..b3275cd800c 100644
--- a/components/script/dom/xrinputsourceschangeevent.rs
+++ b/components/script/dom/xrinputsourceschangeevent.rs
@@ -71,7 +71,7 @@ impl XRInputSourcesChangeEvent {
changeevent.added.set(added_val.get());
rooted!(in(*cx) let mut removed_val = UndefinedValue());
removed.to_jsval(*cx, removed_val.handle_mut());
- changeevent.added.set(removed_val.get());
+ changeevent.removed.set(removed_val.get());
}
changeevent
diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs
index 4979835fc42..e822a69eb8e 100644
--- a/components/script/dom/xrsession.rs
+++ b/components/script/dom/xrsession.rs
@@ -295,6 +295,9 @@ impl XRSession {
XREvent::RemoveInput(id) => {
self.input_sources.remove_input_source(self, id);
},
+ XREvent::UpdateInput(id, source) => {
+ self.input_sources.add_remove_input_source(self, id, source);
+ },
}
}