diff --git a/components/script/dom/navigator.rs b/components/script/dom/navigator.rs index 690eb72abd3..b297b02bc69 100644 --- a/components/script/dom/navigator.rs +++ b/components/script/dom/navigator.rs @@ -184,7 +184,8 @@ impl NavigatorMethods for Navigator { /// https://immersive-web.github.io/webxr/#dom-navigator-xr fn Xr(&self) -> DomRoot { - self.xr.or_init(|| XRSystem::new(&self.global())) + self.xr + .or_init(|| XRSystem::new(&self.global().as_window())) } /// https://w3c.github.io/mediacapture-main/#dom-navigator-mediadevices diff --git a/components/script/dom/xrsystem.rs b/components/script/dom/xrsystem.rs index ec7502fa3d4..8a8f109722b 100644 --- a/components/script/dom/xrsystem.rs +++ b/components/script/dom/xrsystem.rs @@ -18,10 +18,10 @@ use crate::dom::event::Event; use crate::dom::eventtarget::EventTarget; use crate::dom::gamepad::Gamepad; use crate::dom::gamepadevent::GamepadEventType; -use crate::dom::globalscope::GlobalScope; use crate::dom::promise::Promise; use crate::dom::vrdisplay::VRDisplay; use crate::dom::vrdisplayevent::VRDisplayEvent; +use crate::dom::window::Window; use crate::dom::xrsession::XRSession; use crate::dom::xrtest::XRTest; use crate::realms::InRealm; @@ -30,6 +30,7 @@ use crate::task_source::TaskSource; use dom_struct::dom_struct; use ipc_channel::ipc::{self as ipc_crate, IpcReceiver, IpcSender}; use ipc_channel::router::ROUTER; +use msg::constellation_msg::PipelineId; use profile_traits::ipc; use std::cell::Cell; use std::rc::Rc; @@ -46,10 +47,13 @@ pub struct XRSystem { active_immersive_session: MutNullableDom, active_inline_sessions: DomRefCell>>, test: MutNullableDom, + pipeline: PipelineId, + #[ignore_malloc_size_of = "channels are hard"] + webvr_thread: Option>, } impl XRSystem { - fn new_inherited() -> XRSystem { + fn new_inherited(pipeline: PipelineId, webvr_thread: Option>) -> XRSystem { XRSystem { eventtarget: EventTarget::new_inherited(), displays: DomRefCell::new(Vec::new()), @@ -58,13 +62,18 @@ impl XRSystem { active_immersive_session: Default::default(), active_inline_sessions: DomRefCell::new(Vec::new()), test: Default::default(), + pipeline, + webvr_thread, } } - pub fn new(global: &GlobalScope) -> DomRoot { + pub fn new(window: &Window) -> DomRoot { let root = reflect_dom_object( - Box::new(XRSystem::new_inherited()), - global, + Box::new(XRSystem::new_inherited( + window.pipeline_id(), + window.webvr_thread(), + )), + window, XRSystemBinding::Wrap, ); root.register(); @@ -304,7 +313,7 @@ impl XRSystem { } pub fn get_displays(&self) -> Result>, ()> { - if let Some(webvr_thread) = self.webvr_thread() { + if let Some(ref webvr_thread) = self.webvr_thread { let (sender, receiver) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap(); webvr_thread.send(WebVRMsg::GetDisplays(sender)).unwrap(); @@ -333,10 +342,6 @@ impl XRSystem { .collect()) } - fn webvr_thread(&self) -> Option> { - self.global().as_window().webvr_thread() - } - fn find_display(&self, display_id: u32) -> Option> { self.displays .borrow() @@ -346,15 +351,15 @@ impl XRSystem { } fn register(&self) { - if let Some(webvr_thread) = self.webvr_thread() { + if let Some(ref webvr_thread) = self.webvr_thread { let msg = WebVRMsg::RegisterContext(self.global().pipeline_id()); webvr_thread.send(msg).unwrap(); } } fn unregister(&self) { - if let Some(webvr_thread) = self.webvr_thread() { - let msg = WebVRMsg::UnregisterContext(self.global().pipeline_id()); + if let Some(ref webvr_thread) = self.webvr_thread { + let msg = WebVRMsg::UnregisterContext(self.pipeline); webvr_thread.send(msg).unwrap(); } } @@ -474,7 +479,7 @@ impl XRSystem { // guarantees that the gamepads always have a valid state and can be very useful for // motion capture or drawing applications. pub fn get_gamepads(&self) -> Vec> { - if let Some(wevbr_sender) = self.webvr_thread() { + if let Some(ref wevbr_sender) = self.webvr_thread { let (sender, receiver) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap(); let synced_ids = self