Skip to content

Stop popping a modal for the normal record-privilege wait - #246

Merged
iamfatness merged 2 commits into
mainfrom
fix/record-privilege-notice
Sep 5, 2026
Merged

Stop popping a modal for the normal record-privilege wait#246
iamfatness merged 2 commits into
mainfrom
fix/record-privilege-notice

Conversation

@iamfatness

Copy link
Copy Markdown
Owner

The defect

Starting the engine popped a modal error dialog saying raw recording failed. It isn't a failure — it's the normal first half of Zoom's record-privilege handshake: canStartRawRecording returns NoPermission(6), the engine requests the privilege, the host grants it, and the operator starts the engine again.

Reported by the product owner after a live launch today:

{"cmd":"error","msg":"raw_media_start_failed","reason":"cannot_start_raw_recording",
 "code":6,"privilege_requested":true,
 "detail":"Raw recording needs local-recording permission. The meeting host must
           allow this participant to record."}

Why it was half-right already

zoom-engine-client.cpp already had special handling for this case, and it correctly refused to route it into the join-failure/reconnect machinery — doing that once flipped a healthy joined session to Failed and gated start_engine, resubscription and recovery for the rest of the session.

But it still set m_last_error and fired every error callback, and the dock ends those in QMessageBox::warning. The logic was right; the presentation was wrong.

Scope

macOS is where this case exists. The Windows engine emits raw_media_start_failed only for not_in_meeting and recording_controller_unavailable — both genuine errors that should keep the modal. Verified rather than assumed.

Verification

68/68 (67 baseline + new CoreVideoPrivilegeNotice), 3/3 mutations against the new pins killed and reverted clean.

Not verified against a live meeting with a real host grant — that's the next test.

Also carries the data/ bundling fix from #245 via a merge of main, so a single test build gets both.

🤖 Generated with Claude Code

iamfatness and others added 2 commits September 5, 2026 17:11
Starting the engine was showing a "Zoom Join" error modal for
raw_media_start_failed/privilege_requested -- the NORMAL first half of
Zoom's record-privilege handshake (canStartRawRecording -> NoPermission,
engine asks the host, raw_media_ready follows once granted), not a
failure. handle_event() already refused to route this into the
join-failure/reconnect machinery; it still set m_last_error and fired
the error-callback list, which is what popped the modal.

Adds a separate NoticeCallback path (ZoomEngineClient::add_notice_callback/
pending_privilege_notice) instead of a severity flag on the existing
error callback, so "never reaches a QMessageBox" holds by construction
rather than by every subscriber remembering to check a flag.
m_last_error is left untouched. The operator copy and the first-vs-repeat
classification live in src/zoom-privilege-notice.h (pure, host-tested in
tests/zoom-privilege-notice-test.cpp, three mutations killed). The
notice clears on raw_media_ready and on leave, rendered as a
CvBanner(Warning) in the dock instead of the modal.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@iamfatness
iamfatness merged commit 3d8d3a4 into main Sep 5, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant