Skip to content

Commit

Permalink
Add helper functions to allow using new Uint8Array methods
Browse files Browse the repository at this point in the history
This allows using the new methods in browsers that support them, e.g. Firefox 133+, while still providing fallbacks where necessary; see https://github.com/tc39/proposal-arraybuffer-base64

*Please note:* These are not actual polyfills, but only implements what we need in the PDF.js code-base. Eventually this patch should be reverted, once support is generally available.
  • Loading branch information
Snuffleupagus committed Oct 29, 2024
1 parent bfc645b commit 8f47d06
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 5 deletions.
5 changes: 3 additions & 2 deletions src/core/document.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import {
stringToBytes,
stringToPDFString,
stringToUTF8String,
toHexUtil,
unreachable,
Util,
warn,
Expand Down Expand Up @@ -1572,8 +1573,8 @@ class PDFDocument {
}

return shadow(this, "fingerprints", [
hashOriginal.toHex(),
hashModified?.toHex() ?? null,
toHexUtil(hashOriginal),
hashModified ? toHexUtil(hashModified) : null,
]);
}

Expand Down
4 changes: 2 additions & 2 deletions src/core/xfa/template.js
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ import {
XFAObject,
XFAObjectArray,
} from "./xfa_object.js";
import { fromBase64Util, Util, warn } from "../../shared/util.js";
import {
getBBox,
getColor,
Expand All @@ -102,7 +103,6 @@ import {
getStringOption,
HTMLResult,
} from "./utils.js";
import { Util, warn } from "../../shared/util.js";
import { getMetrics } from "./fonts.js";
import { recoverJsURL } from "../core_utils.js";
import { searchNode } from "./som.js";
Expand Down Expand Up @@ -3427,7 +3427,7 @@ class Image extends StringObject {
}

if (!buffer && this.transferEncoding === "base64") {
buffer = Uint8Array.fromBase64(this[$content]);
buffer = fromBase64Util(this[$content]);
}

if (!buffer) {
Expand Down
3 changes: 2 additions & 1 deletion src/display/font_loader.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import {
isNodeJS,
shadow,
string32,
toBase64Util,
unreachable,
warn,
} from "../shared/util.js";
Expand Down Expand Up @@ -399,7 +400,7 @@ class FontFaceObject {
return null;
}
// Add the @font-face rule to the document.
const url = `url(data:${this.mimetype};base64,${this.data.toBase64()});`;
const url = `url(data:${this.mimetype};base64,${toBase64Util(this.data)});`;
let rule;
if (!this.cssFontInfo) {
rule = `@font-face {font-family:"${this.loadedName}";src:${url}}`;
Expand Down
32 changes: 32 additions & 0 deletions src/shared/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -1097,6 +1097,35 @@ const FontRenderOps = {
TRANSLATE: 8,
};

// TODO: Remove this once `Uint8Array.prototype.toHex` is generally available.
function toHexUtil(arr) {
if (Uint8Array.prototype.toHex) {
return arr.toHex();
}
const buf = [];
for (const num of arr) {
buf.push(num.toString(16).padStart(2, "0"));
}
return buf.join("");
}

// TODO: Remove this once `Uint8Array.prototype.toBase64` is generally
// available.
function toBase64Util(arr) {
if (Uint8Array.prototype.toBase64) {
return arr.toBase64();
}
return btoa(bytesToString(arr));
}

// TODO: Remove this once `Uint8Array.fromBase64` is generally available.
function fromBase64Util(str) {
if (Uint8Array.fromBase64) {
return Uint8Array.fromBase64(str);
}
return stringToBytes(atob(str));
}

export {
AbortException,
AnnotationActionEventType,
Expand All @@ -1120,6 +1149,7 @@ export {
FONT_IDENTITY_MATRIX,
FontRenderOps,
FormatError,
fromBase64Util,
getModificationDate,
getUuid,
getVerbosityLevel,
Expand Down Expand Up @@ -1149,6 +1179,8 @@ export {
stringToPDFString,
stringToUTF8String,
TextRenderingMode,
toBase64Util,
toHexUtil,
UnexpectedResponseException,
UnknownErrorException,
unreachable,
Expand Down

0 comments on commit 8f47d06

Please sign in to comment.