From c2c1d40294d5e092e3138adf93e00d536dd949f4 Mon Sep 17 00:00:00 2001 From: "trop[bot]" <37223003+trop[bot]@users.noreply.github.com> Date: Sun, 23 Nov 2025 21:35:47 +0100 Subject: [PATCH] fix: only call popup closecallback for top-level menu (#49045) Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com> Co-authored-by: Shelley Vohr --- .../ui/cocoa/electron_menu_controller.mm | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/shell/browser/ui/cocoa/electron_menu_controller.mm b/shell/browser/ui/cocoa/electron_menu_controller.mm index 56691ec9ef90..77e22fa49a81 100644 --- a/shell/browser/ui/cocoa/electron_menu_controller.mm +++ b/shell/browser/ui/cocoa/electron_menu_controller.mm @@ -563,16 +563,22 @@ NSArray* ConvertSharingItemToNS(const SharingItem& item) { } - (void)menuDidClose:(NSMenu*)menu { - if (isMenuOpen_) { - isMenuOpen_ = NO; - if (model_) - model_->MenuWillClose(); - // Post async task so that itemSelected runs before the close callback - // deletes the controller from the map which deallocates it - if (!closeCallback.is_null()) { - content::GetUIThreadTaskRunner({})->PostTask(FROM_HERE, - std::move(closeCallback)); - } + // If the menu is already closed, do nothing. + if (!isMenuOpen_) + return; + + // We should only respond to the top-level menu's close event. + if (menu != menu_) + return; + + isMenuOpen_ = NO; + if (model_) + model_->MenuWillClose(); + // Post async task so that itemSelected runs before the close callback + // deletes the controller from the map which deallocates it + if (!closeCallback.is_null()) { + content::GetUIThreadTaskRunner({})->PostTask(FROM_HERE, + std::move(closeCallback)); } }