From 367fc5f2437bf18e769b1add856f4d8d88db6b3b Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 4 Jul 2025 11:17:56 +0200 Subject: [PATCH] exp - introduce and use flag to disable experiments (#254057) * exp - introduce and use flag to disable experiments * fix --- .vscode-test.js | 2 +- extensions/vscode-test-resolver/src/extension.ts | 2 +- scripts/test-integration.bat | 2 +- scripts/test-integration.sh | 2 +- scripts/test-remote-integration.bat | 2 +- scripts/test-remote-integration.sh | 2 +- src/vs/editor/standalone/browser/standaloneServices.ts | 1 + src/vs/platform/environment/common/argv.ts | 1 + src/vs/platform/environment/common/environment.ts | 3 ++- src/vs/platform/environment/common/environmentService.ts | 3 +++ src/vs/platform/environment/node/argv.ts | 1 + src/vs/server/node/serverEnvironmentService.ts | 2 ++ .../services/assignment/common/assignmentService.ts | 2 +- .../coreExperimentation/common/coreExperimentationService.ts | 5 +++++ .../services/environment/browser/environmentService.ts | 3 +++ test/automation/src/electron.ts | 1 + test/automation/src/playwrightBrowser.ts | 1 + test/integration/browser/src/index.ts | 2 +- 18 files changed, 28 insertions(+), 9 deletions(-) diff --git a/.vscode-test.js b/.vscode-test.js index e46484cb9df..2e49c90126b 100644 --- a/.vscode-test.js +++ b/.vscode-test.js @@ -84,7 +84,7 @@ const extensions = [ const defaultLaunchArgs = process.env.API_TESTS_EXTRA_ARGS?.split(' ') || [ - '--disable-telemetry', '--skip-welcome', '--skip-release-notes', `--crash-reporter-directory=${__dirname}/.build/crashes`, `--logsPath=${__dirname}/.build/logs/integration-tests`, '--no-cached-data', '--disable-updates', '--use-inmemory-secretstorage', '--disable-extensions', '--disable-workspace-trust' + '--disable-telemetry', '--disable-experiments', '--skip-welcome', '--skip-release-notes', `--crash-reporter-directory=${__dirname}/.build/crashes`, `--logsPath=${__dirname}/.build/logs/integration-tests`, '--no-cached-data', '--disable-updates', '--use-inmemory-secretstorage', '--disable-extensions', '--disable-workspace-trust' ]; const config = defineConfig(extensions.map(extension => { diff --git a/extensions/vscode-test-resolver/src/extension.ts b/extensions/vscode-test-resolver/src/extension.ts index 2fab3ec306a..74d25c65ae0 100644 --- a/extensions/vscode-test-resolver/src/extension.ts +++ b/extensions/vscode-test-resolver/src/extension.ts @@ -142,7 +142,7 @@ export function activate(context: vscode.ExtensionContext) { } const { updateUrl, commit, quality, serverDataFolderName, serverApplicationName, dataFolderName } = getProductConfiguration(); - const commandArgs = ['--host=127.0.0.1', '--port=0', '--disable-telemetry', '--use-host-proxy', '--accept-server-license-terms']; + const commandArgs = ['--host=127.0.0.1', '--port=0', '--disable-telemetry', '--disable-experiments', '--use-host-proxy', '--accept-server-license-terms']; const env = getNewEnv(); const remoteDataDir = process.env['TESTRESOLVER_DATA_FOLDER'] || path.join(os.homedir(), `${serverDataFolderName || dataFolderName}-testresolver`); const logsDir = process.env['TESTRESOLVER_LOGS_FOLDER']; diff --git a/scripts/test-integration.bat b/scripts/test-integration.bat index b59cceada07..50c14ff8d3f 100644 --- a/scripts/test-integration.bat +++ b/scripts/test-integration.bat @@ -35,7 +35,7 @@ if %errorlevel% neq 0 exit /b %errorlevel% :: Tests in the extension host -set API_TESTS_EXTRA_ARGS=--disable-telemetry --skip-welcome --skip-release-notes --crash-reporter-directory=%VSCODECRASHDIR% --logsPath=%VSCODELOGSDIR% --no-cached-data --disable-updates --use-inmemory-secretstorage --disable-extensions --disable-workspace-trust --user-data-dir=%VSCODEUSERDATADIR% +set API_TESTS_EXTRA_ARGS=--disable-telemetry --disable-experiments --skip-welcome --skip-release-notes --crash-reporter-directory=%VSCODECRASHDIR% --logsPath=%VSCODELOGSDIR% --no-cached-data --disable-updates --use-inmemory-secretstorage --disable-extensions --disable-workspace-trust --user-data-dir=%VSCODEUSERDATADIR% echo. echo ### API tests (folder) diff --git a/scripts/test-integration.sh b/scripts/test-integration.sh index 33d00615359..3e26bb17a17 100755 --- a/scripts/test-integration.sh +++ b/scripts/test-integration.sh @@ -41,7 +41,7 @@ echo # Tests in the extension host -API_TESTS_EXTRA_ARGS="--disable-telemetry --skip-welcome --skip-release-notes --crash-reporter-directory=$VSCODECRASHDIR --logsPath=$VSCODELOGSDIR --no-cached-data --disable-updates --use-inmemory-secretstorage --disable-extensions --disable-workspace-trust --user-data-dir=$VSCODEUSERDATADIR" +API_TESTS_EXTRA_ARGS="--disable-telemetry --disable-experiments --skip-welcome --skip-release-notes --crash-reporter-directory=$VSCODECRASHDIR --logsPath=$VSCODELOGSDIR --no-cached-data --disable-updates --use-inmemory-secretstorage --disable-extensions --disable-workspace-trust --user-data-dir=$VSCODEUSERDATADIR" if [ -z "$INTEGRATION_TEST_APP_NAME" ]; then kill_app() { true; } diff --git a/scripts/test-remote-integration.bat b/scripts/test-remote-integration.bat index e79466424db..96288d35886 100644 --- a/scripts/test-remote-integration.bat +++ b/scripts/test-remote-integration.bat @@ -55,7 +55,7 @@ echo Storing log files into '%VSCODELOGSDIR%' :: Tests in the extension host -set API_TESTS_EXTRA_ARGS=--disable-telemetry --skip-welcome --skip-release-notes --crash-reporter-directory=%VSCODECRASHDIR% --logsPath=%VSCODELOGSDIR% --no-cached-data --disable-updates --use-inmemory-secretstorage --disable-inspect --disable-workspace-trust --user-data-dir=%VSCODEUSERDATADIR% +set API_TESTS_EXTRA_ARGS=--disable-telemetry --disable-experiments --skip-welcome --skip-release-notes --crash-reporter-directory=%VSCODECRASHDIR% --logsPath=%VSCODELOGSDIR% --no-cached-data --disable-updates --use-inmemory-secretstorage --disable-inspect --disable-workspace-trust --user-data-dir=%VSCODEUSERDATADIR% echo. echo ### API tests (folder) diff --git a/scripts/test-remote-integration.sh b/scripts/test-remote-integration.sh index 7325757418e..7224216b2c0 100755 --- a/scripts/test-remote-integration.sh +++ b/scripts/test-remote-integration.sh @@ -65,7 +65,7 @@ else kill_app() { killall $INTEGRATION_TEST_APP_NAME || true; } fi -API_TESTS_EXTRA_ARGS="--disable-telemetry --skip-welcome --skip-release-notes --crash-reporter-directory=$VSCODECRASHDIR --logsPath=$VSCODELOGSDIR --no-cached-data --disable-updates --use-inmemory-secretstorage --disable-workspace-trust --user-data-dir=$VSCODEUSERDATADIR" +API_TESTS_EXTRA_ARGS="--disable-telemetry --disable-experiments --skip-welcome --skip-release-notes --crash-reporter-directory=$VSCODECRASHDIR --logsPath=$VSCODELOGSDIR --no-cached-data --disable-updates --use-inmemory-secretstorage --disable-workspace-trust --user-data-dir=$VSCODEUSERDATADIR" echo "Storing crash reports into '$VSCODECRASHDIR'." echo "Storing log files into '$VSCODELOGSDIR'." diff --git a/src/vs/editor/standalone/browser/standaloneServices.ts b/src/vs/editor/standalone/browser/standaloneServices.ts index 89e3a9dd3d7..0703f81e39a 100644 --- a/src/vs/editor/standalone/browser/standaloneServices.ts +++ b/src/vs/editor/standalone/browser/standaloneServices.ts @@ -229,6 +229,7 @@ class StandaloneEnvironmentService implements IEnvironmentService { readonly debugExtensionHost: IExtensionHostDebugParams = { port: null, break: false }; readonly isExtensionDevelopment: boolean = false; readonly disableExtensions: boolean | string[] = false; + readonly disableExperiments: boolean = false; readonly enableExtensions?: readonly string[] | undefined = undefined; readonly extensionDevelopmentLocationURI?: URI[] | undefined = undefined; readonly extensionDevelopmentKind?: ExtensionKind[] | undefined = undefined; diff --git a/src/vs/platform/environment/common/argv.ts b/src/vs/platform/environment/common/argv.ts index d4937b2d4ec..2ffbb9773bc 100644 --- a/src/vs/platform/environment/common/argv.ts +++ b/src/vs/platform/environment/common/argv.ts @@ -139,6 +139,7 @@ export interface NativeParsedArgs { 'enable-rdp-display-tracking'?: boolean; 'disable-layout-restore'?: boolean; 'startup-experiment-group'?: string; + 'disable-experiments'?: boolean; // chromium command line args: https://electronjs.org/docs/all#supported-chrome-command-line-switches 'no-proxy-server'?: boolean; diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index b6e945496d9..c5f10d53040 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -83,8 +83,9 @@ export interface IEnvironmentService { verbose: boolean; isBuilt: boolean; - // --- telemetry + // --- telemetry/exp disableTelemetry: boolean; + disableExperiments: boolean; serviceMachineIdResource: URI; // --- Policy diff --git a/src/vs/platform/environment/common/environmentService.ts b/src/vs/platform/environment/common/environmentService.ts index f60efc16786..e60b83f27d4 100644 --- a/src/vs/platform/environment/common/environmentService.ts +++ b/src/vs/platform/environment/common/environmentService.ts @@ -230,6 +230,9 @@ export abstract class AbstractNativeEnvironmentService implements INativeEnviron @memoize get disableTelemetry(): boolean { return !!this.args['disable-telemetry']; } + @memoize + get disableExperiments(): boolean { return !!this.args['disable-experiments']; } + @memoize get disableWorkspaceTrust(): boolean { return !!this.args['disable-workspace-trust']; } diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index 2f30fbe8cd2..342718df668 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -200,6 +200,7 @@ export const OPTIONS: OptionDescriptions> = { 'unresponsive-sample-period': { type: 'string' }, 'enable-rdp-display-tracking': { type: 'boolean' }, 'disable-layout-restore': { type: 'boolean' }, + 'disable-experiments': { type: 'boolean' }, 'startup-experiment-group': { type: 'string', cat: 't', args: 'control|maximizedChat|splitEmptyEditorChat|splitWelcomeChat', description: localize('startupExperimentGroup', "Override the startup experiment group.") }, // chromium flags diff --git a/src/vs/server/node/serverEnvironmentService.ts b/src/vs/server/node/serverEnvironmentService.ts index eb588059c16..092618c6846 100644 --- a/src/vs/server/node/serverEnvironmentService.ts +++ b/src/vs/server/node/serverEnvironmentService.ts @@ -37,6 +37,7 @@ export const serverOptions: OptionDescriptions> = { 'user-data-dir': OPTIONS['user-data-dir'], 'enable-smoke-test-driver': OPTIONS['enable-smoke-test-driver'], 'disable-telemetry': OPTIONS['disable-telemetry'], + 'disable-experiments': OPTIONS['disable-experiments'], 'disable-workspace-trust': OPTIONS['disable-workspace-trust'], 'file-watcher-polling': { type: 'string', deprecates: ['fileWatcherPolling'] }, 'log': OPTIONS['log'], @@ -160,6 +161,7 @@ export interface ServerParsedArgs { 'enable-smoke-test-driver'?: boolean; 'disable-telemetry'?: boolean; + 'disable-experiments'?: boolean; 'file-watcher-polling'?: string; 'log'?: string[]; diff --git a/src/vs/workbench/services/assignment/common/assignmentService.ts b/src/vs/workbench/services/assignment/common/assignmentService.ts index 8e7aa27c14c..d18437e1bca 100644 --- a/src/vs/workbench/services/assignment/common/assignmentService.ts +++ b/src/vs/workbench/services/assignment/common/assignmentService.ts @@ -100,7 +100,7 @@ export class WorkbenchAssignmentService extends BaseAssignmentService { } protected override get experimentsEnabled(): boolean { - return this.configurationService.getValue('workbench.enableExperiments') === true; + return !this.environmentService.disableExperiments && this.configurationService.getValue('workbench.enableExperiments') === true; } override async getTreatment(name: string): Promise { diff --git a/src/vs/workbench/services/coreExperimentation/common/coreExperimentationService.ts b/src/vs/workbench/services/coreExperimentation/common/coreExperimentationService.ts index f14dd96a9a3..944e9bee9de 100644 --- a/src/vs/workbench/services/coreExperimentation/common/coreExperimentationService.ts +++ b/src/vs/workbench/services/coreExperimentation/common/coreExperimentationService.ts @@ -88,6 +88,11 @@ export class CoreExperimentationService extends Disposable implements ICoreExper @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, ) { super(); + + if (environmentService.disableExperiments) { + return; // explicitly disabled + } + this.initializeExperiments(); } diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index 7223b54c3ad..a50ad52689b 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -236,6 +236,9 @@ export class BrowserWorkbenchEnvironmentService implements IBrowserWorkbenchEnvi @memoize get disableTelemetry(): boolean { return false; } + @memoize + get disableExperiments(): boolean { return false; } + @memoize get verbose(): boolean { return this.payload?.get('verbose') === 'true'; } diff --git a/test/automation/src/electron.ts b/test/automation/src/electron.ts index 7d162daf1d2..7935aea1dd1 100644 --- a/test/automation/src/electron.ts +++ b/test/automation/src/electron.ts @@ -27,6 +27,7 @@ export async function resolveElectronConfiguration(options: LaunchOptions): Prom '--skip-release-notes', '--skip-welcome', '--disable-telemetry', + '--disable-experiments', '--no-cached-data', '--disable-updates', '--use-inmemory-secretstorage', diff --git a/test/automation/src/playwrightBrowser.ts b/test/automation/src/playwrightBrowser.ts index f4f63875b2a..6a2334fdc78 100644 --- a/test/automation/src/playwrightBrowser.ts +++ b/test/automation/src/playwrightBrowser.ts @@ -44,6 +44,7 @@ async function launchServer(options: LaunchOptions) { const args = [ '--disable-telemetry', + '--disable-experiments', '--disable-workspace-trust', `--port=${port++}`, '--enable-smoke-test-driver', diff --git a/test/integration/browser/src/index.ts b/test/integration/browser/src/index.ts index 0c3cd8efd32..47ac09d9f8c 100644 --- a/test/integration/browser/src/index.ts +++ b/test/integration/browser/src/index.ts @@ -169,7 +169,7 @@ async function launchServer(browserType: BrowserType, browserChannel: BrowserCha ...process.env }; - const serverArgs = ['--enable-proposed-api', '--disable-telemetry', '--server-data-dir', userDataDir, '--accept-server-license-terms', '--disable-workspace-trust']; + const serverArgs = ['--enable-proposed-api', '--disable-telemetry', '--disable-experiments', '--server-data-dir', userDataDir, '--accept-server-license-terms', '--disable-workspace-trust']; let serverLocation: string; if (process.env.VSCODE_REMOTE_SERVER_PATH) {