Bug 1450762 - Don't prompt for device permissions on Android in MediaDevices.enumerateDevices() r=achronop

Differential Revision: https://phabricator.services.mozilla.com/D14575

--HG--
extra : moz-landing-system : lando
This commit is contained in:
James Willcox 2019-01-02 16:44:35 +00:00
Родитель 5eccb3a447
Коммит d72a96de1f
3 изменённых файлов: 13 добавлений и 25 удалений

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

@ -1772,7 +1772,7 @@ RefPtr<MediaManager::MgrPromise> MediaManager::EnumerateRawDevices(
uint64_t aWindowId, MediaSourceEnum aVideoInputType,
MediaSourceEnum aAudioInputType, MediaSinkEnum aAudioOutputType,
DeviceEnumerationType aVideoInputEnumType,
DeviceEnumerationType aAudioInputEnumType,
DeviceEnumerationType aAudioInputEnumType, bool aForceNoPermRequest,
const RefPtr<MediaDeviceSetRefCnt>& aOutDevices) {
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aVideoInputType != MediaSourceEnum::Other ||
@ -1879,7 +1879,7 @@ RefPtr<MediaManager::MgrPromise> MediaManager::EnumerateRawDevices(
holder->Resolve(false, __func__);
});
if (realDeviceRequested &&
if (realDeviceRequested && aForceNoPermRequest &&
Preferences::GetBool("media.navigator.permission.device", false)) {
// Need to ask permission to retrieve list of all devices;
// notify frontend observer and wait for callback notification to post task.
@ -2198,7 +2198,7 @@ void MediaManager::OnDeviceChange() {
self->EnumerateRawDevices(
0, MediaSourceEnum::Camera, MediaSourceEnum::Microphone,
MediaSinkEnum::Speaker, DeviceEnumerationType::Normal,
DeviceEnumerationType::Normal, devices)
DeviceEnumerationType::Normal, false, devices)
->Then(GetCurrentThreadSerialEventTarget(), __func__,
[self, devices](bool) {
if (!MediaManager::GetIfExists()) {
@ -2741,7 +2741,7 @@ RefPtr<MediaManager::StreamPromise> MediaManager::GetUserMedia(
auto devices = MakeRefPtr<MediaDeviceSetRefCnt>();
return EnumerateDevicesImpl(windowID, videoType, audioType,
MediaSinkEnum::Other, videoEnumerationType,
audioEnumerationType, devices)
audioEnumerationType, true, devices)
->Then(
GetCurrentThreadSerialEventTarget(), __func__,
[self, windowID, c, windowListener, isChrome, devices](bool) {
@ -3059,7 +3059,7 @@ RefPtr<MediaManager::MgrPromise> MediaManager::EnumerateDevicesImpl(
uint64_t aWindowId, MediaSourceEnum aVideoInputType,
MediaSourceEnum aAudioInputType, MediaSinkEnum aAudioOutputType,
DeviceEnumerationType aVideoInputEnumType,
DeviceEnumerationType aAudioInputEnumType,
DeviceEnumerationType aAudioInputEnumType, bool aForceNoPermRequest,
const RefPtr<MediaDeviceSetRefCnt>& aOutDevices) {
MOZ_ASSERT(NS_IsMainThread());
@ -3101,8 +3101,8 @@ RefPtr<MediaManager::MgrPromise> MediaManager::EnumerateDevicesImpl(
->Then(
GetMainThreadSerialEventTarget(), __func__,
[aWindowId, aVideoInputType, aAudioInputType, aAudioOutputType,
aVideoInputEnumType, aAudioInputEnumType, aOutDevices,
originKey](const nsCString& aOriginKey) {
aVideoInputEnumType, aAudioInputEnumType, aForceNoPermRequest,
aOutDevices, originKey](const nsCString& aOriginKey) {
MOZ_ASSERT(NS_IsMainThread());
originKey->Assign(aOriginKey);
MediaManager* mgr = MediaManager::GetIfExists();
@ -3114,7 +3114,8 @@ RefPtr<MediaManager::MgrPromise> MediaManager::EnumerateDevicesImpl(
}
return mgr->EnumerateRawDevices(
aWindowId, aVideoInputType, aAudioInputType, aAudioOutputType,
aVideoInputEnumType, aAudioInputEnumType, aOutDevices);
aVideoInputEnumType, aAudioInputEnumType, aForceNoPermRequest,
aOutDevices);
},
[](nsresult rs) {
NS_WARNING(
@ -3232,7 +3233,7 @@ RefPtr<MediaManager::DevicesPromise> MediaManager::EnumerateDevices(
auto devices = MakeRefPtr<MediaDeviceSetRefCnt>();
return EnumerateDevicesImpl(windowId, MediaSourceEnum::Camera,
MediaSourceEnum::Microphone, audioOutputType,
videoEnumerationType, audioEnumerationType,
videoEnumerationType, audioEnumerationType, false,
devices)
->Then(GetCurrentThreadSerialEventTarget(), __func__,
[windowListener, sourceListener, devices](bool) {
@ -3281,7 +3282,7 @@ RefPtr<SinkInfoPromise> MediaManager::GetSinkDevice(nsPIDOMWindowInner* aWindow,
return EnumerateDevicesImpl(aWindow->WindowID(), MediaSourceEnum::Other,
MediaSourceEnum::Other, MediaSinkEnum::Speaker,
DeviceEnumerationType::Normal,
DeviceEnumerationType::Normal, devices)
DeviceEnumerationType::Normal, true, devices)
->Then(GetCurrentThreadSerialEventTarget(), __func__,
[aDeviceId, isSecure, devices](bool) {
for (RefPtr<MediaDevice>& device : *devices) {

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

@ -291,14 +291,14 @@ class MediaManager final : public nsIMediaManagerService,
uint64_t aWindowId, dom::MediaSourceEnum aVideoInputType,
dom::MediaSourceEnum aAudioInputType, MediaSinkEnum aAudioOutputType,
DeviceEnumerationType aVideoInputEnumType,
DeviceEnumerationType aAudioInputEnumType,
DeviceEnumerationType aAudioInputEnumType, bool aForceNoPermRequest,
const RefPtr<MediaDeviceSetRefCnt>& aOutDevices);
RefPtr<MgrPromise> EnumerateDevicesImpl(
uint64_t aWindowId, dom::MediaSourceEnum aVideoInputType,
dom::MediaSourceEnum aAudioInputType, MediaSinkEnum aAudioOutputType,
DeviceEnumerationType aVideoInputEnumType,
DeviceEnumerationType aAudioInputEnumType,
DeviceEnumerationType aAudioInputEnumType, bool aForceNoPermRequest,
const RefPtr<MediaDeviceSetRefCnt>& aOutDevices);
RefPtr<BadConstraintsPromise> SelectSettings(

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

@ -50,19 +50,6 @@ class PermissionDelegateTest : BaseSessionTest() {
mainSession.loadTestPath(HELLO_HTML_PATH)
mainSession.waitForPageStop()
mainSession.delegateDuringNextWait(object : Callbacks.PermissionDelegate {
@AssertCalled(count = 1)
override fun onAndroidPermissionsRequest(
session: GeckoSession, permissions: Array<out String>?,
callback: GeckoSession.PermissionDelegate.Callback) {
assertThat("Permissions list should be correct",
listOf(*permissions!!), hasItems(Manifest.permission.CAMERA,
Manifest.permission.RECORD_AUDIO))
callback.grant()
}
})
val devices = mainSession.waitForJS(
"window.navigator.mediaDevices.enumerateDevices()")