electron/lib/browser/init.js

184 lines
5 KiB
JavaScript
Raw Normal View History

'use strict'
2016-03-18 18:51:02 +00:00
const fs = require('fs')
const path = require('path')
const util = require('util')
const Module = require('module')
const v8 = require('v8')
2016-01-12 02:40:23 +00:00
2016-01-14 18:35:29 +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:40:23 +00:00
2016-01-14 18:35:29 +00:00
// Clear search paths.
require('../common/reset-search-paths')
2016-01-12 02:40:23 +00:00
2016-01-14 18:35:29 +00:00
// Import common settings.
require('../common/init')
2016-01-12 02:40:23 +00:00
var globalPaths = Module.globalPaths
2016-01-12 02:40:23 +00:00
2016-01-14 18:35:29 +00:00
// Expose public APIs.
globalPaths.push(path.join(__dirname, 'api', 'exports'))
2016-01-12 02:40:23 +00:00
if (process.platform === 'win32') {
2016-01-14 18:44:21 +00:00
// Redirect node's console to use our own implementations, since node can not
// handle console output when running as GUI program.
var consoleLog = function (...args) {
return process.log(util.format.apply(util, args) + '\n')
}
var streamWrite = function (chunk, encoding, callback) {
2016-01-12 02:40:23 +00:00
if (Buffer.isBuffer(chunk)) {
chunk = chunk.toString(encoding)
2016-01-12 02:40:23 +00:00
}
process.log(chunk)
2016-01-12 02:40:23 +00:00
if (callback) {
callback()
2016-01-12 02:40:23 +00:00
}
return true
}
console.log = console.error = console.warn = consoleLog
process.stdout.write = process.stderr.write = streamWrite
2016-01-12 02:40:23 +00:00
2016-01-14 18:35:29 +00:00
// Always returns EOF for stdin stream.
var Readable = require('stream').Readable
2016-03-29 00:35:49 +00:00
var stdin = new Readable()
stdin.push(null)
process.__defineGetter__('stdin', function () {
return stdin
})
2016-01-12 02:40:23 +00:00
}
2016-01-14 18:35:29 +00:00
// Don't quit on fatal error.
process.on('uncaughtException', function (error) {
2016-01-14 18:35:29 +00:00
// Do nothing if the user has a custom uncaught exception handler.
var dialog, message, ref, stack
2016-01-12 02:40:23 +00:00
if (process.listeners('uncaughtException').length > 1) {
return
2016-01-12 02:40:23 +00:00
}
2016-01-14 18:35:29 +00:00
// Show error in GUI.
dialog = require('electron').dialog
stack = (ref = error.stack) != null ? ref : error.name + ': ' + error.message
message = 'Uncaught Exception:\n' + stack
2016-05-19 22:28:08 +00:00
dialog.showErrorBox('A JavaScript error occurred in the main process', message)
})
2016-01-12 02:40:23 +00:00
2016-01-14 18:35:29 +00:00
// Emit 'exit' event on quit.
var app = require('electron').app
2016-01-12 02:40:23 +00:00
app.on('quit', function (event, exitCode) {
2016-05-19 22:28:08 +00:00
process.emit('exit', exitCode)
})
2016-01-12 02:40:23 +00:00
if (process.platform === 'win32') {
// If we are a Squirrel.Windows-installed app, set app user model ID
// so that users don't have to do this.
//
// Squirrel packages are always of the form:
//
// PACKAGE-NAME
// - Update.exe
// - app-VERSION
// - OUREXE.exe
//
// Squirrel itself will always set the shortcut's App User Model ID to the
// form `com.squirrel.PACKAGE-NAME.OUREXE`. We need to call
// app.setAppUserModelId with a matching identifier so that renderer processes
// will inherit this value.
var updateDotExe = path.join(
path.dirname(process.execPath),
'..',
'update.exe')
if (fs.statSyncNoException(updateDotExe)) {
var packageDir = path.dirname(path.resolve(updateDotExe))
var packageName = path.basename(packageDir)
var exeName = path.basename(process.execPath).replace(/\.exe$/i, '')
app.setAppUserModelId(`com.squirrel.${packageName}.${exeName}`)
}
}
2016-01-14 18:35:29 +00:00
// Map process.exit to app.exit, which quits gracefully.
process.exit = app.exit
2016-01-12 02:40:23 +00:00
2016-01-14 18:35:29 +00:00
// Load the RPC server.
require('./rpc-server')
2016-01-12 02:40:23 +00:00
2016-01-14 18:35:29 +00:00
// Load the guest view manager.
require('./guest-view-manager')
2016-01-12 02:40:23 +00:00
require('./guest-window-manager')
2016-01-12 02:40:23 +00:00
2016-01-14 18:35:29 +00:00
// Now we try to load app's package.json.
var packageJson = null
2016-03-30 18:50:17 +00:00
var searchPaths = ['app', 'app.asar', 'default_app.asar']
var i, len, packagePath
2016-01-12 02:40:23 +00:00
for (i = 0, len = searchPaths.length; i < len; i++) {
packagePath = searchPaths[i]
2016-01-12 02:40:23 +00:00
try {
packagePath = path.join(process.resourcesPath, packagePath)
packageJson = JSON.parse(fs.readFileSync(path.join(packagePath, 'package.json')))
break
2016-01-14 21:21:11 +00:00
} catch (error) {
continue
2016-01-12 02:40:23 +00:00
}
}
if (packageJson == null) {
process.nextTick(function () {
return process.exit(1)
})
throw new Error('Unable to find a valid app')
2016-01-12 02:40:23 +00:00
}
2016-01-14 18:35:29 +00:00
// Set application's version.
2016-01-12 02:40:23 +00:00
if (packageJson.version != null) {
app.setVersion(packageJson.version)
2016-01-12 02:40:23 +00:00
}
2016-01-14 18:35:29 +00:00
// Set application's name.
2016-01-12 02:40:23 +00:00
if (packageJson.productName != null) {
app.setName(packageJson.productName)
2016-01-12 02:40:23 +00:00
} else if (packageJson.name != null) {
app.setName(packageJson.name)
2016-01-12 02:40:23 +00:00
}
2016-01-14 18:35:29 +00:00
// Set application's desktop name.
2016-01-12 02:40:23 +00:00
if (packageJson.desktopName != null) {
app.setDesktopName(packageJson.desktopName)
2016-01-12 02:40:23 +00:00
} else {
app.setDesktopName((app.getName()) + '.desktop')
2016-01-12 02:40:23 +00:00
}
// Set v8 flags
if (packageJson.v8Flags != null) {
v8.setFlagsFromString(packageJson.v8Flags)
}
2016-01-14 18:35:29 +00:00
// Chrome 42 disables NPAPI plugins by default, reenable them here
app.commandLine.appendSwitch('enable-npapi')
2016-01-12 02:40:23 +00:00
2016-01-14 18:35:29 +00:00
// Set the user path according to application's name.
app.setPath('userData', path.join(app.getPath('appData'), app.getName()))
2016-01-12 02:40:23 +00:00
app.setPath('userCache', path.join(app.getPath('cache'), app.getName()))
2016-01-12 02:40:23 +00:00
app.setAppPath(packagePath)
2016-01-12 02:40:23 +00:00
2016-01-14 18:35:29 +00:00
// Load the chrome extension support.
require('./chrome-extension')
2016-01-12 02:40:23 +00:00
2016-01-14 18:35:29 +00:00
// Load internal desktop-capturer module.
require('./desktop-capturer')
2016-01-12 02:40:23 +00:00
2016-06-23 01:51:39 +00:00
// Load protocol module to ensure it is populated on app ready
require('./api/protocol')
2016-01-14 18:35:29 +00:00
// Set main startup script of the app.
var mainStartupScript = packageJson.main || 'index.js'
2016-01-12 02:40:23 +00:00
2016-01-14 18:35:29 +00:00
// Finally load app's main.js and transfer control to C++.
Module._load(path.join(packagePath, mainStartupScript), Module, true)