diff options
-rw-r--r-- | components/script/dom/fakexrdevice.rs | 31 | ||||
-rw-r--r-- | components/script/dom/webidls/FakeXRDevice.webidl | 3 | ||||
-rw-r--r-- | components/script/dom/xrtest.rs | 10 | ||||
-rw-r--r-- | tests/wpt/metadata/webxr/xrDevice_disconnect_ends.https.html.ini | 3 |
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 |