diff options
author | Manish Goregaokar <manishsmail@gmail.com> | 2019-07-19 19:59:55 -0700 |
---|---|---|
committer | Manish Goregaokar <manishsmail@gmail.com> | 2019-07-23 00:52:33 -0700 |
commit | 3f95d304ec621123d675f935c77704fc60d09d60 (patch) | |
tree | 8259f16a03c6aecb88818b9091cbb133e2b70b88 | |
parent | b0002a003d3222b01d20f781cf9ca28a01bda22f (diff) | |
download | servo-3f95d304ec621123d675f935c77704fc60d09d60.tar.gz servo-3f95d304ec621123d675f935c77704fc60d09d60.zip |
Support XRTest.disconnectAllDevices()
6 files changed, 55 insertions, 11 deletions
diff --git a/components/script/dom/fakexrdevice.rs b/components/script/dom/fakexrdevice.rs index c1268d743d9..c5e1d16eaff 100644 --- a/components/script/dom/fakexrdevice.rs +++ b/components/script/dom/fakexrdevice.rs @@ -38,6 +38,10 @@ impl FakeXRDevice { FakeXRDeviceBinding::Wrap, ) } + + pub fn disconnect(&self, sender: IpcSender<()>) { + let _ = self.sender.send(MockDeviceMsg::Disconnect(sender)); + } } pub fn get_views(views: &[FakeXRViewInit]) -> Fallible<Views> { diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index e6ca700d0e7..0ea8a0e0e46 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -395,6 +395,7 @@ impl XRSessionMethods for XRSession { // shuts itself down self.ended.set(true); global.as_window().Navigator().Xr().end_session(self); + self.session.borrow_mut().end_session(); p } } diff --git a/components/script/dom/xrtest.rs b/components/script/dom/xrtest.rs index 3e695bc1f5e..81949addf02 100644 --- a/components/script/dom/xrtest.rs +++ b/components/script/dom/xrtest.rs @@ -7,13 +7,14 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::dom::bindings::callback::ExceptionHandling; +use crate::dom::bindings::cell::DomRefCell; use crate::dom::bindings::codegen::Bindings::FunctionBinding::Function; use crate::dom::bindings::codegen::Bindings::XRTestBinding::{ self, FakeXRDeviceInit, XRTestMethods, }; use crate::dom::bindings::refcounted::{Trusted, TrustedPromise}; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; -use crate::dom::bindings::root::DomRoot; +use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::fakexrdevice::{get_origin, get_views, FakeXRDevice}; use crate::dom::globalscope::GlobalScope; use crate::dom::promise::Promise; @@ -31,6 +32,7 @@ use webxr_api::{self, Error as XRError, MockDeviceInit, MockDeviceMsg}; pub struct XRTest { reflector: Reflector, session_started: Cell<bool>, + devices_connected: DomRefCell<Vec<Dom<FakeXRDevice>>>, } impl XRTest { @@ -38,6 +40,7 @@ impl XRTest { XRTest { reflector: Reflector::new(), session_started: Cell::new(false), + devices_connected: DomRefCell::new(vec![]), } } @@ -57,6 +60,9 @@ impl XRTest { let promise = trusted.root(); if let Ok(sender) = response { let device = FakeXRDevice::new(&self.global(), sender); + self.devices_connected + .borrow_mut() + .push(Dom::from_ref(&device)); promise.resolve_native(&device); } else { promise.reject_native(&()); @@ -174,8 +180,45 @@ impl XRTestMethods for XRTest { /// https://github.com/immersive-web/webxr-test-api/blob/master/explainer.md fn DisconnectAllDevices(&self) -> Rc<Promise> { // XXXManishearth implement device disconnection and session ending - let p = Promise::new(&self.global()); - p.resolve_native(&()); + let global = self.global(); + let p = Promise::new(&global); + let mut devices = self.devices_connected.borrow_mut(); + if devices.is_empty() { + p.resolve_native(&()); + } else { + let mut len = devices.len(); + + let (sender, receiver) = ipc::channel(global.time_profiler_chan().clone()).unwrap(); + 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() + .task_manager() + .dom_manipulation_task_source_with_canceller(); + + ROUTER.add_route( + receiver.to_opaque(), + Box::new(move |_| { + len -= 1; + if len == 0 { + let trusted = trusted + .take() + .expect("DisconnectAllDevices disconnected more devices than expected"); + let _ = + task_source.queue_with_canceller(trusted.resolve_task(()), &canceller); + } + }), + ); + + // XXXManishearth this is a hack, it will need to be replaced when + // we improve how mock messaging works + p.resolve_native(&()) + }; p } } diff --git a/tests/wpt/metadata/webxr/xrSession_end.https.html.ini b/tests/wpt/metadata/webxr/xrSession_end.https.html.ini index 99ff6da253a..d03914bcd66 100644 --- a/tests/wpt/metadata/webxr/xrSession_end.https.html.ini +++ b/tests/wpt/metadata/webxr/xrSession_end.https.html.ini @@ -1,8 +1,5 @@ [xrSession_end.https.html] - expected: TIMEOUT + expected: ERROR [end event fires when non-immersive session ends] expected: NOTRUN - [end event fires when immersive session ends] - expected: TIMEOUT - diff --git a/tests/wpt/metadata/webxr/xrSession_input_events_end.https.html.ini b/tests/wpt/metadata/webxr/xrSession_input_events_end.https.html.ini index 1d6cd17924d..fba510c47e9 100644 --- a/tests/wpt/metadata/webxr/xrSession_input_events_end.https.html.ini +++ b/tests/wpt/metadata/webxr/xrSession_input_events_end.https.html.ini @@ -1,5 +1,5 @@ [xrSession_input_events_end.https.html] - expected: TIMEOUT + expected: ERROR [Calling end during an input callback stops processing at the right time] - expected: TIMEOUT + expected: FAIL diff --git a/tests/wpt/metadata/webxr/xrSession_prevent_multiple_exclusive.https.html.ini b/tests/wpt/metadata/webxr/xrSession_prevent_multiple_exclusive.https.html.ini index 7987d965e4c..d97e34090f9 100644 --- a/tests/wpt/metadata/webxr/xrSession_prevent_multiple_exclusive.https.html.ini +++ b/tests/wpt/metadata/webxr/xrSession_prevent_multiple_exclusive.https.html.ini @@ -1,5 +1,4 @@ [xrSession_prevent_multiple_exclusive.https.html] - expected: TIMEOUT [Test prevention of multiple simultaneous immersive sessions] - expected: TIMEOUT + expected: FAIL |