diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2019-10-11 22:16:00 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-10-11 22:16:00 -0400 |
commit | a84d4ab75599ff62d7a94049ada8c4654ad94c0e (patch) | |
tree | 9ca4e8b90aca4bc043302cab4bf044c31a2f0114 | |
parent | 641f5e66e60d25680b262d075f40ba256bbf0b73 (diff) | |
parent | 49a8ed0e9e6331ce96fc5ccee864473bd83f5229 (diff) | |
download | servo-a84d4ab75599ff62d7a94049ada8c4654ad94c0e.tar.gz servo-a84d4ab75599ff62d7a94049ada8c4654ad94c0e.zip |
Auto merge of #24427 - Manishearth:various-xr, r=jdm
Various XR fixes
Mostly making sure we expose the correct things on the XRSession interface.
No backend currently supports visibility state changes, and it's tricky to do this for Hololens because currently we must pump the event loop to notice these events, and only rAF pumps the event loop right now, which means that applications which choose to stop running rAF when blurred will have a problem.
r? @jdm
-rw-r--r-- | Cargo.lock | 4 | ||||
-rw-r--r-- | components/atoms/static_atoms.txt | 1 | ||||
-rw-r--r-- | components/script/dom/webidls/XRSession.webidl | 11 | ||||
-rw-r--r-- | components/script/dom/xrsession.rs | 52 | ||||
-rw-r--r-- | tests/wpt/metadata/webxr/idlharness.https.window.js.ini | 6 |
5 files changed, 55 insertions, 19 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/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<XRWebGLLayer>, blend_mode: XREnvironmentBlendMode, + visibility_state: Cell<XRVisibilityState>, viewer_space: MutNullableDom<XRSpace>, #[ignore_malloc_size_of = "defined in webxr"] session: DomRefCell<Session>, @@ -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::<Event>().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<XRRenderState> { @@ -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<Promise> { let p = Promise::new_in_current_compartment(&self.global(), comp); @@ -469,3 +495,13 @@ pub fn cast_transform<T, U, V, W>( ) -> RigidTransform3D<f32, V, W> { unsafe { mem::transmute(transform) } } + +impl From<EnvironmentBlendMode> 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 |