From 66fea732890bf67b4d7b3502bc71b6b77da63e49 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Fri, 11 Oct 2019 12:42:49 -0700 Subject: [PATCH 1/5] Remove XRSession.mode --- components/script/dom/webidls/XRSession.webidl | 1 - components/script/dom/xrsession.rs | 6 ------ 2 files changed, 7 deletions(-) diff --git a/components/script/dom/webidls/XRSession.webidl b/components/script/dom/webidls/XRSession.webidl index 82d3338858f..1548a68730d 100644 --- a/components/script/dom/webidls/XRSession.webidl +++ b/components/script/dom/webidls/XRSession.webidl @@ -15,7 +15,6 @@ 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; diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index d0511c6204d..35593b10a99 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; @@ -296,11 +295,6 @@ 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/#dom-xrsession-renderstate fn RenderState(&self) -> DomRoot { self.active_render_state.get() From 26b2f022105249d4e813d3fae52061c347ea8cc4 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Fri, 11 Oct 2019 13:05:36 -0700 Subject: [PATCH 2/5] Report correct environmentblendmode --- Cargo.lock | 4 ++-- components/script/dom/xrsession.rs | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) 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/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index 35593b10a99..1e63bdb2eaa 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -48,7 +48,7 @@ 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}; #[dom_struct] pub struct XRSession { @@ -84,8 +84,7 @@ 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(), viewer_space: Default::default(), session: DomRefCell::new(session), frame_requested: Cell::new(false), @@ -463,3 +462,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, + } + } +} From 75c763120febe7750b5df08513fee3ea698e2231 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Fri, 11 Oct 2019 13:11:35 -0700 Subject: [PATCH 3/5] Expose XRSession.visibilityState --- components/script/dom/webidls/XRSession.webidl | 8 +++++++- components/script/dom/xrsession.rs | 8 ++++++++ tests/wpt/metadata/webxr/idlharness.https.window.js.ini | 3 --- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/components/script/dom/webidls/XRSession.webidl b/components/script/dom/webidls/XRSession.webidl index 1548a68730d..507579225ab 100644 --- a/components/script/dom/webidls/XRSession.webidl +++ b/components/script/dom/webidls/XRSession.webidl @@ -10,6 +10,12 @@ enum XREnvironmentBlendMode { "alpha-blend", }; +enum XRVisibilityState { + "visible", + "visible-blurred", + "hidden", +}; + callback XRFrameRequestCallback = void (DOMHighResTimeStamp time, XRFrame frame); [SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] @@ -17,7 +23,7 @@ interface XRSession : EventTarget { // // Attributes readonly attribute XREnvironmentBlendMode environmentBlendMode; - // readonly attribute XRVisibilityState visibilityState; + readonly attribute XRVisibilityState visibilityState; [SameObject] readonly attribute XRRenderState renderState; [SameObject] readonly attribute XRInputSourceArray inputSources; diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index 1e63bdb2eaa..906b7c0cbe5 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -16,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; @@ -55,6 +56,7 @@ 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,6 +87,7 @@ impl XRSession { eventtarget: EventTarget::new_inherited(), base_layer: Default::default(), 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), @@ -405,6 +408,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); diff --git a/tests/wpt/metadata/webxr/idlharness.https.window.js.ini b/tests/wpt/metadata/webxr/idlharness.https.window.js.ini index e4a6da7c96e..109add21c4b 100644 --- a/tests/wpt/metadata/webxr/idlharness.https.window.js.ini +++ b/tests/wpt/metadata/webxr/idlharness.https.window.js.ini @@ -143,9 +143,6 @@ [XRBoundedReferenceSpace interface object name] expected: FAIL - [XRSession interface: attribute visibilityState] - expected: FAIL - [XRWebGLLayer interface: attribute ignoreDepthValues] expected: FAIL From d90317cfe4a8472391933152218c443b3f4c9548 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Fri, 11 Oct 2019 13:18:09 -0700 Subject: [PATCH 4/5] Fire visibilitychange event appropriately --- components/atoms/static_atoms.txt | 1 + components/script/dom/xrsession.rs | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) 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/xrsession.rs b/components/script/dom/xrsession.rs index 906b7c0cbe5..ba133ed1d7c 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -49,7 +49,7 @@ use profile_traits::ipc; use std::cell::Cell; use std::mem; use std::rc::Rc; -use webxr_api::{self, EnvironmentBlendMode, Event as XREvent, Frame, SelectEvent, Session}; +use webxr_api::{self, EnvironmentBlendMode, Event as XREvent, Frame, SelectEvent, Session, Visibility}; #[dom_struct] pub struct XRSession { @@ -214,6 +214,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 } } From 49a8ed0e9e6331ce96fc5ccee864473bd83f5229 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Fri, 11 Oct 2019 16:02:07 -0700 Subject: [PATCH 5/5] Expose onvisibilitychange --- components/script/dom/webidls/XRSession.webidl | 2 +- components/script/dom/xrsession.rs | 11 ++++++++++- .../wpt/metadata/webxr/idlharness.https.window.js.ini | 3 --- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/components/script/dom/webidls/XRSession.webidl b/components/script/dom/webidls/XRSession.webidl index 507579225ab..be8fb36e7bf 100644 --- a/components/script/dom/webidls/XRSession.webidl +++ b/components/script/dom/webidls/XRSession.webidl @@ -42,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 ba133ed1d7c..3451bb55467 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -49,7 +49,9 @@ use profile_traits::ipc; use std::cell::Cell; use std::mem; use std::rc::Rc; -use webxr_api::{self, EnvironmentBlendMode, Event as XREvent, Frame, SelectEvent, Session, Visibility}; +use webxr_api::{ + self, EnvironmentBlendMode, Event as XREvent, Frame, SelectEvent, Session, Visibility, +}; #[dom_struct] pub struct XRSession { @@ -313,6 +315,13 @@ impl XRSessionMethods for XRSession { /// https://immersive-web.github.io/webxr/#eventdef-xrsession-selectend event_handler!(selectend, GetOnselectend, SetOnselectend); + /// 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 { self.active_render_state.get() diff --git a/tests/wpt/metadata/webxr/idlharness.https.window.js.ini b/tests/wpt/metadata/webxr/idlharness.https.window.js.ini index 109add21c4b..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