electron/lib/browser/api/browser-window.js

199 lines
5.8 KiB
JavaScript
Raw Normal View History

'use strict'
const ipcMain = require('electron').ipcMain
const EventEmitter = require('events').EventEmitter
const {BrowserWindow} = process.atomBinding('window')
2016-01-12 02:40:23 +00:00
Object.setPrototypeOf(BrowserWindow.prototype, EventEmitter.prototype)
2016-01-12 02:40:23 +00:00
BrowserWindow.prototype._init = function () {
2016-01-14 18:35:29 +00:00
// avoid recursive require.
var app, menu
app = require('electron').app
2016-01-12 02:40:23 +00:00
2016-01-14 18:35:29 +00:00
// Simulate the application menu on platforms other than OS X.
2016-01-12 02:40:23 +00:00
if (process.platform !== 'darwin') {
menu = app.getApplicationMenu()
2016-01-12 02:40:23 +00:00
if (menu != null) {
this.setMenu(menu)
2016-01-12 02:40:23 +00:00
}
}
2016-01-14 18:35:29 +00:00
// Make new windows requested by links behave like "window.open"
this.webContents.on('-new-window', (event, url, frameName, disposition) => {
var options
2016-01-12 02:40:23 +00:00
options = {
show: true,
width: 800,
height: 600
}
return ipcMain.emit('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_OPEN', event, url, frameName, disposition, options)
})
2016-01-12 02:40:23 +00:00
2016-01-14 18:44:21 +00:00
// window.resizeTo(...)
// window.moveTo(...)
this.webContents.on('move', (event, size) => {
this.setBounds(size)
})
2016-01-12 02:40:23 +00:00
2016-01-14 18:35:29 +00:00
// Hide the auto-hide menu when webContents is focused.
this.webContents.on('activate', () => {
if (process.platform !== 'darwin' && this.isMenuBarAutoHide() && this.isMenuBarVisible()) {
this.setMenuBarVisibility(false)
}
})
2016-01-12 02:40:23 +00:00
2016-01-14 18:35:29 +00:00
// Forward the crashed event.
this.webContents.on('crashed', () => {
this.emit('crashed')
})
2016-01-12 02:40:23 +00:00
2016-01-14 18:35:29 +00:00
// Change window title to page title.
this.webContents.on('page-title-updated', (event, title) => {
// The page-title-updated event is not emitted immediately (see #3645), so
// when the callback is called the BrowserWindow might have been closed.
2016-03-29 01:00:30 +00:00
if (this.isDestroyed()) return
// Route the event to BrowserWindow.
this.emit('page-title-updated', event, title)
2016-03-29 01:00:30 +00:00
if (!event.defaultPrevented) this.setTitle(title)
})
2016-01-12 02:40:23 +00:00
2016-01-14 18:44:21 +00:00
// Sometimes the webContents doesn't get focus when window is shown, so we have
// to force focusing on webContents in this case. The safest way is to focus it
// when we first start to load URL, if we do it earlier it won't have effect,
// if we do it later we might move focus in the page.
// Though this hack is only needed on OS X when the app is launched from
// Finder, we still do it on all platforms in case of other bugs we don't know.
this.webContents.once('load-url', function () {
this.focus()
})
2016-01-12 02:40:23 +00:00
2016-01-14 18:35:29 +00:00
// Redirect focus/blur event to app instance too.
this.on('blur', (event) => {
app.emit('browser-window-blur', event, this)
})
this.on('focus', (event) => {
app.emit('browser-window-focus', event, this)
})
2016-01-12 02:40:23 +00:00
// Subscribe to visibilityState changes and pass to renderer process.
2016-04-13 13:56:11 +00:00
let isVisible = this.isVisible() && !this.isMinimized()
let visibilityChanged = () => {
let newState = this.isVisible() && !this.isMinimized()
2016-04-13 14:10:31 +00:00
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)
2016-01-14 18:35:29 +00:00
// Notify the creation of the window.
app.emit('browser-window-created', {}, this)
2016-01-12 02:40:23 +00:00
2016-01-14 18:35:29 +00:00
// Be compatible with old APIs.
this.webContents.on('devtools-focused', () => {
this.emit('devtools-focused')
})
this.webContents.on('devtools-opened', () => {
this.emit('devtools-opened')
})
this.webContents.on('devtools-closed', () => {
this.emit('devtools-closed')
})
2016-03-11 19:05:48 +00:00
Object.defineProperty(this, 'devToolsWebContents', {
2016-01-12 02:40:23 +00:00
enumerable: true,
configurable: false,
get: function () {
return this.webContents.devToolsWebContents
2016-01-12 02:40:23 +00:00
}
})
}
2016-01-12 02:40:23 +00:00
BrowserWindow.getFocusedWindow = function () {
var i, len, window, windows
windows = BrowserWindow.getAllWindows()
2016-01-12 02:40:23 +00:00
for (i = 0, len = windows.length; i < len; i++) {
window = windows[i]
2016-01-12 02:40:23 +00:00
if (window.isFocused()) {
return window
2016-01-12 02:40:23 +00:00
}
}
return null
}
2016-01-12 02:40:23 +00:00
BrowserWindow.fromWebContents = function (webContents) {
var i, len, ref1, window, windows
windows = BrowserWindow.getAllWindows()
2016-01-12 02:40:23 +00:00
for (i = 0, len = windows.length; i < len; i++) {
window = windows[i]
2016-01-12 02:40:23 +00:00
if ((ref1 = window.webContents) != null ? ref1.equal(webContents) : void 0) {
return window
2016-01-12 02:40:23 +00:00
}
}
}
2016-01-12 02:40:23 +00:00
BrowserWindow.fromDevToolsWebContents = function (webContents) {
var i, len, ref1, window, windows
windows = BrowserWindow.getAllWindows()
2016-01-12 02:40:23 +00:00
for (i = 0, len = windows.length; i < len; i++) {
window = windows[i]
2016-01-12 02:40:23 +00:00
if ((ref1 = window.devToolsWebContents) != null ? ref1.equal(webContents) : void 0) {
return window
2016-01-12 02:40:23 +00:00
}
}
}
2016-01-12 02:40:23 +00:00
2016-01-14 18:35:29 +00:00
// Helpers.
2016-01-12 02:40:23 +00:00
BrowserWindow.prototype.loadURL = function () {
return this.webContents.loadURL.apply(this.webContents, arguments)
}
2016-01-12 02:40:23 +00:00
BrowserWindow.prototype.getURL = function () {
return this.webContents.getURL()
}
2016-01-12 02:40:23 +00:00
BrowserWindow.prototype.reload = function () {
return this.webContents.reload.apply(this.webContents, arguments)
}
2016-01-12 02:40:23 +00:00
BrowserWindow.prototype.send = function () {
return this.webContents.send.apply(this.webContents, arguments)
}
2016-01-12 02:40:23 +00:00
BrowserWindow.prototype.openDevTools = function () {
return this.webContents.openDevTools.apply(this.webContents, arguments)
}
2016-01-12 02:40:23 +00:00
BrowserWindow.prototype.closeDevTools = function () {
return this.webContents.closeDevTools()
}
2016-01-12 02:40:23 +00:00
BrowserWindow.prototype.isDevToolsOpened = function () {
return this.webContents.isDevToolsOpened()
}
2016-01-12 02:40:23 +00:00
BrowserWindow.prototype.isDevToolsFocused = function () {
return this.webContents.isDevToolsFocused()
}
2016-01-12 02:40:23 +00:00
BrowserWindow.prototype.toggleDevTools = function () {
return this.webContents.toggleDevTools()
}
2016-01-12 02:40:23 +00:00
BrowserWindow.prototype.inspectElement = function () {
return this.webContents.inspectElement.apply(this.webContents, arguments)
}
2016-01-12 02:40:23 +00:00
BrowserWindow.prototype.inspectServiceWorker = function () {
return this.webContents.inspectServiceWorker()
}
2016-01-12 02:40:23 +00:00
module.exports = BrowserWindow