2014-06-22 06:56:00 +00:00
|
|
|
fs = require 'fs'
|
|
|
|
path = require 'path'
|
|
|
|
util = require 'util'
|
2015-04-23 05:17:18 +00:00
|
|
|
Module = require 'module'
|
2013-04-15 07:39:54 +00:00
|
|
|
|
2013-12-15 06:20:28 +00:00
|
|
|
# We modified the original process.argv to let node.js load the atom.js,
|
|
|
|
# we need to restore it here.
|
2013-12-11 15:59:03 +00:00
|
|
|
process.argv.splice 1, 1
|
|
|
|
|
2015-10-03 12:38:39 +00:00
|
|
|
# Clear search paths.
|
|
|
|
require path.resolve(__dirname, '..', '..', 'common', 'lib', 'reset-search-paths')
|
|
|
|
|
2015-10-03 11:55:59 +00:00
|
|
|
# Import common settings.
|
|
|
|
require path.resolve(__dirname, '..', '..', 'common', 'lib', 'init')
|
|
|
|
|
2015-04-23 05:17:18 +00:00
|
|
|
globalPaths = Module.globalPaths
|
2015-11-12 13:37:44 +00:00
|
|
|
unless process.env.ELECTRON_HIDE_INTERNAL_MODULES
|
2015-11-12 09:02:04 +00:00
|
|
|
globalPaths.push path.resolve(__dirname, '..', 'api', 'lib')
|
|
|
|
|
2015-11-12 13:46:03 +00:00
|
|
|
# Expose public APIs.
|
|
|
|
globalPaths.push path.resolve(__dirname, '..', 'api', 'lib', 'exports')
|
|
|
|
|
2015-10-16 09:38:11 +00:00
|
|
|
if process.platform is 'win32'
|
|
|
|
# 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
|
|
|
|
|
|
|
|
# Always returns EOF for stdin stream.
|
|
|
|
Readable = require('stream').Readable
|
|
|
|
stdin = new Readable
|
|
|
|
stdin.push null
|
|
|
|
process.__defineGetter__ 'stdin', -> stdin
|
|
|
|
|
2015-01-21 23:02:09 +00:00
|
|
|
# Don't quit on fatal error.
|
|
|
|
process.on 'uncaughtException', (error) ->
|
|
|
|
# Do nothing if the user has a custom uncaught exception handler.
|
|
|
|
if process.listeners('uncaughtException').length > 1
|
|
|
|
return
|
|
|
|
|
|
|
|
# Show error in GUI.
|
2015-11-12 10:28:04 +00:00
|
|
|
{dialog} = require 'electron'
|
2015-01-21 23:02:09 +00:00
|
|
|
stack = error.stack ? "#{error.name}: #{error.message}"
|
|
|
|
message = "Uncaught Exception:\n#{stack}"
|
2015-11-12 10:28:04 +00:00
|
|
|
dialog.showErrorBox 'A JavaScript error occurred in the main process', message
|
2015-01-21 23:02:09 +00:00
|
|
|
|
|
|
|
# Emit 'exit' event on quit.
|
2015-11-12 10:28:04 +00:00
|
|
|
{app} = require 'electron'
|
2015-01-22 01:38:26 +00:00
|
|
|
app.on 'quit', ->
|
2015-01-21 23:02:09 +00:00
|
|
|
process.emit 'exit'
|
|
|
|
|
2015-11-06 10:27:13 +00:00
|
|
|
# Map process.exit to app.exit, which quits gracefully.
|
|
|
|
process.exit = app.exit
|
|
|
|
|
2015-01-21 23:02:09 +00:00
|
|
|
# Load the RPC server.
|
|
|
|
require './rpc-server'
|
|
|
|
|
|
|
|
# Load the guest view manager.
|
|
|
|
require './guest-view-manager'
|
|
|
|
require './guest-window-manager'
|
|
|
|
|
|
|
|
# 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
|
|
|
|
|
2015-09-30 09:29:38 +00:00
|
|
|
unless packageJson?
|
|
|
|
process.nextTick -> process.exit 1
|
|
|
|
throw new Error("Unable to find a valid app")
|
2015-01-21 23:02:09 +00:00
|
|
|
|
|
|
|
# Set application's version.
|
|
|
|
app.setVersion packageJson.version if packageJson.version?
|
|
|
|
|
|
|
|
# Set application's name.
|
|
|
|
if packageJson.productName?
|
|
|
|
app.setName packageJson.productName
|
|
|
|
else if packageJson.name?
|
|
|
|
app.setName packageJson.name
|
|
|
|
|
|
|
|
# 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"
|
2015-01-21 23:02:09 +00:00
|
|
|
|
2015-05-01 23:40:21 +00:00
|
|
|
# Chrome 42 disables NPAPI plugins by default, reenable them here
|
|
|
|
app.commandLine.appendSwitch 'enable-npapi'
|
|
|
|
|
2015-01-21 23:02:09 +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
|
2015-01-21 23:02:09 +00:00
|
|
|
|
|
|
|
# Load the chrome extension support.
|
2015-01-22 01:38:26 +00:00
|
|
|
require './chrome-extension'
|
2015-01-21 23:02:09 +00:00
|
|
|
|
2015-08-24 13:14:38 +00:00
|
|
|
# Set main startup script of the app.
|
|
|
|
mainStartupScript = packageJson.main or 'index.js'
|
|
|
|
|
2015-01-21 23:02:09 +00:00
|
|
|
# Finally load app's main.js and transfer control to C++.
|
2015-08-24 13:14:38 +00:00
|
|
|
Module._load path.join(packagePath, mainStartupScript), Module, true
|