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. - 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 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 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 # 0.27.5

View file

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

View file

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