Repository navigation
fix(scene): browser sources request only what their pages load - #90
Conversation
Quest-Claim: 30c4bce49d17de32
The CEF helper asked Google, unprompted, for the network time, component updates (the on-device AI model's manifest), a spellcheck dictionary, AI Mode eligibility, and autofill predictions for each form. It now disables NetworkTimeServiceQuerying, AutofillServerCommunication, and AimEnabled (joined to CEF's own disabled features), points the component updater at no server, and lists no spellcheck dictionaries. The browser suite routes the helper through a proxy that fails the test on any request. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 12 minutes. View limit details
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. |
kixelated
left a comment
There was a problem hiding this comment.
Automated review by review (OpenAI)
Reviewed head d3e8b81f0193808013e4a427098a6480f60ef45e against base f760ee7227519ff79983bb5c5c95b3c1e7db529c.
No actionable findings. The disabled-feature list preserves CEF's existing entries, and the pinned Chromium sources gate the identified time, autofill and AI eligibility requests. The component updater uses the URL override for both updates and pings. Spellcheck configuration is applied before queued pages open, with preference-setting failure terminating the helper. The regression test starts its proxy before the helper, preserves helper arguments through the wrapper, requires the page to render, and stops the helper before asserting.
Direction: keep the targeted configuration and the startup-network regression test. Its proxy observation is a useful guard for the reported HTTP/HTTPS requests, not proof that every protocol or later background activity is absent.
Verification limits: GitHub-only static review of the changes, helper lifecycle/test wiring, and relevant CEF/Chromium sources at the versions pinned by the flake. I read the pinned quest context as source but did not execute quest context, builds, tests, packet capture or the reported ablation/stress runs. No independent runtime or exhaustive network-privacy verification. COMMENT only, not approval.
(Written by review (OpenAI))
|
Pick (/quest-complete, maintainer away under /afk, recommended option): ✅ Merge, keeping the choices made without asking: (Written by Claude Opus 5.5) |

Problem
quest/m0/browser-offline.md, from the follow-ups of moq-dev/studio#78: the CEF browser helper contacts Google on its own, a privacy leak and a network dependency nobody asked for. Routed through a test proxy, a fresh helper on main showing one loopback page with a text field asks for:
clients2.google.com/time/1/currentNetworkTimeServiceQuerying)update.googleapis.com/service/update2/jsonceofaddefefcbblgcgnibnonglccbfja,optimization_guide_on_device_model_installer.cc)redirector.gvt1.com/edgedl/chrome/dict/en-us-10-2.bdicwww.google.com/async/folaeAimEnabled)content-autofill.googleapis.com/v1/pages/...AutofillServerCommunication)The switches the quest suggested do not stop them in CEF 156. With
--disable-background-networking,--disable-component-update, and--disable-spell-checking, all five still went out: the manifest installer requests itself regardless of--disable-component-update, and--disable-spell-checkingno longer exists in CEF.Approach
All in
rs/moq-scene/src/browser/host.rs; the switches stay inon_before_command_line_processing, beside--no-sandbox.--disable-features=NetworkTimeServiceQuerying,AutofillServerCommunication,AimEnabled, appended to the list CEF already passes (GlicActorUi,AutofillActorMode,LensOverlay,KillOnInvalidNavigationHeaders) rather than replacing it.--component-updater=url-source=data:: the component updater's server is a URL the network stack never contacts, so no component installs or updates, including installers that ask on their own.initialize, before any page opens, the profile'sspellcheck.dictionariesis set to an empty list, so Chromium fetches no dictionary. No switch does this. Failing to set it fails the helper, saying why, rather than leaking.the_helper_requests_only_its_pagesinrs/moq-studio/tests/browser.rs: the helper runs through a wrapper script that adds--proxy-serverpointing at a listener in the test, which records the first line of every connection. Chromium sends loopback past a proxy, so the served page still loads. It shows a page with a text field, waits for it to draw plus 2 s, and asserts nothing reached the proxy.Studio::starttakes the helper program, so the wrapper can stand in for it.Each knob was confirmed by leaving it out alone: each brought back exactly the requests the table above attributes to it.
spellcheck.dictionariesis the pref that matters;browser.enable_spellchecking = falsealone still fetched the dictionary.Impact
host.rsis private to the helper). Wire: none. The helper protocol is unchanged.Choices made without asking
--component-updater=url-source=data:rather than--disable-component-update. The latter left the manifest install, so it is not used at all: pointing the updater nowhere covers every component, including installers that bypass--disable-component-update. Chromium documents the--component-updatervalues as debug options, so a CEF bump could drop it; the new test would then fail in the nightly.--disable-background-networking. Leaving it out changed nothing the test sees, so it was dropped rather than kept on faith.Alternatives
--optimization-guide-manifest-override=<file>would stop only the AI model manifest, and needs a config file written somewhere.ComponentUpdatesEnabled,SpellcheckEnabled,BrowserNetworkTimeQueriesEnabled) through CEF'schrome_policy_idneed a managed policy directory on disk.--policy=on the command line had no effect. Thecomponent_updates.component_updates_enabledlocal-state pref still sends the update check, marked"updatedisabled": true.--log-net-log) in the test instead of a proxy would also catch raw DNS, but needs JSON parsing and a dependency; the proxy is shorter and states its result directly.Validation
All on nixos (RTX 3070 Ti, GNOME), over ssh. CPU path: no display, Mesa lavapipe, as
just render-swsets it. GPU paths through the logged-in session (X11 withDISPLAY=:0and its Xwayland auth; Wayland withWAYLAND_DISPLAY=wayland-0).host.rswith the new testthe_helper_requests_only_its_pages, CPU,--stress-count 5plus one runthe_helper_requests_only_its_pages, CPU,--stress-count 10quest gate just ciquest gate just render-swquest checkon macOS: pass.Follow-ups
Review
quest review --base origin/main), gpt-6.1-sol, medium effort.origin/mainat 79c60b9 (#89, #85, #88). Its only conflict was thequest/m0/README.mdlink list, whichquestresolved; the changed lines ofgit diff origin/main...c37a48fmatch those ofgit diff f760ee7...d3e8b81exactly, so the review above covers it.quest gate just cipasses on c37a48f on nixos (281 tests).(Written by Claude Opus 5.5)
🤖 Generated with Claude Code