From 3d9bd652ed2bb4304affd2de61c53cc78913969a Mon Sep 17 00:00:00 2001 From: "Clifford T. Matthews" <ctm@devctm.com> Date: Mon, 17 Jan 2022 19:08:14 -0700 Subject: [PATCH] Uses dyn Fn instead of dyn FnMut so the callbacks are reentrant There is a bug in Firefox that can cause a panic when dyn FnMut closures are used. https://bugzilla.mozilla.org/show_bug.cgi?id=758004 For my software, simply changing the dyn FnMut to dyn Fn seems to work. Once this branch is on GitHub, I'll build a version of my software that I can deploy to where it can get tested by more people. If it still works, I'll write up a better explanation and contact scratchyone. --- src/lib.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 01f781f..60c484b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -261,7 +261,7 @@ impl EventClient { if let Some(f) = &*on_error_ref.borrow() { f.as_ref()(e); } - }) as Box<dyn FnMut(ErrorEvent)>); + }) as Box<dyn Fn(ErrorEvent)>); ws.set_onerror(Some(onerror_callback.as_ref().unchecked_ref())); onerror_callback.forget(); @@ -274,7 +274,7 @@ impl EventClient { if let Some(f) = &*on_close_ref.borrow() { f.as_ref()(); } - }) as Box<dyn FnMut()>); + }) as Box<dyn Fn()>); ws.set_onclose(Some(onclose_callback.as_ref().unchecked_ref())); onclose_callback.forget(); @@ -306,7 +306,7 @@ impl EventClient { if let Some(f) = &*on_connection_ref.borrow() { f.as_ref()(&*client_ref.clone().borrow()); } - }) as Box<dyn FnMut(JsValue)>); + }) as Box<dyn Fn(JsValue)>); connection .borrow_mut() .set_onopen(Some(onopen_callback.as_ref().unchecked_ref())); @@ -338,7 +338,7 @@ impl EventClient { f.as_ref()(&*cbfref.clone().borrow(), Message::Binary(array)); } }) - as Box<dyn FnMut(web_sys::ProgressEvent)>); + as Box<dyn Fn(web_sys::ProgressEvent)>); fr.set_onloadend(Some(onloadend_cb.as_ref().unchecked_ref())); fr.read_as_array_buffer(&blob).expect("blob not readable"); onloadend_cb.forget(); @@ -350,7 +350,7 @@ impl EventClient { // Got unknown data panic!("Unknown data: {:#?}", e.data()); } - }) as Box<dyn FnMut(MessageEvent)>); + }) as Box<dyn Fn(MessageEvent)>); // set message event handler on WebSocket connection .borrow() -- GitLab