Skip to content

Commit ceee7be

Browse files
committed
Fix multi-diff browser test teardown
Wait for the responsive-layout diff computation before disposing the test widget, and revert the unrelated virtualized item manager experiment. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 628b1c91-5489-4cfc-baf3-ca556c6e50bc
1 parent ea9b12d commit ceee7be

3 files changed

Lines changed: 10 additions & 59 deletions

File tree

‎src/vs/editor/browser/widget/multiDiffEditor/virtualizedItemManager.ts‎

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import { BugIndicatingError } from '../../../../base/common/errors.js';
77
import { Emitter, Event } from '../../../../base/common/event.js';
88
import { Disposable, DisposableStore, IDisposable, IReference, toDisposable } from '../../../../base/common/lifecycle.js';
9-
import { autorun, derived, IObservable, ITransaction, observableValue, transaction } from '../../../../base/common/observable.js';
9+
import { autorun, derived, IObservable, ITransaction, mapObservableArrayCached, observableValue, transaction } from '../../../../base/common/observable.js';
1010
import { OffsetRange } from '../../../common/core/ranges/offsetRange.js';
1111
import { ICompressedVirtualizedScrollItem, ICompressedVirtualizedScrollItemContext, ICompressedVirtualizedScrollViewContext } from './compressedVirtualizedScrollView.js';
1212

@@ -93,40 +93,21 @@ export interface IVirtualizedItemDelegate<TItem, TBinding extends IVirtualizedIt
9393

9494
export class VirtualizedItemManager<TItem, TBinding extends IVirtualizedItemBinding<TItem>, TTemplate extends IVirtualizedItemTemplate<TItem, TBinding>> extends Disposable {
9595
private readonly _pools = new Map<string, VirtualizedTemplatePool<TItem, TBinding, TTemplate>>();
96-
private readonly _managedItems = new Map<unknown, ManagedVirtualizedItem<TItem, TBinding, TTemplate>>();
97-
private readonly _virtualizedItems = observableValue<readonly ManagedVirtualizedItem<TItem, TBinding, TTemplate>[]>(this, []);
98-
readonly virtualizedItems: IObservable<readonly ManagedVirtualizedItem<TItem, TBinding, TTemplate>[]> = this._virtualizedItems;
96+
readonly virtualizedItems: IObservable<readonly ManagedVirtualizedItem<TItem, TBinding, TTemplate>[]>;
9997

10098
constructor(
10199
items: IObservable<readonly TItem[]>,
102100
private readonly _context: ICompressedVirtualizedScrollViewContext,
103101
private readonly _delegate: IVirtualizedItemDelegate<TItem, TBinding, TTemplate>,
104102
) {
105103
super();
106-
this._register(autorun(reader => {
107-
const nextItems = items.read(reader);
108-
const itemsToRemove = new Set(this._managedItems.keys());
109-
const nextManagedItems = nextItems.map(item => {
110-
const key = _delegate.getId(item);
111-
itemsToRemove.delete(key);
112-
let managedItem = this._managedItems.get(key);
113-
if (!managedItem) {
114-
managedItem = new ManagedVirtualizedItem(item, this, _delegate);
115-
this._managedItems.set(key, managedItem);
116-
}
117-
return managedItem;
118-
});
119-
for (const key of itemsToRemove) {
120-
this._managedItems.get(key)!.dispose();
121-
this._managedItems.delete(key);
122-
}
123-
transaction(tx => this._virtualizedItems.set(nextManagedItems, tx));
124-
}));
104+
this.virtualizedItems = mapObservableArrayCached(
105+
this,
106+
items,
107+
(item, store) => store.add(new ManagedVirtualizedItem(item, this, _delegate)),
108+
item => _delegate.getId(item),
109+
).recomputeInitiallyAndOnChange(this._store);
125110
this._register(toDisposable(() => {
126-
for (const item of this._managedItems.values()) {
127-
item.dispose();
128-
}
129-
this._managedItems.clear();
130111
for (const pool of this._pools.values()) {
131112
pool.dispose();
132113
}

‎src/vs/editor/test/browser/widget/multiDiffEditorWidget.test.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ suite('MultiDiffEditorWidget', () => {
9090
const activeControl = widget.getActiveControl();
9191
const renderSideBySideWhenNarrow = activeControl?.renderSideBySide;
9292
widget.layout(new Dimension(1000, 600));
93+
await activeControl?.waitForDiff();
9394
assert.deepStrictEqual({
9495
configuredAccessibilitySupport: updateOptionsSpy.firstCall.args[0].accessibilitySupport,
9596
configuredRenderSideBySide: updateOptionsSpy.firstCall.args[0].renderSideBySide,

‎src/vs/editor/test/browser/widget/virtualizedItemManager.test.ts‎

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import assert from 'assert';
7-
import { autorun, constObservable, derived, IObservable, observableValue } from '../../../../base/common/observable.js';
7+
import { constObservable, IObservable, observableValue } from '../../../../base/common/observable.js';
88
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';
99
import { OffsetRange } from '../../../common/core/ranges/offsetRange.js';
1010
import { ICompressedVirtualizedScrollViewContext } from '../../../browser/widget/multiDiffEditor/compressedVirtualizedScrollView.js';
@@ -80,37 +80,6 @@ suite('VirtualizedItemManager', () => {
8080

8181
assert.deepStrictEqual(createdTemplateIds, ['text', 'image']);
8282
});
83-
84-
test('disconnects from source items when disposed while its output is observed', () => {
85-
const item = new TestItem('a', 100);
86-
const items = observableValue<readonly TestItem[]>('items', [item]);
87-
let sourceReadCount = 0;
88-
const sourceItems = derived(reader => {
89-
sourceReadCount++;
90-
return items.read(reader);
91-
});
92-
const manager = disposables.add(new VirtualizedItemManager<TestItem, TestBinding, TestTemplate>(sourceItems, createContext(), {
93-
getId: item => item.id,
94-
getTemplateId: () => 'test',
95-
getUnboundSize: item => item.size,
96-
createTemplate: () => new TestTemplate(),
97-
}));
98-
const observer = disposables.add(autorun(reader => manager.virtualizedItems.read(reader)));
99-
100-
manager.dispose();
101-
const readCountAfterDispose = sourceReadCount;
102-
items.set([], undefined);
103-
104-
assert.deepStrictEqual({
105-
readCountAfterDispose,
106-
readCountAfterSourceChange: sourceReadCount,
107-
}, {
108-
readCountAfterDispose: 1,
109-
readCountAfterSourceChange: 1,
110-
});
111-
112-
observer.dispose();
113-
});
11483
});
11584

11685
class TestItem {

0 commit comments

Comments
 (0)