Merge pull request #9741 from electron/webview-visibility-state

Send window visibility to webview after DOM ready
This commit is contained in:
Kevin Sawicki 2017-06-14 15:22:55 -07:00 committed by GitHub
commit 5b0290bf88
2 changed files with 48 additions and 13 deletions

View file

@ -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)
}

View file

@ -1097,25 +1097,50 @@ describe('<webview> 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', () => {