diff options
Diffstat (limited to 'components/script/dom/xrsession.rs')
-rw-r--r-- | components/script/dom/xrsession.rs | 50 |
1 files changed, 28 insertions, 22 deletions
diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index 841b0110d4d..e6ca700d0e7 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -17,7 +17,7 @@ use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XREnvironmentBlen use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRFrameRequestCallback; use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRSessionMethods; use crate::dom::bindings::codegen::Bindings::XRWebGLLayerBinding::XRWebGLLayerMethods; -use crate::dom::bindings::error::Error; +use crate::dom::bindings::error::{Error, ErrorResult}; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::num::Finite; use crate::dom::bindings::refcounted::Trusted; @@ -31,7 +31,6 @@ use crate::dom::node::NodeDamage; use crate::dom::promise::Promise; use crate::dom::xrframe::XRFrame; use crate::dom::xrinputsource::XRInputSource; -use crate::dom::xrlayer::XRLayer; use crate::dom::xrreferencespace::XRReferenceSpace; use crate::dom::xrrenderstate::XRRenderState; use crate::dom::xrsessionevent::XRSessionEvent; @@ -51,7 +50,7 @@ use webxr_api::{self, Event as XREvent, Frame, Session}; #[dom_struct] pub struct XRSession { eventtarget: EventTarget, - base_layer: MutNullableDom<XRLayer>, + base_layer: MutNullableDom<XRWebGLLayer>, blend_mode: XREnvironmentBlendMode, viewer_space: MutNullableDom<XRSpace>, #[ignore_malloc_size_of = "defined in webxr"] @@ -120,6 +119,10 @@ impl XRSession { with(&session) } + pub fn is_ended(&self) -> bool { + self.ended.get() + } + fn attach_event_handler(&self) { #[derive(serde::Serialize, serde::Deserialize)] pub struct EventCallback { @@ -195,13 +198,9 @@ impl XRSession { let layer = pending.GetBaseLayer(); if let Some(layer) = layer { let mut session = self.session.borrow_mut(); - if let Some(layer) = layer.downcast::<XRWebGLLayer>() { - session.update_webgl_external_image_api( - layer.Context().webgl_sender().webxr_external_image_api(), - ); - } else { - error!("updateRenderState() called with unknown layer type") - } + session.update_webgl_external_image_api( + layer.Context().webgl_sender().webxr_external_image_api(), + ); } } @@ -233,13 +232,11 @@ impl XRSession { // If the canvas element is attached to the DOM, it is now dirty, // and we need to trigger a reflow. - if let Some(webgl_layer) = base_layer.downcast::<XRWebGLLayer>() { - webgl_layer - .Context() - .Canvas() - .upcast::<Node>() - .dirty(NodeDamage::OtherNodeDamage); - } + base_layer + .Context() + .Canvas() + .upcast::<Node>() + .dirty(NodeDamage::OtherNodeDamage); } } @@ -258,11 +255,19 @@ impl XRSessionMethods for XRSession { } /// https://immersive-web.github.io/webxr/#dom-xrsession-updaterenderstate - fn UpdateRenderState(&self, init: &XRRenderStateInit, _: InCompartment) { - // XXXManishearth various checks: - // If session’s ended value is true, throw an InvalidStateError and abort these steps - // If newState’s baseLayer's was created with an XRSession other than session, - // throw an InvalidStateError and abort these steps + fn UpdateRenderState(&self, init: &XRRenderStateInit, _: InCompartment) -> ErrorResult { + // Step 2 + if self.ended.get() { + return Err(Error::InvalidState); + } + // Step 3: + if let Some(ref layer) = init.baseLayer { + if Dom::from_ref(layer.session()) != Dom::from_ref(self) { + return Err(Error::InvalidState); + } + } + + // XXXManishearth step 4: // If newState’s inlineVerticalFieldOfView is set and session is an // immersive session, throw an InvalidStateError and abort these steps. @@ -279,6 +284,7 @@ impl XRSessionMethods for XRSession { pending.set_layer(Some(&layer)) } // XXXManishearth handle inlineVerticalFieldOfView + Ok(()) } /// https://immersive-web.github.io/webxr/#dom-xrsession-requestanimationframe |