diff --git a/lib/browser/guest-view-manager.js b/lib/browser/guest-view-manager.js index 0bf1f6db7e81..731f82838af3 100644 --- a/lib/browser/guest-view-manager.js +++ b/lib/browser/guest-view-manager.js @@ -143,6 +143,15 @@ const createGuest = function (embedder, params) { sendToEmbedder('ELECTRON_GUEST_VIEW_INTERNAL_SIZE_CHANGED', ...args) }) + // Notify guest of embedder window visibility when it is ready + // FIXME Remove once https://github.com/electron/electron/issues/6828 is fixed + guest.on('dom-ready', function () { + const guestInstance = guestInstances[guestInstanceId] + if (guestInstance != null && guestInstance.visibilityState != null) { + guest.send('ELECTRON_GUEST_INSTANCE_VISIBILITY_CHANGE', guestInstance.visibilityState) + } + }) + // Forward internal web contents event to embedder to handle // native window.open setup guest.on('-add-new-contents', (...args) => { @@ -280,6 +289,7 @@ const watchEmbedder = function (embedder) { const onVisibilityChange = function (visibilityState) { for (const guestInstanceId of Object.keys(guestInstances)) { const guestInstance = guestInstances[guestInstanceId] + guestInstance.visibilityState = visibilityState if (guestInstance.embedder === embedder) { guestInstance.guest.send('ELECTRON_GUEST_INSTANCE_VISIBILITY_CHANGE', visibilityState) } diff --git a/spec/webview-spec.js b/spec/webview-spec.js index f6aa3d18c5ea..5b5922e7d394 100644 --- a/spec/webview-spec.js +++ b/spec/webview-spec.js @@ -1097,25 +1097,50 @@ describe(' tag', function () { }) }) - it('inherits the parent window visibility state and receives visibilitychange events', function (done) { - w = new BrowserWindow({ - show: false + describe('document.visibilityState/hidden', function () { + afterEach(function () { + ipcMain.removeAllListeners('pong') }) - ipcMain.once('pong', function (event, visibilityState, hidden) { - assert.equal(visibilityState, 'hidden') - assert.equal(hidden, true) - - ipcMain.once('pong', function (event, visibilityState, hidden) { - assert.equal(visibilityState, 'visible') - assert.equal(hidden, false) - done() + it('updates when the window is shown after the ready-to-show event', function (done) { + w = new BrowserWindow({ + show: false }) - w.webContents.emit('-window-visibility-change', 'visible') + w.once('ready-to-show', function () { + w.show() + }) + + ipcMain.on('pong', function (event, visibilityState, hidden) { + if (!hidden) { + assert.equal(visibilityState, 'visible') + done() + } + }) + + w.loadURL('file://' + fixtures + '/pages/webview-visibilitychange.html') }) - w.loadURL('file://' + fixtures + '/pages/webview-visibilitychange.html') + it('inherits the parent window visibility state and receives visibilitychange events', function (done) { + w = new BrowserWindow({ + show: false + }) + + ipcMain.once('pong', function (event, visibilityState, hidden) { + assert.equal(visibilityState, 'hidden') + assert.equal(hidden, true) + + ipcMain.once('pong', function (event, visibilityState, hidden) { + assert.equal(visibilityState, 'visible') + assert.equal(hidden, false) + done() + }) + + w.webContents.emit('-window-visibility-change', 'visible') + }) + + w.loadURL('file://' + fixtures + '/pages/webview-visibilitychange.html') + }) }) describe('will-attach-webview event', () => {