aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/xrsystem.rs
diff options
context:
space:
mode:
authorJosh Matthews <josh@joshmatthews.net>2019-12-19 18:14:49 -0500
committerJosh Matthews <josh@joshmatthews.net>2020-02-24 16:27:40 -0500
commit3e95efdea62266c756b04f7557cf1bd3f36f3b87 (patch)
treef0f48934fe775f03124a6e266b30ed2619dc9302 /components/script/dom/xrsystem.rs
parentfda0572a938b95ae50cd1e7ac479cbe928028f67 (diff)
downloadservo-3e95efdea62266c756b04f7557cf1bd3f36f3b87.tar.gz
servo-3e95efdea62266c756b04f7557cf1bd3f36f3b87.zip
Avoid accessing DOM global from XR's destructor.
Diffstat (limited to 'components/script/dom/xrsystem.rs')
-rw-r--r--components/script/dom/xrsystem.rs33
1 files changed, 19 insertions, 14 deletions
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<XRSession>,
active_inline_sessions: DomRefCell<Vec<Dom<XRSession>>>,
test: MutNullableDom<XRTest>,
+ pipeline: PipelineId,
+ #[ignore_malloc_size_of = "channels are hard"]
+ webvr_thread: Option<IpcSender<WebVRMsg>>,
}
impl XRSystem {
- fn new_inherited() -> XRSystem {
+ fn new_inherited(pipeline: PipelineId, webvr_thread: Option<IpcSender<WebVRMsg>>) -> 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<XRSystem> {
+ pub fn new(window: &Window) -> DomRoot<XRSystem> {
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<Vec<DomRoot<VRDisplay>>, ()> {
- 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<IpcSender<WebVRMsg>> {
- self.global().as_window().webvr_thread()
- }
-
fn find_display(&self, display_id: u32) -> Option<DomRoot<VRDisplay>> {
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<DomRoot<Gamepad>> {
- 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