Skip to content

Commit

Permalink
fix: potential crash calling tray.popUpContextMenu
Browse files Browse the repository at this point in the history
  • Loading branch information
codebytere committed Jul 26, 2023
1 parent e543126 commit 0234c47
Show file tree
Hide file tree
Showing 5 changed files with 20 additions and 14 deletions.
4 changes: 3 additions & 1 deletion shell/browser/api/electron_api_tray.cc
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,9 @@ void Tray::PopUpContextMenu(gin::Arguments* args) {
}
}
}
tray_icon_->PopUpContextMenu(pos, menu.IsEmpty() ? nullptr : menu->model());

tray_icon_->PopUpContextMenu(
pos, menu.IsEmpty() ? nullptr : menu->model()->GetWeakPtr());
}

void Tray::CloseContextMenu() {
Expand Down
2 changes: 1 addition & 1 deletion shell/browser/ui/tray_icon.cc
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ void TrayIcon::RemoveBalloon() {}
void TrayIcon::Focus() {}

void TrayIcon::PopUpContextMenu(const gfx::Point& pos,
raw_ptr<ElectronMenuModel> menu_model) {}
base::WeakPtr<ElectronMenuModel> menu_model) {}

Check failure on line 24 in shell/browser/ui/tray_icon.cc

View check run for this annotation

trop / Backportable? - 24-x-y

shell/browser/ui/tray_icon.cc#L24

Patch Conflict
Raw output
++<<<<<<< HEAD
 +                                ElectronMenuModel* menu_model) {}
++=======
+                                 base::WeakPtr<ElectronMenuModel> menu_model) {}
++>>>>>>> fix: potential crash calling tray.popUpContextMenu

Check failure on line 24 in shell/browser/ui/tray_icon.cc

View check run for this annotation

trop / Backportable? - 25-x-y

shell/browser/ui/tray_icon.cc#L24

Patch Conflict
Raw output
++<<<<<<< HEAD
 +                                ElectronMenuModel* menu_model) {}
++=======
+                                 base::WeakPtr<ElectronMenuModel> menu_model) {}
++>>>>>>> fix: potential crash calling tray.popUpContextMenu

void TrayIcon::CloseContextMenu() {}

Expand Down
2 changes: 1 addition & 1 deletion shell/browser/ui/tray_icon.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ class TrayIcon {

// Popups the menu.
virtual void PopUpContextMenu(const gfx::Point& pos,
raw_ptr<ElectronMenuModel> menu_model);
base::WeakPtr<ElectronMenuModel> menu_model);

Check failure on line 92 in shell/browser/ui/tray_icon.h

View check run for this annotation

trop / Backportable? - 24-x-y

shell/browser/ui/tray_icon.h#L92

Patch Conflict
Raw output
++<<<<<<< HEAD
 +                                ElectronMenuModel* menu_model);
++=======
+                                 base::WeakPtr<ElectronMenuModel> menu_model);
++>>>>>>> fix: potential crash calling tray.popUpContextMenu

Check failure on line 92 in shell/browser/ui/tray_icon.h

View check run for this annotation

trop / Backportable? - 25-x-y

shell/browser/ui/tray_icon.h#L92

Patch Conflict
Raw output
++<<<<<<< HEAD
 +                                ElectronMenuModel* menu_model);
++=======
+                                 base::WeakPtr<ElectronMenuModel> menu_model);
++>>>>>>> fix: potential crash calling tray.popUpContextMenu

virtual void CloseContextMenu();

Expand Down
6 changes: 3 additions & 3 deletions shell/browser/ui/tray_icon_cocoa.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,11 @@ class TrayIconCocoa : public TrayIcon {
std::string GetTitle() override;
void SetIgnoreDoubleClickEvents(bool ignore) override;
bool GetIgnoreDoubleClickEvents() override;
void PopUpOnUI(ElectronMenuModel* menu_model);
void PopUpOnUI(base::WeakPtr<ElectronMenuModel> menu_model);
void PopUpContextMenu(const gfx::Point& pos,
raw_ptr<ElectronMenuModel>) override;
base::WeakPtr<ElectronMenuModel> menu_model) override;

Check failure on line 37 in shell/browser/ui/tray_icon_cocoa.h

View check run for this annotation

trop / Backportable? - 24-x-y

shell/browser/ui/tray_icon_cocoa.h#L35-L37

Patch Conflict
Raw output
++<<<<<<< HEAD
 +                        ElectronMenuModel* menu_model) override;
 +  void CloseContextMenu() override;
 +  void SetContextMenu(ElectronMenuModel* menu_model) override;
++=======
+                         base::WeakPtr<ElectronMenuModel> menu_model) override;
+   void CloseContextMenu() override;
+   void SetContextMenu(raw_ptr<ElectronMenuModel> menu_model) override;
++>>>>>>> fix: potential crash calling tray.popUpContextMenu

Check failure on line 37 in shell/browser/ui/tray_icon_cocoa.h

View check run for this annotation

trop / Backportable? - 25-x-y

shell/browser/ui/tray_icon_cocoa.h#L35-L37

Patch Conflict
Raw output
++<<<<<<< HEAD
 +                        ElectronMenuModel* menu_model) override;
 +  void CloseContextMenu() override;
 +  void SetContextMenu(ElectronMenuModel* menu_model) override;
++=======
+                         base::WeakPtr<ElectronMenuModel> menu_model) override;
+   void CloseContextMenu() override;
+   void SetContextMenu(raw_ptr<ElectronMenuModel> menu_model) override;
++>>>>>>> fix: potential crash calling tray.popUpContextMenu
void CloseContextMenu() override;
void SetContextMenu(raw_ptr<ElectronMenuModel>) override;
void SetContextMenu(raw_ptr<ElectronMenuModel> menu_model) override;
gfx::Rect GetBounds() override;

private:
Expand Down
20 changes: 12 additions & 8 deletions shell/browser/ui/tray_icon_cocoa.mm
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,11 @@ - (void)removeItem {
[self removeTrackingArea:trackingArea_];
trackingArea_ = nil;
}

// Ensure any open menu is closed.
if ([statusItem_ menu])
[[statusItem_ menu] cancelTracking];

[[NSStatusBar systemStatusBar] removeStatusItem:statusItem_];
[self removeFromSuperview];
statusItem_ = nil;
Expand Down Expand Up @@ -228,7 +233,6 @@ - (void)popUpContextMenu:(electron::ElectronMenuModel*)menu_model {
if (menuController_ && ![menuController_ isMenuOpen]) {
// Ensure the UI can update while the menu is fading out.
base::ScopedPumpMessagesInPrivateModes pump_private;

[[statusItem_ button] performClick:self];
}
}
Expand Down Expand Up @@ -354,16 +358,16 @@ - (BOOL)performDragOperation:(id<NSDraggingInfo>)sender {
return [status_item_view_ getIgnoreDoubleClickEvents];
}

void TrayIconCocoa::PopUpOnUI(ElectronMenuModel* menu_model) {
[status_item_view_ popUpContextMenu:menu_model];
void TrayIconCocoa::PopUpOnUI(base::WeakPtr<ElectronMenuModel> menu_model) {
[status_item_view_ popUpContextMenu:menu_model.get()];
}

void TrayIconCocoa::PopUpContextMenu(const gfx::Point& pos,
raw_ptr<ElectronMenuModel> menu_model) {
void TrayIconCocoa::PopUpContextMenu(
const gfx::Point& pos,
base::WeakPtr<ElectronMenuModel> menu_model) {
content::GetUIThreadTaskRunner({})->PostTask(
FROM_HERE,
base::BindOnce(&TrayIconCocoa::PopUpOnUI, weak_factory_.GetWeakPtr(),
base::Unretained(menu_model)));
FROM_HERE, base::BindOnce(&TrayIconCocoa::PopUpOnUI,
weak_factory_.GetWeakPtr(), menu_model));
}

Check failure on line 372 in shell/browser/ui/tray_icon_cocoa.mm

View check run for this annotation

trop / Backportable? - 24-x-y

shell/browser/ui/tray_icon_cocoa.mm#L371-L372

Patch Conflict
Raw output
++<<<<<<< HEAD
 +void TrayIconCocoa::PopUpContextMenu(const gfx::Point& pos,
 +                                     ElectronMenuModel* menu_model) {
++=======
+ void TrayIconCocoa::PopUpContextMenu(
+     const gfx::Point& pos,
+     base::WeakPtr<ElectronMenuModel> menu_model) {
++>>>>>>> fix: potential crash calling tray.popUpContextMenu

Check failure on line 372 in shell/browser/ui/tray_icon_cocoa.mm

View check run for this annotation

trop / Backportable? - 25-x-y

shell/browser/ui/tray_icon_cocoa.mm#L371-L372

Patch Conflict
Raw output
++<<<<<<< HEAD
 +void TrayIconCocoa::PopUpContextMenu(const gfx::Point& pos,
 +                                     ElectronMenuModel* menu_model) {
++=======
+ void TrayIconCocoa::PopUpContextMenu(
+     const gfx::Point& pos,
+     base::WeakPtr<ElectronMenuModel> menu_model) {
++>>>>>>> fix: potential crash calling tray.popUpContextMenu
void TrayIconCocoa::CloseContextMenu() {
Expand Down

0 comments on commit 0234c47

Please sign in to comment.