diff options
author | Manish Goregaokar <manishsmail@gmail.com> | 2019-07-19 19:10:20 -0700 |
---|---|---|
committer | Manish Goregaokar <manishsmail@gmail.com> | 2019-07-22 09:32:01 -0700 |
commit | b0002a003d3222b01d20f781cf9ca28a01bda22f (patch) | |
tree | 317a5e59885b88e2efb495947876a9b8a39d8d25 /components/script | |
parent | b66cbd364a2352a15f772355cc0d978c8ddda908 (diff) | |
download | servo-b0002a003d3222b01d20f781cf9ca28a01bda22f.tar.gz servo-b0002a003d3222b01d20f781cf9ca28a01bda22f.zip |
Make use of ended flag, get rid of XRLayer
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/mod.rs | 1 | ||||
-rw-r--r-- | components/script/dom/webidls/XRLayer.webidl | 8 | ||||
-rw-r--r-- | components/script/dom/webidls/XRRenderState.webidl | 4 | ||||
-rw-r--r-- | components/script/dom/webidls/XRSession.webidl | 2 | ||||
-rw-r--r-- | components/script/dom/webidls/XRWebGLLayer.webidl | 2 | ||||
-rw-r--r-- | components/script/dom/xrlayer.rs | 19 | ||||
-rw-r--r-- | components/script/dom/xrrenderstate.rs | 12 | ||||
-rw-r--r-- | components/script/dom/xrsession.rs | 50 | ||||
-rw-r--r-- | components/script/dom/xrwebgllayer.rs | 18 |
9 files changed, 52 insertions, 64 deletions
diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs index 60701755ec8..b1f001b1322 100644 --- a/components/script/dom/mod.rs +++ b/components/script/dom/mod.rs @@ -546,7 +546,6 @@ pub mod xmlserializer; pub mod xr; pub mod xrframe; pub mod xrinputsource; -pub mod xrlayer; pub mod xrpose; pub mod xrreferencespace; pub mod xrrenderstate; diff --git a/components/script/dom/webidls/XRLayer.webidl b/components/script/dom/webidls/XRLayer.webidl deleted file mode 100644 index 69c65da6143..00000000000 --- a/components/script/dom/webidls/XRLayer.webidl +++ /dev/null @@ -1,8 +0,0 @@ -/* 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/. */ - -// https://immersive-web.github.io/webxr/#xrlayer-interface - -[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] -interface XRLayer {}; diff --git a/components/script/dom/webidls/XRRenderState.webidl b/components/script/dom/webidls/XRRenderState.webidl index 195d5acf3ac..01d7fd39191 100644 --- a/components/script/dom/webidls/XRRenderState.webidl +++ b/components/script/dom/webidls/XRRenderState.webidl @@ -7,11 +7,11 @@ dictionary XRRenderStateInit { double depthNear; double depthFar; - XRLayer baseLayer; + XRWebGLLayer baseLayer; }; [SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] interface XRRenderState { readonly attribute double depthNear; readonly attribute double depthFar; - readonly attribute XRLayer? baseLayer; + readonly attribute XRWebGLLayer? baseLayer; }; diff --git a/components/script/dom/webidls/XRSession.webidl b/components/script/dom/webidls/XRSession.webidl index 105a4b374ff..6d946ccef55 100644 --- a/components/script/dom/webidls/XRSession.webidl +++ b/components/script/dom/webidls/XRSession.webidl @@ -29,7 +29,7 @@ interface XRSession : EventTarget { // FrozenArray<XRInputSource> getInputSources(); sequence<XRInputSource> getInputSources(); - void updateRenderState(optional XRRenderStateInit state = {}); + [Throws] void updateRenderState(optional XRRenderStateInit state = {}); long requestAnimationFrame(XRFrameRequestCallback callback); void cancelAnimationFrame(long handle); diff --git a/components/script/dom/webidls/XRWebGLLayer.webidl b/components/script/dom/webidls/XRWebGLLayer.webidl index f83e1e4c35a..769b3e9b567 100644 --- a/components/script/dom/webidls/XRWebGLLayer.webidl +++ b/components/script/dom/webidls/XRWebGLLayer.webidl @@ -21,7 +21,7 @@ dictionary XRWebGLLayerInit { XRWebGLRenderingContext context, optional XRWebGLLayerInit layerInit = {}), Pref="dom.webxr.enabled"] -interface XRWebGLLayer : XRLayer { +interface XRWebGLLayer { // // Attributes readonly attribute XRWebGLRenderingContext context; diff --git a/components/script/dom/xrlayer.rs b/components/script/dom/xrlayer.rs deleted file mode 100644 index d17704be28f..00000000000 --- a/components/script/dom/xrlayer.rs +++ /dev/null @@ -1,19 +0,0 @@ -/* 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::reflector::Reflector; -use dom_struct::dom_struct; - -#[dom_struct] -pub struct XRLayer { - reflector_: Reflector, -} - -impl XRLayer { - pub fn new_inherited() -> XRLayer { - XRLayer { - reflector_: Reflector::new(), - } - } -} diff --git a/components/script/dom/xrrenderstate.rs b/components/script/dom/xrrenderstate.rs index 824b7a6d37a..2aba4e46493 100644 --- a/components/script/dom/xrrenderstate.rs +++ b/components/script/dom/xrrenderstate.rs @@ -7,7 +7,7 @@ use crate::dom::bindings::num::Finite; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; use crate::dom::bindings::root::{DomRoot, MutNullableDom}; use crate::dom::globalscope::GlobalScope; -use crate::dom::xrlayer::XRLayer; +use crate::dom::xrwebgllayer::XRWebGLLayer; use dom_struct::dom_struct; use std::cell::Cell; @@ -17,14 +17,14 @@ pub struct XRRenderState { reflector_: Reflector, depth_near: Cell<f64>, depth_far: Cell<f64>, - layer: MutNullableDom<XRLayer>, + layer: MutNullableDom<XRWebGLLayer>, } impl XRRenderState { pub fn new_inherited( depth_near: f64, depth_far: f64, - layer: Option<&XRLayer>, + layer: Option<&XRWebGLLayer>, ) -> XRRenderState { XRRenderState { reflector_: Reflector::new(), @@ -38,7 +38,7 @@ impl XRRenderState { global: &GlobalScope, depth_near: f64, depth_far: f64, - layer: Option<&XRLayer>, + layer: Option<&XRWebGLLayer>, ) -> DomRoot<XRRenderState> { reflect_dom_object( Box::new(XRRenderState::new_inherited(depth_near, depth_far, layer)), @@ -62,7 +62,7 @@ impl XRRenderState { pub fn set_depth_far(&self, depth: f64) { self.depth_far.set(depth) } - pub fn set_layer(&self, layer: Option<&XRLayer>) { + pub fn set_layer(&self, layer: Option<&XRWebGLLayer>) { self.layer.set(layer) } } @@ -79,7 +79,7 @@ impl XRRenderStateMethods for XRRenderState { } /// https://immersive-web.github.io/webxr/#dom-xrrenderstate-baselayer - fn GetBaseLayer(&self) -> Option<DomRoot<XRLayer>> { + fn GetBaseLayer(&self) -> Option<DomRoot<XRWebGLLayer>> { self.layer.get() } } 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 diff --git a/components/script/dom/xrwebgllayer.rs b/components/script/dom/xrwebgllayer.rs index a2a7c93f37c..a5f06df0e52 100644 --- a/components/script/dom/xrwebgllayer.rs +++ b/components/script/dom/xrwebgllayer.rs @@ -10,14 +10,13 @@ use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGL use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; use crate::dom::bindings::error::Error; use crate::dom::bindings::error::Fallible; -use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; +use crate::dom::bindings::reflector::{reflect_dom_object, Reflector, DomObject}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::globalscope::GlobalScope; use crate::dom::webgl_validations::types::TexImageTarget; use crate::dom::webglframebuffer::WebGLFramebuffer; use crate::dom::webglrenderingcontext::WebGLRenderingContext; use crate::dom::window::Window; -use crate::dom::xrlayer::XRLayer; use crate::dom::xrsession::XRSession; use crate::dom::xrview::XRView; use crate::dom::xrviewport::XRViewport; @@ -28,7 +27,7 @@ use webxr_api::Views; #[dom_struct] pub struct XRWebGLLayer { - xrlayer: XRLayer, + reflector_: Reflector, antialias: bool, depth: bool, stencil: bool, @@ -46,7 +45,7 @@ impl XRWebGLLayer { framebuffer: &WebGLFramebuffer, ) -> XRWebGLLayer { XRWebGLLayer { - xrlayer: XRLayer::new_inherited(), + reflector_: Reflector::new(), antialias: init.antialias, depth: init.depth, stencil: init.stencil, @@ -83,6 +82,13 @@ impl XRWebGLLayer { context: &WebGLRenderingContext, init: &XRWebGLLayerInit, ) -> Fallible<DomRoot<Self>> { + // Step 2 + if session.is_ended() { + return Err(Error::InvalidState); + } + // XXXManishearth step 3: throw error if context is lost + // XXXManishearth step 4: check XR compat flag for immersive sessions + let cx = global.get_cx(); let old_fbo = context.bound_framebuffer(); let old_texture = context @@ -139,6 +145,10 @@ impl XRWebGLLayer { &framebuffer, )) } + + pub fn session(&self) -> &XRSession { + &self.session + } } impl XRWebGLLayerMethods for XRWebGLLayer { |