diff options
Diffstat (limited to 'components/script/dom/fakexrinputcontroller.rs')
-rw-r--r-- | components/script/dom/fakexrinputcontroller.rs | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/components/script/dom/fakexrinputcontroller.rs b/components/script/dom/fakexrinputcontroller.rs new file mode 100644 index 00000000000..5699fa5d747 --- /dev/null +++ b/components/script/dom/fakexrinputcontroller.rs @@ -0,0 +1,135 @@ +/* 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::FakeXRDeviceBinding::FakeXRRigidTransformInit; +use crate::dom::bindings::codegen::Bindings::FakeXRInputControllerBinding::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; +use crate::dom::bindings::str::DOMString; +use crate::dom::fakexrdevice::get_origin; +use crate::dom::globalscope::GlobalScope; +use dom_struct::dom_struct; +use ipc_channel::ipc::IpcSender; +use webxr_api::{ + Handedness, InputId, MockDeviceMsg, MockInputMsg, SelectEvent, SelectKind, TargetRayMode, +}; + +#[dom_struct] +pub struct FakeXRInputController { + reflector: Reflector, + #[ignore_malloc_size_of = "defined in ipc-channel"] + sender: IpcSender<MockDeviceMsg>, + #[ignore_malloc_size_of = "defined in webxr-api"] + id: InputId, +} + +impl FakeXRInputController { + pub fn new_inherited(sender: IpcSender<MockDeviceMsg>, id: InputId) -> FakeXRInputController { + FakeXRInputController { + reflector: Reflector::new(), + sender, + id, + } + } + + pub fn new( + global: &GlobalScope, + sender: IpcSender<MockDeviceMsg>, + id: InputId, + ) -> DomRoot<FakeXRInputController> { + reflect_dom_object( + Box::new(FakeXRInputController::new_inherited(sender, id)), + global, + ) + } + + fn send_message(&self, msg: MockInputMsg) { + let _ = self + .sender + .send(MockDeviceMsg::MessageInputSource(self.id, msg)); + } +} + +impl FakeXRInputControllerMethods for FakeXRInputController { + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-setpointerorigin + fn SetPointerOrigin(&self, origin: &FakeXRRigidTransformInit, _emulated: bool) -> Fallible<()> { + self.send_message(MockInputMsg::SetPointerOrigin(Some(get_origin(origin)?))); + Ok(()) + } + + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-setgriporigin + fn SetGripOrigin(&self, origin: &FakeXRRigidTransformInit, _emulated: bool) -> Fallible<()> { + self.send_message(MockInputMsg::SetGripOrigin(Some(get_origin(origin)?))); + Ok(()) + } + + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-cleargriporigin + fn ClearGripOrigin(&self) { + self.send_message(MockInputMsg::SetGripOrigin(None)) + } + + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-disconnect + fn Disconnect(&self) { + self.send_message(MockInputMsg::Disconnect) + } + + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-reconnect + fn Reconnect(&self) { + self.send_message(MockInputMsg::Reconnect) + } + + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-startselection + fn StartSelection(&self) { + self.send_message(MockInputMsg::TriggerSelect( + SelectKind::Select, + SelectEvent::Start, + )) + } + + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-endselection + fn EndSelection(&self) { + self.send_message(MockInputMsg::TriggerSelect( + SelectKind::Select, + SelectEvent::End, + )) + } + + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-simulateselect + fn SimulateSelect(&self) { + self.send_message(MockInputMsg::TriggerSelect( + SelectKind::Select, + 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)); + } + + /// https://immersive-web.github.io/webxr-test-api/#dom-fakexrinputcontroller-setprofiles + fn SetProfiles(&self, profiles: Vec<DOMString>) { + let t = profiles.into_iter().map(String::from).collect(); + let _ = self.send_message(MockInputMsg::SetProfiles(t)); + } +} |