Properly remove window mouse event listeners (#2632)

* Properly remove window mouse event listeners

* Update CHANGELOG.md

* Fix formatting

Co-authored-by: Mads Marquart <mads@marquart.dk>
This commit is contained in:
Douglas Dwyer 2023-01-21 10:58:05 -05:00 committed by GitHub
parent 809162fbd0
commit b711a11549
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 8 additions and 2 deletions

View file

@ -61,6 +61,7 @@ And please only add new entries to the top of this list, right below the `# Unre
- Added `Window::set_transparent` to provide a hint about transparency of the window on Wayland and macOS.
- On macOS, fix the mouse buttons other than left/right/middle being reported as middle.
- On Wayland, support fractional scaling via the wp-fractional-scale protocol.
- On web, fix removal of mouse event listeners from the global object upon window distruction.
# 0.27.5

View file

@ -133,6 +133,7 @@ features = [
'DomRect',
'Element',
'Event',
"EventListenerOptions",
'EventTarget',
'FocusEvent',
'HtmlCanvasElement',

View file

@ -1,10 +1,11 @@
use wasm_bindgen::{prelude::Closure, JsCast};
use web_sys::{AddEventListenerOptions, EventTarget};
use web_sys::{AddEventListenerOptions, EventListenerOptions, EventTarget};
pub(super) struct EventListenerHandle<T: ?Sized> {
target: EventTarget,
event_type: &'static str,
listener: Closure<T>,
options: EventListenerOptions,
}
impl<T: ?Sized> EventListenerHandle<T> {
@ -20,6 +21,7 @@ impl<T: ?Sized> EventListenerHandle<T> {
target,
event_type,
listener,
options: EventListenerOptions::new(),
}
}
@ -44,6 +46,7 @@ impl<T: ?Sized> EventListenerHandle<T> {
target,
event_type,
listener,
options: options.clone().unchecked_into(),
}
}
}
@ -51,9 +54,10 @@ impl<T: ?Sized> EventListenerHandle<T> {
impl<T: ?Sized> Drop for EventListenerHandle<T> {
fn drop(&mut self) {
self.target
.remove_event_listener_with_callback(
.remove_event_listener_with_callback_and_event_listener_options(
self.event_type,
self.listener.as_ref().unchecked_ref(),
&self.options,
)
.unwrap_or_else(|e| {
web_sys::console::error_2(