fix: remove menu observer before destroying menu_controller_ (#49658)

* fix: remove menu observer before destroying menu_controller_

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

* fix: resolves private inheritance conflict

Co-authored-by: Keeley Hammond <khammond@slack-corp.com>

---------

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Keeley Hammond <khammond@slack-corp.com>
This commit is contained in:
trop[bot]
2026-02-04 18:53:41 +01:00
committed by GitHub
parent f295327047
commit 64ef870e34
3 changed files with 13 additions and 1 deletions

View File

@@ -68,6 +68,10 @@ Menu::Menu(gin::Arguments* args)
}
Menu::~Menu() {
RemoveModelObserver();
}
void Menu::RemoveModelObserver() {
if (model_) {
model_->RemoveObserver(this);
}

View File

@@ -61,6 +61,10 @@ class Menu : public gin::Wrappable<Menu>,
ElectronMenuModel* model() const { return model_.get(); }
protected:
// Remove this instance as an observer from the model. Called by derived
// class destructors to ensure observer is removed before platform-specific
// cleanup that may trigger model callbacks.
void RemoveModelObserver();
// Returns a new callback which keeps references of the JS wrapper until the
// passed |callback| is called.
base::OnceClosure BindSelfToClosure(base::OnceClosure callback);

View File

@@ -51,7 +51,11 @@ namespace electron::api {
MenuMac::MenuMac(gin::Arguments* args) : Menu{args} {}
MenuMac::~MenuMac() = default;
MenuMac::~MenuMac() {
// Must remove observer before destroying menu_controller_, which holds
// a weak reference to model_
RemoveModelObserver();
}
void MenuMac::PopupAt(BaseWindow* window,
std::optional<WebFrameMain*> frame,