diff --git a/Cargo.lock b/Cargo.lock index 03c85bbb277..d9169776682 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5927,7 +5927,7 @@ dependencies = [ [[package]] name = "webxr" version = "0.0.1" -source = "git+https://github.com/servo/webxr#ec49fdd1c1a7e45a2dfde2f4a7f07e9581f386ef" +source = "git+https://github.com/servo/webxr#61344bc5d92bc218458063baa7bc5d2d388aa7f5" dependencies = [ "bindgen", "euclid", @@ -5945,7 +5945,7 @@ dependencies = [ [[package]] name = "webxr-api" version = "0.0.1" -source = "git+https://github.com/servo/webxr#ec49fdd1c1a7e45a2dfde2f4a7f07e9581f386ef" +source = "git+https://github.com/servo/webxr#61344bc5d92bc218458063baa7bc5d2d388aa7f5" dependencies = [ "euclid", "gleam 0.6.18", diff --git a/components/atoms/static_atoms.txt b/components/atoms/static_atoms.txt index c6873dfc171..43b1dbe169a 100644 --- a/components/atoms/static_atoms.txt +++ b/components/atoms/static_atoms.txt @@ -123,6 +123,7 @@ transitionend unhandledrejection unload url +visibilitychange volumechange waiting webglcontextcreationerror diff --git a/components/script/dom/webidls/XRSession.webidl b/components/script/dom/webidls/XRSession.webidl index 82d3338858f..be8fb36e7bf 100644 --- a/components/script/dom/webidls/XRSession.webidl +++ b/components/script/dom/webidls/XRSession.webidl @@ -10,15 +10,20 @@ enum XREnvironmentBlendMode { "alpha-blend", }; +enum XRVisibilityState { + "visible", + "visible-blurred", + "hidden", +}; + callback XRFrameRequestCallback = void (DOMHighResTimeStamp time, XRFrame frame); [SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] interface XRSession : EventTarget { // // Attributes - readonly attribute XRSessionMode mode; readonly attribute XREnvironmentBlendMode environmentBlendMode; - // readonly attribute XRVisibilityState visibilityState; + readonly attribute XRVisibilityState visibilityState; [SameObject] readonly attribute XRRenderState renderState; [SameObject] readonly attribute XRInputSourceArray inputSources; @@ -37,5 +42,5 @@ interface XRSession : EventTarget { // attribute EventHandler oninputsourceschange; attribute EventHandler onselectstart; attribute EventHandler onselectend; - // attribute EventHandler onvisibilitychange; + attribute EventHandler onvisibilitychange; }; diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index d0511c6204d..3451bb55467 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -9,7 +9,6 @@ use crate::dom::bindings::codegen::Bindings::NavigatorBinding::NavigatorBinding: use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextMethods; use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowBinding::WindowMethods; -use crate::dom::bindings::codegen::Bindings::XRBinding::XRSessionMode; use crate::dom::bindings::codegen::Bindings::XRReferenceSpaceBinding::XRReferenceSpaceType; use crate::dom::bindings::codegen::Bindings::XRRenderStateBinding::XRRenderStateInit; use crate::dom::bindings::codegen::Bindings::XRRenderStateBinding::XRRenderStateMethods; @@ -17,6 +16,7 @@ use crate::dom::bindings::codegen::Bindings::XRSessionBinding; use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XREnvironmentBlendMode; use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRFrameRequestCallback; use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRSessionMethods; +use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRVisibilityState; use crate::dom::bindings::codegen::Bindings::XRWebGLLayerBinding::XRWebGLLayerMethods; use crate::dom::bindings::error::{Error, ErrorResult}; use crate::dom::bindings::inheritance::Castable; @@ -49,13 +49,16 @@ use profile_traits::ipc; use std::cell::Cell; use std::mem; use std::rc::Rc; -use webxr_api::{self, Event as XREvent, Frame, SelectEvent, Session}; +use webxr_api::{ + self, EnvironmentBlendMode, Event as XREvent, Frame, SelectEvent, Session, Visibility, +}; #[dom_struct] pub struct XRSession { eventtarget: EventTarget, base_layer: MutNullableDom, blend_mode: XREnvironmentBlendMode, + visibility_state: Cell, viewer_space: MutNullableDom, #[ignore_malloc_size_of = "defined in webxr"] session: DomRefCell, @@ -85,8 +88,8 @@ impl XRSession { XRSession { eventtarget: EventTarget::new_inherited(), base_layer: Default::default(), - // we don't yet support any AR devices - blend_mode: XREnvironmentBlendMode::Opaque, + blend_mode: session.environment_blend_mode().into(), + visibility_state: Cell::new(XRVisibilityState::Visible), viewer_space: Default::default(), session: DomRefCell::new(session), frame_requested: Cell::new(false), @@ -213,6 +216,22 @@ impl XRSession { frame.set_active(false); } }, + XREvent::VisibilityChange(v) => { + let v = match v { + Visibility::Visible => XRVisibilityState::Visible, + Visibility::VisibleBlurred => XRVisibilityState::Visible_blurred, + Visibility::Hidden => XRVisibilityState::Hidden, + }; + self.visibility_state.set(v); + let event = XRSessionEvent::new( + &self.global(), + atom!("visibilitychange"), + false, + false, + self, + ); + event.upcast::().fire(self.upcast()); + }, _ => (), // XXXManishearth TBD } } @@ -296,10 +315,12 @@ impl XRSessionMethods for XRSession { /// https://immersive-web.github.io/webxr/#eventdef-xrsession-selectend event_handler!(selectend, GetOnselectend, SetOnselectend); - /// https://immersive-web.github.io/webxr/#dom-xrsession-mode - fn Mode(&self) -> XRSessionMode { - XRSessionMode::Immersive_vr - } + /// https://immersive-web.github.io/webxr/#eventdef-xrsession-visibilitychange + event_handler!( + visibilitychange, + GetOnvisibilitychange, + SetOnvisibilitychange + ); // https://immersive-web.github.io/webxr/#dom-xrsession-renderstate fn RenderState(&self) -> DomRoot { @@ -412,6 +433,11 @@ impl XRSessionMethods for XRSession { self.blend_mode } + /// https://immersive-web.github.io/webxr/#dom-xrsession-visibilitystate + fn VisibilityState(&self) -> XRVisibilityState { + self.visibility_state.get() + } + /// https://immersive-web.github.io/webxr/#dom-xrsession-requestreferencespace fn RequestReferenceSpace(&self, ty: XRReferenceSpaceType, comp: InCompartment) -> Rc { let p = Promise::new_in_current_compartment(&self.global(), comp); @@ -469,3 +495,13 @@ pub fn cast_transform( ) -> RigidTransform3D { unsafe { mem::transmute(transform) } } + +impl From for XREnvironmentBlendMode { + fn from(x: EnvironmentBlendMode) -> Self { + match x { + EnvironmentBlendMode::Opaque => XREnvironmentBlendMode::Opaque, + EnvironmentBlendMode::AlphaBlend => XREnvironmentBlendMode::Alpha_blend, + EnvironmentBlendMode::Additive => XREnvironmentBlendMode::Additive, + } + } +} diff --git a/tests/wpt/metadata/webxr/idlharness.https.window.js.ini b/tests/wpt/metadata/webxr/idlharness.https.window.js.ini index e4a6da7c96e..a48d48dd278 100644 --- a/tests/wpt/metadata/webxr/idlharness.https.window.js.ini +++ b/tests/wpt/metadata/webxr/idlharness.https.window.js.ini @@ -14,9 +14,6 @@ [XR interface: calling supportsSession(XRSessionMode) on navigator.xr with too few arguments must throw TypeError] expected: FAIL - [XRSession interface: attribute onvisibilitychange] - expected: FAIL - [XRInputSourcesChangeEvent interface object length] expected: FAIL @@ -143,9 +140,6 @@ [XRBoundedReferenceSpace interface object name] expected: FAIL - [XRSession interface: attribute visibilityState] - expected: FAIL - [XRWebGLLayer interface: attribute ignoreDepthValues] expected: FAIL