import { describe, expect, it, vi } from 'vitest'; import { installMediaPermissionHandler, isAllowedMediaPermissionCheck, isAllowedMediaPermissionRequest, } from '@electron/main/media-permissions'; function createMainWindowStub() { return { isDestroyed: vi.fn(() => false), webContents: { id: 42, session: { setPermissionCheckHandler: vi.fn(), setPermissionRequestHandler: vi.fn(), }, }, }; } describe('media permissions', () => { it('allows audio media permission requests from the main window', () => { const mainWindow = createMainWindowStub(); expect( isAllowedMediaPermissionRequest( mainWindow.webContents, 'media', { mediaTypes: ['audio'] }, mainWindow, ), ).toBe(true); }); it('denies media permission requests from other web contents', () => { const mainWindow = createMainWindowStub(); expect( isAllowedMediaPermissionRequest( { id: 7 }, 'media', { mediaTypes: ['audio'] }, mainWindow, ), ).toBe(false); }); it('allows audio media permission checks from the main window', () => { const mainWindow = createMainWindowStub(); expect( isAllowedMediaPermissionCheck( mainWindow.webContents, 'media', mainWindow, { mediaType: 'audio', isMainFrame: true }, ), ).toBe(true); }); it('denies non-media permissions', () => { const mainWindow = createMainWindowStub(); expect( isAllowedMediaPermissionRequest( mainWindow.webContents, 'notifications', { mediaTypes: ['audio'] }, mainWindow, ), ).toBe(false); }); it('installs scoped media permission handlers on the main window session', () => { const mainWindow = createMainWindowStub(); installMediaPermissionHandler(mainWindow); expect(mainWindow.webContents.session.setPermissionCheckHandler).toHaveBeenCalledTimes(1); expect(mainWindow.webContents.session.setPermissionRequestHandler).toHaveBeenCalledTimes(1); const checkHandler = mainWindow.webContents.session.setPermissionCheckHandler.mock.calls[0]?.[0]; const handler = mainWindow.webContents.session.setPermissionRequestHandler.mock.calls[0]?.[0]; const callback = vi.fn(); expect(checkHandler?.(mainWindow.webContents, 'media', '', { mediaType: 'audio', isMainFrame: true })).toBe(true); handler?.(mainWindow.webContents, 'media', callback, { mediaTypes: ['audio'] }); expect(callback).toHaveBeenCalledWith(true); }); });