| /** |
| * @licstart The following is the entire license notice for the |
| * Javascript code in this page |
| * |
| * Copyright 2020 Mozilla Foundation |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| * @licend The above is the entire license notice for the |
| * Javascript code in this page |
| */ |
| "use strict"; |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.PDFPrintServiceFactory = exports.DefaultExternalServices = exports.PDFViewerApplication = void 0; |
| |
| var _ui_utils = require("./ui_utils.js"); |
| |
| var _app_options = require("./app_options.js"); |
| |
| var _pdf = require("../pdf"); |
| |
| var _pdf_cursor_tools = require("./pdf_cursor_tools.js"); |
| |
| var _pdf_rendering_queue = require("./pdf_rendering_queue.js"); |
| |
| var _pdf_sidebar = require("./pdf_sidebar.js"); |
| |
| var _overlay_manager = require("./overlay_manager.js"); |
| |
| var _password_prompt = require("./password_prompt.js"); |
| |
| var _pdf_attachment_viewer = require("./pdf_attachment_viewer.js"); |
| |
| var _pdf_document_properties = require("./pdf_document_properties.js"); |
| |
| var _pdf_find_bar = require("./pdf_find_bar.js"); |
| |
| var _pdf_find_controller = require("./pdf_find_controller.js"); |
| |
| var _pdf_history = require("./pdf_history.js"); |
| |
| var _pdf_layer_viewer = require("./pdf_layer_viewer.js"); |
| |
| var _pdf_link_service = require("./pdf_link_service.js"); |
| |
| var _pdf_outline_viewer = require("./pdf_outline_viewer.js"); |
| |
| var _pdf_presentation_mode = require("./pdf_presentation_mode.js"); |
| |
| var _pdf_sidebar_resizer = require("./pdf_sidebar_resizer.js"); |
| |
| var _pdf_thumbnail_viewer = require("./pdf_thumbnail_viewer.js"); |
| |
| var _pdf_viewer = require("./pdf_viewer.js"); |
| |
| var _secondary_toolbar = require("./secondary_toolbar.js"); |
| |
| var _toolbar = require("./toolbar.js"); |
| |
| var _viewer_compatibility = require("./viewer_compatibility.js"); |
| |
| var _view_history = require("./view_history.js"); |
| |
| const DEFAULT_SCALE_DELTA = 1.1; |
| const DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000; |
| const FORCE_PAGES_LOADED_TIMEOUT = 10000; |
| const WHEEL_ZOOM_DISABLED_TIMEOUT = 1000; |
| const ENABLE_PERMISSIONS_CLASS = "enablePermissions"; |
| const ViewOnLoad = { |
| UNKNOWN: -1, |
| PREVIOUS: 0, |
| INITIAL: 1 |
| }; |
| const KNOWN_VERSIONS = ["1.0", "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9", "2.0", "2.1", "2.2", "2.3"]; |
| const KNOWN_GENERATORS = ["acrobat distiller", "acrobat pdfwriter", "adobe livecycle", "adobe pdf library", "adobe photoshop", "ghostscript", "tcpdf", "cairo", "dvipdfm", "dvips", "pdftex", "pdfkit", "itext", "prince", "quarkxpress", "mac os x", "microsoft", "openoffice", "oracle", "luradocument", "pdf-xchange", "antenna house", "aspose.cells", "fpdf"]; |
| |
| class DefaultExternalServices { |
| constructor() { |
| throw new Error("Cannot initialize DefaultExternalServices."); |
| } |
| |
| static updateFindControlState(data) {} |
| |
| static updateFindMatchesCount(data) {} |
| |
| static initPassiveLoading(callbacks) {} |
| |
| static fallback(data, callback) {} |
| |
| static reportTelemetry(data) {} |
| |
| static createDownloadManager(options) { |
| throw new Error("Not implemented: createDownloadManager"); |
| } |
| |
| static createPreferences() { |
| throw new Error("Not implemented: createPreferences"); |
| } |
| |
| static createL10n(options) { |
| throw new Error("Not implemented: createL10n"); |
| } |
| |
| static get supportsIntegratedFind() { |
| return (0, _pdf.shadow)(this, "supportsIntegratedFind", false); |
| } |
| |
| static get supportsDocumentFonts() { |
| return (0, _pdf.shadow)(this, "supportsDocumentFonts", true); |
| } |
| |
| static get supportedMouseWheelZoomModifierKeys() { |
| return (0, _pdf.shadow)(this, "supportedMouseWheelZoomModifierKeys", { |
| ctrlKey: true, |
| metaKey: true |
| }); |
| } |
| |
| static get isInAutomation() { |
| return (0, _pdf.shadow)(this, "isInAutomation", false); |
| } |
| |
| } |
| |
| exports.DefaultExternalServices = DefaultExternalServices; |
| const PDFViewerApplication = { |
| initialBookmark: document.location.hash.substring(1), |
| _initializedCapability: (0, _pdf.createPromiseCapability)(), |
| fellback: false, |
| appConfig: null, |
| pdfDocument: null, |
| pdfLoadingTask: null, |
| printService: null, |
| pdfViewer: null, |
| pdfThumbnailViewer: null, |
| pdfRenderingQueue: null, |
| pdfPresentationMode: null, |
| pdfDocumentProperties: null, |
| pdfLinkService: null, |
| pdfHistory: null, |
| pdfSidebar: null, |
| pdfSidebarResizer: null, |
| pdfOutlineViewer: null, |
| pdfAttachmentViewer: null, |
| pdfLayerViewer: null, |
| pdfCursorTools: null, |
| store: null, |
| downloadManager: null, |
| overlayManager: null, |
| preferences: null, |
| toolbar: null, |
| secondaryToolbar: null, |
| eventBus: null, |
| l10n: null, |
| isInitialViewSet: false, |
| downloadComplete: false, |
| isViewerEmbedded: window.parent !== window, |
| url: "", |
| baseUrl: "", |
| externalServices: DefaultExternalServices, |
| _boundEvents: {}, |
| contentDispositionFilename: null, |
| triggerDelayedFallback: null, |
| _saveInProgress: false, |
| _wheelUnusedTicks: 0, |
| |
| async initialize(appConfig) { |
| this.preferences = this.externalServices.createPreferences(); |
| this.appConfig = appConfig; |
| await this._readPreferences(); |
| await this._parseHashParameters(); |
| await this._initializeL10n(); |
| |
| if (this.isViewerEmbedded && _app_options.AppOptions.get("externalLinkTarget") === _pdf.LinkTarget.NONE) { |
| _app_options.AppOptions.set("externalLinkTarget", _pdf.LinkTarget.TOP); |
| } |
| |
| await this._initializeViewerComponents(); |
| this.bindEvents(); |
| this.bindWindowEvents(); |
| const appContainer = appConfig.appContainer || document.documentElement; |
| this.l10n.translate(appContainer).then(() => { |
| this.eventBus.dispatch("localized", { |
| source: this |
| }); |
| }); |
| |
| this._initializedCapability.resolve(); |
| }, |
| |
| async _readPreferences() { |
| if (_app_options.AppOptions.get("disablePreferences")) { |
| return; |
| } |
| |
| try { |
| const prefs = await this.preferences.getAll(); |
| |
| for (const name in prefs) { |
| _app_options.AppOptions.set(name, prefs[name]); |
| } |
| } catch (reason) { |
| console.error(`_readPreferences: "${reason.message}".`); |
| } |
| }, |
| |
| async _parseHashParameters() { |
| if (!_app_options.AppOptions.get("pdfBugEnabled")) { |
| return undefined; |
| } |
| |
| const hash = document.location.hash.substring(1); |
| |
| if (!hash) { |
| return undefined; |
| } |
| |
| const hashParams = (0, _ui_utils.parseQueryString)(hash), |
| waitOn = []; |
| |
| if ("disableworker" in hashParams && hashParams.disableworker === "true") { |
| waitOn.push(loadFakeWorker()); |
| } |
| |
| if ("disablerange" in hashParams) { |
| _app_options.AppOptions.set("disableRange", hashParams.disablerange === "true"); |
| } |
| |
| if ("disablestream" in hashParams) { |
| _app_options.AppOptions.set("disableStream", hashParams.disablestream === "true"); |
| } |
| |
| if ("disableautofetch" in hashParams) { |
| _app_options.AppOptions.set("disableAutoFetch", hashParams.disableautofetch === "true"); |
| } |
| |
| if ("disablefontface" in hashParams) { |
| _app_options.AppOptions.set("disableFontFace", hashParams.disablefontface === "true"); |
| } |
| |
| if ("disablehistory" in hashParams) { |
| _app_options.AppOptions.set("disableHistory", hashParams.disablehistory === "true"); |
| } |
| |
| if ("webgl" in hashParams) { |
| _app_options.AppOptions.set("enableWebGL", hashParams.webgl === "true"); |
| } |
| |
| if ("verbosity" in hashParams) { |
| _app_options.AppOptions.set("verbosity", hashParams.verbosity | 0); |
| } |
| |
| if ("textlayer" in hashParams) { |
| switch (hashParams.textlayer) { |
| case "off": |
| _app_options.AppOptions.set("textLayerMode", _ui_utils.TextLayerMode.DISABLE); |
| |
| break; |
| |
| case "visible": |
| case "shadow": |
| case "hover": |
| const viewer = this.appConfig.viewerContainer; |
| viewer.classList.add("textLayer-" + hashParams.textlayer); |
| break; |
| } |
| } |
| |
| if ("pdfbug" in hashParams) { |
| _app_options.AppOptions.set("pdfBug", true); |
| |
| _app_options.AppOptions.set("fontExtraProperties", true); |
| |
| const enabled = hashParams.pdfbug.split(","); |
| waitOn.push(loadAndEnablePDFBug(enabled)); |
| } |
| |
| if ("locale" in hashParams) { |
| _app_options.AppOptions.set("locale", hashParams.locale); |
| } |
| |
| return Promise.all(waitOn).catch(reason => { |
| console.error(`_parseHashParameters: "${reason.message}".`); |
| }); |
| }, |
| |
| async _initializeL10n() { |
| this.l10n = this.externalServices.createL10n({ |
| locale: _app_options.AppOptions.get("locale") |
| }); |
| const dir = await this.l10n.getDirection(); |
| document.getElementsByTagName("html")[0].dir = dir; |
| }, |
| |
| async _initializeViewerComponents() { |
| const appConfig = this.appConfig; |
| const eventBus = appConfig.eventBus || new _ui_utils.EventBus({ |
| isInAutomation: this.externalServices.isInAutomation |
| }); |
| this.eventBus = eventBus; |
| this.overlayManager = new _overlay_manager.OverlayManager(); |
| const pdfRenderingQueue = new _pdf_rendering_queue.PDFRenderingQueue(); |
| pdfRenderingQueue.onIdle = this.cleanup.bind(this); |
| this.pdfRenderingQueue = pdfRenderingQueue; |
| const pdfLinkService = new _pdf_link_service.PDFLinkService({ |
| eventBus, |
| externalLinkTarget: _app_options.AppOptions.get("externalLinkTarget"), |
| externalLinkRel: _app_options.AppOptions.get("externalLinkRel"), |
| ignoreDestinationZoom: _app_options.AppOptions.get("ignoreDestinationZoom") |
| }); |
| this.pdfLinkService = pdfLinkService; |
| const downloadManager = this.externalServices.createDownloadManager(); |
| this.downloadManager = downloadManager; |
| const findController = new _pdf_find_controller.PDFFindController({ |
| linkService: pdfLinkService, |
| eventBus |
| }); |
| this.findController = findController; |
| const container = appConfig.mainContainer; |
| const viewer = appConfig.viewerContainer; |
| this.pdfViewer = new _pdf_viewer.PDFViewer({ |
| container, |
| viewer, |
| eventBus, |
| renderingQueue: pdfRenderingQueue, |
| linkService: pdfLinkService, |
| downloadManager, |
| findController, |
| renderer: _app_options.AppOptions.get("renderer"), |
| enableWebGL: _app_options.AppOptions.get("enableWebGL"), |
| l10n: this.l10n, |
| textLayerMode: _app_options.AppOptions.get("textLayerMode"), |
| imageResourcesPath: _app_options.AppOptions.get("imageResourcesPath"), |
| renderInteractiveForms: _app_options.AppOptions.get("renderInteractiveForms"), |
| enablePrintAutoRotate: _app_options.AppOptions.get("enablePrintAutoRotate"), |
| useOnlyCssZoom: _app_options.AppOptions.get("useOnlyCssZoom"), |
| maxCanvasPixels: _app_options.AppOptions.get("maxCanvasPixels") |
| }); |
| pdfRenderingQueue.setViewer(this.pdfViewer); |
| pdfLinkService.setViewer(this.pdfViewer); |
| this.pdfThumbnailViewer = new _pdf_thumbnail_viewer.PDFThumbnailViewer({ |
| container: appConfig.sidebar.thumbnailView, |
| eventBus, |
| renderingQueue: pdfRenderingQueue, |
| linkService: pdfLinkService, |
| l10n: this.l10n |
| }); |
| pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer); |
| this.pdfHistory = new _pdf_history.PDFHistory({ |
| linkService: pdfLinkService, |
| eventBus |
| }); |
| pdfLinkService.setHistory(this.pdfHistory); |
| |
| if (!this.supportsIntegratedFind) { |
| this.findBar = new _pdf_find_bar.PDFFindBar(appConfig.findBar, eventBus, this.l10n); |
| } |
| |
| this.pdfDocumentProperties = new _pdf_document_properties.PDFDocumentProperties(appConfig.documentProperties, this.overlayManager, eventBus, this.l10n); |
| this.pdfCursorTools = new _pdf_cursor_tools.PDFCursorTools({ |
| container, |
| eventBus, |
| cursorToolOnLoad: _app_options.AppOptions.get("cursorToolOnLoad") |
| }); |
| this.toolbar = new _toolbar.Toolbar(appConfig.toolbar, eventBus, this.l10n); |
| this.secondaryToolbar = new _secondary_toolbar.SecondaryToolbar(appConfig.secondaryToolbar, container, eventBus); |
| |
| if (this.supportsFullscreen) { |
| this.pdfPresentationMode = new _pdf_presentation_mode.PDFPresentationMode({ |
| container, |
| pdfViewer: this.pdfViewer, |
| eventBus, |
| contextMenuItems: appConfig.fullscreen |
| }); |
| } |
| |
| this.passwordPrompt = new _password_prompt.PasswordPrompt(appConfig.passwordOverlay, this.overlayManager, this.l10n); |
| this.pdfOutlineViewer = new _pdf_outline_viewer.PDFOutlineViewer({ |
| container: appConfig.sidebar.outlineView, |
| eventBus, |
| linkService: pdfLinkService |
| }); |
| this.pdfAttachmentViewer = new _pdf_attachment_viewer.PDFAttachmentViewer({ |
| container: appConfig.sidebar.attachmentsView, |
| eventBus, |
| downloadManager |
| }); |
| this.pdfLayerViewer = new _pdf_layer_viewer.PDFLayerViewer({ |
| container: appConfig.sidebar.layersView, |
| eventBus, |
| l10n: this.l10n |
| }); |
| this.pdfSidebar = new _pdf_sidebar.PDFSidebar({ |
| elements: appConfig.sidebar, |
| pdfViewer: this.pdfViewer, |
| pdfThumbnailViewer: this.pdfThumbnailViewer, |
| eventBus, |
| l10n: this.l10n |
| }); |
| this.pdfSidebar.onToggled = this.forceRendering.bind(this); |
| this.pdfSidebarResizer = new _pdf_sidebar_resizer.PDFSidebarResizer(appConfig.sidebarResizer, eventBus, this.l10n); |
| }, |
| |
| run(config) { |
| this.initialize(config).then(webViewerInitialized); |
| }, |
| |
| get initialized() { |
| return this._initializedCapability.settled; |
| }, |
| |
| get initializedPromise() { |
| return this._initializedCapability.promise; |
| }, |
| |
| zoomIn(ticks) { |
| if (this.pdfViewer.isInPresentationMode) { |
| return; |
| } |
| |
| let newScale = this.pdfViewer.currentScale; |
| |
| do { |
| newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2); |
| newScale = Math.ceil(newScale * 10) / 10; |
| newScale = Math.min(_ui_utils.MAX_SCALE, newScale); |
| } while (--ticks > 0 && newScale < _ui_utils.MAX_SCALE); |
| |
| this.pdfViewer.currentScaleValue = newScale; |
| }, |
| |
| zoomOut(ticks) { |
| if (this.pdfViewer.isInPresentationMode) { |
| return; |
| } |
| |
| let newScale = this.pdfViewer.currentScale; |
| |
| do { |
| newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2); |
| newScale = Math.floor(newScale * 10) / 10; |
| newScale = Math.max(_ui_utils.MIN_SCALE, newScale); |
| } while (--ticks > 0 && newScale > _ui_utils.MIN_SCALE); |
| |
| this.pdfViewer.currentScaleValue = newScale; |
| }, |
| |
| zoomReset() { |
| if (this.pdfViewer.isInPresentationMode) { |
| return; |
| } |
| |
| this.pdfViewer.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE; |
| }, |
| |
| get pagesCount() { |
| return this.pdfDocument ? this.pdfDocument.numPages : 0; |
| }, |
| |
| get page() { |
| return this.pdfViewer.currentPageNumber; |
| }, |
| |
| set page(val) { |
| this.pdfViewer.currentPageNumber = val; |
| }, |
| |
| get printing() { |
| return !!this.printService; |
| }, |
| |
| get supportsPrinting() { |
| return PDFPrintServiceFactory.instance.supportsPrinting; |
| }, |
| |
| get supportsFullscreen() { |
| let support; |
| const doc = document.documentElement; |
| support = !!(doc.requestFullscreen || doc.mozRequestFullScreen || doc.webkitRequestFullScreen || doc.msRequestFullscreen); |
| |
| if (document.fullscreenEnabled === false || document.mozFullScreenEnabled === false || document.webkitFullscreenEnabled === false || document.msFullscreenEnabled === false) { |
| support = false; |
| } |
| |
| return (0, _pdf.shadow)(this, "supportsFullscreen", support); |
| }, |
| |
| get supportsIntegratedFind() { |
| return this.externalServices.supportsIntegratedFind; |
| }, |
| |
| get supportsDocumentFonts() { |
| return this.externalServices.supportsDocumentFonts; |
| }, |
| |
| get loadingBar() { |
| const bar = new _ui_utils.ProgressBar("#loadingBar"); |
| return (0, _pdf.shadow)(this, "loadingBar", bar); |
| }, |
| |
| get supportedMouseWheelZoomModifierKeys() { |
| return this.externalServices.supportedMouseWheelZoomModifierKeys; |
| }, |
| |
| initPassiveLoading() { |
| throw new Error("Not implemented: initPassiveLoading"); |
| }, |
| |
| setTitleUsingUrl(url = "") { |
| this.url = url; |
| this.baseUrl = url.split("#")[0]; |
| let title = (0, _ui_utils.getPDFFileNameFromURL)(url, ""); |
| |
| if (!title) { |
| try { |
| title = decodeURIComponent((0, _pdf.getFilenameFromUrl)(url)) || url; |
| } catch (ex) { |
| title = url; |
| } |
| } |
| |
| this.setTitle(title); |
| }, |
| |
| setTitle(title) { |
| if (this.isViewerEmbedded) { |
| return; |
| } |
| |
| document.title = title; |
| }, |
| |
| async close() { |
| const errorWrapper = this.appConfig.errorWrapper.container; |
| errorWrapper.setAttribute("hidden", "true"); |
| |
| if (!this.pdfLoadingTask) { |
| return undefined; |
| } |
| |
| const promise = this.pdfLoadingTask.destroy(); |
| this.pdfLoadingTask = null; |
| |
| if (this.pdfDocument) { |
| this.pdfDocument = null; |
| this.pdfThumbnailViewer.setDocument(null); |
| this.pdfViewer.setDocument(null); |
| this.pdfLinkService.setDocument(null); |
| this.pdfDocumentProperties.setDocument(null); |
| } |
| |
| webViewerResetPermissions(); |
| this.store = null; |
| this.isInitialViewSet = false; |
| this.downloadComplete = false; |
| this.url = ""; |
| this.baseUrl = ""; |
| this.contentDispositionFilename = null; |
| this.triggerDelayedFallback = null; |
| this._saveInProgress = false; |
| this.pdfSidebar.reset(); |
| this.pdfOutlineViewer.reset(); |
| this.pdfAttachmentViewer.reset(); |
| this.pdfLayerViewer.reset(); |
| |
| if (this.pdfHistory) { |
| this.pdfHistory.reset(); |
| } |
| |
| if (this.findBar) { |
| this.findBar.reset(); |
| } |
| |
| this.toolbar.reset(); |
| this.secondaryToolbar.reset(); |
| |
| if (typeof PDFBug !== "undefined") { |
| PDFBug.cleanup(); |
| } |
| |
| return promise; |
| }, |
| |
| async open(file, args) { |
| if (this.pdfLoadingTask) { |
| await this.close(); |
| } |
| |
| const workerParameters = _app_options.AppOptions.getAll(_app_options.OptionKind.WORKER); |
| |
| for (const key in workerParameters) { |
| _pdf.GlobalWorkerOptions[key] = workerParameters[key]; |
| } |
| |
| const parameters = Object.create(null); |
| |
| if (typeof file === "string") { |
| this.setTitleUsingUrl(file); |
| parameters.url = file; |
| } else if (file && "byteLength" in file) { |
| parameters.data = file; |
| } else if (file.url && file.originalUrl) { |
| this.setTitleUsingUrl(file.originalUrl); |
| parameters.url = file.url; |
| } |
| |
| const apiParameters = _app_options.AppOptions.getAll(_app_options.OptionKind.API); |
| |
| for (const key in apiParameters) { |
| let value = apiParameters[key]; |
| |
| if (key === "docBaseUrl" && !value) {} |
| |
| parameters[key] = value; |
| } |
| |
| if (args) { |
| for (const key in args) { |
| const value = args[key]; |
| |
| if (key === "length") { |
| this.pdfDocumentProperties.setFileSize(value); |
| } |
| |
| parameters[key] = value; |
| } |
| } |
| |
| const loadingTask = (0, _pdf.getDocument)(parameters); |
| this.pdfLoadingTask = loadingTask; |
| |
| loadingTask.onPassword = (updateCallback, reason) => { |
| this.pdfLinkService.externalLinkEnabled = false; |
| this.passwordPrompt.setUpdateCallback(updateCallback, reason); |
| this.passwordPrompt.open(); |
| }; |
| |
| loadingTask.onProgress = ({ |
| loaded, |
| total |
| }) => { |
| this.progress(loaded / total); |
| }; |
| |
| loadingTask.onUnsupportedFeature = this.fallback.bind(this); |
| return loadingTask.promise.then(pdfDocument => { |
| this.load(pdfDocument); |
| }, exception => { |
| if (loadingTask !== this.pdfLoadingTask) { |
| return undefined; |
| } |
| |
| const message = exception && exception.message; |
| let loadingErrorMessage; |
| |
| if (exception instanceof _pdf.InvalidPDFException) { |
| loadingErrorMessage = this.l10n.get("invalid_file_error", null, "Invalid or corrupted PDF file."); |
| } else if (exception instanceof _pdf.MissingPDFException) { |
| loadingErrorMessage = this.l10n.get("missing_file_error", null, "Missing PDF file."); |
| } else if (exception instanceof _pdf.UnexpectedResponseException) { |
| loadingErrorMessage = this.l10n.get("unexpected_response_error", null, "Unexpected server response."); |
| } else { |
| loadingErrorMessage = this.l10n.get("loading_error", null, "An error occurred while loading the PDF."); |
| } |
| |
| return loadingErrorMessage.then(msg => { |
| this.error(msg, { |
| message |
| }); |
| throw exception; |
| }); |
| }); |
| }, |
| |
| download({ |
| sourceEventType = "download" |
| } = {}) { |
| function downloadByUrl() { |
| downloadManager.downloadUrl(url, filename); |
| } |
| |
| const url = this.baseUrl; |
| const filename = this.contentDispositionFilename || (0, _ui_utils.getPDFFileNameFromURL)(this.url); |
| const downloadManager = this.downloadManager; |
| |
| downloadManager.onerror = err => { |
| this.error(`PDF failed to download: ${err}`); |
| }; |
| |
| if (!this.pdfDocument || !this.downloadComplete) { |
| downloadByUrl(); |
| return; |
| } |
| |
| this.pdfDocument.getData().then(function (data) { |
| const blob = new Blob([data], { |
| type: "application/pdf" |
| }); |
| downloadManager.download(blob, url, filename, sourceEventType); |
| }).catch(downloadByUrl); |
| }, |
| |
| save({ |
| sourceEventType = "download" |
| } = {}) { |
| if (this._saveInProgress) { |
| return; |
| } |
| |
| const url = this.baseUrl; |
| const filename = this.contentDispositionFilename || (0, _ui_utils.getPDFFileNameFromURL)(this.url); |
| const downloadManager = this.downloadManager; |
| |
| downloadManager.onerror = err => { |
| this.error(`PDF failed to be saved: ${err}`); |
| }; |
| |
| if (!this.pdfDocument || !this.downloadComplete) { |
| this.download({ |
| sourceEventType |
| }); |
| return; |
| } |
| |
| this._saveInProgress = true; |
| this.pdfDocument.saveDocument(this.pdfDocument.annotationStorage).then(data => { |
| const blob = new Blob([data], { |
| type: "application/pdf" |
| }); |
| downloadManager.download(blob, url, filename, sourceEventType); |
| }).catch(() => { |
| this.download({ |
| sourceEventType |
| }); |
| }).finally(() => { |
| this._saveInProgress = false; |
| }); |
| }, |
| |
| _delayedFallback(featureId) { |
| this.externalServices.reportTelemetry({ |
| type: "unsupportedFeature", |
| featureId |
| }); |
| |
| if (!this.triggerDelayedFallback) { |
| this.triggerDelayedFallback = () => { |
| this.fallback(featureId); |
| this.triggerDelayedFallback = null; |
| }; |
| } |
| }, |
| |
| fallback(featureId) { |
| this.externalServices.reportTelemetry({ |
| type: "unsupportedFeature", |
| featureId |
| }); |
| |
| if (this.fellback) { |
| return; |
| } |
| |
| this.fellback = true; |
| this.externalServices.fallback({ |
| featureId, |
| url: this.baseUrl |
| }, function response(download) { |
| if (!download) { |
| return; |
| } |
| |
| PDFViewerApplication.download({ |
| sourceEventType: "download" |
| }); |
| }); |
| }, |
| |
| error(message, moreInfo) { |
| const moreInfoText = [this.l10n.get("error_version_info", { |
| version: _pdf.version || "?", |
| build: _pdf.build || "?" |
| }, "PDF.js v{{version}} (build: {{build}})")]; |
| |
| if (moreInfo) { |
| moreInfoText.push(this.l10n.get("error_message", { |
| message: moreInfo.message |
| }, "Message: {{message}}")); |
| |
| if (moreInfo.stack) { |
| moreInfoText.push(this.l10n.get("error_stack", { |
| stack: moreInfo.stack |
| }, "Stack: {{stack}}")); |
| } else { |
| if (moreInfo.filename) { |
| moreInfoText.push(this.l10n.get("error_file", { |
| file: moreInfo.filename |
| }, "File: {{file}}")); |
| } |
| |
| if (moreInfo.lineNumber) { |
| moreInfoText.push(this.l10n.get("error_line", { |
| line: moreInfo.lineNumber |
| }, "Line: {{line}}")); |
| } |
| } |
| } |
| |
| const errorWrapperConfig = this.appConfig.errorWrapper; |
| const errorWrapper = errorWrapperConfig.container; |
| errorWrapper.removeAttribute("hidden"); |
| const errorMessage = errorWrapperConfig.errorMessage; |
| errorMessage.textContent = message; |
| const closeButton = errorWrapperConfig.closeButton; |
| |
| closeButton.onclick = function () { |
| errorWrapper.setAttribute("hidden", "true"); |
| }; |
| |
| const errorMoreInfo = errorWrapperConfig.errorMoreInfo; |
| const moreInfoButton = errorWrapperConfig.moreInfoButton; |
| const lessInfoButton = errorWrapperConfig.lessInfoButton; |
| |
| moreInfoButton.onclick = function () { |
| errorMoreInfo.removeAttribute("hidden"); |
| moreInfoButton.setAttribute("hidden", "true"); |
| lessInfoButton.removeAttribute("hidden"); |
| errorMoreInfo.style.height = errorMoreInfo.scrollHeight + "px"; |
| }; |
| |
| lessInfoButton.onclick = function () { |
| errorMoreInfo.setAttribute("hidden", "true"); |
| moreInfoButton.removeAttribute("hidden"); |
| lessInfoButton.setAttribute("hidden", "true"); |
| }; |
| |
| moreInfoButton.oncontextmenu = _ui_utils.noContextMenuHandler; |
| lessInfoButton.oncontextmenu = _ui_utils.noContextMenuHandler; |
| closeButton.oncontextmenu = _ui_utils.noContextMenuHandler; |
| moreInfoButton.removeAttribute("hidden"); |
| lessInfoButton.setAttribute("hidden", "true"); |
| Promise.all(moreInfoText).then(parts => { |
| errorMoreInfo.value = parts.join("\n"); |
| }); |
| }, |
| |
| progress(level) { |
| if (this.downloadComplete) { |
| return; |
| } |
| |
| const percent = Math.round(level * 100); |
| |
| if (percent > this.loadingBar.percent || isNaN(percent)) { |
| this.loadingBar.percent = percent; |
| const disableAutoFetch = this.pdfDocument ? this.pdfDocument.loadingParams.disableAutoFetch : _app_options.AppOptions.get("disableAutoFetch"); |
| |
| if (disableAutoFetch && percent) { |
| if (this.disableAutoFetchLoadingBarTimeout) { |
| clearTimeout(this.disableAutoFetchLoadingBarTimeout); |
| this.disableAutoFetchLoadingBarTimeout = null; |
| } |
| |
| this.loadingBar.show(); |
| this.disableAutoFetchLoadingBarTimeout = setTimeout(() => { |
| this.loadingBar.hide(); |
| this.disableAutoFetchLoadingBarTimeout = null; |
| }, DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT); |
| } |
| } |
| }, |
| |
| load(pdfDocument) { |
| this.pdfDocument = pdfDocument; |
| pdfDocument.getDownloadInfo().then(() => { |
| this.downloadComplete = true; |
| this.loadingBar.hide(); |
| firstPagePromise.then(() => { |
| this.eventBus.dispatch("documentloaded", { |
| source: this |
| }); |
| }); |
| }); |
| const pageLayoutPromise = pdfDocument.getPageLayout().catch(function () {}); |
| const pageModePromise = pdfDocument.getPageMode().catch(function () {}); |
| const openActionPromise = pdfDocument.getOpenAction().catch(function () {}); |
| this.toolbar.setPagesCount(pdfDocument.numPages, false); |
| this.secondaryToolbar.setPagesCount(pdfDocument.numPages); |
| let baseDocumentUrl; |
| baseDocumentUrl = null; |
| this.pdfLinkService.setDocument(pdfDocument, baseDocumentUrl); |
| this.pdfDocumentProperties.setDocument(pdfDocument, this.url); |
| const annotationStorage = pdfDocument.annotationStorage; |
| |
| annotationStorage.onSetModified = function () { |
| window.addEventListener("beforeunload", beforeUnload); |
| }; |
| |
| annotationStorage.onResetModified = function () { |
| window.removeEventListener("beforeunload", beforeUnload); |
| }; |
| |
| const pdfViewer = this.pdfViewer; |
| pdfViewer.setDocument(pdfDocument); |
| const { |
| firstPagePromise, |
| onePageRendered, |
| pagesPromise |
| } = pdfViewer; |
| const pdfThumbnailViewer = this.pdfThumbnailViewer; |
| pdfThumbnailViewer.setDocument(pdfDocument); |
| const storedPromise = (this.store = new _view_history.ViewHistory(pdfDocument.fingerprint)).getMultiple({ |
| page: null, |
| zoom: _ui_utils.DEFAULT_SCALE_VALUE, |
| scrollLeft: "0", |
| scrollTop: "0", |
| rotation: null, |
| sidebarView: _pdf_sidebar.SidebarView.UNKNOWN, |
| scrollMode: _ui_utils.ScrollMode.UNKNOWN, |
| spreadMode: _ui_utils.SpreadMode.UNKNOWN |
| }).catch(() => { |
| return Object.create(null); |
| }); |
| firstPagePromise.then(pdfPage => { |
| this.loadingBar.setWidth(this.appConfig.viewerContainer); |
| Promise.all([_ui_utils.animationStarted, storedPromise, pageLayoutPromise, pageModePromise, openActionPromise]).then(async ([timeStamp, stored, pageLayout, pageMode, openAction]) => { |
| const viewOnLoad = _app_options.AppOptions.get("viewOnLoad"); |
| |
| this._initializePdfHistory({ |
| fingerprint: pdfDocument.fingerprint, |
| viewOnLoad, |
| initialDest: openAction && openAction.dest |
| }); |
| |
| const initialBookmark = this.initialBookmark; |
| |
| const zoom = _app_options.AppOptions.get("defaultZoomValue"); |
| |
| let hash = zoom ? `zoom=${zoom}` : null; |
| let rotation = null; |
| |
| let sidebarView = _app_options.AppOptions.get("sidebarViewOnLoad"); |
| |
| let scrollMode = _app_options.AppOptions.get("scrollModeOnLoad"); |
| |
| let spreadMode = _app_options.AppOptions.get("spreadModeOnLoad"); |
| |
| if (stored.page && viewOnLoad !== ViewOnLoad.INITIAL) { |
| hash = `page=${stored.page}&zoom=${zoom || stored.zoom},` + `${stored.scrollLeft},${stored.scrollTop}`; |
| rotation = parseInt(stored.rotation, 10); |
| |
| if (sidebarView === _pdf_sidebar.SidebarView.UNKNOWN) { |
| sidebarView = stored.sidebarView | 0; |
| } |
| |
| if (scrollMode === _ui_utils.ScrollMode.UNKNOWN) { |
| scrollMode = stored.scrollMode | 0; |
| } |
| |
| if (spreadMode === _ui_utils.SpreadMode.UNKNOWN) { |
| spreadMode = stored.spreadMode | 0; |
| } |
| } |
| |
| if (pageMode && sidebarView === _pdf_sidebar.SidebarView.UNKNOWN) { |
| sidebarView = apiPageModeToSidebarView(pageMode); |
| } |
| |
| if (pageLayout && spreadMode === _ui_utils.SpreadMode.UNKNOWN) { |
| spreadMode = apiPageLayoutToSpreadMode(pageLayout); |
| } |
| |
| this.setInitialView(hash, { |
| rotation, |
| sidebarView, |
| scrollMode, |
| spreadMode |
| }); |
| this.eventBus.dispatch("documentinit", { |
| source: this |
| }); |
| |
| if (!this.isViewerEmbedded) { |
| pdfViewer.focus(); |
| } |
| |
| this._initializePermissions(pdfDocument); |
| |
| await Promise.race([pagesPromise, new Promise(resolve => { |
| setTimeout(resolve, FORCE_PAGES_LOADED_TIMEOUT); |
| })]); |
| |
| if (!initialBookmark && !hash) { |
| return; |
| } |
| |
| if (pdfViewer.hasEqualPageSizes) { |
| return; |
| } |
| |
| this.initialBookmark = initialBookmark; |
| pdfViewer.currentScaleValue = pdfViewer.currentScaleValue; |
| this.setInitialView(hash); |
| }).catch(() => { |
| this.setInitialView(); |
| }).then(function () { |
| pdfViewer.update(); |
| }); |
| }); |
| pagesPromise.then(() => { |
| this._initializeAutoPrint(pdfDocument, openActionPromise); |
| }); |
| onePageRendered.then(() => { |
| pdfDocument.getOutline().then(outline => { |
| this.pdfOutlineViewer.render({ |
| outline |
| }); |
| }); |
| pdfDocument.getAttachments().then(attachments => { |
| this.pdfAttachmentViewer.render({ |
| attachments |
| }); |
| }); |
| pdfViewer.optionalContentConfigPromise.then(optionalContentConfig => { |
| this.pdfLayerViewer.render({ |
| optionalContentConfig, |
| pdfDocument |
| }); |
| }); |
| }); |
| |
| this._initializePageLabels(pdfDocument); |
| |
| this._initializeMetadata(pdfDocument); |
| }, |
| |
| async _initializeAutoPrint(pdfDocument, openActionPromise) { |
| const [openAction, javaScript] = await Promise.all([openActionPromise, pdfDocument.getJavaScript()]); |
| |
| if (pdfDocument !== this.pdfDocument) { |
| return; |
| } |
| |
| let triggerAutoPrint = false; |
| |
| if (openAction && openAction.action === "Print") { |
| triggerAutoPrint = true; |
| } |
| |
| if (javaScript) { |
| javaScript.some(js => { |
| if (!js) { |
| return false; |
| } |
| |
| console.warn("Warning: JavaScript is not supported"); |
| |
| this._delayedFallback(_pdf.UNSUPPORTED_FEATURES.javaScript); |
| |
| return true; |
| }); |
| |
| if (!triggerAutoPrint) { |
| for (const js of javaScript) { |
| if (js && _ui_utils.AutoPrintRegExp.test(js)) { |
| triggerAutoPrint = true; |
| break; |
| } |
| } |
| } |
| } |
| |
| if (!this.supportsPrinting) { |
| return; |
| } |
| |
| if (triggerAutoPrint) { |
| setTimeout(function () { |
| window.print(); |
| }); |
| } |
| }, |
| |
| async _initializeMetadata(pdfDocument) { |
| const { |
| info, |
| metadata, |
| contentDispositionFilename |
| } = await pdfDocument.getMetadata(); |
| |
| if (pdfDocument !== this.pdfDocument) { |
| return; |
| } |
| |
| this.documentInfo = info; |
| this.metadata = metadata; |
| this.contentDispositionFilename = contentDispositionFilename; |
| console.log(`PDF ${pdfDocument.fingerprint} [${info.PDFFormatVersion} ` + `${(info.Producer || "-").trim()} / ${(info.Creator || "-").trim()}] ` + `(PDF.js: ${_pdf.version || "-"}` + `${this.pdfViewer.enableWebGL ? " [WebGL]" : ""})`); |
| let pdfTitle; |
| const infoTitle = info && info.Title; |
| |
| if (infoTitle) { |
| pdfTitle = infoTitle; |
| } |
| |
| const metadataTitle = metadata && metadata.get("dc:title"); |
| |
| if (metadataTitle) { |
| if (metadataTitle !== "Untitled" && !/[\uFFF0-\uFFFF]/g.test(metadataTitle)) { |
| pdfTitle = metadataTitle; |
| } |
| } |
| |
| if (pdfTitle) { |
| this.setTitle(`${pdfTitle} - ${contentDispositionFilename || document.title}`); |
| } else if (contentDispositionFilename) { |
| this.setTitle(contentDispositionFilename); |
| } |
| |
| if (info.IsXFAPresent && !info.IsAcroFormPresent) { |
| console.warn("Warning: XFA is not supported"); |
| |
| this._delayedFallback(_pdf.UNSUPPORTED_FEATURES.forms); |
| } else if ((info.IsAcroFormPresent || info.IsXFAPresent) && !this.pdfViewer.renderInteractiveForms) { |
| console.warn("Warning: Interactive form support is not enabled"); |
| |
| this._delayedFallback(_pdf.UNSUPPORTED_FEATURES.forms); |
| } |
| |
| let versionId = "other"; |
| |
| if (KNOWN_VERSIONS.includes(info.PDFFormatVersion)) { |
| versionId = `v${info.PDFFormatVersion.replace(".", "_")}`; |
| } |
| |
| let generatorId = "other"; |
| |
| if (info.Producer) { |
| const producer = info.Producer.toLowerCase(); |
| KNOWN_GENERATORS.some(function (generator) { |
| if (!producer.includes(generator)) { |
| return false; |
| } |
| |
| generatorId = generator.replace(/[ .\-]/g, "_"); |
| return true; |
| }); |
| } |
| |
| let formType = null; |
| |
| if (info.IsXFAPresent) { |
| formType = "xfa"; |
| } else if (info.IsAcroFormPresent) { |
| formType = "acroform"; |
| } |
| |
| this.externalServices.reportTelemetry({ |
| type: "documentInfo", |
| version: versionId, |
| generator: generatorId, |
| formType |
| }); |
| }, |
| |
| async _initializePageLabels(pdfDocument) { |
| const labels = await pdfDocument.getPageLabels(); |
| |
| if (pdfDocument !== this.pdfDocument) { |
| return; |
| } |
| |
| if (!labels || _app_options.AppOptions.get("disablePageLabels")) { |
| return; |
| } |
| |
| const numLabels = labels.length; |
| |
| if (numLabels !== this.pagesCount) { |
| console.error("The number of Page Labels does not match the number of pages in the document."); |
| return; |
| } |
| |
| let i = 0; |
| |
| while (i < numLabels && labels[i] === (i + 1).toString()) { |
| i++; |
| } |
| |
| if (i === numLabels) { |
| return; |
| } |
| |
| const { |
| pdfViewer, |
| pdfThumbnailViewer, |
| toolbar |
| } = this; |
| pdfViewer.setPageLabels(labels); |
| pdfThumbnailViewer.setPageLabels(labels); |
| toolbar.setPagesCount(numLabels, true); |
| toolbar.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel); |
| }, |
| |
| _initializePdfHistory({ |
| fingerprint, |
| viewOnLoad, |
| initialDest = null |
| }) { |
| if (this.isViewerEmbedded || _app_options.AppOptions.get("disableHistory")) { |
| return; |
| } |
| |
| this.pdfHistory.initialize({ |
| fingerprint, |
| resetHistory: viewOnLoad === ViewOnLoad.INITIAL, |
| updateUrl: _app_options.AppOptions.get("historyUpdateUrl") |
| }); |
| |
| if (this.pdfHistory.initialBookmark) { |
| this.initialBookmark = this.pdfHistory.initialBookmark; |
| this.initialRotation = this.pdfHistory.initialRotation; |
| } |
| |
| if (initialDest && !this.initialBookmark && viewOnLoad === ViewOnLoad.UNKNOWN) { |
| this.initialBookmark = JSON.stringify(initialDest); |
| this.pdfHistory.push({ |
| explicitDest: initialDest, |
| pageNumber: null |
| }); |
| } |
| }, |
| |
| async _initializePermissions(pdfDocument) { |
| const permissions = await pdfDocument.getPermissions(); |
| |
| if (pdfDocument !== this.pdfDocument) { |
| return; |
| } |
| |
| if (!permissions || !_app_options.AppOptions.get("enablePermissions")) { |
| return; |
| } |
| |
| if (!permissions.includes(_pdf.PermissionFlag.COPY)) { |
| this.appConfig.viewerContainer.classList.add(ENABLE_PERMISSIONS_CLASS); |
| } |
| }, |
| |
| setInitialView(storedHash, { |
| rotation, |
| sidebarView, |
| scrollMode, |
| spreadMode |
| } = {}) { |
| const setRotation = angle => { |
| if ((0, _ui_utils.isValidRotation)(angle)) { |
| this.pdfViewer.pagesRotation = angle; |
| } |
| }; |
| |
| const setViewerModes = (scroll, spread) => { |
| if ((0, _ui_utils.isValidScrollMode)(scroll)) { |
| this.pdfViewer.scrollMode = scroll; |
| } |
| |
| if ((0, _ui_utils.isValidSpreadMode)(spread)) { |
| this.pdfViewer.spreadMode = spread; |
| } |
| }; |
| |
| this.isInitialViewSet = true; |
| this.pdfSidebar.setInitialView(sidebarView); |
| setViewerModes(scrollMode, spreadMode); |
| |
| if (this.initialBookmark) { |
| setRotation(this.initialRotation); |
| delete this.initialRotation; |
| this.pdfLinkService.setHash(this.initialBookmark); |
| this.initialBookmark = null; |
| } else if (storedHash) { |
| setRotation(rotation); |
| this.pdfLinkService.setHash(storedHash); |
| } |
| |
| this.toolbar.setPageNumber(this.pdfViewer.currentPageNumber, this.pdfViewer.currentPageLabel); |
| this.secondaryToolbar.setPageNumber(this.pdfViewer.currentPageNumber); |
| |
| if (!this.pdfViewer.currentScaleValue) { |
| this.pdfViewer.currentScaleValue = _ui_utils.DEFAULT_SCALE_VALUE; |
| } |
| }, |
| |
| cleanup() { |
| if (!this.pdfDocument) { |
| return; |
| } |
| |
| this.pdfViewer.cleanup(); |
| this.pdfThumbnailViewer.cleanup(); |
| |
| if (this.pdfViewer.renderer !== _ui_utils.RendererType.SVG) { |
| this.pdfDocument.cleanup(); |
| } |
| }, |
| |
| forceRendering() { |
| this.pdfRenderingQueue.printing = this.printing; |
| this.pdfRenderingQueue.isThumbnailViewEnabled = this.pdfSidebar.isThumbnailViewVisible; |
| this.pdfRenderingQueue.renderHighestPriority(); |
| }, |
| |
| beforePrint() { |
| if (this.printService) { |
| return; |
| } |
| |
| if (!this.supportsPrinting) { |
| this.l10n.get("printing_not_supported", null, "Warning: Printing is not fully supported by this browser.").then(printMessage => { |
| this.error(printMessage); |
| }); |
| return; |
| } |
| |
| if (!this.pdfViewer.pageViewsReady) { |
| this.l10n.get("printing_not_ready", null, "Warning: The PDF is not fully loaded for printing.").then(notReadyMessage => { |
| window.alert(notReadyMessage); |
| }); |
| return; |
| } |
| |
| const pagesOverview = this.pdfViewer.getPagesOverview(); |
| const printContainer = this.appConfig.printContainer; |
| |
| const printResolution = _app_options.AppOptions.get("printResolution"); |
| |
| const optionalContentConfigPromise = this.pdfViewer.optionalContentConfigPromise; |
| const printService = PDFPrintServiceFactory.instance.createPrintService(this.pdfDocument, pagesOverview, printContainer, printResolution, optionalContentConfigPromise, this.l10n); |
| this.printService = printService; |
| this.forceRendering(); |
| printService.layout(); |
| this.externalServices.reportTelemetry({ |
| type: "print" |
| }); |
| }, |
| |
| afterPrint() { |
| if (this.printService) { |
| this.printService.destroy(); |
| this.printService = null; |
| |
| if (this.pdfDocument) { |
| this.pdfDocument.annotationStorage.resetModified(); |
| } |
| } |
| |
| this.forceRendering(); |
| }, |
| |
| rotatePages(delta) { |
| if (!this.pdfDocument) { |
| return; |
| } |
| |
| const newRotation = (this.pdfViewer.pagesRotation + 360 + delta) % 360; |
| this.pdfViewer.pagesRotation = newRotation; |
| }, |
| |
| requestPresentationMode() { |
| if (!this.pdfPresentationMode) { |
| return; |
| } |
| |
| this.pdfPresentationMode.request(); |
| }, |
| |
| bindEvents() { |
| const { |
| eventBus, |
| _boundEvents |
| } = this; |
| _boundEvents.beforePrint = this.beforePrint.bind(this); |
| _boundEvents.afterPrint = this.afterPrint.bind(this); |
| |
| eventBus._on("resize", webViewerResize); |
| |
| eventBus._on("hashchange", webViewerHashchange); |
| |
| eventBus._on("beforeprint", _boundEvents.beforePrint); |
| |
| eventBus._on("afterprint", _boundEvents.afterPrint); |
| |
| eventBus._on("pagerendered", webViewerPageRendered); |
| |
| eventBus._on("updateviewarea", webViewerUpdateViewarea); |
| |
| eventBus._on("pagechanging", webViewerPageChanging); |
| |
| eventBus._on("scalechanging", webViewerScaleChanging); |
| |
| eventBus._on("rotationchanging", webViewerRotationChanging); |
| |
| eventBus._on("sidebarviewchanged", webViewerSidebarViewChanged); |
| |
| eventBus._on("pagemode", webViewerPageMode); |
| |
| eventBus._on("namedaction", webViewerNamedAction); |
| |
| eventBus._on("presentationmodechanged", webViewerPresentationModeChanged); |
| |
| eventBus._on("presentationmode", webViewerPresentationMode); |
| |
| eventBus._on("print", webViewerPrint); |
| |
| eventBus._on("download", webViewerDownload); |
| |
| eventBus._on("save", webViewerSave); |
| |
| eventBus._on("firstpage", webViewerFirstPage); |
| |
| eventBus._on("lastpage", webViewerLastPage); |
| |
| eventBus._on("nextpage", webViewerNextPage); |
| |
| eventBus._on("previouspage", webViewerPreviousPage); |
| |
| eventBus._on("zoomin", webViewerZoomIn); |
| |
| eventBus._on("zoomout", webViewerZoomOut); |
| |
| eventBus._on("zoomreset", webViewerZoomReset); |
| |
| eventBus._on("pagenumberchanged", webViewerPageNumberChanged); |
| |
| eventBus._on("scalechanged", webViewerScaleChanged); |
| |
| eventBus._on("rotatecw", webViewerRotateCw); |
| |
| eventBus._on("rotateccw", webViewerRotateCcw); |
| |
| eventBus._on("optionalcontentconfig", webViewerOptionalContentConfig); |
| |
| eventBus._on("switchscrollmode", webViewerSwitchScrollMode); |
| |
| eventBus._on("scrollmodechanged", webViewerScrollModeChanged); |
| |
| eventBus._on("switchspreadmode", webViewerSwitchSpreadMode); |
| |
| eventBus._on("spreadmodechanged", webViewerSpreadModeChanged); |
| |
| eventBus._on("documentproperties", webViewerDocumentProperties); |
| |
| eventBus._on("find", webViewerFind); |
| |
| eventBus._on("findfromurlhash", webViewerFindFromUrlHash); |
| |
| eventBus._on("updatefindmatchescount", webViewerUpdateFindMatchesCount); |
| |
| eventBus._on("updatefindcontrolstate", webViewerUpdateFindControlState); |
| |
| eventBus._on("fileinputchange", webViewerFileInputChange); |
| |
| eventBus._on("openfile", webViewerOpenFile); |
| }, |
| |
| bindWindowEvents() { |
| const { |
| eventBus, |
| _boundEvents |
| } = this; |
| |
| _boundEvents.windowResize = () => { |
| eventBus.dispatch("resize", { |
| source: window |
| }); |
| }; |
| |
| _boundEvents.windowHashChange = () => { |
| eventBus.dispatch("hashchange", { |
| source: window, |
| hash: document.location.hash.substring(1) |
| }); |
| }; |
| |
| _boundEvents.windowBeforePrint = () => { |
| eventBus.dispatch("beforeprint", { |
| source: window |
| }); |
| }; |
| |
| _boundEvents.windowAfterPrint = () => { |
| eventBus.dispatch("afterprint", { |
| source: window |
| }); |
| }; |
| |
| window.addEventListener("visibilitychange", webViewerVisibilityChange); |
| window.addEventListener("wheel", webViewerWheel, { |
| passive: false |
| }); |
| window.addEventListener("touchstart", webViewerTouchStart, { |
| passive: false |
| }); |
| window.addEventListener("click", webViewerClick); |
| window.addEventListener("keydown", webViewerKeyDown); |
| window.addEventListener("keyup", webViewerKeyUp); |
| window.addEventListener("resize", _boundEvents.windowResize); |
| window.addEventListener("hashchange", _boundEvents.windowHashChange); |
| window.addEventListener("beforeprint", _boundEvents.windowBeforePrint); |
| window.addEventListener("afterprint", _boundEvents.windowAfterPrint); |
| }, |
| |
| unbindEvents() { |
| const { |
| eventBus, |
| _boundEvents |
| } = this; |
| |
| eventBus._off("resize", webViewerResize); |
| |
| eventBus._off("hashchange", webViewerHashchange); |
| |
| eventBus._off("beforeprint", _boundEvents.beforePrint); |
| |
| eventBus._off("afterprint", _boundEvents.afterPrint); |
| |
| eventBus._off("pagerendered", webViewerPageRendered); |
| |
| eventBus._off("updateviewarea", webViewerUpdateViewarea); |
| |
| eventBus._off("pagechanging", webViewerPageChanging); |
| |
| eventBus._off("scalechanging", webViewerScaleChanging); |
| |
| eventBus._off("rotationchanging", webViewerRotationChanging); |
| |
| eventBus._off("sidebarviewchanged", webViewerSidebarViewChanged); |
| |
| eventBus._off("pagemode", webViewerPageMode); |
| |
| eventBus._off("namedaction", webViewerNamedAction); |
| |
| eventBus._off("presentationmodechanged", webViewerPresentationModeChanged); |
| |
| eventBus._off("presentationmode", webViewerPresentationMode); |
| |
| eventBus._off("print", webViewerPrint); |
| |
| eventBus._off("download", webViewerDownload); |
| |
| eventBus._off("save", webViewerSave); |
| |
| eventBus._off("firstpage", webViewerFirstPage); |
| |
| eventBus._off("lastpage", webViewerLastPage); |
| |
| eventBus._off("nextpage", webViewerNextPage); |
| |
| eventBus._off("previouspage", webViewerPreviousPage); |
| |
| eventBus._off("zoomin", webViewerZoomIn); |
| |
| eventBus._off("zoomout", webViewerZoomOut); |
| |
| eventBus._off("zoomreset", webViewerZoomReset); |
| |
| eventBus._off("pagenumberchanged", webViewerPageNumberChanged); |
| |
| eventBus._off("scalechanged", webViewerScaleChanged); |
| |
| eventBus._off("rotatecw", webViewerRotateCw); |
| |
| eventBus._off("rotateccw", webViewerRotateCcw); |
| |
| eventBus._off("optionalcontentconfig", webViewerOptionalContentConfig); |
| |
| eventBus._off("switchscrollmode", webViewerSwitchScrollMode); |
| |
| eventBus._off("scrollmodechanged", webViewerScrollModeChanged); |
| |
| eventBus._off("switchspreadmode", webViewerSwitchSpreadMode); |
| |
| eventBus._off("spreadmodechanged", webViewerSpreadModeChanged); |
| |
| eventBus._off("documentproperties", webViewerDocumentProperties); |
| |
| eventBus._off("find", webViewerFind); |
| |
| eventBus._off("findfromurlhash", webViewerFindFromUrlHash); |
| |
| eventBus._off("updatefindmatchescount", webViewerUpdateFindMatchesCount); |
| |
| eventBus._off("updatefindcontrolstate", webViewerUpdateFindControlState); |
| |
| eventBus._off("fileinputchange", webViewerFileInputChange); |
| |
| eventBus._off("openfile", webViewerOpenFile); |
| |
| _boundEvents.beforePrint = null; |
| _boundEvents.afterPrint = null; |
| }, |
| |
| unbindWindowEvents() { |
| const { |
| _boundEvents |
| } = this; |
| window.removeEventListener("visibilitychange", webViewerVisibilityChange); |
| window.removeEventListener("wheel", webViewerWheel, { |
| passive: false |
| }); |
| window.removeEventListener("touchstart", webViewerTouchStart, { |
| passive: false |
| }); |
| window.removeEventListener("click", webViewerClick); |
| window.removeEventListener("keydown", webViewerKeyDown); |
| window.removeEventListener("keyup", webViewerKeyUp); |
| window.removeEventListener("resize", _boundEvents.windowResize); |
| window.removeEventListener("hashchange", _boundEvents.windowHashChange); |
| window.removeEventListener("beforeprint", _boundEvents.windowBeforePrint); |
| window.removeEventListener("afterprint", _boundEvents.windowAfterPrint); |
| _boundEvents.windowResize = null; |
| _boundEvents.windowHashChange = null; |
| _boundEvents.windowBeforePrint = null; |
| _boundEvents.windowAfterPrint = null; |
| }, |
| |
| accumulateWheelTicks(ticks) { |
| if (this._wheelUnusedTicks > 0 && ticks < 0 || this._wheelUnusedTicks < 0 && ticks > 0) { |
| this._wheelUnusedTicks = 0; |
| } |
| |
| this._wheelUnusedTicks += ticks; |
| const wholeTicks = Math.sign(this._wheelUnusedTicks) * Math.floor(Math.abs(this._wheelUnusedTicks)); |
| this._wheelUnusedTicks -= wholeTicks; |
| return wholeTicks; |
| } |
| |
| }; |
| exports.PDFViewerApplication = PDFViewerApplication; |
| let validateFileURL; |
| { |
| const HOSTED_VIEWER_ORIGINS = ["null", "http://mozilla.github.io", "https://mozilla.github.io"]; |
| |
| validateFileURL = function (file) { |
| if (file === undefined) { |
| return; |
| } |
| |
| try { |
| const viewerOrigin = new URL(window.location.href).origin || "null"; |
| |
| if (HOSTED_VIEWER_ORIGINS.includes(viewerOrigin)) { |
| return; |
| } |
| |
| const { |
| origin, |
| protocol |
| } = new URL(file, window.location.href); |
| |
| if (origin !== viewerOrigin && protocol !== "blob:") { |
| throw new Error("file origin does not match viewer's"); |
| } |
| } catch (ex) { |
| const message = ex && ex.message; |
| PDFViewerApplication.l10n.get("loading_error", null, "An error occurred while loading the PDF.").then(loadingErrorMessage => { |
| PDFViewerApplication.error(loadingErrorMessage, { |
| message |
| }); |
| }); |
| throw ex; |
| } |
| }; |
| } |
| |
| async function loadFakeWorker() { |
| if (!_pdf.GlobalWorkerOptions.workerSrc) { |
| _pdf.GlobalWorkerOptions.workerSrc = _app_options.AppOptions.get("workerSrc"); |
| } |
| |
| return (0, _pdf.loadScript)(_pdf.PDFWorker.getWorkerSrc()); |
| } |
| |
| function loadAndEnablePDFBug(enabledTabs) { |
| const appConfig = PDFViewerApplication.appConfig; |
| return (0, _pdf.loadScript)(appConfig.debuggerScriptPath).then(function () { |
| PDFBug.enable(enabledTabs); |
| PDFBug.init({ |
| OPS: _pdf.OPS |
| }, appConfig.mainContainer); |
| }); |
| } |
| |
| function webViewerInitialized() { |
| const appConfig = PDFViewerApplication.appConfig; |
| let file; |
| const queryString = document.location.search.substring(1); |
| const params = (0, _ui_utils.parseQueryString)(queryString); |
| file = "file" in params ? params.file : _app_options.AppOptions.get("defaultUrl"); |
| validateFileURL(file); |
| const fileInput = document.createElement("input"); |
| fileInput.id = appConfig.openFileInputName; |
| fileInput.className = "fileInput"; |
| fileInput.setAttribute("type", "file"); |
| fileInput.oncontextmenu = _ui_utils.noContextMenuHandler; |
| document.body.appendChild(fileInput); |
| |
| if (!window.File || !window.FileReader || !window.FileList || !window.Blob) { |
| appConfig.toolbar.openFile.setAttribute("hidden", "true"); |
| appConfig.secondaryToolbar.openFileButton.setAttribute("hidden", "true"); |
| } else { |
| fileInput.value = null; |
| } |
| |
| fileInput.addEventListener("change", function (evt) { |
| const files = evt.target.files; |
| |
| if (!files || files.length === 0) { |
| return; |
| } |
| |
| PDFViewerApplication.eventBus.dispatch("fileinputchange", { |
| source: this, |
| fileInput: evt.target |
| }); |
| }); |
| appConfig.mainContainer.addEventListener("dragover", function (evt) { |
| evt.preventDefault(); |
| evt.dataTransfer.dropEffect = "move"; |
| }); |
| appConfig.mainContainer.addEventListener("drop", function (evt) { |
| evt.preventDefault(); |
| const files = evt.dataTransfer.files; |
| |
| if (!files || files.length === 0) { |
| return; |
| } |
| |
| PDFViewerApplication.eventBus.dispatch("fileinputchange", { |
| source: this, |
| fileInput: evt.dataTransfer |
| }); |
| }); |
| |
| if (!PDFViewerApplication.supportsDocumentFonts) { |
| _app_options.AppOptions.set("disableFontFace", true); |
| |
| PDFViewerApplication.l10n.get("web_fonts_disabled", null, "Web fonts are disabled: unable to use embedded PDF fonts.").then(msg => { |
| console.warn(msg); |
| }); |
| } |
| |
| if (!PDFViewerApplication.supportsPrinting) { |
| appConfig.toolbar.print.classList.add("hidden"); |
| appConfig.secondaryToolbar.printButton.classList.add("hidden"); |
| } |
| |
| if (!PDFViewerApplication.supportsFullscreen) { |
| appConfig.toolbar.presentationModeButton.classList.add("hidden"); |
| appConfig.secondaryToolbar.presentationModeButton.classList.add("hidden"); |
| } |
| |
| if (PDFViewerApplication.supportsIntegratedFind) { |
| appConfig.toolbar.viewFind.classList.add("hidden"); |
| } |
| |
| appConfig.mainContainer.addEventListener("transitionend", function (evt) { |
| if (evt.target === this) { |
| PDFViewerApplication.eventBus.dispatch("resize", { |
| source: this |
| }); |
| } |
| }, true); |
| |
| try { |
| webViewerOpenFileViaURL(file); |
| } catch (reason) { |
| PDFViewerApplication.l10n.get("loading_error", null, "An error occurred while loading the PDF.").then(msg => { |
| PDFViewerApplication.error(msg, reason); |
| }); |
| } |
| } |
| |
| let webViewerOpenFileViaURL; |
| { |
| webViewerOpenFileViaURL = function (file) { |
| if (file && file.lastIndexOf("file:", 0) === 0) { |
| PDFViewerApplication.setTitleUsingUrl(file); |
| const xhr = new XMLHttpRequest(); |
| |
| xhr.onload = function () { |
| PDFViewerApplication.open(new Uint8Array(xhr.response)); |
| }; |
| |
| xhr.open("GET", file); |
| xhr.responseType = "arraybuffer"; |
| xhr.send(); |
| return; |
| } |
| |
| if (file) { |
| PDFViewerApplication.open(file); |
| } |
| }; |
| } |
| |
| function webViewerResetPermissions() { |
| const { |
| appConfig |
| } = PDFViewerApplication; |
| |
| if (!appConfig) { |
| return; |
| } |
| |
| appConfig.viewerContainer.classList.remove(ENABLE_PERMISSIONS_CLASS); |
| } |
| |
| function webViewerPageRendered(evt) { |
| const pageNumber = evt.pageNumber; |
| const pageIndex = pageNumber - 1; |
| const pageView = PDFViewerApplication.pdfViewer.getPageView(pageIndex); |
| |
| if (pageNumber === PDFViewerApplication.page) { |
| PDFViewerApplication.toolbar.updateLoadingIndicatorState(false); |
| } |
| |
| if (!pageView) { |
| return; |
| } |
| |
| if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) { |
| const thumbnailView = PDFViewerApplication.pdfThumbnailViewer.getThumbnail(pageIndex); |
| thumbnailView.setImage(pageView); |
| } |
| |
| if (typeof Stats !== "undefined" && Stats.enabled && pageView.stats) { |
| Stats.add(pageNumber, pageView.stats); |
| } |
| |
| if (pageView.error) { |
| PDFViewerApplication.l10n.get("rendering_error", null, "An error occurred while rendering the page.").then(msg => { |
| PDFViewerApplication.error(msg, pageView.error); |
| }); |
| } |
| |
| PDFViewerApplication.externalServices.reportTelemetry({ |
| type: "pageInfo", |
| timestamp: evt.timestamp |
| }); |
| PDFViewerApplication.pdfDocument.getStats().then(function (stats) { |
| PDFViewerApplication.externalServices.reportTelemetry({ |
| type: "documentStats", |
| stats |
| }); |
| }); |
| } |
| |
| function webViewerPageMode({ |
| mode |
| }) { |
| let view; |
| |
| switch (mode) { |
| case "thumbs": |
| view = _pdf_sidebar.SidebarView.THUMBS; |
| break; |
| |
| case "bookmarks": |
| case "outline": |
| view = _pdf_sidebar.SidebarView.OUTLINE; |
| break; |
| |
| case "attachments": |
| view = _pdf_sidebar.SidebarView.ATTACHMENTS; |
| break; |
| |
| case "layers": |
| view = _pdf_sidebar.SidebarView.LAYERS; |
| break; |
| |
| case "none": |
| view = _pdf_sidebar.SidebarView.NONE; |
| break; |
| |
| default: |
| console.error('Invalid "pagemode" hash parameter: ' + mode); |
| return; |
| } |
| |
| PDFViewerApplication.pdfSidebar.switchView(view, true); |
| } |
| |
| function webViewerNamedAction(evt) { |
| switch (evt.action) { |
| case "GoToPage": |
| PDFViewerApplication.appConfig.toolbar.pageNumber.select(); |
| break; |
| |
| case "Find": |
| if (!PDFViewerApplication.supportsIntegratedFind) { |
| PDFViewerApplication.findBar.toggle(); |
| } |
| |
| break; |
| |
| case "Print": |
| if (PDFViewerApplication.supportsPrinting) { |
| webViewerPrint(); |
| } |
| |
| break; |
| |
| case "SaveAs": |
| webViewerSave(); |
| break; |
| } |
| } |
| |
| function webViewerPresentationModeChanged({ |
| active, |
| switchInProgress |
| }) { |
| let state = _ui_utils.PresentationModeState.NORMAL; |
| |
| if (switchInProgress) { |
| state = _ui_utils.PresentationModeState.CHANGING; |
| } else if (active) { |
| state = _ui_utils.PresentationModeState.FULLSCREEN; |
| } |
| |
| PDFViewerApplication.pdfViewer.presentationModeState = state; |
| } |
| |
| function webViewerSidebarViewChanged(evt) { |
| PDFViewerApplication.pdfRenderingQueue.isThumbnailViewEnabled = PDFViewerApplication.pdfSidebar.isThumbnailViewVisible; |
| const store = PDFViewerApplication.store; |
| |
| if (store && PDFViewerApplication.isInitialViewSet) { |
| store.set("sidebarView", evt.view).catch(function () {}); |
| } |
| } |
| |
| function webViewerUpdateViewarea(evt) { |
| const location = evt.location, |
| store = PDFViewerApplication.store; |
| |
| if (store && PDFViewerApplication.isInitialViewSet) { |
| store.setMultiple({ |
| page: location.pageNumber, |
| zoom: location.scale, |
| scrollLeft: location.left, |
| scrollTop: location.top, |
| rotation: location.rotation |
| }).catch(function () {}); |
| } |
| |
| const href = PDFViewerApplication.pdfLinkService.getAnchorUrl(location.pdfOpenParams); |
| PDFViewerApplication.appConfig.toolbar.viewBookmark.href = href; |
| PDFViewerApplication.appConfig.secondaryToolbar.viewBookmarkButton.href = href; |
| const currentPage = PDFViewerApplication.pdfViewer.getPageView(PDFViewerApplication.page - 1); |
| const loading = currentPage.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED; |
| PDFViewerApplication.toolbar.updateLoadingIndicatorState(loading); |
| } |
| |
| function webViewerScrollModeChanged(evt) { |
| const store = PDFViewerApplication.store; |
| |
| if (store && PDFViewerApplication.isInitialViewSet) { |
| store.set("scrollMode", evt.mode).catch(function () {}); |
| } |
| } |
| |
| function webViewerSpreadModeChanged(evt) { |
| const store = PDFViewerApplication.store; |
| |
| if (store && PDFViewerApplication.isInitialViewSet) { |
| store.set("spreadMode", evt.mode).catch(function () {}); |
| } |
| } |
| |
| function webViewerResize() { |
| const { |
| pdfDocument, |
| pdfViewer |
| } = PDFViewerApplication; |
| |
| if (!pdfDocument) { |
| return; |
| } |
| |
| const currentScaleValue = pdfViewer.currentScaleValue; |
| |
| if (currentScaleValue === "auto" || currentScaleValue === "page-fit" || currentScaleValue === "page-width") { |
| pdfViewer.currentScaleValue = currentScaleValue; |
| } |
| |
| pdfViewer.update(); |
| } |
| |
| function webViewerHashchange(evt) { |
| const hash = evt.hash; |
| |
| if (!hash) { |
| return; |
| } |
| |
| if (!PDFViewerApplication.isInitialViewSet) { |
| PDFViewerApplication.initialBookmark = hash; |
| } else if (!PDFViewerApplication.pdfHistory.popStateInProgress) { |
| PDFViewerApplication.pdfLinkService.setHash(hash); |
| } |
| } |
| |
| let webViewerFileInputChange, webViewerOpenFile; |
| { |
| webViewerFileInputChange = function (evt) { |
| if (PDFViewerApplication.pdfViewer && PDFViewerApplication.pdfViewer.isInPresentationMode) { |
| return; |
| } |
| |
| const file = evt.fileInput.files[0]; |
| |
| if (!_viewer_compatibility.viewerCompatibilityParams.disableCreateObjectURL) { |
| let url = URL.createObjectURL(file); |
| |
| if (file.name) { |
| url = { |
| url, |
| originalUrl: file.name |
| }; |
| } |
| |
| PDFViewerApplication.open(url); |
| } else { |
| PDFViewerApplication.setTitleUsingUrl(file.name); |
| const fileReader = new FileReader(); |
| |
| fileReader.onload = function webViewerChangeFileReaderOnload(event) { |
| const buffer = event.target.result; |
| PDFViewerApplication.open(new Uint8Array(buffer)); |
| }; |
| |
| fileReader.readAsArrayBuffer(file); |
| } |
| |
| const appConfig = PDFViewerApplication.appConfig; |
| appConfig.toolbar.viewBookmark.setAttribute("hidden", "true"); |
| appConfig.secondaryToolbar.viewBookmarkButton.setAttribute("hidden", "true"); |
| appConfig.toolbar.download.setAttribute("hidden", "true"); |
| appConfig.secondaryToolbar.downloadButton.setAttribute("hidden", "true"); |
| }; |
| |
| webViewerOpenFile = function (evt) { |
| const openFileInputName = PDFViewerApplication.appConfig.openFileInputName; |
| document.getElementById(openFileInputName).click(); |
| }; |
| } |
| |
| function webViewerPresentationMode() { |
| PDFViewerApplication.requestPresentationMode(); |
| } |
| |
| function webViewerPrint() { |
| window.print(); |
| } |
| |
| function webViewerDownloadOrSave(sourceEventType) { |
| if (PDFViewerApplication.pdfDocument && PDFViewerApplication.pdfDocument.annotationStorage.size > 0) { |
| PDFViewerApplication.save({ |
| sourceEventType |
| }); |
| } else { |
| PDFViewerApplication.download({ |
| sourceEventType |
| }); |
| } |
| } |
| |
| function webViewerDownload() { |
| webViewerDownloadOrSave("download"); |
| } |
| |
| function webViewerSave() { |
| webViewerDownloadOrSave("save"); |
| } |
| |
| function webViewerFirstPage() { |
| if (PDFViewerApplication.pdfDocument) { |
| PDFViewerApplication.page = 1; |
| } |
| } |
| |
| function webViewerLastPage() { |
| if (PDFViewerApplication.pdfDocument) { |
| PDFViewerApplication.page = PDFViewerApplication.pagesCount; |
| } |
| } |
| |
| function webViewerNextPage() { |
| PDFViewerApplication.page++; |
| } |
| |
| function webViewerPreviousPage() { |
| PDFViewerApplication.page--; |
| } |
| |
| function webViewerZoomIn() { |
| PDFViewerApplication.zoomIn(); |
| } |
| |
| function webViewerZoomOut() { |
| PDFViewerApplication.zoomOut(); |
| } |
| |
| function webViewerZoomReset() { |
| PDFViewerApplication.zoomReset(); |
| } |
| |
| function webViewerPageNumberChanged(evt) { |
| const pdfViewer = PDFViewerApplication.pdfViewer; |
| |
| if (evt.value !== "") { |
| pdfViewer.currentPageLabel = evt.value; |
| } |
| |
| if (evt.value !== pdfViewer.currentPageNumber.toString() && evt.value !== pdfViewer.currentPageLabel) { |
| PDFViewerApplication.toolbar.setPageNumber(pdfViewer.currentPageNumber, pdfViewer.currentPageLabel); |
| } |
| } |
| |
| function webViewerScaleChanged(evt) { |
| PDFViewerApplication.pdfViewer.currentScaleValue = evt.value; |
| } |
| |
| function webViewerRotateCw() { |
| PDFViewerApplication.rotatePages(90); |
| } |
| |
| function webViewerRotateCcw() { |
| PDFViewerApplication.rotatePages(-90); |
| } |
| |
| function webViewerOptionalContentConfig(evt) { |
| PDFViewerApplication.pdfViewer.optionalContentConfigPromise = evt.promise; |
| } |
| |
| function webViewerSwitchScrollMode(evt) { |
| PDFViewerApplication.pdfViewer.scrollMode = evt.mode; |
| } |
| |
| function webViewerSwitchSpreadMode(evt) { |
| PDFViewerApplication.pdfViewer.spreadMode = evt.mode; |
| } |
| |
| function webViewerDocumentProperties() { |
| PDFViewerApplication.pdfDocumentProperties.open(); |
| } |
| |
| function webViewerFind(evt) { |
| PDFViewerApplication.findController.executeCommand("find" + evt.type, { |
| query: evt.query, |
| phraseSearch: evt.phraseSearch, |
| caseSensitive: evt.caseSensitive, |
| entireWord: evt.entireWord, |
| highlightAll: evt.highlightAll, |
| findPrevious: evt.findPrevious |
| }); |
| } |
| |
| function webViewerFindFromUrlHash(evt) { |
| PDFViewerApplication.findController.executeCommand("find", { |
| query: evt.query, |
| phraseSearch: evt.phraseSearch, |
| caseSensitive: false, |
| entireWord: false, |
| highlightAll: true, |
| findPrevious: false |
| }); |
| } |
| |
| function webViewerUpdateFindMatchesCount({ |
| matchesCount |
| }) { |
| if (PDFViewerApplication.supportsIntegratedFind) { |
| PDFViewerApplication.externalServices.updateFindMatchesCount(matchesCount); |
| } else { |
| PDFViewerApplication.findBar.updateResultsCount(matchesCount); |
| } |
| } |
| |
| function webViewerUpdateFindControlState({ |
| state, |
| previous, |
| matchesCount, |
| rawQuery |
| }) { |
| if (PDFViewerApplication.supportsIntegratedFind) { |
| PDFViewerApplication.externalServices.updateFindControlState({ |
| result: state, |
| findPrevious: previous, |
| matchesCount, |
| rawQuery |
| }); |
| } else { |
| PDFViewerApplication.findBar.updateUIState(state, previous, matchesCount); |
| } |
| } |
| |
| function webViewerScaleChanging(evt) { |
| PDFViewerApplication.toolbar.setPageScale(evt.presetValue, evt.scale); |
| PDFViewerApplication.pdfViewer.update(); |
| } |
| |
| function webViewerRotationChanging(evt) { |
| PDFViewerApplication.pdfThumbnailViewer.pagesRotation = evt.pagesRotation; |
| PDFViewerApplication.forceRendering(); |
| PDFViewerApplication.pdfViewer.currentPageNumber = evt.pageNumber; |
| } |
| |
| function webViewerPageChanging(evt) { |
| const page = evt.pageNumber; |
| PDFViewerApplication.toolbar.setPageNumber(page, evt.pageLabel || null); |
| PDFViewerApplication.secondaryToolbar.setPageNumber(page); |
| |
| if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) { |
| PDFViewerApplication.pdfThumbnailViewer.scrollThumbnailIntoView(page); |
| } |
| |
| if (typeof Stats !== "undefined" && Stats.enabled) { |
| const pageView = PDFViewerApplication.pdfViewer.getPageView(page - 1); |
| |
| if (pageView && pageView.stats) { |
| Stats.add(page, pageView.stats); |
| } |
| } |
| } |
| |
| function webViewerVisibilityChange(evt) { |
| if (document.visibilityState === "visible") { |
| setZoomDisabledTimeout(); |
| } |
| } |
| |
| let zoomDisabledTimeout = null; |
| |
| function setZoomDisabledTimeout() { |
| if (zoomDisabledTimeout) { |
| clearTimeout(zoomDisabledTimeout); |
| } |
| |
| zoomDisabledTimeout = setTimeout(function () { |
| zoomDisabledTimeout = null; |
| }, WHEEL_ZOOM_DISABLED_TIMEOUT); |
| } |
| |
| function webViewerWheel(evt) { |
| const { |
| pdfViewer, |
| supportedMouseWheelZoomModifierKeys |
| } = PDFViewerApplication; |
| |
| if (pdfViewer.isInPresentationMode) { |
| return; |
| } |
| |
| if (evt.ctrlKey && supportedMouseWheelZoomModifierKeys.ctrlKey || evt.metaKey && supportedMouseWheelZoomModifierKeys.metaKey) { |
| evt.preventDefault(); |
| |
| if (zoomDisabledTimeout || document.visibilityState === "hidden") { |
| return; |
| } |
| |
| const previousScale = pdfViewer.currentScale; |
| const delta = (0, _ui_utils.normalizeWheelEventDirection)(evt); |
| let ticks = 0; |
| |
| if (evt.deltaMode === WheelEvent.DOM_DELTA_LINE || evt.deltaMode === WheelEvent.DOM_DELTA_PAGE) { |
| if (Math.abs(delta) >= 1) { |
| ticks = Math.sign(delta); |
| } else { |
| ticks = PDFViewerApplication.accumulateWheelTicks(delta); |
| } |
| } else { |
| const PIXELS_PER_LINE_SCALE = 30; |
| ticks = PDFViewerApplication.accumulateWheelTicks(delta / PIXELS_PER_LINE_SCALE); |
| } |
| |
| if (ticks < 0) { |
| PDFViewerApplication.zoomOut(-ticks); |
| } else if (ticks > 0) { |
| PDFViewerApplication.zoomIn(ticks); |
| } |
| |
| const currentScale = pdfViewer.currentScale; |
| |
| if (previousScale !== currentScale) { |
| const scaleCorrectionFactor = currentScale / previousScale - 1; |
| const rect = pdfViewer.container.getBoundingClientRect(); |
| const dx = evt.clientX - rect.left; |
| const dy = evt.clientY - rect.top; |
| pdfViewer.container.scrollLeft += dx * scaleCorrectionFactor; |
| pdfViewer.container.scrollTop += dy * scaleCorrectionFactor; |
| } |
| } else { |
| setZoomDisabledTimeout(); |
| } |
| } |
| |
| function webViewerTouchStart(evt) { |
| if (evt.touches.length > 1) { |
| evt.preventDefault(); |
| } |
| } |
| |
| function webViewerClick(evt) { |
| if (PDFViewerApplication.triggerDelayedFallback && PDFViewerApplication.pdfViewer.containsElement(evt.target)) { |
| PDFViewerApplication.triggerDelayedFallback(); |
| } |
| |
| if (!PDFViewerApplication.secondaryToolbar.isOpen) { |
| return; |
| } |
| |
| const appConfig = PDFViewerApplication.appConfig; |
| |
| if (PDFViewerApplication.pdfViewer.containsElement(evt.target) || appConfig.toolbar.container.contains(evt.target) && evt.target !== appConfig.secondaryToolbar.toggleButton) { |
| PDFViewerApplication.secondaryToolbar.close(); |
| } |
| } |
| |
| function webViewerKeyUp(evt) { |
| if (evt.keyCode === 9) { |
| if (PDFViewerApplication.triggerDelayedFallback) { |
| PDFViewerApplication.triggerDelayedFallback(); |
| } |
| } |
| } |
| |
| function webViewerKeyDown(evt) { |
| if (PDFViewerApplication.overlayManager.active) { |
| return; |
| } |
| |
| let handled = false, |
| ensureViewerFocused = false; |
| const cmd = (evt.ctrlKey ? 1 : 0) | (evt.altKey ? 2 : 0) | (evt.shiftKey ? 4 : 0) | (evt.metaKey ? 8 : 0); |
| const pdfViewer = PDFViewerApplication.pdfViewer; |
| const isViewerInPresentationMode = pdfViewer && pdfViewer.isInPresentationMode; |
| |
| if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) { |
| switch (evt.keyCode) { |
| case 70: |
| if (!PDFViewerApplication.supportsIntegratedFind) { |
| PDFViewerApplication.findBar.open(); |
| handled = true; |
| } |
| |
| break; |
| |
| case 71: |
| if (!PDFViewerApplication.supportsIntegratedFind) { |
| const findState = PDFViewerApplication.findController.state; |
| |
| if (findState) { |
| PDFViewerApplication.findController.executeCommand("findagain", { |
| query: findState.query, |
| phraseSearch: findState.phraseSearch, |
| caseSensitive: findState.caseSensitive, |
| entireWord: findState.entireWord, |
| highlightAll: findState.highlightAll, |
| findPrevious: cmd === 5 || cmd === 12 |
| }); |
| } |
| |
| handled = true; |
| } |
| |
| break; |
| |
| case 61: |
| case 107: |
| case 187: |
| case 171: |
| if (!isViewerInPresentationMode) { |
| PDFViewerApplication.zoomIn(); |
| } |
| |
| handled = true; |
| break; |
| |
| case 173: |
| case 109: |
| case 189: |
| if (!isViewerInPresentationMode) { |
| PDFViewerApplication.zoomOut(); |
| } |
| |
| handled = true; |
| break; |
| |
| case 48: |
| case 96: |
| if (!isViewerInPresentationMode) { |
| setTimeout(function () { |
| PDFViewerApplication.zoomReset(); |
| }); |
| handled = false; |
| } |
| |
| break; |
| |
| case 38: |
| if (isViewerInPresentationMode || PDFViewerApplication.page > 1) { |
| PDFViewerApplication.page = 1; |
| handled = true; |
| ensureViewerFocused = true; |
| } |
| |
| break; |
| |
| case 40: |
| if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) { |
| PDFViewerApplication.page = PDFViewerApplication.pagesCount; |
| handled = true; |
| ensureViewerFocused = true; |
| } |
| |
| break; |
| } |
| } |
| |
| const { |
| eventBus |
| } = PDFViewerApplication; |
| |
| if (cmd === 1 || cmd === 8) { |
| switch (evt.keyCode) { |
| case 83: |
| eventBus.dispatch("download", { |
| source: window |
| }); |
| handled = true; |
| break; |
| |
| case 79: |
| { |
| eventBus.dispatch("openfile", { |
| source: window |
| }); |
| handled = true; |
| } |
| break; |
| } |
| } |
| |
| if (cmd === 3 || cmd === 10) { |
| switch (evt.keyCode) { |
| case 80: |
| PDFViewerApplication.requestPresentationMode(); |
| handled = true; |
| break; |
| |
| case 71: |
| PDFViewerApplication.appConfig.toolbar.pageNumber.select(); |
| handled = true; |
| break; |
| } |
| } |
| |
| if (handled) { |
| if (ensureViewerFocused && !isViewerInPresentationMode) { |
| pdfViewer.focus(); |
| } |
| |
| evt.preventDefault(); |
| return; |
| } |
| |
| const curElement = document.activeElement || document.querySelector(":focus"); |
| const curElementTagName = curElement && curElement.tagName.toUpperCase(); |
| |
| if (curElementTagName === "INPUT" || curElementTagName === "TEXTAREA" || curElementTagName === "SELECT" || curElement && curElement.isContentEditable) { |
| if (evt.keyCode !== 27) { |
| return; |
| } |
| } |
| |
| if (cmd === 0) { |
| let turnPage = 0, |
| turnOnlyIfPageFit = false; |
| |
| switch (evt.keyCode) { |
| case 38: |
| case 33: |
| if (pdfViewer.isVerticalScrollbarEnabled) { |
| turnOnlyIfPageFit = true; |
| } |
| |
| turnPage = -1; |
| break; |
| |
| case 8: |
| if (!isViewerInPresentationMode) { |
| turnOnlyIfPageFit = true; |
| } |
| |
| turnPage = -1; |
| break; |
| |
| case 37: |
| if (pdfViewer.isHorizontalScrollbarEnabled) { |
| turnOnlyIfPageFit = true; |
| } |
| |
| case 75: |
| case 80: |
| turnPage = -1; |
| break; |
| |
| case 27: |
| if (PDFViewerApplication.secondaryToolbar.isOpen) { |
| PDFViewerApplication.secondaryToolbar.close(); |
| handled = true; |
| } |
| |
| if (!PDFViewerApplication.supportsIntegratedFind && PDFViewerApplication.findBar.opened) { |
| PDFViewerApplication.findBar.close(); |
| handled = true; |
| } |
| |
| break; |
| |
| case 40: |
| case 34: |
| if (pdfViewer.isVerticalScrollbarEnabled) { |
| turnOnlyIfPageFit = true; |
| } |
| |
| turnPage = 1; |
| break; |
| |
| case 13: |
| case 32: |
| if (!isViewerInPresentationMode) { |
| turnOnlyIfPageFit = true; |
| } |
| |
| turnPage = 1; |
| break; |
| |
| case 39: |
| if (pdfViewer.isHorizontalScrollbarEnabled) { |
| turnOnlyIfPageFit = true; |
| } |
| |
| case 74: |
| case 78: |
| turnPage = 1; |
| break; |
| |
| case 36: |
| if (isViewerInPresentationMode || PDFViewerApplication.page > 1) { |
| PDFViewerApplication.page = 1; |
| handled = true; |
| ensureViewerFocused = true; |
| } |
| |
| break; |
| |
| case 35: |
| if (isViewerInPresentationMode || PDFViewerApplication.page < PDFViewerApplication.pagesCount) { |
| PDFViewerApplication.page = PDFViewerApplication.pagesCount; |
| handled = true; |
| ensureViewerFocused = true; |
| } |
| |
| break; |
| |
| case 83: |
| PDFViewerApplication.pdfCursorTools.switchTool(_pdf_cursor_tools.CursorTool.SELECT); |
| break; |
| |
| case 72: |
| PDFViewerApplication.pdfCursorTools.switchTool(_pdf_cursor_tools.CursorTool.HAND); |
| break; |
| |
| case 82: |
| PDFViewerApplication.rotatePages(90); |
| break; |
| |
| case 115: |
| PDFViewerApplication.pdfSidebar.toggle(); |
| break; |
| } |
| |
| if (turnPage !== 0 && (!turnOnlyIfPageFit || pdfViewer.currentScaleValue === "page-fit")) { |
| if (turnPage > 0) { |
| if (PDFViewerApplication.page < PDFViewerApplication.pagesCount) { |
| PDFViewerApplication.page++; |
| } |
| } else { |
| if (PDFViewerApplication.page > 1) { |
| PDFViewerApplication.page--; |
| } |
| } |
| |
| handled = true; |
| } |
| } |
| |
| if (cmd === 4) { |
| switch (evt.keyCode) { |
| case 13: |
| case 32: |
| if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== "page-fit") { |
| break; |
| } |
| |
| if (PDFViewerApplication.page > 1) { |
| PDFViewerApplication.page--; |
| } |
| |
| handled = true; |
| break; |
| |
| case 82: |
| PDFViewerApplication.rotatePages(-90); |
| break; |
| } |
| } |
| |
| if (!handled && !isViewerInPresentationMode) { |
| if (evt.keyCode >= 33 && evt.keyCode <= 40 || evt.keyCode === 32 && curElementTagName !== "BUTTON") { |
| ensureViewerFocused = true; |
| } |
| } |
| |
| if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) { |
| pdfViewer.focus(); |
| } |
| |
| if (handled) { |
| evt.preventDefault(); |
| } |
| } |
| |
| function beforeUnload(evt) { |
| evt.preventDefault(); |
| evt.returnValue = ""; |
| return false; |
| } |
| |
| function apiPageLayoutToSpreadMode(layout) { |
| switch (layout) { |
| case "SinglePage": |
| case "OneColumn": |
| return _ui_utils.SpreadMode.NONE; |
| |
| case "TwoColumnLeft": |
| case "TwoPageLeft": |
| return _ui_utils.SpreadMode.ODD; |
| |
| case "TwoColumnRight": |
| case "TwoPageRight": |
| return _ui_utils.SpreadMode.EVEN; |
| } |
| |
| return _ui_utils.SpreadMode.NONE; |
| } |
| |
| function apiPageModeToSidebarView(mode) { |
| switch (mode) { |
| case "UseNone": |
| return _pdf_sidebar.SidebarView.NONE; |
| |
| case "UseThumbs": |
| return _pdf_sidebar.SidebarView.THUMBS; |
| |
| case "UseOutlines": |
| return _pdf_sidebar.SidebarView.OUTLINE; |
| |
| case "UseAttachments": |
| return _pdf_sidebar.SidebarView.ATTACHMENTS; |
| |
| case "UseOC": |
| return _pdf_sidebar.SidebarView.LAYERS; |
| } |
| |
| return _pdf_sidebar.SidebarView.NONE; |
| } |
| |
| const PDFPrintServiceFactory = { |
| instance: { |
| supportsPrinting: false, |
| |
| createPrintService() { |
| throw new Error("Not implemented: createPrintService"); |
| } |
| |
| } |
| }; |
| exports.PDFPrintServiceFactory = PDFPrintServiceFactory; |