diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index c5b196b2be317..6d7aef1cdfbb1 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc @@ -1593,7 +1593,16 @@ void BrowserView::SetBounds(const gfx::Rect& bounds) { return; } + // ExitFullscreen() reaches Widget::SetFullscreen(), which on some platforms + // (macOS -[NSWindow toggleFullScreen:] nested run loop, Windows ::SetWindowPos + // synchronous WM dispatch) can run a deferred close and synchronously destroy + // `this`. See the matching guards in widget.cc:Widget::SetFullscreen and + // native_widget_ns_window_bridge.mm:FullscreenControllerToggleFullscreen. + auto weak_this = weak_ptr_factory_.GetWeakPtr(); exclusive_access_context_->ExitFullscreen(); + if (!weak_this) { + return; + } // If the BrowserFrameView has been created, give it a chance to handle the // BrowserWidget's bounds change.