diff options
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/fakexrinputcontroller.rs | 27 | ||||
-rw-r--r-- | components/script/dom/webidls/FakeXRInputController.webidl | 4 | ||||
-rw-r--r-- | components/script/dom/xrinputsourcearray.rs | 31 | ||||
-rw-r--r-- | components/script/dom/xrinputsourceschangeevent.rs | 2 | ||||
-rw-r--r-- | components/script/dom/xrsession.rs | 3 |
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); + }, } } |