diff --git a/components/script/dom/webidls/XRFrame.webidl b/components/script/dom/webidls/XRFrame.webidl index 24f714fcb76..4a8159177d8 100644 --- a/components/script/dom/webidls/XRFrame.webidl +++ b/components/script/dom/webidls/XRFrame.webidl @@ -8,6 +8,6 @@ interface XRFrame { readonly attribute XRSession session; - XRViewerPose? getViewerPose(XRReferenceSpace referenceSpace); + [Throws] XRViewerPose? getViewerPose(XRReferenceSpace referenceSpace); // XRInputPose? getInputPose(XRInputSource inputSource, optional XRReferenceSpace referenceSpace); }; diff --git a/components/script/dom/xrframe.rs b/components/script/dom/xrframe.rs index c9bb240a3bf..a3a8c201255 100644 --- a/components/script/dom/xrframe.rs +++ b/components/script/dom/xrframe.rs @@ -4,6 +4,8 @@ use crate::dom::bindings::codegen::Bindings::XRFrameBinding; use crate::dom::bindings::codegen::Bindings::XRFrameBinding::XRFrameMethods; +use crate::dom::bindings::error::Error; +use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::globalscope::GlobalScope; @@ -50,13 +52,19 @@ impl XRFrameMethods for XRFrame { } /// https://immersive-web.github.io/webxr/#dom-xrframe-getviewerpose - fn GetViewerPose(&self, reference: &XRReferenceSpace) -> Option> { + fn GetViewerPose( + &self, + reference: &XRReferenceSpace, + ) -> Result>, Error> { + if self.session != reference.upcast::().session() { + return Err(Error::InvalidState); + } let pose = reference.get_viewer_pose(&self.data); - Some(XRViewerPose::new( + Ok(Some(XRViewerPose::new( &self.global(), &self.session, pose, &self.data, - )) + ))) } } diff --git a/components/script/dom/xrspace.rs b/components/script/dom/xrspace.rs index d9b5a1fc983..d9bbad8cd86 100644 --- a/components/script/dom/xrspace.rs +++ b/components/script/dom/xrspace.rs @@ -44,7 +44,6 @@ impl XRSpace { /// The reference origin used is common between all /// get_pose calls for spaces from the same device, so this can be used to compare /// with other spaces - #[allow(unused)] pub fn get_pose(&self, base_pose: &WebVRFrameData) -> RigidTransform3D { if let Some(reference) = self.downcast::() { reference.get_pose(base_pose) @@ -65,4 +64,8 @@ impl XRSpace { ); RigidTransform3D::new(rotation, translation) } + + pub fn session(&self) -> &XRSession { + &self.session + } }