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
This commit is contained in:
bors-servo 2019-10-11 22:16:00 -04:00 committed by GitHub
commit a84d4ab755
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 55 additions and 19 deletions

4
Cargo.lock generated
View file

@ -5927,7 +5927,7 @@ dependencies = [
[[package]] [[package]]
name = "webxr" name = "webxr"
version = "0.0.1" version = "0.0.1"
source = "git+https://github.com/servo/webxr#ec49fdd1c1a7e45a2dfde2f4a7f07e9581f386ef" source = "git+https://github.com/servo/webxr#61344bc5d92bc218458063baa7bc5d2d388aa7f5"
dependencies = [ dependencies = [
"bindgen", "bindgen",
"euclid", "euclid",
@ -5945,7 +5945,7 @@ dependencies = [
[[package]] [[package]]
name = "webxr-api" name = "webxr-api"
version = "0.0.1" version = "0.0.1"
source = "git+https://github.com/servo/webxr#ec49fdd1c1a7e45a2dfde2f4a7f07e9581f386ef" source = "git+https://github.com/servo/webxr#61344bc5d92bc218458063baa7bc5d2d388aa7f5"
dependencies = [ dependencies = [
"euclid", "euclid",
"gleam 0.6.18", "gleam 0.6.18",

View file

@ -123,6 +123,7 @@ transitionend
unhandledrejection unhandledrejection
unload unload
url url
visibilitychange
volumechange volumechange
waiting waiting
webglcontextcreationerror webglcontextcreationerror

View file

@ -10,15 +10,20 @@ enum XREnvironmentBlendMode {
"alpha-blend", "alpha-blend",
}; };
enum XRVisibilityState {
"visible",
"visible-blurred",
"hidden",
};
callback XRFrameRequestCallback = void (DOMHighResTimeStamp time, XRFrame frame); callback XRFrameRequestCallback = void (DOMHighResTimeStamp time, XRFrame frame);
[SecureContext, Exposed=Window, Pref="dom.webxr.enabled"] [SecureContext, Exposed=Window, Pref="dom.webxr.enabled"]
interface XRSession : EventTarget { interface XRSession : EventTarget {
// // Attributes // // Attributes
readonly attribute XRSessionMode mode;
readonly attribute XREnvironmentBlendMode environmentBlendMode; readonly attribute XREnvironmentBlendMode environmentBlendMode;
// readonly attribute XRVisibilityState visibilityState; readonly attribute XRVisibilityState visibilityState;
[SameObject] readonly attribute XRRenderState renderState; [SameObject] readonly attribute XRRenderState renderState;
[SameObject] readonly attribute XRInputSourceArray inputSources; [SameObject] readonly attribute XRInputSourceArray inputSources;
@ -37,5 +42,5 @@ interface XRSession : EventTarget {
// attribute EventHandler oninputsourceschange; // attribute EventHandler oninputsourceschange;
attribute EventHandler onselectstart; attribute EventHandler onselectstart;
attribute EventHandler onselectend; attribute EventHandler onselectend;
// attribute EventHandler onvisibilitychange; attribute EventHandler onvisibilitychange;
}; };

View file

@ -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::WebGLRenderingContextConstants as constants;
use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextMethods; use crate::dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextMethods;
use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowBinding::WindowMethods; 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::XRReferenceSpaceBinding::XRReferenceSpaceType;
use crate::dom::bindings::codegen::Bindings::XRRenderStateBinding::XRRenderStateInit; use crate::dom::bindings::codegen::Bindings::XRRenderStateBinding::XRRenderStateInit;
use crate::dom::bindings::codegen::Bindings::XRRenderStateBinding::XRRenderStateMethods; 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::XREnvironmentBlendMode;
use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRFrameRequestCallback; use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRFrameRequestCallback;
use crate::dom::bindings::codegen::Bindings::XRSessionBinding::XRSessionMethods; 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::codegen::Bindings::XRWebGLLayerBinding::XRWebGLLayerMethods;
use crate::dom::bindings::error::{Error, ErrorResult}; use crate::dom::bindings::error::{Error, ErrorResult};
use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::inheritance::Castable;
@ -49,13 +49,16 @@ use profile_traits::ipc;
use std::cell::Cell; use std::cell::Cell;
use std::mem; use std::mem;
use std::rc::Rc; 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] #[dom_struct]
pub struct XRSession { pub struct XRSession {
eventtarget: EventTarget, eventtarget: EventTarget,
base_layer: MutNullableDom<XRWebGLLayer>, base_layer: MutNullableDom<XRWebGLLayer>,
blend_mode: XREnvironmentBlendMode, blend_mode: XREnvironmentBlendMode,
visibility_state: Cell<XRVisibilityState>,
viewer_space: MutNullableDom<XRSpace>, viewer_space: MutNullableDom<XRSpace>,
#[ignore_malloc_size_of = "defined in webxr"] #[ignore_malloc_size_of = "defined in webxr"]
session: DomRefCell<Session>, session: DomRefCell<Session>,
@ -85,8 +88,8 @@ impl XRSession {
XRSession { XRSession {
eventtarget: EventTarget::new_inherited(), eventtarget: EventTarget::new_inherited(),
base_layer: Default::default(), base_layer: Default::default(),
// we don't yet support any AR devices blend_mode: session.environment_blend_mode().into(),
blend_mode: XREnvironmentBlendMode::Opaque, visibility_state: Cell::new(XRVisibilityState::Visible),
viewer_space: Default::default(), viewer_space: Default::default(),
session: DomRefCell::new(session), session: DomRefCell::new(session),
frame_requested: Cell::new(false), frame_requested: Cell::new(false),
@ -213,6 +216,22 @@ impl XRSession {
frame.set_active(false); 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 _ => (), // XXXManishearth TBD
} }
} }
@ -296,10 +315,12 @@ impl XRSessionMethods for XRSession {
/// https://immersive-web.github.io/webxr/#eventdef-xrsession-selectend /// https://immersive-web.github.io/webxr/#eventdef-xrsession-selectend
event_handler!(selectend, GetOnselectend, SetOnselectend); event_handler!(selectend, GetOnselectend, SetOnselectend);
/// https://immersive-web.github.io/webxr/#dom-xrsession-mode /// https://immersive-web.github.io/webxr/#eventdef-xrsession-visibilitychange
fn Mode(&self) -> XRSessionMode { event_handler!(
XRSessionMode::Immersive_vr visibilitychange,
} GetOnvisibilitychange,
SetOnvisibilitychange
);
// https://immersive-web.github.io/webxr/#dom-xrsession-renderstate // https://immersive-web.github.io/webxr/#dom-xrsession-renderstate
fn RenderState(&self) -> DomRoot<XRRenderState> { fn RenderState(&self) -> DomRoot<XRRenderState> {
@ -412,6 +433,11 @@ impl XRSessionMethods for XRSession {
self.blend_mode 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 /// https://immersive-web.github.io/webxr/#dom-xrsession-requestreferencespace
fn RequestReferenceSpace(&self, ty: XRReferenceSpaceType, comp: InCompartment) -> Rc<Promise> { fn RequestReferenceSpace(&self, ty: XRReferenceSpaceType, comp: InCompartment) -> Rc<Promise> {
let p = Promise::new_in_current_compartment(&self.global(), comp); 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> { ) -> RigidTransform3D<f32, V, W> {
unsafe { mem::transmute(transform) } 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,
}
}
}

View file

@ -14,9 +14,6 @@
[XR interface: calling supportsSession(XRSessionMode) on navigator.xr with too few arguments must throw TypeError] [XR interface: calling supportsSession(XRSessionMode) on navigator.xr with too few arguments must throw TypeError]
expected: FAIL expected: FAIL
[XRSession interface: attribute onvisibilitychange]
expected: FAIL
[XRInputSourcesChangeEvent interface object length] [XRInputSourcesChangeEvent interface object length]
expected: FAIL expected: FAIL
@ -143,9 +140,6 @@
[XRBoundedReferenceSpace interface object name] [XRBoundedReferenceSpace interface object name]
expected: FAIL expected: FAIL
[XRSession interface: attribute visibilityState]
expected: FAIL
[XRWebGLLayer interface: attribute ignoreDepthValues] [XRWebGLLayer interface: attribute ignoreDepthValues]
expected: FAIL expected: FAIL