Browse Source

fix: close context menu before popup (#17474)

Cheng Zhao 6 years ago
parent
commit
49f13e38f9
2 changed files with 21 additions and 0 deletions
  1. 4 0
      atom/browser/ui/win/notify_icon.cc
  2. 17 0
      spec/api-tray-spec.js

+ 4 - 0
atom/browser/ui/win/notify_icon.cc

@@ -142,6 +142,10 @@ void NotifyIcon::PopUpContextMenu(const gfx::Point& pos,
   if (!SetForegroundWindow(window_))
     return;
 
+  // Cancel current menu if there is one.
+  if (menu_runner_ && menu_runner_->IsRunning())
+    menu_runner_->Cancel();
+
   // Show menu at mouse's position by default.
   gfx::Rect rect(pos, gfx::Size());
   if (pos.IsOrigin())

+ 17 - 0
spec/api-tray-spec.js

@@ -24,6 +24,23 @@ describe('tray module', () => {
     })
   })
 
+  describe('tray.popUpContextMenu', () => {
+    before(function () {
+      if (process.platform !== 'win32') {
+        this.skip()
+      }
+    })
+
+    it('can be called when menu is showing', (done) => {
+      tray.setContextMenu(Menu.buildFromTemplate([{ label: 'Test' }]))
+      setTimeout(() => {
+        tray.popUpContextMenu()
+        done()
+      })
+      tray.popUpContextMenu()
+    })
+  })
+
   describe('tray.setImage', () => {
     it('accepts empty image', () => {
       tray.setImage(nativeImage.createEmpty())