Skip to content

Commit f6c122b

Browse files
committed
remove dependency on experiment service for search
1 parent 748cd8e commit f6c122b

File tree

11 files changed

+42
-188
lines changed

11 files changed

+42
-188
lines changed

src/vs/platform/extensionManagement/common/abstractExtensionManagementService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,7 @@ export abstract class AbstractExtensionManagementService extends Disposable impl
643643
return manifest;
644644
} catch (err) {
645645
this.logService.trace('ExtensionManagementService.refreshControlCache - failed to get extension control manifest');
646-
return { malicious: [], deprecated: {} };
646+
return { malicious: [], deprecated: {}, search: [] };
647647
}
648648
}
649649

src/vs/platform/extensionManagement/common/extensionGalleryService.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { URI } from 'vs/base/common/uri';
1515
import { IHeaders, IRequestContext, IRequestOptions } from 'vs/base/parts/request/common/request';
1616
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
1717
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
18-
import { getFallbackTargetPlarforms, getTargetPlatform, IExtensionGalleryService, IExtensionIdentifier, IExtensionInfo, IGalleryExtension, IGalleryExtensionAsset, IGalleryExtensionAssets, IGalleryExtensionVersion, InstallOperation, IQueryOptions, IExtensionsControlManifest, isNotWebExtensionInWebTargetPlatform, isTargetPlatformCompatible, ITranslation, SortBy, SortOrder, StatisticType, toTargetPlatform, WEB_EXTENSION_TAG, IExtensionQueryOptions, IDeprecationInfo } from 'vs/platform/extensionManagement/common/extensionManagement';
18+
import { getFallbackTargetPlarforms, getTargetPlatform, IExtensionGalleryService, IExtensionIdentifier, IExtensionInfo, IGalleryExtension, IGalleryExtensionAsset, IGalleryExtensionAssets, IGalleryExtensionVersion, InstallOperation, IQueryOptions, IExtensionsControlManifest, isNotWebExtensionInWebTargetPlatform, isTargetPlatformCompatible, ITranslation, SortBy, SortOrder, StatisticType, toTargetPlatform, WEB_EXTENSION_TAG, IExtensionQueryOptions, IDeprecationInfo, ISearchPrefferedResults } from 'vs/platform/extensionManagement/common/extensionManagement';
1919
import { adoptToGalleryExtensionId, areSameExtensions, getGalleryExtensionId, getGalleryExtensionTelemetryData } from 'vs/platform/extensionManagement/common/extensionManagementUtil';
2020
import { IExtensionManifest, TargetPlatform } from 'vs/platform/extensions/common/extensions';
2121
import { isEngineValid } from 'vs/platform/extensions/common/extensionValidator';
@@ -574,6 +574,7 @@ interface IRawExtensionsControlManifest {
574574
settings?: string[];
575575
additionalInfo?: string;
576576
}>;
577+
search?: ISearchPrefferedResults[];
577578
}
578579

579580
abstract class AbstractExtensionGalleryService implements IExtensionGalleryService {
@@ -1206,7 +1207,7 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi
12061207
}
12071208

12081209
if (!this.extensionsControlUrl) {
1209-
return { malicious: [], deprecated: {} };
1210+
return { malicious: [], deprecated: {}, search: [] };
12101211
}
12111212

12121213
const context = await this.requestService.request({ type: 'GET', url: this.extensionsControlUrl }, CancellationToken.None);
@@ -1217,6 +1218,7 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi
12171218
const result = await asJson<IRawExtensionsControlManifest>(context);
12181219
const malicious: IExtensionIdentifier[] = [];
12191220
const deprecated: IStringDictionary<IDeprecationInfo> = {};
1221+
const search: ISearchPrefferedResults[] = [];
12201222
if (result) {
12211223
for (const id of result.malicious) {
12221224
malicious.push({ id });
@@ -1243,9 +1245,14 @@ abstract class AbstractExtensionGalleryService implements IExtensionGalleryServi
12431245
}
12441246
}
12451247
}
1248+
if (result.search) {
1249+
for (const s of result.search) {
1250+
search.push(s);
1251+
}
1252+
}
12461253
}
12471254

1248-
return { malicious, deprecated };
1255+
return { malicious, deprecated, search };
12491256
}
12501257
}
12511258

src/vs/platform/extensionManagement/common/extensionManagement.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,9 +311,15 @@ export interface IDeprecationInfo {
311311
readonly additionalInfo?: string;
312312
}
313313

314+
export interface ISearchPrefferedResults {
315+
readonly query?: string;
316+
readonly preferredResults?: string[];
317+
}
318+
314319
export interface IExtensionsControlManifest {
315320
readonly malicious: IExtensionIdentifier[];
316321
readonly deprecated: IStringDictionary<IDeprecationInfo>;
322+
readonly search: ISearchPrefferedResults[];
317323
}
318324

319325
export const enum InstallOperation {

src/vs/workbench/contrib/experiments/common/experimentService.ts

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ export interface IExperimentService {
7575
readonly _serviceBrand: undefined;
7676
getExperimentById(id: string): Promise<IExperiment>;
7777
getExperimentsByType(type: ExperimentActionType): Promise<IExperiment[]>;
78-
getCuratedExtensionsList(curatedExtensionsKey: string): Promise<string[]>;
7978
markAsCompleted(experimentId: string): void;
8079

8180
onExperimentEnabled: Event<IExperiment>;
@@ -207,20 +206,6 @@ export class ExperimentService extends Disposable implements IExperimentService
207206
});
208207
}
209208

210-
public getCuratedExtensionsList(curatedExtensionsKey: string): Promise<string[]> {
211-
return this._loadExperimentsPromise.then(() => {
212-
for (const experiment of this._experiments) {
213-
if (experiment.enabled
214-
&& experiment.state === ExperimentState.Run
215-
&& this._curatedMapping[experiment.id]
216-
&& this._curatedMapping[experiment.id].curatedExtensionsKey === curatedExtensionsKey) {
217-
return this._curatedMapping[experiment.id].curatedExtensionsList;
218-
}
219-
}
220-
return [];
221-
});
222-
}
223-
224209
public markAsCompleted(experimentId: string): void {
225210
const storageKey = 'experiments.' + experimentId;
226211
const experimentState: IExperimentStorageState = safeParse(this.storageService.get(storageKey, StorageScope.APPLICATION), {});

src/vs/workbench/contrib/experiments/test/electron-sandbox/experimentService.test.ts

Lines changed: 0 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -766,87 +766,6 @@ suite('Experiment Service', () => {
766766
});
767767
});
768768

769-
test('Curated list should be available if experiment is enabled.', () => {
770-
const promptText = 'Hello there! Can you see this?';
771-
const curatedExtensionsKey = 'AzureDeploy';
772-
const curatedExtensionsList = ['uninstalled-extention-id1', 'uninstalled-extention-id2'];
773-
experimentData = {
774-
experiments: [
775-
{
776-
id: 'experiment1',
777-
enabled: true,
778-
action: {
779-
type: 'Prompt',
780-
properties: {
781-
promptText,
782-
commands: [
783-
{
784-
text: 'Search Marketplace',
785-
dontShowAgain: true,
786-
curatedExtensionsKey,
787-
curatedExtensionsList
788-
},
789-
{
790-
text: 'No'
791-
}
792-
]
793-
}
794-
}
795-
}
796-
]
797-
};
798-
799-
testObject = instantiationService.createInstance(TestExperimentService);
800-
return testObject.getExperimentById('experiment1').then(result => {
801-
assert.strictEqual(result.enabled, true);
802-
assert.strictEqual(result.state, ExperimentState.Run);
803-
return testObject.getCuratedExtensionsList(curatedExtensionsKey).then(curatedList => {
804-
assert.strictEqual(curatedList, curatedExtensionsList);
805-
});
806-
});
807-
});
808-
809-
test('Curated list shouldnt be available if experiment is disabled.', () => {
810-
const promptText = 'Hello there! Can you see this?';
811-
const curatedExtensionsKey = 'AzureDeploy';
812-
const curatedExtensionsList = ['uninstalled-extention-id1', 'uninstalled-extention-id2'];
813-
experimentData = {
814-
experiments: [
815-
{
816-
id: 'experiment1',
817-
enabled: false,
818-
action: {
819-
type: 'Prompt',
820-
properties: {
821-
promptText,
822-
commands: [
823-
{
824-
text: 'Search Marketplace',
825-
dontShowAgain: true,
826-
curatedExtensionsKey,
827-
curatedExtensionsList
828-
},
829-
{
830-
text: 'No'
831-
}
832-
]
833-
}
834-
}
835-
}
836-
]
837-
};
838-
839-
testObject = instantiationService.createInstance(TestExperimentService);
840-
return testObject.getExperimentById('experiment1').then(result => {
841-
assert.strictEqual(result.enabled, false);
842-
assert.strictEqual(result.action?.type, 'Prompt');
843-
assert.strictEqual(result.state, ExperimentState.NoRun);
844-
return testObject.getCuratedExtensionsList(curatedExtensionsKey).then(curatedList => {
845-
assert.strictEqual(curatedList.length, 0);
846-
});
847-
});
848-
});
849-
850769
test('Maps action2 to action.', () => {
851770
experimentData = {
852771
experiments: [

src/vs/workbench/contrib/extensions/browser/extensionsViews.ts

Lines changed: 8 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import { INotificationService, Severity } from 'vs/platform/notification/common/
3232
import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/viewPane';
3333
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
3434
import { coalesce, distinct, flatten } from 'vs/base/common/arrays';
35-
import { IExperimentService, IExperiment, ExperimentActionType } from 'vs/workbench/contrib/experiments/common/experimentService';
3635
import { alert } from 'vs/base/browser/ui/aria/aria';
3736
import { IListContextMenuEvent } from 'vs/base/browser/ui/list/list';
3837
import { CancellationToken } from 'vs/base/common/cancellation';
@@ -134,7 +133,6 @@ export class ExtensionsListView extends ViewPane {
134133
@ITelemetryService telemetryService: ITelemetryService,
135134
@IConfigurationService configurationService: IConfigurationService,
136135
@IWorkspaceContextService protected contextService: IWorkspaceContextService,
137-
@IExperimentService private readonly experimentService: IExperimentService,
138136
@IExtensionManagementServerService protected readonly extensionManagementServerService: IExtensionManagementServerService,
139137
@IExtensionManifestPropertiesService private readonly extensionManifestPropertiesService: IExtensionManifestPropertiesService,
140138
@IWorkbenchExtensionManagementService protected readonly extensionManagementService: IWorkbenchExtensionManagementService,
@@ -729,10 +727,6 @@ export class ExtensionsListView extends ViewPane {
729727
return this.queryRecommendations(query, options, token);
730728
}
731729

732-
if (/\bcurated:([^\s]+)\b/.test(query.value)) {
733-
return this.getCuratedModel(query, options, token);
734-
}
735-
736730
const text = query.value;
737731

738732
if (/\bext:([^\s]+)\b/g.test(text)) {
@@ -746,12 +740,14 @@ export class ExtensionsListView extends ViewPane {
746740
options.text = text.substring(0, 350);
747741
options.source = 'searchText';
748742
if (!hasUserDefinedSortOrder) {
749-
const searchExperiments = await this.getSearchExperiments();
750-
for (const experiment of searchExperiments) {
751-
if (experiment.action && text.toLowerCase() === experiment.action.properties['searchText'] && Array.isArray(experiment.action.properties['preferredResults'])) {
752-
preferredResults = experiment.action.properties['preferredResults'];
753-
options.source += `-experiment-${experiment.id}`;
754-
break;
743+
const manifest = await this.extensionManagementService.getExtensionsControlManifest();
744+
const search = manifest.search;
745+
if (Array.isArray(search)) {
746+
for (const s of search) {
747+
if (s.query && s.query.toLowerCase() === text.toLowerCase() && Array.isArray(s.preferredResults)) {
748+
preferredResults = s.preferredResults;
749+
break;
750+
}
755751
}
756752
}
757753
}
@@ -778,19 +774,6 @@ export class ExtensionsListView extends ViewPane {
778774

779775
}
780776

781-
resetSearchExperiments() { ExtensionsListView.searchExperiments = undefined; }
782-
private static searchExperiments: Promise<IExperiment[]> | undefined;
783-
private getSearchExperiments(): Promise<IExperiment[]> {
784-
if (!ExtensionsListView.searchExperiments) {
785-
ExtensionsListView.searchExperiments = this.experimentService.getExperimentsByType(ExperimentActionType.ExtensionSearchResults)
786-
.then(null, e => {
787-
this.logService.error(e);
788-
return [];
789-
});
790-
}
791-
return ExtensionsListView.searchExperiments;
792-
}
793-
794777
private sortExtensions(extensions: IExtension[], options: IQueryOptions): IExtension[] {
795778
switch (options.sortBy) {
796779
case GallerySortBy.InstallCount:
@@ -816,20 +799,6 @@ export class ExtensionsListView extends ViewPane {
816799
return extensions;
817800
}
818801

819-
private async getCuratedModel(query: Query, options: IQueryOptions, token: CancellationToken): Promise<IPagedModel<IExtension>> {
820-
const value = query.value.replace(/curated:/g, '').trim();
821-
let ids = await this.experimentService.getCuratedExtensionsList(value);
822-
if (Array.isArray(ids) && ids.length) {
823-
ids = ids.map(id => id.toLowerCase());
824-
const extensions = await this.extensionsWorkbenchService.getExtensions(ids.map(id => ({ id })), { source: `curated:${value}` }, token);
825-
// Sorts the firstPage of the pager in the same order as given array of extension ids
826-
extensions.sort((a, b) =>
827-
ids.indexOf(a.identifier.id.toLowerCase()) < ids.indexOf(b.identifier.id.toLowerCase()) ? -1 : 1);
828-
return this.getPagedModel(extensions);
829-
}
830-
return new PagedModel([]);
831-
}
832-
833802
private isRecommendationsQuery(query: Query): boolean {
834803
return ExtensionsListView.isWorkspaceRecommendedExtensionsQuery(query.value)
835804
|| ExtensionsListView.isKeymapsRecommendedExtensionsQuery(query.value)

src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionRecommendationsService.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ suite('ExtensionRecommendationsService Test', () => {
222222
onDidChangeProfile: Event.None,
223223
async getInstalled() { return []; },
224224
async canInstall() { return true; },
225-
async getExtensionsControlManifest() { return { malicious: [], deprecated: {} }; },
225+
async getExtensionsControlManifest() { return { malicious: [], deprecated: {}, search: [] }; },
226226
async getTargetPlatform() { return getTargetPlatform(platform, arch); }
227227
});
228228
instantiationService.stub(IExtensionService, <Partial<IExtensionService>>{

src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionsActions.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ function setupTest() {
9999
onDidChangeProfile: Event.None,
100100
onDidUpdateExtensionMetadata: Event.None,
101101
async getInstalled() { return []; },
102-
async getExtensionsControlManifest() { return { malicious: [], deprecated: {} }; },
102+
async getExtensionsControlManifest() { return { malicious: [], deprecated: {}, search: [] }; },
103103
async updateMetadata(local: ILocalExtension, metadata: Partial<Metadata>) {
104104
local.identifier.uuid = metadata.id;
105105
local.publisherDisplayName = metadata.publisherDisplayName!;
@@ -2641,7 +2641,7 @@ function createExtensionManagementService(installed: ILocalExtension[] = []): IP
26412641
return local;
26422642
},
26432643
async getTargetPlatform() { return getTargetPlatform(platform, arch); },
2644-
async getExtensionsControlManifest() { return <IExtensionsControlManifest>{ malicious: [], deprecated: {} }; },
2644+
async getExtensionsControlManifest() { return <IExtensionsControlManifest>{ malicious: [], deprecated: {}, search: [] }; },
26452645
};
26462646
}
26472647

0 commit comments

Comments
 (0)