Files
2026-10-03 13:58:22 +00:00

48 lines
2.3 KiB
JavaScript

"use strict";
// Configure the upstream generic viewer before its application starts.
const target = window.parent.document;
function configureViewer(event) {
if (event.detail?.source !== window) return;
const options = window.PDFViewerApplicationOptions;
const app = window.PDFViewerApplication;
const file = new URLSearchParams(location.search).get("file") || "";
const match = file.match(/^\/api\/documents\/([a-f0-9]{32})\/content(?:\?v=[a-f0-9]{16})?$/);
if (!match) history.replaceState({}, "", location.pathname + "?file=");
options.setAll({
defaultUrl: "", disablePreferences: true, disableHistory: true,
localeProperties: {lang: "de"}, viewerCssTheme: 1,
enableScripting: false, annotationEditorMode: -1, annotationMode: 1,
enableComment: false, enableAltText: false, enableGuessAltText: false,
enableAltTextModelDownload: false, enableHighlightFloatingButton: false,
enableWebGPU: false, defaultZoomValue: "page-width",
});
// Downloads use the original endpoint and its fresh access checks.
const download = async () => {
if (!match) return;
const link = document.createElement("a");
link.href = `/api/documents/${match[1]}/download`;
link.download = app._docFilename || "";
document.body.append(link); link.click(); link.remove();
};
app.download = app.save = app.downloadOrSave = download;
const run = app.run.bind(app);
app.run = async config => {
await run(config);
if (app._openFileInput) app._openFileInput.disabled = true;
};
const open = app.open.bind(app);
app.open = async args => {
if (!match || args?.url !== file) return;
try { await open(args); }
catch (error) {
// PDF.js already shows these loading errors. Revocation is handled by
// the parent dialog's permission refresh, rather than an unhandled promise.
if (!["ResponseException", "InvalidPDFException", "PasswordException", "UnknownErrorException", "AbortException"].includes(error.name)) throw error;
}
};
}
target.addEventListener("webviewerloaded", configureViewer);
window.addEventListener("pagehide", () => target.removeEventListener("webviewerloaded", configureViewer), {once: true});
document.addEventListener("drop", event => { event.preventDefault(); event.stopImmediatePropagation(); }, true);