fix: video and audio capture should be separate (#42775)

This commit is contained in:
Shelley Vohr 2024-07-08 10:11:40 +02:00 коммит произвёл GitHub
Родитель ac074a5548
Коммит 2f4a46f47a
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
2 изменённых файлов: 39 добавлений и 5 удалений

Просмотреть файл

@ -282,10 +282,10 @@ bool WebContentsPermissionHelper::CheckMediaAccessPermission(
base::Value::Dict details;
details.Set("securityOrigin", security_origin.GetURL().spec());
details.Set("mediaType", MediaStreamTypeToString(type));
// The permission type doesn't matter here, AUDIO_CAPTURE/VIDEO_CAPTURE
// are presented as same type in content_converter.h.
return CheckPermission(blink::PermissionType::AUDIO_CAPTURE,
std::move(details));
auto blink_type = type == blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE
? blink::PermissionType::AUDIO_CAPTURE
: blink::PermissionType::VIDEO_CAPTURE;
return CheckPermission(blink_type, std::move(details));
}
bool WebContentsPermissionHelper::CheckSerialAccessPermission(

Просмотреть файл

@ -1770,7 +1770,7 @@ describe('chromium features', () => {
expect(labels.some((l: any) => l)).to.be.true();
});
it('does not return labels of enumerated devices when permission denied', async () => {
it('does not return labels of enumerated devices when all permission denied', async () => {
session.defaultSession.setPermissionCheckHandler(() => false);
const w = new BrowserWindow({ show: false });
w.loadFile(path.join(fixturesPath, 'pages', 'blank.html'));
@ -1778,6 +1778,40 @@ describe('chromium features', () => {
expect(labels.some((l: any) => l)).to.be.false();
});
it('does not return labels of enumerated audio devices when permission denied', async () => {
session.defaultSession.setPermissionCheckHandler((wc, permission, origin, { mediaType }) => {
return permission !== 'media' || mediaType !== 'audio';
});
const w = new BrowserWindow({ show: false });
w.loadFile(path.join(fixturesPath, 'pages', 'blank.html'));
const devices = await w.webContents.executeJavaScript(
`navigator.mediaDevices.enumerateDevices().then(ds => ds.map(d => {
return ({ label: d.label, kind: d.kind })
}));
`);
const audioDevices = devices.filter((d: any) => d.kind === 'audioinput');
expect(audioDevices.some((d: any) => d.label)).to.be.false();
const videoDevices = devices.filter((d: any) => d.kind === 'videoinput');
expect(videoDevices.some((d: any) => d.label)).to.be.true();
});
it('does not return labels of enumerated video devices when permission denied', async () => {
session.defaultSession.setPermissionCheckHandler((wc, permission, origin, { mediaType }) => {
return permission !== 'media' || mediaType !== 'video';
});
const w = new BrowserWindow({ show: false });
w.loadFile(path.join(fixturesPath, 'pages', 'blank.html'));
const devices = await w.webContents.executeJavaScript(
`navigator.mediaDevices.enumerateDevices().then(ds => ds.map(d => {
return ({ label: d.label, kind: d.kind })
}));
`);
const audioDevices = devices.filter((d: any) => d.kind === 'audioinput');
expect(audioDevices.some((d: any) => d.label)).to.be.true();
const videoDevices = devices.filter((d: any) => d.kind === 'videoinput');
expect(videoDevices.some((d: any) => d.label)).to.be.false();
});
it('returns the same device ids across reloads', async () => {
const ses = session.fromPartition('persist:media-device-id');
const w = new BrowserWindow({