electron/atom/browser/lib/init.coffee

121 lines
3.7 KiB
CoffeeScript
Raw Normal View History

2014-06-22 06:56:00 +00:00
fs = require 'fs'
path = require 'path'
util = require 'util'
Module = require 'module'
2013-04-15 07:39:54 +00:00
2016-01-12 02:03:02 +00:00
### We modified the original process.argv to let node.js load the atom.js, ###
### we need to restore it here. ###
process.argv.splice 1, 1
2016-01-12 02:03:02 +00:00
### Clear search paths. ###
require path.resolve(__dirname, '..', '..', 'common', 'lib', 'reset-search-paths')
2016-01-12 02:03:02 +00:00
### Import common settings. ###
2015-01-22 01:38:26 +00:00
require path.resolve(__dirname, '..', '..', 'common', 'lib', 'init')
globalPaths = Module.globalPaths
unless process.env.ELECTRON_HIDE_INTERNAL_MODULES
globalPaths.push path.resolve(__dirname, '..', 'api', 'lib')
2016-01-12 02:03:02 +00:00
### Expose public APIs. ###
2015-11-12 13:46:03 +00:00
globalPaths.push path.resolve(__dirname, '..', 'api', 'lib', 'exports')
if process.platform is 'win32'
2016-01-12 02:03:02 +00:00
###
Redirect node's console to use our own implementations, since node can not
handle console output when running as GUI program.
###
consoleLog = (args...) ->
process.log util.format(args...) + "\n"
streamWrite = (chunk, encoding, callback) ->
chunk = chunk.toString(encoding) if Buffer.isBuffer chunk
process.log chunk
callback() if callback
true
console.log = console.error = console.warn = consoleLog
process.stdout.write = process.stderr.write = streamWrite
2016-01-12 02:03:02 +00:00
### Always returns EOF for stdin stream. ###
Readable = require('stream').Readable
stdin = new Readable
stdin.push null
process.__defineGetter__ 'stdin', -> stdin
2016-01-12 02:03:02 +00:00
### Don't quit on fatal error. ###
process.on 'uncaughtException', (error) ->
2016-01-12 02:03:02 +00:00
### Do nothing if the user has a custom uncaught exception handler. ###
if process.listeners('uncaughtException').length > 1
return
2016-01-12 02:03:02 +00:00
### Show error in GUI. ###
{dialog} = require 'electron'
stack = error.stack ? "#{error.name}: #{error.message}"
message = "Uncaught Exception:\n#{stack}"
dialog.showErrorBox 'A JavaScript error occurred in the main process', message
2016-01-12 02:03:02 +00:00
### Emit 'exit' event on quit. ###
{app} = require 'electron'
2015-12-10 02:11:38 +00:00
app.on 'quit', (event, exitCode) ->
process.emit 'exit', exitCode
2016-01-12 02:03:02 +00:00
### Map process.exit to app.exit, which quits gracefully. ###
2015-12-10 02:11:38 +00:00
process.exit = app.exit
2016-01-12 02:03:02 +00:00
### Load the RPC server. ###
require './rpc-server'
2016-01-12 02:03:02 +00:00
### Load the guest view manager. ###
require './guest-view-manager'
require './guest-window-manager'
2016-01-12 02:03:02 +00:00
### Now we try to load app's package.json. ###
packageJson = null
searchPaths = [ 'app', 'app.asar', 'default_app' ]
for packagePath in searchPaths
try
packagePath = path.join process.resourcesPath, packagePath
packageJson = JSON.parse(fs.readFileSync(path.join(packagePath, 'package.json')))
break
catch e
continue
unless packageJson?
process.nextTick -> process.exit 1
throw new Error("Unable to find a valid app")
2016-01-12 02:03:02 +00:00
### Set application's version. ###
app.setVersion packageJson.version if packageJson.version?
2016-01-12 02:03:02 +00:00
### Set application's name. ###
if packageJson.productName?
app.setName packageJson.productName
else if packageJson.name?
app.setName packageJson.name
2016-01-12 02:03:02 +00:00
### Set application's desktop name. ###
if packageJson.desktopName?
app.setDesktopName packageJson.desktopName
else
2015-01-22 01:38:26 +00:00
app.setDesktopName "#{app.getName()}.desktop"
2016-01-12 02:03:02 +00:00
### Chrome 42 disables NPAPI plugins by default, reenable them here ###
app.commandLine.appendSwitch 'enable-npapi'
2016-01-12 02:03:02 +00:00
### Set the user path according to application's name. ###
app.setPath 'userData', path.join(app.getPath('appData'), app.getName())
app.setPath 'userCache', path.join(app.getPath('cache'), app.getName())
2015-07-06 09:35:35 +00:00
app.setAppPath packagePath
2016-01-12 02:03:02 +00:00
### Load the chrome extension support. ###
2015-01-22 01:38:26 +00:00
require './chrome-extension'
2016-01-12 02:03:02 +00:00
### Load internal desktop-capturer module. ###
require './desktop-capturer'
2016-01-12 02:03:02 +00:00
### Set main startup script of the app. ###
mainStartupScript = packageJson.main or 'index.js'
2016-01-12 02:03:02 +00:00
### Finally load app's main.js and transfer control to C++. ###
Module._load path.join(packagePath, mainStartupScript), Module, true