1
0
Fork 0
mirror of https://github.com/mozilla/pdf.js.git synced 2025-04-23 08:38:06 +02:00

[Editor] Avoid to use parent of editors in destroyed pages

This commit is contained in:
Calixte Denizet 2023-09-07 12:30:29 +02:00
parent cf5a1d60a6
commit 8ab4e2e6e7
5 changed files with 106 additions and 5 deletions

View file

@ -377,7 +377,10 @@ class AnnotationEditorLayer {
editor.isAttachedToDOM = true;
}
// The editor must have the right position before being moved in the DOM.
editor.fixAndSetPosition();
this.moveEditorInDOM(editor);
editor.onceAdded();
this.#uiManager.addToAnnotationStorage(editor);
}
@ -675,6 +678,8 @@ class AnnotationEditorLayer {
*/
destroy() {
if (this.#uiManager.getActive()?.parent === this) {
// We need to commit the current editor before destroying the layer.
this.#uiManager.commitOrRemove();
this.#uiManager.setActiveEditor(null);
}

View file

@ -347,7 +347,14 @@ class AnnotationEditor {
const [parentWidth, parentHeight] = this.parentDimensions;
this.x += tx / parentWidth;
this.y += ty / parentHeight;
if (this.x < 0 || this.x > 1 || this.y < 0 || this.y > 1) {
if (this.parent && (this.x < 0 || this.x > 1 || this.y < 0 || this.y > 1)) {
// It's possible to not have a parent: for example, when the user is
// dragging all the selected editors but this one on a page which has been
// destroyed.
// It's why we need to check for it. In such a situation, it isn't really
// a problem to not find a new parent: it's something which is related to
// what the user is seeing, hence it depends on how pages are layed out.
// The element will be outside of its parent so change the parent.
const { x, y } = this.div.getBoundingClientRect();
if (this.parent.findNewParent(this, x, y)) {

View file

@ -1565,6 +1565,8 @@ class AnnotationEditorUIManager {
* Set up the drag session for moving the selected editors.
*/
setUpDragSession() {
// Note: don't use any references to the editor's parent which can be null
// if the editor belongs to a destroyed page.
if (!this.hasSelection) {
return;
}
@ -1575,7 +1577,7 @@ class AnnotationEditorUIManager {
this.#draggingEditors.set(editor, {
savedX: editor.x,
savedY: editor.y,
savedPageIndex: editor.parent.pageIndex,
savedPageIndex: editor.pageIndex,
newX: 0,
newY: 0,
newPageIndex: -1,
@ -1596,14 +1598,14 @@ class AnnotationEditorUIManager {
this.#draggingEditors = null;
let mustBeAddedInUndoStack = false;
for (const [{ x, y, parent }, value] of map) {
for (const [{ x, y, pageIndex }, value] of map) {
value.newX = x;
value.newY = y;
value.newPageIndex = parent.pageIndex;
value.newPageIndex = pageIndex;
mustBeAddedInUndoStack ||=
x !== value.savedX ||
y !== value.savedY ||
parent.pageIndex !== value.savedPageIndex;
pageIndex !== value.savedPageIndex;
}
if (!mustBeAddedInUndoStack) {