diff --git a/shell/browser/web_contents_permission_helper.cc b/shell/browser/web_contents_permission_helper.cc index 2a9c4d347dba..f80f9fb23934 100644 --- a/shell/browser/web_contents_permission_helper.cc +++ b/shell/browser/web_contents_permission_helper.cc @@ -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( diff --git a/spec/chromium-spec.ts b/spec/chromium-spec.ts index fec12270c264..224540678d12 100644 --- a/spec/chromium-spec.ts +++ b/spec/chromium-spec.ts @@ -1765,7 +1765,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')); @@ -1773,6 +1773,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({