Skip to content

Commit 4c8bb98

Browse files
fix: Listeners::once can be called multiple times (#15475)
* fix: `Listeners::once` can be called multiple times * typo
1 parent c6fce82 commit 4c8bb98

2 files changed

Lines changed: 22 additions & 1 deletion

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"tauri": "patch:bug"
3+
---
4+
5+
Fix `Listener::once` can be called multiple times if they trigger `emit`(s) inside the handler

crates/tauri/src/event/listener.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,11 +168,11 @@ impl Listeners {
168168

169169
self.listen(event, target, move |event| {
170170
let id = event.id;
171+
self_.unlisten(id);
171172
let handler = handler
172173
.take()
173174
.expect("attempted to call handler more than once");
174175
handler(event);
175-
self_.unlisten(id);
176176
})
177177
}
178178

@@ -382,4 +382,20 @@ mod test {
382382
assert!(l.contains_key(&key));
383383
}
384384
}
385+
386+
#[test]
387+
fn event_no_deadlocks() {
388+
let listeners = Listeners::default();
389+
let listeners_clone = listeners.clone();
390+
let event = crate::EventName::new("test-event".to_owned()).unwrap();
391+
let event_clone = event.clone();
392+
listeners.once(event.clone(), EventTarget::Any, move |_event| {
393+
listeners_clone
394+
.emit(EmitArgs::new(event_clone.as_str_event(), &()).unwrap())
395+
.unwrap();
396+
});
397+
listeners
398+
.emit(EmitArgs::new(event.as_str_event(), &()).unwrap())
399+
.unwrap();
400+
}
385401
}

0 commit comments

Comments
 (0)