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

158 lines
4.7 KiB
JavaScript
Raw Normal View History

'use strict'
const {ipcMain} = require('electron')
const {EventEmitter} = require('events')
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 () {
// Avoid recursive require.
const {app} = require('electron')
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') {
const menu = app.getApplicationMenu()
if (menu) 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) => {
const options = {
2016-01-12 02:40:23 +00:00
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
// 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
// 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.
//
2016-01-14 18:44:21 +00:00
// 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()
const visibilityChanged = () => {
const 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')
}
}
const visibilityEvents = ['show', 'hide', 'minimize', 'maximize', 'restore']
for (let event of visibilityEvents) {
this.on(event, 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-03-11 19:05:48 +00:00
Object.defineProperty(this, 'devToolsWebContents', {
2016-01-12 02:40:23 +00:00
enumerable: true,
configurable: false,
get () {
return this.webContents.devToolsWebContents
2016-01-12 02:40:23 +00:00
}
})
}
2016-01-12 02:40:23 +00:00
BrowserWindow.getFocusedWindow = () => {
for (let window of BrowserWindow.getAllWindows()) {
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 = (webContents) => {
for (let window of BrowserWindow.getAllWindows()) {
if (window.webContents.equal(webContents)) return window
2016-01-12 02:40:23 +00:00
}
}
2016-01-12 02:40:23 +00:00
BrowserWindow.fromDevToolsWebContents = (webContents) => {
for (let window of BrowserWindow.getAllWindows()) {
if (window.devToolsWebContents.equal(webContents)) 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
Object.assign(BrowserWindow.prototype, {
loadURL (...args) {
return this.webContents.loadURL.apply(this.webContents, args)
},
getURL (...args) {
return this.webContents.getURL()
},
reload (...args) {
return this.webContents.reload.apply(this.webContents, args)
},
send (...args) {
return this.webContents.send.apply(this.webContents, args)
},
openDevTools (...args) {
return this.webContents.openDevTools.apply(this.webContents, args)
},
closeDevTools () {
return this.webContents.closeDevTools()
},
isDevToolsOpened () {
return this.webContents.isDevToolsOpened()
},
isDevToolsFocused () {
return this.webContents.isDevToolsFocused()
},
toggleDevTools () {
return this.webContents.toggleDevTools()
},
inspectElement (...args) {
return this.webContents.inspectElement.apply(this.webContents, args)
},
inspectServiceWorker () {
return this.webContents.inspectServiceWorker()
}
})
2016-01-12 02:40:23 +00:00
module.exports = BrowserWindow