diff --git a/src/vs/workbench/api/browser/viewsExtensionPoint.ts b/src/vs/workbench/api/browser/viewsExtensionPoint.ts index 2a800bf880f..6ab333bf1e4 100644 --- a/src/vs/workbench/api/browser/viewsExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsExtensionPoint.ts @@ -8,7 +8,7 @@ import { forEach } from 'vs/base/common/collections'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; import * as resources from 'vs/base/common/resources'; import { ExtensionMessageCollector, ExtensionsRegistry, IExtensionPoint, IExtensionPointUser } from 'vs/workbench/services/extensions/common/extensionsRegistry'; -import { ViewContainer, ViewsRegistry, ITreeViewDescriptor, IViewContainersRegistry, Extensions as ViewContainerExtensions, TEST_VIEW_CONTAINER_ID } from 'vs/workbench/common/views'; +import { ViewContainer, ViewsRegistry, ITreeViewDescriptor, IViewContainersRegistry, Extensions as ViewContainerExtensions, TEST_VIEW_CONTAINER_ID, IViewDescriptor } from 'vs/workbench/common/views'; import { CustomTreeViewPanel, CustomTreeView } from 'vs/workbench/browser/parts/views/customView'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { coalesce, } from 'vs/base/common/arrays'; @@ -138,12 +138,14 @@ const viewsContribution: IJSONSchema = { export interface ICustomViewDescriptor extends ITreeViewDescriptor { readonly extensionId: ExtensionIdentifier; + readonly originalContainerId: string; } type ViewContainerExtensionPointType = { [loc: string]: IUserFriendlyViewsContainerDescriptor[] }; const viewsContainersExtensionPoint: IExtensionPoint = ExtensionsRegistry.registerExtensionPoint({ extensionPoint: 'viewsContainers', - jsonSchema: viewsContainersContribution + jsonSchema: viewsContainersContribution, + isDynamic: true }); type ViewExtensionPointType = { [loc: string]: IUserFriendlyViewDescriptor[] }; @@ -169,31 +171,54 @@ class ViewsExtensionHandler implements IWorkbenchContribution { private handleAndRegisterCustomViewContainers() { this.registerTestViewContainer(); - - let order = TEST_VIEW_CONTAINER_ORDER + 1; - viewsContainersExtensionPoint.setHandler((extensions) => { - for (let extension of extensions) { - const { value, collector } = extension; - forEach(value, entry => { - if (!this.isValidViewsContainer(entry.value, collector)) { - return; - } - switch (entry.key) { - case 'activitybar': - order = this.registerCustomViewContainers(entry.value, extension.description, order); - break; - } - }); + viewsContainersExtensionPoint.setHandler((extensions, { added, removed }) => { + if (removed.length) { + this.removeCustomViewContainers(removed); + } + if (added.length) { + this.addCustomViewContainers(added, this.viewContainersRegistry.all); } }); } + private addCustomViewContainers(extensionPoints: IExtensionPointUser[], existingViewContainers: ViewContainer[]): void { + const viewContainersRegistry = Registry.as(ViewContainerExtensions.ViewContainersRegistry); + let order = TEST_VIEW_CONTAINER_ORDER + viewContainersRegistry.all.filter(v => !!v.extensionId).length + 1; + for (let { value, collector, description } of extensionPoints) { + forEach(value, entry => { + if (!this.isValidViewsContainer(entry.value, collector)) { + return; + } + switch (entry.key) { + case 'activitybar': + order = this.registerCustomViewContainers(entry.value, description, order, existingViewContainers); + break; + } + }); + } + } + + private removeCustomViewContainers(extensionPoints: IExtensionPointUser[]): void { + const viewContainersRegistry = Registry.as(ViewContainerExtensions.ViewContainersRegistry); + const removedExtensions: Set = extensionPoints.reduce((result, e) => { result.add(ExtensionIdentifier.toKey(e.description.identifier)); return result; }, new Set()); + for (const viewContainer of viewContainersRegistry.all) { + if (viewContainer.extensionId && removedExtensions.has(ExtensionIdentifier.toKey(viewContainer.extensionId))) { + // move only those views that do not belong to the removed extension + const views = ViewsRegistry.getViews(viewContainer).filter((view: ICustomViewDescriptor) => !removedExtensions.has(ExtensionIdentifier.toKey(view.extensionId))); + if (views.length) { + ViewsRegistry.moveViews(views, this.getDefaultViewContainer()); + } + this.deregisterCustomViewContainer(viewContainer); + } + } + } + private registerTestViewContainer(): void { const title = localize('test', "Test"); const cssClass = `extensionViewlet-test`; const icon = URI.parse(require.toUrl('./media/test.svg')); - this.registerCustomViewlet(TEST_VIEW_CONTAINER_ID, title, icon, TEST_VIEW_CONTAINER_ORDER, cssClass, undefined); + this.registerCustomViewContainer(TEST_VIEW_CONTAINER_ID, title, icon, TEST_VIEW_CONTAINER_ORDER, cssClass, undefined); } private isValidViewsContainer(viewsContainersDescriptors: IUserFriendlyViewsContainerDescriptor[], collector: ExtensionMessageCollector): boolean { @@ -224,22 +249,35 @@ class ViewsExtensionHandler implements IWorkbenchContribution { return true; } - private registerCustomViewContainers(containers: IUserFriendlyViewsContainerDescriptor[], extension: IExtensionDescription, order: number): number { + private registerCustomViewContainers(containers: IUserFriendlyViewsContainerDescriptor[], extension: IExtensionDescription, order: number, existingViewContainers: ViewContainer[]): number { containers.forEach(descriptor => { const cssClass = `extensionViewlet-${descriptor.id}`; const icon = resources.joinPath(extension.extensionLocation, descriptor.icon); - this.registerCustomViewlet(`workbench.view.extension.${descriptor.id}`, descriptor.title, icon, order++, cssClass, extension.identifier); + const id = `workbench.view.extension.${descriptor.id}`; + const viewContainer = this.registerCustomViewContainer(id, descriptor.title, icon, order++, cssClass, extension.identifier); + + // Move those views that belongs to this container + if (existingViewContainers.length) { + const viewsToMove: IViewDescriptor[] = []; + for (const existingViewContainer of existingViewContainers) { + if (viewContainer !== existingViewContainer) { + viewsToMove.push(...ViewsRegistry.getViews(existingViewContainer).filter((view: ICustomViewDescriptor) => view.originalContainerId === descriptor.id)); + } + } + if (viewsToMove.length) { + ViewsRegistry.moveViews(viewsToMove, viewContainer); + } + } }); return order; } - private registerCustomViewlet(id: string, title: string, icon: URI, order: number, cssClass: string, extensionId: ExtensionIdentifier | undefined): void { - const viewContainersRegistry = Registry.as(ViewContainerExtensions.ViewContainersRegistry); - const viewletRegistry = Registry.as(ViewletExtensions.Viewlets); + private registerCustomViewContainer(id: string, title: string, icon: URI, order: number, cssClass: string, extensionId: ExtensionIdentifier | undefined): ViewContainer { + let viewContainer = this.viewContainersRegistry.get(id); - if (!viewletRegistry.getViewlet(id)) { + if (!viewContainer) { - viewContainersRegistry.registerViewContainer(id, extensionId); + viewContainer = this.viewContainersRegistry.registerViewContainer(id, extensionId); // Register as viewlet class CustomViewlet extends ViewContainerViewlet { @@ -267,7 +305,7 @@ class ViewsExtensionHandler implements IWorkbenchContribution { icon ); - viewletRegistry.registerViewlet(viewletDescriptor); + Registry.as(ViewletExtensions.Viewlets).registerViewlet(viewletDescriptor); // Register Action to Open Viewlet class OpenCustomViewletAction extends ShowViewletAction { @@ -292,6 +330,12 @@ class ViewsExtensionHandler implements IWorkbenchContribution { createCSSRule(iconClass, `-webkit-mask: url('${icon}') no-repeat 50% 50%`); } + return viewContainer; + } + + private deregisterCustomViewContainer(viewContainer: ViewContainer): void { + this.viewContainersRegistry.deregisterViewContainer(viewContainer); + Registry.as(ViewletExtensions.Viewlets).deregisterViewlet(viewContainer.id); } private handleAndRegisterCustomViews() { @@ -317,7 +361,7 @@ class ViewsExtensionHandler implements IWorkbenchContribution { let container = this.getViewContainer(entry.key); if (!container) { collector.warn(localize('ViewContainerDoesnotExist', "View container '{0}' does not exist and all views registered to it will be added to 'Explorer'.", entry.key)); - container = this.viewContainersRegistry.get(EXPLORER); + container = this.getDefaultViewContainer(); } const registeredViews = ViewsRegistry.getViews(container); const viewIds: string[] = []; @@ -332,7 +376,7 @@ class ViewsExtensionHandler implements IWorkbenchContribution { return null; } - const viewDescriptor = { + const viewDescriptor = { id: item.id, name: item.name, ctor: CustomTreeViewPanel, @@ -341,7 +385,8 @@ class ViewsExtensionHandler implements IWorkbenchContribution { collapsed: this.showCollapsed(container), treeView: this.instantiationService.createInstance(CustomTreeView, item.id, container), order: ExtensionIdentifier.equals(extension.description.identifier, container.extensionId) ? index + 1 : undefined, - extensionId: extension.description.identifier + extensionId: extension.description.identifier, + originalContainerId: entry.key }; viewIds.push(viewDescriptor.id); @@ -352,12 +397,16 @@ class ViewsExtensionHandler implements IWorkbenchContribution { } } + private getDefaultViewContainer(): ViewContainer { + return this.viewContainersRegistry.get(EXPLORER); + } + private removeViews(extensions: IExtensionPointUser[]): void { const removedExtensions: Set = extensions.reduce((result, e) => { result.add(ExtensionIdentifier.toKey(e.description.identifier)); return result; }, new Set()); for (const viewContainer of this.viewContainersRegistry.all) { const removedViews = ViewsRegistry.getViews(viewContainer).filter((v: ICustomViewDescriptor) => v.extensionId && removedExtensions.has(ExtensionIdentifier.toKey(v.extensionId))); if (removedViews.length) { - ViewsRegistry.deregisterViews(removedViews.map(v => v.id), viewContainer); + ViewsRegistry.deregisterViews(removedViews, viewContainer); } } } diff --git a/src/vs/workbench/browser/parts/views/views.ts b/src/vs/workbench/browser/parts/views/views.ts index 646f20e594d..b779f81a8d5 100644 --- a/src/vs/workbench/browser/parts/views/views.ts +++ b/src/vs/workbench/browser/parts/views/views.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./media/views'; -import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, IDisposable, toDisposable, dispose } from 'vs/base/common/lifecycle'; import { IViewsService, ViewsRegistry, IViewsViewlet, ViewContainer, IViewDescriptor, IViewContainersRegistry, Extensions as ViewContainerExtensions, IView, IViewDescriptorCollection } from 'vs/workbench/common/views'; import { Registry } from 'vs/platform/registry/common/platform'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; @@ -534,6 +534,7 @@ export class ViewsService extends Disposable implements IViewsService { _serviceBrand: any; + private readonly viewDescriptorCollections: Map; private readonly viewDisposable: Map; private readonly activeViewContextKeys: Map>; @@ -543,6 +544,7 @@ export class ViewsService extends Disposable implements IViewsService { ) { super(); + this.viewDescriptorCollections = new Map(); this.viewDisposable = new Map(); this.activeViewContextKeys = new Map>(); @@ -559,10 +561,16 @@ export class ViewsService extends Disposable implements IViewsService { this.viewDisposable.clear(); })); this._register(viewContainersRegistry.onDidRegister(viewContainer => this.onDidRegisterViewContainer(viewContainer))); + this._register(viewContainersRegistry.onDidDeregister(viewContainer => this.onDidDeregisterViewContainer(viewContainer))); + this._register(toDisposable(() => { + this.viewDescriptorCollections.forEach(({ disposable }) => disposable.dispose()); + this.viewDescriptorCollections.clear(); + })); } - getViewDescriptors(container: ViewContainer): IViewDescriptorCollection { - return this.viewDescriptorCollections.get(container)!; + getViewDescriptors(container: ViewContainer): IViewDescriptorCollection | null { + const viewDescriptorCollectionItem = this.viewDescriptorCollections.get(container); + return viewDescriptorCollectionItem ? viewDescriptorCollectionItem.viewDescriptorCollection : null; } openView(id: string, focus: boolean): Promise { @@ -583,12 +591,21 @@ export class ViewsService extends Disposable implements IViewsService { } private onDidRegisterViewContainer(viewContainer: ViewContainer): void { - const viewDescriptorCollection = this._register(new ViewDescriptorCollection(viewContainer, this.contextKeyService)); + const viewDescriptorCollection = new ViewDescriptorCollection(viewContainer, this.contextKeyService); + const disposables: IDisposable[] = [viewDescriptorCollection]; this.onDidChangeActiveViews({ added: viewDescriptorCollection.activeViewDescriptors, removed: [] }); - this._register(viewDescriptorCollection.onDidChangeActiveViews(changed => this.onDidChangeActiveViews(changed))); + viewDescriptorCollection.onDidChangeActiveViews(changed => this.onDidChangeActiveViews(changed), this, disposables); - this.viewDescriptorCollections.set(viewContainer, viewDescriptorCollection); + this.viewDescriptorCollections.set(viewContainer, { viewDescriptorCollection, disposable: toDisposable(() => dispose(disposables)) }); + } + + private onDidDeregisterViewContainer(viewContainer: ViewContainer): void { + const viewDescriptorCollectionItem = this.viewDescriptorCollections.get(viewContainer); + if (viewDescriptorCollectionItem) { + viewDescriptorCollectionItem.disposable.dispose(); + this.viewDescriptorCollections.delete(viewContainer); + } } private onDidChangeActiveViews({ added, removed }: { added: IViewDescriptor[], removed: IViewDescriptor[] }): void { diff --git a/src/vs/workbench/browser/parts/views/viewsViewlet.ts b/src/vs/workbench/browser/parts/views/viewsViewlet.ts index 767e16d82df..a3c3be3ee57 100644 --- a/src/vs/workbench/browser/parts/views/viewsViewlet.ts +++ b/src/vs/workbench/browser/parts/views/viewsViewlet.ts @@ -214,7 +214,13 @@ export abstract class ViewContainerViewlet extends PanelViewlet implements IView this.addPanels(panelsToAdd); this.restoreViewSizes(); - return panelsToAdd.map(({ panel }) => panel); + + const panels: ViewletPanel[] = []; + for (const { panel } of panelsToAdd) { + panel.setVisible(this.isVisible()); + panels.push(panel); + } + return panels; } private onDidRemoveViews(removed: IViewDescriptorRef[]): void { diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index 05de63f7980..15fa9d4b93e 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -13,7 +13,7 @@ import { IViewlet } from 'vs/workbench/common/viewlet'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IDisposable } from 'vs/base/common/lifecycle'; import { ThemeIcon } from 'vs/platform/theme/common/themeService'; -import { values } from 'vs/base/common/map'; +import { values, keys } from 'vs/base/common/map'; import { Registry } from 'vs/platform/registry/common/platform'; import { IKeybindings } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IAction } from 'vs/base/common/actions'; @@ -32,6 +32,11 @@ export interface IViewContainersRegistry { */ readonly onDidRegister: Event; + /** + * An event that is triggerred when a view container is deregistered. + */ + readonly onDidDeregister: Event; + /** * All registered view containers */ @@ -47,6 +52,12 @@ export interface IViewContainersRegistry { */ registerViewContainer(id: string, extensionId?: ExtensionIdentifier): ViewContainer; + /** + * Deregisters the given view container + * No op if the view container is not registered + */ + deregisterViewContainer(viewContainer: ViewContainer): void; + /** * Returns the view container with given id. * @@ -64,6 +75,9 @@ class ViewContainersRegistryImpl implements IViewContainersRegistry { private readonly _onDidRegister = new Emitter(); readonly onDidRegister: Event = this._onDidRegister.event; + private readonly _onDidDeregister = new Emitter(); + readonly onDidDeregister: Event = this._onDidDeregister.event; + private viewContainers: Map = new Map(); get all(): ViewContainer[] { @@ -86,6 +100,14 @@ class ViewContainersRegistryImpl implements IViewContainersRegistry { return viewContainer; } + deregisterViewContainer(viewContainer: ViewContainer): void { + const existing = this.viewContainers.get(viewContainer.id); + if (existing) { + this.viewContainers.delete(viewContainer.id); + this._onDidDeregister.fire(viewContainer); + } + } + get(id: string): ViewContainer | undefined { return this.viewContainers.get(id); } @@ -118,7 +140,7 @@ export interface IViewDescriptor { readonly focusCommand?: { id: string, keybindings?: IKeybindings }; } -export interface IViewDescriptorCollection { +export interface IViewDescriptorCollection extends IDisposable { readonly onDidChangeActiveViews: Event<{ added: IViewDescriptor[], removed: IViewDescriptor[] }>; readonly activeViewDescriptors: IViewDescriptor[]; readonly allViewDescriptors: IViewDescriptor[]; @@ -134,9 +156,9 @@ export interface IViewsRegistry { registerViews(views: IViewDescriptor[], viewContainer: ViewContainer): void; - deregisterViews(ids: string[], viewContainer: ViewContainer): void; + deregisterViews(views: IViewDescriptor[], viewContainer: ViewContainer): void; - moveViews(ids: string[], viewContainer: ViewContainer): void; + moveViews(views: IViewDescriptor[], viewContainer: ViewContainer): void; getViews(viewContainer: ViewContainer): IViewDescriptor[]; @@ -159,52 +181,25 @@ export const ViewsRegistry: IViewsRegistry = new class implements IViewsRegistry private _viewContainers: ViewContainer[] = []; private _views: Map = new Map(); - registerViews(viewDescriptors: IViewDescriptor[], viewContainer: ViewContainer): void { - if (viewDescriptors.length) { - let views = this._views.get(viewContainer); - if (!views) { - views = []; - this._views.set(viewContainer, views); - this._viewContainers.push(viewContainer); - } - for (const viewDescriptor of viewDescriptors) { - if (views.some(v => v.id === viewDescriptor.id)) { - throw new Error(localize('duplicateId', "A view with id '{0}' is already registered in the container '{1}'", viewDescriptor.id, viewContainer.id)); - } - views.push(viewDescriptor); - } - this._onViewsRegistered.fire({ views: viewDescriptors, viewContainer }); + registerViews(views: IViewDescriptor[], viewContainer: ViewContainer): void { + this.addViews(views, viewContainer); + this._onViewsRegistered.fire({ views: views, viewContainer }); + } + + deregisterViews(viewDescriptors: IViewDescriptor[], viewContainer: ViewContainer): void { + const views = this.removeViews(viewDescriptors, viewContainer); + if (views.length) { + this._onViewsDeregistered.fire({ views, viewContainer }); } } - deregisterViews(ids: string[], viewContainer: ViewContainer): void { - const views = this._views.get(viewContainer); - - if (!views) { - return; - } - - const viewsToDeregister = views.filter(view => ids.indexOf(view.id) !== -1); - - if (viewsToDeregister.length) { - const remaningViews = views.filter(view => ids.indexOf(view.id) === -1); - if (remaningViews.length) { - this._views.set(viewContainer, remaningViews); - } else { - this._views.delete(viewContainer); - this._viewContainers.splice(this._viewContainers.indexOf(viewContainer), 1); - } - this._onViewsDeregistered.fire({ views: viewsToDeregister, viewContainer }); - } - - } - - moveViews(ids: string[], viewContainer: ViewContainer): void { - this._views.forEach((views, container) => { + moveViews(viewsToMove: IViewDescriptor[], viewContainer: ViewContainer): void { + keys(this._views).forEach(container => { if (container !== viewContainer) { - const movedViews = views.filter(view => ids.indexOf(view.id) !== -1); - if (movedViews.length) { - this._onDidChangeContainer.fire({ views: movedViews, from: container, to: viewContainer }); + const views = this.removeViews(viewsToMove, container); + if (views.length) { + this.addViews(views, viewContainer); + this._onDidChangeContainer.fire({ views, from: container, to: viewContainer }); } } }); @@ -233,6 +228,46 @@ export const ViewsRegistry: IViewsRegistry = new class implements IViewsRegistry } return null; } + + private addViews(viewDescriptors: IViewDescriptor[], viewContainer: ViewContainer): void { + let views = this._views.get(viewContainer); + if (!views) { + views = []; + this._views.set(viewContainer, views); + this._viewContainers.push(viewContainer); + } + for (const viewDescriptor of viewDescriptors) { + if (views.some(v => v.id === viewDescriptor.id)) { + throw new Error(localize('duplicateId', "A view with id '{0}' is already registered in the container '{1}'", viewDescriptor.id, viewContainer.id)); + } + views.push(viewDescriptor); + } + } + + private removeViews(viewDescriptors: IViewDescriptor[], viewContainer: ViewContainer): IViewDescriptor[] { + const views = this._views.get(viewContainer); + if (!views) { + return []; + } + const viewsToDeregister: IViewDescriptor[] = []; + const remaningViews: IViewDescriptor[] = []; + for (const view of views) { + if (viewDescriptors.indexOf(view) === -1) { + remaningViews.push(view); + } else { + viewsToDeregister.push(view); + } + } + if (viewsToDeregister.length) { + if (remaningViews.length) { + this._views.set(viewContainer, remaningViews); + } else { + this._views.delete(viewContainer); + this._viewContainers.splice(this._viewContainers.indexOf(viewContainer), 1); + } + } + return viewsToDeregister; + } }; export interface IView { diff --git a/src/vs/workbench/parts/files/electron-browser/explorerViewlet.ts b/src/vs/workbench/parts/files/electron-browser/explorerViewlet.ts index 074b8d98330..7c01ed22445 100644 --- a/src/vs/workbench/parts/files/electron-browser/explorerViewlet.ts +++ b/src/vs/workbench/parts/files/electron-browser/explorerViewlet.ts @@ -59,7 +59,7 @@ export class ExplorerViewletViewsContribution extends Disposable implements IWor const viewDescriptors = ViewsRegistry.getViews(VIEW_CONTAINER); let viewDescriptorsToRegister: IViewDescriptor[] = []; - let viewDescriptorsToDeregister: string[] = []; + let viewDescriptorsToDeregister: IViewDescriptor[] = []; const openEditorsViewDescriptor = this.createOpenEditorsViewDescriptor(); const openEditorsViewDescriptorExists = viewDescriptors.some(v => v.id === openEditorsViewDescriptor.id); @@ -73,14 +73,14 @@ export class ExplorerViewletViewsContribution extends Disposable implements IWor } if (this.workspaceContextService.getWorkbenchState() === WorkbenchState.EMPTY || this.workspaceContextService.getWorkspace().folders.length === 0) { if (explorerViewDescriptorExists) { - viewDescriptorsToDeregister.push(explorerViewDescriptor.id); + viewDescriptorsToDeregister.push(explorerViewDescriptor); } if (!emptyViewDescriptorExists) { viewDescriptorsToRegister.push(emptyViewDescriptor); } } else { if (emptyViewDescriptorExists) { - viewDescriptorsToDeregister.push(emptyViewDescriptor.id); + viewDescriptorsToDeregister.push(emptyViewDescriptor); } if (!explorerViewDescriptorExists) { viewDescriptorsToRegister.push(explorerViewDescriptor); diff --git a/src/vs/workbench/test/browser/parts/views/views.test.ts b/src/vs/workbench/test/browser/parts/views/views.test.ts index 31a9ce1b677..11fd665875f 100644 --- a/src/vs/workbench/test/browser/parts/views/views.test.ts +++ b/src/vs/workbench/test/browser/parts/views/views.test.ts @@ -46,7 +46,7 @@ suite('ContributableViewsModel', () => { }); teardown(() => { - ViewsRegistry.deregisterViews(ViewsRegistry.getViews(container).map(({ id }) => id), container); + ViewsRegistry.deregisterViews(ViewsRegistry.getViews(container), container); }); test('empty model', function () { @@ -74,7 +74,7 @@ suite('ContributableViewsModel', () => { assert.deepEqual(model.visibleViewDescriptors[0], viewDescriptor); assert.deepEqual(seq.elements[0], viewDescriptor); - ViewsRegistry.deregisterViews(['view1'], container); + ViewsRegistry.deregisterViews([viewDescriptor], container); assert.equal(model.visibleViewDescriptors.length, 0); assert.equal(seq.elements.length, 0); @@ -114,7 +114,7 @@ suite('ContributableViewsModel', () => { assert.equal(model.visibleViewDescriptors.length, 0, 'view should disappear'); assert.equal(seq.elements.length, 0); - ViewsRegistry.deregisterViews(['view1'], container); + ViewsRegistry.deregisterViews([viewDescriptor], container); assert.equal(model.visibleViewDescriptors.length, 0, 'view should not be there anymore'); assert.equal(seq.elements.length, 0); @@ -144,7 +144,7 @@ suite('ContributableViewsModel', () => { assert.deepEqual(model.visibleViewDescriptors, [view1, view2], 'both views should be visible'); assert.deepEqual(seq.elements, [view1, view2], 'both views should be visible'); - ViewsRegistry.deregisterViews([view1.id, view2.id], container); + ViewsRegistry.deregisterViews([view1, view2], container); }); test('when contexts - multiple 2', async function () { @@ -167,7 +167,7 @@ suite('ContributableViewsModel', () => { assert.deepEqual(model.visibleViewDescriptors, [view1, view2], 'both views should be visible'); assert.deepEqual(seq.elements, [view1, view2], 'both views should be visible'); - ViewsRegistry.deregisterViews([view1.id, view2.id], container); + ViewsRegistry.deregisterViews([view1, view2], container); }); test('setVisible', () => { @@ -210,7 +210,7 @@ suite('ContributableViewsModel', () => { assert.deepEqual(model.visibleViewDescriptors, [view1, view2, view3], 'view2 should show'); assert.deepEqual(seq.elements, [view1, view2, view3]); - ViewsRegistry.deregisterViews([view1.id, view2.id, view3.id], container); + ViewsRegistry.deregisterViews([view1, view2, view3], container); assert.deepEqual(model.visibleViewDescriptors, []); assert.deepEqual(seq.elements, []); });