Removed tracking area when removing icon to prevent mouse exit race condition crash

This commit is contained in:
Matt Way 2017-11-28 18:20:38 +10:00 committed by Cheng Zhao
parent 83b351a8fd
commit 638d8219c4

View file

@ -33,6 +33,7 @@ const CGFloat kVerticalTitleMargin = 2;
base::scoped_nsobject<NSString> title_;
base::scoped_nsobject<NSMutableAttributedString> attributedTitle_;
base::scoped_nsobject<NSStatusItem> statusItem_;
NSTrackingArea *trackingArea_;
}
@end // @interface StatusItemView
@ -61,12 +62,12 @@ const CGFloat kVerticalTitleMargin = 2;
[self updateDimensions];
// Add NSTrackingArea for listening to mouseEnter, mouseExit, and mouseMove events
auto trackingArea = [[[NSTrackingArea alloc]
trackingArea_ = [[[NSTrackingArea alloc]
initWithRect:[self bounds]
options:NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingActiveAlways
owner:self
userInfo:nil] autorelease];
[self addTrackingArea:trackingArea];
[self addTrackingArea:trackingArea_];
}
return self;
}
@ -78,6 +79,8 @@ const CGFloat kVerticalTitleMargin = 2;
}
- (void)removeItem {
// Turn off tracking events to prevent crash
[self removeTrackingArea:trackingArea_];
[[NSStatusBar systemStatusBar] removeStatusItem:statusItem_];
statusItem_.reset();
}
@ -399,8 +402,9 @@ TrayIconCocoa::TrayIconCocoa() : menu_model_(nullptr) {
TrayIconCocoa::~TrayIconCocoa() {
[status_item_view_ removeItem];
if (menu_model_)
if (menu_model_){
menu_model_->RemoveObserver(this);
}
}
void TrayIconCocoa::SetImage(const gfx::Image& image) {