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

Isolate the "basic operations" freetext editor integration tests

This commit reduces the number of freetext editor integration test suite
failures, in full isolation, from 5 to 0 by fixing the following issues
in the "basic operations" block:

- Most tests relied on the first test to enable freetext editing mode.
  For isolation we now do it explicitly in all tests.
- Most tests relied on the other tests having created editors. For
  isolation we now create the editors explicitly in the tests themselves.
- Most tests relied on previous tests for the editor numbering. For
  isolation we change the editor numbering to the one after initial
  document load. Since we can't have state (editors) from a previous
  test anymore we can remove various `clearAll` calls as well.
This commit is contained in:
Tim van der Meij 2025-03-30 18:40:21 +02:00
parent f32254dbd4
commit ed08a6a988
No known key found for this signature in database
GPG key ID: 8C3FD2925A5F2762

View file

@ -87,11 +87,11 @@ describe("FreeText Editor", () => {
describe("FreeText", () => { describe("FreeText", () => {
let pages; let pages;
beforeAll(async () => { beforeEach(async () => {
pages = await loadAndWait("aboutstacks.pdf", ".annotationEditorLayer"); pages = await loadAndWait("aboutstacks.pdf", ".annotationEditorLayer");
}); });
afterAll(async () => { afterEach(async () => {
await closePages(pages); await closePages(pages);
}); });
@ -134,7 +134,17 @@ describe("FreeText Editor", () => {
it("must copy/paste", async () => { it("must copy/paste", async () => {
// Run sequentially to avoid clipboard issues. // Run sequentially to avoid clipboard issues.
for (const [browserName, page] of pages) { for (const [browserName, page] of pages) {
await switchToFreeText(page);
const rect = await getRect(page, ".annotationEditorLayer");
const firstEditorSelector = getEditorSelector(0); const firstEditorSelector = getEditorSelector(0);
const data = "Hello PDF.js World !!";
await page.mouse.click(rect.x + 100, rect.y + 100);
await page.waitForSelector(firstEditorSelector, { visible: true });
await page.type(`${firstEditorSelector} .internal`, data);
await commit(page);
await waitForStorageEntries(page, 1);
await selectEditor(page, firstEditorSelector); await selectEditor(page, firstEditorSelector);
await copy(page); await copy(page);
await paste(page); await paste(page);
@ -168,18 +178,35 @@ describe("FreeText Editor", () => {
it("must clear all", async () => { it("must clear all", async () => {
await Promise.all( await Promise.all(
pages.map(async ([browserName, page]) => { pages.map(async ([browserName, page]) => {
await switchToFreeText(page);
const rect = await getRect(page, ".annotationEditorLayer");
for (const n of [0, 1, 2]) {
const editorSelector = getEditorSelector(n);
const data = "Hello PDF.js World !!";
await page.mouse.click(rect.x + 100 * n, rect.y + 100 * n);
await page.waitForSelector(editorSelector, { visible: true });
await page.type(`${editorSelector} .internal`, data);
await commit(page);
const hasEditor = await page.evaluate(
sel => !!document.querySelector(sel),
editorSelector
);
expect(hasEditor).withContext(`In ${browserName}`).toEqual(true);
}
await waitForStorageEntries(page, 3);
await clearAll(page); await clearAll(page);
await waitForStorageEntries(page, 0);
for (const n of [0, 1, 2]) { for (const n of [0, 1, 2]) {
const hasEditor = await page.evaluate( const hasEditor = await page.evaluate(
sel => !!document.querySelector(sel), sel => !!document.querySelector(sel),
getEditorSelector(n) getEditorSelector(n)
); );
expect(hasEditor).withContext(`In ${browserName}`).toEqual(false); expect(hasEditor).withContext(`In ${browserName}`).toEqual(false);
} }
await waitForStorageEntries(page, 0);
}) })
); );
}); });
@ -187,8 +214,10 @@ describe("FreeText Editor", () => {
it("must check that a paste has been undone", async () => { it("must check that a paste has been undone", async () => {
// Run sequentially to avoid clipboard issues. // Run sequentially to avoid clipboard issues.
for (const [, page] of pages) { for (const [, page] of pages) {
await switchToFreeText(page);
const rect = await getRect(page, ".annotationEditorLayer"); const rect = await getRect(page, ".annotationEditorLayer");
let editorSelector = getEditorSelector(3); let editorSelector = getEditorSelector(0);
const data = "Hello PDF.js World !!"; const data = "Hello PDF.js World !!";
await page.mouse.click(rect.x + 100, rect.y + 100); await page.mouse.click(rect.x + 100, rect.y + 100);
await page.waitForSelector(editorSelector, { visible: true }); await page.waitForSelector(editorSelector, { visible: true });
@ -198,7 +227,7 @@ describe("FreeText Editor", () => {
await selectEditor(page, editorSelector); await selectEditor(page, editorSelector);
await copy(page); await copy(page);
await paste(page); await paste(page);
editorSelector = getEditorSelector(4); editorSelector = getEditorSelector(1);
await page.waitForSelector(editorSelector, { visible: true }); await page.waitForSelector(editorSelector, { visible: true });
await kbUndo(page); await kbUndo(page);
@ -210,7 +239,7 @@ describe("FreeText Editor", () => {
for (let i = 0; i < 2; i++) { for (let i = 0; i < 2; i++) {
await paste(page); await paste(page);
await page.waitForSelector(getEditorSelector(5 + i)); await page.waitForSelector(getEditorSelector(2 + i));
} }
for (let i = 0; i < 2; i++) { for (let i = 0; i < 2; i++) {
@ -218,7 +247,7 @@ describe("FreeText Editor", () => {
await page.waitForFunction( await page.waitForFunction(
sel => !document.querySelector(sel), sel => !document.querySelector(sel),
{}, {},
getEditorSelector(6 - i) getEditorSelector(3 - i)
); );
} }
} }
@ -227,6 +256,8 @@ describe("FreeText Editor", () => {
it("must check that aria-owns is correct", async () => { it("must check that aria-owns is correct", async () => {
await Promise.all( await Promise.all(
pages.map(async ([browserName, page]) => { pages.map(async ([browserName, page]) => {
await switchToFreeText(page);
await page.$eval(".textLayer", el => { await page.$eval(".textLayer", el => {
for (const span of el.querySelectorAll( for (const span of el.querySelectorAll(
`span[role="presentation"]` `span[role="presentation"]`
@ -246,7 +277,7 @@ describe("FreeText Editor", () => {
expect(oldAriaOwns).withContext(`In ${browserName}`).toEqual(null); expect(oldAriaOwns).withContext(`In ${browserName}`).toEqual(null);
const editorSelector = getEditorSelector(7); const editorSelector = getEditorSelector(0);
const data = "Hello PDF.js World !!"; const data = "Hello PDF.js World !!";
await page.mouse.click( await page.mouse.click(
stacksRect.x + stacksRect.width + 1, stacksRect.x + stacksRect.width + 1,
@ -261,7 +292,7 @@ describe("FreeText Editor", () => {
return span?.getAttribute("aria-owns") || null; return span?.getAttribute("aria-owns") || null;
}); });
expect(ariaOwns.endsWith("_7-editor")) expect(ariaOwns.endsWith("_0-editor"))
.withContext(`In ${browserName}`) .withContext(`In ${browserName}`)
.toEqual(true); .toEqual(true);
await scrollIntoView(page, ".annotationEditorLayer"); await scrollIntoView(page, ".annotationEditorLayer");
@ -272,11 +303,10 @@ describe("FreeText Editor", () => {
it("must check that right click doesn't select", async () => { it("must check that right click doesn't select", async () => {
await Promise.all( await Promise.all(
pages.map(async ([browserName, page]) => { pages.map(async ([browserName, page]) => {
await switchToFreeText(page);
const rect = await getRect(page, ".annotationEditorLayer"); const rect = await getRect(page, ".annotationEditorLayer");
const editorSelector = getEditorSelector(0);
await clearAll(page);
const editorSelector = getEditorSelector(8);
const data = "Hello PDF.js World !!"; const data = "Hello PDF.js World !!";
await page.mouse.click(rect.x + 100, rect.y + 100); await page.mouse.click(rect.x + 100, rect.y + 100);
await page.waitForSelector(editorSelector, { visible: true }); await page.waitForSelector(editorSelector, { visible: true });
@ -285,7 +315,7 @@ describe("FreeText Editor", () => {
expect(await getEditors(page, "selected")) expect(await getEditors(page, "selected"))
.withContext(`In ${browserName}`) .withContext(`In ${browserName}`)
.toEqual([8]); .toEqual([0]);
await page.keyboard.press("Escape"); await page.keyboard.press("Escape");
await page.waitForFunction( await page.waitForFunction(
@ -295,7 +325,7 @@ describe("FreeText Editor", () => {
await selectEditor(page, editorSelector); await selectEditor(page, editorSelector);
expect(await getEditors(page, "selected")) expect(await getEditors(page, "selected"))
.withContext(`In ${browserName}`) .withContext(`In ${browserName}`)
.toEqual([8]); .toEqual([0]);
// Escape. // Escape.
await page.keyboard.press("Escape"); await page.keyboard.press("Escape");
@ -317,11 +347,10 @@ describe("FreeText Editor", () => {
it("must check that text change can be undone/redone", async () => { it("must check that text change can be undone/redone", async () => {
// Run sequentially to avoid clipboard issues. // Run sequentially to avoid clipboard issues.
for (const [browserName, page] of pages) { for (const [browserName, page] of pages) {
await switchToFreeText(page);
const rect = await getRect(page, ".annotationEditorLayer"); const rect = await getRect(page, ".annotationEditorLayer");
const editorSelector = getEditorSelector(0);
await clearAll(page);
const editorSelector = getEditorSelector(9);
await page.mouse.click(rect.x + 200, rect.y + 100); await page.mouse.click(rect.x + 200, rect.y + 100);
await page.waitForSelector(editorSelector, { visible: true }); await page.waitForSelector(editorSelector, { visible: true });