From 9e9f7767fd3bcc943aac5b2cd0e3cb64993ae5cf Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 2 Feb 2022 20:48:40 +0900 Subject: [PATCH] test: fix failing tests of focus/blur events of WebContents --- docs/api/web-contents.md | 9 +++++++++ spec-main/api-web-contents-spec.ts | 28 ++++++++++++++++------------ 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/docs/api/web-contents.md b/docs/api/web-contents.md index 8bf9d9a8b8062..ac44742ac59c1 100644 --- a/docs/api/web-contents.md +++ b/docs/api/web-contents.md @@ -516,6 +516,15 @@ Emitted when the `WebContents` loses focus. Emitted when the `WebContents` gains focus. +Note that on macOS, having focus means the `WebContents` is the first responder +of window, so switching focus between windows would not trigger the `focus` and +`blur` events of `WebContents`, as the first responder of each window is not +changed. + +The `focus` and `blur` events of `WebContents` should only be used to detect +focus change between different `WebContents` and `BrowserView` in the same +window. + #### Event: 'devtools-opened' Emitted when DevTools is opened. diff --git a/spec-main/api-web-contents-spec.ts b/spec-main/api-web-contents-spec.ts index 911947a27e6e0..3d04494a50d1a 100644 --- a/spec-main/api-web-contents-spec.ts +++ b/spec-main/api-web-contents-spec.ts @@ -826,15 +826,20 @@ describe('webContents module', () => { }); }); + const moveFocusToDevTools = async (win: BrowserWindow) => { + const devToolsOpened = emittedOnce(win.webContents, 'devtools-opened'); + win.webContents.openDevTools({ mode: 'right' }); + await devToolsOpened; + win.webContents.devToolsWebContents!.focus(); + }; + describe('focus event', () => { afterEach(closeAllWindows); + it('is triggered when web contents is focused', async () => { const w = new BrowserWindow({ show: false }); await w.loadURL('about:blank'); - const devToolsOpened = emittedOnce(w.webContents, 'devtools-opened'); - w.webContents.openDevTools(); - await devToolsOpened; - w.webContents.devToolsWebContents!.focus(); + await moveFocusToDevTools(w); const focusPromise = emittedOnce(w.webContents, 'focus'); w.webContents.focus(); await expect(focusPromise).to.eventually.be.fulfilled(); @@ -849,16 +854,17 @@ describe('webContents module', () => { window2.loadURL('about:blank') ]); + const focusPromise1 = emittedOnce(window1.webContents, 'focus'); + const focusPromise2 = emittedOnce(window2.webContents, 'focus'); + window1.showInactive(); window2.showInactive(); - let focusPromise = emittedOnce(window1.webContents, 'focus'); window1.focus(); - await expect(focusPromise).to.eventually.be.fulfilled(); + await expect(focusPromise1).to.eventually.be.fulfilled(); - focusPromise = emittedOnce(window2.webContents, 'focus'); window2.focus(); - await expect(focusPromise).to.eventually.be.fulfilled(); + await expect(focusPromise2).to.eventually.be.fulfilled(); }); }); @@ -867,11 +873,9 @@ describe('webContents module', () => { it('is triggered when web contents is blurred', async () => { const w = new BrowserWindow({ show: true }); await w.loadURL('about:blank'); + w.webContents.focus(); const blurPromise = emittedOnce(w.webContents, 'blur'); - const devToolsOpened = emittedOnce(w.webContents, 'devtools-opened'); - w.webContents.openDevTools({ mode: 'detach' }); - await devToolsOpened; - w.webContents.devToolsWebContents!.focus(); + await moveFocusToDevTools(w); await expect(blurPromise).to.eventually.be.fulfilled(); }); });