Merge pull request #19215 from calixteman/issue18911
[Editor] Avoid to focus an existing editor when enabling the layer
This commit is contained in:
commit
a9c5bb25b8
@ -74,6 +74,8 @@ class AnnotationEditorLayer {
|
|||||||
|
|
||||||
#isDisabling = false;
|
#isDisabling = false;
|
||||||
|
|
||||||
|
#isEnabling = false;
|
||||||
|
|
||||||
#drawingAC = null;
|
#drawingAC = null;
|
||||||
|
|
||||||
#focusedElement = null;
|
#focusedElement = null;
|
||||||
@ -229,6 +231,7 @@ class AnnotationEditorLayer {
|
|||||||
* editor creation.
|
* editor creation.
|
||||||
*/
|
*/
|
||||||
async enable() {
|
async enable() {
|
||||||
|
this.#isEnabling = true;
|
||||||
this.div.tabIndex = 0;
|
this.div.tabIndex = 0;
|
||||||
this.togglePointerEvents(true);
|
this.togglePointerEvents(true);
|
||||||
const annotationElementIds = new Set();
|
const annotationElementIds = new Set();
|
||||||
@ -242,6 +245,7 @@ class AnnotationEditorLayer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!this.#annotationLayer) {
|
if (!this.#annotationLayer) {
|
||||||
|
this.#isEnabling = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -262,6 +266,7 @@ class AnnotationEditorLayer {
|
|||||||
this.addOrRebuild(editor);
|
this.addOrRebuild(editor);
|
||||||
editor.enableEditing();
|
editor.enableEditing();
|
||||||
}
|
}
|
||||||
|
this.#isEnabling = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -508,7 +513,7 @@ class AnnotationEditorLayer {
|
|||||||
|
|
||||||
// The editor will be correctly moved into the DOM (see fixAndSetPosition).
|
// The editor will be correctly moved into the DOM (see fixAndSetPosition).
|
||||||
editor.fixAndSetPosition();
|
editor.fixAndSetPosition();
|
||||||
editor.onceAdded();
|
editor.onceAdded(/* focus = */ !this.#isEnabling);
|
||||||
this.#uiManager.addToAnnotationStorage(editor);
|
this.#uiManager.addToAnnotationStorage(editor);
|
||||||
editor._reportTelemetry(editor.telemetryInitialData);
|
editor._reportTelemetry(editor.telemetryInitialData);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -345,7 +345,7 @@ class DrawingEditor extends AnnotationEditor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** @inheritdoc */
|
/** @inheritdoc */
|
||||||
onceAdded() {
|
onceAdded(focus) {
|
||||||
if (!this.annotationElementId) {
|
if (!this.annotationElementId) {
|
||||||
this.parent.addUndoableEditor(this);
|
this.parent.addUndoableEditor(this);
|
||||||
}
|
}
|
||||||
@ -354,7 +354,7 @@ class DrawingEditor extends AnnotationEditor {
|
|||||||
this.#mustBeCommitted = false;
|
this.#mustBeCommitted = false;
|
||||||
this.commit();
|
this.commit();
|
||||||
this.parent.setSelected(this);
|
this.parent.setSelected(this);
|
||||||
if (this.isOnScreen) {
|
if (focus && this.isOnScreen) {
|
||||||
this.div.focus();
|
this.div.focus();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1367,8 +1367,9 @@ class AnnotationEditor {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Executed once this editor has been rendered.
|
* Executed once this editor has been rendered.
|
||||||
|
* @param {boolean} focus - true if the editor should be focused.
|
||||||
*/
|
*/
|
||||||
onceAdded() {}
|
onceAdded(focus) {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if the editor contains something.
|
* Check if the editor contains something.
|
||||||
|
|||||||
@ -363,13 +363,15 @@ class FreeTextEditor extends AnnotationEditor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** @inheritdoc */
|
/** @inheritdoc */
|
||||||
onceAdded() {
|
onceAdded(focus) {
|
||||||
if (this.width) {
|
if (this.width) {
|
||||||
// The editor was created in using ctrl+c.
|
// The editor was created in using ctrl+c.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this.enableEditMode();
|
this.enableEditMode();
|
||||||
|
if (focus) {
|
||||||
this.editorDiv.focus();
|
this.editorDiv.focus();
|
||||||
|
}
|
||||||
if (this._initialOptions?.isCentered) {
|
if (this._initialOptions?.isCentered) {
|
||||||
this.center();
|
this.center();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -439,12 +439,14 @@ class HighlightEditor extends AnnotationEditor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** @inheritdoc */
|
/** @inheritdoc */
|
||||||
onceAdded() {
|
onceAdded(focus) {
|
||||||
if (!this.annotationElementId) {
|
if (!this.annotationElementId) {
|
||||||
this.parent.addUndoableEditor(this);
|
this.parent.addUndoableEditor(this);
|
||||||
}
|
}
|
||||||
|
if (focus) {
|
||||||
this.div.focus();
|
this.div.focus();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** @inheritdoc */
|
/** @inheritdoc */
|
||||||
remove() {
|
remove() {
|
||||||
|
|||||||
@ -338,10 +338,12 @@ class StampEditor extends AnnotationEditor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** @inheritdoc */
|
/** @inheritdoc */
|
||||||
onceAdded() {
|
onceAdded(focus) {
|
||||||
this._isDraggable = true;
|
this._isDraggable = true;
|
||||||
|
if (focus) {
|
||||||
this.div.focus();
|
this.div.focus();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** @inheritdoc */
|
/** @inheritdoc */
|
||||||
isEmpty() {
|
isEmpty() {
|
||||||
|
|||||||
@ -37,6 +37,7 @@ import {
|
|||||||
waitForAnnotationModeChanged,
|
waitForAnnotationModeChanged,
|
||||||
waitForSelectedEditor,
|
waitForSelectedEditor,
|
||||||
waitForSerialized,
|
waitForSerialized,
|
||||||
|
waitForTimeout,
|
||||||
} from "./test_utils.mjs";
|
} from "./test_utils.mjs";
|
||||||
import { fileURLToPath } from "url";
|
import { fileURLToPath } from "url";
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
@ -2613,4 +2614,59 @@ describe("Highlight Editor", () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("Highlight mustn't trigger a scroll when edited", () => {
|
||||||
|
let pages;
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
pages = await loadAndWait("issue18911.pdf", ".annotationEditorLayer");
|
||||||
|
});
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await closePages(pages);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("must check that there is no scroll because of focus", async () => {
|
||||||
|
await Promise.all(
|
||||||
|
pages.map(async ([browserName, page]) => {
|
||||||
|
await switchToHighlight(page);
|
||||||
|
|
||||||
|
const page4Selector = ".page[data-page-number = '4']";
|
||||||
|
const page5Selector = ".page[data-page-number = '5']";
|
||||||
|
await scrollIntoView(page, page4Selector);
|
||||||
|
await page.waitForSelector(`${page5Selector} .annotationEditorLayer`);
|
||||||
|
|
||||||
|
// When moving to page 4, the highlight editor mustn't be focused (it
|
||||||
|
// was causing a scroll to page 5).
|
||||||
|
// So here we're waiting a bit and checking that the page is still 4.
|
||||||
|
// eslint-disable-next-line no-restricted-syntax
|
||||||
|
await waitForTimeout(100);
|
||||||
|
|
||||||
|
// Get the length of the intersection between two ranges.
|
||||||
|
const inter = ([a, b], [c, d]) =>
|
||||||
|
d < a || b < c ? 0 : Math.min(b, d) - Math.max(a, c);
|
||||||
|
|
||||||
|
const page4Rect = await getRect(page, page4Selector);
|
||||||
|
const page5Rect = await getRect(page, page5Selector);
|
||||||
|
const viewportRect = await getRect(page, "#viewerContainer");
|
||||||
|
const viewportRange = [
|
||||||
|
viewportRect.y,
|
||||||
|
viewportRect.y + viewportRect.height,
|
||||||
|
];
|
||||||
|
|
||||||
|
const interPage4 = inter(
|
||||||
|
[page4Rect.y, page4Rect.y + page4Rect.height],
|
||||||
|
viewportRange
|
||||||
|
);
|
||||||
|
const interPage5 = inter(
|
||||||
|
[page5Rect.y, page5Rect.y + page5Rect.height],
|
||||||
|
viewportRange
|
||||||
|
);
|
||||||
|
expect(interPage4)
|
||||||
|
.withContext(`In ${browserName}`)
|
||||||
|
.toBeGreaterThan(0.5 * interPage5);
|
||||||
|
})
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
1
test/pdfs/.gitignore
vendored
1
test/pdfs/.gitignore
vendored
@ -689,3 +689,4 @@
|
|||||||
!inks.pdf
|
!inks.pdf
|
||||||
!inks_basic.pdf
|
!inks_basic.pdf
|
||||||
!issue19182.pdf
|
!issue19182.pdf
|
||||||
|
!issue18911.pdf
|
||||||
|
|||||||
BIN
test/pdfs/issue18911.pdf
Executable file
BIN
test/pdfs/issue18911.pdf
Executable file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user