From c2997da2ac72121a46e8e6ce504d5f47495b9ff5 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 30 Sep 2019 14:42:58 +0200 Subject: [PATCH] Gesture.addTarget returns an IDisposable fixes #81630 --- src/vs/base/browser/touch.ts | 10 ++++++++-- src/vs/base/browser/ui/actionbar/actionbar.ts | 2 +- src/vs/base/browser/ui/button/button.ts | 2 +- src/vs/base/browser/ui/dropdown/dropdown.ts | 2 +- src/vs/base/browser/ui/list/listView.ts | 2 +- src/vs/base/browser/ui/list/listWidget.ts | 2 +- src/vs/base/browser/ui/menu/menubar.ts | 4 ++-- src/vs/base/browser/ui/sash/sash.ts | 2 +- src/vs/base/parts/tree/browser/treeView.ts | 4 +++- src/vs/editor/browser/controller/pointerHandler.ts | 2 +- .../browser/parts/editor/noTabsTitleControl.ts | 2 +- .../workbench/browser/parts/editor/tabsTitleControl.ts | 2 +- 12 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/vs/base/browser/touch.ts b/src/vs/base/browser/touch.ts index f1ea0ee56ca..4519d7e0e16 100644 --- a/src/vs/base/browser/touch.ts +++ b/src/vs/base/browser/touch.ts @@ -86,15 +86,21 @@ export class Gesture extends Disposable { this._register(DomUtils.addDisposableListener(document, 'touchmove', (e: TouchEvent) => this.onTouchMove(e))); } - public static addTarget(element: HTMLElement): void { + public static addTarget(element: HTMLElement): IDisposable { if (!Gesture.isTouchDevice()) { - return; + return Disposable.None; } if (!Gesture.INSTANCE) { Gesture.INSTANCE = new Gesture(); } Gesture.INSTANCE.targets.push(element); + + return { + dispose: () => { + Gesture.INSTANCE.targets = Gesture.INSTANCE.targets.filter(t => t !== element); + } + }; } @memoize diff --git a/src/vs/base/browser/ui/actionbar/actionbar.ts b/src/vs/base/browser/ui/actionbar/actionbar.ts index 38ec0a60a51..43c76fb28d4 100644 --- a/src/vs/base/browser/ui/actionbar/actionbar.ts +++ b/src/vs/base/browser/ui/actionbar/actionbar.ts @@ -103,7 +103,7 @@ export class BaseActionViewItem extends Disposable implements IActionViewItem { render(container: HTMLElement): void { this.element = container; - Gesture.addTarget(container); + this._register(Gesture.addTarget(container)); const enableDragging = this.options && this.options.draggable; if (enableDragging) { diff --git a/src/vs/base/browser/ui/button/button.ts b/src/vs/base/browser/ui/button/button.ts index eeb7724e5fd..a982d959b1c 100644 --- a/src/vs/base/browser/ui/button/button.ts +++ b/src/vs/base/browser/ui/button/button.ts @@ -63,7 +63,7 @@ export class Button extends Disposable { container.appendChild(this._element); - Gesture.addTarget(this._element); + this._register(Gesture.addTarget(this._element)); [DOM.EventType.CLICK, EventType.Tap].forEach(eventType => { this._register(DOM.addDisposableListener(this._element, eventType, e => { diff --git a/src/vs/base/browser/ui/dropdown/dropdown.ts b/src/vs/base/browser/ui/dropdown/dropdown.ts index 4390ad2ff27..dd219559a59 100644 --- a/src/vs/base/browser/ui/dropdown/dropdown.ts +++ b/src/vs/base/browser/ui/dropdown/dropdown.ts @@ -83,7 +83,7 @@ export class BaseDropdown extends ActionRunner { this._register(cleanupFn); } - Gesture.addTarget(this._label); + this._register(Gesture.addTarget(this._label)); } get element(): HTMLElement { diff --git a/src/vs/base/browser/ui/list/listView.ts b/src/vs/base/browser/ui/list/listView.ts index 0d2404422c8..937fc0c870d 100644 --- a/src/vs/base/browser/ui/list/listView.ts +++ b/src/vs/base/browser/ui/list/listView.ts @@ -236,7 +236,7 @@ export class ListView implements ISpliceable, IDisposable { this.rowsContainer = document.createElement('div'); this.rowsContainer.className = 'monaco-list-rows'; - Gesture.addTarget(this.rowsContainer); + this.disposables.add(Gesture.addTarget(this.rowsContainer)); this.scrollableElement = this.disposables.add(new ScrollableElement(this.rowsContainer, { alwaysConsumeMouseWheel: true, diff --git a/src/vs/base/browser/ui/list/listWidget.ts b/src/vs/base/browser/ui/list/listWidget.ts index 51d1b8b0732..a8a2a63da47 100644 --- a/src/vs/base/browser/ui/list/listWidget.ts +++ b/src/vs/base/browser/ui/list/listWidget.ts @@ -542,7 +542,7 @@ export class MouseController implements IDisposable { list.onContextMenu(this.onContextMenu, this, this.disposables); list.onMouseDblClick(this.onDoubleClick, this, this.disposables); list.onTouchStart(this.onMouseDown, this, this.disposables); - Gesture.addTarget(list.getHTMLElement()); + this.disposables.add(Gesture.addTarget(list.getHTMLElement())); } list.onMouseClick(this.onPointer, this, this.disposables); diff --git a/src/vs/base/browser/ui/menu/menubar.ts b/src/vs/base/browser/ui/menu/menubar.ts index 694bcd729e6..3d3b3e5cb57 100644 --- a/src/vs/base/browser/ui/menu/menubar.ts +++ b/src/vs/base/browser/ui/menu/menubar.ts @@ -238,7 +238,7 @@ export class MenuBar extends Disposable { } })); - Gesture.addTarget(buttonElement); + this._register(Gesture.addTarget(buttonElement)); this._register(DOM.addDisposableListener(buttonElement, EventType.Tap, (e: GestureEvent) => { // Ignore this touch if the menu is touched if (this.isOpen && this.focusedMenu && this.focusedMenu.holder && DOM.isAncestor(e.initialTarget as HTMLElement, this.focusedMenu.holder)) { @@ -322,7 +322,7 @@ export class MenuBar extends Disposable { } })); - Gesture.addTarget(buttonElement); + this._register(Gesture.addTarget(buttonElement)); this._register(DOM.addDisposableListener(buttonElement, EventType.Tap, (e: GestureEvent) => { // Ignore this touch if the menu is touched if (this.isOpen && this.focusedMenu && this.focusedMenu.holder && DOM.isAncestor(e.initialTarget as HTMLElement, this.focusedMenu.holder)) { diff --git a/src/vs/base/browser/ui/sash/sash.ts b/src/vs/base/browser/ui/sash/sash.ts index 16279b74af9..7c2a52a89bf 100644 --- a/src/vs/base/browser/ui/sash/sash.ts +++ b/src/vs/base/browser/ui/sash/sash.ts @@ -139,7 +139,7 @@ export class Sash extends Disposable { this._register(domEvent(this.el, 'mousedown')(this.onMouseDown, this)); this._register(domEvent(this.el, 'dblclick')(this.onMouseDoubleClick, this)); - Gesture.addTarget(this.el); + this._register(Gesture.addTarget(this.el)); this._register(domEvent(this.el, EventType.Start)(this.onTouchStart, this)); if (isIPad) { diff --git a/src/vs/base/parts/tree/browser/treeView.ts b/src/vs/base/parts/tree/browser/treeView.ts index 9537065aaf6..bdd8f7da8e8 100644 --- a/src/vs/base/parts/tree/browser/treeView.ts +++ b/src/vs/base/parts/tree/browser/treeView.ts @@ -437,6 +437,7 @@ export class TreeView extends HeightMap { private shouldInvalidateDropReaction: boolean; private currentDropTargets: ViewItem[] | null = null; private currentDropDisposable: Lifecycle.IDisposable = Lifecycle.Disposable.None; + private gestureDisposable: Lifecycle.IDisposable = Lifecycle.Disposable.None; private dragAndDropScrollInterval: number | null = null; private dragAndDropScrollTimeout: number | null = null; private dragAndDropMouseY: number | null = null; @@ -523,7 +524,7 @@ export class TreeView extends HeightMap { this.wrapper.style.msTouchAction = 'none'; this.wrapper.style.msContentZooming = 'none'; } else { - Touch.Gesture.addTarget(this.wrapper); + this.gestureDisposable = Touch.Gesture.addTarget(this.wrapper); } this.rowsContainer = document.createElement('div'); @@ -1675,6 +1676,7 @@ export class TreeView extends HeightMap { if (this.context.cache) { this.context.cache.dispose(); } + this.gestureDisposable.dispose(); super.dispose(); } diff --git a/src/vs/editor/browser/controller/pointerHandler.ts b/src/vs/editor/browser/controller/pointerHandler.ts index e4a4a03146f..51988d09968 100644 --- a/src/vs/editor/browser/controller/pointerHandler.ts +++ b/src/vs/editor/browser/controller/pointerHandler.ts @@ -190,7 +190,7 @@ class TouchHandler extends MouseHandler { constructor(context: ViewContext, viewController: ViewController, viewHelper: IPointerHandlerHelper) { super(context, viewController, viewHelper); - Gesture.addTarget(this.viewHelper.linesContentDomNode); + this._register(Gesture.addTarget(this.viewHelper.linesContentDomNode)); this._register(dom.addDisposableListener(this.viewHelper.linesContentDomNode, EventType.Tap, (e) => this.onTap(e))); this._register(dom.addDisposableListener(this.viewHelper.linesContentDomNode, EventType.Change, (e) => this.onChange(e))); diff --git a/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts index 50995662333..ff9fde91e90 100644 --- a/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/noTabsTitleControl.ts @@ -34,7 +34,7 @@ export class NoTabsTitleControl extends TitleControl { this.registerContainerListeners(); // Gesture Support - Gesture.addTarget(this.titleContainer); + this._register(Gesture.addTarget(this.titleContainer)); const labelContainer = document.createElement('div'); addClass(labelContainer, 'label-container'); diff --git a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts index 6a8daa4b094..691ae0570ac 100644 --- a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts @@ -425,7 +425,7 @@ export class TabsTitleControl extends TitleControl { addClass(tabContainer, 'tab'); // Gesture Support - Gesture.addTarget(tabContainer); + this._register(Gesture.addTarget(tabContainer)); // Tab Border Top const tabBorderTopContainer = document.createElement('div'); -- GitLab