Skip to content

Commit 5493585

Browse files
committed
Try to fix few intermittents bug in reorganize_pages_spec integration tests
1 parent 394727a commit 5493585

3 files changed

Lines changed: 65 additions & 28 deletions

File tree

test/integration/reorganize_pages_spec.mjs

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,10 @@ describe("Reorganize Pages View", () => {
260260
await waitForThumbnailVisible(page, 1);
261261
const rect2 = await getRect(page, getThumbnailSelector(2));
262262
const rect4 = await getRect(page, getThumbnailSelector(4));
263-
await page.click(`.thumbnail:has(${getThumbnailSelector(1)}) input`);
263+
await waitAndClick(
264+
page,
265+
`.thumbnail:has(${getThumbnailSelector(1)}) input`
266+
);
264267

265268
const handlePagesEdited = await waitForPagesEdited(page);
266269
await dragAndDrop(
@@ -288,10 +291,11 @@ describe("Reorganize Pages View", () => {
288291
const rect1 = await getRect(page, getThumbnailSelector(1));
289292
const rect2 = await getRect(page, getThumbnailSelector(2));
290293
await (await page.$(".thumbnail[page-number='14'")).scrollIntoView();
291-
await page.waitForSelector(getThumbnailSelector(14), {
292-
visible: true,
293-
});
294-
await page.click(`.thumbnail:has(${getThumbnailSelector(14)}) input`);
294+
295+
await waitAndClick(
296+
page,
297+
`.thumbnail:has(${getThumbnailSelector(14)}) input`
298+
);
295299
await (await page.$(".thumbnail[page-number='1'")).scrollIntoView();
296300
await page.waitForSelector(getThumbnailSelector(1), {
297301
visible: true,
@@ -323,7 +327,7 @@ describe("Reorganize Pages View", () => {
323327
const rect1 = await getRect(page, getThumbnailSelector(1));
324328
const rect2 = await getRect(page, getThumbnailSelector(2));
325329

326-
await page.click(getThumbnailSelector(2));
330+
await waitAndClick(page, getThumbnailSelector(2));
327331
await page.waitForSelector(
328332
`${getThumbnailSelector(2)}[aria-current="page"]`
329333
);
@@ -367,11 +371,8 @@ describe("Reorganize Pages View", () => {
367371
it("should check if the search is working after moving pages", async () => {
368372
await Promise.all(
369373
pages.map(async ([browserName, page]) => {
370-
await page.click("#viewFindButton");
371-
await page.waitForSelector(":has(> #findHighlightAll)", {
372-
visible: true,
373-
});
374-
await page.click(":has(> #findHighlightAll)");
374+
await waitAndClick(page, "#viewFindButton");
375+
await waitAndClick(page, ":has(> #findHighlightAll)");
375376

376377
await page.waitForSelector("#findInput", { visible: true });
377378
await page.type("#findInput", "1");
@@ -482,7 +483,7 @@ describe("Reorganize Pages View", () => {
482483
await waitForThumbnailVisible(page, 1);
483484
await movePages(page, [2], 10);
484485
await scrollIntoView(page, getAnnotationSelector("107R"));
485-
await page.click(getAnnotationSelector("107R"));
486+
await waitAndClick(page, getAnnotationSelector("107R"));
486487
const currentPage = await page.$eval(
487488
"#pageNumber",
488489
el => el.valueAsNumber
@@ -498,11 +499,11 @@ describe("Reorganize Pages View", () => {
498499
await waitForThumbnailVisible(page, 1);
499500
await movePages(page, [2, 4], 10);
500501

501-
await page.click("#viewsManagerSelectorButton");
502-
await page.click("#outlinesViewMenu");
502+
await waitAndClick(page, "#viewsManagerSelectorButton");
503+
await waitAndClick(page, "#outlinesViewMenu");
503504
await page.waitForSelector("#outlinesView", { visible: true });
504505

505-
await page.click("#outlinesView .treeItem:nth-child(2)");
506+
await waitAndClick(page, "#outlinesView .treeItem:nth-child(2)");
506507

507508
const currentPage = await page.$eval(
508509
"#pageNumber",
@@ -539,12 +540,8 @@ describe("Reorganize Pages View", () => {
539540
await Promise.all(
540541
pages.map(async ([browserName, page]) => {
541542
await page.waitForSelector("#outlinesView", { visible: true });
542-
await page.waitForSelector("#viewsManagerSelectorButton", {
543-
visible: true,
544-
});
545-
await page.click("#viewsManagerSelectorButton");
546-
await page.waitForSelector("#thumbnailsViewMenu", { visible: true });
547-
await page.click("#thumbnailsViewMenu");
543+
await waitAndClick(page, "#viewsManagerSelectorButton");
544+
await waitAndClick(page, "#thumbnailsViewMenu");
548545

549546
const thumbSelector =
550547
"#thumbnailsView .thumbnailImageContainer > img";
@@ -1702,8 +1699,9 @@ describe("Reorganize Pages View", () => {
17021699
await page.waitForSelector("button.thumbnailPasteButton", {
17031700
hidden: true,
17041701
});
1705-
const pasteButtons = await page.$$("button.thumbnailPasteButton");
1706-
expect(pasteButtons.length).withContext(`In ${browserName}`).toBe(0);
1702+
await page.waitForFunction(
1703+
() => !document.querySelector("button.thumbnailPasteButton")
1704+
);
17071705
})
17081706
);
17091707
});
@@ -1751,7 +1749,7 @@ describe("Reorganize Pages View", () => {
17511749
);
17521750
});
17531751

1754-
await page.click("#viewsManagerStatusActionButton");
1752+
await waitAndClick(page, "#viewsManagerStatusActionButton");
17551753
await waitAndClick(page, "#viewsManagerStatusActionExport");
17561754
const pagesData = await awaitPromise(handleExport);
17571755
expect(pagesData)

test/integration/test_utils.mjs

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -650,13 +650,50 @@ async function scrollIntoView(page, selector) {
650650
sel => [
651651
new Promise(resolve => {
652652
const container = document.getElementById("viewerContainer");
653-
if (container.scrollHeight <= container.clientHeight) {
653+
const element = document.querySelector(sel);
654+
if (!container || !element) {
654655
resolve();
655656
return;
656657
}
657-
container.addEventListener("scrollend", resolve, { once: true });
658-
const element = document.querySelector(sel);
658+
if (
659+
container.scrollHeight <= container.clientHeight &&
660+
container.scrollWidth <= container.clientWidth
661+
) {
662+
resolve();
663+
return;
664+
}
665+
666+
const beforeTop = container.scrollTop;
667+
const beforeLeft = container.scrollLeft;
668+
let settled = false;
669+
let timeoutId = null;
670+
671+
const finish = () => {
672+
if (settled) {
673+
return;
674+
}
675+
settled = true;
676+
if (timeoutId !== null) {
677+
clearTimeout(timeoutId);
678+
}
679+
container.removeEventListener("scrollend", finish);
680+
resolve();
681+
};
682+
683+
container.addEventListener("scrollend", finish, { once: true });
659684
element.scrollIntoView({ behavior: "instant", block: "start" });
685+
686+
if (
687+
container.scrollTop === beforeTop &&
688+
container.scrollLeft === beforeLeft
689+
) {
690+
finish();
691+
return;
692+
}
693+
694+
// Some browsers occasionally miss `scrollend`, so keep a short
695+
// fallback to avoid hanging.
696+
timeoutId = setTimeout(finish, 250);
660697
}),
661698
],
662699
selector

web/pdf_thumbnail_viewer.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -721,7 +721,9 @@ class PDFThumbnailViewer {
721721
const newPageNumber = currentPageNumber || 1;
722722
this.linkService.goToPage(newPageNumber);
723723
const thumbnailView = this._thumbnails[newPageNumber - 1];
724-
thumbnailView.imageContainer.focus();
724+
if (!this.container.contains(document.activeElement)) {
725+
thumbnailView.imageContainer.focus();
726+
}
725727
}, 0);
726728
}
727729

0 commit comments

Comments
 (0)