Skip to content

Commit 07a5351

Browse files
authored
* Fix microsoft#160678 * review feedback
1 parent 4130136 commit 07a5351

File tree

6 files changed

+45
-59
lines changed

6 files changed

+45
-59
lines changed

src/vs/code/electron-main/app.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -822,7 +822,7 @@ export class CodeApplication extends Disposable {
822822
sharedProcessClient.then(client => client.registerChannel('logger', loggerChannel));
823823

824824
// Extension Host Debug Broadcasting
825-
const electronExtensionHostDebugBroadcastChannel = new ElectronExtensionHostDebugBroadcastChannel(accessor.get(IWindowsMainService), accessor.get(IUserDataProfilesMainService));
825+
const electronExtensionHostDebugBroadcastChannel = new ElectronExtensionHostDebugBroadcastChannel(accessor.get(IWindowsMainService));
826826
mainProcessElectronServer.registerChannel('extensionhostdebugservice', electronExtensionHostDebugBroadcastChannel);
827827

828828
// Extension Host Starter
@@ -983,6 +983,8 @@ export class CodeApplication extends Disposable {
983983
const noRecentEntry = args['skip-add-to-recently-opened'] === true;
984984
const waitMarkerFileURI = args.wait && args.waitMarkerFilePath ? URI.file(args.waitMarkerFilePath) : undefined;
985985
const remoteAuthority = args.remote || undefined;
986+
const forceProfile = args.profile;
987+
const forceTempProfile = args['profile-temp'];
986988

987989
// check for a pending window to open from URI
988990
// e.g. when running code with --open-uri from
@@ -998,14 +1000,11 @@ export class CodeApplication extends Disposable {
9981000
});
9991001
}
10001002

1001-
// Ensure profile exists when passed in from CLI
1002-
const profile = await this.userDataProfilesMainService.checkAndCreateProfileFromCli(this.environmentMainService.args);
1003-
10041003
// Start without file/folder arguments
10051004
if (!hasCliArgs && !hasFolderURIs && !hasFileURIs) {
10061005

10071006
// Force new window
1008-
if (args['new-window'] || profile) {
1007+
if (args['new-window'] || forceProfile || forceTempProfile) {
10091008
return windowsMainService.open({
10101009
context,
10111010
cli: args,
@@ -1015,7 +1014,8 @@ export class CodeApplication extends Disposable {
10151014
waitMarkerFileURI,
10161015
initialStartup: true,
10171016
remoteAuthority,
1018-
profile
1017+
forceProfile,
1018+
forceTempProfile
10191019
});
10201020
}
10211021

@@ -1045,7 +1045,8 @@ export class CodeApplication extends Disposable {
10451045
gotoLineMode: args.goto,
10461046
initialStartup: true,
10471047
remoteAuthority,
1048-
profile
1048+
forceProfile,
1049+
forceTempProfile
10491050
});
10501051
}
10511052

src/vs/platform/debug/electron-main/extensionHostDebugIpc.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,12 @@ import { AddressInfo, createServer } from 'net';
77
import { IOpenExtensionWindowResult } from 'vs/platform/debug/common/extensionHostDebug';
88
import { ExtensionHostDebugBroadcastChannel } from 'vs/platform/debug/common/extensionHostDebugIpc';
99
import { OPTIONS, parseArgs } from 'vs/platform/environment/node/argv';
10-
import { IUserDataProfilesMainService } from 'vs/platform/userDataProfile/electron-main/userDataProfile';
1110
import { IWindowsMainService, OpenContext } from 'vs/platform/windows/electron-main/windows';
1211

1312
export class ElectronExtensionHostDebugBroadcastChannel<TContext> extends ExtensionHostDebugBroadcastChannel<TContext> {
1413

1514
constructor(
16-
private windowsMainService: IWindowsMainService,
17-
private userDataProfilesMainService: IUserDataProfilesMainService
15+
private windowsMainService: IWindowsMainService
1816
) {
1917
super();
2018
}
@@ -39,7 +37,8 @@ export class ElectronExtensionHostDebugBroadcastChannel<TContext> extends Extens
3937
const [codeWindow] = await this.windowsMainService.openExtensionDevelopmentHostWindow(extDevPaths, {
4038
context: OpenContext.API,
4139
cli: pargs,
42-
profile: await this.userDataProfilesMainService.checkAndCreateProfileFromCli(pargs)
40+
forceProfile: pargs.profile,
41+
forceTempProfile: pargs['profile-temp']
4342
});
4443

4544
if (!debugRenderer) {

src/vs/platform/launch/electron-main/launchMainService.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import { IURLService } from 'vs/platform/url/common/url';
1717
import { ICodeWindow } from 'vs/platform/window/electron-main/window';
1818
import { IWindowSettings } from 'vs/platform/window/common/window';
1919
import { IOpenConfiguration, IWindowsMainService, OpenContext } from 'vs/platform/windows/electron-main/windows';
20-
import { IUserDataProfilesMainService } from 'vs/platform/userDataProfile/electron-main/userDataProfile';
2120

2221
export const ID = 'launchMainService';
2322
export const ILaunchMainService = createDecorator<ILaunchMainService>(ID);
@@ -45,7 +44,6 @@ export class LaunchMainService implements ILaunchMainService {
4544
@IWindowsMainService private readonly windowsMainService: IWindowsMainService,
4645
@IURLService private readonly urlService: IURLService,
4746
@IConfigurationService private readonly configurationService: IConfigurationService,
48-
@IUserDataProfilesMainService private readonly userDataProfilesMainService: IUserDataProfilesMainService,
4947
) { }
5048

5149
async start(args: NativeParsedArgs, userEnv: IProcessEnvironment): Promise<void> {
@@ -117,16 +115,14 @@ export class LaunchMainService implements ILaunchMainService {
117115
const waitMarkerFileURI = args.wait && args.waitMarkerFilePath ? URI.file(args.waitMarkerFilePath) : undefined;
118116
const remoteAuthority = args.remote || undefined;
119117

120-
// Ensure profile exists when passed in from CLI
121-
const profile = await this.userDataProfilesMainService.checkAndCreateProfileFromCli(args);
122-
123118
const baseConfig: IOpenConfiguration = {
124119
context,
125120
cli: args,
126121
userEnv,
127122
waitMarkerFileURI,
128123
remoteAuthority,
129-
profile
124+
forceProfile: args.profile,
125+
forceTempProfile: args['profile-temp']
130126
};
131127

132128
// Special case extension development
@@ -139,7 +135,7 @@ export class LaunchMainService implements ILaunchMainService {
139135
let openNewWindow = false;
140136

141137
// Force new window
142-
if (args['new-window'] || args['unity-launch'] || profile) {
138+
if (args['new-window'] || args['unity-launch'] || baseConfig.forceProfile || baseConfig.forceTempProfile) {
143139
openNewWindow = true;
144140
}
145141

src/vs/platform/userDataProfile/electron-main/userDataProfile.ts

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,11 @@ import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'
1414
import { IUserDataProfilesService, WorkspaceIdentifier, StoredUserDataProfile, StoredProfileAssociations, WillCreateProfileEvent, WillRemoveProfileEvent, IUserDataProfile } from 'vs/platform/userDataProfile/common/userDataProfile';
1515
import { UserDataProfilesService } from 'vs/platform/userDataProfile/node/userDataProfile';
1616
import { IStringDictionary } from 'vs/base/common/collections';
17-
import { NativeParsedArgs } from 'vs/platform/environment/common/argv';
1817

1918
export const IUserDataProfilesMainService = refineServiceDecorator<IUserDataProfilesService, IUserDataProfilesMainService>(IUserDataProfilesService);
2019
export interface IUserDataProfilesMainService extends IUserDataProfilesService {
2120
getOrSetProfileForWorkspace(workspaceIdentifier: WorkspaceIdentifier, profileToSet?: IUserDataProfile): IUserDataProfile;
2221
setProfileForWorkspaceSync(workspaceIdentifier: WorkspaceIdentifier, profileToSet: IUserDataProfile): void;
23-
checkAndCreateProfileFromCli(args: NativeParsedArgs): Promise<IUserDataProfile> | undefined;
2422
unsetWorkspace(workspaceIdentifier: WorkspaceIdentifier, transient?: boolean): void;
2523
readonly onWillCreateProfile: Event<WillCreateProfileEvent>;
2624
readonly onWillRemoveProfile: Event<WillRemoveProfileEvent>;
@@ -47,20 +45,6 @@ export class UserDataProfilesMainService extends UserDataProfilesService impleme
4745
}
4846
}
4947

50-
checkAndCreateProfileFromCli(args: NativeParsedArgs): Promise<IUserDataProfile> | undefined {
51-
if (!this.isEnabled()) {
52-
return undefined;
53-
}
54-
if (args.profile) {
55-
const profile = this.profiles.find(p => p.name === args.profile);
56-
return profile ? Promise.resolve(profile) : this.createNamedProfile(args.profile);
57-
}
58-
if (args['profile-temp']) {
59-
return this.createTransientProfile();
60-
}
61-
return undefined;
62-
}
63-
6448
protected override saveStoredProfiles(storedProfiles: StoredUserDataProfile[]): void {
6549
if (storedProfiles.length) {
6650
this.stateMainService.setItem(UserDataProfilesMainService.PROFILES_KEY, storedProfiles);

src/vs/platform/windows/electron-main/windows.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import { NativeParsedArgs } from 'vs/platform/environment/common/argv';
1111
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
1212
import { ICodeWindow } from 'vs/platform/window/electron-main/window';
1313
import { IOpenEmptyWindowOptions, IWindowOpenable } from 'vs/platform/window/common/window';
14-
import { IUserDataProfile } from 'vs/platform/userDataProfile/common/userDataProfile';
1514

1615
export const IWindowsMainService = createDecorator<IWindowsMainService>('windowsMainService');
1716

@@ -98,7 +97,8 @@ export interface IOpenConfiguration extends IBaseOpenConfiguration {
9897
* - a workspace that is neither `file://` nor `vscode-remote://`
9998
*/
10099
readonly remoteAuthority?: string;
101-
readonly profile?: IUserDataProfile;
100+
readonly forceProfile?: string;
101+
readonly forceTempProfile?: boolean;
102102
}
103103

104104
export interface IOpenEmptyConfiguration extends IBaseOpenConfiguration { }

src/vs/platform/windows/electron-main/windowsMainService.ts

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ interface IOpenBrowserWindowOptions {
7676
readonly windowToUse?: ICodeWindow;
7777

7878
readonly emptyWindowBackupInfo?: IEmptyWindowBackupInfo;
79-
readonly profile?: IUserDataProfile;
79+
readonly forceProfile?: string;
80+
readonly forceTempProfile?: boolean;
8081
}
8182

8283
interface IPathResolveOptions {
@@ -521,15 +522,16 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic
521522

522523
// Finally, if no window or folder is found, just open the files in an empty window
523524
else {
524-
addUsedWindow(this.openInBrowserWindow({
525+
addUsedWindow(await this.openInBrowserWindow({
525526
userEnv: openConfig.userEnv,
526527
cli: openConfig.cli,
527528
initialStartup: openConfig.initialStartup,
528529
filesToOpen,
529530
forceNewWindow: true,
530531
remoteAuthority: filesToOpen.remoteAuthority,
531532
forceNewTabbedWindow: openConfig.forceNewTabbedWindow,
532-
profile: openConfig.profile
533+
forceProfile: openConfig.forceProfile,
534+
forceTempProfile: openConfig.forceTempProfile
533535
}), true);
534536
}
535537
}
@@ -560,7 +562,7 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic
560562
const filesToOpenInWindow = isEqualAuthority(filesToOpen?.remoteAuthority, remoteAuthority) ? filesToOpen : undefined;
561563

562564
// Do open folder
563-
addUsedWindow(this.doOpenFolderOrWorkspace(openConfig, workspaceToOpen, openFolderInNewWindow, filesToOpenInWindow), !!filesToOpenInWindow);
565+
addUsedWindow(await this.doOpenFolderOrWorkspace(openConfig, workspaceToOpen, openFolderInNewWindow, filesToOpenInWindow), !!filesToOpenInWindow);
564566

565567
openFolderInNewWindow = true; // any other folders to open must open in new window then
566568
}
@@ -592,7 +594,7 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic
592594
const filesToOpenInWindow = isEqualAuthority(filesToOpen?.remoteAuthority, remoteAuthority) ? filesToOpen : undefined;
593595

594596
// Do open folder
595-
addUsedWindow(this.doOpenFolderOrWorkspace(openConfig, folderToOpen, openFolderInNewWindow, filesToOpenInWindow), !!filesToOpenInWindow);
597+
addUsedWindow(await this.doOpenFolderOrWorkspace(openConfig, folderToOpen, openFolderInNewWindow, filesToOpenInWindow), !!filesToOpenInWindow);
596598

597599
openFolderInNewWindow = true; // any other folders to open must open in new window then
598600
}
@@ -605,7 +607,7 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic
605607
const remoteAuthority = emptyWindowBackupInfo.remoteAuthority;
606608
const filesToOpenInWindow = isEqualAuthority(filesToOpen?.remoteAuthority, remoteAuthority) ? filesToOpen : undefined;
607609

608-
addUsedWindow(this.doOpenEmpty(openConfig, true, remoteAuthority, filesToOpenInWindow, emptyWindowBackupInfo), !!filesToOpenInWindow);
610+
addUsedWindow(await this.doOpenEmpty(openConfig, true, remoteAuthority, filesToOpenInWindow, emptyWindowBackupInfo), !!filesToOpenInWindow);
609611

610612
openFolderInNewWindow = true; // any other folders to open must open in new window then
611613
}
@@ -620,7 +622,7 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic
620622
const remoteAuthority = filesToOpen ? filesToOpen.remoteAuthority : openConfig.remoteAuthority;
621623

622624
for (let i = 0; i < emptyToOpen; i++) {
623-
addUsedWindow(this.doOpenEmpty(openConfig, openFolderInNewWindow, remoteAuthority, filesToOpen), !!filesToOpen);
625+
addUsedWindow(await this.doOpenEmpty(openConfig, openFolderInNewWindow, remoteAuthority, filesToOpen), !!filesToOpen);
624626

625627
// any other window to open must open in new window then
626628
openFolderInNewWindow = true;
@@ -658,7 +660,7 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic
658660
return window;
659661
}
660662

661-
private doOpenEmpty(openConfig: IOpenConfiguration, forceNewWindow: boolean, remoteAuthority: string | undefined, filesToOpen: IFilesToOpen | undefined, emptyWindowBackupInfo?: IEmptyWindowBackupInfo): ICodeWindow {
663+
private doOpenEmpty(openConfig: IOpenConfiguration, forceNewWindow: boolean, remoteAuthority: string | undefined, filesToOpen: IFilesToOpen | undefined, emptyWindowBackupInfo?: IEmptyWindowBackupInfo): Promise<ICodeWindow> {
662664
this.logService.trace('windowsManager#doOpenEmpty', { restore: !!emptyWindowBackupInfo, remoteAuthority, filesToOpen, forceNewWindow });
663665

664666
let windowToUse: ICodeWindow | undefined;
@@ -676,11 +678,12 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic
676678
filesToOpen,
677679
windowToUse,
678680
emptyWindowBackupInfo,
679-
profile: openConfig.profile
681+
forceProfile: openConfig.forceProfile,
682+
forceTempProfile: openConfig.forceTempProfile
680683
});
681684
}
682685

683-
private doOpenFolderOrWorkspace(openConfig: IOpenConfiguration, folderOrWorkspace: IWorkspacePathToOpen | ISingleFolderWorkspacePathToOpen, forceNewWindow: boolean, filesToOpen: IFilesToOpen | undefined, windowToUse?: ICodeWindow): ICodeWindow {
686+
private doOpenFolderOrWorkspace(openConfig: IOpenConfiguration, folderOrWorkspace: IWorkspacePathToOpen | ISingleFolderWorkspacePathToOpen, forceNewWindow: boolean, filesToOpen: IFilesToOpen | undefined, windowToUse?: ICodeWindow): Promise<ICodeWindow> {
684687
this.logService.trace('windowsManager#doOpenFolderOrWorkspace', { folderOrWorkspace, filesToOpen });
685688

686689
if (!forceNewWindow && !windowToUse && typeof openConfig.contextWindowId === 'number') {
@@ -697,7 +700,8 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic
697700
forceNewTabbedWindow: openConfig.forceNewTabbedWindow,
698701
filesToOpen,
699702
windowToUse,
700-
profile: openConfig.profile
703+
forceProfile: openConfig.forceProfile,
704+
forceTempProfile: openConfig.forceTempProfile
701705
});
702706
}
703707

@@ -1303,13 +1307,14 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic
13031307
noRecentEntry: true,
13041308
waitMarkerFileURI: openConfig.waitMarkerFileURI,
13051309
remoteAuthority,
1306-
profile: openConfig.profile
1310+
forceProfile: openConfig.forceProfile,
1311+
forceTempProfile: openConfig.forceTempProfile
13071312
};
13081313

13091314
return this.open(openArgs);
13101315
}
13111316

1312-
private openInBrowserWindow(options: IOpenBrowserWindowOptions): ICodeWindow {
1317+
private async openInBrowserWindow(options: IOpenBrowserWindowOptions): Promise<ICodeWindow> {
13131318
const windowConfig = this.configurationService.getValue<IWindowSettings | undefined>('window');
13141319

13151320
// Build up the window configuration from provided options, config and environment
@@ -1337,7 +1342,7 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic
13371342

13381343
profiles: {
13391344
all: this.userDataProfilesMainService.profiles,
1340-
profile: this.resolveProfileForBrowserWindow(options)
1345+
profile: await this.resolveProfileForBrowserWindow(options)
13411346
},
13421347

13431348
homeDir: this.environmentMainService.userHome.fsPath,
@@ -1497,19 +1502,20 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic
14971502
window.load(configuration);
14981503
}
14991504

1500-
private resolveProfileForBrowserWindow(options: IOpenBrowserWindowOptions): IUserDataProfile {
1501-
1502-
// Use the provided profile if any
1503-
let profile = options.profile;
1505+
private async resolveProfileForBrowserWindow(options: IOpenBrowserWindowOptions): Promise<IUserDataProfile> {
1506+
let profile: IUserDataProfile | undefined;
1507+
if (this.userDataProfilesMainService.isEnabled()) {
1508+
if (options.forceProfile) {
1509+
profile = this.userDataProfilesMainService.profiles.find(p => p.name === options.forceProfile) ?? await this.userDataProfilesMainService.createNamedProfile(options.forceProfile);
1510+
} else if (options.forceTempProfile) {
1511+
profile = await this.userDataProfilesMainService.createTransientProfile();
1512+
}
1513+
}
15041514
if (profile) {
15051515
this.userDataProfilesMainService.setProfileForWorkspaceSync(options.workspace ?? 'empty-window', profile);
1506-
}
1507-
1508-
// Otherwise use associated profile
1509-
if (!profile) {
1516+
} else {
15101517
profile = this.userDataProfilesMainService.getOrSetProfileForWorkspace(options.workspace ?? 'empty-window', (options.windowToUse ?? this.getLastActiveWindow())?.profile ?? this.userDataProfilesMainService.defaultProfile);
15111518
}
1512-
15131519
return profile;
15141520
}
15151521

0 commit comments

Comments
 (0)