aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2019-05-30 22:04:22 -0400
committerGitHub <noreply@github.com>2019-05-30 22:04:22 -0400
commit7c8a4ecead45d576bec3aaba02a13d8f21434eb4 (patch)
tree30371c01567eadc86858796c438ab3304e3987bc
parenta5506365d6f1e8a75db7e7fa2f9e0b1ef73972ee (diff)
parentc2d4900c1616cb7acfd21a7ae7a5d1d134c085f9 (diff)
downloadservo-7c8a4ecead45d576bec3aaba02a13d8f21434eb4.tar.gz
servo-7c8a4ecead45d576bec3aaba02a13d8f21434eb4.zip
Auto merge of #23485 - Manishearth:xrtest, r=asajeffrey
Basic XR Testing support This adds support for the XRTest and FakeXRDeviceController APIs from https://github.com/immersive-web/webxr-test-api, and plugs them into the `mock` backend of rust-webvr. Tested with [a modified webxr test page](https://github.com/immersive-web/webxr-test-api) r? @jdm @asajeffrey <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/23485) <!-- Reviewable:end -->
-rw-r--r--Cargo.lock16
-rw-r--r--components/config/prefs.rs2
-rw-r--r--components/script/dom/fakexrdevicecontroller.rs104
-rw-r--r--components/script/dom/mod.rs2
-rw-r--r--components/script/dom/webidls/FakeXRDeviceController.webidl49
-rw-r--r--components/script/dom/webidls/XR.webidl5
-rw-r--r--components/script/dom/webidls/XRTest.webidl25
-rw-r--r--components/script/dom/xr.rs8
-rw-r--r--components/script/dom/xrspace.rs3
-rw-r--r--components/script/dom/xrtest.rs66
-rw-r--r--components/servo/lib.rs2
-rw-r--r--components/webvr/Cargo.toml4
-rw-r--r--components/webvr/webvr_thread.rs26
-rw-r--r--components/webvr_traits/Cargo.toml2
-rw-r--r--components/webvr_traits/lib.rs1
-rw-r--r--components/webvr_traits/webvr_traits.rs2
-rw-r--r--python/tidy/servo_tidy/tidy.py1
-rw-r--r--resources/prefs.json1
18 files changed, 306 insertions, 13 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 9769ebc6b35..ce4e3ce8b6f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3590,7 +3590,7 @@ dependencies = [
[[package]]
name = "rust-webvr"
-version = "0.11.1"
+version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"bindgen 0.49.0 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3603,12 +3603,12 @@ dependencies = [
"libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"ovr-mobile-sys 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "rust-webvr-api 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rust-webvr-api 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "rust-webvr-api"
-version = "0.11.0"
+version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"android_injected_glue 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -3948,7 +3948,7 @@ dependencies = [
"mozangle 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"osmesa-src 0.1.0 (git+https://github.com/servo/osmesa-src)",
"osmesa-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "rust-webvr 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rust-webvr 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)",
"sig 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"tinyfiledialogs 3.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -5267,7 +5267,7 @@ dependencies = [
"ipc-channel 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"msg 0.0.1",
- "rust-webvr 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rust-webvr 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)",
"script_traits 0.0.1",
"servo_config 0.0.1",
"webvr_traits 0.0.1",
@@ -5279,7 +5279,7 @@ version = "0.0.1"
dependencies = [
"ipc-channel 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
"msg 0.0.1",
- "rust-webvr-api 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rust-webvr-api 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
]
@@ -5782,8 +5782,8 @@ dependencies = [
"checksum regex-syntax 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dcfd8681eebe297b81d98498869d4aae052137651ad7b96822f09ceb690d0a96"
"checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5"
"checksum ron 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "da06feaa07f69125ab9ddc769b11de29090122170b402547f64b86fe16ebc399"
-"checksum rust-webvr 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c5b30e882ddadf407de2229bf6bf0f1adde250b6dee10357ba4f8c4a51c0ab15"
-"checksum rust-webvr-api 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b5208a3b3f0b02abf17e66c0fe1e0cd3a4f5172c9bf6d1a3e1ac6338a3d218d3"
+"checksum rust-webvr 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7a171c39fdd52c5b461f2384a04e2d75555c7ed657c057c45ea9d69d68b5f9fb"
+"checksum rust-webvr-api 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c5611b60f8a26ad5af2b8d6ac072f9e1b396305e8eb19efd5a6df84c588b1429"
"checksum rustc-demangle 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3058a43ada2c2d0b92b3ae38007a2d0fa5e9db971be260e0171408a4ff471c95"
"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
"checksum rusttype 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b8eb11f5b0a98c8eca2fb1483f42646d8c340e83e46ab416f8a063a0fd0eeb20"
diff --git a/components/config/prefs.rs b/components/config/prefs.rs
index 76e70933bde..924577b2a39 100644
--- a/components/config/prefs.rs
+++ b/components/config/prefs.rs
@@ -294,6 +294,8 @@ mod gen {
webxr: {
#[serde(default)]
enabled: bool,
+ #[serde(default)]
+ test: bool,
},
worklet: {
blockingsleep: {
diff --git a/components/script/dom/fakexrdevicecontroller.rs b/components/script/dom/fakexrdevicecontroller.rs
new file mode 100644
index 00000000000..3d051283155
--- /dev/null
+++ b/components/script/dom/fakexrdevicecontroller.rs
@@ -0,0 +1,104 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+use crate::dom::bindings::codegen::Bindings::FakeXRDeviceControllerBinding::{
+ self, FakeXRDeviceControllerMethods, FakeXRRigidTransform, FakeXRViewInit,
+};
+use crate::dom::bindings::codegen::Bindings::XRViewBinding::XREye;
+use crate::dom::bindings::error::{Error, Fallible};
+use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector};
+use crate::dom::bindings::root::DomRoot;
+use crate::dom::globalscope::GlobalScope;
+use dom_struct::dom_struct;
+use webvr_traits::{MockVRControlMsg, WebVREyeParameters, WebVRMsg};
+
+#[dom_struct]
+pub struct FakeXRDeviceController {
+ reflector: Reflector,
+}
+
+impl FakeXRDeviceController {
+ pub fn new_inherited() -> FakeXRDeviceController {
+ FakeXRDeviceController {
+ reflector: Reflector::new(),
+ }
+ }
+
+ pub fn new(global: &GlobalScope) -> DomRoot<FakeXRDeviceController> {
+ reflect_dom_object(
+ Box::new(FakeXRDeviceController::new_inherited()),
+ global,
+ FakeXRDeviceControllerBinding::Wrap,
+ )
+ }
+
+ pub fn send_msg(&self, msg: MockVRControlMsg) {
+ self.global()
+ .as_window()
+ .webvr_thread()
+ .unwrap()
+ .send(WebVRMsg::MessageMockDisplay(msg))
+ .unwrap();
+ }
+}
+
+impl FakeXRDeviceControllerMethods for FakeXRDeviceController {
+ /// https://github.com/immersive-web/webxr-test-api/blob/master/explainer.md
+ fn SetViews(&self, views: Vec<FakeXRViewInit>) -> Fallible<()> {
+ if views.len() != 2 {
+ return Err(Error::NotSupported);
+ }
+
+ let (left, right) = match (views[0].eye, views[1].eye) {
+ (XREye::Left, XREye::Right) => (&views[0], &views[1]),
+ (XREye::Right, XREye::Left) => (&views[1], &views[0]),
+ _ => return Err(Error::NotSupported),
+ };
+
+ if left.projectionMatrix.len() != 16 ||
+ right.projectionMatrix.len() != 16 ||
+ left.viewOffset.position.len() != 4 ||
+ right.viewOffset.position.len() != 4
+ {
+ return Err(Error::Type("Incorrectly sized array".into()));
+ }
+
+ let mut proj_l = [0.; 16];
+ let mut proj_r = [0.; 16];
+ let v: Vec<_> = left.projectionMatrix.iter().map(|x| **x).collect();
+ proj_l.copy_from_slice(&v);
+ let v: Vec<_> = right.projectionMatrix.iter().map(|x| **x).collect();
+ proj_r.copy_from_slice(&v);
+
+ let mut params_l = WebVREyeParameters::default();
+ let mut params_r = WebVREyeParameters::default();
+ let v: Vec<_> = left.viewOffset.position.iter().map(|x| **x).collect();
+ params_l.offset.copy_from_slice(&v);
+ let v: Vec<_> = right.viewOffset.position.iter().map(|x| **x).collect();
+ params_r.offset.copy_from_slice(&v);
+
+ self.send_msg(MockVRControlMsg::SetProjectionMatrices(proj_l, proj_r));
+ self.send_msg(MockVRControlMsg::SetEyeParameters(params_l, params_r));
+ Ok(())
+ }
+
+ /// https://github.com/immersive-web/webxr-test-api/blob/master/explainer.md
+ fn SetViewerOrigin(&self, origin: &FakeXRRigidTransform) -> Fallible<()> {
+ if origin.position.len() != 4 || origin.orientation.len() != 4 {
+ return Err(Error::Type("Incorrectly sized array".into()));
+ }
+ let mut position = [0.; 3];
+ let mut orientation = [0.; 4];
+ let v: Vec<_> = origin.position.iter().map(|x| **x).collect();
+ position.copy_from_slice(&v[0..3]);
+ let v: Vec<_> = origin.orientation.iter().map(|x| **x).collect();
+ orientation.copy_from_slice(&v);
+ self.send_msg(MockVRControlMsg::SetViewerPose(position, orientation));
+ Ok(())
+ }
+}
diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs
index 1dbc1383101..cf8d8a49389 100644
--- a/components/script/dom/mod.rs
+++ b/components/script/dom/mod.rs
@@ -301,6 +301,7 @@ pub mod eventsource;
pub mod eventtarget;
pub mod extendableevent;
pub mod extendablemessageevent;
+pub mod fakexrdevicecontroller;
pub mod file;
pub mod filelist;
pub mod filereader;
@@ -551,6 +552,7 @@ pub mod xrrigidtransform;
pub mod xrsession;
pub mod xrspace;
pub mod xrstationaryreferencespace;
+pub mod xrtest;
pub mod xrview;
pub mod xrviewerpose;
pub mod xrviewport;
diff --git a/components/script/dom/webidls/FakeXRDeviceController.webidl b/components/script/dom/webidls/FakeXRDeviceController.webidl
new file mode 100644
index 00000000000..cacdb2f9819
--- /dev/null
+++ b/components/script/dom/webidls/FakeXRDeviceController.webidl
@@ -0,0 +1,49 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+// https://github.com/immersive-web/webxr-test-api/
+
+[Exposed=Window, Pref="dom.webxr.test"]
+interface FakeXRDeviceController {
+ // Creates and attaches a XRFrameOfReference of the type specified to the device.
+ // void setFrameOfReference(XRFrameOfReferenceType, FakeXRFrameOfReferenceInit);
+
+ // // Sets the values to be used for subsequent
+ // // requestAnimationFrame() callbacks.
+ [Throws] void setViews(sequence<FakeXRViewInit> views);
+
+ [Throws] void setViewerOrigin(FakeXRRigidTransform origin);
+
+ // Simulates the user activating the reset pose on a device.
+ // void simulateResetPose();
+
+ // Simulates the platform ending the sessions.
+ // void simulateForcedEndSessions();
+
+ // Simulates devices focusing and blurring sessions.
+ // void simulateBlurSession(XRSession);
+ // void simulateFocusSession(XRSession);
+
+ // void setBoundsGeometry(Array<FakeXRBoundsPoint> boundsCoodinates)l
+
+ // Promise<FakeXRInputSourceController>
+ // simulateInputSourceConnection(FakeXRInputSourceInit);
+};
+
+dictionary FakeXRViewInit {
+ required XREye eye;
+ // https://immersive-web.github.io/webxr/#view-projection-matrix
+ required sequence<float> projectionMatrix;
+ // https://immersive-web.github.io/webxr/#view-offset
+ required FakeXRRigidTransform viewOffset;
+};
+
+dictionary FakeXRBoundsPoint {
+ double x; double z;
+};
+
+dictionary FakeXRRigidTransform {
+ required sequence<float> position;
+ required sequence<float> orientation;
+};
diff --git a/components/script/dom/webidls/XR.webidl b/components/script/dom/webidls/XR.webidl
index 4a6bca26a69..58732edd42b 100644
--- a/components/script/dom/webidls/XR.webidl
+++ b/components/script/dom/webidls/XR.webidl
@@ -28,3 +28,8 @@ dictionary XRSessionCreationOptions {
XRSessionMode mode = "inline";
// XRPresentationContext outputContext;
};
+
+partial interface XR {
+ // https://github.com/immersive-web/webxr-test-api/
+ [SameObject, Pref="dom.webxr.test"] readonly attribute XRTest test;
+};
diff --git a/components/script/dom/webidls/XRTest.webidl b/components/script/dom/webidls/XRTest.webidl
new file mode 100644
index 00000000000..30c485321d4
--- /dev/null
+++ b/components/script/dom/webidls/XRTest.webidl
@@ -0,0 +1,25 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+// https://github.com/immersive-web/webxr-test-api/
+
+[Exposed=Window, Pref="dom.webxr.test"]
+interface XRTest {
+ // Simulates connecting a device to the system.
+ // Used to instantiate a fake device for use in tests.
+ Promise<FakeXRDeviceController> simulateDeviceConnection(FakeXRDeviceInit init);
+
+ // // Simulates a device being disconnected from the system.
+ // Promise<void> simulateDeviceDisconnection(XRDevice);
+
+ // // Simulates a user activation (aka user gesture) for the current scope.
+ // // The activation is only guaranteed to be valid in the provided function and only applies to WebXR
+ // // Device API methods.
+ // void simulateUserActivation(Function);
+};
+
+dictionary FakeXRDeviceInit {
+ // TODO: Subject to change to match spec changes.
+ required boolean supportsImmersive;
+};
diff --git a/components/script/dom/xr.rs b/components/script/dom/xr.rs
index 3ff67b0042c..1626ad4e00e 100644
--- a/components/script/dom/xr.rs
+++ b/components/script/dom/xr.rs
@@ -21,6 +21,7 @@ use crate::dom::promise::Promise;
use crate::dom::vrdisplay::VRDisplay;
use crate::dom::vrdisplayevent::VRDisplayEvent;
use crate::dom::xrsession::XRSession;
+use crate::dom::xrtest::XRTest;
use dom_struct::dom_struct;
use ipc_channel::ipc::IpcSender;
use profile_traits::ipc;
@@ -36,6 +37,7 @@ pub struct XR {
gamepads: DomRefCell<Vec<Dom<Gamepad>>>,
pending_immersive_session: Cell<bool>,
active_immersive_session: MutNullableDom<VRDisplay>,
+ test: MutNullableDom<XRTest>,
}
impl XR {
@@ -46,6 +48,7 @@ impl XR {
gamepads: DomRefCell::new(Vec::new()),
pending_immersive_session: Cell::new(false),
active_immersive_session: Default::default(),
+ test: Default::default(),
}
}
@@ -141,6 +144,11 @@ impl XRMethods for XR {
session.xr_present(promise.clone());
promise
}
+
+ // https://github.com/immersive-web/webxr-test-api/blob/master/explainer.md
+ fn Test(&self) -> DomRoot<XRTest> {
+ self.test.or_init(|| XRTest::new(&self.global()))
+ }
}
impl XR {
diff --git a/components/script/dom/xrspace.rs b/components/script/dom/xrspace.rs
index 30f9246c354..171c0621dc8 100644
--- a/components/script/dom/xrspace.rs
+++ b/components/script/dom/xrspace.rs
@@ -99,7 +99,8 @@ impl XRSpace {
orient[1] as f64,
orient[2] as f64,
orient[3] as f64,
- );
+ )
+ .normalize();
RigidTransform3D::new(rotation, translation)
}
diff --git a/components/script/dom/xrtest.rs b/components/script/dom/xrtest.rs
new file mode 100644
index 00000000000..07fac9d6a89
--- /dev/null
+++ b/components/script/dom/xrtest.rs
@@ -0,0 +1,66 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+use crate::dom::bindings::codegen::Bindings::XRTestBinding::{
+ self, FakeXRDeviceInit, XRTestMethods,
+};
+use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector};
+use crate::dom::bindings::root::DomRoot;
+use crate::dom::fakexrdevicecontroller::FakeXRDeviceController;
+use crate::dom::globalscope::GlobalScope;
+use crate::dom::promise::Promise;
+use dom_struct::dom_struct;
+use std::cell::Cell;
+use std::rc::Rc;
+use webvr_traits::WebVRMsg;
+
+#[dom_struct]
+pub struct XRTest {
+ reflector: Reflector,
+ session_started: Cell<bool>,
+}
+
+impl XRTest {
+ pub fn new_inherited() -> XRTest {
+ XRTest {
+ reflector: Reflector::new(),
+ session_started: Cell::new(false),
+ }
+ }
+
+ pub fn new(global: &GlobalScope) -> DomRoot<XRTest> {
+ reflect_dom_object(
+ Box::new(XRTest::new_inherited()),
+ global,
+ XRTestBinding::Wrap,
+ )
+ }
+}
+
+impl XRTestMethods for XRTest {
+ /// https://github.com/immersive-web/webxr-test-api/blob/master/explainer.md
+ fn SimulateDeviceConnection(&self, init: &FakeXRDeviceInit) -> Rc<Promise> {
+ let p = Promise::new(&self.global());
+
+ if !init.supportsImmersive || self.session_started.get() {
+ p.reject_native(&());
+ return p;
+ }
+
+ self.session_started.set(true);
+ self.global()
+ .as_window()
+ .webvr_thread()
+ .unwrap()
+ .send(WebVRMsg::CreateMockDisplay)
+ .unwrap();
+ p.resolve_native(&FakeXRDeviceController::new(&self.global()));
+
+ p
+ }
+}
diff --git a/components/servo/lib.rs b/components/servo/lib.rs
index d3d8d8eb1cb..088df2ea85f 100644
--- a/components/servo/lib.rs
+++ b/components/servo/lib.rs
@@ -285,7 +285,7 @@ where
script::init();
let mut webvr_heartbeats = Vec::new();
- let webvr_services = if pref!(dom.webvr.enabled) {
+ let webvr_services = if pref!(dom.webvr.enabled) || pref!(dom.webxr.enabled) {
let mut services = VRServiceManager::new();
services.register_defaults();
embedder.register_vr_services(&mut services, &mut webvr_heartbeats);
diff --git a/components/webvr/Cargo.toml b/components/webvr/Cargo.toml
index 2a849282f17..b7f3c76c49e 100644
--- a/components/webvr/Cargo.toml
+++ b/components/webvr/Cargo.toml
@@ -19,10 +19,10 @@ canvas_traits = {path = "../canvas_traits"}
crossbeam-channel = "0.3"
euclid = "0.19"
gleam = "0.6"
-ipc-channel = "0.11"
+ipc-channel = "0.11.2"
log = "0.4"
msg = {path = "../msg"}
-rust-webvr = {version = "0.11", features = ["openvr", "vrexternal"]}
+rust-webvr = {version = "0.11.3", features = ["mock", "openvr", "vrexternal"]}
script_traits = {path = "../script_traits"}
servo_config = {path = "../config"}
webvr_traits = {path = "../webvr_traits" }
diff --git a/components/webvr/webvr_thread.rs b/components/webvr/webvr_thread.rs
index e90ddbf7df5..2cd4c81ab35 100644
--- a/components/webvr/webvr_thread.rs
+++ b/components/webvr/webvr_thread.rs
@@ -14,6 +14,7 @@ use script_traits::ConstellationMsg;
use servo_config::pref;
use std::collections::hash_map::Entry;
use std::collections::{HashMap, HashSet};
+use std::sync::mpsc;
use std::{thread, time};
use webvr_traits::webvr::*;
use webvr_traits::{WebVRMsg, WebVRPoseInformation, WebVRResult};
@@ -46,6 +47,7 @@ pub struct WebVRThread {
vr_compositor_chan: WebVRCompositorSender,
polling_events: bool,
presenting: HashMap<u32, PipelineId>,
+ mock: Option<mpsc::Sender<MockVRControlMsg>>,
}
impl WebVRThread {
@@ -65,6 +67,7 @@ impl WebVRThread {
vr_compositor_chan: vr_compositor_chan,
polling_events: false,
presenting: HashMap::new(),
+ mock: None,
}
}
@@ -131,6 +134,13 @@ impl WebVRThread {
WebVRMsg::GetGamepadsForDisplay(display_id, sender) => {
self.handle_get_gamepads_for_display(display_id, sender);
},
+
+ WebVRMsg::CreateMockDisplay => {
+ self.handle_create_mock();
+ },
+ WebVRMsg::MessageMockDisplay(msg) => {
+ self.handle_message_mock_display(msg);
+ },
WebVRMsg::Exit => break,
}
}
@@ -302,6 +312,22 @@ impl WebVRThread {
sender.send(Ok(data)).unwrap();
}
+ fn handle_create_mock(&mut self) {
+ if self.mock.is_some() {
+ warn!("Mock display already created");
+ return;
+ }
+ self.mock = Some(self.service.register_mock_with_remote());
+ }
+
+ fn handle_message_mock_display(&mut self, msg: MockVRControlMsg) {
+ self.mock
+ .as_ref()
+ .expect("Mock Display not yet set up")
+ .send(msg)
+ .expect("Could not send message to mock display");
+ }
+
fn poll_events(&mut self, sender: IpcSender<bool>) {
loop {
let events = self.service.poll_events();
diff --git a/components/webvr_traits/Cargo.toml b/components/webvr_traits/Cargo.toml
index e55953f3536..72a7e632fd3 100644
--- a/components/webvr_traits/Cargo.toml
+++ b/components/webvr_traits/Cargo.toml
@@ -13,5 +13,5 @@ path = "lib.rs"
[dependencies]
ipc-channel = "0.11"
msg = {path = "../msg"}
-rust-webvr-api = {version = "0.11", features = ["ipc"]}
+rust-webvr-api = {version = "0.11.1", features = ["ipc"]}
serde = "1.0"
diff --git a/components/webvr_traits/lib.rs b/components/webvr_traits/lib.rs
index f96fee056e7..d5d99f98a3b 100644
--- a/components/webvr_traits/lib.rs
+++ b/components/webvr_traits/lib.rs
@@ -11,6 +11,7 @@ mod webvr_traits;
pub use crate::webvr_traits::{WebVRMsg, WebVRResult};
pub use rust_webvr_api as webvr;
+pub use rust_webvr_api::MockVRControlMsg;
pub use rust_webvr_api::VRDisplayCapabilities as WebVRDisplayCapabilities;
pub use rust_webvr_api::VRDisplayData as WebVRDisplayData;
pub use rust_webvr_api::VRDisplayEvent as WebVRDisplayEvent;
diff --git a/components/webvr_traits/webvr_traits.rs b/components/webvr_traits/webvr_traits.rs
index d21e6c3ff16..3123c8b5faf 100644
--- a/components/webvr_traits/webvr_traits.rs
+++ b/components/webvr_traits/webvr_traits.rs
@@ -26,6 +26,8 @@ pub enum WebVRMsg {
RequestPresent(PipelineId, u32, IpcSender<WebVRResult<()>>),
ExitPresent(PipelineId, u32, Option<IpcSender<WebVRResult<()>>>),
CreateCompositor(u32),
+ CreateMockDisplay,
+ MessageMockDisplay(MockVRControlMsg),
GetGamepads(
Vec<u32>,
IpcSender<WebVRResult<Vec<(Option<VRGamepadData>, VRGamepadState)>>>,
diff --git a/python/tidy/servo_tidy/tidy.py b/python/tidy/servo_tidy/tidy.py
index 35ebcb656db..0fdda070899 100644
--- a/python/tidy/servo_tidy/tidy.py
+++ b/python/tidy/servo_tidy/tidy.py
@@ -98,6 +98,7 @@ WEBIDL_STANDARDS = [
"//wicg.github.io",
"//webaudio.github.io",
"//immersive-web.github.io/",
+ "//github.com/immersive-web/webxr-test-api/",
# Not a URL
"// This interface is entirely internal to Servo, and should not be" +
" accessible to\n// web pages."
diff --git a/resources/prefs.json b/resources/prefs.json
index 23c42c3352d..22c4e22b4db 100644
--- a/resources/prefs.json
+++ b/resources/prefs.json
@@ -31,6 +31,7 @@
"dom.webvr.event_polling_interval": 500,
"dom.webvr.test": false,
"dom.webxr.enabled": false,
+ "dom.webxr.test": false,
"dom.worklet.timeout_ms": 10,
"gfx.subpixel-text-antialiasing.enabled": true,
"js.asmjs.enabled": true,