fix: do not pass --{enable,disable}-features twice when user-provided (#11230)
This commit is contained in:
parent
014c72ae1d
commit
edec7d53f8
@ -17,7 +17,7 @@ import {describe, it} from 'node:test';
|
|||||||
|
|
||||||
import expect from 'expect';
|
import expect from 'expect';
|
||||||
|
|
||||||
import {getFeatures} from './ChromeLauncher.js';
|
import {getFeatures, removeMatchingFlags} from './ChromeLauncher.js';
|
||||||
|
|
||||||
describe('getFeatures', () => {
|
describe('getFeatures', () => {
|
||||||
it('returns an empty array when no options are provided', () => {
|
it('returns an empty array when no options are provided', () => {
|
||||||
@ -45,3 +45,25 @@ describe('getFeatures', () => {
|
|||||||
expect(result).toEqual(['bar', 'baz']);
|
expect(result).toEqual(['bar', 'baz']);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('removeMatchingFlags', () => {
|
||||||
|
it('empty', () => {
|
||||||
|
const a: string[] = [];
|
||||||
|
expect(removeMatchingFlags(a, '--foo')).toEqual([]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('with one match', () => {
|
||||||
|
const a: string[] = ['--foo=1', '--bar=baz'];
|
||||||
|
expect(removeMatchingFlags(a, '--foo')).toEqual(['--bar=baz']);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('with multiple matches', () => {
|
||||||
|
const a: string[] = ['--foo=1', '--foo=2', '--bar=baz'];
|
||||||
|
expect(removeMatchingFlags(a, '--foo')).toEqual(['--bar=baz']);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('with no matches', () => {
|
||||||
|
const a: string[] = ['--foo=1', '--bar=baz'];
|
||||||
|
expect(removeMatchingFlags(a, '--baz')).toEqual(['--foo=1', '--bar=baz']);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
@ -166,6 +166,14 @@ export class ChromeLauncher extends ProductLauncher {
|
|||||||
override defaultArgs(options: BrowserLaunchArgumentOptions = {}): string[] {
|
override defaultArgs(options: BrowserLaunchArgumentOptions = {}): string[] {
|
||||||
// See https://github.com/GoogleChrome/chrome-launcher/blob/main/docs/chrome-flags-for-tools.md
|
// See https://github.com/GoogleChrome/chrome-launcher/blob/main/docs/chrome-flags-for-tools.md
|
||||||
|
|
||||||
|
const userDisabledFeatures = getFeatures(
|
||||||
|
'--disable-features',
|
||||||
|
options.args
|
||||||
|
);
|
||||||
|
if (options.args && userDisabledFeatures.length > 0) {
|
||||||
|
removeMatchingFlags(options.args, '--disable-features');
|
||||||
|
}
|
||||||
|
|
||||||
// Merge default disabled features with user-provided ones, if any.
|
// Merge default disabled features with user-provided ones, if any.
|
||||||
const disabledFeatures = [
|
const disabledFeatures = [
|
||||||
'Translate',
|
'Translate',
|
||||||
@ -175,13 +183,18 @@ export class ChromeLauncher extends ProductLauncher {
|
|||||||
'OptimizationHints',
|
'OptimizationHints',
|
||||||
// https://crbug.com/1492053
|
// https://crbug.com/1492053
|
||||||
'ProcessPerSiteUpToMainFrameThreshold',
|
'ProcessPerSiteUpToMainFrameThreshold',
|
||||||
...getFeatures('--disable-features', options.args),
|
...userDisabledFeatures,
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const userEnabledFeatures = getFeatures('--enable-features', options.args);
|
||||||
|
if (options.args && userEnabledFeatures.length > 0) {
|
||||||
|
removeMatchingFlags(options.args, '--enable-features');
|
||||||
|
}
|
||||||
|
|
||||||
// Merge default enabled features with user-provided ones, if any.
|
// Merge default enabled features with user-provided ones, if any.
|
||||||
const enabledFeatures = [
|
const enabledFeatures = [
|
||||||
'NetworkServiceInProcess2',
|
'NetworkServiceInProcess2',
|
||||||
...getFeatures('--enable-features', options.args),
|
...userEnabledFeatures,
|
||||||
];
|
];
|
||||||
|
|
||||||
const chromeArguments = [
|
const chromeArguments = [
|
||||||
@ -297,3 +310,22 @@ export function getFeatures(flag: string, options: string[] = []): string[] {
|
|||||||
return s;
|
return s;
|
||||||
}) as string[];
|
}) as string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes all elements in-place from the given string array
|
||||||
|
* that match the given command-line flag.
|
||||||
|
*
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
export function removeMatchingFlags(array: string[], flag: string): string[] {
|
||||||
|
const regex = new RegExp(`^${flag}=.*`);
|
||||||
|
let i = 0;
|
||||||
|
while (i < array.length) {
|
||||||
|
if (regex.test(array[i]!)) {
|
||||||
|
array.splice(i, 1);
|
||||||
|
} else {
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user