forked from alexscheelmeyer/node-phantom
-
Notifications
You must be signed in to change notification settings - Fork 1
/
bridge.js
121 lines (113 loc) · 3.08 KB
/
bridge.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
//Released to the public domain.
var port=phantom.args[0];
var webpage=require('webpage');
var controlpage=webpage.create();
function respond(response){
// console.log('responding:'+response);
controlpage.evaluate('function(){socket.emit("res",'+JSON.stringify(response)+');}');
}
var pages={};
var pageId=1;
function setupPushNotifications(id, page) {
var callbacks = [
'onAlert','onConfirm','onConsoleMessage','onError','onInitialized','onLoadFinished',
'onLoadStarted','onPrompt','onResourceRequested','onResourceReceived','onUrlChanged',
'onCallback'
];
callbacks.forEach(function(cb) {
page[cb] = function() { push([id, cb, Array.prototype.slice.call(arguments)]); }
})
function push(notification) {
controlpage.evaluate('function(){socket.emit("push",'+JSON.stringify(notification)+');}');
}
}
controlpage.onAlert=function(msg){
var request=JSON.parse(msg);
var cmdId=request[1];
// console.log(request);
if(request[0]===0){
switch(request[2]){
case 'createPage':
var id=pageId++;
var page=webpage.create();
pages[id]=page;
setupPushNotifications(id, page);
respond([id,cmdId,'pageCreated']);
break;
case 'injectJs':
var success=phantom.injectJs(request[3]);
respond([0,cmdId,'jsInjected',success]);
break;
case 'exit':
respond([0,cmdId,'phantomExited']); //optimistically to get the response back before the line is cut
break;
case 'exitAck':
phantom.exit();
break;
default:
console.error('unrecognized request:'+request);
break;
}
}
else{
var id=request[0];
var page=pages[id];
switch(request[2]){
case 'pageOpen':
page.open(request[3],function(status){
respond([id,cmdId,'pageOpened',status]);
});
break;
case 'pageRelease':
page.release();
respond([id,cmdId,'pageReleased']);
break;
case 'pageInjectJs':
var result=page.injectJs(request[3]);
respond([id,cmdId,'pageJsInjected',JSON.stringify(result)]);
break;
case 'pageIncludeJs':
page.includeJs(request[3]);
respond([id,cmdId,'pageJsIncluded']);
break;
case 'pageSendEvent':
page.sendEvent(request[3],request[4],request[5]);
respond([id,cmdId,'pageEventSent']);
break;
case 'pageUploadFile':
page.uploadFile(request[3],request[4]);
respond([id,cmdId,'pageFileUploaded']);
break;
case 'pageEvaluate':
var result=page.evaluate(request[3]);
respond([id,cmdId,'pageEvaluated',JSON.stringify(result)]);
break;
case 'pageRender':
page.render(request[3]);
respond([id,cmdId,'pageRendered']);
break;
case 'pageSet':
page[request[3]]=request[4];
respond([id,cmdId,'pageSetDone']);
break;
case 'pageGet':
var result=page[request[3]];
respond([id,cmdId,'pageGetDone',JSON.stringify(result)]);
break;
case 'pageSetFn':
page[request[3]] = eval('(' + request[4] + ')')
break;
default:
console.error('unrecognized request:'+request);
break;
}
}
//console.log('command:'+parts[1]);
return;
};
controlpage.onConsoleMessage=function(msg){
return console.log('console msg:'+msg);
};
controlpage.open('http://127.0.0.1:'+port+'/',function(status){
//console.log(status);
});