aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/script/dom/fakexrdevice.rs31
-rw-r--r--components/script/dom/webidls/FakeXRDevice.webidl3
-rw-r--r--components/script/dom/xrtest.rs10
-rw-r--r--tests/wpt/metadata/webxr/xrDevice_disconnect_ends.https.html.ini3
4 files changed, 39 insertions, 8 deletions
diff --git a/components/script/dom/fakexrdevice.rs b/components/script/dom/fakexrdevice.rs
index 239eb415478..d76c94751c0 100644
--- a/components/script/dom/fakexrdevice.rs
+++ b/components/script/dom/fakexrdevice.rs
@@ -7,13 +7,19 @@ use crate::dom::bindings::codegen::Bindings::FakeXRDeviceBinding::{
};
use crate::dom::bindings::codegen::Bindings::XRViewBinding::XREye;
use crate::dom::bindings::error::{Error, Fallible};
-use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
+use crate::dom::bindings::refcounted::TrustedPromise;
+use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector};
use crate::dom::bindings::root::DomRoot;
use crate::dom::globalscope::GlobalScope;
+use crate::dom::promise::Promise;
+use crate::task_source::TaskSource;
use dom_struct::dom_struct;
use euclid::{Point2D, Rect, Size2D};
use euclid::{RigidTransform3D, Rotation3D, Transform3D, Vector3D};
use ipc_channel::ipc::IpcSender;
+use ipc_channel::router::ROUTER;
+use profile_traits::ipc;
+use std::rc::Rc;
use webxr_api::{MockDeviceMsg, View, Views};
#[dom_struct]
@@ -139,4 +145,27 @@ impl FakeXRDeviceMethods for FakeXRDevice {
.send(MockDeviceMsg::SetViewerOrigin(get_origin(origin)?));
Ok(())
}
+
+ /// https://github.com/immersive-web/webxr-test-api/blob/master/explainer.md
+ fn Disconnect(&self) -> Rc<Promise> {
+ let global = self.global();
+ let p = Promise::new(&global);
+ let mut trusted = Some(TrustedPromise::new(p.clone()));
+ let (task_source, canceller) = global
+ .as_window()
+ .task_manager()
+ .dom_manipulation_task_source_with_canceller();
+ let (sender, receiver) = ipc::channel(global.time_profiler_chan().clone()).unwrap();
+ ROUTER.add_route(
+ receiver.to_opaque(),
+ Box::new(move |_| {
+ let trusted = trusted
+ .take()
+ .expect("disconnect callback called multiple times");
+ let _ = task_source.queue_with_canceller(trusted.resolve_task(()), &canceller);
+ }),
+ );
+ self.disconnect(sender);
+ p
+ }
}
diff --git a/components/script/dom/webidls/FakeXRDevice.webidl b/components/script/dom/webidls/FakeXRDevice.webidl
index dcfc116e87b..bb008bdc73f 100644
--- a/components/script/dom/webidls/FakeXRDevice.webidl
+++ b/components/script/dom/webidls/FakeXRDevice.webidl
@@ -26,6 +26,9 @@ interface FakeXRDevice {
// Promise<FakeXRInputController>
// simulateInputSourceConnection(FakeXRInputSourceInit);
+
+ // behaves as if device was disconnected
+ Promise<void> disconnect();
};
// https://immersive-web.github.io/webxr/#dom-xrwebgllayer-getviewport
diff --git a/components/script/dom/xrtest.rs b/components/script/dom/xrtest.rs
index 3c376366faf..b74d8c8bd6e 100644
--- a/components/script/dom/xrtest.rs
+++ b/components/script/dom/xrtest.rs
@@ -178,9 +178,7 @@ impl XRTestMethods for XRTest {
let mut rooted_devices: Vec<_> =
devices.iter().map(|x| DomRoot::from_ref(&**x)).collect();
devices.clear();
- for device in rooted_devices.drain(..) {
- device.disconnect(sender.clone());
- }
+
let mut trusted = Some(TrustedPromise::new(p.clone()));
let (task_source, canceller) = global
.as_window()
@@ -201,9 +199,9 @@ impl XRTestMethods for XRTest {
}),
);
- // XXXManishearth this is a hack, it will need to be replaced when
- // we improve how mock messaging works
- p.resolve_native(&())
+ for device in rooted_devices.drain(..) {
+ device.disconnect(sender.clone());
+ }
};
p
}
diff --git a/tests/wpt/metadata/webxr/xrDevice_disconnect_ends.https.html.ini b/tests/wpt/metadata/webxr/xrDevice_disconnect_ends.https.html.ini
index adfe53ea1b6..36724622cc6 100644
--- a/tests/wpt/metadata/webxr/xrDevice_disconnect_ends.https.html.ini
+++ b/tests/wpt/metadata/webxr/xrDevice_disconnect_ends.https.html.ini
@@ -1,4 +1,5 @@
[xrDevice_disconnect_ends.https.html]
+ expected: TIMEOUT
[Immersive session ends when device is disconnected]
- expected: FAIL
+ expected: TIMEOUT