# 0002: fedora firefox cannot share camera **Status:** open (diagnosis pinned; awaiting user-side action + retest with new telemetry) **Priority:** High (feature unavailable) **Surface:** fedora firefox — speaker / host attempting to publish camera **First seen:** 2026-06-06 **Reporter:** fox (blanka identity) ## Symptom Click "share camera" on fedora firefox → instant `pub.camera: off → acquiring → off [FAILED]` cycle. Chrome on the same machine shares camera fine. Mic publish works (so general WebRTC + permission grants are not all broken). ## Telemetry Every attempt in `/var/log/zebra-spaces-signal.log` produces the same verbatim error: ``` click: btn-camera-share pub.camera: off → acquiring [START] camera open cancelled: The request is not allowed by the user agent or the platform in the current context. pub.camera: acquiring → off [FAILED] ``` Captured pre-deploy of the Jun 6 telemetry improvement (no `e.name`, no `constraints:` suffix). Next attempt on the live page will surface both, but the error text is already definitive. Session fingerprint (latest): ``` session: ua=firefox/desktop ctx={sr=48000 baseLat=0.0000 sinkSupp=0 sink=n/a} devs={out=1 in=2 cam=1} picked={mic=dmV7HOOY cam= spk=+tR1ptfV} ``` - `picked.cam=` is **empty** → no saved cameraDeviceId. Not the OverconstrainedError + stale-id case my Jun 6 auto-recovery handles. - `devs.cam=1` → firefox enumerates one camera. Hardware is there. - Error fires within the SAME SECOND as the click → **no permission prompt is being shown**. ## Diagnosis Firefox's error text "The request is not allowed by the user agent or the platform in the current context" maps to **`NotAllowedError`**. On a fresh request, Firefox shows a permission prompt. The instant-fail signature means Firefox has a **remembered "Block"** for the origin (`www.unturf.com`) on camera — most likely the user (or a previous version of the page) dismissed the prompt with "Block" + "Remember this decision," and Firefox auto-denies forever after. Mic permission is independent and was granted separately, which is why audio publish works. This is NOT a code defect — the page's `getUserMedia` call is correct and chrome accepts the identical call. But the page can still help the user recover. ## Path forward Two prongs: ### Prong 1 — user-side recovery (immediate) 1. Visit `www.unturf.com/zebra-report/` (or wherever the page is loaded from). 2. Click the **lock icon** in the URL bar → **Connection secure** → **More information** → **Permissions** tab. 3. Find **Use the camera** → uncheck "Use Default" → select **Allow** (or **Always Ask**). 4. Reload, click share camera. Alternative: `about:preferences#privacy` → scroll to **Permissions** → **Camera → Settings…** → find the origin → change from Block / remove the entry. ### Prong 2 — code-side help (next code pass) When `e.name === 'NotAllowedError'`, the page should surface a **non-technical user notice** with the recovery steps above, AND suggest clicking the camera-icon in Firefox's URL bar (Firefox shows that icon after a blocked permission, click → "Always Allow" without leaving the page). Don't auto-retry — Firefox won't change its decision until the user acts. Show the notice, log the breadcrumb, leave the FSM in `off`. ## Fix Pending. After fox's user-side recovery + retest with the Jun 6 telemetry live (showing `e.name`), I'll add prong 2 to `sfuPublishCamera`'s catch. ## Cross-references - CLAUDE.md "Telemetry" section — how to grep the signal-server log for these events. - The catch site in `web/zebra-spaces.html` is `sfuPublishCamera` (search `camera open cancelled`). - Auto-recovery for `OverconstrainedError + saved deviceId` already landed Jun 6; this prong covers the orthogonal `NotAllowedError` case. ## Status notes - **2026-06-07:** diagnosis pinned via signal-server log grep. Five identical instant-fail attempts across 4 sessions over 2 days. No prompt shown → Firefox saved-block on origin. Awaiting fox permission reset + retest. - **2026-06-06:** Jun 6 telemetry improvement (`e.name` + constraints suffix) deployed. Auto-recovery for the saved-deviceId case shipped but doesn't apply here (picked.cam is empty).