Cache browser visibility state & emit visibilitychange event on change
Fixes #3788
This commit is contained in:
		
					parent
					
						
							
								377a8eefb2
							
						
					
				
			
			
				commit
				
					
						ee61ab2d26
					
				
			
		
					 4 changed files with 35 additions and 12 deletions
				
			
		|  | @ -88,6 +88,18 @@ BrowserWindow.prototype._init = function() { | |||
|     }; | ||||
|   })(this)); | ||||
| 
 | ||||
|   // Evented visibilityState changes
 | ||||
|   this.on('minimize', (function(_this) { | ||||
|     return function() { | ||||
|       return _this.webContents.send('ATOM_RENDERER_WINDOW_VISIBILITY_CHANGE', false); | ||||
|     }; | ||||
|   })(this)); | ||||
|   this.on('restore', (function(_this) { | ||||
|     return function() { | ||||
|       return _this.webContents.send('ATOM_RENDERER_WINDOW_VISIBILITY_CHANGE', true); | ||||
|     }; | ||||
|   })(this)); | ||||
| 
 | ||||
|   // Notify the creation of the window.
 | ||||
|   app.emit('browser-window-created', {}, this); | ||||
| 
 | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ const v8Util = process.atomBinding('v8_util'); | |||
| 
 | ||||
| var slice = [].slice; | ||||
| 
 | ||||
| // Created by init.coffee.
 | ||||
| // Created by init.js.
 | ||||
| const ipcRenderer = v8Util.getHiddenValue(global, 'ipc'); | ||||
| 
 | ||||
| ipcRenderer.send = function() { | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ window.onload = function() { | |||
|   InspectorFrontendHost.showContextMenuAtPoint = createMenu; | ||||
| 
 | ||||
|   // Use dialog API to override file chooser dialog.
 | ||||
|   return WebInspector.createFileSelectorElement = createFileSelectorElement; | ||||
|   return (WebInspector.createFileSelectorElement = createFileSelectorElement); | ||||
| }; | ||||
| 
 | ||||
| var convertToMenuTemplate = function(items) { | ||||
|  |  | |||
|  | @ -3,6 +3,13 @@ const remote = require('electron').remote; | |||
| 
 | ||||
| var slice = [].slice; | ||||
| 
 | ||||
| // Cache browser window visibility
 | ||||
| var _isVisible = (function() { | ||||
|   var currentWindow; | ||||
|   currentWindow = remote.getCurrentWindow(); | ||||
|   return currentWindow.isMinimized() || !currentWindow.isVisible(); | ||||
| })(); | ||||
| 
 | ||||
| // Helper function to resolve relative url.
 | ||||
| var a = window.top.document.createElement('a'); | ||||
| 
 | ||||
|  | @ -30,7 +37,7 @@ var BrowserWindowProxy = (function() { | |||
|     ipcRenderer.once("ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSED_" + this.guestId, (function(_this) { | ||||
|       return function() { | ||||
|         BrowserWindowProxy.remove(_this.guestId); | ||||
|         return _this.closed = true; | ||||
|         return (_this.closed = true); | ||||
|       }; | ||||
|     })(this)); | ||||
|   } | ||||
|  | @ -87,7 +94,9 @@ window.open = function(url, frameName, features) { | |||
|   ref1 = features.split(/,\s*/); | ||||
|   for (i = 0, len = ref1.length; i < len; i++) { | ||||
|     feature = ref1[i]; | ||||
|     ref2 = feature.split(/\s*=/), name = ref2[0], value = ref2[1]; | ||||
|     ref2 = feature.split(/\s*=/); | ||||
|     name = ref2[0]; | ||||
|     value = ref2[1]; | ||||
|     options[name] = value === 'yes' || value === '1' ? true : value === 'no' || value === '0' ? false : value; | ||||
|   } | ||||
|   if (options.left) { | ||||
|  | @ -168,6 +177,12 @@ if (process.openerId != null) { | |||
|   window.opener = BrowserWindowProxy.getOrCreate(process.openerId); | ||||
| } | ||||
| 
 | ||||
| ipcRenderer.on('ATOM_RENDERER_WINDOW_VISIBILITY_CHANGE', function (event, isVisible) { | ||||
|   _isVisible = isVisible; | ||||
| 
 | ||||
|   document.dispatchEvent(new Event('visibilitychange')); | ||||
| }); | ||||
| 
 | ||||
| ipcRenderer.on('ATOM_SHELL_GUEST_WINDOW_POSTMESSAGE', function(event, sourceId, message, sourceOrigin) { | ||||
|   // Manually dispatch event instead of using postMessage because we also need to
 | ||||
|   // set event.source.
 | ||||
|  | @ -212,19 +227,15 @@ Object.defineProperty(window.history, 'length', { | |||
| 
 | ||||
| // Make document.hidden and document.visibilityState return the correct value.
 | ||||
| Object.defineProperty(document, 'hidden', { | ||||
|   get: function() { | ||||
|     var currentWindow; | ||||
|     currentWindow = remote.getCurrentWindow(); | ||||
|     return currentWindow.isMinimized() || !currentWindow.isVisible(); | ||||
|   } | ||||
|   get: !_isVisible | ||||
| }); | ||||
| 
 | ||||
| Object.defineProperty(document, 'visibilityState', { | ||||
|   get: function() { | ||||
|     if (document.hidden) { | ||||
|       return "hidden"; | ||||
|     } else { | ||||
|     if (_isVisible) { | ||||
|       return "visible"; | ||||
|     } else { | ||||
|       return "hidden"; | ||||
|     } | ||||
|   } | ||||
| }); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Arek Sredzki
				Arek Sredzki