MediaDevices.enumerateDevices() should not trigger System permissions prompt

RESOLVED FIXED in Firefox 66

Status

defect
P1
normal
RESOLVED FIXED
Last year
5 months ago

People

(Reporter: JanH, Assigned: snorp)

Tracking

(Depends on 1 bug)

Trunk
mozilla66
All
Android
Dependency tree / graph

Firefox Tracking Flags

(geckoview64 wontfix, geckoview65 wontfix, geckoview66 wontfix, firefox64 wontfix, firefox65+ wontfix, firefox66 fixed)

Details

Attachments

(1 attachment)

When MediaDevices.enumerateDevices() is called on Android, we need to have the corresponding Android runtime permissions if we want to enumerate really *all* available devices, so if we haven't already got them, we trigger a corresponding prompt [1]. If the user didn't grant those permissions, we just go ahead and enumerate whatever devices are available even without special OS permissions.

The problem is that some websites (e.g. https://www.target.com) call MediaDevices.enumerateDevices() as soon as the page has loaded, even if it is not immediately obvious why camera/microphone access is necessary, in which case the seemingly context-less permission prompt can feel somewhat sketchy.

As far as I can tell from running [2], Chrome just takes whatever runtime permissions are already available and enumerates the devices that can be found with those permissions, but *doesn't* prompt for additional permissions, i.e. the same behaviour we'd get if we'd set "media.navigator.permission.device" to false even on Android.

Alternatively, we could try adding some sort of explanatory note to our permissions request, or ...?

[1] https://dxr.mozilla.org/mozilla-central/rev/a64a0f3c1662e8b17b1062f12243dadbce6f9032/dom/media/MediaManager.cpp#1972
[2] http://jsfiddle.net/mdhfhgef/1 - based on the code sample in https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/enumerateDevices
Although given the fact that enumerateDevices() won't return human-readable labels unless a MediaStream is already active (in which we would have prompted both for the system and the internal Firefox permission anyway) or a persistent getUserMedia() permission is available (which currently isn't implemented - bug 1027623), maybe just returning the default devices that get enumerated even without OS runtime permissions might be enough, so we could avoid the additional permission prompt just like Chrome?
Re-triaging per https://bugzilla.mozilla.org/show_bug.cgi?id=1473195

Needinfo :susheel if you think this bug should be re-triaged.
Priority: -- → P5
Duplicate of this bug: 1482324
Duplicate of this bug: 1487869
Duplicate of this bug: 1488932
Part of me wants Firefox to keep the notifications even though they are not user friendly. Enumerating the device's cameras and microphones is poor behavior on the website's/ad network's part when they have no intention of creating a webrtc application.
Duplicate of this bug: 1488932
Yet another method of browser fingerprinting, and privacy abuse.
Who has your data? Researchers scrutinize apps for ties to advertisers, analytics firms
https://www.cbc.ca/news/technology/app-privacy-policy-apptrans-uoft-third-parties-ads-code-1.4791834
Moving to GeckoView and clearing priority so we can re-triage.
Component: Audio/Video → GeckoView
Priority: P5 → --
Nick Nguyen asked that we reprioritize this bug because he has been seeing a dramatic increase in the number of media prompts in Fennec Nightly over the last 1-2 weeks.
Priority: P3 → --
What would be the fallout from blocking GUM enumerateDevices from 3rd party scripts? Nils any thoughts on how we can handle ad networks using GUM enumerateDevices without causing undo webcompat issues?
Flags: needinfo?(drno)
For what it’s worth, we have also seen frequent use of enumerateDevices by sites that never use media capture - presumably for fingerprinting. We filed a spec issue [1] and changed WebKit to have enumerateDevices only return devices that are available to getUserMedia [2]. 

[1] https://github.com/w3c/mediacapture-main/issues/549
[2] https://bugs.webkit.org/show_bug.cgi?id=191177
Andrew, we're seeing more instances of third-party scripts trying to enumerate media devices (presumably for fingerprinting). This causes Fennec to blast the user with annoying permission prompts. I think we need some DOM team input on solving this UX issue.
Flags: needinfo?(overholt)
I've started an email thread to find someone to own it and I'll get back to you.

Thanks, Eric, for the pointers in comment 12!
(In reply to Kevin Brosnan [:kbrosnan] from comment #11)
> What would be the fallout from blocking GUM enumerateDevices from 3rd party
> scripts? Nils any thoughts on how we can handle ad networks using GUM
> enumerateDevices without causing undo webcompat issues?

Comment 0 was about target.com calling this API, presumably as a first-party.  I think we should just fix the bug for real.
We had a bit of an in-person conversation just now and the thinking is that a fix here needs to be Android-specific. I think David Bolter is looking into who has time to do it.
Flags: needinfo?(overholt)
+NI jib. In passing Maire thought Jan-Ivar might know a way forward here. Please see comments, including comment 0 and comment 12.
Flags: needinfo?(jib)
Duplicate of this bug: 1493318
enumerateDevices() should never prompt. There is no accommodation for this in the spec. In bug 1493318 comment 2 I reached out to see how to handle this in the spec, and learned all the other vendors are able to enumerate devices on Android somehow without triggering any kind of prompt. We should strive for parity with that I think.

If this means we can only return a reduced set, that seems fine. Even if this means we won't be able to enumerate anything at all, an empty list or some dummy set [1] seems preferable over the current behavior.

I'd recommend a narrow Android fix here, and maybe open a separate issue on ways we might want to reduce fingerprinting further, maybe the way Safari does this (1 dummy cam + 1 dummy mic) ahead of gUM grant. Some sharp edges around deviceIds to work out.

[1] We already have code to return a dummy set when privacy.resistFingerprinting is set to true.
Flags: needinfo?(jib)
Assignee: nobody → snorp
My assumption here is we should ask for this system permission the same time we ask for camera and/or mic permission in response to the user granting gUM permission (I'm sort of hoping they're the same, but just in case). I.e. once the user has granted gUM now or in the past, I'd expect enumerateDevices() to return real devices. Maybe that goes without saying, but just TBC.
In comment 0, Jan said that Chrome seems to just be enumerating the devices that are visible through the existing runtime permissions, without asking for new permissions first...
Although to clarify, I never really checked *what kinds of devices* get returned exactly - I only ever ran that JS fiddle from comment #0 and noticed that even without the Android OS permission, *something* would still be returned. If I then granted the permission, if I remember correctly I saw those initial devices (with the same ID) again, plus some new, additional devices, and I therefore I assumed that the latter represent the real camera/microphone inputs.
I'm renaming this bug for clarity. Please object if there's remaining uncertainty about desired behavior. Based on specs and parity it's more important this method not prompt than it return anything useful in the pre-permission state IMHO.
Summary: System permissions prompt triggered by MediaDevices.enumerateDevices() can lack context → MediaDevices.enumerateDevices() should not trigger System permissions prompt
I think jib answered the question better then I could have - clearing NI
Flags: needinfo?(drno)
64=wontfix because it's too late to uplift a fix to 64 Beta before 64's December 11 release date.
Product: Firefox for Android → GeckoView
Pushed by jwillcox@mozilla.com:
https://hg.mozilla.org/integration/autoland/rev/0e9a610fe05f
Don't prompt for device permissions on Android in MediaDevices.enumerateDevices() r=achronop
Backed out changeset for turning Bug 1481028 into permafail.

Push with failures: https://treeherder.mozilla.org/#/jobs?repo=autoland&searchStr=android%2C4.3%2Capi16%2B%2Cdebug%2Ctest-android-em-4.3-arm7-api-16%2Fdebug-geckoview-junit-e10s-6%2C%28gv-junit6%29&fromchange=0e9a610fe05f5e830d4cc387b6d293e94347e3c7&tochange=858666e4b07a658477ed7f800b9deb641cc5f697&selectedJob=218876807

Failure log: https://treeherder.mozilla.org/logviewer.html#/jobs?job_id=218876807&repo=autoland&lineNumber=2063

Backout link: https://hg.mozilla.org/integration/autoland/rev/858666e4b07a658477ed7f800b9deb641cc5f697

[task 2018-12-26T22:46:45.420Z] 22:46:45     INFO -  TEST-START | org.mozilla.geckoview.test.PermissionDelegateTest.media
[task 2018-12-26T22:49:10.729Z] 22:49:10     INFO -  org.mozilla.geckoview.test | INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
[task 2018-12-26T22:49:10.729Z] 22:49:10     INFO -  org.mozilla.geckoview.test | INSTRUMENTATION_STATUS: current=37
[task 2018-12-26T22:49:10.730Z] 22:49:10     INFO -  org.mozilla.geckoview.test | INSTRUMENTATION_STATUS: class=org.mozilla.geckoview.test.PermissionDelegateTest
[task 2018-12-26T22:49:10.730Z] 22:49:10     INFO -  org.mozilla.geckoview.test | INSTRUMENTATION_STATUS: stream=
[task 2018-12-26T22:49:10.730Z] 22:49:10     INFO -  org.mozilla.geckoview.test | Error in media(org.mozilla.geckoview.test.PermissionDelegateTest):
[task 2018-12-26T22:49:10.730Z] 22:49:10     INFO -  org.mozilla.geckoview.test | java.lang.AssertionError: onAndroidPermissionsRequest should be called specified number of times
[task 2018-12-26T22:49:10.731Z] 22:49:10     INFO -  org.mozilla.geckoview.test | Expected: <1>
[task 2018-12-26T22:49:10.731Z] 22:49:10     INFO -  org.mozilla.geckoview.test |      but: was <0>
[task 2018-12-26T22:49:10.732Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
[task 2018-12-26T22:49:10.733Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.junit.Assert.assertThat(Assert.java:956)
[task 2018-12-26T22:49:10.734Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.junit.rules.ErrorCollector$1.call(ErrorCollector.java:65)
[task 2018-12-26T22:49:10.734Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.junit.rules.ErrorCollector.checkSucceeds(ErrorCollector.java:78)
[task 2018-12-26T22:49:10.735Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.junit.rules.ErrorCollector.checkThat(ErrorCollector.java:63)
[task 2018-12-26T22:49:10.736Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.mozilla.geckoview.test.rule.GeckoSessionTestRule.checkThat(GeckoSessionTestRule.java:880)
[task 2018-12-26T22:49:10.736Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.mozilla.geckoview.test.rule.GeckoSessionTestRule.assertMatchesCount(GeckoSessionTestRule.java:914)
[task 2018-12-26T22:49:10.736Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.mozilla.geckoview.test.rule.GeckoSessionTestRule.access$200(GeckoSessionTestRule.java:82)
[task 2018-12-26T22:49:10.737Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.mozilla.geckoview.test.rule.GeckoSessionTestRule$CallbackDelegates.clearAndAssert(GeckoSessionTestRule.java:743)
[task 2018-12-26T22:49:10.737Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.mozilla.geckoview.test.rule.GeckoSessionTestRule.afterWait(GeckoSessionTestRule.java:1669)
[task 2018-12-26T22:49:10.738Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.mozilla.geckoview.test.rule.GeckoSessionTestRule.waitForJS(GeckoSessionTestRule.java:2042)
[task 2018-12-26T22:49:10.738Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.mozilla.geckoview.test.BaseSessionTest.waitForJS(BaseSessionTest.kt:134)
[task 2018-12-26T22:49:10.739Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.mozilla.geckoview.test.PermissionDelegateTest.media(PermissionDelegateTest.kt:66)
[task 2018-12-26T22:49:10.739Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at java.lang.reflect.Method.invokeNative(Native Method)
[task 2018-12-26T22:49:10.739Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at java.lang.reflect.Method.invoke(Method.java:525)
[task 2018-12-26T22:49:10.740Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
[task 2018-12-26T22:49:10.740Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
[task 2018-12-26T22:49:10.741Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
[task 2018-12-26T22:49:10.741Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
[task 2018-12-26T22:49:10.742Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.mozilla.geckoview.test.rule.GeckoSessionTestRule$3$1.run(GeckoSessionTestRule.java:1384)
[task 2018-12-26T22:49:10.742Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at android.app.Instrumentation$SyncRunnable.run(Instrumentation.java:1719)
[task 2018-12-26T22:49:10.743Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at android.os.Handler.handleCallback(Handler.java:730)
[task 2018-12-26T22:49:10.743Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at android.os.Handler.dispatchMessage(Handler.java:92)
[task 2018-12-26T22:49:10.743Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at android.os.Looper.loop(Looper.java:137)
[task 2018-12-26T22:49:10.744Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at android.app.ActivityThread.main(ActivityThread.java:5103)
[task 2018-12-26T22:49:10.744Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at java.lang.reflect.Method.invokeNative(Native Method)
[task 2018-12-26T22:49:10.745Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at java.lang.reflect.Method.invoke(Method.java:525)
[task 2018-12-26T22:49:10.745Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
[task 2018-12-26T22:49:10.746Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
[task 2018-12-26T22:49:10.747Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at dalvik.system.NativeStart.main(Native Method)
[task 2018-12-26T22:49:10.747Z] 22:49:10     INFO -  org.mozilla.geckoview.test |
[task 2018-12-26T22:49:10.747Z] 22:49:10     INFO -  org.mozilla.geckoview.test | INSTRUMENTATION_STATUS: numtests=64
[task 2018-12-26T22:49:10.748Z] 22:49:10     INFO -  org.mozilla.geckoview.test | INSTRUMENTATION_STATUS: stack=java.lang.AssertionError: onAndroidPermissionsRequest should be called specified number of times
[task 2018-12-26T22:49:10.748Z] 22:49:10     INFO -  org.mozilla.geckoview.test | Expected: <1>
[task 2018-12-26T22:49:10.749Z] 22:49:10     INFO -  org.mozilla.geckoview.test |      but: was <0>
[task 2018-12-26T22:49:10.749Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
[task 2018-12-26T22:49:10.750Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.junit.Assert.assertThat(Assert.java:956)
[task 2018-12-26T22:49:10.750Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.junit.rules.ErrorCollector$1.call(ErrorCollector.java:65)
[task 2018-12-26T22:49:10.751Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.junit.rules.ErrorCollector.checkSucceeds(ErrorCollector.java:78)
[task 2018-12-26T22:49:10.751Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.junit.rules.ErrorCollector.checkThat(ErrorCollector.java:63)
[task 2018-12-26T22:49:10.752Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.mozilla.geckoview.test.rule.GeckoSessionTestRule.checkThat(GeckoSessionTestRule.java:880)
[task 2018-12-26T22:49:10.752Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.mozilla.geckoview.test.rule.GeckoSessionTestRule.assertMatchesCount(GeckoSessionTestRule.java:914)
[task 2018-12-26T22:49:10.753Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.mozilla.geckoview.test.rule.GeckoSessionTestRule.access$200(GeckoSessionTestRule.java:82)
[task 2018-12-26T22:49:10.754Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.mozilla.geckoview.test.rule.GeckoSessionTestRule$CallbackDelegates.clearAndAssert(GeckoSessionTestRule.java:743)
[task 2018-12-26T22:49:10.755Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.mozilla.geckoview.test.rule.GeckoSessionTestRule.afterWait(GeckoSessionTestRule.java:1669)
[task 2018-12-26T22:49:10.755Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.mozilla.geckoview.test.rule.GeckoSessionTestRule.waitForJS(GeckoSessionTestRule.java:2042)
[task 2018-12-26T22:49:10.755Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.mozilla.geckoview.test.BaseSessionTest.waitForJS(BaseSessionTest.kt:134)
[task 2018-12-26T22:49:10.756Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.mozilla.geckoview.test.PermissionDelegateTest.media(PermissionDelegateTest.kt:66)
[task 2018-12-26T22:49:10.757Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at java.lang.reflect.Method.invokeNative(Native Method)
[task 2018-12-26T22:49:10.757Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at java.lang.reflect.Method.invoke(Method.java:525)
[task 2018-12-26T22:49:10.758Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
[task 2018-12-26T22:49:10.759Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
[task 2018-12-26T22:49:10.759Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
[task 2018-12-26T22:49:10.760Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
[task 2018-12-26T22:49:10.760Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at org.mozilla.geckoview.test.rule.GeckoSessionTestRule$3$1.run(GeckoSessionTestRule.java:1384)
[task 2018-12-26T22:49:10.761Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at android.app.Instrumentation$SyncRunnable.run(Instrumentation.java:1719)
[task 2018-12-26T22:49:10.761Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at android.os.Handler.handleCallback(Handler.java:730)
[task 2018-12-26T22:49:10.762Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at android.os.Handler.dispatchMessage(Handler.java:92)
[task 2018-12-26T22:49:10.762Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at android.os.Looper.loop(Looper.java:137)
[task 2018-12-26T22:49:10.763Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at android.app.ActivityThread.main(ActivityThread.java:5103)
[task 2018-12-26T22:49:10.764Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at java.lang.reflect.Method.invokeNative(Native Method)
[task 2018-12-26T22:49:10.764Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at java.lang.reflect.Method.invoke(Method.java:525)
[task 2018-12-26T22:49:10.765Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
[task 2018-12-26T22:49:10.765Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
[task 2018-12-26T22:49:10.765Z] 22:49:10     INFO -  org.mozilla.geckoview.test | 	at dalvik.system.NativeStart.main(Native Method)
[task 2018-12-26T22:49:10.766Z] 22:49:10     INFO -  org.mozilla.geckoview.test |
[task 2018-12-26T22:49:10.766Z] 22:49:10     INFO -  org.mozilla.geckoview.test | INSTRUMENTATION_STATUS: test=media
[task 2018-12-26T22:49:10.767Z] 22:49:10     INFO -  org.mozilla.geckoview.test | INSTRUMENTATION_STATUS_CODE: -2
[task 2018-12-26T22:49:10.767Z] 22:49:10  WARNING -  TEST-UNEXPECTED-FAIL | org.mozilla.geckoview.test.PermissionDelegateTest.media | status -2
[task 2018-12-26T22:49:10.768Z] 22:49:10     INFO -  TEST-INFO took 145325ms
[task 2018-12-26T22:49:10.768Z] 22:49:10     INFO -  org.mozilla.geckoview.test | INSTRUMENTATION_STATUS: id=AndroidJUnitRunner
[task 2018-12-26T22:49:10.769Z] 22:49:10     INFO -  org.mozilla.geckoview.test | INSTRUMENTATION_STATUS: current=38
[task 2018-12-26T22:49:10.770Z] 22:49:10     INFO -  org.mozilla.geckoview.test | INSTRUMENTATION_STATUS: class=org.mozilla.geckoview.test.ProgressDelegateTest
[task 2018-12-26T22:49:10.770Z] 22:49:10     INFO -  org.mozilla.geckoview.test | INSTRUMENTATION_STATUS: stream=
[task 2018-12-26T22:49:10.771Z] 22:49:10     INFO -  org.mozilla.geckoview.test | org.mozilla.geckoview.test.ProgressDelegateTest:
[task 2018-12-26T22:49:10.771Z] 22:49:10     INFO -  org.mozilla.geckoview.test | INSTRUMENTATION_STATUS: numtests=64
[task 2018-12-26T22:49:10.772Z] 22:49:10     INFO -  org.mozilla.geckoview.test | INSTRUMENTATION_STATUS: test=noSecurityInfoForExpiredTLS
[task 2018-12-26T22:49:10.772Z] 22:49:10     INFO -  org.mozilla.geckoview.test | INSTRUMENTATION_STATUS_CODE: 1
Flags: needinfo?(snorp)
Flags: needinfo?(snorp)
Pushed by jwillcox@mozilla.com:
https://hg.mozilla.org/integration/autoland/rev/b0471cb7631f
Don't prompt for device permissions on Android in MediaDevices.enumerateDevices() r=achronop
https://hg.mozilla.org/mozilla-central/rev/b0471cb7631f
Status: NEW → RESOLVED
Closed: 7 months ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla66
Please request Beta approval on this when you get a chance.
Flags: needinfo?(snorp)
Comment on attachment 9031476 [details]
Bug 1450762 - Don't prompt for device permissions on Android in MediaDevices.enumerateDevices() r?achronop

[Beta/Release Uplift Approval Request]

Feature/Bug causing the regression: N/A

User impact if declined: Annoying prompts for camera/mic access due to fingerprinting attempts

Is this code covered by automated tests?: Yes

Has the fix been verified in Nightly?: Yes

Needs manual test from QE?: No

If yes, steps to reproduce: 

List of other uplifts needed: None

Risk to taking this patch: Low

Why is the change risky/not risky? (and alternatives if risky): Fairy straightforward, has tests.

String changes made/needed: None
Flags: needinfo?(snorp)
Attachment #9031476 - Flags: approval-mozilla-beta?
This patch needs rebasing for Beta :\
Flags: needinfo?(snorp)
It looks like the clang reformatting hosed us. Ugh. Maybe just let it ride?
Flags: needinfo?(snorp)
That landed before 65 went to Beta (was done at the end of the Nightly cycle specifically to avoid uplift pain).
Comment on attachment 9031476 [details]
Bug 1450762 - Don't prompt for device permissions on Android in MediaDevices.enumerateDevices() r?achronop

If nobody wants to do the rebase, doesn't sound like there's much choice in the matter.
Attachment #9031476 - Flags: approval-mozilla-beta? → approval-mozilla-beta-
Duplicate of this bug: 1528984
You need to log in before you can comment on or make changes to this bug.