diff options
author | John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com> | 2020-08-12 14:17:28 +0300 |
---|---|---|
committer | John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com> | 2020-08-13 17:19:05 +0300 |
commit | 7b2198f24b873f1fd7869c0e87add794fd5e4ebe (patch) | |
tree | 8840b086e1097bfe21fcb05fcca90d48ef32713e /src | |
parent | df9f2eb4339811156eb5be390847f71f597d43df (diff) |
Move packaging to webpack and update/clean all configs
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/main.js | 49 | ||||
-rw-r--r-- | src/views/PDFView.vue | 52 | ||||
-rw-r--r-- | src/workersrc.js | 105 |
3 files changed, 206 insertions, 0 deletions
diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..d86bb38 --- /dev/null +++ b/src/main.js @@ -0,0 +1,49 @@ + +/** + * @copyright Copyright (c) 2020 John Molakvoæ <skjnldsv@protonmail.com> + * + * @author John Molakvoæ <skjnldsv@protonmail.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +import { generateFilePath } from '@nextcloud/router' +import { getRequestToken } from '@nextcloud/auth' + +import PDFView from './views/PDFView' + +// CSP config for webpack dynamic chunk loading +// eslint-disable-next-line +__webpack_nonce__ = btoa(getRequestToken()) + +// Correct the root of the app for chunk loading +// OC.linkTo matches the apps folders +// OC.generateUrl ensure the index.php (or not) +// We do not want the index.php since we're loading files +// eslint-disable-next-line +__webpack_public_path__ = generateFilePath('files_pdfviewer', '', 'js/') + +window.addEventListener('DOMContentLoaded', function() { + OCA.Viewer.registerHandler({ + id: 'pdf', + + mimes: [ + 'application/pdf', + ], + + component: PDFView, + }) +}) diff --git a/src/views/PDFView.vue b/src/views/PDFView.vue new file mode 100644 index 0000000..f9939d6 --- /dev/null +++ b/src/views/PDFView.vue @@ -0,0 +1,52 @@ +<!-- + - @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com> + - + - @author John Molakvoæ <skjnldsv@protonmail.com> + - @author Charismatic Claire <charismatic.claire@noservice.noreply> + - + - @license GNU AGPL version 3 or any later version + - + - This program is free software: you can redistribute it and/or modify + - it under the terms of the GNU Affero General Public License as + - published by the Free Software Foundation, either version 3 of the + - License, or (at your option) any later version. + - + - This program is distributed in the hope that it will be useful, + - but WITHOUT ANY WARRANTY; without even the implied warranty of + - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + - GNU Affero General Public License for more details. + - + - You should have received a copy of the GNU Affero General Public License + - along with this program. If not, see <http://www.gnu.org/licenses/>. + - + --> +<template> + <iframe :src="iframeSrc" /> +</template> + +<script> +import { generateUrl } from '@nextcloud/router' + +export default { + name: 'PDFView', + + computed: { + iframeSrc() { + return generateUrl('/apps/files_pdfviewer/?file={file}', { + file: this.davPath, + }) + }, + }, + + async mounted() { + this.doneLoading() + }, +} +</script> + +<style lang="scss" scoped> +iframe { + width: 100%; + height: 100%; +} +</style> diff --git a/src/workersrc.js b/src/workersrc.js new file mode 100644 index 0000000..9009b49 --- /dev/null +++ b/src/workersrc.js @@ -0,0 +1,105 @@ +/* eslint-disable no-undef */ +/** + * Checks if the page is displayed in an iframe. If not redirect to /. + **/ +function redirectIfNotDisplayedInFrame() { + try { + if (window.frameElement) { + return + } + } catch (e) { + console.debug(e) + } + + window.location.href = '/' +} +redirectIfNotDisplayedInFrame() + +// When "PDFViewerApplication.webViewerInitialized" is executed (once +// "PDFViewerApplication.initialize" is done) it opens the PDF file via URL, +// which requires the PDFViewerApplication to be properly configured, so the +// custom initialization has to be executed before that. This can be done by +// listening to the "webviewerloaded" event, which is emitted after +// "PDFViewerApplication" and "PDFViewerApplicationOptions" are globally set and +// before "PDFViewerApplication.initialize" is executed. +function initializeCustomPDFViewerApplication() { + // Preferences override options, so they must be disabled for + // "externalLinkTarget" to take effect. + PDFViewerApplicationOptions.set('disablePreferences', true) + PDFViewerApplicationOptions.set('externalLinkTarget', pdfjsLib.LinkTarget.BLANK) + PDFViewerApplicationOptions.set('isEvalSupported', false) + PDFViewerApplicationOptions.set('workerSrc', document.getElementsByTagName('head')[0].getAttribute('data-workersrc')) + PDFViewerApplicationOptions.set('cMapUrl', document.getElementsByTagName('head')[0].getAttribute('data-cmapurl')) + + // The download has to be forced to use the URL of the file; by default + // "PDFViewerApplication.download" uses a blob, but this causes a CSP error + // (at least, in Firefox) when trying to download it. + PDFViewerApplication.download = function() { + // "isDataSchema()" and "getPDFFileNameFromURL()" are copied from + // "vendor/pdfjs/web/viewer.js", as the functions defined in that file + // can not be accessed from the outside. + function isDataSchema(url) { + let i = 0 + const ii = url.length + while (i < ii && url[i].trim() === '') { + i++ + } + return url.substr(i, 5).toLowerCase() === 'data:' + } + + function getPDFFileNameFromURL(url) { + const defaultFilename = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'document.pdf' + + if (isDataSchema(url)) { + console.warn('getPDFFileNameFromURL: ' + 'ignoring "data:" URL for performance reasons.') + return defaultFilename + } + const reURI = /^(?:(?:[^:]+:)?\/\/[^/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/ + const reFilename = /[^/?#=]+\.pdf\b(?!.*\.pdf\b)/i + const splitURI = reURI.exec(url) + let suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || reFilename.exec(splitURI[3]) + if (suggestedFilename) { + suggestedFilename = suggestedFilename[0] + if (suggestedFilename.indexOf('%') !== -1) { + try { + suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0] + } catch (e) { + console.debug(e) + } + } + } + return suggestedFilename || defaultFilename + } + + const url = decodeURIComponent(window.location.search.substr(6)) + + this.downloadManager.downloadUrl(url, getPDFFileNameFromURL(url)) + } + + const hideDownload = window.parent.document.getElementById('hideDownload').value === 'true' + if (hideDownload) { + // Disable download function when downloads are hidden, as even if the + // buttons in the UI are hidden the download could still be triggered + // with Ctrl|Meta+S. + PDFViewerApplication.download = function() { + } + + // Disable printing service when downloads are hidden, as even if the + // buttons in the UI are hidden the printing could still be triggered + // with Ctrl|Meta+P. + // Abuse the "supportsPrinting" parameter, which signals that the + // browser does not fully support printing, to make PDFViewer disable + // the printing service. + // "supportsPrinting" is a getter function, so it needs to be deleted + // before replacing it with a simple value. + delete PDFViewerApplication.supportsPrinting + PDFViewerApplication.supportsPrinting = false + // When printing is not supported a warning is shown by the default + // "beforePrint" function when trying to print. That function needs to + // be replaced with an empty one to prevent that warning to be shown. + PDFViewerApplication.beforePrint = function() { + } + } +} + +document.addEventListener('webviewerloaded', initializeCustomPDFViewerApplication, true) |