/** * @licstart The following is the entire license notice for the * Javascript code in this page * * Copyright 2017 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.SimpleLinkService = exports.PDFLinkService = undefined; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _dom_events = require('./dom_events'); var _ui_utils = require('./ui_utils'); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var PDFLinkService = function () { function PDFLinkService() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, eventBus = _ref.eventBus; _classCallCheck(this, PDFLinkService); this.eventBus = eventBus || (0, _dom_events.getGlobalEventBus)(); this.baseUrl = null; this.pdfDocument = null; this.pdfViewer = null; this.pdfHistory = null; this._pagesRefCache = null; } _createClass(PDFLinkService, [{ key: 'setDocument', value: function setDocument(pdfDocument, baseUrl) { this.baseUrl = baseUrl; this.pdfDocument = pdfDocument; this._pagesRefCache = Object.create(null); } }, { key: 'setViewer', value: function setViewer(pdfViewer) { this.pdfViewer = pdfViewer; } }, { key: 'setHistory', value: function setHistory(pdfHistory) { this.pdfHistory = pdfHistory; } }, { key: 'navigateTo', value: function navigateTo(dest) { var _this = this; var goToDestination = function goToDestination(_ref2) { var namedDest = _ref2.namedDest, explicitDest = _ref2.explicitDest; var destRef = explicitDest[0], pageNumber = void 0; if (destRef instanceof Object) { pageNumber = _this._cachedPageNumber(destRef); if (pageNumber === null) { _this.pdfDocument.getPageIndex(destRef).then(function (pageIndex) { _this.cachePageRef(pageIndex + 1, destRef); goToDestination({ namedDest: namedDest, explicitDest: explicitDest }); }).catch(function () { console.error('PDFLinkService.navigateTo: "' + destRef + '" is not ' + ('a valid page reference, for dest="' + dest + '".')); }); return; } } else if (Number.isInteger(destRef)) { pageNumber = destRef + 1; } else { console.error('PDFLinkService.navigateTo: "' + destRef + '" is not ' + ('a valid destination reference, for dest="' + dest + '".')); return; } if (!pageNumber || pageNumber < 1 || pageNumber > _this.pagesCount) { console.error('PDFLinkService.navigateTo: "' + pageNumber + '" is not ' + ('a valid page number, for dest="' + dest + '".')); return; } if (_this.pdfHistory) { _this.pdfHistory.pushCurrentPosition(); _this.pdfHistory.push({ namedDest: namedDest, explicitDest: explicitDest, pageNumber: pageNumber }); } _this.pdfViewer.scrollPageIntoView({ pageNumber: pageNumber, destArray: explicitDest }); }; new Promise(function (resolve, reject) { if (typeof dest === 'string') { _this.pdfDocument.getDestination(dest).then(function (destArray) { resolve({ namedDest: dest, explicitDest: destArray }); }); return; } resolve({ namedDest: '', explicitDest: dest }); }).then(function (data) { if (!(data.explicitDest instanceof Array)) { console.error('PDFLinkService.navigateTo: "' + data.explicitDest + '" is' + (' not a valid destination array, for dest="' + dest + '".')); return; } goToDestination(data); }); } }, { key: 'getDestinationHash', value: function getDestinationHash(dest) { if (typeof dest === 'string') { return this.getAnchorUrl('#' + escape(dest)); } if (dest instanceof Array) { var str = JSON.stringify(dest); return this.getAnchorUrl('#' + escape(str)); } return this.getAnchorUrl(''); } }, { key: 'getAnchorUrl', value: function getAnchorUrl(anchor) { return (this.baseUrl || '') + anchor; } }, { key: 'setHash', value: function setHash(hash) { var pageNumber = void 0, dest = void 0; if (hash.indexOf('=') >= 0) { var params = (0, _ui_utils.parseQueryString)(hash); if ('search' in params) { this.eventBus.dispatch('findfromurlhash', { source: this, query: params['search'].replace(/"/g, ''), phraseSearch: params['phrase'] === 'true' }); } if ('nameddest' in params) { this.navigateTo(params.nameddest); return; } if ('page' in params) { pageNumber = params.page | 0 || 1; } if ('zoom' in params) { var zoomArgs = params.zoom.split(','); var zoomArg = zoomArgs[0]; var zoomArgNumber = parseFloat(zoomArg); if (zoomArg.indexOf('Fit') === -1) { dest = [null, { name: 'XYZ' }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null, zoomArgs.length > 2 ? zoomArgs[2] | 0 : null, zoomArgNumber ? zoomArgNumber / 100 : zoomArg]; } else { if (zoomArg === 'Fit' || zoomArg === 'FitB') { dest = [null, { name: zoomArg }]; } else if (zoomArg === 'FitH' || zoomArg === 'FitBH' || zoomArg === 'FitV' || zoomArg === 'FitBV') { dest = [null, { name: zoomArg }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null]; } else if (zoomArg === 'FitR') { if (zoomArgs.length !== 5) { console.error('PDFLinkService.setHash: Not enough parameters for "FitR".'); } else { dest = [null, { name: zoomArg }, zoomArgs[1] | 0, zoomArgs[2] | 0, zoomArgs[3] | 0, zoomArgs[4] | 0]; } } else { console.error('PDFLinkService.setHash: "' + zoomArg + '" is not ' + 'a valid zoom value.'); } } } if (dest) { this.pdfViewer.scrollPageIntoView({ pageNumber: pageNumber || this.page, destArray: dest, allowNegativeOffset: true }); } else if (pageNumber) { this.page = pageNumber; } if ('pagemode' in params) { this.eventBus.dispatch('pagemode', { source: this, mode: params.pagemode }); } } else { dest = unescape(hash); try { dest = JSON.parse(dest); if (!(dest instanceof Array)) { dest = dest.toString(); } } catch (ex) {} if (typeof dest === 'string' || isValidExplicitDestination(dest)) { this.navigateTo(dest); return; } console.error('PDFLinkService.setHash: "' + unescape(hash) + '" is not ' + 'a valid destination.'); } } }, { key: 'executeNamedAction', value: function executeNamedAction(action) { switch (action) { case 'GoBack': if (this.pdfHistory) { this.pdfHistory.back(); } break; case 'GoForward': if (this.pdfHistory) { this.pdfHistory.forward(); } break; case 'NextPage': if (this.page < this.pagesCount) { this.page++; } break; case 'PrevPage': if (this.page > 1) { this.page--; } break; case 'LastPage': this.page = this.pagesCount; break; case 'FirstPage': this.page = 1; break; default: break; } this.eventBus.dispatch('namedaction', { source: this, action: action }); } }, { key: 'onFileAttachmentAnnotation', value: function onFileAttachmentAnnotation(_ref3) { var id = _ref3.id, filename = _ref3.filename, content = _ref3.content; this.eventBus.dispatch('fileattachmentannotation', { source: this, id: id, filename: filename, content: content }); } }, { key: 'cachePageRef', value: function cachePageRef(pageNum, pageRef) { var refStr = pageRef.num + ' ' + pageRef.gen + ' R'; this._pagesRefCache[refStr] = pageNum; } }, { key: '_cachedPageNumber', value: function _cachedPageNumber(pageRef) { var refStr = pageRef.num + ' ' + pageRef.gen + ' R'; return this._pagesRefCache && this._pagesRefCache[refStr] || null; } }, { key: 'pagesCount', get: function get() { return this.pdfDocument ? this.pdfDocument.numPages : 0; } }, { key: 'page', get: function get() { return this.pdfViewer.currentPageNumber; }, set: function set(value) { this.pdfViewer.currentPageNumber = value; } }, { key: 'rotation', get: function get() { return this.pdfViewer.pagesRotation; }, set: function set(value) { this.pdfViewer.pagesRotation = value; } }]); return PDFLinkService; }(); function isValidExplicitDestination(dest) { if (!(dest instanceof Array)) { return false; } var destLength = dest.length, allowNull = true; if (destLength < 2) { return false; } var page = dest[0]; if (!((typeof page === 'undefined' ? 'undefined' : _typeof(page)) === 'object' && Number.isInteger(page.num) && Number.isInteger(page.gen)) && !(Number.isInteger(page) && page >= 0)) { return false; } var zoom = dest[1]; if (!((typeof zoom === 'undefined' ? 'undefined' : _typeof(zoom)) === 'object' && typeof zoom.name === 'string')) { return false; } switch (zoom.name) { case 'XYZ': if (destLength !== 5) { return false; } break; case 'Fit': case 'FitB': return destLength === 2; case 'FitH': case 'FitBH': case 'FitV': case 'FitBV': if (destLength !== 3) { return false; } break; case 'FitR': if (destLength !== 6) { return false; } allowNull = false; break; default: return false; } for (var i = 2; i < destLength; i++) { var param = dest[i]; if (!(typeof param === 'number' || allowNull && param === null)) { return false; } } return true; } var SimpleLinkService = function () { function SimpleLinkService() { _classCallCheck(this, SimpleLinkService); } _createClass(SimpleLinkService, [{ key: 'navigateTo', value: function navigateTo(dest) {} }, { key: 'getDestinationHash', value: function getDestinationHash(dest) { return '#'; } }, { key: 'getAnchorUrl', value: function getAnchorUrl(hash) { return '#'; } }, { key: 'setHash', value: function setHash(hash) {} }, { key: 'executeNamedAction', value: function executeNamedAction(action) {} }, { key: 'onFileAttachmentAnnotation', value: function onFileAttachmentAnnotation(_ref4) { var id = _ref4.id, filename = _ref4.filename, content = _ref4.content; } }, { key: 'cachePageRef', value: function cachePageRef(pageNum, pageRef) {} }, { key: 'page', get: function get() { return 0; }, set: function set(value) {} }, { key: 'rotation', get: function get() { return 0; }, set: function set(value) {} }]); return SimpleLinkService; }(); exports.PDFLinkService = PDFLinkService; exports.SimpleLinkService = SimpleLinkService;