Skip to content

Commit

Permalink
fix: kill all IE processes when terminating browser process
Browse files Browse the repository at this point in the history
closes #15
  • Loading branch information
sylvain-hamel committed Apr 1, 2014
1 parent 3230663 commit 1279381
Showing 1 changed file with 65 additions and 26 deletions.
91 changes: 65 additions & 26 deletions index.js
@@ -1,13 +1,65 @@
var fs = require('fs');
var util = require('util');
var urlparse = require('url').parse;
var urlformat = require('url').format;
var exec = require('child_process').exec;

var IEBrowser = function(baseBrowserDecorator, args) {
var processName = 'iexplore.exe';

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);

Expand All @@ -20,31 +72,19 @@ var IEBrowser = function(baseBrowserDecorator, args) {
'-extoff'
].concat(flags, [url]);
};
};

/**
* 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'];
}
}
var baseOnProcessExit = this._onProcessExit;
this._onProcessExit = function(code, errorOutput) {
var pid = this._process.pid;
killExtraIEProcess(pid, function() {
baseOnProcessExit(code, errorOutput);
});
};

};

function getInternetExplorerExe() {
var suffix = '\\Internet Explorer\\iexplore.exe',
var suffix = '\\Internet Explorer\\' + processName,
prefixes = [process.env['PROGRAMW6432'], process.env['PROGRAMFILES(X86)'], process.env['PROGRAMFILES']],
prefix, i;

Expand All @@ -66,8 +106,7 @@ IEBrowser.prototype = {
ENV_CMD: 'IE_BIN'
};

IEBrowser.$inject = ['baseBrowserDecorator', 'args'];

IEBrowser.$inject = ['baseBrowserDecorator', 'logger', 'args'];

// PUBLISH DI MODULE
module.exports = {
Expand Down

0 comments on commit 1279381

Please sign in to comment.