Reduces the IPC messages used for visibilityState

This commit is contained in:
Cheng Zhao 2016-04-13 21:36:43 +09:00
parent c3ac92b500
commit 07a4c52919
2 changed files with 29 additions and 57 deletions

View file

@ -78,19 +78,23 @@ BrowserWindow.prototype._init = function () {
app.emit('browser-window-focus', event, this) app.emit('browser-window-focus', event, this)
}) })
// Evented visibilityState changes // Subscribe to visibilityState changes and pass to renderer process.
this.on('show', () => { let isVisible = false
this.webContents.send('ELECTRON_RENDERER_WINDOW_VISIBILITY_CHANGE', this.isVisible(), this.isMinimized()) let visibilityChanged = () => {
}) let newState = this.isVisible() && !this.isMinimized()
this.on('hide', () => { if (isVisible != newState) {
this.webContents.send('ELECTRON_RENDERER_WINDOW_VISIBILITY_CHANGE', this.isVisible(), this.isMinimized()) isVisible = newState
}) this.webContents.send('ELECTRON_RENDERER_WINDOW_VISIBILITY_CHANGE', isVisible ? 'visible' : 'hidden')
this.on('minimize', () => { }
this.webContents.send('ELECTRON_RENDERER_WINDOW_VISIBILITY_CHANGE', this.isVisible(), this.isMinimized()) }
}) this.on('show', visibilityChanged)
this.on('restore', () => { this.on('hide', visibilityChanged)
this.webContents.send('ELECTRON_RENDERER_WINDOW_VISIBILITY_CHANGE', this.isVisible(), this.isMinimized()) this.on('minimize', visibilityChanged)
}) this.on('restore', visibilityChanged)
this.on('maximize', visibilityChanged)
// Make renderer process have correct initial state.
visibilityChanged()
// Notify the creation of the window. // Notify the creation of the window.
app.emit('browser-window-created', {}, this) app.emit('browser-window-created', {}, this)
@ -105,6 +109,7 @@ BrowserWindow.prototype._init = function () {
this.webContents.on('devtools-closed', () => { this.webContents.on('devtools-closed', () => {
this.emit('devtools-closed') this.emit('devtools-closed')
}) })
Object.defineProperty(this, 'devToolsWebContents', { Object.defineProperty(this, 'devToolsWebContents', {
enumerable: true, enumerable: true,
configurable: false, configurable: false,
@ -195,37 +200,21 @@ BrowserWindow.prototype.inspectServiceWorker = function () {
} }
// Deprecated. // Deprecated.
deprecate.member(BrowserWindow, 'undo', 'webContents') deprecate.member(BrowserWindow, 'undo', 'webContents')
deprecate.member(BrowserWindow, 'redo', 'webContents') deprecate.member(BrowserWindow, 'redo', 'webContents')
deprecate.member(BrowserWindow, 'cut', 'webContents') deprecate.member(BrowserWindow, 'cut', 'webContents')
deprecate.member(BrowserWindow, 'copy', 'webContents') deprecate.member(BrowserWindow, 'copy', 'webContents')
deprecate.member(BrowserWindow, 'paste', 'webContents') deprecate.member(BrowserWindow, 'paste', 'webContents')
deprecate.member(BrowserWindow, 'selectAll', 'webContents') deprecate.member(BrowserWindow, 'selectAll', 'webContents')
deprecate.member(BrowserWindow, 'reloadIgnoringCache', 'webContents') deprecate.member(BrowserWindow, 'reloadIgnoringCache', 'webContents')
deprecate.member(BrowserWindow, 'isLoading', 'webContents') deprecate.member(BrowserWindow, 'isLoading', 'webContents')
deprecate.member(BrowserWindow, 'isWaitingForResponse', 'webContents') deprecate.member(BrowserWindow, 'isWaitingForResponse', 'webContents')
deprecate.member(BrowserWindow, 'stop', 'webContents') deprecate.member(BrowserWindow, 'stop', 'webContents')
deprecate.member(BrowserWindow, 'isCrashed', 'webContents') deprecate.member(BrowserWindow, 'isCrashed', 'webContents')
deprecate.member(BrowserWindow, 'print', 'webContents') deprecate.member(BrowserWindow, 'print', 'webContents')
deprecate.member(BrowserWindow, 'printToPDF', 'webContents') deprecate.member(BrowserWindow, 'printToPDF', 'webContents')
deprecate.rename(BrowserWindow, 'restart', 'reload') deprecate.rename(BrowserWindow, 'restart', 'reload')
deprecate.rename(BrowserWindow, 'loadUrl', 'loadURL') deprecate.rename(BrowserWindow, 'loadUrl', 'loadURL')
deprecate.rename(BrowserWindow, 'getUrl', 'getURL') deprecate.rename(BrowserWindow, 'getUrl', 'getURL')
BrowserWindow.prototype.executeJavaScriptInDevTools = deprecate('executeJavaScriptInDevTools', 'devToolsWebContents.executeJavaScript', function (code) { BrowserWindow.prototype.executeJavaScriptInDevTools = deprecate('executeJavaScriptInDevTools', 'devToolsWebContents.executeJavaScript', function (code) {

View file

@ -3,17 +3,6 @@
const ipcRenderer = require('electron').ipcRenderer const ipcRenderer = require('electron').ipcRenderer
const remote = require('electron').remote const remote = require('electron').remote
// Cache browser window visibility
var _isVisible = true
var _isMinimized = false
var initWindow = function initWindow () {
var currentWindow
currentWindow = remote.getCurrentWindow()
_isVisible = currentWindow.isVisible()
_isMinimized = currentWindow.isMinimized()
}
initWindow()
// Helper function to resolve relative url. // Helper function to resolve relative url.
var a = window.top.document.createElement('a') var a = window.top.document.createElement('a')
@ -200,17 +189,6 @@ if (process.openerId != null) {
window.opener = BrowserWindowProxy.getOrCreate(process.openerId) window.opener = BrowserWindowProxy.getOrCreate(process.openerId)
} }
ipcRenderer.on('ELECTRON_RENDERER_WINDOW_VISIBILITY_CHANGE', function (event, isVisible, isMinimized) {
var hasChanged = _isVisible !== isVisible || _isMinimized !== isMinimized
if (hasChanged) {
_isVisible = isVisible
_isMinimized = isMinimized
document.dispatchEvent(new Event('visibilitychange'))
}
})
ipcRenderer.on('ELECTRON_GUEST_WINDOW_POSTMESSAGE', function (event, sourceId, message, sourceOrigin) { ipcRenderer.on('ELECTRON_GUEST_WINDOW_POSTMESSAGE', function (event, sourceId, message, sourceOrigin) {
// Manually dispatch event instead of using postMessage because we also need to // Manually dispatch event instead of using postMessage because we also need to
// set event.source. // set event.source.
@ -249,19 +227,24 @@ Object.defineProperty(window.history, 'length', {
} }
}) })
// Subscribe to visibilityState changes.
let cachedVisibilityState = 'hidden'
ipcRenderer.on('ELECTRON_RENDERER_WINDOW_VISIBILITY_CHANGE', function (event, visibilityState) {
if (cachedVisibilityState != visibilityState) {
cachedVisibilityState = visibilityState
document.dispatchEvent(new Event('visibilitychange'))
}
})
// Make document.hidden and document.visibilityState return the correct value. // Make document.hidden and document.visibilityState return the correct value.
Object.defineProperty(document, 'hidden', { Object.defineProperty(document, 'hidden', {
get: function () { get: function () {
return _isMinimized || !_isVisible return cachedVisibilityState != 'visible'
} }
}) })
Object.defineProperty(document, 'visibilityState', { Object.defineProperty(document, 'visibilityState', {
get: function () { get: function () {
if (_isVisible && !_isMinimized) { return cachedVisibilityState
return 'visible'
} else {
return 'hidden'
}
} }
}) })