diff --git a/components/script/dom/webidls/XRTest.webidl b/components/script/dom/webidls/XRTest.webidl index 6a6b0003eb1..30c485321d4 100644 --- a/components/script/dom/webidls/XRTest.webidl +++ b/components/script/dom/webidls/XRTest.webidl @@ -6,9 +6,9 @@ [Exposed=Window, Pref="dom.webxr.test"] interface XRTest { - // // Simulates connecting a device to the system. - // // Used to instantiate a fake device for use in tests. - // Promise simulateDeviceConnection(FakeXRDeviceInit); + // Simulates connecting a device to the system. + // Used to instantiate a fake device for use in tests. + Promise simulateDeviceConnection(FakeXRDeviceInit init); // // Simulates a device being disconnected from the system. // Promise simulateDeviceDisconnection(XRDevice); @@ -18,3 +18,8 @@ interface XRTest { // // Device API methods. // void simulateUserActivation(Function); }; + +dictionary FakeXRDeviceInit { + // TODO: Subject to change to match spec changes. + required boolean supportsImmersive; +}; diff --git a/components/script/dom/xrtest.rs b/components/script/dom/xrtest.rs index af1d289ae3f..6c895e226cb 100644 --- a/components/script/dom/xrtest.rs +++ b/components/script/dom/xrtest.rs @@ -6,21 +6,30 @@ * 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/. */ -use crate::dom::bindings::codegen::Bindings::XRTestBinding; -use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; +use crate::dom::bindings::codegen::Bindings::XRTestBinding::{ + self, FakeXRDeviceInit, XRTestMethods, +}; +use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; use crate::dom::bindings::root::DomRoot; +use crate::dom::fakexrdevicecontroller::FakeXRDeviceController; use crate::dom::globalscope::GlobalScope; +use crate::dom::promise::Promise; use dom_struct::dom_struct; +use std::cell::Cell; +use std::rc::Rc; +use webvr_traits::WebVRMsg; #[dom_struct] pub struct XRTest { reflector: Reflector, + session_started: Cell, } impl XRTest { pub fn new_inherited() -> XRTest { XRTest { reflector: Reflector::new(), + session_started: Cell::new(false), } } @@ -32,3 +41,24 @@ impl XRTest { ) } } + +impl XRTestMethods for XRTest { + fn SimulateDeviceConnection(&self, init: &FakeXRDeviceInit) -> Rc { + 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 + } +}