2013-05-15 11:19:35 +00:00
|
|
|
EventEmitter = require('events').EventEmitter
|
2013-12-26 10:41:21 +00:00
|
|
|
IDWeakMap = require 'id-weak-map'
|
2013-10-05 05:13:04 +00:00
|
|
|
app = require 'app'
|
2014-10-27 15:46:25 +00:00
|
|
|
ipc = require 'ipc'
|
2014-04-25 08:23:40 +00:00
|
|
|
wrapWebContents = require('web-contents').wrap
|
2013-05-15 11:19:35 +00:00
|
|
|
|
2013-06-18 13:40:03 +00:00
|
|
|
BrowserWindow = process.atomBinding('window').BrowserWindow
|
|
|
|
BrowserWindow::__proto__ = EventEmitter.prototype
|
2013-05-17 08:09:12 +00:00
|
|
|
|
2013-12-26 10:41:21 +00:00
|
|
|
# Store all created windows in the weak map.
|
|
|
|
BrowserWindow.windows = new IDWeakMap
|
|
|
|
|
2013-10-05 13:05:59 +00:00
|
|
|
BrowserWindow::_init = ->
|
|
|
|
# Simulate the application menu on platforms other than OS X.
|
|
|
|
if process.platform isnt 'darwin'
|
|
|
|
menu = app.getApplicationMenu()
|
|
|
|
@setMenu menu if menu?
|
|
|
|
|
2014-04-25 03:51:05 +00:00
|
|
|
@webContents = @getWebContents()
|
2015-03-11 14:28:12 +00:00
|
|
|
@devToolsWebContents = null
|
2014-04-25 03:59:33 +00:00
|
|
|
@webContents.once 'destroyed', => @webContents = null
|
2014-04-25 03:51:05 +00:00
|
|
|
|
2014-05-22 01:51:32 +00:00
|
|
|
# Remember the window ID.
|
|
|
|
Object.defineProperty this, 'id',
|
|
|
|
value: BrowserWindow.windows.add(this)
|
|
|
|
enumerable: true
|
2013-12-26 10:41:21 +00:00
|
|
|
|
2014-10-27 15:46:25 +00:00
|
|
|
# Make new windows requested by links behave like "window.open"
|
2014-11-04 10:12:57 +00:00
|
|
|
@on '-new-window', (event, url, frameName) =>
|
2014-10-27 15:46:25 +00:00
|
|
|
event.sender = @webContents
|
|
|
|
options = show: true, width: 800, height: 600
|
|
|
|
ipc.emit 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', event, url, frameName, options
|
2014-10-27 10:52:55 +00:00
|
|
|
|
2014-12-17 22:56:51 +00:00
|
|
|
# Redirect "will-navigate" to webContents.
|
|
|
|
@on '-will-navigate', (event, url) =>
|
|
|
|
@webContents.emit 'will-navigate', event, url
|
|
|
|
|
2013-12-26 10:41:21 +00:00
|
|
|
# Remove the window from weak map immediately when it's destroyed, since we
|
2014-05-07 06:34:53 +00:00
|
|
|
# could be iterating windows before GC happened.
|
2014-05-22 01:51:32 +00:00
|
|
|
@once 'closed', =>
|
|
|
|
BrowserWindow.windows.remove @id if BrowserWindow.windows.has @id
|
2013-12-26 10:41:21 +00:00
|
|
|
|
2015-03-26 09:13:35 +00:00
|
|
|
BrowserWindow::openDevTools = (options={}) ->
|
|
|
|
options.detach ?= false
|
2015-03-27 08:24:33 +00:00
|
|
|
@_openDevTools !options.detach
|
2014-05-20 12:58:11 +00:00
|
|
|
|
|
|
|
# Force devToolsWebContents to be created.
|
|
|
|
@devToolsWebContents = @getDevToolsWebContents()
|
|
|
|
@devToolsWebContents.once 'destroyed', => @devToolsWebContents = null
|
2013-12-06 06:44:25 +00:00
|
|
|
|
2014-08-28 06:25:00 +00:00
|
|
|
# Emit devtools events.
|
2014-08-28 08:00:29 +00:00
|
|
|
@devToolsWebContents.once 'did-finish-load', => @emit 'devtools-opened'
|
|
|
|
@devToolsWebContents.once 'destroyed', => @emit 'devtools-closed'
|
2014-08-28 06:25:00 +00:00
|
|
|
|
2013-06-18 13:40:03 +00:00
|
|
|
BrowserWindow::toggleDevTools = ->
|
2013-11-05 02:32:45 +00:00
|
|
|
if @isDevToolsOpened() then @closeDevTools() else @openDevTools()
|
2013-05-15 11:19:35 +00:00
|
|
|
|
2014-04-25 03:51:05 +00:00
|
|
|
BrowserWindow::getWebContents = ->
|
2014-04-25 08:13:16 +00:00
|
|
|
wrapWebContents @_getWebContents()
|
2014-04-25 03:51:05 +00:00
|
|
|
|
|
|
|
BrowserWindow::getDevToolsWebContents = ->
|
2014-04-25 08:13:16 +00:00
|
|
|
wrapWebContents @_getDevToolsWebContents()
|
2014-04-25 03:51:05 +00:00
|
|
|
|
2013-10-02 13:24:21 +00:00
|
|
|
BrowserWindow::setMenu = (menu) ->
|
2014-02-19 13:06:45 +00:00
|
|
|
if process.platform is 'darwin'
|
|
|
|
throw new Error('BrowserWindow.setMenu is not available on OS X')
|
2013-10-02 13:24:21 +00:00
|
|
|
|
|
|
|
throw new TypeError('Invalid menu') unless menu?.constructor?.name is 'Menu'
|
|
|
|
|
|
|
|
@menu = menu # Keep a reference of menu in case of GC.
|
|
|
|
@menu.attachToWindow this
|
|
|
|
|
2013-12-26 10:41:21 +00:00
|
|
|
BrowserWindow.getAllWindows = ->
|
|
|
|
windows = BrowserWindow.windows
|
|
|
|
windows.get key for key in windows.keys()
|
|
|
|
|
2013-06-18 13:40:03 +00:00
|
|
|
BrowserWindow.getFocusedWindow = ->
|
2013-12-26 10:41:21 +00:00
|
|
|
windows = BrowserWindow.getAllWindows()
|
2013-06-18 13:40:03 +00:00
|
|
|
return window for window in windows when window.isFocused()
|
2013-05-28 08:01:44 +00:00
|
|
|
|
2014-04-25 08:45:14 +00:00
|
|
|
BrowserWindow.fromWebContents = (webContents) ->
|
2013-12-26 10:41:21 +00:00
|
|
|
windows = BrowserWindow.getAllWindows()
|
2014-04-25 08:45:14 +00:00
|
|
|
return window for window in windows when webContents.equal window.webContents
|
2013-05-16 15:00:43 +00:00
|
|
|
|
2014-04-25 08:45:14 +00:00
|
|
|
BrowserWindow.fromDevToolsWebContents = (webContents) ->
|
2014-04-04 14:28:18 +00:00
|
|
|
windows = BrowserWindow.getAllWindows()
|
2014-04-25 08:45:14 +00:00
|
|
|
return window for window in windows when webContents.equal window.devToolsWebContents
|
2014-04-04 14:28:18 +00:00
|
|
|
|
2014-05-22 01:51:32 +00:00
|
|
|
BrowserWindow.fromId = (id) ->
|
|
|
|
BrowserWindow.windows.get id
|
|
|
|
|
2014-04-25 05:14:11 +00:00
|
|
|
# Helpers.
|
2014-11-12 02:28:50 +00:00
|
|
|
BrowserWindow::loadUrl = -> @webContents.loadUrl.apply @webContents, arguments
|
2014-04-25 05:14:11 +00:00
|
|
|
BrowserWindow::send = -> @webContents.send.apply @webContents, arguments
|
|
|
|
|
2014-04-24 09:00:41 +00:00
|
|
|
# Be compatible with old API.
|
2014-04-29 07:35:12 +00:00
|
|
|
BrowserWindow::restart = -> @webContents.reload()
|
2014-04-24 09:00:41 +00:00
|
|
|
BrowserWindow::getUrl = -> @webContents.getUrl()
|
2014-11-12 02:28:50 +00:00
|
|
|
BrowserWindow::reload = -> @webContents.reload.apply @webContents, arguments
|
|
|
|
BrowserWindow::reloadIgnoringCache = -> @webContents.reloadIgnoringCache.apply @webContents, arguments
|
2014-04-24 09:00:41 +00:00
|
|
|
BrowserWindow::getPageTitle = -> @webContents.getTitle()
|
|
|
|
BrowserWindow::isLoading = -> @webContents.isLoading()
|
|
|
|
BrowserWindow::isWaitingForResponse = -> @webContents.isWaitingForResponse()
|
|
|
|
BrowserWindow::stop = -> @webContents.stop()
|
|
|
|
BrowserWindow::getRoutingId = -> @webContents.getRoutingId()
|
|
|
|
BrowserWindow::getProcessId = -> @webContents.getProcessId()
|
|
|
|
BrowserWindow::isCrashed = -> @webContents.isCrashed()
|
2014-04-25 02:48:11 +00:00
|
|
|
BrowserWindow::executeJavaScriptInDevTools = (code) ->
|
|
|
|
@devToolsWebContents.executeJavaScript code
|
2014-04-24 09:00:41 +00:00
|
|
|
|
2013-06-18 13:40:03 +00:00
|
|
|
module.exports = BrowserWindow
|