diff --git a/extensions/browser/app_window/app_window.cc b/extensions/browser/app_window/app_window.cc index b704f7e6b76d5..6bef4b5c0b58e 100644 --- a/extensions/browser/app_window/app_window.cc +++ b/extensions/browser/app_window/app_window.cc @@ -853,7 +853,15 @@ void AppWindow::DidDownloadFavicon( } void AppWindow::SetNativeWindowFullscreen() { + // The platform fullscreen transition (Widget::SetFullscreen -> + // ::SetWindowPos / [NSWindow toggleFullScreen:]) may spin a nested message + // loop and destroy `this` via OnNativeClose(). See crbug.com/1506535, + // crbug.com/498752242. + auto weak_this = weak_ptr_factory_.GetWeakPtr(); native_app_window_->SetFullscreen(fullscreen_types_); + if (!weak_this) { + return; + } RestoreAlwaysOnTop(); } diff --git a/extensions/browser/app_window/app_window.h b/extensions/browser/app_window/app_window.h index 04cca6ea0c2a3..d81320c18425e 100644 --- a/extensions/browser/app_window/app_window.h +++ b/extensions/browser/app_window/app_window.h @@ -601,6 +601,8 @@ class AppWindow : public content::WebContentsDelegate, base::OnceClosure on_update_draggable_regions_callback_for_testing_; base::WeakPtrFactory image_loader_ptr_factory_{this}; + + base::WeakPtrFactory weak_ptr_factory_{this}; }; } // namespace extensions