diff --git a/packages/navigator/src/browser/navigator-model.spec.ts b/packages/navigator/src/browser/navigator-model.spec.ts index 62d3d6f2d8e74..1c39443ccf215 100644 --- a/packages/navigator/src/browser/navigator-model.spec.ts +++ b/packages/navigator/src/browser/navigator-model.spec.ts @@ -195,13 +195,6 @@ describe('FileNavigatorModel', () => { toRestore.length = 0; }); - it('should update the root(s) on receiving a WorkspaceChanged event from the WorkspaceService', done => { - sinon.stub(navigatorModel, 'updateRoot').callsFake(() => { - done(); // This test would time out if updateRoot() is not called - }); - mockWorkspaceServiceEmitter.fire([]); - }).timeout(2000); - describe('updateRoot() function', () => { it('should assign "this.root" a WorkspaceNode with WorkspaceRootNodes (one for each root folder in the workspace) as its children', async () => { sinon.stub(mockWorkspaceService, 'roots').value([folderA, folderB]); @@ -215,7 +208,7 @@ describe('FileNavigatorModel', () => { }) ); - await navigatorModel.updateRoot(); + await navigatorModel['updateRoot'](); const thisRoot = navigatorModel['root'] as WorkspaceNode; expect(thisRoot).not.to.be.undefined; expect(thisRoot.children.length).to.eq(2); @@ -226,7 +219,7 @@ describe('FileNavigatorModel', () => { it('should assign "this.root" undefined if there is no workspace open', async () => { sinon.stub(mockWorkspaceService, 'opened').value(false); - await navigatorModel.updateRoot(); + await navigatorModel['updateRoot'](); const thisRoot = navigatorModel['root'] as WorkspaceNode; expect(thisRoot).to.be.undefined; }); diff --git a/packages/navigator/src/browser/navigator-model.ts b/packages/navigator/src/browser/navigator-model.ts index 7ae912eb4c64e..d1e0f5b0ecb15 100644 --- a/packages/navigator/src/browser/navigator-model.ts +++ b/packages/navigator/src/browser/navigator-model.ts @@ -17,7 +17,7 @@ import { injectable, inject, postConstruct } from 'inversify'; import URI from '@theia/core/lib/common/uri'; import { FileNode, FileTreeModel } from '@theia/filesystem/lib/browser'; -import { OpenerService, open, TreeNode, ExpandableTreeNode } from '@theia/core/lib/browser'; +import { OpenerService, open, TreeNode, ExpandableTreeNode, CompositeTreeNode, SelectableTreeNode } from '@theia/core/lib/browser'; import { FileNavigatorTree, WorkspaceRootNode, WorkspaceNode } from './navigator-tree'; import { WorkspaceService } from '@theia/workspace/lib/browser'; import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; @@ -32,17 +32,32 @@ export class FileNavigatorModel extends FileTreeModel { @postConstruct() protected init(): void { - this.toDispose.push( - this.workspaceService.onWorkspaceChanged(event => { - this.updateRoot(); - }) - ); - this.toDispose.push( - this.workspaceService.onWorkspaceLocationChanged(() => { - this.updateRoot(); - }) - ); super.init(); + this.initializeRoot(); + } + + protected async initializeRoot(): Promise { + await Promise.all([ + this.applicationState.reachedState('initialized_layout'), + this.workspaceService.roots + ]); + await this.updateRoot(); + if (this.toDispose.disposed) { + return; + } + this.toDispose.push(this.workspaceService.onWorkspaceChanged(() => this.updateRoot())); + this.toDispose.push(this.workspaceService.onWorkspaceLocationChanged(() => this.updateRoot())); + if (this.selectedNodes.length) { + return; + } + const root = this.root; + if (CompositeTreeNode.is(root) && root.children.length === 1) { + const child = root.children[0]; + if (SelectableTreeNode.is(child) && !child.selected && ExpandableTreeNode.is(child)) { + this.selectNode(child); + this.expandNode(child); + } + } } previewNode(node: TreeNode): void { @@ -72,8 +87,7 @@ export class FileNavigatorModel extends FileTreeModel { } } - async updateRoot(): Promise { - await this.applicationState.reachedState('initialized_layout'); + protected async updateRoot(): Promise { this.root = await this.createRoot(); } diff --git a/packages/navigator/src/browser/navigator-widget.tsx b/packages/navigator/src/browser/navigator-widget.tsx index 686494017f0a6..9c04da1145523 100644 --- a/packages/navigator/src/browser/navigator-widget.tsx +++ b/packages/navigator/src/browser/navigator-widget.tsx @@ -21,8 +21,7 @@ import { CommandService, SelectionService } from '@theia/core/lib/common'; import { CommonCommands, CorePreferences, LabelProvider, ViewContainerTitleOptions, Key } from '@theia/core/lib/browser'; import { ContextMenuRenderer, ExpandableTreeNode, - TreeProps, TreeModel, TreeNode, - SelectableTreeNode, CompositeTreeNode + TreeProps, TreeModel, TreeNode } from '@theia/core/lib/browser'; import { FileTreeWidget, FileNode, DirNode } from '@theia/filesystem/lib/browser'; import { WorkspaceService, WorkspaceCommands } from '@theia/workspace/lib/browser'; @@ -68,7 +67,6 @@ export class FileNavigatorWidget extends FileTreeWidget { super(props, model, contextMenuRenderer); this.id = FILE_NAVIGATOR_ID; this.addClass(CLASS); - this.initialize(); } @postConstruct() @@ -91,21 +89,6 @@ export class FileNavigatorWidget extends FileTreeWidget { ]); } - protected async initialize(): Promise { - await this.model.updateRoot(); - if (this.model.selectedNodes.length) { - return; - } - const root = this.model.root; - if (CompositeTreeNode.is(root) && root.children.length === 1) { - const child = root.children[0]; - if (SelectableTreeNode.is(child) && !child.selected && ExpandableTreeNode.is(child)) { - this.model.selectNode(child); - this.model.expandNode(child); - } - } - } - protected doUpdateRows(): void { super.doUpdateRows(); this.title.label = LABEL;