91 lines
2.5 KiB
TypeScript
91 lines
2.5 KiB
TypeScript
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);
|
|
});
|
|
});
|