[Windows] Blank client area on 26.831 / 26.901 (Chromium 152): renderer paints but window never shows it; --disable-features=CalculateNativeWinOcclusion avoids it, Page.reload restores it
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 125k
- Forks
- 19.4k
- PR merge metrics
- PR metrics pending
Description
Related: #40878 (same blank-client-area phenotype on 26.820/26.825). This report adds a newer version line (26.831 / 26.901, Chromium 152), a launch flag that has been deterministic on this machine so far, evidence that the renderer keeps painting while the window never shows it, and a way to pass Chromium switches to the Store (MSIX) package.
What version of the Codex App are you using (From "About Codex" dialog)?
OpenAI.Codex 26.831.2377.0(Store/MSIX, internal app version26.831.21537) - first launch on 2026-09-03 was blankOpenAI.Codex 26.901.1978.0(internal26.901.20858) - same behavior- Both embed Chromium
152.0.7977.64(ChatGPT.exefile version;/json/versionreportsChrome/152.0.7977.64). The 26.831 bundle declareselectron: 42.3.0. - The previous package
26.825.6671.0(Chromium151.0.7922.174) rendered normally on the same machine on 2026-09-02, one day earlier.
What subscription do you have?
ChatGPT Pro
What platform is your computer?
Microsoft Windows NT 10.0.26200.0 x64 (Windows 11 Pro 25H2, build 26200.9168)
- CPU AMD Ryzen 5 2600, 24 GB RAM
- GPU AMD Radeon RX 570, driver
31.0.12027.9001(2023-03-30), ANGLE D3D11, feature level 12_0 - Two displays, both at 100% scaling: 1920x1080 (primary) and 2560x1440
- Google Chrome
152.0.7977.75and an Electron 42 / Chromium 148 app render normally on the same GPU and driver at the same time.
What issue are you seeing?
After the Store update to 26.831 the main window opens but the whole client area is a single flat color, #202020, which is the BrowserWindow backgroundColor for the dark theme (the opaque, non-Mica surface path). The window caption buttons (minimize / maximize / close) are drawn; nothing else is. Updating to 26.901 did not change it. Every normal launch since the update has been blank.
What I verified while the window was blank:
- The app is alive and working. The main process logs a normal startup with no errors:
window main frame finished load,window ready-to-show,app routes mounted after ~9 s, app-server handshake OK. Renderer, GPU and utility processes stay alive;Local Statereportsexited_cleanly: trueandsystem_crash_count: 0. - The renderer is painting the full UI. Attaching DevTools over
--remote-debugging-portand callingPage.captureScreenshotonapp://-/index.htmlreturns the complete Codex UI (sidebar, projects, home composer).document.body.innerHTMLis ~600 KB,#roothas a React root,document.visibilityStateisvisible,document.hiddenisfalse,devicePixelRatiois 1, inner size matches the window (1280x820). - The presented window content is flat.
PrintWindow(PW_RENDERFULLCONTENT)of the top-level window samples exactly one color (#202020) over the whole client area; a UI Automation walk of the window shows only the caption buttons (accessibility for the web content was not enabled, so this is only a secondary signal). - GPU status is normal.
SystemInfo.getInfoover CDP:gpu_compositing: enabled,rasterization: enabled,webgl/webgpu: enabled,skia_graphite: disabled_off,direct_rendering_display_compositor: disabled_off_ok,directComposition: true,supportsOverlays: false,skiaBackendType: GaneshGL,processCrashCount: 0. Driver bug workarounds:disable_direct_composition_sw_video_overlays, disable_nv12_dynamic_textures, disable_video_overlay_if_moving, exit_on_context_lost, force_rgb10a2_overlay_support, limit_d3d11_video_decoder_to_11_0, ...(the usual AMD set). - Window structure is identical to a painting instance: top-level
Chrome_WidgetWin_1withWS_EX_NOREDIRECTIONBITMAP, childrenChrome_RenderWidgetHostHWND(visible) andIntermediate D3D Window(visible, not cloaked, same size as the client area). - One Crashpad sidecar was written at the very first launch of 26.831:
{"capture_kind":"dump_without_crashing","ptype":"gpu-process"}. Later blank launches wrote no reports. - Auth is fine (
getAuthStatus/account/readsucceed, ChatGPT API calls return 200) and this is not theworkspace_dependenciesloop from #19437 / #19770.
So the frames exist in the renderer / viz surface but are never composited into what the window presents. A page reload gives the window a new surface and it appears immediately.
What steps can reproduce the bug?
- Install
OpenAI.Codex 26.831.2377.0or26.901.1978.0from the Store on the machine above. - Launch Codex normally (Start menu, Store, or
explorer.exe shell:AppsFolder\OpenAI.Codex_2p2nqsd0c76g0!App). - Wait 45 s or longer. The client area stays flat
#202020.
Counts on this machine (each measured at least 45 s after launch by sampling the window pixels; "painted" means the normal UI is visible):
| Launch | Result |
|---|---|
| Normal launch, no switches (26.831 x2 by the user, 26.901 x3 in controlled runs) | 5 / 5 blank |
Same package launched with --disable-features=CalculateNativeWinOcclusion (26.901 x3, two of them also with --remote-debugging-port=9222) |
3 / 3 painted, document.visibilityState = visible |
Blank instance, then Page.reload sent over CDP |
2 / 2 painted within 20 s, no restart needed |
Things that did NOT recover a blank instance (each verified by re-sampling the window): minimize + restore, hide + show (SW_HIDE/SW_SHOW), maximize + restore, resizing by 40 px, moving the window inside the monitor and to the other monitor, attaching DevTools (Runtime.enable / Log.enable), Page.captureScreenshot, Emulation.setDeviceMetricsOverride + clearDeviceMetricsOverride, hiding and re-showing the Chrome_RenderWidgetHostHWND child, fully covering the window with another app and uncovering it, and installing the pending 26.901 update.
To pass Chromium switches to the Store package without losing package identity, activate it through IApplicationActivationManager (the flags are otherwise unreachable on Store builds, as noted in #23624):
$src = @"
using System; using System.Runtime.InteropServices;
public enum ActivateOptions { None = 0 }
[ComImport, Guid("2e941141-7f97-4756-ba1d-9decde894a3d"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IApplicationActivationManager {
[PreserveSig] int ActivateApplication([In, MarshalAs(UnmanagedType.LPWStr)] string aumid, [In, MarshalAs(UnmanagedType.LPWStr)] string args, [In] ActivateOptions o, [Out] out uint pid);
[PreserveSig] int ActivateForFile([In, MarshalAs(UnmanagedType.LPWStr)] string aumid, [In] IntPtr items, [In, MarshalAs(UnmanagedType.LPWStr)] string verb, [Out] out uint pid);
[PreserveSig] int ActivateForProtocol([In, MarshalAs(UnmanagedType.LPWStr)] string aumid, [In] IntPtr items, [Out] out uint pid);
}
[ComImport, Guid("45BA127D-10A8-46EA-8AB7-56EA9078943C")] public class ApplicationActivationManager {}
public static class L { public static uint Go(string aumid, string args) { uint pid; var m = (IApplicationActivationManager)new ApplicationActivationManager(); m.ActivateApplication(aumid, args, ActivateOptions.None, out pid); return pid; } }
"@
Add-Type -TypeDefinition $src
[L]::Go('OpenAI.Codex_2p2nqsd0c76g0!App', '--disable-features=CalculateNativeWinOcclusion')
The switch shows up on the main process command line and the app runs as the normal Store package.
What is the expected behavior?
The window should present the UI that the renderer is already painting, on every launch, without Chromium switches or a reload.
Additional information
- Working hypothesis, not proven: with native window occlusion tracking enabled, the window's visibility flips during startup (created hidden, shown, briefly judged occluded, then visible again) and that transition races with the first surface embedding, so the browser side keeps drawing the background color and never embeds the renderer's surface; a reload creates a new surface and fixes it.
--disable-features=CalculateNativeWinOcclusionremoves the occlusion flip, which matches the 3 / 3 result. The 5 / 3 / 2 counts are small; happy to run more launches or a diagnostic build. - The client area is
#202020here, i.e. the opaque surface path, not the transparent / Mica path discussed in #40878, so that path is affected too. - The machine's AMD driver is old, but Chrome 152 and other Chromium-based apps present normally on it, and the GPU process reports no crashes or lost contexts during the blank launches.
- The "Reload Window" application-menu item is registered with the accelerator
Command+Control+R, which does not exist on Windows, so an end user has no keyboard way to trigger the reload that fixes the window. A working Windows accelerator (for exampleCtrl+Shift+R) would be a cheap mitigation while the root cause is being fixed. - Logs (main-process desktop logs, Crashpad sidecar, CDP dumps) are available on request; I can also upload through
/feedbackif that is preferred.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by tracing the Windows desktop startup path around BrowserWindow creation, the ready-to-show event, and the first renderer surface presentation. Reproduce the blank launch with and without --disable-features=CalculateNativeWinOcclusion, then compare it with Page.reload; done means the Store build consistently presents the rendered UI without a switch or reload.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- electron
- Domain
- desktop, operating-systems
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 38/100