Describe the bug
With no browser created and no page loaded, CEF sends a POST to https://accounts.google.com/ListAccounts?...&source=ChromiumBrowser about half a second after CefInitialize. It comes from the initial Default profile under root_cache_path. It is sent again the first time each request context with a disk cache_path is used, and that one carries the profile's google.com cookies if there are any.
It comes from IdentityManager::OnNetworkInitialized (components/signin/public/identity_manager/identity_manager.cc), which lists the Google accounts in the cookie jar for every regular profile once its network is up. CEF already disables browser sign-in, and Google does not allow sign-in from CEF-based browsers, so the answer is never used. For an embedder it's an unrequested request to Google, carrying the user's Google session cookies, sent whenever a profile loads.
We couldn't find a way to stop it:
- --allow-browser-signin=false has no effect.
- The sign-in preferences have no effect. A CEF profile already reads signin.allowed = false. Setting signin.allowed and signin.allowed_on_next_startup to false through CefRequestContext::SetPreference, or seeding them in the profile's Preferences file before the context opens, changes nothing on that launch or the next.
- Disabling features has no effect. We tried AvoidAutoTriggerListAccountsOnStale (enabled), plus EnableBoundSessionCredentials, FetchAccountInfoOnRestart, DiceHeaderVersion2, DiceLinkedAccounts, EnablePreferencesAccountStorage, EnableChromeRefreshTokenBinding, EnableOAuthMultiloginCookiesBinding and EnableAccountPreviewData (all disabled), then disabled in a single --disable-features every one of the 242 identifiers in the framework's strings that mention sign-in, accounts, GAIA, DICE, identity, OAuth, reconciliation or sync.
- The request never reaches CefRequestContextHandler or CefResourceRequestHandler, so it can't be cancelled there.
- --gaia-url pointed at a dead address only makes it retry, about 8 times over roughly 15 minutes, and it also redirects every other GAIA URL.
To Reproduce
- Initialize CEF with windowless rendering, root_cache_path set, and cache_path empty. Create no browser.
- Launch with --log-net-log=/tmp/net.json --net-log-capture-mode=IncludeSensitive.
- Wait a few seconds and quit.
- In the net log, the only request is POST accounts.google.com/ListAccounts. It carries no Cookie header, because the Default profile has none.
- Create a CefRequestContext with cache_path set to a direct child of root_cache_path, open a browser on it, and repeat. A second ListAccounts appears when that profile loads. If the profile has google.com cookies, they're sent with it.
Expected behavior
No request to accounts.google.com unless a page navigates there. At a minimum, give embedders a setting or preference that turns off Google account reconciliation for a profile.
Versions
- OS: macOS 26.6.2 (Apple silicon, M2)
- CEF Version: 152.0.6+g708dc14+chromium-152.0.7977.83
- Compiler: Xcode 27.0, Apple clang 21.0.0
Additional context
Does the problem reproduce with the cefclient or cefsimple sample application at the same version?
Yes. I built cefsimple from the 152.0.6 binary distribution. The only change was setting root_cache_path to a fresh empty directory, so the test didn't touch the shared default location. With the net-log switches above, it sends the same ListAccounts POST about 0.25 to 0.5 s after startup, before its first page request. So it isn't specific to windowless rendering or to our app. Setting cache_path to a child of the root didn't stop the request, and a Default directory was still created under the root.
Does the problem reproduce with Google Chrome at the same version?
Chrome sends this request by design, because it keeps browser sign-in in step with Google web sign-in. The issue is only that CEF, where sign-in is disabled, still does it.
Describe the bug
With no browser created and no page loaded, CEF sends a POST to https://accounts.google.com/ListAccounts?...&source=ChromiumBrowser about half a second after CefInitialize. It comes from the initial Default profile under root_cache_path. It is sent again the first time each request context with a disk cache_path is used, and that one carries the profile's google.com cookies if there are any.
It comes from IdentityManager::OnNetworkInitialized (components/signin/public/identity_manager/identity_manager.cc), which lists the Google accounts in the cookie jar for every regular profile once its network is up. CEF already disables browser sign-in, and Google does not allow sign-in from CEF-based browsers, so the answer is never used. For an embedder it's an unrequested request to Google, carrying the user's Google session cookies, sent whenever a profile loads.
We couldn't find a way to stop it:
To Reproduce
Expected behavior
No request to accounts.google.com unless a page navigates there. At a minimum, give embedders a setting or preference that turns off Google account reconciliation for a profile.
Versions
Additional context
Does the problem reproduce with the cefclient or cefsimple sample application at the same version?
Yes. I built cefsimple from the 152.0.6 binary distribution. The only change was setting root_cache_path to a fresh empty directory, so the test didn't touch the shared default location. With the net-log switches above, it sends the same ListAccounts POST about 0.25 to 0.5 s after startup, before its first page request. So it isn't specific to windowless rendering or to our app. Setting cache_path to a child of the root didn't stop the request, and a Default directory was still created under the root.
Does the problem reproduce with Google Chrome at the same version?
Chrome sends this request by design, because it keeps browser sign-in in step with Google web sign-in. The issue is only that CEF, where sign-in is disabled, still does it.