Auto merge of #23839 - Manishearth:end-improve, r=asajeffrey

Improve session test lifecycle code

Requires https://github.com/servo/webxr/pull/25

Fixes https://github.com/servo/servo/issues/23796, hopefully

r? @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/23839)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2019-07-29 21:27:52 -04:00 committed by GitHub
commit 9043f247d9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 39 additions and 8 deletions

View file

@ -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
}
}

View file

@ -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

View file

@ -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
}