Skip to content

Commit a8b2f62

Browse files
committed
Fix microsoft#84851. Base elements should be ignored by Gesture by default.
1 parent 698b70a commit a8b2f62

6 files changed

Lines changed: 45 additions & 1 deletion

File tree

src/vs/base/browser/touch.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ export class Gesture extends Disposable {
7171

7272
private dispatched = false;
7373
private targets: HTMLElement[];
74+
private ignoreTargets: HTMLElement[];
7475
private handle: IDisposable | null;
7576

7677
private activeTouches: { [id: number]: TouchData; };
@@ -81,6 +82,7 @@ export class Gesture extends Disposable {
8182
this.activeTouches = {};
8283
this.handle = null;
8384
this.targets = [];
85+
this.ignoreTargets = [];
8486
this._register(DomUtils.addDisposableListener(document, 'touchstart', (e: TouchEvent) => this.onTouchStart(e)));
8587
this._register(DomUtils.addDisposableListener(document, 'touchend', (e: TouchEvent) => this.onTouchEnd(e)));
8688
this._register(DomUtils.addDisposableListener(document, 'touchmove', (e: TouchEvent) => this.onTouchMove(e)));
@@ -103,6 +105,23 @@ export class Gesture extends Disposable {
103105
};
104106
}
105107

108+
public static ignoreTarget(element: HTMLElement): IDisposable {
109+
if (!Gesture.isTouchDevice()) {
110+
return Disposable.None;
111+
}
112+
if (!Gesture.INSTANCE) {
113+
Gesture.INSTANCE = new Gesture();
114+
}
115+
116+
Gesture.INSTANCE.ignoreTargets.push(element);
117+
118+
return {
119+
dispose: () => {
120+
Gesture.INSTANCE.ignoreTargets = Gesture.INSTANCE.ignoreTargets.filter(t => t !== element);
121+
}
122+
};
123+
}
124+
106125
@memoize
107126
private static isTouchDevice(): boolean {
108127
return 'ontouchstart' in window as any || navigator.maxTouchPoints > 0 || window.navigator.msMaxTouchPoints > 0;
@@ -228,6 +247,12 @@ export class Gesture extends Disposable {
228247
}
229248

230249
private dispatchEvent(event: GestureEvent): void {
250+
for (let i = 0; i < this.ignoreTargets.length; i++) {
251+
if (event.initialTarget instanceof Node && this.ignoreTargets[i].contains(event.initialTarget)) {
252+
return;
253+
}
254+
}
255+
231256
this.targets.forEach(target => {
232257
if (event.initialTarget instanceof Node && target.contains(event.initialTarget)) {
233258
target.dispatchEvent(event);

src/vs/base/browser/ui/checkbox/checkbox.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ export class Checkbox extends Widget {
113113
ev.preventDefault();
114114
});
115115

116+
this.ignoreGesture(this.domNode);
117+
116118
this.onkeydown(this.domNode, (keyboardEvent) => {
117119
if (keyboardEvent.keyCode === KeyCode.Space || keyboardEvent.keyCode === KeyCode.Enter) {
118120
this.checked = !this._checked;

src/vs/base/browser/ui/inputbox/inputBox.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,8 @@ export class InputBox extends Widget {
220220
});
221221
}
222222

223+
this.ignoreGesture(this.input);
224+
223225
setTimeout(() => this.updateMirror(), 0);
224226

225227
// Support actions

src/vs/base/browser/ui/selectBox/selectBoxNative.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import * as dom from 'vs/base/browser/dom';
1010
import * as arrays from 'vs/base/common/arrays';
1111
import { ISelectBoxDelegate, ISelectOptionItem, ISelectBoxOptions, ISelectBoxStyles, ISelectData } from 'vs/base/browser/ui/selectBox/selectBox';
1212
import { isMacintosh } from 'vs/base/common/platform';
13+
import { Gesture, EventType } from 'vs/base/browser/touch';
1314

1415
export class SelectBoxNative extends Disposable implements ISelectBoxDelegate {
1516

@@ -43,6 +44,12 @@ export class SelectBoxNative extends Disposable implements ISelectBoxDelegate {
4344
}
4445

4546
private registerListeners() {
47+
this._register(Gesture.addTarget(this.selectElement));
48+
[EventType.Tap].forEach(eventType => {
49+
this._register(dom.addDisposableListener(this.selectElement, eventType, (e) => {
50+
this.selectElement.focus();
51+
}));
52+
});
4653

4754
this._register(dom.addStandardDisposableListener(this.selectElement, 'change', (e) => {
4855
this.selectElement.title = e.target.value;

src/vs/base/browser/ui/widget.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import * as dom from 'vs/base/browser/dom';
77
import { IKeyboardEvent, StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
88
import { IMouseEvent, StandardMouseEvent } from 'vs/base/browser/mouseEvent';
99
import { Disposable } from 'vs/base/common/lifecycle';
10+
import { Gesture } from 'vs/base/browser/touch';
1011

1112
export abstract class Widget extends Disposable {
1213

@@ -49,4 +50,8 @@ export abstract class Widget extends Disposable {
4950
protected onchange(domNode: HTMLElement, listener: (e: Event) => void): void {
5051
this._register(dom.addDisposableListener(domNode, dom.EventType.CHANGE, listener));
5152
}
53+
54+
protected ignoreGesture(domNode: HTMLElement): void {
55+
Gesture.ignoreTarget(domNode);
56+
}
5257
}

src/vs/workbench/contrib/preferences/browser/settingsTree.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import { SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU } from 'vs/workbench/contrib/
4646
import { ISetting, ISettingsGroup, SettingValueType } from 'vs/workbench/services/preferences/common/preferences';
4747
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService';
4848
import { isArray } from 'vs/base/common/types';
49+
import { BrowserFeatures } from 'vs/base/browser/canIUse';
4950

5051
const $ = DOM.$;
5152

@@ -909,7 +910,9 @@ export class SettingEnumRenderer extends AbstractSettingRenderer implements ITre
909910
renderTemplate(container: HTMLElement): ISettingEnumItemTemplate {
910911
const common = this.renderCommonTemplate(null, container, 'enum');
911912

912-
const selectBox = new SelectBox([], 0, this._contextViewService, undefined, { useCustomDrawn: true });
913+
const selectBox = new SelectBox([], 0, this._contextViewService, undefined, {
914+
useCustomDrawn: !BrowserFeatures.pointerEvents
915+
});
913916

914917
common.toDispose.push(selectBox);
915918
common.toDispose.push(attachSelectBoxStyler(selectBox, this._themeService, {

0 commit comments

Comments
 (0)