Chrome plugin domSnapshot on authenticated Blackboard page crashed Google Chrome profile

Open 💬 1 comment Opened May 8, 2026 by DearBobby9

Summary

Using the new Codex Chrome plugin to claim an already-open authenticated Chrome tab and call tab.playwright.domSnapshot() caused the user's real Google Chrome profile to exit/crash. This was not the Codex in-app browser; it was the user's normal Chrome profile controlled through the Codex Chrome extension.

The page was a private university Blackboard page, so I cannot share the URL or screenshot publicly. Structurally, it was a Blackboard Ultra course shell embedding the Original UI Needs Grading page, filtered to one assignment. The visible table had 13 grading rows.

Environment

  • Product: Codex Desktop app on macOS
  • Codex app version: 26.506.31004 (CFBundleVersion 2604)
  • Codex CLI version available locally: codex-cli 0.128.0
  • macOS: 26.3 (25D125), arm64
  • Google Chrome: 147.0.7727.139
  • Codex Chrome extension ID: hehggadaopoacecdllhhajmbjkdcmajg
  • Codex Chrome extension version: 1.1.4_0
  • Chrome plugin bundle path in Codex: openai-bundled/chrome/0.1.7
  • Native host: com.openai.codexextension

Local setup checks before/after

The extension install check reported healthy:

{
  "extensionId": "hehggadaopoacecdllhhajmbjkdcmajg",
  "profilePath": "/Users/<redacted>/Library/Application Support/Google/Chrome/Default",
  "installed": true,
  "registered": true,
  "enabled": true,
  "disabled": false,
  "versions": ["1.1.4_0"]
}

The native host manifest check also reported healthy:

{
  "manifestPath": "/Users/<redacted>/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.openai.codexextension.json",
  "expectedHostName": "com.openai.codexextension",
  "actualHostName": "com.openai.codexextension",
  "expectedExtensionId": "hehggadaopoacecdllhhajmbjkdcmajg",
  "hasExpectedOrigin": true,
  "correct": true,
  "problem": null
}

Steps that triggered the crash

In a Codex Desktop thread, using the Chrome plugin backend:

  1. Bootstrap the Chrome browser runtime with agent.browsers.get("extension").
  2. Call browser.user.openTabs().
  3. Pick the existing authenticated elearning.utdallas.edu tab for a Blackboard course.
  4. Claim it with browser.user.claimTab(targetTabInfo).
  5. Confirm the claimed tab title/url returned successfully.
  6. Call:
const pageTitleNeeds = await needsTab.title();
const pageUrlNeeds = await needsTab.url();
const snapNeeds = await needsTab.playwright.domSnapshot();

While domSnapshot() was pending, the user's Google Chrome window disappeared / Chrome exited. The user interrupted the Codex turn after seeing Chrome crash.

Expected behavior

domSnapshot() should either:

  • return a snapshot,
  • time out cleanly,
  • fail with a recoverable error for a large/private/iframe-heavy page, or
  • at worst crash/disconnect the controlled tab renderer while preserving the rest of the user's Chrome session.

It should not terminate the user's normal Chrome profile.

Actual behavior

The user's real Google Chrome process exited. Afterward, local Chrome state showed the Default profile had crashed:

~/Library/Application Support/Google/Chrome/Default/Preferences:
  "exit_type" => "Crashed"
  "session_data_status" => 1

The latest Chrome session files were updated around the incident time:

~/Library/Application Support/Google/Chrome/Default/Sessions:
  Session_* updated May 8 14:16 local time

No fresh macOS DiagnosticReports entry or Chrome Crashpad dump was found for this incident, so the local evidence is the Chrome profile state/session timestamp rather than a symbolicated crash report.

Notes / hypothesis

This appears related to domSnapshot() against a complex authenticated enterprise/LMS page with nested Blackboard frames and a grading table. A full-page DOM snapshot may be too heavy or may hit an extension/CDP edge case. The key safety concern is that the operation was read-only from the user's point of view, but it destabilized the user's primary Chrome profile.

A safer behavior would be bounded snapshot size/time, iframe filtering, graceful fallback to visible DOM/screenshot, or isolating high-risk snapshot operations so they cannot take down the user's main Chrome session.

Redactions

I intentionally omitted the full Blackboard URL, course IDs beyond the domain class of page, screenshots, user paths, student/team names, and any page content that could contain student data.

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗