Fixed keydown event handling problem with shadow DOM.

Editable elements in shadow DOMs can not be detected in old version.
This commit is contained in:
Nicky Chen 2020-09-23 12:59:19 +08:00
parent 139c8a8cb5
commit 252e258a59
2 changed files with 25 additions and 1 deletions

View File

@ -19,6 +19,7 @@ import {
AutoPrintRegExp,
DEFAULT_SCALE_VALUE,
EventBus,
getActiveOrFocusedElement,
getPDFFileNameFromURL,
isValidRotation,
isValidScrollMode,
@ -2819,7 +2820,7 @@ function webViewerKeyDown(evt) {
// Some shortcuts should not get handled if a control/input element
// is selected.
const curElement = document.activeElement || document.querySelector(":focus");
const curElement = getActiveOrFocusedElement();
const curElementTagName = curElement && curElement.tagName.toUpperCase();
if (
curElementTagName === "INPUT" ||

View File

@ -985,6 +985,28 @@ function moveToEndOfArray(arr, condition) {
}
}
/**
* Get the active or focused element in current DOM.
*
* Recursively search for the truly active or focused element in case there are
* shadow DOMs.
*
* @returns {Element} the truly active or focused element.
*/
function getActiveOrFocusedElement() {
let curRoot = document;
let curActiveOrFocused =
curRoot.activeElement || curRoot.querySelector(":focus");
while (curActiveOrFocused && curActiveOrFocused.shadowRoot) {
curRoot = curActiveOrFocused.shadowRoot;
curActiveOrFocused =
curRoot.activeElement || curRoot.querySelector(":focus");
}
return curActiveOrFocused;
}
export {
AutoPrintRegExp,
CSS_UNITS,
@ -1026,4 +1048,5 @@ export {
WaitOnType,
waitOnEventOrTimeout,
moveToEndOfArray,
getActiveOrFocusedElement,
};