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:
parent
cf5a1d60a6
commit
8ab4e2e6e7
5 changed files with 106 additions and 5 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue