Skip to content

Commit 770b9b1

Browse files
authored
Settings deep-linking issues when extensions update (microsoft#223510)
* Settings deep-linking issues when extensions update Fixes microsoft#223389 - Fixes not opening the settings editor with no query - Fixes not updating the cached defaults when extensions change them - Fixes the `DefaultSettings` `onDidChange` never firing due to the `fire` getting deleted in https://github.com/microsoft/vscode/pull/221136/files#diff-537b4dce91b9254cc9fd3e2982fc235b33373aaeda34b928e6546256295c1730L142 * Use mutable disposable
1 parent 192bad6 commit 770b9b1

File tree

2 files changed

+27
-18
lines changed

2 files changed

+27
-18
lines changed

src/vs/workbench/services/preferences/browser/preferencesService.ts

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import { getErrorMessage } from 'vs/base/common/errors';
77
import { Emitter } from 'vs/base/common/event';
88
import { parse } from 'vs/base/common/json';
9-
import { Disposable } from 'vs/base/common/lifecycle';
9+
import { Disposable, IDisposable, MutableDisposable } from 'vs/base/common/lifecycle';
1010
import * as network from 'vs/base/common/network';
1111
import { URI } from 'vs/base/common/uri';
1212
import { CoreEditingCommands } from 'vs/editor/browser/coreCommands';
@@ -67,8 +67,6 @@ export class PreferencesService extends Disposable implements IPreferencesServic
6767
private readonly _requestedDefaultSettings = new ResourceSet();
6868

6969
private _settingsGroups: ISettingsGroup[] | undefined = undefined;
70-
private _defaultSettings: DefaultSettings | undefined = undefined;
71-
7270

7371
constructor(
7472
@IEditorService private readonly editorService: IEditorService,
@@ -441,14 +439,14 @@ export class PreferencesService extends Disposable implements IPreferencesServic
441439

442440
private getDefaultSettings(target: ConfigurationTarget): DefaultSettings {
443441
if (target === ConfigurationTarget.WORKSPACE) {
444-
this._defaultWorkspaceSettingsContentModel ??= this._register(new DefaultSettings(this.getMostCommonlyUsedSettings(), target));
442+
this._defaultWorkspaceSettingsContentModel ??= this._register(new DefaultSettings(this.getMostCommonlyUsedSettings(), target, this.configurationService));
445443
return this._defaultWorkspaceSettingsContentModel;
446444
}
447445
if (target === ConfigurationTarget.WORKSPACE_FOLDER) {
448-
this._defaultFolderSettingsContentModel ??= this._register(new DefaultSettings(this.getMostCommonlyUsedSettings(), target));
446+
this._defaultFolderSettingsContentModel ??= this._register(new DefaultSettings(this.getMostCommonlyUsedSettings(), target, this.configurationService));
449447
return this._defaultFolderSettingsContentModel;
450448
}
451-
this._defaultUserSettingsContentModel ??= this._register(new DefaultSettings(this.getMostCommonlyUsedSettings(), target));
449+
this._defaultUserSettingsContentModel ??= this._register(new DefaultSettings(this.getMostCommonlyUsedSettings(), target, this.configurationService));
452450
return this._defaultUserSettingsContentModel;
453451
}
454452

@@ -594,16 +592,15 @@ export class PreferencesService extends Disposable implements IPreferencesServic
594592
return position;
595593
}
596594

597-
private get defaultSettings(): DefaultSettings {
598-
if (!this._defaultSettings) {
599-
this._defaultSettings = new DefaultSettings([], ConfigurationTarget.USER);
600-
}
601-
return this._defaultSettings;
602-
}
603-
604595
getSetting(settingId: string): ISetting | undefined {
605596
if (!this._settingsGroups) {
606-
this._settingsGroups = this.defaultSettings.getSettingsGroups();
597+
const defaultSettings = this.getDefaultSettings(ConfigurationTarget.USER);
598+
const defaultsChangedDisposable: MutableDisposable<IDisposable> = this._register(new MutableDisposable());
599+
defaultsChangedDisposable.value = defaultSettings.onDidChange(() => {
600+
this._settingsGroups = undefined;
601+
defaultsChangedDisposable.clear();
602+
});
603+
this._settingsGroups = defaultSettings.getSettingsGroups();
607604
}
608605

609606
for (const group of this._settingsGroups) {
@@ -632,11 +629,10 @@ export class PreferencesService extends Disposable implements IPreferencesServic
632629

633630
const openSettingsOptions: IOpenSettingsOptions = {};
634631
const settingInfo = uri.path.split('/').filter(part => !!part);
635-
if ((settingInfo.length === 0) || !this.getSetting(settingInfo[0])) {
636-
return false;
632+
if ((settingInfo.length > 0) && this.getSetting(settingInfo[0])) {
633+
openSettingsOptions.query = settingInfo[0];
637634
}
638635

639-
openSettingsOptions.query = settingInfo[0];
640636
this.openSettings(openSettingsOptions);
641637
return true;
642638
}

src/vs/workbench/services/preferences/common/preferencesModels.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,14 +460,21 @@ export class DefaultSettings extends Disposable {
460460
private _contentWithoutMostCommonlyUsed: string | undefined;
461461
private _settingsByName = new Map<string, ISetting>();
462462

463-
readonly _onDidChange: Emitter<void> = this._register(new Emitter<void>());
463+
private readonly _onDidChange: Emitter<void> = this._register(new Emitter<void>());
464464
readonly onDidChange: Event<void> = this._onDidChange.event;
465465

466466
constructor(
467467
private _mostCommonlyUsedSettingsKeys: string[],
468468
readonly target: ConfigurationTarget,
469+
readonly configurationService: IConfigurationService
469470
) {
470471
super();
472+
this._register(configurationService.onDidChangeConfiguration(e => {
473+
if (e.source === ConfigurationTarget.DEFAULT) {
474+
this.reset();
475+
this._onDidChange.fire();
476+
}
477+
}));
471478
}
472479

473480
getContent(forceUpdate = false): string {
@@ -500,6 +507,12 @@ export class DefaultSettings extends Disposable {
500507
this._contentWithoutMostCommonlyUsed = this.toContent(this._allSettingsGroups, 1);
501508
}
502509

510+
private reset(): void {
511+
this._content = undefined;
512+
this._contentWithoutMostCommonlyUsed = undefined;
513+
this._allSettingsGroups = undefined;
514+
}
515+
503516
private parse(): ISettingsGroup[] {
504517
const settingsGroups = this.getRegisteredGroups();
505518
this.initAllSettingsMap(settingsGroups);

0 commit comments

Comments
 (0)