description and source-codecreate = function (callback, options){
if(options===undefined)options={};
if(options.phantomPath===undefined)options.phantomPath='phantomjs';
if(options.parameters===undefined)options.parameters={};
function spawnPhantom(port,callback){
var args=[];
for(var parm in options.parameters) {
args.push('--' + parm + '=' + options.parameters[parm]);
}
args=args.concat([__dirname + '/bridge.js', port]);
var phantom=child.spawn(options.phantomPath,args);
phantom.stdout.on('data',function(data){
return console.log('phantom stdout: '+data);
});
phantom.stderr.on('data',function(data){
return console.warn('phantom stderr: '+data);
});
var hasErrors=false;
phantom.on('error',function(){
hasErrors=true;
});
phantom.on('exit',function(code){
hasErrors=true; //if phantom exits it is always an error
});
setTimeout(function(){ //wait a bit to see if the spawning of phantomjs immediately fails due to bad path or similar
callback(hasErrors,phantom);
},100);
}
var server=http.createServer(function(request,response){
response.writeHead(200,{"Content-Type": "text/html"});
response.end('<html><head><script src="/socket.io/socket.io.js" type="text/javascript"></script><script type="text/javascript
">\n\
window.onload=function(){\n\
var socket = new io.connect("http://" + window.location.hostname);\n\
socket.on("cmd", function(msg){\n\
alert(msg);\n\
});\n\
window.socket = socket;\n\
};\n\
</script></head><body></body></html>');
}).listen(function(){
var io=socketio.listen(server,{'log level':1});
var port=server.address().port;
spawnPhantom(port,function(err,phantom){
if(err){
server.close();
callback(true);
return;
}
var pages={};
var cmds={};
var cmdid=0;
function request(socket,args,callback){
args.splice(1,0,cmdid);
// console.log('requesting:'+args);
socket.emit('cmd',JSON.stringify(args));
cmds[cmdid]={cb:callback};
cmdid++;
}
io.sockets.on('connection',function(socket){
socket.on('res',function(response){
// console.log(response);
var id=response[0];
var cmdId=response[1];
switch(response[2]){
case 'pageCreated':
var pageProxy={
open:function(url, callback){
if(callback === undefined){
request(socket, [id, 'pageOpen', url]);
}else{
request(socket, [id, 'pageOpenWithCallback', url], callback);
}
},
close:function(callback){
request(socket,[id,'pageClose'],callbackOrDummy(callback));
},
render:function(filename,callback){
request(socket,[id,'pageRender',filename],callbackOrDummy(callback));
},
renderBase64:function(extension,callback){
request(socket,[id,'pageRenderBase64',extension],callbackOrDummy(callback));
},
injectJs:function(url,callback){
request(socket,[id,'pageInjectJs',url],callbackOrDummy(callback));
},
includeJs:function(url,callback){
request(socket,[id,'pageIncludeJs',url],callbackOrDummy(callback));
},
sendEvent:function(event,x,y,callback){
request(socket,[id,'pageSendEvent',event,x,y],callbackOrDummy(callback));
},
uploadFile:function(selector,filename,callback){
request(socket,[id,'pageUploadFile',selector,filename],callbackOrDummy(callback));
},
evaluate:function(evaluator,callback){
request(socket,[id,'pageEvaluate',evaluator.toString()].concat(Array.prototype.slice.call(arguments,2)),callbackOrDummy
(callback));
},
evaluateAsync:function(evaluator,callback){
request(socket,[id,'pageEvaluateAsync',evaluator.toString()].concat(Array.prototype.slice.call(arguments,2)),callbackOrDummy
(callback));
},
set:function(name,value,callback){
request(socket,[id,'pageSet',name,value],callbackOrDummy(callback));
},
get:function(name,callback){ ...