Skip to content

Commit

Permalink
Merge pull request #17400 from calixteman/autoprint_test
Browse files Browse the repository at this point in the history
Set a print listener as soon as possible in the autoprint integration test
  • Loading branch information
timvandermeij authored Dec 9, 2023
2 parents 056e639 + 82be74d commit 39a1fc6
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 8 deletions.
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

0 comments on commit 39a1fc6

Please sign in to comment.