1 var fs = require('fs'),
2 path = require('path'),
3 which = require('which');
5 function isJSFlags(flag) {
6 return flag.indexOf('--js-flags=') === 0;
9 function sanitizeJSFlags(flag) {
10 var test = /--js-flags=(['"])/.exec(flag);
14 var escapeChar = test[1];
15 var endExp = new RegExp(escapeChar + '$');
16 var startExp = new RegExp('--js-flags=' + escapeChar);
17 return flag.replace(startExp, '--js-flags=').replace(endExp, '');
20 var ChromeBrowser = function(baseBrowserDecorator, args) {
21 baseBrowserDecorator(this);
23 var flags = args.flags || [];
25 this._getOptions = function(url) {
27 // http://peter.sh/experiments/chromium-command-line-switches/
28 flags.forEach(function(flag, i) {
29 if (isJSFlags(flag)) {
30 flags[i] = sanitizeJSFlags(flag);
35 '--user-data-dir=' + this._tempDir,
36 '--no-default-browser-check',
38 '--disable-default-apps',
39 '--disable-popup-blocking',
41 ].concat(flags, [url]);
45 // Return location of chrome.exe file for a given Chrome directory (available: "Chrome", "Chrome SxS").
46 function getChromeExe(chromeDirName) {
47 // Only run these checks on win32
48 if (process.platform !== 'win32') {
51 var windowsChromeDirectory, i, prefix;
52 var suffix = '\\Google\\' + chromeDirName + '\\Application\\chrome.exe';
53 var prefixes = [process.env.LOCALAPPDATA, process.env.PROGRAMFILES, process.env['PROGRAMFILES(X86)']];
55 for (i = 0; i < prefixes.length; i++) {
58 windowsChromeDirectory = path.join(prefix, suffix);
59 fs.accessSync(windowsChromeDirectory);
60 return windowsChromeDirectory;
64 return windowsChromeDirectory;
67 function getBin(commands) {
68 // Don't run these checks on win32
69 if (process.platform !== 'linux') {
73 for (i = 0; i < commands.length; i++) {
75 if (which.sync(commands[i])) {
84 function getChromeDarwin(defaultPath) {
85 if (process.platform !== 'darwin') {
90 var homePath = path.join(process.env.HOME, defaultPath);
91 fs.accessSync(homePath);
98 ChromeBrowser.prototype = {
102 // Try chromium-browser before chromium to avoid conflict with the legacy
103 // chromium-bsu package previously known as 'chromium' in Debian and Ubuntu.
104 linux: getBin(['chromium-browser', 'chromium', 'google-chrome', 'google-chrome-stable']),
105 darwin: getChromeDarwin('/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'),
106 win32: getChromeExe('Chrome')
108 ENV_CMD: 'CHROME_BIN'
111 ChromeBrowser.$inject = ['baseBrowserDecorator', 'args'];
113 function canaryGetOptions(url, args, parent) {
114 // disable crankshaft optimizations, as it causes lot of memory leaks (as of Chrome 23.0)
115 var flags = args.flags || [];
117 var customFlags = '--nocrankshaft --noopt';
119 flags.forEach(function(flag) {
120 if (isJSFlags(flag)) {
121 augmentedFlags = sanitizeJSFlags(flag) + ' ' + customFlags;
125 return parent.call(this, url).concat([augmentedFlags || '--js-flags=' + customFlags]);
128 var ChromeCanaryBrowser = function(baseBrowserDecorator, args) {
129 ChromeBrowser.apply(this, arguments);
131 var parentOptions = this._getOptions;
132 this._getOptions = function(url) {
133 return canaryGetOptions.call(this, url, args, parentOptions);
137 ChromeCanaryBrowser.prototype = {
138 name: 'ChromeCanary',
141 linux: 'google-chrome-canary',
142 darwin: getChromeDarwin('/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary'),
143 win32: getChromeExe('Chrome SxS')
145 ENV_CMD: 'CHROME_CANARY_BIN'
148 ChromeCanaryBrowser.$inject = ['baseBrowserDecorator', 'args'];
150 var DartiumBrowser = function() {
151 ChromeBrowser.apply(this, arguments);
153 var checkedFlag = '--checked';
154 var dartFlags = process.env.DART_FLAGS || '';
155 var flags = dartFlags.split(' ');
156 if (flags.indexOf(checkedFlag) === -1) {
157 flags.push(checkedFlag);
158 process.env.DART_FLAGS = flags.join(' ');
162 DartiumBrowser.prototype = {
165 ENV_CMD: 'DARTIUM_BIN'
168 DartiumBrowser.$inject = ['baseBrowserDecorator', 'args'];
172 'launcher:Chrome': ['type', ChromeBrowser],
173 'launcher:ChromeCanary': ['type', ChromeCanaryBrowser],
174 'launcher:Dartium': ['type', DartiumBrowser]
177 module.exports.test = {
178 isJSFlags: isJSFlags,
179 sanitizeJSFlags: sanitizeJSFlags,
180 canaryGetOptions: canaryGetOptions