aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2019-10-11 22:16:00 -0400
committerGitHub <noreply@github.com>2019-10-11 22:16:00 -0400
commita84d4ab75599ff62d7a94049ada8c4654ad94c0e (patch)
tree9ca4e8b90aca4bc043302cab4bf044c31a2f0114
parent641f5e66e60d25680b262d075f40ba256bbf0b73 (diff)
parent49a8ed0e9e6331ce96fc5ccee864473bd83f5229 (diff)
downloadservo-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.lock4
-rw-r--r--components/atoms/static_atoms.txt1
-rw-r--r--components/script/dom/webidls/XRSession.webidl11
-rw-r--r--components/script/dom/xrsession.rs52
-rw-r--r--tests/wpt/metadata/webxr/idlharness.https.window.js.ini6
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