Skip to content

Commit e4463f0

Browse files
authored
fix(event): clear residual js listeners (#8916 ) (#8930)
* fix clear residual listeners #8916 * Comment out `println` on successful removal of `js_listeners` * follow review changes. * remvoe uneeded result * Update fix-clear-residual-listeners.md
1 parent f5f3ed5 commit e4463f0

File tree

3 files changed

+30
-10
lines changed

3 files changed

+30
-10
lines changed
+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"tauri": patch:bug
3+
---
4+
5+
Clear JS event listeneres on page load, which fixes zombie listeners when the page reloads.

core/tauri/src/event/listener.rs

+6
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,12 @@ impl Listeners {
271271
}
272272
}
273273

274+
pub(crate) fn unlisten_all_js(&self, webview_label: &str) {
275+
let inner_listeners = self.inner.as_ref();
276+
let mut js_listeners = inner_listeners.js_event_listeners.lock().unwrap();
277+
js_listeners.remove(webview_label);
278+
}
279+
274280
pub(crate) fn has_js_listener<F: Fn(&EventTarget) -> bool>(
275281
&self,
276282
event: &str,

core/tauri/src/webview/mod.rs

+19-10
Original file line numberDiff line numberDiff line change
@@ -568,17 +568,20 @@ tauri::Builder::default()
568568
}));
569569
}
570570

571-
if let Some(on_page_load_handler) = self.on_page_load_handler.take() {
572-
let label = pending.label.clone();
573-
let manager = manager.manager_owned();
574-
pending
575-
.on_page_load_handler
576-
.replace(Box::new(move |url, event| {
577-
if let Some(w) = manager.get_webview(&label) {
578-
on_page_load_handler(w, PageLoadPayload { url: &url, event });
571+
let label_ = pending.label.clone();
572+
let manager_ = manager.manager_owned();
573+
pending
574+
.on_page_load_handler
575+
.replace(Box::new(move |url, event| {
576+
if let Some(w) = manager_.get_webview(&label_) {
577+
if let PageLoadEvent::Finished = event {
578+
w.unlisten_all_js();
579579
}
580-
}));
581-
}
580+
if let Some(handler) = self.on_page_load_handler.as_ref() {
581+
handler(w, PageLoadPayload { url: &url, event });
582+
}
583+
}
584+
}));
582585

583586
manager.manager().webview.prepare_webview(
584587
manager,
@@ -1317,6 +1320,12 @@ fn main() {
13171320
Ok(())
13181321
}
13191322

1323+
/// Unregister all JS event listeners.
1324+
pub(crate) fn unlisten_all_js(&self) {
1325+
let listeners = self.manager().listeners();
1326+
listeners.unlisten_all_js(self.label());
1327+
}
1328+
13201329
pub(crate) fn emit_js(&self, emit_args: &EmitArgs, target: &EventTarget) -> crate::Result<()> {
13211330
self.eval(&crate::event::emit_js_script(
13221331
self.manager().listeners().function_name(),

0 commit comments

Comments
 (0)