Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Errors

/* Any copyright is dedicated to the Public Domain.
const RELATIVE_DIR = "toolkit/components/pdfjs/test/";
const TESTROOT = "https://example.com/browser/" + RELATIVE_DIR;
const PDF_EMPTY_SERVER = `${TESTROOT}pdf_empty.sjs`;
const PDF_TRUNCATED_SERVER = `${TESTROOT}pdf_truncated.sjs`;
const PDF_URL = `${TESTROOT}file_pdfjs_test.pdf`;
const NON_PDF_URL =
encodeURIComponent("<!DOCTYPE html>Not a PDF.");
const BLANK_URL = "about:blank";
async function test_pdf_empty(disableStream, browser) {
info(`Loading an empty PDF response with disableStream=${disableStream}.`);
await SpecialPowers.pushPrefEnv({
set: [["pdfjs.disableStream", disableStream]],
});
const loaded = BrowserTestUtils.browserLoaded(
browser,
false,
PDF_EMPTY_SERVER
);
BrowserTestUtils.startLoadingURIString(browser, PDF_EMPTY_SERVER);
await loaded;
await SpecialPowers.spawn(browser, [], async () => {
// Preloading defines this property; cleanup sets it to null.
await ContentTaskUtils.waitForCondition(
() => content.wrappedJSObject.pdfjsPreloadedWorker === null,
"Waiting for the preloaded worker to be destroyed"
);
Assert.strictEqual(
content.wrappedJSObject.pdfjsPreloadedWorker,
null,
"The preloaded worker has been destroyed on load failure"
);
});
await SpecialPowers.popPrefEnv();
}
add_task(async function test_pdf_empty_no_stream_request() {
await BrowserTestUtils.withNewTab(
{ gBrowser, url: BLANK_URL },
test_pdf_empty.bind(null, true)
);
});
add_task(async function test_pdf_empty_with_stream_request() {
await BrowserTestUtils.withNewTab(
{ gBrowser, url: BLANK_URL },
test_pdf_empty.bind(null, false)
);
});
add_task(async function test_pdf_truncated_stream_keeps_worker() {
await SpecialPowers.pushPrefEnv({
// Report the short response as NS_ERROR_NET_PARTIAL_TRANSFER.
set: [["network.http.enforce-framing.http1", true]],
});
await BrowserTestUtils.withNewTab(
{ gBrowser, url: BLANK_URL },
async browser => {
await waitForPdfJS(browser, PDF_TRUNCATED_SERVER);
await SpecialPowers.spawn(browser, [], () => {
const win = content.wrappedJSObject;
Assert.strictEqual(
win.PDFViewerApplicationOptions.get("workerPort"),
win.pdfjsPreloadedWorker,
"The viewer is still using the preloaded worker"
);
});
await waitForPdfJSClose(browser);
}
);
await SpecialPowers.popPrefEnv();
});
add_task(async function test_pdf_load_uses_preloaded_worker() {
await BrowserTestUtils.withNewTab(
{ gBrowser, url: BLANK_URL },
async browser => {
await waitForPdfJS(browser, PDF_URL);
await SpecialPowers.spawn(browser, [], () => {
const win = content.wrappedJSObject;
const worker = win.pdfjsPreloadedWorker;
Assert.ok(worker, "The preloaded worker has not been destroyed");
// AppOptions reads the preloaded worker during module evaluation.
Assert.strictEqual(
win.PDFViewerApplicationOptions.get("workerPort"),
worker,
"The document has been rendered with the preloaded worker"
);
});
await waitForPdfJSClose(browser);
}
);
});
add_task(async function test_pdf_reopen_reuses_preloaded_worker() {
await BrowserTestUtils.withNewTab(
{ gBrowser, url: BLANK_URL },
async browser => {
await waitForPdfJS(browser, PDF_URL);
await SpecialPowers.spawn(browser, [], async () => {
const win = content.wrappedJSObject;
const { PDFViewerApplication: app } = win;
const worker = win.pdfjsPreloadedWorker;
const data = await app.pdfDocument.getData();
const pagesLoaded = new Promise(resolve => {
app.eventBus.on("pagesloaded", resolve, { once: true });
});
await app.open(Cu.cloneInto({ data }, win));
await pagesLoaded;
Assert.strictEqual(
win.PDFViewerApplicationOptions.get("workerPort"),
worker,
"The reopened document reuses the preloaded worker"
);
});
await waitForPdfJSClose(browser);
}
);
});
add_task(async function test_disable_worker_skips_preloading() {
await SpecialPowers.pushPrefEnv({
set: [["pdfjs.pdfBugEnabled", true]],
});
await BrowserTestUtils.withNewTab(
{ gBrowser, url: BLANK_URL },
async browser => {
await waitForPdfJS(browser, `${PDF_URL}#disableworker=true`);
await SpecialPowers.spawn(browser, [], () => {
Assert.strictEqual(
content.wrappedJSObject.pdfjsPreloadedWorker,
undefined,
"No worker is preloaded when workers are disabled"
);
});
await waitForPdfJSClose(browser);
}
);
await SpecialPowers.popPrefEnv();
});
add_task(async function test_no_worker_for_non_pdf_document() {
await BrowserTestUtils.withNewTab(
{ gBrowser, url: NON_PDF_URL },
async browser => {
await SpecialPowers.spawn(browser, [], () => {
// Actor creation alone must not preload a worker.
content.windowGlobalChild.getActor("PdfJs");
Assert.strictEqual(
content.wrappedJSObject.pdfjsPreloadedWorker,
undefined,
"No worker has been preloaded in a non-PDF document"
);
});
}
);
});