Repository navigation
feat(browsers): chromium makes no background requests of its own (FD-5113, M8.52) - #596
Merged
earakely-scale merged 6 commits intoNov 10, 2026
Conversation
…wn (FD-5113, M8.52) Behind its proxy, Chrome for Testing 156 alone reached seven Google hosts on its own despite agentenv's policies. The flags and policies that stop each: - --disable-background-networking: Safe Browsing's list updates. - --component-updater=url-source=file:///dev/null: the component updater's checks at launch and a minute later, which ComponentUpdatesEnabled leaves on for the components Chrome deems critical (CRLSets among them). - --disable-features=AimEnabled: the AI Mode eligibility check at launch; a subclass's own --disable-features is joined to it, since Chromium takes only the last one. - NetworkPredictionOptions 2: the preconnect to its search engine. - BrowserNetworkTimeQueriesEnabled false: the network time query. - SpellcheckLanguageBlocklist, every language with a dictionary: the dictionary for the deploy's locale (SpellcheckEnabled false still fetches it). - AutofillAddressEnabled and AutofillCreditCardEnabled false: the autofill server's field predictions for a page's forms. One request is left, a Google account check at launch, before the browser is ready, which nothing tried stops. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ktop's background requests A desktop routes its sites by DNS, with no forward proxy, so its browser's own requests never reach a proxy log; the desktop's flags are pinned by its argv check and its policies by the unit test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Collaborator
Author
|
@greptileai review |
The quiet test exempted every failed request to the account check host from its time check, since a failed line had no start, so a host Chrome kept retrying after it was ready would pass unseen. Both proxies' failed lines now carry started, and the test holds every request of its own to before the browser was ready. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e, not NetworkPredictionOptions NetworkPredictionOptions 2 stopped the preconnect to the search engine at launch, but also every preconnect and prefetch Chrome makes for pages, which cost warm loads on a VM. --disable-features=PreconnectToSearch stops just the launch preconnect, so pages load as they do for a user. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…hromium app They're tuning for one build's own services, found against Chrome for Testing 156, not how agentenv runs any website browser: the feature names and the spellcheck languages may not exist in another Chromium build, and they need checking again whenever chromium's VERSION moves. So QUIET_FLAGS, DISABLED_FEATURES and QUIET_POLICIES move from WebsiteBrowserEnvironment to the chromium app, its launch command and its policies, beside VERSION, and the base class is back as it was, its --disable-features merge with it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…3-chromium-background-requests
earakely-scale
deleted the
edgararakelyan/fd-5113-chromium-background-requests
branch
November 10, 2026 18:35
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
M8.52 (FD-5113). Behind its proxy, chromium alone reached seven Google hosts on its own, despite agentenv's managed policies. Now its proxy sees only its pages' requests, but for one Google account check at launch, before it's ready, which nothing tried stops.
On the open web (#588, M8.24) those requests really go out, and #588's per-connection log recorded them beside the agent's own traffic.
What each request was, and what stops it
Found on a VM by running Chrome for Testing 156 with agentenv's flags beside the deployed browser, each copy behind its own copy of the stand-in proxy and writing Chrome's own net log (URLs and traffic annotations), then adding one candidate at a time.
update.googleapis.com/service/update2/json(component updater)--component-updater=url-source=file:///dev/null.ComponentUpdatesEnabled: false(already set) leaves it updating the components Chrome exempts from that policy, CRLSets among them;--disable-component-updatestops the downloads, but not its checks for two of themedgedl.me.gvt1.com/…/chrome_component/…crx3(component downloads, the CRLSet's among them)safebrowsing.googleapis.com/v5/hashLists:batchGet(Safe Browsing list updates)--disable-background-networking, the only one it stopswww.google.com/async/folae?udm=50(the AI Mode eligibility check)--disable-features=AimEnabled;AIModeSettings,GenAiDefaultSettingsandGeminiSettingsdon't stop itwww.google.com(a preconnect to its search engine)--disable-features=PreconnectToSearch.NetworkPredictionOptions: 2stops it too, but also every preconnect and prefetch Chrome makes for pages, which slowed some warm loads on the VMclients2.google.com/time/1/current(network time)BrowserNetworkTimeQueriesEnabled: falseredirector.gvt1.com/…/dict/en-us-10-2.bdic(the spellcheck dictionary for its locale)SpellcheckLanguageBlocklist, every language Chromium has a dictionary for.SpellcheckEnabled: falsestill fetches it, and voids the blocklistcontent-autofill.googleapis.com/v1/pages/…(the autofill server's field predictions for a page's forms)AutofillAddressEnabled: falseandAutofillCreditCardEnabled: false. TheAutofillSettingspolicy already set is inert in this buildaccounts.google.com/ListAccounts(a Google account check)Left: the account check at launch. Its account reconcilor sends it as it starts. None of these stopped it:
BrowserSignin: 0(already set);signin.allowed_on_next_startup: falseas an initial preference, which does turn the reconcilor's consistency mode off (Chrome logs "Desktop Identity Consistency disabled") but still sends it;CookieJarAblationandAvoidAutoTriggerListAccountsOnStalefeatures.A seeded
Preferencesdoesn't stick: Chrome resets a protected preference it finds there. From a fresh profile the check carries no cookie, it comes before the browser is ready, and it didn't come back in 5 minutes idle or on Google, GitHub, Amazon or Wikipedia.What changes
The chromium app (
browsers/envs/chromium/chromium.py), beside itsVERSIONpin. They're tuning for this build's own services, not how agentenv runs any website browser (moved fromWebsiteBrowserEnvironmentin review):QUIET_FLAGS:--disable-background-networkingand--component-updater=url-source=file:///dev/null, in its launch command.DISABLED_FEATURES:--disable-features=AimEnabled,PreconnectToSearch, in its launch command.QUIET_POLICIES, itspoliciesover agentenv's:BrowserNetworkTimeQueriesEnabled: false,SpellcheckLanguageBlocklist(SPELLCHECK_LANGUAGES, from Chromium'sspellcheck_common.cc), andAutofillAddressEnabledandAutofillCreditCardEnabled: false.chromium-open-webmay, keepsQUIET_FLAGSandDISABLED_FEATURESin its command.failedlog lines now carrystarted, as theirconnectionlines do, so a test can hold a failed request to a time (Greptile's P2).browsers/README.md.Decisions I took while you were away, for review
write_policiesruns at install. So every language is blocklisted, and a text field shows no squiggles.NetworkPredictionOptions: 2to stop the search engine's preconnect, which also turned off the preconnects and prefetches Chrome makes for pages.PreconnectToSearchreplaces it (you chose a, Nov 10).AGENTENV_SITE_PROXYset", but only a computer with no display gets one (sites.browser_environment). A desktop routes its sites by DNS, with no forward proxy, so its browser's own requests reach no proxy log. The desktop's chromium is covered instead:Test plan
Unit:
test_chromium_app.py:SpellcheckEnabledand noNetworkPredictionOptions.test_computer_site_proxy.py: both proxies'failedlines carrystarted.tst/unit/env,bundleandclipass here, apart from the Mac-only Windows disk-recipe test, which fails on main on this Mac too.Integration (CI green on 0ae6e6c, after the move to the chromium app and a merge of main: 32 checks, the remote CodeBuild tier included). One unit shard was rerun for
test_computer_queue's timing flake, which this PR doesn't touch and which passes 8 of 8 locally:test_alone_it_makes_no_request_of_its_own_its_proxy_seeing_only_its_page_until_well_after_it_is_ready.clients2.google.com,redirector.gvt1.com,www.google.com,edgedl.me.gvt1.comand the rest.chromium_app_testandwebsite_browser_testtake the new flags.VM e2e (c6i.4xlarge, amd64, local Docker, Node 22 for the CDP clients), on 0a8d0f5: every integration test of
browser_computer_test,chromium_app_test,website_browser_testandbrowser_gateway_test, 40 passed, 1 skipped (the disk form, no KVM on this VM), in 29 min.Headful, on the VM. In a deployed desktop (Xvfb), the browser agentenv launched carries the new flags. A second headful Chrome with that browser's exact command line, behind a copy of the stand-in proxy, made nothing but the account check at launch in 100 s.
VM chaos, one browser computer alone, passed in 11 min. Each phase's connections are told apart by when they started, and Chromium is ended before the log is read:
reset_env, a fresh profile and another launch (75 s after)gvt1.com,clients*.google.com, Safe Browsing, autofill, optimization guide)The VM is torn down.
A real agent arm on the VM, on main and on this branch: Browser Use, with Claude Sonnet 5.5 through LiteLLM, on chromium alone over its CDP address, doing Online-Mind2Web-style tasks on live sites. Each answer was checked against the live page fetched at that moment, so the model couldn't answer from memory; 4 tasks × 4 runs on each:
update.googleapis.com,clients2.google.com, threegvt1.comhosts andaccounts.google.com.content-autofill.googleapis.comon every page with a form, in the middle of the agent's own browsing.PreconnectToSearchin place ofNetworkPredictionOptions), one more run of each was 4 of 4 right, with the account check alone. The quiet test and both argv checks pass there too.Not in this PR
Chrome's New Tab page in a headful browser. In the headful run above,
chrome://newtab/fetched:www.google.com/async/ddljson(the doodle);www.google.com/complete/s(zero-prefix omnibox suggestions);www.google.com/async/newtab_ogband itsgstatic,ogads-paandplay.google.com/logrequests (the Google apps bar).It opens only when an agent asks for a new tab (Ctrl+T), and headless opens
about:blankinstead.NewTabPageLocation: about:blankwould stop it, but agents would then see a blank page where a user sees Google's, so that's your call.🤖 Generated with Claude Code