[macOS] In-app browser fullscreen leaves a persistent page layer behind all windows after tab closure
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 125k
- Forks
- 19.4k
- PR merge metrics
- PR metrics pending
Description
What version of the Codex App are you using (From “About Codex” dialog)?
26.908.40834, build 8881, verified from the installed application bundle's Info.plist (not the About dialog). On this installation the desktop host is ChatGPT.app, used in the Codex workspace.
What subscription do you have?
Not specified; account plan was not verified for this UI report.
What platform is your computer?
macOS 26.5.2 (25F84), arm64.
uname -mprs: Darwin 25.5.0 arm64 arm.
What issue are you seeing?
After entering and leaving fullscreen for a local HTML presentation in the Codex in-app browser, the presentation remains rendered across the desktop behind other application windows, particularly visible in Mission Control. It has no ordinary window frame or close control.
The affected user provided multiple screenshots showing the presentation covering the desktop background while other application windows remain separately visible above it. This is not merely a browser tab that the user has left open: the in-app browser subsequently reports zero tabs and visibility = false, and the local HTTP preview server has been stopped.
The user created a new macOS desktop Space, moved application windows to it, and deleted the original Space. The residual presentation then appeared as a small layer near the top of Mission Control. Restarting Dock did not remove it; the user reported that it returned to covering the desktop at full size. Restarting WindowManager also did not remove it.
Impact: persistent visual interference with the user's desktop after a presentation preview. The issue remains unresolved at the time of filing.
What steps can reproduce the bug?
Observed sequence on the affected installation (not independently reproduced in a clean session):
- Serve a standalone HTML slide deck on localhost and open it in the Codex in-app browser.
- Use the page's fullscreen button, backed by the standard
document.documentElement.requestFullscreen()/document.exitFullscreen()APIs, to enter and leave fullscreen. - Open macOS Mission Control using the four-finger upward gesture.
- Observe the presentation remaining as a desktop-sized layer behind other application windows.
- Close the preview tab, hide the in-app browser, and stop the localhost server. The residual image persists.
The original deck was a self-contained HTML file, approximately 19 MB, with embedded still images and no automatically loaded remote resources. It is not attached because it contains private business material.
A reduced suggested maintainer test case, not independently executed to reproduce the defect:
<!doctype html>
<meta charset="utf-8">
<title>Fullscreen cleanup test</title>
<style>
body { margin: 0; min-height: 100vh; background: #174f45; color: white;
display: grid; place-content: center; font: 48px sans-serif; }
button { font: 24px sans-serif; padding: 16px; }
</style>
<h1>Fullscreen cleanup test</h1>
<button id="toggle">Toggle fullscreen</button>
<script>
document.getElementById('toggle').onclick = async () => {
if (document.fullscreenElement) await document.exitFullscreen();
else await document.documentElement.requestFullscreen();
};
</script>
Please also test closing the in-app browser tab or hiding its host after exiting fullscreen, then entering Mission Control and changing Spaces.
What is the expected behavior?
Exiting fullscreen, closing the preview tab, or hiding/destroying the browser host should release its fullscreen presentation surfaces. The desktop background and Mission Control should not retain the page image.
Additional information
Recovery attempts and confirmed results
- Close preview tab: did not clear the residual layer.
- Hide in-app browser: did not clear it; API readback was
{ visible: false, tabs: [] }. - Stop local preview HTTP server: did not clear it.
- Create a new Space, move windows, delete old Space: residual layer became smaller.
- Restart only the current user's Dock: did not clear it; residual layer returned to desktop-sized.
- Restart only the current user's WindowManager: did not clear it.
- The application host and WindowServer remained running during both component restarts.
- A full quit/relaunch of the desktop app has not yet been tested. The user plans to do that later.
Relevant local system log observations
Event window: 2026-09-13, approximately 13:44–13:45 UTC+08:00.
Dock logged the application's fullscreen Space at 13:44:53 and an ordinary desktop Space at 13:44:53.998. At 13:45:04.077, Dock logged:
[com.apple.windowmanager:xpc]
Failed to acquire remote transition coordination from WindowManager:
WindowManager.AdminXPCConnectionError (1) <private>
[com.apple.dock:windowmanager]
Failed to acquire transition coordinator from WindowManager:
WindowManager.AdminXPCConnectionError (1) <private>
Later Dock messages included Returning snapshot-backed miniLayer for the desktop. These messages are correlated diagnostics, not proof of the cause or the owner of the residual surface. The failed Dock restart makes a simple Dock thumbnail-cache explanation less likely, but ownership of the remaining layer has not been established.
Containment
The presentation's native fullscreen calls have been removed and replaced with an in-window focus mode. This avoids the observed trigger path; it does not clear the existing residual layer and is not a fix to the desktop host.
Screenshots and full logs have deliberately not been uploaded because they include unrelated business documents and private conversations. This report includes only the UI failure, version information, sanitized diagnostics, and observed recovery outcomes.
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 with the in-app browser's fullscreen lifecycle and the document.fullscreenElement, requestFullscreen(), and exitFullscreen() sequence. Reproduce the reduced HTML test case, then close the tab or hide the browser host before checking Mission Control and changing Spaces. Done means fullscreen presentation surfaces are released and no page layer remains after exit, tab closure, or host destruction.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- html, javascript, macos
- Domain
- desktop, operating-systems
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100