Repro tool for the Windows OS camera prompt issue tracked in
OPS-7378
(camera prompt on signing into claude.ai / linkedin.com / youtube.com). The
content-scope-scripts deviceEnumerationFix only intercepts
MediaDevices.enumerateDevices(); this page also exercises every adjacent API
(getUserMedia, permissions.query, RTCPeerConnection,
getDisplayMedia, iframe contexts) so a tester can isolate exactly which call still
triggers the OS prompt on a build under test.
How to use it. On a fresh Windows install where camera permission has never been granted or denied for the DuckDuckGo app, run each technique one at a time, watch for the native OS camera prompt, and use the "OS prompt?" dropdown next to each row to record what you observed. When done, hit Download results to export a JSON record.
Note: the B group calls getUserMedia directly and so will legitimately surface a camera/mic prompt on any browser. The question for this repro is whether
those calls surface the native Windows OS prompt in addition to or instead of the
in-app permission UI.
LinkedIn + Passkeys repro (F1). On linkedin.com the OS camera prompt was traced to
enumerateDevices() starting while a Passkeys WebAuthn dialog was open; the
deviceEnumerationFix shim timed out after 2s and called the real API. Technique
F1 reproduces that sequence — Passkeys / Windows Hello must be enabled
on the test machine or the WebAuthn prompt will not appear and the repro will not match production.
For the cross-origin third-party iframe scenario (the actual shape protechts.net /
HUMAN Security takes on linkedin.com — top-level page in one origin, fingerprinting iframe in
another with allow="camera; microphone"), use the existing
Iframe Media Prompt Repro page. The
E group below covers same-origin iframe variants only.
Wraps MediaDevices.prototype.enumerateDevices,
getUserMedia, getDisplayMedia and
Permissions.prototype.query with a counter + stack
logger that sits above the C-S-S
deviceEnumerationFix proxy, so you can see every entry.
Use Copy DevTools snippet to paste the same
instrumentation into another site's DevTools (e.g.
linkedin.com/checkpoint/...) to observe what protechts /
reCAPTCHA / first-party scripts actually call.
https://www.linkedin.com/) in the Windows
DDG browser. For the OPS-7378 repro, temporarily disable
the protechts.net request-blocklist rule so
the checkpoint flow actually loads.chaos instrumentation
installed banner.
Important: the snippet does not survive a
page refresh — refresh creates a fresh
window / MediaDevices.prototype and
the wrappers are gone. Re-paste the snippet after every
refresh. To catch calls that fire during page load
(which is when most fingerprinting probes run), use the
pause-on-first-statement trick in the next section.
Anti-bot scripts typically fire their probes within the first few hundred ms of page load — before you can paste the snippet manually. To guarantee the wrappers are in place before any page JavaScript runs:
Navigate to / interact with the page as a tester would.
For the camera-prompt repro on LinkedIn, simply landing
on the checkpoint flow is usually enough.
The Console will stream [chaos] <API> <args>
<count> debug lines as each wrapped API is
called.
window.__chaosInstrumentation.summary()
// { counts: { 'MediaDevices.enumerateDevices': 7, ... }, logCount: 7 }
Watch the call rate, not just the count. A normal
page calls enumerateDevices a handful of times
at most; an anti-bot fingerprinter calling it hundreds of
times in a few seconds is the queue-stampede pattern that
DaveV's A11 / A12 simulates.
MediaDevices.enumerateDevices count
climbs into the hundreds within a few seconds.
Likely the queue-stampede pattern. Under the C-S-S
deviceEnumerationFix proxy this will start
timing out (2000ms) and falling through to the real
enumerateDevices() — which is what
triggers the OS prompt on Windows MSIX.
MediaDevices.getUserMedia
without a user gesture. Almost always an
anti-bot probe. Check the stack — if it points
into client.protechts.net/.../main.min.js
or www.gstatic.com/recaptcha/... that is
your prompt trigger. The Asana investigation pointed
here as the primary cause on linkedin.com.
Permissions.query({name: 'camera'})
or 'microphone'. Informational;
does not prompt on a normal browser. Still worth
recording — if you see the count climb but no
getUserMedia calls, the trigger may be
elsewhere (or in a native-side path).
protechts.net,
li.protechts.net,
recaptcha/enterprise,
static.licdn.com/aero-v1.
These are the candidate origins identified by the HAR
analysis. Stacks pointing into LinkedIn's own
aero-v1 bundles are usually fine (gated
behind user gestures); stacks pointing into protechts
or recaptcha are the suspect entries.
collector-pxdojv695v.protechts.net POST,
it is almost certainly from the protechts VM.
window.__chaosInstrumentation.download() // saves full log + stacks as JSON window.__chaosInstrumentation.uninstall() // restore originals
Attach the downloaded JSON to OPS-7378 along with the exact browser version and whether the OS prompt appeared.
li.protechts.net/index.html). The
snippet wraps only the top-level MediaDevices
and Permissions prototypes. Calls from
inside li.protechts.net happen in the
iframe's own realm and are not visible to the top
window. To observe those, paste the snippet into the
iframe's own DevTools context (DevTools →
iframe selector dropdown → pick the iframe), or
use the
Iframe Media
Prompt Repro page which controls both sides.