nightmare
Version:
A high-level browser automation library.
109 lines (94 loc) • 2.38 kB
JavaScript
/* eslint-disable no-console */
var ipc = require('electron').ipcRenderer
var sliced = require('sliced')
function send(_event) {
ipc.send.apply(ipc, arguments)
}
// offer limited access to allow
// .evaluate() and .inject()
// to continue to work as expected.
//
// TODO: this could be avoided by
// rewriting the evaluate to
// use promises instead. But
// for now this fixes the security
// issue in: segmentio/nightmare/#1358
window.__nightmare = {
resolve: function(value) {
send('response', value)
},
reject: function(err) {
send('error', error(err))
}
}
// Listen for error events
window.addEventListener(
'error',
function(err) {
send('page', 'error', error(err))
},
true
)
// prevent 'unload' and 'beforeunload' from being bound
var defaultAddEventListener = window.addEventListener
window.addEventListener = function(type) {
if (type === 'unload' || type === 'beforeunload') {
return
}
defaultAddEventListener.apply(window, arguments)
}
// prevent 'onunload' and 'onbeforeunload' from being set
Object.defineProperties(window, {
onunload: {
enumerable: true,
writable: false,
value: null
},
onbeforeunload: {
enumerable: true,
writable: false,
value: null
}
})
// listen for console.log
var defaultLog = console.log
console.log = function() {
send('console', 'log', sliced(arguments))
return defaultLog.apply(this, arguments)
}
// listen for console.warn
var defaultWarn = console.warn
console.warn = function() {
send('console', 'warn', sliced(arguments))
return defaultWarn.apply(this, arguments)
}
// listen for console.error
var defaultError = console.error
console.error = function() {
send('console', 'error', sliced(arguments))
return defaultError.apply(this, arguments)
}
// overwrite the default alert
window.alert = function(message) {
send('page', 'alert', message)
}
// overwrite the default prompt
window.prompt = function(message, defaultResponse) {
send('page', 'prompt', message, defaultResponse)
}
// overwrite the default confirm
window.confirm = function(message, defaultResponse) {
send('page', 'confirm', message, defaultResponse)
}
/**
* Make errors serializeable
*/
function error(err) {
if (!(err instanceof Error)) return err
return {
code: err.code,
message: err.message,
details: err.detail,
stack: err.stack || ''
}
}