Align fullscreen return button with project actions

This commit is contained in:
鲨鱼辣椒 committed 2026-09-30 00:58:46 +08:00
1 parent 80b0cb99a8
commit 343f88ce59
9 files changed
+203 -7

No files matched your search

+71 -2
View File
@@ -9,7 +9,7 @@ function createWindow(id: number) {
isDestroyed: vi.fn(() => false),
send: vi.fn(),
});
return {
return Object.assign(new EventEmitter(), {
id,
webContents: contents,
isDestroyed: vi.fn(() => false),
@@ -17,8 +17,9 @@ function createWindow(id: number) {
maximize: vi.fn(),
unmaximize: vi.fn(),
isMaximized: vi.fn(() => false),
isFullScreen: vi.fn(() => false),
close: vi.fn(),
};
});
}
async function setup() {
@@ -104,6 +105,74 @@ describe('IPC after closing and reopening the main window', () => {
expect(ctx.second.webContents.listenerCount('destroyed')).toBe(1);
});
it('queries fullscreen for the requesting window before and after reopening', async () => {
const ctx = await setup();
ctx.first.isFullScreen.mockReturnValue(true);
expect(ctx.invoke('window:isFullScreen', ctx.first)).toBe(true);
expect(ctx.invoke('window:isFullScreen', ctx.second)).toBe(false);
ctx.reopen();
expect(ctx.invoke('window:isFullScreen', ctx.second)).toBe(false);
ctx.second.isFullScreen.mockReturnValue(true);
expect(ctx.invoke('window:isFullScreen', ctx.second)).toBe(true);
expect(() => ctx.invoke('window:isFullScreen', ctx.first)).toThrow('Main window is unavailable');
});
it('notifies each bound renderer once when its window enters or leaves fullscreen', async () => {
const ctx = await setup();
ctx.bindings.bindWindow(ctx.first as unknown as BrowserWindow);
expect(ctx.first.listenerCount('enter-full-screen')).toBe(1);
expect(ctx.first.listenerCount('leave-full-screen')).toBe(1);
ctx.first.emit('enter-full-screen');
ctx.first.emit('leave-full-screen');
expect(ctx.first.webContents.send.mock.calls).toEqual([
['window:fullscreen-changed', true],
['window:fullscreen-changed', false],
]);
expect(ctx.second.webContents.send).not.toHaveBeenCalled();
const registeredCount = ctx.handle.mock.calls.length;
ctx.reopen();
ctx.bindings.bindWindow(ctx.second as unknown as BrowserWindow);
expect(ctx.second.listenerCount('enter-full-screen')).toBe(1);
expect(ctx.second.listenerCount('leave-full-screen')).toBe(1);
ctx.second.emit('enter-full-screen');
ctx.second.emit('leave-full-screen');
expect(ctx.second.webContents.send.mock.calls).toEqual([
['window:fullscreen-changed', true],
['window:fullscreen-changed', false],
]);
expect(ctx.first.webContents.send).toHaveBeenCalledTimes(2);
expect(ctx.handle).toHaveBeenCalledTimes(registeredCount);
});
it('does not send fullscreen events after a window or renderer is destroyed', async () => {
const ctx = await setup();
ctx.reopen();
ctx.first.emit('enter-full-screen');
ctx.first.emit('leave-full-screen');
expect(ctx.first.webContents.send).not.toHaveBeenCalled();
ctx.second.webContents.isDestroyed.mockReturnValue(true);
ctx.second.emit('enter-full-screen');
ctx.second.emit('leave-full-screen');
expect(ctx.second.webContents.send).not.toHaveBeenCalled();
});
it('does not bind fullscreen events to an already destroyed window or renderer', async () => {
const ctx = await setup();
const closed = createWindow(3);
closed.isDestroyed.mockReturnValue(true);
ctx.bindings.bindWindow(closed as unknown as BrowserWindow);
expect(closed.listenerCount('enter-full-screen')).toBe(0);
expect(closed.listenerCount('leave-full-screen')).toBe(0);
ctx.second.webContents.isDestroyed.mockReturnValue(true);
ctx.bindings.bindWindow(ctx.second as unknown as BrowserWindow);
expect(ctx.second.listenerCount('enter-full-screen')).toBe(0);
expect(ctx.second.listenerCount('leave-full-screen')).toBe(0);
});
it('parents dialogs and link menus to the reopened renderer', async () => {
const ctx = await setup();
ctx.reopen();