forked from karma-runner/karma-ie-launcher
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
117 lines (97 loc) · 3.35 KB
/
index.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
var fs = require('fs');
var urlparse = require('url').parse;
var urlformat = require('url').format;
var exec = require('child_process').exec;
var processName = 'iexplore.exe';
function getInternetExplorerExe() {
var suffix = '\\Internet Explorer\\' + processName,
prefixes = [process.env['' + 'PROGRAMW6432'], // '' + ' trick to keep jscs happy
process.env['' + 'PROGRAMFILES(X86)'],
process.env['' + 'PROGRAMFILES']],
prefix, i;
for (i = 0; i < prefixes.length; i++) {
prefix = prefixes[i];
if (prefix && fs.existsSync(prefix + suffix)) {
return prefix + suffix;
}
}
}
var IEBrowser = function(baseBrowserDecorator, logger, args) {
baseBrowserDecorator(this);
var log = logger.create('launcher');
var flags = args.flags || [];
// Handle x-ua-compatible option:
//
// Usage :
// customLaunchers: {
// IE9: {
// base: 'IE',
// 'x-ua-compatible': 'IE=EmulateIE9'
// }
// }
//
// This is done by passing the option on the url, in response the Karma server will
// set the following meta in the page.
// <meta http-equiv="X-UA-Compatible" content="[VALUE]"/>
function handleXUaCompatible(args, urlObj) {
if (args['x-ua-compatible']) {
urlObj.query['x-ua-compatible'] = args['x-ua-compatible'];
}
}
// Spawning iexplore.exe spawns two processes (IE does that). The way karma kills the
// browser process (hard kill) leaves the other process in memory.
//
// The second process is created using command-line args like this:
// "C:\Program Files\Internet Explorer\iexplore.exe" SCODEF:2632 CREDAT:275457 /prefetch:2
// Where the SCODEF value is the pid of the 'original' process created by this launcher.
//
// This function kills any iexplore.exe process who's command line args match 'SCODEF:pid'.
// On IE11 this will kill the extra process. On older versions, no process will be found.
function killExtraIEProcess(pid, cb) {
var scodef = 'SCODEF:' + pid;
//wmic.exe : http://msdn.microsoft.com/en-us/library/aa394531(v=vs.85).aspx
var wmic = 'wmic.exe Path win32_Process ' +
'where "Name=\'' + processName + '\' and ' +
'CommandLine Like \'%' + scodef + '%\'" call Terminate';
exec(wmic, function(err) {
if (err) {
log.error('Killing extra IE process failed. ' + err);
} else {
log.debug('Killed extra IE process ' + pid);
}
cb();
});
}
this._getOptions = function(url) {
var urlObj = urlparse(url, true);
handleXUaCompatible(args, urlObj);
delete urlObj.search; //url.format does not want search attribute
url = urlformat(urlObj);
return [
'-extoff'
].concat(flags, [url]);
};
var baseOnProcessExit = this._onProcessExit;
this._onProcessExit = function(code, errorOutput) {
var pid = this._process.pid;
killExtraIEProcess(pid, function() {
if (baseOnProcessExit) {
baseOnProcessExit(code, errorOutput);
}
});
};
// this is to expose the function for unit testing
this._getInternetExplorerExe = getInternetExplorerExe;
};
IEBrowser.prototype = {
name: 'IE',
DEFAULT_CMD: {
win32: getInternetExplorerExe()
},
ENV_CMD: 'IE_BIN'
};
IEBrowser.$inject = ['baseBrowserDecorator', 'logger', 'args'];
// PUBLISH DI MODULE
module.exports = {
'launcher:IE': ['type', IEBrowser]
};