Browse Source

fix: Correct modal focus behavior on macOS (#19061)

* wip: wish i could hack the main window focus away

* main -> key

* remove useless code

* test: Add focus event spec

* test: more robust spec

* test: simplify test

* duplicate non-firing macOS event listener 😳

* destroy 🚨

* chore: remove unused variable
trop[bot] 5 years ago
parent
commit
b9605cc602
2 changed files with 29 additions and 2 deletions
  1. 2 2
      atom/browser/ui/cocoa/atom_ns_window_delegate.mm
  2. 27 0
      spec/api-browser-window-spec.js

+ 2 - 2
atom/browser/ui/cocoa/atom_ns_window_delegate.mm

@@ -83,11 +83,11 @@
   return frame;
 }
 
-- (void)windowDidBecomeMain:(NSNotification*)notification {
+- (void)windowDidBecomeKey:(NSNotification*)notification {
   shell_->NotifyWindowFocus();
 }
 
-- (void)windowDidResignMain:(NSNotification*)notification {
+- (void)windowDidResignKey:(NSNotification*)notification {
   shell_->NotifyWindowBlur();
 }
 

+ 27 - 0
spec/api-browser-window-spec.js

@@ -2330,6 +2330,33 @@ describe('BrowserWindow module', () => {
     })
   })
 
+  describe('focus event', () => {
+    it('should not emit if focusing on a main window with a modal open', (done) => {
+      const child = new BrowserWindow({
+        parent: w,
+        modal: true,
+        show: false
+      })
+
+      child.once('ready-to-show', () => {
+        child.show()
+      })
+
+      child.on('show', () => {
+        w.once('focus', () => {
+          expect(child.isDestroyed()).to.equal(true)
+          done()
+        })
+        w.focus() // this should not trigger the above listener
+        child.close()
+      })
+
+      // act
+      child.loadURL(server.url)
+      w.show()
+    })
+  })
+
   describe('sheet-begin event', () => {
     let sheet = null