Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix bug causing recommendations to sometimes appear in two places #53906

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ export class ExtensionTipsService extends Disposable implements IExtensionTipsSe
private _workspaceIgnoredRecommendations: string[] = [];
private _extensionsRecommendationsUrl: string;
private _disposables: IDisposable[] = [];
public loadRecommendationsPromise: TPromise<any>;
public loadWorkspaceConfigPromise: TPromise<any>;
private proactiveRecommendationsFetched: boolean = false;

private readonly _onRecommendationChange: Emitter<RecommendationChangeNotification> = new Emitter<RecommendationChangeNotification>();
Expand Down Expand Up @@ -120,22 +120,19 @@ export class ExtensionTipsService extends Disposable implements IExtensionTipsSe
let globallyIgnored = <string[]>JSON.parse(this.storageService.get('extensionsAssistant/ignored_recommendations', StorageScope.GLOBAL, '[]'));
this._globallyIgnoredRecommendations = globallyIgnored.map(id => id.toLowerCase());

this.loadRecommendationsPromise = this.getWorkspaceRecommendations()
.then(() => {
// these must be called after workspace configs have been refreshed.
this.fetchCachedDynamicWorkspaceRecommendations();
this.fetchFileBasedRecommendations();
this.fetchExperimentalRecommendations();
return this.promptWorkspaceRecommendations();
}).then(() => {
this._modelService.onModelAdded(this.promptFiletypeBasedRecommendations, this, this._disposables);
this._modelService.getModels().forEach(model => this.promptFiletypeBasedRecommendations(model));
});

this.fetchCachedDynamicWorkspaceRecommendations();
this.fetchFileBasedRecommendations();
this.fetchExperimentalRecommendations();
if (!this.configurationService.getValue<boolean>(ShowRecommendationsOnlyOnDemandKey)) {
this.fetchProactiveRecommendations(true);
}

this.loadWorkspaceConfigPromise = this.getWorkspaceRecommendations().then(() => {
this.promptWorkspaceRecommendations();
this._modelService.onModelAdded(this.promptFiletypeBasedRecommendations, this, this._disposables);
this._modelService.getModels().forEach(model => this.promptFiletypeBasedRecommendations(model));
});

this._register(this.contextService.onDidChangeWorkspaceFolders(e => this.onWorkspaceFoldersChanged(e)));
this._register(this.configurationService.onDidChangeConfiguration(e => {
if (!this.proactiveRecommendationsFetched && !this.configurationService.getValue<boolean>(ShowRecommendationsOnlyOnDemandKey)) {
Expand Down Expand Up @@ -411,7 +408,7 @@ export class ExtensionTipsService extends Disposable implements IExtensionTipsSe
if (this._exeBasedRecommendations[extensionId]) {
sources.push('executable');
}
if (this._dynamicWorkspaceRecommendations[extensionId]) {
if (this._dynamicWorkspaceRecommendations.indexOf(extensionId) !== -1) {
sources.push('dynamic');
}
return (<IExtensionRecommendation>{ extensionId, sources });
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,7 @@ suite('ExtensionsTipsService Test', () => {
function testNoPromptForValidRecommendations(recommendations: string[]) {
return setUpFolderWorkspace('myFolder', recommendations).then(() => {
testObject = instantiationService.createInstance(ExtensionTipsService);
return testObject.loadRecommendationsPromise.then(() => {
return testObject.loadWorkspaceConfigPromise.then(() => {
assert.equal(Object.keys(testObject.getAllRecommendationsWithReason()).length, recommendations.length);
assert.ok(!prompted);
});
Expand All @@ -297,7 +297,7 @@ suite('ExtensionsTipsService Test', () => {
function testNoPromptOrRecommendationsForValidRecommendations(recommendations: string[]) {
return setUpFolderWorkspace('myFolder', mockTestData.validRecommendedExtensions).then(() => {
testObject = instantiationService.createInstance(ExtensionTipsService);
assert.equal(!testObject.loadRecommendationsPromise, true);
assert.equal(!testObject.loadWorkspaceConfigPromise, true);
assert.ok(!prompted);

return testObject.getWorkspaceRecommendations().then(() => {
Expand Down Expand Up @@ -327,7 +327,7 @@ suite('ExtensionsTipsService Test', () => {
test('ExtensionTipsService: Prompt for valid workspace recommendations', () => {
return setUpFolderWorkspace('myFolder', mockTestData.recommendedExtensions).then(() => {
testObject = instantiationService.createInstance(ExtensionTipsService);
return testObject.loadRecommendationsPromise.then(() => {
return testObject.loadWorkspaceConfigPromise.then(() => {
const recommendations = Object.keys(testObject.getAllRecommendationsWithReason());

assert.equal(recommendations.length, mockTestData.validRecommendedExtensions.length);
Expand Down Expand Up @@ -359,7 +359,7 @@ suite('ExtensionsTipsService Test', () => {
testConfigurationService.setUserConfiguration(ConfigurationKey, { showRecommendationsOnlyOnDemand: true });
return setUpFolderWorkspace('myFolder', mockTestData.validRecommendedExtensions).then(() => {
testObject = instantiationService.createInstance(ExtensionTipsService);
return testObject.loadRecommendationsPromise.then(() => {
return testObject.loadWorkspaceConfigPromise.then(() => {
assert.equal(Object.keys(testObject.getAllRecommendationsWithReason()).length, 0);
assert.ok(!prompted);
});
Expand Down Expand Up @@ -387,7 +387,7 @@ suite('ExtensionsTipsService Test', () => {

return setUpFolderWorkspace('myFolder', mockTestData.validRecommendedExtensions).then(() => {
testObject = instantiationService.createInstance(ExtensionTipsService);
return testObject.loadRecommendationsPromise.then(() => {
return testObject.loadWorkspaceConfigPromise.then(() => {
const recommendations = testObject.getAllRecommendationsWithReason();
assert.ok(!recommendations['ms-vscode.csharp']); // stored recommendation that has been globally ignored
assert.ok(recommendations['ms-python.python']); // stored recommendation
Expand All @@ -407,7 +407,7 @@ suite('ExtensionsTipsService Test', () => {

return setUpFolderWorkspace('myFolder', mockTestData.validRecommendedExtensions, ignoredRecommendations).then(() => {
testObject = instantiationService.createInstance(ExtensionTipsService);
return testObject.loadRecommendationsPromise.then(() => {
return testObject.loadWorkspaceConfigPromise.then(() => {
const recommendations = testObject.getAllRecommendationsWithReason();
assert.ok(!recommendations['ms-vscode.csharp']); // stored recommendation that has been workspace ignored
assert.ok(recommendations['ms-python.python']); // stored recommendation
Expand Down Expand Up @@ -435,7 +435,7 @@ suite('ExtensionsTipsService Test', () => {

return setUpFolderWorkspace('myFolder', mockTestData.validRecommendedExtensions, workspaceIgnoredRecommendations).then(() => {
testObject = instantiationService.createInstance(ExtensionTipsService);
return testObject.loadRecommendationsPromise.then(() => {
return testObject.loadWorkspaceConfigPromise.then(() => {
const recommendations = testObject.getAllRecommendationsWithReason();
assert.ok(recommendations['ms-python.python']);

Expand All @@ -462,7 +462,7 @@ suite('ExtensionsTipsService Test', () => {

return setUpFolderWorkspace('myFolder', mockTestData.validRecommendedExtensions).then(() => {
testObject = instantiationService.createInstance(ExtensionTipsService);
return testObject.loadRecommendationsPromise.then(() => {
return testObject.loadWorkspaceConfigPromise.then(() => {
const recommendations = testObject.getAllRecommendationsWithReason();
assert.ok(recommendations['ms-python.python']);
assert.ok(recommendations['mockpublisher1.mockextension1']);
Expand Down Expand Up @@ -516,7 +516,7 @@ suite('ExtensionsTipsService Test', () => {

return setUpFolderWorkspace('myFolder', []).then(() => {
testObject = instantiationService.createInstance(ExtensionTipsService);
return testObject.loadRecommendationsPromise.then(() => {
return testObject.loadWorkspaceConfigPromise.then(() => {
const recommendations = testObject.getFileBasedRecommendations();
assert.equal(recommendations.length, 2);
assert.ok(recommendations.some(({ extensionId }) => extensionId === 'ms-vscode.csharp')); // stored recommendation that exists in product.extensionTips
Expand All @@ -535,7 +535,7 @@ suite('ExtensionsTipsService Test', () => {

return setUpFolderWorkspace('myFolder', []).then(() => {
testObject = instantiationService.createInstance(ExtensionTipsService);
return testObject.loadRecommendationsPromise.then(() => {
return testObject.loadWorkspaceConfigPromise.then(() => {
const recommendations = testObject.getFileBasedRecommendations();
assert.equal(recommendations.length, 2);
assert.ok(recommendations.some(({ extensionId }) => extensionId === 'ms-vscode.csharp')); // stored recommendation that exists in product.extensionTips
Expand Down