diff --git a/components/script/dom/webidls/XRFrame.webidl b/components/script/dom/webidls/XRFrame.webidl index 6c40306755d..24f714fcb76 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(optional XRReferenceSpace referenceSpace); + 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 fc2aaa26091..b569f7d9e46 100644 --- a/components/script/dom/xrframe.rs +++ b/components/script/dom/xrframe.rs @@ -5,11 +5,13 @@ use crate::dom::bindings::codegen::Bindings::XRFrameBinding; use crate::dom::bindings::codegen::Bindings::XRFrameBinding::XRFrameMethods; use crate::dom::bindings::codegen::Bindings::XRViewBinding::XREye; +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; use crate::dom::xrreferencespace::XRReferenceSpace; use crate::dom::xrsession::XRSession; +use crate::dom::xrstationaryreferencespace::XRStationaryReferenceSpace; use crate::dom::xrview::XRView; use crate::dom::xrviewerpose::XRViewerPose; use dom_struct::dom_struct; @@ -52,17 +54,17 @@ impl XRFrameMethods for XRFrame { } /// https://immersive-web.github.io/webxr/#dom-xrframe-getviewerpose - fn GetViewerPose(&self, reference: Option<&XRReferenceSpace>) -> Option> { - // We assume the reference space is eye level for now - // since it's the only one 3DOF devices support - if reference.is_some() { - // it's not possible to obtain a reference - // space at all yet - None - } else { + fn GetViewerPose(&self, reference: &XRReferenceSpace) -> Option> { + if let Some(_) = reference.downcast::() { + // For 3DOF devices all three kinds of reference spaces are identical + // FIXME(#23070, Manishearth) support originOffset let left = XRView::new(&self.global(), &self.session, XREye::Left, &self.data); let right = XRView::new(&self.global(), &self.session, XREye::Right, &self.data); Some(XRViewerPose::new(&self.global(), &left, &right)) + } else { + // FIXME(#23070, Manishearth) support identity reference spaces + // depends on https://github.com/immersive-web/webxr/issues/565 + None } } } diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index 4c8ac610a78..f756b0e5fa5 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -124,6 +124,9 @@ impl XRSessionMethods for XRSession { // https://immersive-web.github.io/webxr/#create-a-reference-space + // XXXManishearth reject based on session type + // https://github.com/immersive-web/webxr/blob/master/spatial-tracking-explainer.md#practical-usage-guidelines + match options.type_ { XRReferenceSpaceType::Identity => { p.resolve_native(&XRReferenceSpace::identity(