Skip to content

fix: harden page discovery for autoConnect#1979

Open
bertrand319 wants to merge 6 commits intoChromeDevTools:mainfrom
bertrand319:codex/empty-isolated-context-default
Open

fix: harden page discovery for autoConnect#1979
bertrand319 wants to merge 6 commits intoChromeDevTools:mainfrom
bertrand319:codex/empty-isolated-context-default

Conversation

@bertrand319
Copy link
Copy Markdown

@bertrand319 bertrand319 commented Apr 29, 2026

Summary

  • Treat empty isolatedContext values as omitted when opening a new page.
  • Skip page targets that hang or fail while resolving to a Puppeteer page, so list_pages can still return responsive pages instead of failing on one stalled target.
  • Add regression coverage for empty isolated context requests and stalled page targets.

Test Plan

  • npm run format
  • npm run build
  • npm run test tests/McpContext.test.ts
  • npm run test

@google-cla
Copy link
Copy Markdown

google-cla Bot commented Apr 29, 2026

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

@bertrand319
Copy link
Copy Markdown
Author

Local verification completed:

  • npm run format
  • npm run build
  • npm run test tests/tools/pages.test.ts
  • npm run test

The fork workflows Compile and run tests and Check code before submitting are currently in action_required state and did not start jobs. A maintainer needs to approve those workflow runs before the PR can get CI results. Review is also still required.

@bertrand319 bertrand319 changed the title fix: ignore empty isolated context names fix: harden page discovery for autoConnect Apr 30, 2026
@bertrand319
Copy link
Copy Markdown
Author

Added a second fix for the new \ feedback.

The log shows Puppeteer connects successfully, then \ fails while resolving one page target. This path previously relied on , where one stalled target can reject/block the whole page snapshot. The new commit enumerates targets directly, resolves each page with the existing default timeout, logs and skips only the unresponsive target, and still returns the responsive pages.

Fresh local verification after the latest commit:

  • \

chrome-devtools-mcp@0.23.0 format
eslint --cache --fix . && prettier --write --cache .

.claude-plugin/marketplace.json 1ms (unchanged) (cached)
.gemini/settings.json 0ms (unchanged) (cached)
.github/dependabot.yml 0ms (unchanged) (cached)
.github/ISSUE_TEMPLATE/01-bug.yml 0ms (unchanged) (cached)
.github/ISSUE_TEMPLATE/02-feature.yml 0ms (unchanged) (cached)
.github/ISSUE_TEMPLATE/03-task.yml 0ms (unchanged) (cached)
.github/ISSUE_TEMPLATE/config.yml 0ms (unchanged) (cached)
.github/workflows/conventional-commit.yml 0ms (unchanged) (cached)
.github/workflows/pre-release.yml 0ms (unchanged) (cached)
.github/workflows/presubmit.yml 0ms (unchanged) (cached)
.github/workflows/publish-to-npm-on-tag.yml 0ms (unchanged) (cached)
.github/workflows/release-please.yml 0ms (unchanged) (cached)
.github/workflows/run-tests.yml 0ms (unchanged) (cached)
.mcp.json 0ms (unchanged) (cached)
.prettierrc.cjs 0ms (unchanged) (cached)
.release-please-manifest.json 0ms (unchanged) (cached)
AGENTS.md 0ms (unchanged) (cached)
CONTRIBUTING.md 0ms (unchanged) (cached)
docs/cli.md 0ms (unchanged) (cached)
docs/debugging-android.md 0ms (unchanged) (cached)
docs/design-principles.md 0ms (unchanged) (cached)
docs/slim-tool-reference.md 0ms (unchanged) (cached)
docs/tool-reference.md 0ms (unchanged) (cached)
docs/troubleshooting.md 0ms (unchanged) (cached)
eslint.config.mjs 0ms (unchanged) (cached)
gemini-extension.json 0ms (unchanged) (cached)
package-lock.json 0ms (unchanged) (cached)
package.json 0ms (unchanged) (cached)
puppeteer.config.cjs 0ms (unchanged) (cached)
README.md 0ms (unchanged) (cached)
release-please-config.json 0ms (unchanged) (cached)
rollup.config.mjs 0ms (unchanged) (cached)
scripts/append-lighthouse-notices.ts 0ms (unchanged) (cached)
scripts/count_tokens.ts 0ms (unchanged) (cached)
scripts/eslint_rules/check-license-rule.js 0ms (unchanged) (cached)
scripts/eslint_rules/enforce-zod-schema-rule.js 0ms (unchanged) (cached)
scripts/eslint_rules/local-plugin.js 0ms (unchanged) (cached)
scripts/eslint_rules/no-direct-third-party-imports-rule.js 0ms (unchanged) (cached)
scripts/eval_gemini.ts 0ms (unchanged) (cached)
scripts/eval_scenarios/console_test.ts 0ms (unchanged) (cached)
scripts/eval_scenarios/emulation_test.ts 0ms (unchanged) (cached)
scripts/eval_scenarios/emulation_userAgent_test.ts 0ms (unchanged) (cached)
scripts/eval_scenarios/emulation_viewport_test.ts 0ms (unchanged) (cached)
scripts/eval_scenarios/fill_select_and_checkboxes_test.ts 0ms (unchanged) (cached)
scripts/eval_scenarios/fix_webpage_issues_test.ts 0ms (unchanged) (cached)
scripts/eval_scenarios/frontend_snapshot_test.ts 0ms (unchanged) (cached)
scripts/eval_scenarios/input_parallel_test.ts 0ms (unchanged) (cached)
scripts/eval_scenarios/input_test.ts 0ms (unchanged) (cached)
scripts/eval_scenarios/isolated_context_test.ts 0ms (unchanged) (cached)
scripts/eval_scenarios/lighthouse_a11y_test.ts 0ms (unchanged) (cached)
scripts/eval_scenarios/lighthouse_best_practices_test.ts 0ms (unchanged) (cached)
scripts/eval_scenarios/navigation_test.ts 0ms (unchanged) (cached)
scripts/eval_scenarios/network_test.ts 0ms (unchanged) (cached)
scripts/eval_scenarios/page_focus_keyboard_test.ts 0ms (unchanged) (cached)
scripts/eval_scenarios/page_id_routing_test.ts 0ms (unchanged) (cached)
scripts/eval_scenarios/performance_test.ts 0ms (unchanged) (cached)
scripts/eval_scenarios/select_page_test.ts 0ms (unchanged) (cached)
scripts/eval_scenarios/snapshot_test.ts 0ms (unchanged) (cached)
scripts/generate-cli.ts 0ms (unchanged) (cached)
scripts/generate-docs.ts 0ms (unchanged) (cached)
scripts/post-build.ts 0ms (unchanged) (cached)
scripts/prepare.ts 0ms (unchanged) (cached)
scripts/test.mjs 0ms (unchanged) (cached)
scripts/tsconfig.json 0ms (unchanged) (cached)
scripts/update_metrics.ts 0ms (unchanged) (cached)
scripts/update-lighthouse.ts 0ms (unchanged) (cached)
scripts/verify-npm-package.mjs 0ms (unchanged) (cached)
scripts/verify-server-json-version.ts 0ms (unchanged) (cached)
SECURITY.md 0ms (unchanged) (cached)
server.json 0ms (unchanged) (cached)
skills/a11y-debugging/references/a11y-snippets.md 0ms (unchanged) (cached)
skills/a11y-debugging/SKILL.md 0ms (unchanged) (cached)
skills/chrome-devtools-cli/references/installation.md 0ms (unchanged) (cached)
skills/chrome-devtools-cli/SKILL.md 0ms (unchanged) (cached)
skills/chrome-devtools/SKILL.md 0ms (unchanged) (cached)
skills/debug-optimize-lcp/references/elements-and-size.md 0ms (unchanged) (cached)
skills/debug-optimize-lcp/references/lcp-breakdown.md 0ms (unchanged) (cached)
skills/debug-optimize-lcp/references/lcp-snippets.md 0ms (unchanged) (cached)
skills/debug-optimize-lcp/references/optimization-strategies.md 0ms (unchanged) (cached)
skills/debug-optimize-lcp/SKILL.md 0ms (unchanged) (cached)
skills/memory-leak-debugging/references/common-leaks.md 0ms (unchanged) (cached)
skills/memory-leak-debugging/references/compare_snapshots.js 0ms (unchanged) (cached)
skills/memory-leak-debugging/references/memlab.md 0ms (unchanged) (cached)
skills/memory-leak-debugging/SKILL.md 0ms (unchanged) (cached)
skills/troubleshooting/SKILL.md 0ms (unchanged) (cached)
src/bin/check-latest-version.ts 0ms (unchanged) (cached)
src/bin/chrome-devtools-cli-options.ts 0ms (unchanged) (cached)
src/bin/chrome-devtools-mcp-cli-options.ts 0ms (unchanged) (cached)
src/bin/chrome-devtools-mcp-main.ts 0ms (unchanged) (cached)
src/bin/chrome-devtools-mcp.ts 0ms (unchanged) (cached)
src/bin/chrome-devtools.ts 0ms (unchanged) (cached)
src/browser.ts 0ms (unchanged) (cached)
src/daemon/client.ts 0ms (unchanged) (cached)
src/daemon/daemon.ts 0ms (unchanged) (cached)
src/daemon/types.ts 0ms (unchanged) (cached)
src/daemon/utils.ts 0ms (unchanged) (cached)
src/devtools.d.ts 0ms (unchanged) (cached)
src/DevToolsConnectionAdapter.ts 0ms (unchanged) (cached)
src/DevtoolsUtils.ts 0ms (unchanged) (cached)
src/formatters/ConsoleFormatter.ts 0ms (unchanged) (cached)
src/formatters/HeapSnapshotFormatter.ts 0ms (unchanged) (cached)
src/formatters/IssueFormatter.ts 0ms (unchanged) (cached)
src/formatters/NetworkFormatter.ts 0ms (unchanged) (cached)
src/formatters/SnapshotFormatter.ts 0ms (unchanged) (cached)
src/HeapSnapshotManager.ts 0ms (unchanged) (cached)
src/index.ts 0ms (unchanged) (cached)
src/issue-descriptions.ts 0ms (unchanged) (cached)
src/logger.ts 0ms (unchanged) (cached)
src/McpContext.ts 0ms (unchanged) (cached)
src/McpPage.ts 0ms (unchanged) (cached)
src/McpResponse.ts 0ms (unchanged) (cached)
src/Mutex.ts 0ms (unchanged) (cached)
src/PageCollector.ts 0ms (unchanged) (cached)
src/polyfill.ts 0ms (unchanged) (cached)
src/SlimMcpResponse.ts 0ms (unchanged) (cached)
src/telemetry/ClearcutLogger.ts 0ms (unchanged) (cached)
src/telemetry/flag_usage_metrics.json 0ms (unchanged) (cached)
src/telemetry/flagUtils.ts 0ms (unchanged) (cached)
src/telemetry/metricUtils.ts 0ms (unchanged) (cached)
src/telemetry/persistence.ts 0ms (unchanged) (cached)
src/telemetry/tool_call_metrics.json 0ms (unchanged) (cached)
src/telemetry/toolMetricsUtils.ts 0ms (unchanged) (cached)
src/telemetry/types.ts 0ms (unchanged) (cached)
src/telemetry/watchdog/ClearcutSender.ts 0ms (unchanged) (cached)
src/telemetry/watchdog/main.ts 0ms (unchanged) (cached)
src/telemetry/WatchdogClient.ts 0ms (unchanged) (cached)
src/TextSnapshot.ts 0ms (unchanged) (cached)
src/third_party/devtools-formatter-worker.ts 0ms (unchanged) (cached)
src/third_party/devtools-heap-snapshot-worker.ts 0ms (unchanged) (cached)
src/third_party/index.ts 0ms (unchanged) (cached)
src/tools/categories.ts 0ms (unchanged) (cached)
src/tools/console.ts 0ms (unchanged) (cached)
src/tools/emulation.ts 0ms (unchanged) (cached)
src/tools/extensions.ts 0ms (unchanged) (cached)
src/tools/inPage.ts 0ms (unchanged) (cached)
src/tools/input.ts 0ms (unchanged) (cached)
src/tools/lighthouse.ts 0ms (unchanged) (cached)
src/tools/memory.ts 0ms (unchanged) (cached)
src/tools/network.ts 0ms (unchanged) (cached)
src/tools/pages.ts 0ms (unchanged) (cached)
src/tools/performance.ts 0ms (unchanged) (cached)
src/tools/screencast.ts 0ms (unchanged) (cached)
src/tools/screenshot.ts 0ms (unchanged) (cached)
src/tools/script.ts 0ms (unchanged) (cached)
src/tools/slim/tools.ts 0ms (unchanged) (cached)
src/tools/snapshot.ts 0ms (unchanged) (cached)
src/tools/ToolDefinition.ts 0ms (unchanged) (cached)
src/tools/tools.ts 0ms (unchanged) (cached)
src/tools/webmcp.ts 0ms (unchanged) (cached)
src/trace-processing/parse.ts 0ms (unchanged) (cached)
src/types.ts 0ms (unchanged) (cached)
src/utils/check-for-updates.ts 0ms (unchanged) (cached)
src/utils/files.ts 0ms (unchanged) (cached)
src/utils/id.ts 0ms (unchanged) (cached)
src/utils/keyboard.ts 0ms (unchanged) (cached)
src/utils/pagination.ts 0ms (unchanged) (cached)
src/utils/string.ts 0ms (unchanged) (cached)
src/utils/types.ts 0ms (unchanged) (cached)
src/version.ts 0ms (unchanged) (cached)
src/WaitForHelper.ts 0ms (unchanged) (cached)
tests/browser.test.ts 0ms (unchanged) (cached)
tests/check-for-updates.test.ts 0ms (unchanged) (cached)
tests/cli.test.ts 0ms (unchanged) (cached)
tests/daemon/client.test.ts 0ms (unchanged) (cached)
tests/daemon/utils.test.ts 0ms (unchanged) (cached)
tests/DevtoolsUtils.test.ts 0ms (unchanged) (cached)
tests/e2e/chrome-devtools-commands.test.ts 0ms (unchanged) (cached)
tests/e2e/chrome-devtools-disclaimers.test.ts 0ms (unchanged) (cached)
tests/e2e/chrome-devtools-start-stop.test.ts 0ms (unchanged) (cached)
tests/e2e/chrome-devtools-status.test.ts 0ms (unchanged) (cached)
tests/e2e/telemetry.test.ts 0ms (unchanged) (cached)
tests/formatters/ConsoleFormatter.test.ts 0ms (unchanged) (cached)
tests/formatters/ConsoleFormatterGrouping.test.ts 0ms (unchanged) (cached)
tests/formatters/HeapSnapshotFormatter.test.ts 0ms (unchanged) (cached)
tests/formatters/IssueFormatter.test.ts 0ms (unchanged) (cached)
tests/formatters/NetworkFormatter.test.ts 0ms (unchanged) (cached)
tests/formatters/snapshotFormatter.test.ts 0ms (unchanged) (cached)
tests/index.test.ts 0ms (unchanged) (cached)
tests/McpContext.test.ts 0ms (unchanged) (cached)
tests/McpResponse.test.ts 0ms (unchanged) (cached)
tests/PageCollector.test.ts 0ms (unchanged) (cached)
tests/server.ts 0ms (unchanged) (cached)
tests/setup.ts 0ms (unchanged) (cached)
tests/snapshot.ts 0ms (unchanged) (cached)
tests/telemetry/ClearcutLogger.test.ts 0ms (unchanged) (cached)
tests/telemetry/flagUtils.test.ts 0ms (unchanged) (cached)
tests/telemetry/metricUtils.test.ts 0ms (unchanged) (cached)
tests/telemetry/persistence.test.ts 0ms (unchanged) (cached)
tests/telemetry/toolMetricsUtils.test.ts 0ms (unchanged) (cached)
tests/telemetry/watchdog/ClearcutSender.test.ts 0ms (unchanged) (cached)
tests/telemetry/WatchdogClient.test.ts 0ms (unchanged) (cached)
tests/TextSnapshot.test.ts 0ms (unchanged) (cached)
tests/third_party_notices.test.ts 0ms (unchanged) (cached)
tests/tools/console.test.ts 0ms (unchanged) (cached)
tests/tools/emulation.test.ts 0ms (unchanged) (cached)
tests/tools/extensions.test.ts 0ms (unchanged) (cached)
tests/tools/fixtures/extension-content-script/content.js 0ms (unchanged) (cached)
tests/tools/fixtures/extension-content-script/manifest.json 0ms (unchanged) (cached)
tests/tools/fixtures/extension-side-panel/manifest.json 0ms (unchanged) (cached)
tests/tools/fixtures/extension-side-panel/sidepanel.html 0ms (unchanged) (cached)
tests/tools/fixtures/extension-side-panel/sw.js 0ms (unchanged) (cached)
tests/tools/fixtures/extension-sw/manifest.json 0ms (unchanged) (cached)
tests/tools/fixtures/extension-sw/popup.html 0ms (unchanged) (cached)
tests/tools/fixtures/extension-sw/sw.js 0ms (unchanged) (cached)
tests/tools/fixtures/extension/manifest.json 0ms (unchanged) (cached)
tests/tools/fixtures/extension/popup.html 0ms (unchanged) (cached)
tests/tools/inPage.test.ts 0ms (unchanged) (cached)
tests/tools/input.test.ts 0ms (unchanged) (cached)
tests/tools/lighthouse.test.ts 0ms (unchanged) (cached)
tests/tools/memory.test.ts 0ms (unchanged) (cached)
tests/tools/network.test.ts 0ms (unchanged) (cached)
tests/tools/pages.test.ts 0ms (unchanged) (cached)
tests/tools/pagesNavigateAllowlist.test.ts 0ms (unchanged) (cached)
tests/tools/performance.test.ts 0ms (unchanged) (cached)
tests/tools/screencast.test.ts 0ms (unchanged) (cached)
tests/tools/screenshot.test.ts 0ms (unchanged) (cached)
tests/tools/script.test.ts 0ms (unchanged) (cached)
tests/tools/slim/tools.test.ts 0ms (unchanged) (cached)
tests/tools/snapshot.test.ts 0ms (unchanged) (cached)
tests/tools/webmcp.test.ts 0ms (unchanged) (cached)
tests/trace-processing/fixtures/load.ts 0ms (unchanged) (cached)
tests/trace-processing/parse.test.ts 0ms (unchanged) (cached)
tests/utils.ts 0ms (unchanged) (cached)
tests/utils/files.test.ts 0ms (unchanged) (cached)
tsconfig.json 0ms (unchanged) (cached)

  • \

chrome-devtools-mcp@0.23.0 build
tsc && node --experimental-strip-types --no-warnings=ExperimentalWarning scripts/post-build.ts

  • \

chrome-devtools-mcp@0.23.0 test
npm run build && node scripts/test.mjs tests/McpContext.test.ts

chrome-devtools-mcp@0.23.0 build
tsc && node --experimental-strip-types --no-warnings=ExperimentalWarning scripts/post-build.ts

................

  • \

chrome-devtools-mcp@0.23.0 test
npm run build && node scripts/test.mjs

chrome-devtools-mcp@0.23.0 build
tsc && node --experimental-strip-types --no-warnings=ExperimentalWarning scripts/post-build.ts

....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
.X.........X........
.......X............
....................
....................
....................
....................
.

Failed tests:

✖ respects the timeout parameter (555.324208ms)
TypeError [Error]: Cannot read properties of null (reading 'args')
at file:///Users/weigan.huang/codes/ai/chrome-devtools-mcp/build/tests/tools/pages.test.js:421:51
at async file:///Users/weigan.huang/codes/ai/chrome-devtools-mcp/build/tests/utils.js:83:9
at async withBrowser (file:///Users/weigan.huang/codes/ai/chrome-devtools-mcp/build/tests/utils.js:69:5)
at async withMcpContext (file:///Users/weigan.huang/codes/ai/chrome-devtools-mcp/build/tests/utils.js:72:5)
at async TestContext. (file:///Users/weigan.huang/codes/ai/chrome-devtools-mcp/build/tests/tools/pages.test.js:406:13)
at async Test.run (node:internal/test_runner/test:932:9)
at async Suite.processPendingSubtests (node:internal/test_runner/test:629:7)
✖ navigate_page (7020.50975ms)
'1 subtest failed'
✖ pages (33896.335125ms)
'1 subtest failed'

@wolfib
Copy link
Copy Markdown
Contributor

wolfib commented Apr 30, 2026

I am having trouble understanding what this is about. Is this related to a specific bug? It feels like this addresses multiple things in a single PR, could they be separated to make reviewing easier?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants