fix: video and audio capture should be separate (#42809)
Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com> Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
This commit is contained in:
parent
342ef8e7e1
commit
e36d79706e
2 changed files with 39 additions and 5 deletions
|
@ -282,10 +282,10 @@ bool WebContentsPermissionHelper::CheckMediaAccessPermission(
|
||||||
base::Value::Dict details;
|
base::Value::Dict details;
|
||||||
details.Set("securityOrigin", security_origin.GetURL().spec());
|
details.Set("securityOrigin", security_origin.GetURL().spec());
|
||||||
details.Set("mediaType", MediaStreamTypeToString(type));
|
details.Set("mediaType", MediaStreamTypeToString(type));
|
||||||
// The permission type doesn't matter here, AUDIO_CAPTURE/VIDEO_CAPTURE
|
auto blink_type = type == blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE
|
||||||
// are presented as same type in content_converter.h.
|
? blink::PermissionType::AUDIO_CAPTURE
|
||||||
return CheckPermission(blink::PermissionType::AUDIO_CAPTURE,
|
: blink::PermissionType::VIDEO_CAPTURE;
|
||||||
std::move(details));
|
return CheckPermission(blink_type, std::move(details));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WebContentsPermissionHelper::CheckSerialAccessPermission(
|
bool WebContentsPermissionHelper::CheckSerialAccessPermission(
|
||||||
|
|
|
@ -1765,7 +1765,7 @@ describe('chromium features', () => {
|
||||||
expect(labels.some((l: any) => l)).to.be.true();
|
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);
|
session.defaultSession.setPermissionCheckHandler(() => false);
|
||||||
const w = new BrowserWindow({ show: false });
|
const w = new BrowserWindow({ show: false });
|
||||||
w.loadFile(path.join(fixturesPath, 'pages', 'blank.html'));
|
w.loadFile(path.join(fixturesPath, 'pages', 'blank.html'));
|
||||||
|
@ -1773,6 +1773,40 @@ describe('chromium features', () => {
|
||||||
expect(labels.some((l: any) => l)).to.be.false();
|
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 () => {
|
it('returns the same device ids across reloads', async () => {
|
||||||
const ses = session.fromPartition('persist:media-device-id');
|
const ses = session.fromPartition('persist:media-device-id');
|
||||||
const w = new BrowserWindow({
|
const w = new BrowserWindow({
|
||||||
|
|
Loading…
Reference in a new issue