Skip to content

fix: preserve code block toolbar visibility during chat streaming#307978

Merged
roblourens merged 1 commit intomicrosoft:mainfrom
maruthang:fix/issue-255290-copy-button-streaming
Apr 7, 2026
Merged

fix: preserve code block toolbar visibility during chat streaming#307978
roblourens merged 1 commit intomicrosoft:mainfrom
maruthang:fix/issue-255290-copy-button-streaming

Conversation

@maruthang
Copy link
Copy Markdown
Contributor

Fixes #255290

Summary

Bug: The copy button on code snippets in chat responses was unclickable while the AI was still streaming, because the toolbar would flicker and lose interactivity.

Root Cause: During streaming, code block DOM elements are briefly detached and reattached as markdown is re-rendered. This causes the browser to lose CSS :hover state, which in turn hides the toolbar (due to a pointer-events: none rule on the non-hovered state). The toolbar becomes invisible and unclickable mid-stream.

Fix: Added JavaScript-based hover tracking (mouseenter/mouseleave listeners) to CodeBlockPart that toggles a force-visibility class on the toolbar element. This class persists across DOM detach/reattach cycles, keeping the toolbar visible and clickable even while streaming. The hover state is also restored in the render path so that re-renders during streaming preserve toolbar visibility.

Changes

  • src/vs/workbench/contrib/chat/browser/widget/chatContentParts/codeBlockPart.ts: Added _isHovered boolean and mouseenter/mouseleave event listeners that toggle force-visibility on the toolbar. Added post-render restore of toolbar visibility when hovered. Integrated with existing dropdown visibility tracking.
  • src/vs/workbench/contrib/chat/test/browser/widget/chatContentParts/chatMarkdownContentPart.test.ts: Added three regression tests verifying that code block content is correctly set during streaming, that re-renders update content properly, and that the code block pool produces correct data across multiple renders.

Testing

  • Added regression tests in chatMarkdownContentPart.test.ts that verify code block text is correctly rendered during streaming and across re-renders
  • All existing tests pass

…crosoft#255290)

Add JavaScript-based hover tracking to CodeBlockPart so the toolbar
remains clickable through DOM detach/reattach cycles during streaming.
Copy link
Copy Markdown
Member

@roblourens roblourens left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, thanks

@roblourens roblourens enabled auto-merge (squash) April 7, 2026 00:17
@roblourens roblourens merged commit 7c4cbc7 into microsoft:main Apr 7, 2026
19 checks passed
@vs-code-engineering vs-code-engineering bot added this to the 1.116.0 milestone Apr 7, 2026
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.

Copy button for code snippets only works after AI finishes streaming response

4 participants