Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Set a print listener as soon as possible in the autoprint integration test #17400

Merged
merged 1 commit into from
Dec 9, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 36 additions & 5 deletions test/integration/scripting_spec.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
*/

import {
awaitPromise,
clearInput,
closePages,
getAnnotationStorage,
Expand Down Expand Up @@ -1771,28 +1772,58 @@ describe("Interaction", () => {

describe("in autoprint.pdf", () => {
let pages;
const printHandles = new Map();

beforeAll(async () => {
// Autoprinting is triggered by the `Open` event, which is one of the
// first events to be dispatched to the sandbox, even before scripting
// is reported to be ready. It's therefore important that `loadAndWait`
// 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
// viewer. Note that the `autoprint.pdf` file is very small, so printing
// returns control as soon as possible after opening the PDF document.
// Note that the `autoprint.pdf` file is very small, so printing
// it is usually very fast and therefore activating the selector check
// 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.
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 () => {
await closePages(pages);
printHandles.clear();
});

it("must check if printing is triggered when the document is open", async () => {
await Promise.all(
pages.map(async ([browserName, page]) => {
await page.waitForSelector(".printedPage");
await awaitPromise(printHandles.get(page));
})
);
});
Expand Down
8 changes: 5 additions & 3 deletions test/integration/test_utils.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,11 @@ function loadAndWait(filename, selector, zoom, pageSetup) {
}

await page.bringToFront();
await page.waitForSelector(selector, {
timeout: 0,
});
if (selector) {
await page.waitForSelector(selector, {
timeout: 0,
});
}
return [session.name, page];
})
);
Expand Down