From 12793814aeaaecc4bc61ef260bef311f27091f93 Mon Sep 17 00:00:00 2001 From: sylvain-hamel Date: Mon, 31 Mar 2014 23:19:12 -0400 Subject: [PATCH] fix: kill all IE processes when terminating browser process closes #15 --- index.js | 91 ++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 65 insertions(+), 26 deletions(-) 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 = {