diff --git a/index.js b/index.js index 86f07c6..9dc1443 100644 --- a/index.js +++ b/index.js @@ -1,8 +1,12 @@ var fs = require('fs'); +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'); args = args || {}; var flags = args.flags || []; @@ -10,11 +14,49 @@ var IEBrowser = function(baseBrowserDecorator, args) { return [ '-extoff' ].concat(flags, [url]); + }; + + var baseOnProcessExit = this._onProcessExit; + this._onProcessExit = function(code, errorOutput) { + var pid = this._process.pid; + killExtraIEProcess(pid, function() { + baseOnProcessExit(code, errorOutput); + }); + }; + + // 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(); + }); + } }; 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; @@ -36,7 +78,7 @@ IEBrowser.prototype = { ENV_CMD: 'IE_BIN' }; -IEBrowser.$inject = ['baseBrowserDecorator']; +IEBrowser.$inject = ['baseBrowserDecorator', 'logger', 'args']; // PUBLISH DI MODULE