From 3faed9b9212fee1f0ff9be5f7cfb5e24c5b84b91 Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Sun, 24 Nov 2024 13:01:35 -0500 Subject: Filter out webidl files based on special comments, and feature-gate webxr interfaces. (#34348) * Filter out webidl files based on skip-if directives. Signed-off-by: Josh Matthews * script: Don't build XR functionality without webxr feature. Signed-off-by: Josh Matthews * Fix tidy. Signed-off-by: Josh Matthews * script: Adjust imports for file movement. Signed-off-by: Josh Matthews * Fix clippy. Signed-off-by: Josh Matthews * Formatting. Signed-off-by: Josh Matthews * Clean up webxr module import. Co-authored-by: Samson <16504129+sagudev@users.noreply.github.com> Signed-off-by: Josh Matthews --------- Signed-off-by: Josh Matthews Co-authored-by: Samson <16504129+sagudev@users.noreply.github.com> --- components/script/dom/webxr/xrwebglbinding.rs | 168 ++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 components/script/dom/webxr/xrwebglbinding.rs (limited to 'components/script/dom/webxr/xrwebglbinding.rs') diff --git a/components/script/dom/webxr/xrwebglbinding.rs b/components/script/dom/webxr/xrwebglbinding.rs new file mode 100644 index 00000000000..c2d652bb81d --- /dev/null +++ b/components/script/dom/webxr/xrwebglbinding.rs @@ -0,0 +1,168 @@ +/* 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 dom_struct::dom_struct; +use js::rust::HandleObject; + +use crate::dom::bindings::codegen::Bindings::XRViewBinding::XREye; +use crate::dom::bindings::codegen::Bindings::XRWebGLBindingBinding::XRWebGLBinding_Binding::XRWebGLBindingMethods; +use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContext_Binding::WebGLRenderingContextMethods; +use crate::dom::bindings::codegen::Bindings::XRWebGLBindingBinding::{ + XRCubeLayerInit, XRCylinderLayerInit, XREquirectLayerInit, XRProjectionLayerInit, + XRQuadLayerInit, XRTextureType, +}; +use crate::dom::bindings::codegen::UnionTypes::WebGLRenderingContextOrWebGL2RenderingContext; +use crate::dom::bindings::error::{Error, Fallible}; +use crate::dom::bindings::reflector::{reflect_dom_object_with_proto, Reflector}; +use crate::dom::bindings::root::{Dom, DomRoot}; +use crate::dom::webglrenderingcontext::WebGLRenderingContext; +use crate::dom::window::Window; +use crate::dom::xrcompositionlayer::XRCompositionLayer; +use crate::dom::xrcubelayer::XRCubeLayer; +use crate::dom::xrcylinderlayer::XRCylinderLayer; +use crate::dom::xrequirectlayer::XREquirectLayer; +use crate::dom::xrframe::XRFrame; +use crate::dom::xrprojectionlayer::XRProjectionLayer; +use crate::dom::xrquadlayer::XRQuadLayer; +use crate::dom::xrsession::XRSession; +use crate::dom::xrview::XRView; +use crate::dom::xrwebglsubimage::XRWebGLSubImage; +use crate::script_runtime::CanGc; + +#[dom_struct] +pub struct XRWebGLBinding { + reflector: Reflector, + session: Dom, + context: Dom, +} + +impl XRWebGLBinding { + pub fn new_inherited(session: &XRSession, context: &WebGLRenderingContext) -> XRWebGLBinding { + XRWebGLBinding { + reflector: Reflector::new(), + session: Dom::from_ref(session), + context: Dom::from_ref(context), + } + } + + fn new( + global: &Window, + proto: Option, + session: &XRSession, + context: &WebGLRenderingContext, + can_gc: CanGc, + ) -> DomRoot { + reflect_dom_object_with_proto( + Box::new(XRWebGLBinding::new_inherited(session, context)), + global, + proto, + can_gc, + ) + } +} + +impl XRWebGLBindingMethods for XRWebGLBinding { + /// + fn Constructor( + global: &Window, + proto: Option, + can_gc: CanGc, + session: &XRSession, + context: WebGLRenderingContextOrWebGL2RenderingContext, + ) -> Fallible> { + let context = match context { + WebGLRenderingContextOrWebGL2RenderingContext::WebGLRenderingContext(ctx) => ctx, + WebGLRenderingContextOrWebGL2RenderingContext::WebGL2RenderingContext(ctx) => { + ctx.base_context() + }, + }; + // Step 2 + if session.is_ended() { + return Err(Error::InvalidState); + } + + // step 3 + if context.IsContextLost() { + return Err(Error::InvalidState); + } + + // Step 4 + if !session.is_immersive() { + return Err(Error::InvalidState); + }; + + // Step 5 throw an InvalidStateError If context’s XR compatible boolean is false. + + Ok(XRWebGLBinding::new( + global, proto, session, &context, can_gc, + )) + } + + /// + fn CreateProjectionLayer( + &self, + _: XRTextureType, + _: &XRProjectionLayerInit, + ) -> Fallible> { + // https://github.com/servo/servo/issues/27468 + Err(Error::NotSupported) + } + + /// + fn CreateQuadLayer( + &self, + _: XRTextureType, + _: &Option, + ) -> Fallible> { + // https://github.com/servo/servo/issues/27493 + Err(Error::NotSupported) + } + + /// + fn CreateCylinderLayer( + &self, + _: XRTextureType, + _: &Option, + ) -> Fallible> { + // https://github.com/servo/servo/issues/27493 + Err(Error::NotSupported) + } + + /// + fn CreateEquirectLayer( + &self, + _: XRTextureType, + _: &Option, + ) -> Fallible> { + // https://github.com/servo/servo/issues/27493 + Err(Error::NotSupported) + } + + /// + fn CreateCubeLayer(&self, _: &Option) -> Fallible> { + // https://github.com/servo/servo/issues/27493 + Err(Error::NotSupported) + } + + /// + fn GetSubImage( + &self, + _: &XRCompositionLayer, + _: &XRFrame, + _: XREye, + ) -> Fallible> { + // https://github.com/servo/servo/issues/27468 + Err(Error::NotSupported) + } + + /// + fn GetViewSubImage( + &self, + _: &XRProjectionLayer, + _: &XRView, + ) -> Fallible> { + // https://github.com/servo/servo/issues/27468 + Err(Error::NotSupported) + } +} -- cgit v1.2.3