diff --git a/index.js b/index.js
index 8e2f6eb..2abc590 100644
--- a/index.js
+++ b/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.
+ //
+ 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);
@@ -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.
- *
- */
-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;
@@ -66,8 +106,7 @@ IEBrowser.prototype = {
ENV_CMD: 'IE_BIN'
};
-IEBrowser.$inject = ['baseBrowserDecorator', 'args'];
-
+IEBrowser.$inject = ['baseBrowserDecorator', 'logger', 'args'];
// PUBLISH DI MODULE
module.exports = {