mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
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:
commit
a84d4ab755
5 changed files with 55 additions and 19 deletions
4
Cargo.lock
generated
4
Cargo.lock
generated
|
@ -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",
|
||||
|
|
|
@ -123,6 +123,7 @@ transitionend
|
|||
unhandledrejection
|
||||
unload
|
||||
url
|
||||
visibilitychange
|
||||
volumechange
|
||||
waiting
|
||||
webglcontextcreationerror
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue