diff --git a/components/script/dom/vrdisplay.rs b/components/script/dom/vrdisplay.rs index f595952b07a..4b3f7426dda 100644 --- a/components/script/dom/vrdisplay.rs +++ b/components/script/dom/vrdisplay.rs @@ -23,7 +23,6 @@ use crate::dom::bindings::root::{DomRoot, MutDom, MutNullableDom}; use crate::dom::bindings::str::DOMString; use crate::dom::event::Event; use crate::dom::eventtarget::EventTarget; -use crate::dom::globalscope::GlobalScope; use crate::dom::promise::Promise; use crate::dom::vrdisplaycapabilities::VRDisplayCapabilities; use crate::dom::vrdisplayevent::VRDisplayEvent; @@ -32,6 +31,7 @@ use crate::dom::vrframedata::VRFrameData; use crate::dom::vrpose::VRPose; use crate::dom::vrstageparameters::VRStageParameters; use crate::dom::webglrenderingcontext::{WebGLMessageSender, WebGLRenderingContext}; +use crate::dom::window::Window; use crate::realms::InRealm; use crate::script_runtime::CommonScriptMsg; use crate::script_runtime::ScriptThreadEventCategory::WebVREvent; @@ -40,6 +40,7 @@ use canvas_traits::webgl::{webgl_channel, WebGLReceiver, WebVRCommand}; use crossbeam_channel::{unbounded, Sender}; use dom_struct::dom_struct; use ipc_channel::ipc::IpcSender; +use msg::constellation_msg::PipelineId; use profile_traits::ipc; use std::cell::Cell; use std::mem; @@ -82,6 +83,9 @@ pub struct VRDisplay { running_display_raf: Cell, paused: Cell, stopped_on_pause: Cell, + #[ignore_malloc_size_of = "channels are hard"] + webvr_thread: IpcSender, + pipeline: PipelineId, } unsafe_no_jsmanaged_fields!(WebVRDisplayData); @@ -110,7 +114,7 @@ struct VRRAFUpdate { type VRRAFUpdateSender = Sender>; impl VRDisplay { - fn new_inherited(global: &GlobalScope, display: WebVRDisplayData) -> VRDisplay { + fn new_inherited(global: &Window, display: WebVRDisplayData) -> VRDisplay { let stage = match display.stage_parameters { Some(ref params) => Some(VRStageParameters::new(params.clone(), &global)), None => None, @@ -152,10 +156,12 @@ impl VRDisplay { // This flag is set when the Display was presenting when it received a VR Pause event. // When the VR Resume event is received and the flag is set, VR presentation automatically restarts. stopped_on_pause: Cell::new(false), + webvr_thread: global.webvr_thread().expect("webvr is disabled"), + pipeline: global.pipeline_id(), } } - pub fn new(global: &GlobalScope, display: WebVRDisplayData) -> DomRoot { + pub fn new(global: &Window, display: WebVRDisplayData) -> DomRoot { reflect_dom_object( Box::new(VRDisplay::new_inherited(&global, display)), global, @@ -229,7 +235,7 @@ impl VRDisplayMethods for VRDisplay { // If not presenting we fetch inmediante VRFrameData let (sender, receiver) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap(); - self.webvr_thread() + self.webvr_thread .send(WebVRMsg::GetFrameData( self.global().pipeline_id(), self.DisplayId(), @@ -258,7 +264,7 @@ impl VRDisplayMethods for VRDisplay { // https://w3c.github.io/webvr/#dom-vrdisplay-resetpose fn ResetPose(&self) { let (sender, receiver) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap(); - self.webvr_thread() + self.webvr_thread .send(WebVRMsg::ResetPose( self.global().pipeline_id(), self.DisplayId(), @@ -398,7 +404,7 @@ impl VRDisplayMethods for VRDisplay { // Exit present let (sender, receiver) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap(); - self.webvr_thread() + self.webvr_thread .send(WebVRMsg::ExitPresent( self.global().pipeline_id(), self.display.borrow().display_id, @@ -452,18 +458,14 @@ impl VRDisplayMethods for VRDisplay { } impl VRDisplay { - fn webvr_thread(&self) -> IpcSender { - self.global() - .as_window() - .webvr_thread() - .expect("Shouldn't arrive here with WebVR disabled") - } - pub fn update_display(&self, display: &WebVRDisplayData) { *self.display.borrow_mut() = display.clone(); if let Some(ref stage) = display.stage_parameters { if self.stage_params.get().is_none() { - let params = Some(VRStageParameters::new(stage.clone(), &self.global())); + let params = Some(VRStageParameters::new( + stage.clone(), + &self.global().as_window(), + )); self.stage_params.set(params.as_deref()); } else { self.stage_params.get().unwrap().update(&stage); @@ -484,7 +486,7 @@ impl VRDisplay { { // Request Present let (sender, receiver) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap(); - self.webvr_thread() + self.webvr_thread .send(WebVRMsg::RequestPresent( self.global().pipeline_id(), self.display.borrow().display_id, @@ -730,7 +732,7 @@ impl VRDisplay { // Only called when the JSContext is destroyed while presenting. // In this case we don't want to wait for WebVR Thread response. fn force_stop_present(&self) { - self.webvr_thread() + self.webvr_thread .send(WebVRMsg::ExitPresent( self.global().pipeline_id(), self.display.borrow().display_id, diff --git a/components/script/dom/vrdisplaycapabilities.rs b/components/script/dom/vrdisplaycapabilities.rs index 858c40978a7..214ee617e1c 100644 --- a/components/script/dom/vrdisplaycapabilities.rs +++ b/components/script/dom/vrdisplaycapabilities.rs @@ -7,7 +7,7 @@ use crate::dom::bindings::codegen::Bindings::VRDisplayCapabilitiesBinding; use crate::dom::bindings::codegen::Bindings::VRDisplayCapabilitiesBinding::VRDisplayCapabilitiesMethods; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::DomRoot; -use crate::dom::globalscope::GlobalScope; +use crate::dom::window::Window; use dom_struct::dom_struct; use webvr_traits::WebVRDisplayCapabilities; @@ -30,7 +30,7 @@ impl VRDisplayCapabilities { pub fn new( capabilities: WebVRDisplayCapabilities, - global: &GlobalScope, + global: &Window, ) -> DomRoot { reflect_dom_object( Box::new(VRDisplayCapabilities::new_inherited(capabilities)), diff --git a/components/script/dom/vreyeparameters.rs b/components/script/dom/vreyeparameters.rs index a7463c34a28..c908b23540d 100644 --- a/components/script/dom/vreyeparameters.rs +++ b/components/script/dom/vreyeparameters.rs @@ -7,8 +7,8 @@ use crate::dom::bindings::codegen::Bindings::VREyeParametersBinding; use crate::dom::bindings::codegen::Bindings::VREyeParametersBinding::VREyeParametersMethods; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::{Dom, DomRoot}; -use crate::dom::globalscope::GlobalScope; use crate::dom::vrfieldofview::VRFieldOfView; +use crate::dom::window::Window; use crate::script_runtime::JSContext; use dom_struct::dom_struct; use js::jsapi::{Heap, JSObject}; @@ -41,7 +41,7 @@ impl VREyeParameters { } #[allow(unsafe_code)] - pub fn new(parameters: WebVREyeParameters, global: &GlobalScope) -> DomRoot { + pub fn new(parameters: WebVREyeParameters, global: &Window) -> DomRoot { let fov = VRFieldOfView::new(&global, parameters.field_of_view.clone()); let cx = global.get_cx(); diff --git a/components/script/dom/vrfieldofview.rs b/components/script/dom/vrfieldofview.rs index 25a01daaf16..8009f6a2461 100644 --- a/components/script/dom/vrfieldofview.rs +++ b/components/script/dom/vrfieldofview.rs @@ -8,7 +8,7 @@ use crate::dom::bindings::codegen::Bindings::VRFieldOfViewBinding::VRFieldOfView use crate::dom::bindings::num::Finite; use crate::dom::bindings::reflector::{reflect_dom_object, Reflector}; use crate::dom::bindings::root::DomRoot; -use crate::dom::globalscope::GlobalScope; +use crate::dom::window::Window; use dom_struct::dom_struct; use webvr_traits::WebVRFieldOfView; @@ -29,7 +29,7 @@ impl VRFieldOfView { } } - pub fn new(global: &GlobalScope, fov: WebVRFieldOfView) -> DomRoot { + pub fn new(global: &Window, fov: WebVRFieldOfView) -> DomRoot { reflect_dom_object( Box::new(VRFieldOfView::new_inherited(fov)), global, diff --git a/components/script/dom/vrstageparameters.rs b/components/script/dom/vrstageparameters.rs index 747608763e9..e9df89364c4 100644 --- a/components/script/dom/vrstageparameters.rs +++ b/components/script/dom/vrstageparameters.rs @@ -8,7 +8,7 @@ use crate::dom::bindings::codegen::Bindings::VRStageParametersBinding::VRStagePa use crate::dom::bindings::num::Finite; use crate::dom::bindings::reflector::{reflect_dom_object, DomObject, Reflector}; use crate::dom::bindings::root::DomRoot; -use crate::dom::globalscope::GlobalScope; +use crate::dom::window::Window; use crate::script_runtime::JSContext; use dom_struct::dom_struct; use js::jsapi::{Heap, JSObject}; @@ -38,10 +38,7 @@ impl VRStageParameters { } #[allow(unsafe_code)] - pub fn new( - parameters: WebVRStageParameters, - global: &GlobalScope, - ) -> DomRoot { + pub fn new(parameters: WebVRStageParameters, global: &Window) -> DomRoot { let cx = global.get_cx(); rooted!(in (*cx) let mut array = ptr::null_mut::()); unsafe { diff --git a/components/script/dom/xrsystem.rs b/components/script/dom/xrsystem.rs index e397a4fc0b2..ec7502fa3d4 100644 --- a/components/script/dom/xrsystem.rs +++ b/components/script/dom/xrsystem.rs @@ -364,7 +364,7 @@ impl XRSystem { existing.update_display(&display); existing } else { - let root = VRDisplay::new(&self.global(), display.clone()); + let root = VRDisplay::new(&self.global().as_window(), display.clone()); self.displays.borrow_mut().push(Dom::from_ref(&*root)); root }