Merge pull request #17400 from calixteman/autoprint_test

Set a print listener as soon as possible in the autoprint integration test
This commit is contained in:
Tim van der Meij 2023-12-09 20:12:45 +01:00 committed by GitHub
commit 39a1fc6992
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 41 additions and 8 deletions

View File

@ -14,6 +14,7 @@
*/ */
import { import {
awaitPromise,
clearInput, clearInput,
closePages, closePages,
getAnnotationStorage, getAnnotationStorage,
@ -1771,28 +1772,58 @@ describe("Interaction", () => {
describe("in autoprint.pdf", () => { describe("in autoprint.pdf", () => {
let pages; let pages;
const printHandles = new Map();
beforeAll(async () => { beforeAll(async () => {
// Autoprinting is triggered by the `Open` event, which is one of the // Autoprinting is triggered by the `Open` event, which is one of the
// first events to be dispatched to the sandbox, even before scripting // first events to be dispatched to the sandbox, even before scripting
// is reported to be ready. It's therefore important that `loadAndWait` // is reported to be ready. It's therefore important that `loadAndWait`
// returns control as soon as possible after opening the PDF document, // returns control as soon as possible after opening the PDF document.
// and the first element we can check for is the `<html>` tag of the // Note that the `autoprint.pdf` file is very small, so printing
// viewer. Note that the `autoprint.pdf` file is very small, so printing
// it is usually very fast and therefore activating the selector check // it is usually very fast and therefore activating the selector check
// too late will cause it to never resolve because printing is already // too late will cause it to never resolve because printing is already
// done (and the printed page div removed) before we even get to it. // done (and the printed page div removed) before we even get to it.
pages = await loadAndWait("autoprint.pdf", "html"); pages = await loadAndWait(
"autoprint.pdf",
"",
null /* pageSetup = */,
async page => {
printHandles.set(
page,
await page.evaluateHandle(() => [
new Promise(resolve => {
globalThis.printResolve = resolve;
}),
])
);
await page.waitForFunction(() => {
if (!window.PDFViewerApplication?.eventBus) {
return false;
}
window.PDFViewerApplication.eventBus.on(
"print",
() => {
const resolve = globalThis.printResolve;
delete globalThis.printResolve;
resolve();
},
{ once: true }
);
return true;
});
}
);
}); });
afterAll(async () => { afterAll(async () => {
await closePages(pages); await closePages(pages);
printHandles.clear();
}); });
it("must check if printing is triggered when the document is open", async () => { it("must check if printing is triggered when the document is open", async () => {
await Promise.all( await Promise.all(
pages.map(async ([browserName, page]) => { pages.map(async ([browserName, page]) => {
await page.waitForSelector(".printedPage"); await awaitPromise(printHandles.get(page));
}) })
); );
}); });

View File

@ -46,9 +46,11 @@ function loadAndWait(filename, selector, zoom, pageSetup) {
} }
await page.bringToFront(); await page.bringToFront();
if (selector) {
await page.waitForSelector(selector, { await page.waitForSelector(selector, {
timeout: 0, timeout: 0,
}); });
}
return [session.name, page]; return [session.name, page];
}) })
); );