mirror of
https://github.com/mathuo/dockview
synced 2025-08-27 12:36:35 +00:00
feat: cleanup components on dispose
This commit is contained in:
parent
b1e89e92e3
commit
dc4a90a5ce
@ -154,18 +154,12 @@ class TestGroupPanel implements IGroupPanel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
describe('dockviewComponent', () => {
|
describe('dockviewComponent', () => {
|
||||||
let root: HTMLElement;
|
|
||||||
let container: HTMLElement;
|
let container: HTMLElement;
|
||||||
let dockview: DockviewComponent;
|
let dockview: DockviewComponent;
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
root = document.createElement('div'); // dockview container must have parent element
|
|
||||||
container = document.createElement('div');
|
container = document.createElement('div');
|
||||||
|
|
||||||
root.appendChild(container);
|
|
||||||
root.className = 'root';
|
|
||||||
container.className = 'container';
|
|
||||||
|
|
||||||
dockview = new DockviewComponent(container, {
|
dockview = new DockviewComponent(container, {
|
||||||
components: {
|
components: {
|
||||||
default: PanelContentPartTest,
|
default: PanelContentPartTest,
|
||||||
@ -1038,4 +1032,31 @@ describe('dockviewComponent', () => {
|
|||||||
|
|
||||||
disposable.dispose();
|
disposable.dispose();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('dispose of dockviewComponent', () => {
|
||||||
|
dockview.layout(500, 1000);
|
||||||
|
|
||||||
|
dockview.addPanel({
|
||||||
|
id: 'panel1',
|
||||||
|
component: 'default',
|
||||||
|
});
|
||||||
|
dockview.addPanel({
|
||||||
|
id: 'panel2',
|
||||||
|
component: 'default',
|
||||||
|
});
|
||||||
|
dockview.addPanel({
|
||||||
|
id: 'panel3',
|
||||||
|
component: 'default',
|
||||||
|
});
|
||||||
|
dockview.addPanel({
|
||||||
|
id: 'panel4',
|
||||||
|
component: 'default',
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(container.childNodes.length).toBe(1);
|
||||||
|
|
||||||
|
dockview.dispose();
|
||||||
|
|
||||||
|
expect(container.childNodes.length).toBe(0);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
File diff suppressed because it is too large
Load Diff
1647
packages/dockview/src/__tests__/gridview/gridviewComponent.spec.ts
Normal file
1647
packages/dockview/src/__tests__/gridview/gridviewComponent.spec.ts
Normal file
File diff suppressed because it is too large
Load Diff
@ -102,4 +102,38 @@ describe('paneview', () => {
|
|||||||
|
|
||||||
disposable.dispose();
|
disposable.dispose();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('dispose of paneview', () => {
|
||||||
|
expect(container.childNodes.length).toBe(0);
|
||||||
|
|
||||||
|
const paneview = new Paneview(container, {
|
||||||
|
orientation: Orientation.HORIZONTAL,
|
||||||
|
});
|
||||||
|
|
||||||
|
const view1 = new TestPanel(
|
||||||
|
'id',
|
||||||
|
'component',
|
||||||
|
'headerComponent',
|
||||||
|
Orientation.VERTICAL,
|
||||||
|
true,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
const view2 = new TestPanel(
|
||||||
|
'id2',
|
||||||
|
'component',
|
||||||
|
'headerComponent',
|
||||||
|
Orientation.VERTICAL,
|
||||||
|
true,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
|
||||||
|
paneview.addPane(view1);
|
||||||
|
paneview.addPane(view2);
|
||||||
|
|
||||||
|
expect(container.childNodes.length).toBeGreaterThan(0);
|
||||||
|
|
||||||
|
paneview.dispose();
|
||||||
|
|
||||||
|
expect(container.childNodes.length).toBe(0);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -276,4 +276,33 @@ describe('componentPaneview', () => {
|
|||||||
|
|
||||||
disposable.dispose();
|
disposable.dispose();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('dispose of paneviewComponent', () => {
|
||||||
|
expect(container.childNodes.length).toBe(0);
|
||||||
|
|
||||||
|
const paneview = new PaneviewComponent(container, {
|
||||||
|
components: {
|
||||||
|
testPanel: TestPanel,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
paneview.layout(1000, 1000);
|
||||||
|
|
||||||
|
paneview.addPanel({
|
||||||
|
id: 'panel1',
|
||||||
|
component: 'testPanel',
|
||||||
|
title: 'Panel 1',
|
||||||
|
});
|
||||||
|
paneview.addPanel({
|
||||||
|
id: 'panel2',
|
||||||
|
component: 'testPanel',
|
||||||
|
title: 'Panel 2',
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(container.childNodes.length).toBeGreaterThan(0);
|
||||||
|
|
||||||
|
paneview.dispose();
|
||||||
|
|
||||||
|
expect(container.childNodes.length).toBe(0);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -565,4 +565,25 @@ describe('splitview', () => {
|
|||||||
|
|
||||||
disposable.dispose();
|
disposable.dispose();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('dispose of splitview', () => {
|
||||||
|
expect(container.childNodes.length).toBe(0);
|
||||||
|
|
||||||
|
const splitview = new Splitview(container, {
|
||||||
|
orientation: Orientation.HORIZONTAL,
|
||||||
|
proportionalLayout: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
const view1 = new Testview(0, 100);
|
||||||
|
const view2 = new Testview(0, 100);
|
||||||
|
|
||||||
|
splitview.addView(view1);
|
||||||
|
splitview.addView(view2);
|
||||||
|
|
||||||
|
expect(container.childNodes.length).toBeGreaterThan(0);
|
||||||
|
|
||||||
|
splitview.dispose();
|
||||||
|
|
||||||
|
expect(container.childNodes.length).toBe(0);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@ -358,37 +358,31 @@ describe('componentSplitview', () => {
|
|||||||
disposable.dispose();
|
disposable.dispose();
|
||||||
});
|
});
|
||||||
|
|
||||||
class EventListenerTracker {
|
test('dispose of splitviewComponent', () => {
|
||||||
private events = new Map<string, Set<any>>();
|
expect(container.childNodes.length).toBe(0);
|
||||||
|
|
||||||
get size() {
|
const splitview = new SplitviewComponent(container, {
|
||||||
return this.events.size;
|
orientation: Orientation.HORIZONTAL,
|
||||||
}
|
components: {
|
||||||
|
testPanel: TestPanel,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
constructor() {
|
splitview.layout(1000, 1000);
|
||||||
const originalAddEventListener = document.addEventListener;
|
|
||||||
const originalRemoveEventListener = document.removeEventListener;
|
|
||||||
|
|
||||||
document.addEventListener = jest.fn((event, callback, options) => {
|
splitview.addPanel({
|
||||||
if (!this.events.has(event)) {
|
id: 'panel1',
|
||||||
this.events.set(event, new Set<any>());
|
component: 'testPanel',
|
||||||
}
|
});
|
||||||
this.events.get(event).add(callback);
|
splitview.addPanel({
|
||||||
originalAddEventListener(event, callback, options);
|
id: 'panel2',
|
||||||
});
|
component: 'testPanel',
|
||||||
|
});
|
||||||
|
|
||||||
document.removeEventListener = jest.fn(
|
expect(container.childNodes.length).toBeGreaterThan(0);
|
||||||
(event, callback, options) => {
|
|
||||||
if (this.events.has(event)) {
|
|
||||||
this.events.get(event).delete(callback);
|
|
||||||
if (this.events.get(event).size === 0) {
|
|
||||||
this.events.delete(event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
originalRemoveEventListener(event, callback, options);
|
splitview.dispose();
|
||||||
}
|
|
||||||
);
|
expect(container.childNodes.length).toBe(0);
|
||||||
}
|
});
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
@ -287,6 +287,8 @@ export class Gridview implements IDisposable {
|
|||||||
this.disposable.dispose();
|
this.disposable.dispose();
|
||||||
this._onDidChange.dispose();
|
this._onDidChange.dispose();
|
||||||
this.root.dispose();
|
this.root.dispose();
|
||||||
|
|
||||||
|
this.element.remove();
|
||||||
}
|
}
|
||||||
|
|
||||||
public clear() {
|
public clear() {
|
||||||
|
@ -189,8 +189,6 @@ export class Paneview extends CompositeDisposable implements IDisposable {
|
|||||||
public dispose() {
|
public dispose() {
|
||||||
super.dispose();
|
super.dispose();
|
||||||
|
|
||||||
this.splitview.dispose();
|
|
||||||
|
|
||||||
if (this.animationTimer) {
|
if (this.animationTimer) {
|
||||||
clearTimeout(this.animationTimer);
|
clearTimeout(this.animationTimer);
|
||||||
this.animationTimer = undefined;
|
this.animationTimer = undefined;
|
||||||
@ -201,6 +199,7 @@ export class Paneview extends CompositeDisposable implements IDisposable {
|
|||||||
});
|
});
|
||||||
this.paneItems = [];
|
this.paneItems = [];
|
||||||
|
|
||||||
|
this.splitview.dispose();
|
||||||
this.element.remove();
|
this.element.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -452,4 +452,10 @@ export class PaneviewComponent
|
|||||||
queue.forEach((f) => f());
|
queue.forEach((f) => f());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public dispose(): void {
|
||||||
|
super.dispose();
|
||||||
|
|
||||||
|
this.paneview.dispose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -155,6 +155,7 @@ export const DockviewReact = React.forwardRef(
|
|||||||
return () => {
|
return () => {
|
||||||
disposable.dispose();
|
disposable.dispose();
|
||||||
dockview.dispose();
|
dockview.dispose();
|
||||||
|
element.remove();
|
||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
@ -96,6 +96,7 @@ export const GridviewReact = React.forwardRef(
|
|||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
gridview.dispose();
|
gridview.dispose();
|
||||||
|
element.remove();
|
||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
@ -1038,12 +1038,13 @@ export class Splitview {
|
|||||||
this._onDidAddView.dispose();
|
this._onDidAddView.dispose();
|
||||||
this._onDidRemoveView.dispose();
|
this._onDidRemoveView.dispose();
|
||||||
|
|
||||||
this.element.remove();
|
|
||||||
for (let i = 0; i < this.element.children.length; i++) {
|
for (let i = 0; i < this.element.children.length; i++) {
|
||||||
if (this.element.children.item(i) === this.element) {
|
if (this.element.children.item(i) === this.element) {
|
||||||
this.element.removeChild(this.element);
|
this.element.removeChild(this.element);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.element.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -421,6 +421,8 @@ export class SplitviewComponent
|
|||||||
});
|
});
|
||||||
this.panels.clear();
|
this.panels.clear();
|
||||||
|
|
||||||
|
this.splitview.dispose();
|
||||||
|
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user