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