Merge pull request #13546 from Snuffleupagus/base_factory-tweaks

Re-factor the `DOMCanvasFactory` and `DOMSVGFactory` implementations slightly
This commit is contained in:
Tim van der Meij 2021-06-11 21:19:11 +02:00 committed by GitHub
commit c7c59feeaf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 67 additions and 51 deletions

View File

@ -23,7 +23,14 @@ class BaseCanvasFactory {
} }
create(width, height) { create(width, height) {
unreachable("Abstract method `create` called."); if (width <= 0 || height <= 0) {
throw new Error("Invalid canvas size");
}
const canvas = this._createCanvas(width, height);
return {
canvas,
context: canvas.getContext("2d"),
};
} }
reset(canvasAndContext, width, height) { reset(canvasAndContext, width, height) {
@ -48,6 +55,13 @@ class BaseCanvasFactory {
canvasAndContext.canvas = null; canvasAndContext.canvas = null;
canvasAndContext.context = null; canvasAndContext.context = null;
} }
/**
* @private
*/
_createCanvas(width, height) {
unreachable("Abstract method `_createCanvas` called.");
}
} }
class BaseCMapReaderFactory { class BaseCMapReaderFactory {
@ -122,8 +136,45 @@ class BaseStandardFontDataFactory {
} }
} }
class BaseSVGFactory {
constructor() {
if (this.constructor === BaseSVGFactory) {
unreachable("Cannot initialize BaseSVGFactory.");
}
}
create(width, height) {
if (width <= 0 || height <= 0) {
throw new Error("Invalid SVG dimensions");
}
const svg = this._createSVG("svg:svg");
svg.setAttribute("version", "1.1");
svg.setAttribute("width", `${width}px`);
svg.setAttribute("height", `${height}px`);
svg.setAttribute("preserveAspectRatio", "none");
svg.setAttribute("viewBox", `0 0 ${width} ${height}`);
return svg;
}
createElement(type) {
if (typeof type !== "string") {
throw new Error("Invalid SVG element type");
}
return this._createSVG(type);
}
/**
* @private
*/
_createSVG(type) {
unreachable("Abstract method `_createSVG` called.");
}
}
export { export {
BaseCanvasFactory, BaseCanvasFactory,
BaseCMapReaderFactory, BaseCMapReaderFactory,
BaseStandardFontDataFactory, BaseStandardFontDataFactory,
BaseSVGFactory,
}; };

View File

@ -26,6 +26,7 @@ import {
BaseCanvasFactory, BaseCanvasFactory,
BaseCMapReaderFactory, BaseCMapReaderFactory,
BaseStandardFontDataFactory, BaseStandardFontDataFactory,
BaseSVGFactory,
} from "./base_factory.js"; } from "./base_factory.js";
const DEFAULT_LINK_REL = "noopener noreferrer nofollow"; const DEFAULT_LINK_REL = "noopener noreferrer nofollow";
@ -37,38 +38,26 @@ class DOMCanvasFactory extends BaseCanvasFactory {
this._document = ownerDocument; this._document = ownerDocument;
} }
create(width, height) { _createCanvas(width, height) {
if (width <= 0 || height <= 0) {
throw new Error("Invalid canvas size");
}
const canvas = this._document.createElement("canvas"); const canvas = this._document.createElement("canvas");
const context = canvas.getContext("2d");
canvas.width = width; canvas.width = width;
canvas.height = height; canvas.height = height;
return { return canvas;
canvas,
context,
};
} }
} }
function fetchData(url, asTypedArray) { async function fetchData(url, asTypedArray = false) {
if ( if (
(typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) || (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) ||
(isFetchSupported() && isValidFetchUrl(url, document.baseURI)) (isFetchSupported() && isValidFetchUrl(url, document.baseURI))
) { ) {
return fetch(url).then(async response => { const response = await fetch(url);
if (!response.ok) { if (!response.ok) {
throw new Error(response.statusText); throw new Error(response.statusText);
} }
let data; return asTypedArray
if (asTypedArray) { ? new Uint8Array(await response.arrayBuffer())
data = new Uint8Array(await response.arrayBuffer()); : stringToBytes(await response.text());
} else {
data = stringToBytes(await response.text());
}
return data;
});
} }
// The Fetch API is not supported. // The Fetch API is not supported.
@ -116,25 +105,8 @@ class DOMStandardFontDataFactory extends BaseStandardFontDataFactory {
} }
} }
class DOMSVGFactory { class DOMSVGFactory extends BaseSVGFactory {
create(width, height) { _createSVG(type) {
if (width <= 0 || height <= 0) {
throw new Error("Invalid SVG dimensions");
}
const svg = document.createElementNS(SVG_NS, "svg:svg");
svg.setAttribute("version", "1.1");
svg.setAttribute("width", width + "px");
svg.setAttribute("height", height + "px");
svg.setAttribute("preserveAspectRatio", "none");
svg.setAttribute("viewBox", "0 0 " + width + " " + height);
return svg;
}
createElement(type) {
if (typeof type !== "string") {
throw new Error("Invalid SVG element type");
}
return document.createElementNS(SVG_NS, type); return document.createElementNS(SVG_NS, type);
} }
} }

View File

@ -55,16 +55,9 @@ if ((typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) && isNodeJS) {
}; };
NodeCanvasFactory = class extends BaseCanvasFactory { NodeCanvasFactory = class extends BaseCanvasFactory {
create(width, height) { _createCanvas(width, height) {
if (width <= 0 || height <= 0) {
throw new Error("Invalid canvas size");
}
const Canvas = __non_webpack_require__("canvas"); const Canvas = __non_webpack_require__("canvas");
const canvas = Canvas.createCanvas(width, height); return Canvas.createCanvas(width, height);
return {
canvas,
context: canvas.getContext("2d"),
};
} }
}; };