This commit is contained in:
58
node_modules/@react-aria/utils/src/isVirtualEvent.ts
generated
vendored
Normal file
58
node_modules/@react-aria/utils/src/isVirtualEvent.ts
generated
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
/*
|
||||
* Copyright 2022 Adobe. All rights reserved.
|
||||
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License. You may obtain a copy
|
||||
* of the License at http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software distributed under
|
||||
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
|
||||
* OF ANY KIND, either express or implied. See the License for the specific language
|
||||
* governing permissions and limitations under the License.
|
||||
*/
|
||||
|
||||
import {isAndroid} from './platform';
|
||||
|
||||
// Original licensing for the following method can be found in the
|
||||
// NOTICE file in the root directory of this source tree.
|
||||
// See https://github.com/facebook/react/blob/3c713d513195a53788b3f8bb4b70279d68b15bcc/packages/react-interactions/events/src/dom/shared/index.js#L74-L87
|
||||
|
||||
// Keyboards, Assistive Technologies, and element.click() all produce a "virtual"
|
||||
// click event. This is a method of inferring such clicks. Every browser except
|
||||
// IE 11 only sets a zero value of "detail" for click events that are "virtual".
|
||||
// However, IE 11 uses a zero value for all click events. For IE 11 we rely on
|
||||
// the quirk that it produces click events that are of type PointerEvent, and
|
||||
// where only the "virtual" click lacks a pointerType field.
|
||||
|
||||
export function isVirtualClick(event: MouseEvent | PointerEvent): boolean {
|
||||
// JAWS/NVDA with Firefox.
|
||||
if ((event as any).mozInputSource === 0 && event.isTrusted) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Android TalkBack's detail value varies depending on the event listener providing the event so we have specific logic here instead
|
||||
// If pointerType is defined, event is from a click listener. For events from mousedown listener, detail === 0 is a sufficient check
|
||||
// to detect TalkBack virtual clicks.
|
||||
if (isAndroid() && (event as PointerEvent).pointerType) {
|
||||
return event.type === 'click' && event.buttons === 1;
|
||||
}
|
||||
|
||||
return event.detail === 0 && !(event as PointerEvent).pointerType;
|
||||
}
|
||||
|
||||
export function isVirtualPointerEvent(event: PointerEvent): boolean {
|
||||
// If the pointer size is zero, then we assume it's from a screen reader.
|
||||
// Android TalkBack double tap will sometimes return a event with width and height of 1
|
||||
// and pointerType === 'mouse' so we need to check for a specific combination of event attributes.
|
||||
// Cannot use "event.pressure === 0" as the sole check due to Safari pointer events always returning pressure === 0
|
||||
// instead of .5, see https://bugs.webkit.org/show_bug.cgi?id=206216. event.pointerType === 'mouse' is to distingush
|
||||
// Talkback double tap from Windows Firefox touch screen press
|
||||
return (
|
||||
(!isAndroid() && event.width === 0 && event.height === 0) ||
|
||||
(event.width === 1 &&
|
||||
event.height === 1 &&
|
||||
event.pressure === 0 &&
|
||||
event.detail === 0 &&
|
||||
event.pointerType === 'mouse'
|
||||
)
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user