From f1a72ad1086539a6ce345e798fdbe26a231e9222 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 12 Jun 2017 12:51:27 -0700 Subject: [PATCH 1/3] Add spec for webview visibility change on show --- spec/webview-spec.js | 51 +++++++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 13 deletions(-) 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', () => { From 626a1550dc3cd37cb151aff8b9a651bfb9289bd6 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 12 Jun 2017 12:58:26 -0700 Subject: [PATCH 2/3] Send cached visibility state when guest DOM is ready --- lib/browser/guest-view-manager.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/browser/guest-view-manager.js b/lib/browser/guest-view-manager.js index 0bf1f6db7e81..49a37b1ae585 100644 --- a/lib/browser/guest-view-manager.js +++ b/lib/browser/guest-view-manager.js @@ -143,6 +143,14 @@ const createGuest = function (embedder, params) { sendToEmbedder('ELECTRON_GUEST_VIEW_INTERNAL_SIZE_CHANGED', ...args) }) + // Notify guest of embedder window visibility when it is ready + 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 +288,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) } From f9f697298d9c384b87e220cf645080321e8f5bea Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Wed, 14 Jun 2017 14:12:51 -0700 Subject: [PATCH 3/3] Add FIXME link to #6828 --- lib/browser/guest-view-manager.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/browser/guest-view-manager.js b/lib/browser/guest-view-manager.js index 49a37b1ae585..731f82838af3 100644 --- a/lib/browser/guest-view-manager.js +++ b/lib/browser/guest-view-manager.js @@ -144,6 +144,7 @@ const createGuest = function (embedder, params) { }) // 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) {