tweak node update/resue logic and add more info when errors happen, #56634, #57005, #57006

This commit is contained in:
Johannes Rieken
2018-08-23 11:36:35 +02:00
parent 069c71374f
commit 030d26e61b
@@ -244,11 +244,20 @@ export class BreadcrumbsWidget {
}
setItems(items: BreadcrumbsItem[]): void {
let prefix = commonPrefixLength(this._items, items, (a, b) => a.equals(b));
let removed = this._items.splice(prefix, this._items.length - prefix, ...items.slice(prefix));
this._render(prefix);
dispose(removed);
this._focus(-1, undefined);
let prefix: number;
let removed: BreadcrumbsItem[];
try {
prefix = commonPrefixLength(this._items, items, (a, b) => a.equals(b));
removed = this._items.splice(prefix, this._items.length - prefix, ...items.slice(prefix));
this._render(prefix);
dispose(removed);
this._focus(-1, undefined);
} catch (e) {
let newError = new Error(`BreadcrumbsItem#setItems: newItems: ${items.length}, prefix: ${prefix}, removed: ${removed.length}`);
newError.name = e.name;
newError.stack = e.stack;
throw newError;
}
}
private _render(start: number): void {
@@ -258,11 +267,11 @@ export class BreadcrumbsWidget {
this._renderItem(item, node);
}
// case a: more nodes -> remove them
for (; start < this._nodes.length; start++) {
this._nodes[start].remove();
this._freeNodes.push(this._nodes[start]);
while (start < this._nodes.length) {
const free = this._nodes.pop();
this._freeNodes.push(free);
free.remove();
}
this._nodes.length = this._items.length;
// case b: more items -> render them
for (; start < this._items.length; start++) {
@@ -270,7 +279,7 @@ export class BreadcrumbsWidget {
let node = this._freeNodes.length > 0 ? this._freeNodes.pop() : document.createElement('div');
this._renderItem(item, node);
this._domNode.appendChild(node);
this._nodes[start] = node;
this._nodes.push(node);
}
this.layout(undefined);
}