Add XRTest.simulateDeviceConnection()

This commit is contained in:
Manish Goregaokar 2019-05-29 15:43:05 -07:00
parent a89d2c6410
commit e95b24bfa6
2 changed files with 40 additions and 5 deletions

View file

@ -6,9 +6,9 @@
[Exposed=Window, Pref="dom.webxr.test"] [Exposed=Window, Pref="dom.webxr.test"]
interface XRTest { interface XRTest {
// // Simulates connecting a device to the system. // Simulates connecting a device to the system.
// // Used to instantiate a fake device for use in tests. // Used to instantiate a fake device for use in tests.
// Promise<FakeXRDeviceController> simulateDeviceConnection(FakeXRDeviceInit); Promise<FakeXRDeviceController> simulateDeviceConnection(FakeXRDeviceInit init);
// // Simulates a device being disconnected from the system. // // Simulates a device being disconnected from the system.
// Promise<void> simulateDeviceDisconnection(XRDevice); // Promise<void> simulateDeviceDisconnection(XRDevice);
@ -18,3 +18,8 @@ interface XRTest {
// // Device API methods. // // Device API methods.
// void simulateUserActivation(Function); // void simulateUserActivation(Function);
}; };
dictionary FakeXRDeviceInit {
// TODO: Subject to change to match spec changes.
required boolean supportsImmersive;
};

View file

@ -6,21 +6,30 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. */ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use crate::dom::bindings::codegen::Bindings::XRTestBinding; use crate::dom::bindings::codegen::Bindings::XRTestBinding::{
use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; self, FakeXRDeviceInit, XRTestMethods,
};
use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector};
use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::root::DomRoot;
use crate::dom::fakexrdevicecontroller::FakeXRDeviceController;
use crate::dom::globalscope::GlobalScope; use crate::dom::globalscope::GlobalScope;
use crate::dom::promise::Promise;
use dom_struct::dom_struct; use dom_struct::dom_struct;
use std::cell::Cell;
use std::rc::Rc;
use webvr_traits::WebVRMsg;
#[dom_struct] #[dom_struct]
pub struct XRTest { pub struct XRTest {
reflector: Reflector, reflector: Reflector,
session_started: Cell<bool>,
} }
impl XRTest { impl XRTest {
pub fn new_inherited() -> XRTest { pub fn new_inherited() -> XRTest {
XRTest { XRTest {
reflector: Reflector::new(), reflector: Reflector::new(),
session_started: Cell::new(false),
} }
} }
@ -32,3 +41,24 @@ impl XRTest {
) )
} }
} }
impl XRTestMethods for XRTest {
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);
p.resolve_native(&FakeXRDeviceController::new(&self.global()));
p
}
}