Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/files_pdfviewer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>2020-08-12 14:17:28 +0300
committerJohn Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>2020-08-13 17:19:05 +0300
commit7b2198f24b873f1fd7869c0e87add794fd5e4ebe (patch)
tree8840b086e1097bfe21fcb05fcca90d48ef32713e /src
parentdf9f2eb4339811156eb5be390847f71f597d43df (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.js49
-rw-r--r--src/views/PDFView.vue52
-rw-r--r--src/workersrc.js105
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)