diff --git a/src/vs/base/browser/ui/contextview/contextview.ts b/src/vs/base/browser/ui/contextview/contextview.ts index e9ccbd8c21675eb56c5d7d93c5556b4bf73f33c8..7924ac6dbe72318d4b42ee6adb2625e38caa0c44 100644 --- a/src/vs/base/browser/ui/contextview/contextview.ts +++ b/src/vs/base/browser/ui/contextview/contextview.ts @@ -216,6 +216,10 @@ export class ContextView extends Disposable { } } + getViewElement(): HTMLElement { + return this.view; + } + layout(): void { if (!this.isVisible()) { return; diff --git a/src/vs/editor/contrib/contextmenu/contextmenu.ts b/src/vs/editor/contrib/contextmenu/contextmenu.ts index 04d3c4c40801c4a22a04da843c507c5e500018b2..8a2a53b8dde0130aa426cecce14d5b1d7216574a 100644 --- a/src/vs/editor/contrib/contextmenu/contextmenu.ts +++ b/src/vs/editor/contrib/contextmenu/contextmenu.ts @@ -49,7 +49,14 @@ export class ContextMenuController implements IEditorContribution { this._toDispose.add(this._editor.onContextMenu((e: IEditorMouseEvent) => this._onContextMenu(e))); this._toDispose.add(this._editor.onMouseWheel((e: IMouseWheelEvent) => { if (this._contextMenuIsBeingShownCount > 0) { - this._contextViewService.hideContextView(); + const view = this._contextViewService.getContextViewElement(); + const target = e.srcElement as HTMLElement; + + // Event triggers on shadow root host first + // Check if the context view is under this host before hiding it #103169 + if (!(target.shadowRoot && dom.getShadowRoot(view) === target.shadowRoot)) { + this._contextViewService.hideContextView(); + } } })); this._toDispose.add(this._editor.onKeyDown((e: IKeyboardEvent) => { diff --git a/src/vs/platform/contextview/browser/contextView.ts b/src/vs/platform/contextview/browser/contextView.ts index 855fe03a334d86b8e1d17f6abe22ba18981c581e..c6511397a9fe0970247f0f6f5f9e605330a5bfdf 100644 --- a/src/vs/platform/contextview/browser/contextView.ts +++ b/src/vs/platform/contextview/browser/contextView.ts @@ -17,6 +17,7 @@ export interface IContextViewService extends IContextViewProvider { showContextView(delegate: IContextViewDelegate, container?: HTMLElement, shadowRoot?: boolean): IDisposable; hideContextView(data?: any): void; + getContextViewElement(): HTMLElement; layout(): void; anchorAlignment?: AnchorAlignment; } diff --git a/src/vs/platform/contextview/browser/contextViewService.ts b/src/vs/platform/contextview/browser/contextViewService.ts index 0d5d61b3d9ffb2fe1f2f49e283c1ca2c17323128..cb7578f0500d9aed7b547989cf31e36b10495bad 100644 --- a/src/vs/platform/contextview/browser/contextViewService.ts +++ b/src/vs/platform/contextview/browser/contextViewService.ts @@ -58,6 +58,10 @@ export class ContextViewService extends Disposable implements IContextViewServic return disposable; } + getContextViewElement(): HTMLElement { + return this.contextView.getViewElement(); + } + layout(): void { this.contextView.layout(); }