Skip to content

Commit

Permalink
feat: merge user-provided --{disable,enable}-features in args (#11152)
Browse files Browse the repository at this point in the history
Bug: #11072
  • Loading branch information
thiagowfx committed Oct 15, 2023
1 parent d99f9d7 commit 2b578e4
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 1 deletion.
47 changes: 47 additions & 0 deletions packages/puppeteer-core/src/node/ChromeLauncher.test.ts
@@ -0,0 +1,47 @@
/**
* Copyright 2023 Google Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {describe, it} from 'node:test';

import expect from 'expect';

import {getFeatures} from './ChromeLauncher.js';

describe('getFeatures', () => {
it('returns an empty array when no options are provided', () => {
const result = getFeatures('--foo');
expect(result).toEqual([]);
});

it('returns an empty array when no options match the flag', () => {
const result = getFeatures('--foo', ['--bar', '--baz']);
expect(result).toEqual([]);
});

it('returns an array of values when options match the flag', () => {
const result = getFeatures('--foo', ['--foo=bar', '--foo=baz']);
expect(result).toEqual(['bar', 'baz']);
});

it('does not handle whitespace', () => {
const result = getFeatures('--foo', ['--foo bar', '--foo baz ']);
expect(result).toEqual([]);
});

it('handles equals sign around the flag and value', () => {
const result = getFeatures('--foo', ['--foo=bar', '--foo=baz ']);
expect(result).toEqual(['bar', 'baz']);
});
});
33 changes: 32 additions & 1 deletion packages/puppeteer-core/src/node/ChromeLauncher.ts
Expand Up @@ -166,6 +166,7 @@ export class ChromeLauncher extends ProductLauncher {
override defaultArgs(options: BrowserLaunchArgumentOptions = {}): string[] {
// See https://github.com/GoogleChrome/chrome-launcher/blob/main/docs/chrome-flags-for-tools.md

// Merge default disabled features with user-provided ones, if any.
const disabledFeatures = [
'Translate',
// AcceptCHFrame disabled because of crbug.com/1348106.
Expand All @@ -174,9 +175,14 @@ export class ChromeLauncher extends ProductLauncher {
'OptimizationHints',
// https://crbug.com/1492053
'ProcessPerSiteUpToMainFrameThreshold',
...getFeatures('--disable-features', options.args),
];

const enabledFeatures = ['NetworkServiceInProcess2'];
// Merge default enabled features with user-provided ones, if any.
const enabledFeatures = [
'NetworkServiceInProcess2',
...getFeatures('--enable-features', options.args),
];

const chromeArguments = [
'--allow-pre-commit-input',
Expand Down Expand Up @@ -266,3 +272,28 @@ function convertPuppeteerChannelToBrowsersChannel(
return BrowsersChromeReleaseChannel.CANARY;
}
}

/**
* Extracts all features from the given command-line flag
* (e.g. `--enable-features`, `--enable-features=`).
*
* Example input:
* ["--enable-features=NetworkService,NetworkServiceInProcess", "--enable-features=Foo"]
*
* Example output:
* ["NetworkService", "NetworkServiceInProcess", "Foo"]
*
* @internal
*/
export function getFeatures(flag: string, options: string[] = []): string[] {
return options
.filter(s => {
return s.startsWith(flag.endsWith('=') ? flag : `${flag}=`);
})
.map(s => {
return s.split(new RegExp(`${flag}` + '=\\s*'))[1]?.trim();
})
.filter(s => {
return s;
}) as string[];
}

0 comments on commit 2b578e4

Please sign in to comment.