From 07a4c5291980f6d0d22ee7600911562bd5cf4e3d Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 13 Apr 2016 21:36:43 +0900 Subject: [PATCH] Reduces the IPC messages used for visibilityState --- lib/browser/api/browser-window.js | 47 ++++++++++++------------------- lib/renderer/override.js | 39 ++++++++----------------- 2 files changed, 29 insertions(+), 57 deletions(-) diff --git a/lib/browser/api/browser-window.js b/lib/browser/api/browser-window.js index 694cbf6d669..80c1f29eb28 100644 --- a/lib/browser/api/browser-window.js +++ b/lib/browser/api/browser-window.js @@ -78,19 +78,23 @@ BrowserWindow.prototype._init = function () { app.emit('browser-window-focus', event, this) }) - // Evented visibilityState changes - this.on('show', () => { - this.webContents.send('ELECTRON_RENDERER_WINDOW_VISIBILITY_CHANGE', this.isVisible(), this.isMinimized()) - }) - this.on('hide', () => { - this.webContents.send('ELECTRON_RENDERER_WINDOW_VISIBILITY_CHANGE', this.isVisible(), this.isMinimized()) - }) - this.on('minimize', () => { - this.webContents.send('ELECTRON_RENDERER_WINDOW_VISIBILITY_CHANGE', this.isVisible(), this.isMinimized()) - }) - this.on('restore', () => { - this.webContents.send('ELECTRON_RENDERER_WINDOW_VISIBILITY_CHANGE', this.isVisible(), this.isMinimized()) - }) + // Subscribe to visibilityState changes and pass to renderer process. + let isVisible = false + let visibilityChanged = () => { + let newState = this.isVisible() && !this.isMinimized() + if (isVisible != newState) { + isVisible = newState + this.webContents.send('ELECTRON_RENDERER_WINDOW_VISIBILITY_CHANGE', isVisible ? 'visible' : 'hidden') + } + } + this.on('show', visibilityChanged) + this.on('hide', visibilityChanged) + 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. app.emit('browser-window-created', {}, this) @@ -105,6 +109,7 @@ BrowserWindow.prototype._init = function () { this.webContents.on('devtools-closed', () => { this.emit('devtools-closed') }) + Object.defineProperty(this, 'devToolsWebContents', { enumerable: true, configurable: false, @@ -195,37 +200,21 @@ BrowserWindow.prototype.inspectServiceWorker = function () { } // Deprecated. - deprecate.member(BrowserWindow, 'undo', 'webContents') - deprecate.member(BrowserWindow, 'redo', 'webContents') - deprecate.member(BrowserWindow, 'cut', 'webContents') - deprecate.member(BrowserWindow, 'copy', 'webContents') - deprecate.member(BrowserWindow, 'paste', 'webContents') - deprecate.member(BrowserWindow, 'selectAll', 'webContents') - deprecate.member(BrowserWindow, 'reloadIgnoringCache', 'webContents') - deprecate.member(BrowserWindow, 'isLoading', 'webContents') - deprecate.member(BrowserWindow, 'isWaitingForResponse', 'webContents') - deprecate.member(BrowserWindow, 'stop', 'webContents') - deprecate.member(BrowserWindow, 'isCrashed', 'webContents') - deprecate.member(BrowserWindow, 'print', 'webContents') - deprecate.member(BrowserWindow, 'printToPDF', 'webContents') - deprecate.rename(BrowserWindow, 'restart', 'reload') - deprecate.rename(BrowserWindow, 'loadUrl', 'loadURL') - deprecate.rename(BrowserWindow, 'getUrl', 'getURL') BrowserWindow.prototype.executeJavaScriptInDevTools = deprecate('executeJavaScriptInDevTools', 'devToolsWebContents.executeJavaScript', function (code) { diff --git a/lib/renderer/override.js b/lib/renderer/override.js index 5f808d66300..ba46bdf51e6 100644 --- a/lib/renderer/override.js +++ b/lib/renderer/override.js @@ -3,17 +3,6 @@ const ipcRenderer = require('electron').ipcRenderer 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. var a = window.top.document.createElement('a') @@ -200,17 +189,6 @@ if (process.openerId != null) { 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) { // Manually dispatch event instead of using postMessage because we also need to // 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. Object.defineProperty(document, 'hidden', { get: function () { - return _isMinimized || !_isVisible + return cachedVisibilityState != 'visible' } }) Object.defineProperty(document, 'visibilityState', { get: function () { - if (_isVisible && !_isMinimized) { - return 'visible' - } else { - return 'hidden' - } + return cachedVisibilityState } })