Add workaround for Firefox bug not detecting pen input type correctly (#821)

This commit is contained in:
toasted-nutbread 2020-09-13 11:58:07 -04:00 committed by GitHub
parent 5b49cf4398
commit a12c4a1dd7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -62,6 +62,7 @@ class TextScanner extends EventDispatcher {
this._preventScroll = false; this._preventScroll = false;
this._penPointerPressed = false; this._penPointerPressed = false;
this._penPointerReleased = false; this._penPointerReleased = false;
this._pointerIdTypeMap = new Map();
this._canClearSelection = true; this._canClearSelection = true;
} }
@ -101,6 +102,7 @@ class TextScanner extends EventDispatcher {
this._preventScroll = false; this._preventScroll = false;
this._penPointerPressed = false; this._penPointerPressed = false;
this._penPointerReleased = false; this._penPointerReleased = false;
this._pointerIdTypeMap.clear();
this._enabledValue = value; this._enabledValue = value;
@ -389,8 +391,13 @@ class TextScanner extends EventDispatcher {
} }
_onPointerOver(e) { _onPointerOver(e) {
if (!e.isPrimary) { return; } const {pointerType, pointerId, isPrimary} = e;
switch (e.pointerType) { if (pointerType === 'pen') {
this._pointerIdTypeMap.set(pointerId, pointerType);
}
if (!isPrimary) { return; }
switch (pointerType) {
case 'mouse': return this._onMousePointerOver(e); case 'mouse': return this._onMousePointerOver(e);
case 'touch': return this._onTouchPointerOver(e); case 'touch': return this._onTouchPointerOver(e);
case 'pen': return this._onPenPointerOver(e); case 'pen': return this._onPenPointerOver(e);
@ -399,7 +406,7 @@ class TextScanner extends EventDispatcher {
_onPointerDown(e) { _onPointerDown(e) {
if (!e.isPrimary) { return; } if (!e.isPrimary) { return; }
switch (e.pointerType) { switch (this._getPointerEventType(e)) {
case 'mouse': return this._onMousePointerDown(e); case 'mouse': return this._onMousePointerDown(e);
case 'touch': return this._onTouchPointerDown(e); case 'touch': return this._onTouchPointerDown(e);
case 'pen': return this._onPenPointerDown(e); case 'pen': return this._onPenPointerDown(e);
@ -408,7 +415,7 @@ class TextScanner extends EventDispatcher {
_onPointerMove(e) { _onPointerMove(e) {
if (!e.isPrimary) { return; } if (!e.isPrimary) { return; }
switch (e.pointerType) { switch (this._getPointerEventType(e)) {
case 'mouse': return this._onMousePointerMove(e); case 'mouse': return this._onMousePointerMove(e);
case 'touch': return this._onTouchPointerMove(e); case 'touch': return this._onTouchPointerMove(e);
case 'pen': return this._onPenPointerMove(e); case 'pen': return this._onPenPointerMove(e);
@ -417,7 +424,7 @@ class TextScanner extends EventDispatcher {
_onPointerUp(e) { _onPointerUp(e) {
if (!e.isPrimary) { return; } if (!e.isPrimary) { return; }
switch (e.pointerType) { switch (this._getPointerEventType(e)) {
case 'mouse': return this._onMousePointerUp(e); case 'mouse': return this._onMousePointerUp(e);
case 'touch': return this._onTouchPointerUp(e); case 'touch': return this._onTouchPointerUp(e);
case 'pen': return this._onPenPointerUp(e); case 'pen': return this._onPenPointerUp(e);
@ -425,6 +432,7 @@ class TextScanner extends EventDispatcher {
} }
_onPointerCancel(e) { _onPointerCancel(e) {
this._pointerIdTypeMap.delete(e.pointerId);
if (!e.isPrimary) { return; } if (!e.isPrimary) { return; }
switch (e.pointerType) { switch (e.pointerType) {
case 'mouse': return this._onMousePointerCancel(e); case 'mouse': return this._onMousePointerCancel(e);
@ -434,6 +442,7 @@ class TextScanner extends EventDispatcher {
} }
_onPointerOut(e) { _onPointerOut(e) {
this._pointerIdTypeMap.delete(e.pointerId);
if (!e.isPrimary) { return; } if (!e.isPrimary) { return; }
switch (e.pointerType) { switch (e.pointerType) {
case 'mouse': return this._onMousePointerOut(e); case 'mouse': return this._onMousePointerOut(e);
@ -812,4 +821,10 @@ class TextScanner extends EventDispatcher {
if (pen) { set.add('pen'); } if (pen) { set.add('pen'); }
return set; return set;
} }
_getPointerEventType(e) {
// Workaround for Firefox bug not detecting certain 'touch' events as 'pen' events.
const cachedPointerType = this._pointerIdTypeMap.get(e.pointerId);
return (typeof cachedPointerType !== 'undefined' ? cachedPointerType : e.pointerType);
}
} }