diff --git a/src/vs/base/browser/dom.ts b/src/vs/base/browser/dom.ts index 88afb682b93..edb106eb05d 100644 --- a/src/vs/base/browser/dom.ts +++ b/src/vs/base/browser/dom.ts @@ -122,35 +122,6 @@ export function addDisposableGenericMouseMoveListener(node: EventTarget, handler export function addDisposableGenericMouseUpListener(node: EventTarget, handler: (event: any) => void, useCapture?: boolean): IDisposable { return addDisposableListener(node, platform.isIOS && BrowserFeatures.pointerEvents ? EventType.POINTER_UP : EventType.MOUSE_UP, handler, useCapture); } -export function addDisposableNonBubblingMouseOutListener(node: Element, handler: (event: MouseEvent) => void): IDisposable { - return addDisposableListener(node, 'mouseout', (e: MouseEvent) => { - // Mouse out bubbles, so this is an attempt to ignore faux mouse outs coming from children elements - let toElement: Node | null = (e.relatedTarget); - while (toElement && toElement !== node) { - toElement = toElement.parentNode; - } - if (toElement === node) { - return; - } - - handler(e); - }); -} - -export function addDisposableNonBubblingPointerOutListener(node: Element, handler: (event: MouseEvent) => void): IDisposable { - return addDisposableListener(node, 'pointerout', (e: MouseEvent) => { - // Mouse out bubbles, so this is an attempt to ignore faux mouse outs coming from children elements - let toElement: Node | null = (e.relatedTarget); - while (toElement && toElement !== node) { - toElement = toElement.parentNode; - } - if (toElement === node) { - return; - } - - handler(e); - }); -} export function createEventEmitter(target: HTMLElement, type: K, options?: boolean | AddEventListenerOptions): event.Emitter { let domListener: DomListener | null = null; @@ -870,6 +841,7 @@ export const EventType = { POINTER_UP: 'pointerup', POINTER_DOWN: 'pointerdown', POINTER_MOVE: 'pointermove', + POINTER_LEAVE: 'pointerleave', CONTEXT_MENU: 'contextmenu', WHEEL: 'wheel', // Keyboard diff --git a/src/vs/base/browser/ui/scrollbar/scrollableElement.ts b/src/vs/base/browser/ui/scrollbar/scrollableElement.ts index f83c34fe519..c7bffd0c8d6 100644 --- a/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +++ b/src/vs/base/browser/ui/scrollbar/scrollableElement.ts @@ -232,7 +232,7 @@ export abstract class AbstractScrollableElement extends Widget { this._setListeningToMouseWheel(this._options.handleMouseWheel); this.onmouseover(this._listenOnDomNode, (e) => this._onMouseOver(e)); - this.onnonbubblingmouseout(this._listenOnDomNode, (e) => this._onMouseOut(e)); + this.onmouseleave(this._listenOnDomNode, (e) => this._onMouseLeave(e)); this._hideTimeout = this._register(new TimeoutTimer()); this._isDragging = false; @@ -525,7 +525,7 @@ export abstract class AbstractScrollableElement extends Widget { this._hide(); } - private _onMouseOut(e: IMouseEvent): void { + private _onMouseLeave(e: IMouseEvent): void { this._mouseIsOver = false; this._hide(); } diff --git a/src/vs/base/browser/ui/widget.ts b/src/vs/base/browser/ui/widget.ts index 3b17f5bce8f..5a994a6f4be 100644 --- a/src/vs/base/browser/ui/widget.ts +++ b/src/vs/base/browser/ui/widget.ts @@ -23,8 +23,8 @@ export abstract class Widget extends Disposable { this._register(dom.addDisposableListener(domNode, dom.EventType.MOUSE_OVER, (e: MouseEvent) => listener(new StandardMouseEvent(e)))); } - protected onnonbubblingmouseout(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void { - this._register(dom.addDisposableNonBubblingMouseOutListener(domNode, (e: MouseEvent) => listener(new StandardMouseEvent(e)))); + protected onmouseleave(domNode: HTMLElement, listener: (e: IMouseEvent) => void): void { + this._register(dom.addDisposableListener(domNode, dom.EventType.MOUSE_LEAVE, (e: MouseEvent) => listener(new StandardMouseEvent(e)))); } protected onkeydown(domNode: HTMLElement, listener: (e: IKeyboardEvent) => void): void { diff --git a/src/vs/editor/browser/editorDom.ts b/src/vs/editor/browser/editorDom.ts index 501260e7263..cd36e6c200e 100644 --- a/src/vs/editor/browser/editorDom.ts +++ b/src/vs/editor/browser/editorDom.ts @@ -173,7 +173,7 @@ export class EditorMouseEventFactory { } public onMouseLeave(target: HTMLElement, callback: (e: EditorMouseEvent) => void): IDisposable { - return dom.addDisposableNonBubblingMouseOutListener(target, (e: MouseEvent) => { + return dom.addDisposableListener(target, dom.EventType.MOUSE_LEAVE, (e: MouseEvent) => { callback(this._create(e)); }); } @@ -208,7 +208,7 @@ export class EditorPointerEventFactory { } public onPointerLeave(target: HTMLElement, callback: (e: EditorMouseEvent) => void): IDisposable { - return dom.addDisposableNonBubblingPointerOutListener(target, (e: MouseEvent) => { + return dom.addDisposableListener(target, dom.EventType.POINTER_LEAVE, (e: MouseEvent) => { callback(this._create(e)); }); } diff --git a/src/vs/editor/contrib/find/browser/findOptionsWidget.ts b/src/vs/editor/contrib/find/browser/findOptionsWidget.ts index 07500d81df2..ca04b53497d 100644 --- a/src/vs/editor/contrib/find/browser/findOptionsWidget.ts +++ b/src/vs/editor/contrib/find/browser/findOptionsWidget.ts @@ -113,7 +113,7 @@ export class FindOptionsWidget extends Widget implements IOverlayWidget { } })); - this._register(dom.addDisposableNonBubblingMouseOutListener(this._domNode, (e) => this._onMouseOut())); + this._register(dom.addDisposableListener(this._domNode, dom.EventType.MOUSE_LEAVE, (e) => this._onMouseLeave())); this._register(dom.addDisposableListener(this._domNode, 'mouseover', (e) => this._onMouseOver())); this._applyTheme(themeService.getColorTheme()); @@ -160,7 +160,7 @@ export class FindOptionsWidget extends Widget implements IOverlayWidget { this._hideSoon.schedule(); } - private _onMouseOut(): void { + private _onMouseLeave(): void { this._hideSoon.schedule(); } diff --git a/src/vs/workbench/contrib/terminal/browser/widgets/environmentVariableInfoWidget.ts b/src/vs/workbench/contrib/terminal/browser/widgets/environmentVariableInfoWidget.ts index c6af5f5c82a..18062e6d456 100644 --- a/src/vs/workbench/contrib/terminal/browser/widgets/environmentVariableInfoWidget.ts +++ b/src/vs/workbench/contrib/terminal/browser/widgets/environmentVariableInfoWidget.ts @@ -59,7 +59,7 @@ export class EnvironmentVariableInfoWidget extends Widget implements ITerminalWi } }); }); - this.onnonbubblingmouseout(this._domNode, () => { + this.onmouseleave(this._domNode, () => { scheduler.cancel(); this._mouseMoveListener?.dispose(); }); diff --git a/src/vs/workbench/services/hover/browser/hoverWidget.ts b/src/vs/workbench/services/hover/browser/hoverWidget.ts index 738c5acb245..76d9654ef27 100644 --- a/src/vs/workbench/services/hover/browser/hoverWidget.ts +++ b/src/vs/workbench/services/hover/browser/hoverWidget.ts @@ -520,7 +520,7 @@ class CompositeMouseTracker extends Widget { ) { super(); this._elements.forEach(n => this.onmouseover(n, () => this._onTargetMouseOver())); - this._elements.forEach(n => this.onnonbubblingmouseout(n, () => this._onTargetMouseOut())); + this._elements.forEach(n => this.onmouseleave(n, () => this._onTargetMouseLeave())); } private _onTargetMouseOver(): void { @@ -528,7 +528,7 @@ class CompositeMouseTracker extends Widget { this._clearEvaluateMouseStateTimeout(); } - private _onTargetMouseOut(): void { + private _onTargetMouseLeave(): void { this._isMouseIn = false; this._evaluateMouseState(); }