118 lines
3.5 KiB
JavaScript
118 lines
3.5 KiB
JavaScript
var fs = require('fs')
|
|
var path = require('path')
|
|
var _ = require('lodash')
|
|
|
|
function serializeOption (value) {
|
|
if (typeof value === 'function') {
|
|
return value.toString()
|
|
}
|
|
return JSON.stringify(value)
|
|
}
|
|
|
|
var phantomJSExePath = function () {
|
|
// If the path we're given by phantomjs is to a .cmd, it is pointing to a global copy.
|
|
// Using the cmd as the process to execute causes problems cleaning up the processes
|
|
// so we walk from the cmd to the phantomjs.exe and use that instead.
|
|
var phantomSource = require('phantomjs-prebuilt').path
|
|
|
|
if (path.extname(phantomSource).toLowerCase() === '.cmd') {
|
|
var phantomPackage = require('phantomjs-prebuilt/package.json')
|
|
return path.join(
|
|
path.dirname(phantomSource),
|
|
['', 'node_modules', phantomPackage._location, 'lib', 'phantom', ''].join('//'),
|
|
phantomPackage.bin.phantomjs
|
|
)
|
|
}
|
|
|
|
return phantomSource
|
|
}
|
|
|
|
var PhantomJSBrowser = function (baseBrowserDecorator, config, args, logger) {
|
|
var log = logger.create('phantomjs.launcher')
|
|
|
|
baseBrowserDecorator(this)
|
|
|
|
var options = args && args.options || config && config.options || {}
|
|
var providedFlags = args && args.flags || config && config.flags || []
|
|
|
|
this._start = function (url) {
|
|
// create the js file that will open karma
|
|
var captureFile = this._tempDir + '/capture.js'
|
|
var pageOptions = {}
|
|
var pageSettingsOptions = {}
|
|
|
|
_.forOwn(options, function (optionsValue, optionsKey) {
|
|
if (optionsKey !== 'settings') { // settings cannot be overriden, it should be extended!
|
|
pageOptions[optionsKey] = serializeOption(optionsValue)
|
|
} else {
|
|
// key === settings
|
|
_.forOwn(optionsValue, function (settingsValue, settingsKey) {
|
|
pageSettingsOptions[settingsKey] = serializeOption(settingsValue)
|
|
})
|
|
}
|
|
})
|
|
|
|
var file = fs.readFileSync(path.join(__dirname, 'capture.template.js'))
|
|
|
|
var compiled = _.template(file.toString())
|
|
var captureCode = compiled({
|
|
debug: args.debug,
|
|
exitOnResourceError: config && config.exitOnResourceError,
|
|
pageOptions: pageOptions,
|
|
pageSettingsOptions: pageSettingsOptions,
|
|
url: url
|
|
})
|
|
|
|
fs.writeFileSync(captureFile, captureCode)
|
|
|
|
// PhantomJS has the following convention for arguments
|
|
// phantomjs [switchs] [options] [script] [argument [argument [...]]]
|
|
// with options being equal to flags
|
|
var flags = providedFlags
|
|
if (args.debug) {
|
|
flags.push('--remote-debugger-port=9000')
|
|
flags.push('--remote-debugger-autorun=yes')
|
|
}
|
|
|
|
flags.push(captureFile)
|
|
|
|
// and start phantomjs
|
|
this._execCommand(this._getCommand(), flags)
|
|
|
|
this._process.stderr.on('data', function (data) {
|
|
log.error('' + data)
|
|
})
|
|
|
|
this._process.stdout.on('data', function (data) {
|
|
log.debug('' + data)
|
|
})
|
|
|
|
if (args.debug) {
|
|
log.info('ACTION REQUIRED:')
|
|
log.info('')
|
|
log.info(' Launch browser at')
|
|
log.info(' http://localhost:9000/webkit/inspector/inspector.html?page=2')
|
|
log.info('')
|
|
log.info('Waiting 15 seconds ...')
|
|
}
|
|
}
|
|
}
|
|
|
|
PhantomJSBrowser.prototype = {
|
|
name: 'PhantomJS',
|
|
|
|
DEFAULT_CMD: {
|
|
linux: require('phantomjs-prebuilt').path,
|
|
darwin: require('phantomjs-prebuilt').path,
|
|
win32: phantomJSExePath()
|
|
},
|
|
ENV_CMD: 'PHANTOMJS_BIN'
|
|
}
|
|
|
|
PhantomJSBrowser.$inject = ['baseBrowserDecorator', 'config.phantomjsLauncher', 'args', 'logger']
|
|
|
|
// PUBLISH DI MODULE
|
|
module.exports = {
|
|
'launcher:PhantomJS': ['type', PhantomJSBrowser]
|
|
}
|