Merge pull request #17041 from calixteman/rm_timeouts

[Editor] Clear the different timeouts when destroying
This commit is contained in:
calixteman 2023-09-28 12:27:20 +02:00 committed by GitHub
commit 2daf9515b3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 47 additions and 10 deletions

View File

@ -61,6 +61,8 @@ class AnnotationEditorLayer {
#boundPointerdown = this.pointerdown.bind(this); #boundPointerdown = this.pointerdown.bind(this);
#editorFocusTimeoutId = null;
#editors = new Map(); #editors = new Map();
#hadPointerDown = false; #hadPointerDown = false;
@ -329,13 +331,6 @@ class AnnotationEditorLayer {
this.detach(editor); this.detach(editor);
this.#uiManager.removeEditor(editor); this.#uiManager.removeEditor(editor);
if (editor.div.contains(document.activeElement)) {
setTimeout(() => {
// When the div is removed from DOM the focus can move on the
// document.body, so we need to move it back to the main container.
this.#uiManager.focusMainContainer();
}, 0);
}
editor.div.remove(); editor.div.remove();
editor.isAttachedToDOM = false; editor.isAttachedToDOM = false;
@ -396,13 +391,14 @@ class AnnotationEditorLayer {
} }
const { activeElement } = document; const { activeElement } = document;
if (editor.div.contains(activeElement)) { if (editor.div.contains(activeElement) && !this.#editorFocusTimeoutId) {
// When the div is moved in the DOM the focus can move somewhere else, // When the div is moved in the DOM the focus can move somewhere else,
// so we want to be sure that the focus will stay on the editor but we // so we want to be sure that the focus will stay on the editor but we
// don't want to call any focus callbacks, hence we disable them and only // don't want to call any focus callbacks, hence we disable them and only
// re-enable them when the editor has the focus. // re-enable them when the editor has the focus.
editor._focusEventsAllowed = false; editor._focusEventsAllowed = false;
setTimeout(() => { this.#editorFocusTimeoutId = setTimeout(() => {
this.#editorFocusTimeoutId = null;
if (!editor.div.contains(document.activeElement)) { if (!editor.div.contains(document.activeElement)) {
editor.div.addEventListener( editor.div.addEventListener(
"focusin", "focusin",
@ -683,6 +679,11 @@ class AnnotationEditorLayer {
this.#uiManager.setActiveEditor(null); this.#uiManager.setActiveEditor(null);
} }
if (this.#editorFocusTimeoutId) {
clearTimeout(this.#editorFocusTimeoutId);
this.#editorFocusTimeoutId = null;
}
for (const editor of this.#editors.values()) { for (const editor of this.#editors.values()) {
this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv); this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv);
editor.setParent(null); editor.setParent(null);

View File

@ -39,6 +39,8 @@ class InkEditor extends AnnotationEditor {
#boundCanvasPointerdown = this.canvasPointerdown.bind(this); #boundCanvasPointerdown = this.canvasPointerdown.bind(this);
#canvasContextMenuTimeoutId = null;
#currentPath2D = new Path2D(); #currentPath2D = new Path2D();
#disableEditing = false; #disableEditing = false;
@ -259,6 +261,11 @@ class InkEditor extends AnnotationEditor {
this.canvas.remove(); this.canvas.remove();
this.canvas = null; this.canvas = null;
if (this.#canvasContextMenuTimeoutId) {
clearTimeout(this.#canvasContextMenuTimeoutId);
this.#canvasContextMenuTimeoutId = null;
}
this.#observer.disconnect(); this.#observer.disconnect();
this.#observer = null; this.#observer = null;
@ -706,7 +713,11 @@ class InkEditor extends AnnotationEditor {
// Slight delay to avoid the context menu to appear (it can happen on a long // Slight delay to avoid the context menu to appear (it can happen on a long
// tap with a pen). // tap with a pen).
setTimeout(() => { if (this.#canvasContextMenuTimeoutId) {
clearTimeout(this.#canvasContextMenuTimeoutId);
}
this.#canvasContextMenuTimeoutId = setTimeout(() => {
this.#canvasContextMenuTimeoutId = null;
this.canvas.removeEventListener("contextmenu", noContextMenu); this.canvas.removeEventListener("contextmenu", noContextMenu);
}, 10); }, 10);

View File

@ -190,6 +190,10 @@ class StampEditor extends AnnotationEditor {
this.#canvas = null; this.#canvas = null;
this.#observer?.disconnect(); this.#observer?.disconnect();
this.#observer = null; this.#observer = null;
if (this.#resizeTimeoutId) {
clearTimeout(this.#resizeTimeoutId);
this.#resizeTimeoutId = null;
}
} }
super.remove(); super.remove();
} }

View File

@ -543,6 +543,8 @@ class AnnotationEditorUIManager {
#filterFactory = null; #filterFactory = null;
#focusMainContainerTimeoutId = null;
#idManager = new IdManager(); #idManager = new IdManager();
#isEnabled = false; #isEnabled = false;
@ -735,6 +737,14 @@ class AnnotationEditorUIManager {
this.#selectedEditors.clear(); this.#selectedEditors.clear();
this.#commandManager.destroy(); this.#commandManager.destroy();
this.#altTextManager.destroy(); this.#altTextManager.destroy();
if (this.#focusMainContainerTimeoutId) {
clearTimeout(this.#focusMainContainerTimeoutId);
this.#focusMainContainerTimeoutId = null;
}
if (this.#translationTimeoutId) {
clearTimeout(this.#translationTimeoutId);
this.#translationTimeoutId = null;
}
} }
get hcmFilter() { get hcmFilter() {
@ -1281,6 +1291,17 @@ class AnnotationEditorUIManager {
* @param {AnnotationEditor} editor * @param {AnnotationEditor} editor
*/ */
removeEditor(editor) { removeEditor(editor) {
if (editor.div.contains(document.activeElement)) {
if (this.#focusMainContainerTimeoutId) {
clearTimeout(this.#focusMainContainerTimeoutId);
}
this.#focusMainContainerTimeoutId = setTimeout(() => {
// When the div is removed from DOM the focus can move on the
// document.body, so we need to move it back to the main container.
this.focusMainContainer();
this.#focusMainContainerTimeoutId = null;
}, 0);
}
this.#allEditors.delete(editor.id); this.#allEditors.delete(editor.id);
this.unselect(editor); this.unselect(editor);
if ( if (