From 9dcea3fe25324a199b688526286214488a4b0957 Mon Sep 17 00:00:00 2001 From: Artur Quirino Date: Sat, 11 Apr 2026 10:46:04 -0300 Subject: [PATCH 1/3] fix(super-editor): remove toolbar window listeners on unmount --- .../v1/components/toolbar/Toolbar.test.js | 51 +++++++++++++++++++ .../editors/v1/components/toolbar/Toolbar.vue | 25 +++++---- 2 files changed, 65 insertions(+), 11 deletions(-) create mode 100644 packages/super-editor/src/editors/v1/components/toolbar/Toolbar.test.js diff --git a/packages/super-editor/src/editors/v1/components/toolbar/Toolbar.test.js b/packages/super-editor/src/editors/v1/components/toolbar/Toolbar.test.js new file mode 100644 index 0000000000..532f9b1b73 --- /dev/null +++ b/packages/super-editor/src/editors/v1/components/toolbar/Toolbar.test.js @@ -0,0 +1,51 @@ +import { describe, it, expect, vi } from 'vitest'; +import { mount } from '@vue/test-utils'; +import Toolbar from './Toolbar.vue'; + +function createMockToolbar() { + return { + config: { + toolbarGroups: ['left', 'center', 'right'], + toolbarButtonsExclude: [], + }, + getToolbarItemByGroup: () => [], + getToolbarItemByName: () => null, + onToolbarResize: vi.fn(), + emitCommand: vi.fn(), + overflowItems: [], + activeEditor: null, + }; +} + +describe('Toolbar', () => { + it('removes resize and keydown listeners on unmount (not only on KeepAlive deactivate)', () => { + const mockToolbar = createMockToolbar(); + const addSpy = vi.spyOn(window, 'addEventListener'); + const removeSpy = vi.spyOn(window, 'removeEventListener'); + + const wrapper = mount(Toolbar, { + global: { + stubs: { ButtonGroup: true }, + plugins: [ + (app) => { + app.config.globalProperties.$toolbar = mockToolbar; + }, + ], + }, + }); + + const resizeHandler = addSpy.mock.calls.find((c) => c[0] === 'resize')?.[1]; + const keydownHandler = addSpy.mock.calls.find((c) => c[0] === 'keydown')?.[1]; + expect(resizeHandler).toBeTypeOf('function'); + expect(keydownHandler).toBeTypeOf('function'); + + removeSpy.mockClear(); + wrapper.unmount(); + + expect(removeSpy).toHaveBeenCalledWith('resize', resizeHandler); + expect(removeSpy).toHaveBeenCalledWith('keydown', keydownHandler); + + addSpy.mockRestore(); + removeSpy.mockRestore(); + }); +}); diff --git a/packages/super-editor/src/editors/v1/components/toolbar/Toolbar.vue b/packages/super-editor/src/editors/v1/components/toolbar/Toolbar.vue index d2a03efca6..ca08361fea 100644 --- a/packages/super-editor/src/editors/v1/components/toolbar/Toolbar.vue +++ b/packages/super-editor/src/editors/v1/components/toolbar/Toolbar.vue @@ -1,5 +1,5 @@