Fix editor tests on Windows
- In #15373, we implemented copy/paste actions in using the system clipboard. For any reasons, on Windows, the clipboard doesn't contain the expected data when the tests are ran in parallel, hence the tests which are using the clipboard need to be ran sequentially. - Make sure that we can paste after having copied.
This commit is contained in:
parent
22225a1eaa
commit
2384fbcb89
@ -18,8 +18,25 @@ const {
|
|||||||
getEditorSelector,
|
getEditorSelector,
|
||||||
getSelectedEditors,
|
getSelectedEditors,
|
||||||
loadAndWait,
|
loadAndWait,
|
||||||
|
waitForEvent,
|
||||||
} = require("./test_utils.js");
|
} = require("./test_utils.js");
|
||||||
|
|
||||||
|
const copyPaste = async page => {
|
||||||
|
let promise = waitForEvent(page, "copy");
|
||||||
|
await page.keyboard.down("Control");
|
||||||
|
await page.keyboard.press("c");
|
||||||
|
await page.keyboard.up("Control");
|
||||||
|
await promise;
|
||||||
|
|
||||||
|
await page.waitForTimeout(10);
|
||||||
|
|
||||||
|
promise = waitForEvent(page, "paste");
|
||||||
|
await page.keyboard.down("Control");
|
||||||
|
await page.keyboard.press("v");
|
||||||
|
await page.keyboard.up("Control");
|
||||||
|
await promise;
|
||||||
|
};
|
||||||
|
|
||||||
describe("Editor", () => {
|
describe("Editor", () => {
|
||||||
describe("FreeText", () => {
|
describe("FreeText", () => {
|
||||||
let pages;
|
let pages;
|
||||||
@ -32,10 +49,22 @@ describe("Editor", () => {
|
|||||||
await closePages(pages);
|
await closePages(pages);
|
||||||
});
|
});
|
||||||
|
|
||||||
const countStorageEntries = async page =>
|
const waitForStorageEntries = async (page, nEntries) => {
|
||||||
page.evaluate(
|
await page.waitForFunction(
|
||||||
() => window.PDFViewerApplication.pdfDocument.annotationStorage.size
|
n =>
|
||||||
|
window.PDFViewerApplication.pdfDocument.annotationStorage.size === n,
|
||||||
|
{},
|
||||||
|
nEntries
|
||||||
);
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const waitForSelected = async (page, selector) => {
|
||||||
|
await page.waitForFunction(
|
||||||
|
sel => document.querySelector(sel).classList.contains("selectedEditor"),
|
||||||
|
{},
|
||||||
|
selector
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
it("must write a string in a FreeText editor", async () => {
|
it("must write a string in a FreeText editor", async () => {
|
||||||
await Promise.all(
|
await Promise.all(
|
||||||
@ -69,9 +98,8 @@ describe("Editor", () => {
|
|||||||
editorRect.y + 2 * editorRect.height
|
editorRect.y + 2 * editorRect.height
|
||||||
);
|
);
|
||||||
|
|
||||||
expect(await countStorageEntries(page))
|
await waitForSelected(page, getEditorSelector(0));
|
||||||
.withContext(`In ${browserName}`)
|
await waitForStorageEntries(page, 1);
|
||||||
.toEqual(1);
|
|
||||||
|
|
||||||
const content = await page.$eval(getEditorSelector(0), el =>
|
const content = await page.$eval(getEditorSelector(0), el =>
|
||||||
el.innerText.trimEnd()
|
el.innerText.trimEnd()
|
||||||
@ -82,8 +110,8 @@ describe("Editor", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("must copy/paste", async () => {
|
it("must copy/paste", async () => {
|
||||||
await Promise.all(
|
// Run sequentially to avoid clipboard issues.
|
||||||
pages.map(async ([browserName, page]) => {
|
for (const [browserName, page] of pages) {
|
||||||
const editorRect = await page.$eval(getEditorSelector(0), el => {
|
const editorRect = await page.$eval(getEditorSelector(0), el => {
|
||||||
const { x, y, width, height } = el.getBoundingClientRect();
|
const { x, y, width, height } = el.getBoundingClientRect();
|
||||||
return { x, y, width, height };
|
return { x, y, width, height };
|
||||||
@ -95,17 +123,9 @@ describe("Editor", () => {
|
|||||||
editorRect.y + editorRect.height / 2
|
editorRect.y + editorRect.height / 2
|
||||||
);
|
);
|
||||||
|
|
||||||
await page.keyboard.down("Control");
|
await waitForSelected(page, getEditorSelector(0));
|
||||||
await page.keyboard.press("c");
|
await copyPaste(page);
|
||||||
await page.keyboard.up("Control");
|
await waitForStorageEntries(page, 2);
|
||||||
|
|
||||||
await page.keyboard.down("Control");
|
|
||||||
await page.keyboard.press("v");
|
|
||||||
await page.keyboard.up("Control");
|
|
||||||
|
|
||||||
expect(await countStorageEntries(page))
|
|
||||||
.withContext(`In ${browserName}`)
|
|
||||||
.toEqual(2);
|
|
||||||
|
|
||||||
const content = await page.$eval(getEditorSelector(0), el =>
|
const content = await page.$eval(getEditorSelector(0), el =>
|
||||||
el.innerText.trimEnd()
|
el.innerText.trimEnd()
|
||||||
@ -115,30 +135,16 @@ describe("Editor", () => {
|
|||||||
el.innerText.trimEnd()
|
el.innerText.trimEnd()
|
||||||
);
|
);
|
||||||
|
|
||||||
expect(pastedContent)
|
expect(pastedContent).withContext(`In ${browserName}`).toEqual(content);
|
||||||
.withContext(`In ${browserName}`)
|
|
||||||
.toEqual(content);
|
|
||||||
|
|
||||||
await page.keyboard.down("Control");
|
await copyPaste(page);
|
||||||
await page.keyboard.press("c");
|
await waitForStorageEntries(page, 3);
|
||||||
await page.keyboard.up("Control");
|
|
||||||
|
|
||||||
await page.keyboard.down("Control");
|
|
||||||
await page.keyboard.press("v");
|
|
||||||
await page.keyboard.up("Control");
|
|
||||||
|
|
||||||
expect(await countStorageEntries(page))
|
|
||||||
.withContext(`In ${browserName}`)
|
|
||||||
.toEqual(3);
|
|
||||||
|
|
||||||
pastedContent = await page.$eval(getEditorSelector(2), el =>
|
pastedContent = await page.$eval(getEditorSelector(2), el =>
|
||||||
el.innerText.trimEnd()
|
el.innerText.trimEnd()
|
||||||
);
|
);
|
||||||
expect(pastedContent)
|
expect(pastedContent).withContext(`In ${browserName}`).toEqual(content);
|
||||||
.withContext(`In ${browserName}`)
|
}
|
||||||
.toEqual(content);
|
|
||||||
})
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it("must clear all", async () => {
|
it("must clear all", async () => {
|
||||||
@ -160,16 +166,14 @@ describe("Editor", () => {
|
|||||||
expect(hasEditor).withContext(`In ${browserName}`).toEqual(false);
|
expect(hasEditor).withContext(`In ${browserName}`).toEqual(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
expect(await countStorageEntries(page))
|
await waitForStorageEntries(page, 0);
|
||||||
.withContext(`In ${browserName}`)
|
|
||||||
.toEqual(0);
|
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("must check that a paste has been undone", async () => {
|
it("must check that a paste has been undone", async () => {
|
||||||
await Promise.all(
|
// Run sequentially to avoid clipboard issues.
|
||||||
pages.map(async ([browserName, page]) => {
|
for (const [browserName, page] of pages) {
|
||||||
const rect = await page.$eval(".annotationEditorLayer", el => {
|
const rect = await page.$eval(".annotationEditorLayer", el => {
|
||||||
const { x, y } = el.getBoundingClientRect();
|
const { x, y } = el.getBoundingClientRect();
|
||||||
return { x, y };
|
return { x, y };
|
||||||
@ -195,13 +199,8 @@ describe("Editor", () => {
|
|||||||
editorRect.y + editorRect.height / 2
|
editorRect.y + editorRect.height / 2
|
||||||
);
|
);
|
||||||
|
|
||||||
await page.keyboard.down("Control");
|
await waitForSelected(page, getEditorSelector(3));
|
||||||
await page.keyboard.press("c");
|
await copyPaste(page);
|
||||||
await page.keyboard.up("Control");
|
|
||||||
|
|
||||||
await page.keyboard.down("Control");
|
|
||||||
await page.keyboard.press("v");
|
|
||||||
await page.keyboard.up("Control");
|
|
||||||
|
|
||||||
let hasEditor = await page.evaluate(sel => {
|
let hasEditor = await page.evaluate(sel => {
|
||||||
return !!document.querySelector(sel);
|
return !!document.querySelector(sel);
|
||||||
@ -212,6 +211,7 @@ describe("Editor", () => {
|
|||||||
await page.keyboard.down("Control");
|
await page.keyboard.down("Control");
|
||||||
await page.keyboard.press("z");
|
await page.keyboard.press("z");
|
||||||
await page.keyboard.up("Control");
|
await page.keyboard.up("Control");
|
||||||
|
await page.waitForTimeout(10);
|
||||||
|
|
||||||
hasEditor = await page.evaluate(sel => {
|
hasEditor = await page.evaluate(sel => {
|
||||||
return !!document.querySelector(sel);
|
return !!document.querySelector(sel);
|
||||||
@ -220,9 +220,12 @@ describe("Editor", () => {
|
|||||||
expect(hasEditor).withContext(`In ${browserName}`).toEqual(false);
|
expect(hasEditor).withContext(`In ${browserName}`).toEqual(false);
|
||||||
|
|
||||||
for (let i = 0; i < 2; i++) {
|
for (let i = 0; i < 2; i++) {
|
||||||
|
const promise = waitForEvent(page, "paste");
|
||||||
await page.keyboard.down("Control");
|
await page.keyboard.down("Control");
|
||||||
await page.keyboard.press("v");
|
await page.keyboard.press("v");
|
||||||
await page.keyboard.up("Control");
|
await page.keyboard.up("Control");
|
||||||
|
await promise;
|
||||||
|
await page.waitForTimeout(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
let length = await page.evaluate(sel => {
|
let length = await page.evaluate(sel => {
|
||||||
@ -234,14 +237,14 @@ describe("Editor", () => {
|
|||||||
await page.keyboard.down("Control");
|
await page.keyboard.down("Control");
|
||||||
await page.keyboard.press("z");
|
await page.keyboard.press("z");
|
||||||
await page.keyboard.up("Control");
|
await page.keyboard.up("Control");
|
||||||
|
await page.waitForTimeout(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
length = await page.evaluate(sel => {
|
length = await page.evaluate(sel => {
|
||||||
return document.querySelectorAll(sel).length;
|
return document.querySelectorAll(sel).length;
|
||||||
}, `${getEditorSelector(5)}, ${getEditorSelector(6)}`);
|
}, `${getEditorSelector(5)}, ${getEditorSelector(6)}`);
|
||||||
expect(length).withContext(`In ${browserName}`).toEqual(0);
|
expect(length).withContext(`In ${browserName}`).toEqual(0);
|
||||||
})
|
}
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it("must check that aria-owns is correct", async () => {
|
it("must check that aria-owns is correct", async () => {
|
||||||
@ -332,6 +335,8 @@ describe("Editor", () => {
|
|||||||
editorRect.y + editorRect.height / 2
|
editorRect.y + editorRect.height / 2
|
||||||
);
|
);
|
||||||
|
|
||||||
|
await waitForSelected(page, getEditorSelector(8));
|
||||||
|
|
||||||
expect(await getSelectedEditors(page))
|
expect(await getSelectedEditors(page))
|
||||||
.withContext(`In ${browserName}`)
|
.withContext(`In ${browserName}`)
|
||||||
.toEqual([8]);
|
.toEqual([8]);
|
||||||
@ -367,8 +372,8 @@ describe("Editor", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("must select/unselect several editors and check copy, paste and delete operations", async () => {
|
it("must select/unselect several editors and check copy, paste and delete operations", async () => {
|
||||||
await Promise.all(
|
// Run sequentially to avoid clipboard issues.
|
||||||
pages.map(async ([browserName, page]) => {
|
for (const [browserName, page] of pages) {
|
||||||
await page.click("#editorFreeText");
|
await page.click("#editorFreeText");
|
||||||
|
|
||||||
const rect = await page.$eval(".annotationEditorLayer", el => {
|
const rect = await page.$eval(".annotationEditorLayer", el => {
|
||||||
@ -436,13 +441,7 @@ describe("Editor", () => {
|
|||||||
.withContext(`In ${browserName}`)
|
.withContext(`In ${browserName}`)
|
||||||
.toEqual([0, 1, 3]);
|
.toEqual([0, 1, 3]);
|
||||||
|
|
||||||
await page.keyboard.down("Control");
|
await copyPaste(page);
|
||||||
await page.keyboard.press("c");
|
|
||||||
await page.keyboard.up("Control");
|
|
||||||
|
|
||||||
await page.keyboard.down("Control");
|
|
||||||
await page.keyboard.press("v");
|
|
||||||
await page.keyboard.up("Control");
|
|
||||||
|
|
||||||
// 0,1,3 are unselected and new pasted editors are selected.
|
// 0,1,3 are unselected and new pasted editors are selected.
|
||||||
expect(await getSelectedEditors(page))
|
expect(await getSelectedEditors(page))
|
||||||
@ -510,8 +509,7 @@ describe("Editor", () => {
|
|||||||
expect(await getSelectedEditors(page))
|
expect(await getSelectedEditors(page))
|
||||||
.withContext(`In ${browserName}`)
|
.withContext(`In ${browserName}`)
|
||||||
.toEqual([0, 2, 4, 5, 6]);
|
.toEqual([0, 2, 4, 5, 6]);
|
||||||
})
|
}
|
||||||
);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -24,6 +24,9 @@ const {
|
|||||||
|
|
||||||
describe("Interaction", () => {
|
describe("Interaction", () => {
|
||||||
async function actAndWaitForInput(page, selector, action, clear = true) {
|
async function actAndWaitForInput(page, selector, action, clear = true) {
|
||||||
|
await page.waitForSelector(selector, {
|
||||||
|
timeout: 0,
|
||||||
|
});
|
||||||
if (clear) {
|
if (clear) {
|
||||||
await clearInput(page, selector);
|
await clearInput(page, selector);
|
||||||
}
|
}
|
||||||
@ -1430,13 +1433,18 @@ describe("Interaction", () => {
|
|||||||
[45, 180],
|
[45, 180],
|
||||||
[46, 270],
|
[46, 270],
|
||||||
]) {
|
]) {
|
||||||
const rotation = await page.$eval(
|
await page.waitForFunction(
|
||||||
|
(sel, b, a) => {
|
||||||
|
const el = document.querySelector(sel);
|
||||||
|
const rotation =
|
||||||
|
parseInt(el.getAttribute("data-main-rotation")) || 0;
|
||||||
|
return rotation === (360 + ((360 - (b + a)) % 360)) % 360;
|
||||||
|
},
|
||||||
|
{},
|
||||||
`[data-annotation-id='${ref}R']`,
|
`[data-annotation-id='${ref}R']`,
|
||||||
el => parseInt(el.getAttribute("data-main-rotation") || 0)
|
base,
|
||||||
|
angle
|
||||||
);
|
);
|
||||||
expect(rotation)
|
|
||||||
.withContext(`In ${browserName}`)
|
|
||||||
.toEqual((360 + ((360 - (base + angle)) % 360)) % 360);
|
|
||||||
}
|
}
|
||||||
base += 90;
|
base += 90;
|
||||||
await page.click(getSelector("48R"));
|
await page.click(getSelector("48R"));
|
||||||
|
@ -87,3 +87,16 @@ function getSelectedEditors(page) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
exports.getSelectedEditors = getSelectedEditors;
|
exports.getSelectedEditors = getSelectedEditors;
|
||||||
|
|
||||||
|
async function waitForEvent(page, eventName, timeout = 30000) {
|
||||||
|
await Promise.race([
|
||||||
|
// add event listener and wait for event to fire before returning
|
||||||
|
page.evaluate(name => {
|
||||||
|
return new Promise(resolve => {
|
||||||
|
document.addEventListener(name, resolve, { once: true });
|
||||||
|
});
|
||||||
|
}, eventName),
|
||||||
|
page.waitForTimeout(timeout),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
exports.waitForEvent = waitForEvent;
|
||||||
|
Loading…
Reference in New Issue
Block a user