Fix intermittent failures when moving a freetext annotation in integration tests
When an editor is moved with the keyboard or in dragging it, it is moved in the DOM in order to make screen readers happy. But this move is slightly postponed thanks to a setTimeout(..., 0). The failures were very likely due to the fact that intermittently the DOM move was done in the middle of the next key sequence which was making the move on screen failing.
This commit is contained in:
parent
6177bb5aa8
commit
74a377f72f
@ -1278,6 +1278,11 @@ class AnnotationEditor {
|
|||||||
this.#moveInDOMTimeout = setTimeout(() => {
|
this.#moveInDOMTimeout = setTimeout(() => {
|
||||||
this.#moveInDOMTimeout = null;
|
this.#moveInDOMTimeout = null;
|
||||||
this.parent?.moveEditorInDOM(this);
|
this.parent?.moveEditorInDOM(this);
|
||||||
|
if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("TESTING")) {
|
||||||
|
this._uiManager._eventBus.dispatch("editormovedindom", {
|
||||||
|
source: this,
|
||||||
|
});
|
||||||
|
}
|
||||||
}, 0);
|
}, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -47,6 +47,7 @@ import {
|
|||||||
switchToEditor,
|
switchToEditor,
|
||||||
waitForAnnotationEditorLayer,
|
waitForAnnotationEditorLayer,
|
||||||
waitForAnnotationModeChanged,
|
waitForAnnotationModeChanged,
|
||||||
|
waitForEditorMovedInDOM,
|
||||||
waitForSelectedEditor,
|
waitForSelectedEditor,
|
||||||
waitForSerialized,
|
waitForSerialized,
|
||||||
waitForStorageEntries,
|
waitForStorageEntries,
|
||||||
@ -88,6 +89,17 @@ const waitForPositionChange = (page, selector, xy) =>
|
|||||||
xy
|
xy
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const moveEditor = async (page, selector, n, pressKey) => {
|
||||||
|
let xy = await getXY(page, selector);
|
||||||
|
for (let i = 0; i < n; i++) {
|
||||||
|
const handle = await waitForEditorMovedInDOM(page);
|
||||||
|
await pressKey();
|
||||||
|
await awaitPromise(handle);
|
||||||
|
await waitForPositionChange(page, selector, xy);
|
||||||
|
xy = await getXY(page, selector);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const cancelFocusIn = async (page, selector) => {
|
const cancelFocusIn = async (page, selector) => {
|
||||||
page.evaluate(sel => {
|
page.evaluate(sel => {
|
||||||
const el = document.querySelector(sel);
|
const el = document.querySelector(sel);
|
||||||
@ -1968,12 +1980,9 @@ describe("FreeText Editor", () => {
|
|||||||
|
|
||||||
const [pageX, pageY] = await getFirstSerialized(page, x => x.rect);
|
const [pageX, pageY] = await getFirstSerialized(page, x => x.rect);
|
||||||
|
|
||||||
let xy = await getXY(page, selectorEditor);
|
await moveEditor(page, selectorEditor, 20, () =>
|
||||||
for (let i = 0; i < 20; i++) {
|
page.keyboard.press("ArrowRight")
|
||||||
await page.keyboard.press("ArrowRight");
|
);
|
||||||
await waitForPositionChange(page, selectorEditor, xy);
|
|
||||||
xy = await getXY(page, selectorEditor);
|
|
||||||
}
|
|
||||||
|
|
||||||
let [newX, newY] = await getFirstSerialized(page, x => x.rect);
|
let [newX, newY] = await getFirstSerialized(page, x => x.rect);
|
||||||
expect(Math.round(newX))
|
expect(Math.round(newX))
|
||||||
@ -1983,11 +1992,9 @@ describe("FreeText Editor", () => {
|
|||||||
.withContext(`In ${browserName}`)
|
.withContext(`In ${browserName}`)
|
||||||
.toEqual(Math.round(pageY));
|
.toEqual(Math.round(pageY));
|
||||||
|
|
||||||
for (let i = 0; i < 20; i++) {
|
await moveEditor(page, selectorEditor, 20, () =>
|
||||||
await page.keyboard.press("ArrowDown");
|
page.keyboard.press("ArrowDown")
|
||||||
await waitForPositionChange(page, selectorEditor, xy);
|
);
|
||||||
xy = await getXY(page, selectorEditor);
|
|
||||||
}
|
|
||||||
|
|
||||||
[newX, newY] = await getFirstSerialized(page, x => x.rect);
|
[newX, newY] = await getFirstSerialized(page, x => x.rect);
|
||||||
expect(Math.round(newX))
|
expect(Math.round(newX))
|
||||||
@ -1997,11 +2004,7 @@ describe("FreeText Editor", () => {
|
|||||||
.withContext(`In ${browserName}`)
|
.withContext(`In ${browserName}`)
|
||||||
.toEqual(Math.round(pageY - 20));
|
.toEqual(Math.round(pageY - 20));
|
||||||
|
|
||||||
for (let i = 0; i < 2; i++) {
|
await moveEditor(page, selectorEditor, 2, () => kbBigMoveLeft(page));
|
||||||
await kbBigMoveLeft(page);
|
|
||||||
await waitForPositionChange(page, selectorEditor, xy);
|
|
||||||
xy = await getXY(page, selectorEditor);
|
|
||||||
}
|
|
||||||
|
|
||||||
[newX, newY] = await getFirstSerialized(page, x => x.rect);
|
[newX, newY] = await getFirstSerialized(page, x => x.rect);
|
||||||
expect(Math.round(newX))
|
expect(Math.round(newX))
|
||||||
@ -2011,11 +2014,7 @@ describe("FreeText Editor", () => {
|
|||||||
.withContext(`In ${browserName}`)
|
.withContext(`In ${browserName}`)
|
||||||
.toEqual(Math.round(pageY - 20));
|
.toEqual(Math.round(pageY - 20));
|
||||||
|
|
||||||
for (let i = 0; i < 2; i++) {
|
await moveEditor(page, selectorEditor, 2, () => kbBigMoveUp(page));
|
||||||
await kbBigMoveUp(page);
|
|
||||||
await waitForPositionChange(page, selectorEditor, xy);
|
|
||||||
xy = await getXY(page, selectorEditor);
|
|
||||||
}
|
|
||||||
|
|
||||||
[newX, newY] = await getFirstSerialized(page, x => x.rect);
|
[newX, newY] = await getFirstSerialized(page, x => x.rect);
|
||||||
expect(Math.round(newX))
|
expect(Math.round(newX))
|
||||||
@ -2041,12 +2040,9 @@ describe("FreeText Editor", () => {
|
|||||||
const pageWidth = page2X - page1X;
|
const pageWidth = page2X - page1X;
|
||||||
|
|
||||||
const selectorEditor = getEditorSelector(0);
|
const selectorEditor = getEditorSelector(0);
|
||||||
let xy = await getXY(page, selectorEditor);
|
await moveEditor(page, selectorEditor, 5, () =>
|
||||||
for (let i = 0; i < 5; i++) {
|
page.keyboard.press("ArrowRight")
|
||||||
await page.keyboard.press("ArrowRight");
|
);
|
||||||
await waitForPositionChange(page, selectorEditor, xy);
|
|
||||||
xy = await getXY(page, selectorEditor);
|
|
||||||
}
|
|
||||||
|
|
||||||
const [new1X, , new2X] = await getFirstSerialized(page, x => x.rect);
|
const [new1X, , new2X] = await getFirstSerialized(page, x => x.rect);
|
||||||
const newWidth = new2X - new1X;
|
const newWidth = new2X - new1X;
|
||||||
@ -2093,42 +2089,21 @@ describe("FreeText Editor", () => {
|
|||||||
visible: true,
|
visible: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
let xy = await getXY(page, selectorEditor);
|
await moveEditor(page, selectorEditor, 20, () =>
|
||||||
for (let i = 0; i < 20; i++) {
|
page.keyboard.press("ArrowRight")
|
||||||
await page.keyboard.press("ArrowRight");
|
);
|
||||||
await waitForPositionChange(page, selectorEditor, xy);
|
|
||||||
xy = await getXY(page, selectorEditor);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let i = 0; i < 2; i++) {
|
await moveEditor(page, selectorEditor, 2, () => kbBigMoveDown(page));
|
||||||
await kbBigMoveDown(page);
|
|
||||||
await waitForPositionChange(page, selectorEditor, xy);
|
|
||||||
xy = await getXY(page, selectorEditor);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let i = 0; i < 20; i++) {
|
await moveEditor(page, selectorEditor, 20, () =>
|
||||||
await page.keyboard.press("ArrowLeft");
|
page.keyboard.press("ArrowLeft")
|
||||||
await waitForPositionChange(page, selectorEditor, xy);
|
);
|
||||||
xy = await getXY(page, selectorEditor);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let i = 0; i < 2; i++) {
|
await moveEditor(page, selectorEditor, 2, () => kbBigMoveUp(page));
|
||||||
await kbBigMoveUp(page);
|
|
||||||
await waitForPositionChange(page, selectorEditor, xy);
|
|
||||||
xy = await getXY(page, selectorEditor);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let i = 0; i < 2; i++) {
|
await moveEditor(page, selectorEditor, 2, () => kbBigMoveRight(page));
|
||||||
await kbBigMoveRight(page);
|
|
||||||
await waitForPositionChange(page, selectorEditor, xy);
|
|
||||||
xy = await getXY(page, selectorEditor);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let i = 0; i < 2; i++) {
|
await moveEditor(page, selectorEditor, 2, () => kbBigMoveLeft(page));
|
||||||
await kbBigMoveLeft(page);
|
|
||||||
await waitForPositionChange(page, selectorEditor, xy);
|
|
||||||
xy = await getXY(page, selectorEditor);
|
|
||||||
}
|
|
||||||
|
|
||||||
await page.type(`${selectorEditor} .internal`, data);
|
await page.type(`${selectorEditor} .internal`, data);
|
||||||
await page.keyboard.press("Escape");
|
await page.keyboard.press("Escape");
|
||||||
@ -2292,11 +2267,8 @@ describe("FreeText Editor", () => {
|
|||||||
|
|
||||||
const { y: y0, height } = await getRect(page, getEditorSelector(0));
|
const { y: y0, height } = await getRect(page, getEditorSelector(0));
|
||||||
const selectorEditor = getEditorSelector(1);
|
const selectorEditor = getEditorSelector(1);
|
||||||
let xy = await getXY(page, selectorEditor);
|
|
||||||
while ((await getRect(page, selectorEditor)).y > y0 - height) {
|
while ((await getRect(page, selectorEditor)).y > y0 - height) {
|
||||||
await kbBigMoveUp(page);
|
await moveEditor(page, selectorEditor, 1, () => kbBigMoveUp(page));
|
||||||
await waitForPositionChange(page, selectorEditor, xy);
|
|
||||||
xy = await getXY(page, selectorEditor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// The editor must be moved in the DOM and potentially the focus
|
// The editor must be moved in the DOM and potentially the focus
|
||||||
@ -2732,12 +2704,7 @@ describe("FreeText Editor", () => {
|
|||||||
visible: true,
|
visible: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
let xy = await getXY(page, selectorEditor);
|
await moveEditor(page, selectorEditor, 5, () => kbBigMoveUp(page));
|
||||||
for (let i = 0; i < 5; i++) {
|
|
||||||
await kbBigMoveUp(page);
|
|
||||||
await waitForPositionChange(page, selectorEditor, xy);
|
|
||||||
xy = await getXY(page, selectorEditor);
|
|
||||||
}
|
|
||||||
|
|
||||||
const data = "Hello PDF.js World !!";
|
const data = "Hello PDF.js World !!";
|
||||||
await page.type(`${selectorEditor} .internal`, data);
|
await page.type(`${selectorEditor} .internal`, data);
|
||||||
@ -2762,12 +2729,7 @@ describe("FreeText Editor", () => {
|
|||||||
visible: true,
|
visible: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
xy = await getXY(page, selectorEditor);
|
await moveEditor(page, selectorEditor, 5, () => kbBigMoveDown(page));
|
||||||
for (let i = 0; i < 5; i++) {
|
|
||||||
await kbBigMoveDown(page);
|
|
||||||
await waitForPositionChange(page, selectorEditor, xy);
|
|
||||||
xy = await getXY(page, selectorEditor);
|
|
||||||
}
|
|
||||||
|
|
||||||
await page.type(`${selectorEditor} .internal`, data);
|
await page.type(`${selectorEditor} .internal`, data);
|
||||||
|
|
||||||
@ -2797,12 +2759,7 @@ describe("FreeText Editor", () => {
|
|||||||
visible: true,
|
visible: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
let xy = await getXY(page, selectorEditor);
|
await moveEditor(page, selectorEditor, 10, () => kbBigMoveLeft(page));
|
||||||
for (let i = 0; i < 10; i++) {
|
|
||||||
await kbBigMoveLeft(page);
|
|
||||||
await waitForPositionChange(page, selectorEditor, xy);
|
|
||||||
xy = await getXY(page, selectorEditor);
|
|
||||||
}
|
|
||||||
|
|
||||||
const data = "Hello PDF.js World !!";
|
const data = "Hello PDF.js World !!";
|
||||||
await page.type(`${selectorEditor} .internal`, data);
|
await page.type(`${selectorEditor} .internal`, data);
|
||||||
@ -2827,12 +2784,9 @@ describe("FreeText Editor", () => {
|
|||||||
visible: true,
|
visible: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
xy = await getXY(page, selectorEditor);
|
await moveEditor(page, selectorEditor, 10, () =>
|
||||||
for (let i = 0; i < 10; i++) {
|
kbBigMoveRight(page)
|
||||||
await kbBigMoveRight(page);
|
);
|
||||||
await waitForPositionChange(page, selectorEditor, xy);
|
|
||||||
xy = await getXY(page, selectorEditor);
|
|
||||||
}
|
|
||||||
|
|
||||||
await page.type(`${selectorEditor} .internal`, data);
|
await page.type(`${selectorEditor} .internal`, data);
|
||||||
|
|
||||||
|
|||||||
@ -558,6 +558,14 @@ function waitForPageRendered(page) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function waitForEditorMovedInDOM(page) {
|
||||||
|
return createPromise(page, resolve => {
|
||||||
|
window.PDFViewerApplication.eventBus.on("editormovedindom", resolve, {
|
||||||
|
once: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
async function scrollIntoView(page, selector) {
|
async function scrollIntoView(page, selector) {
|
||||||
const handle = await page.evaluateHandle(
|
const handle = await page.evaluateHandle(
|
||||||
sel => [
|
sel => [
|
||||||
@ -862,6 +870,7 @@ export {
|
|||||||
waitAndClick,
|
waitAndClick,
|
||||||
waitForAnnotationEditorLayer,
|
waitForAnnotationEditorLayer,
|
||||||
waitForAnnotationModeChanged,
|
waitForAnnotationModeChanged,
|
||||||
|
waitForEditorMovedInDOM,
|
||||||
waitForEntryInStorage,
|
waitForEntryInStorage,
|
||||||
waitForEvent,
|
waitForEvent,
|
||||||
waitForNoElement,
|
waitForNoElement,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user