diff --git a/src/vs/workbench/parts/debug/browser/loadedScriptsView.ts b/src/vs/workbench/parts/debug/browser/loadedScriptsView.ts index 83da60449dc98d5975968f53c873a13fec53c430..7a73e61aea788fec78694b76253a298643917608 100644 --- a/src/vs/workbench/parts/debug/browser/loadedScriptsView.ts +++ b/src/vs/workbench/parts/debug/browser/loadedScriptsView.ts @@ -27,6 +27,8 @@ import { tildify } from 'vs/base/common/labels'; import { isWindows } from 'vs/base/common/platform'; import URI from 'vs/base/common/uri'; import { ltrim } from 'vs/base/common/strings'; +import { RunOnceScheduler } from 'vs/base/common/async'; +import { memoize } from 'vs/base/common/decorators'; const SMART = true; @@ -306,7 +308,7 @@ export class LoadedScriptsView extends TreeViewsViewletPanel { private treeContainer: HTMLElement; private loadedScriptsItemType: IContextKey; private settings: any; - + private shouldRefreshRecursive; constructor( options: IViewletViewOptions, @@ -325,6 +327,16 @@ export class LoadedScriptsView extends TreeViewsViewletPanel { this.loadedScriptsItemType = CONTEXT_LOADED_SCRIPTS_ITEM_TYPE.bindTo(contextKeyService); } + @memoize + private get treeRefreshScheduler(): RunOnceScheduler { + return new RunOnceScheduler(() => { + if (this.tree) { + this.tree.refresh(undefined, this.shouldRefreshRecursive); + this.shouldRefreshRecursive = false; + } + }, 300); + } + protected renderBody(container: HTMLElement): void { dom.addClass(container, 'debug-loaded-scripts'); @@ -369,18 +381,12 @@ export class LoadedScriptsView extends TreeViewsViewletPanel { const root = new RootTreeItem(this.debugService.getModel(), this.environmentService, this.contextService); this.tree.setInput(root); - let timeout: number; const registerLoadedSourceListener = (session: ISession) => { this.disposables.push(session.onDidLoadedSource(event => { const sessionRoot = root.add(session); sessionRoot.addPath(event.source); - - clearTimeout(timeout); - timeout = setTimeout(() => { - if (this.tree) { - this.tree.refresh(root, true); - } - }, 300); + this.shouldRefreshRecursive = true; + this.treeRefreshScheduler.schedule(); })); }; @@ -388,11 +394,8 @@ export class LoadedScriptsView extends TreeViewsViewletPanel { this.debugService.getModel().getSessions().forEach(registerLoadedSourceListener); this.disposables.push(this.debugService.onDidEndSession(session => { - clearTimeout(timeout); root.remove(session.getId()); - if (this.tree) { - this.tree.refresh(root, false); - } + this.treeRefreshScheduler.schedule(); })); } @@ -407,6 +410,11 @@ export class LoadedScriptsView extends TreeViewsViewletPanel { this.settings[LoadedScriptsView.MEMENTO] = !this.isExpanded(); super.shutdown(); } + + dispose(): void { + super.dispose(); + this.tree = undefined; + } } // A good example of data source, renderers, action providers and accessibilty providers can be found in the callStackView.ts