fix: unsubscribe from observers when window is closing (#25554)

This commit is contained in:
Cheng Zhao 2020-09-23 10:53:32 +09:00 committed by GitHub
parent 29c6864ee1
commit 22c6c891be
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 11 additions and 10 deletions

View file

@ -32,6 +32,11 @@ class NativeWindowMac : public NativeWindow, public ui::NativeThemeObserver {
NativeWindowMac(const gin_helper::Dictionary& options, NativeWindow* parent);
~NativeWindowMac() override;
// Cleanup observers when window is getting closed. Note that the destructor
// can be called much later after window gets closed, so we should not do
// cleanup in destructor.
void Cleanup();
// NativeWindow:
void SetContentView(views::View* view) override;
void Close() override;

View file

@ -536,10 +536,12 @@ NativeWindowMac::NativeWindowMac(const gin_helper::Dictionary& options,
original_level_ = [window_ level];
}
NativeWindowMac::~NativeWindowMac() {
NativeWindowMac::~NativeWindowMac() {}
void NativeWindowMac::Cleanup() {
DCHECK(!IsClosed());
ui::NativeTheme::GetInstanceForNativeUi()->RemoveObserver(this);
if (wheel_event_monitor_)
[NSEvent removeMonitor:wheel_event_monitor_];
[NSEvent removeMonitor:wheel_event_monitor_];
}
void NativeWindowMac::RedrawTrafficLights() {
@ -635,13 +637,6 @@ void NativeWindowMac::Close() {
}
void NativeWindowMac::CloseImmediately() {
// Remove event monitor before destroying window, otherwise the monitor may
// call its callback after window has been destroyed.
if (wheel_event_monitor_) {
[NSEvent removeMonitor:wheel_event_monitor_];
wheel_event_monitor_ = nil;
}
// Retain the child window before closing it. If the last reference to the
// NSWindow goes away inside -[NSWindow close], then bad stuff can happen.
// See e.g. http://crbug.com/616701.

View file

@ -283,6 +283,7 @@ using TitleBarStyle = electron::NativeWindowMac::TitleBarStyle;
}
- (void)windowWillClose:(NSNotification*)notification {
shell_->Cleanup();
shell_->NotifyWindowClosed();
// Something called -[NSWindow close] on a sheet rather than calling