1
0
Fork 0
mirror of https://github.com/mozilla/pdf.js.git synced 2025-04-24 09:08:07 +02:00

Inline the default Factory-definitions in getDocument

- Most of the these are only used in the `src/display/api.js` file, and this leads to slightly shorter code.

 - A number of unit-tests need a `BaseCanvasFactory`-instance, however that one is available through the `PDFDocumentProxy`-instance nowadays.

 - For other unit-tests the remaining necessary default Factory-definitions can be moved into the `test/unit/test_utils.js` file.
This commit is contained in:
Jonas Jenwald 2025-01-18 12:42:24 +01:00
parent 6d12d2924f
commit db43f158dc
6 changed files with 105 additions and 94 deletions

View file

@ -34,13 +34,11 @@ import {
import {
CMAP_URL,
createIdFactory,
DefaultCMapReaderFactory,
DefaultStandardFontDataFactory,
STANDARD_FONT_DATA_URL,
XRefMock,
} from "./test_utils.js";
import {
DefaultCMapReaderFactory,
DefaultStandardFontDataFactory,
} from "../../src/display/api.js";
import { Dict, Name, Ref, RefSetCache } from "../../src/core/primitives.js";
import { Lexer, Parser } from "../../src/core/parser.js";
import { FlateStream } from "../../src/core/flate_stream.js";

View file

@ -37,7 +37,12 @@ import {
TestPdfsServer,
} from "./test_utils.js";
import {
DefaultCanvasFactory,
fetchData as fetchDataDOM,
PageViewport,
RenderingCancelledException,
StatTimer,
} from "../../src/display/display_utils.js";
import {
getDocument,
PDFDataRangeTransport,
PDFDocumentLoadingTask,
@ -46,12 +51,6 @@ import {
PDFWorker,
RenderTask,
} from "../../src/display/api.js";
import {
fetchData as fetchDataDOM,
PageViewport,
RenderingCancelledException,
StatTimer,
} from "../../src/display/display_utils.js";
import { AutoPrintRegExp } from "../../web/ui_utils.js";
import { GlobalImageCache } from "../../src/core/image_utils.js";
import { GlobalWorkerOptions } from "../../src/display/worker_options.js";
@ -67,17 +66,11 @@ describe("api", function () {
const tracemonkeyGetDocumentParams =
buildGetDocumentParams(tracemonkeyFileName);
let CanvasFactory;
beforeAll(async function () {
CanvasFactory = new DefaultCanvasFactory({});
await TestPdfsServer.ensureStarted();
});
afterAll(async function () {
CanvasFactory = null;
await TestPdfsServer.ensureStopped();
});
@ -4280,7 +4273,8 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
const viewport = pdfPage.getViewport({ scale: 1 });
expect(viewport instanceof PageViewport).toEqual(true);
const canvasAndCtx = CanvasFactory.create(
const { canvasFactory } = pdfDoc;
const canvasAndCtx = canvasFactory.create(
viewport.width,
viewport.height
);
@ -4307,7 +4301,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
expect(statEntryThree.name).toEqual("Overall");
expect(statEntryThree.end - statEntryThree.start).toBeGreaterThan(0);
CanvasFactory.destroy(canvasAndCtx);
canvasFactory.destroy(canvasAndCtx);
await loadingTask.destroy();
});
@ -4315,7 +4309,8 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
const viewport = page.getViewport({ scale: 1 });
expect(viewport instanceof PageViewport).toEqual(true);
const canvasAndCtx = CanvasFactory.create(
const { canvasFactory } = pdfDocument;
const canvasAndCtx = canvasFactory.create(
viewport.width,
viewport.height
);
@ -4338,14 +4333,15 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
expect(reason.extraDelay).toEqual(0);
}
CanvasFactory.destroy(canvasAndCtx);
canvasFactory.destroy(canvasAndCtx);
});
it("re-render page, using the same canvas, after cancelling rendering", async function () {
const viewport = page.getViewport({ scale: 1 });
expect(viewport instanceof PageViewport).toEqual(true);
const canvasAndCtx = CanvasFactory.create(
const { canvasFactory } = pdfDocument;
const canvasAndCtx = canvasFactory.create(
viewport.width,
viewport.height
);
@ -4375,7 +4371,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
await reRenderTask.promise;
expect(reRenderTask.separateAnnots).toEqual(false);
CanvasFactory.destroy(canvasAndCtx);
canvasFactory.destroy(canvasAndCtx);
});
it("multiple render() on the same canvas", async function () {
@ -4385,7 +4381,8 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
const viewport = page.getViewport({ scale: 1 });
expect(viewport instanceof PageViewport).toEqual(true);
const canvasAndCtx = CanvasFactory.create(
const { canvasFactory } = pdfDocument;
const canvasAndCtx = canvasFactory.create(
viewport.width,
viewport.height
);
@ -4416,6 +4413,8 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
}
),
]);
canvasFactory.destroy(canvasAndCtx);
});
it("cleans up document resources after rendering of page", async function () {
@ -4426,7 +4425,8 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
const viewport = pdfPage.getViewport({ scale: 1 });
expect(viewport instanceof PageViewport).toEqual(true);
const canvasAndCtx = CanvasFactory.create(
const { canvasFactory } = pdfDoc;
const canvasAndCtx = canvasFactory.create(
viewport.width,
viewport.height
);
@ -4442,7 +4442,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
await pdfDoc.cleanup();
expect(true).toEqual(true);
CanvasFactory.destroy(canvasAndCtx);
canvasFactory.destroy(canvasAndCtx);
await loadingTask.destroy();
});
@ -4454,7 +4454,8 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
const viewport = pdfPage.getViewport({ scale: 1 });
expect(viewport instanceof PageViewport).toEqual(true);
const canvasAndCtx = CanvasFactory.create(
const { canvasFactory } = pdfDoc;
const canvasAndCtx = canvasFactory.create(
viewport.width,
viewport.height
);
@ -4489,7 +4490,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
const { data } = canvasAndCtx.context.getImageData(0, 0, 1, 1);
expect(data).toEqual(new Uint8ClampedArray([255, 0, 0, 255]));
CanvasFactory.destroy(canvasAndCtx);
canvasFactory.destroy(canvasAndCtx);
await loadingTask.destroy();
});
@ -4505,6 +4506,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
})
);
const pdfDoc = await loadingTask.promise;
const { canvasFactory } = pdfDoc;
let checkedCopyLocalImage = false,
firstImgData = null,
firstStatsOverall = null;
@ -4513,7 +4515,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
const pdfPage = await pdfDoc.getPage(i);
const viewport = pdfPage.getViewport({ scale: 1 });
const canvasAndCtx = CanvasFactory.create(
const canvasAndCtx = canvasFactory.create(
viewport.width,
viewport.height
);
@ -4526,7 +4528,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
const opList = renderTask.getOperatorList();
// The canvas is no longer necessary, since we only care about
// the image-data below.
CanvasFactory.destroy(canvasAndCtx);
canvasFactory.destroy(canvasAndCtx);
const [statsOverall] = pdfPage.stats.times
.filter(time => time.name === "Overall")
@ -4609,6 +4611,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
})
);
const pdfDoc = await loadingTask.promise;
const { canvasFactory } = pdfDoc;
let checkedCopyLocalImage = false,
firstStatsOverall = null;
@ -4616,7 +4619,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
const pdfPage = await pdfDoc.getPage(i);
const viewport = pdfPage.getViewport({ scale: 1 });
const canvasAndCtx = CanvasFactory.create(
const canvasAndCtx = canvasFactory.create(
viewport.width,
viewport.height
);
@ -4628,7 +4631,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
await renderTask.promise;
// The canvas is no longer necessary, since we only care about
// the stats below.
CanvasFactory.destroy(canvasAndCtx);
canvasFactory.destroy(canvasAndCtx);
const [statsOverall] = pdfPage.stats.times
.filter(time => time.name === "Overall")
@ -4656,13 +4659,14 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
const loadingTask = getDocument(buildGetDocumentParams("issue18042.pdf"));
const pdfDoc = await loadingTask.promise;
const { canvasFactory } = pdfDoc;
let checkedGlobalDecodeFailed = false;
for (let i = 1; i <= pdfDoc.numPages; i++) {
const pdfPage = await pdfDoc.getPage(i);
const viewport = pdfPage.getViewport({ scale: 1 });
const canvasAndCtx = CanvasFactory.create(
const canvasAndCtx = canvasFactory.create(
viewport.width,
viewport.height
);
@ -4675,7 +4679,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
const opList = renderTask.getOperatorList();
// The canvas is no longer necessary, since we only care about
// the image-data below.
CanvasFactory.destroy(canvasAndCtx);
canvasFactory.destroy(canvasAndCtx);
const { commonObjs, objs } = pdfPage;
const imgIndex = opList.fnArray.indexOf(OPS.paintImageXObject);
@ -4712,7 +4716,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
it("render for printing, with `printAnnotationStorage` set", async function () {
async function getPrintData(printAnnotationStorage = null) {
const canvasAndCtx = CanvasFactory.create(
const canvasAndCtx = canvasFactory.create(
viewport.width,
viewport.height
);
@ -4728,7 +4732,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
expect(renderTask.separateAnnots).toEqual(false);
const printData = canvasAndCtx.canvas.toDataURL();
CanvasFactory.destroy(canvasAndCtx);
canvasFactory.destroy(canvasAndCtx);
return printData;
}
@ -4737,6 +4741,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
buildGetDocumentParams("annotation-tx.pdf")
);
const pdfDoc = await loadingTask.promise;
const { canvasFactory } = pdfDoc;
const pdfPage = await pdfDoc.getPage(1);
const viewport = pdfPage.getViewport({ scale: 1 });
@ -4797,7 +4802,8 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
const viewport = page.getViewport({ scale: 1.2 });
expect(viewport instanceof PageViewport).toEqual(true);
const canvasAndCtx = CanvasFactory.create(
const { canvasFactory } = pdf;
const canvasAndCtx = canvasFactory.create(
viewport.width,
viewport.height
);
@ -4809,7 +4815,7 @@ Caron Broadcasting, Inc., an Ohio corporation (“Lessee”).`)
expect(renderTask.separateAnnots).toEqual(false);
const data = canvasAndCtx.canvas.toDataURL();
CanvasFactory.destroy(canvasAndCtx);
canvasFactory.destroy(canvasAndCtx);
return data;
}

View file

@ -14,8 +14,7 @@
*/
import { CMap, CMapFactory, IdentityCMap } from "../../src/core/cmap.js";
import { CMAP_URL } from "./test_utils.js";
import { DefaultCMapReaderFactory } from "../../src/display/api.js";
import { CMAP_URL, DefaultCMapReaderFactory } from "./test_utils.js";
import { Name } from "../../src/core/primitives.js";
import { StringStream } from "../../src/core/stream.js";

View file

@ -13,8 +13,8 @@
* limitations under the License.
*/
import { DefaultCanvasFactory, getDocument } from "../../src/display/api.js";
import { buildGetDocumentParams } from "./test_utils.js";
import { getDocument } from "../../src/display/api.js";
function getTopLeftPixel(canvasContext) {
const imgData = canvasContext.getImageData(0, 0, 1, 1);
@ -30,28 +30,24 @@ describe("custom canvas rendering", function () {
const transparentGetDocumentParams =
buildGetDocumentParams("transparent.pdf");
let CanvasFactory;
let loadingTask;
let page;
let loadingTask, doc, page;
beforeAll(async function () {
CanvasFactory = new DefaultCanvasFactory({});
loadingTask = getDocument(transparentGetDocumentParams);
const doc = await loadingTask.promise;
const data = await doc.getPage(1);
page = data;
doc = await loadingTask.promise;
page = await doc.getPage(1);
});
afterAll(async function () {
CanvasFactory = null;
doc = null;
page = null;
await loadingTask.destroy();
});
it("renders to canvas with a default white background", async function () {
const viewport = page.getViewport({ scale: 1 });
const canvasAndCtx = CanvasFactory.create(viewport.width, viewport.height);
const { canvasFactory } = doc;
const canvasAndCtx = canvasFactory.create(viewport.width, viewport.height);
const renderTask = page.render({
canvasContext: canvasAndCtx.context,
@ -65,12 +61,13 @@ describe("custom canvas rendering", function () {
b: 255,
a: 255,
});
CanvasFactory.destroy(canvasAndCtx);
canvasFactory.destroy(canvasAndCtx);
});
it("renders to canvas with a custom background", async function () {
const viewport = page.getViewport({ scale: 1 });
const canvasAndCtx = CanvasFactory.create(viewport.width, viewport.height);
const { canvasFactory } = doc;
const canvasAndCtx = canvasFactory.create(viewport.width, viewport.height);
const renderTask = page.render({
canvasContext: canvasAndCtx.context,
@ -85,7 +82,7 @@ describe("custom canvas rendering", function () {
b: 0,
a: 255,
});
CanvasFactory.destroy(canvasAndCtx);
canvasFactory.destroy(canvasAndCtx);
});
});
@ -137,17 +134,15 @@ describe("custom ownerDocument", function () {
getElementsByTagName: () => [{ append: () => {} }],
},
};
const CanvasFactory = new DefaultCanvasFactory({ ownerDocument });
return {
elements,
ownerDocument,
CanvasFactory,
};
}
it("should use given document for loading fonts (with Font Loading API)", async function () {
const { ownerDocument, elements, CanvasFactory } = getMocks();
const { ownerDocument, elements } = getMocks();
const getDocumentParams = buildGetDocumentParams(
"TrueType_without_cmap.pdf",
{
@ -161,7 +156,8 @@ describe("custom ownerDocument", function () {
const page = await doc.getPage(1);
const viewport = page.getViewport({ scale: 1 });
const canvasAndCtx = CanvasFactory.create(viewport.width, viewport.height);
const { canvasFactory } = doc;
const canvasAndCtx = canvasFactory.create(viewport.width, viewport.height);
await page.render({
canvasContext: canvasAndCtx.context,
@ -174,12 +170,12 @@ describe("custom ownerDocument", function () {
expect(Array.from(ownerDocument.fonts).find(checkFont)).toBeTruthy();
await loadingTask.destroy();
CanvasFactory.destroy(canvasAndCtx);
canvasFactory.destroy(canvasAndCtx);
expect(ownerDocument.fonts.size).toBe(0);
});
it("should use given document for loading fonts (with CSS rules)", async function () {
const { ownerDocument, elements, CanvasFactory } = getMocks();
const { ownerDocument, elements } = getMocks();
ownerDocument.fonts = null;
const getDocumentParams = buildGetDocumentParams(
"TrueType_without_cmap.pdf",
@ -194,7 +190,8 @@ describe("custom ownerDocument", function () {
const page = await doc.getPage(1);
const viewport = page.getViewport({ scale: 1 });
const canvasAndCtx = CanvasFactory.create(viewport.width, viewport.height);
const { canvasFactory } = doc;
const canvasAndCtx = canvasFactory.create(viewport.width, viewport.height);
await page.render({
canvasContext: canvasAndCtx.context,
@ -206,7 +203,7 @@ describe("custom ownerDocument", function () {
expect(style.sheet.cssRules.find(checkFontFaceRule)).toBeTruthy();
await loadingTask.destroy();
CanvasFactory.destroy(canvasAndCtx);
canvasFactory.destroy(canvasAndCtx);
expect(style.remove.called).toBe(true);
});
});

View file

@ -14,10 +14,16 @@
*/
import { assert, isNodeJS } from "../../src/shared/util.js";
import {
fetchData as fetchDataNode,
NodeCMapReaderFactory,
NodeStandardFontDataFactory,
} from "../../src/display/node_utils.js";
import { NullStream, StringStream } from "../../src/core/stream.js";
import { Page, PDFDocument } from "../../src/core/document.js";
import { DOMCMapReaderFactory } from "../../src/display/cmap_reader_factory.js";
import { DOMStandardFontDataFactory } from "../../src/display/standard_fontdata_factory.js";
import { fetchData as fetchDataDOM } from "../../src/display/display_utils.js";
import { fetchData as fetchDataNode } from "../../src/display/node_utils.js";
import { Ref } from "../../src/core/primitives.js";
const TEST_PDFS_PATH = isNodeJS ? "./test/pdfs/" : "../pdfs/";
@ -40,6 +46,16 @@ class DefaultFileReaderFactory {
}
}
const DefaultCMapReaderFactory =
typeof PDFJSDev !== "undefined" && PDFJSDev.test("GENERIC") && isNodeJS
? NodeCMapReaderFactory
: DOMCMapReaderFactory;
const DefaultStandardFontDataFactory =
typeof PDFJSDev !== "undefined" && PDFJSDev.test("GENERIC") && isNodeJS
? NodeStandardFontDataFactory
: DOMStandardFontDataFactory;
function buildGetDocumentParams(filename, options) {
const params = Object.create(null);
params.url = isNodeJS
@ -234,7 +250,9 @@ export {
buildGetDocumentParams,
CMAP_URL,
createIdFactory,
DefaultCMapReaderFactory,
DefaultFileReaderFactory,
DefaultStandardFontDataFactory,
getCrossOriginHostname,
STANDARD_FONT_DATA_URL,
TEST_PDFS_PATH,