|  | @@ -1839,6 +1839,11 @@ exports.PDFFindController = PDFFindController;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  var parseQueryString = uiUtils.parseQueryString;
 |  |  var parseQueryString = uiUtils.parseQueryString;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +var PageNumberRegExp = /^\d+$/;
 | 
											
												
													
														|  | 
 |  | +function isPageNumber(str) {
 | 
											
												
													
														|  | 
 |  | +  return PageNumberRegExp.test(str);
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  /**
 |  |  /**
 | 
											
												
													
														|  |   * @typedef {Object} PDFLinkServiceOptions
 |  |   * @typedef {Object} PDFLinkServiceOptions
 | 
											
												
													
														|  |   * @property {EventBus} eventBus - The application event bus.
 |  |   * @property {EventBus} eventBus - The application event bus.
 | 
											
										
											
												
													
														|  | @@ -1850,7 +1855,7 @@ var parseQueryString = uiUtils.parseQueryString;
 | 
											
												
													
														|  |   * @class
 |  |   * @class
 | 
											
												
													
														|  |   * @implements {IPDFLinkService}
 |  |   * @implements {IPDFLinkService}
 | 
											
												
													
														|  |   */
 |  |   */
 | 
											
												
													
														|  | -var PDFLinkService = (function () {
 |  | 
 | 
											
												
													
														|  | 
 |  | +var PDFLinkService = (function PDFLinkServiceClosure() {
 | 
											
												
													
														|  |    /**
 |  |    /**
 | 
											
												
													
														|  |     * @constructs PDFLinkService
 |  |     * @constructs PDFLinkService
 | 
											
												
													
														|  |     * @param {PDFLinkServiceOptions} options
 |  |     * @param {PDFLinkServiceOptions} options
 | 
											
										
											
												
													
														|  | @@ -1910,7 +1915,7 @@ var PDFLinkService = (function () {
 | 
											
												
													
														|  |        var self = this;
 |  |        var self = this;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |        var goToDestination = function(destRef) {
 |  |        var goToDestination = function(destRef) {
 | 
											
												
													
														|  | -        // dest array looks like that: <page-ref> </XYZ|FitXXX> <args..>
 |  | 
 | 
											
												
													
														|  | 
 |  | +        // dest array looks like that: <page-ref> </XYZ|/FitXXX> <args..>
 | 
											
												
													
														|  |          var pageNumber = destRef instanceof Object ?
 |  |          var pageNumber = destRef instanceof Object ?
 | 
											
												
													
														|  |            self._pagesRefCache[destRef.num + ' ' + destRef.gen + ' R'] :
 |  |            self._pagesRefCache[destRef.num + ' ' + destRef.gen + ' R'] :
 | 
											
												
													
														|  |            (destRef + 1);
 |  |            (destRef + 1);
 | 
											
										
											
												
													
														|  | @@ -1960,30 +1965,15 @@ var PDFLinkService = (function () {
 | 
											
												
													
														|  |       */
 |  |       */
 | 
											
												
													
														|  |      getDestinationHash: function PDFLinkService_getDestinationHash(dest) {
 |  |      getDestinationHash: function PDFLinkService_getDestinationHash(dest) {
 | 
											
												
													
														|  |        if (typeof dest === 'string') {
 |  |        if (typeof dest === 'string') {
 | 
											
												
													
														|  | -        return this.getAnchorUrl('#' + escape(dest));
 |  | 
 | 
											
												
													
														|  | 
 |  | +        // In practice, a named destination may contain only a number.
 | 
											
												
													
														|  | 
 |  | +        // If that happens, use the '#nameddest=' form to avoid the link
 | 
											
												
													
														|  | 
 |  | +        // redirecting to a page, instead of the correct destination.
 | 
											
												
													
														|  | 
 |  | +        return this.getAnchorUrl(
 | 
											
												
													
														|  | 
 |  | +          '#' + (isPageNumber(dest) ? 'nameddest=' : '') + escape(dest));
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  |        if (dest instanceof Array) {
 |  |        if (dest instanceof Array) {
 | 
											
												
													
														|  | -        var destRef = dest[0]; // see navigateTo method for dest format
 |  | 
 | 
											
												
													
														|  | -        var pageNumber = destRef instanceof Object ?
 |  | 
 | 
											
												
													
														|  | -          this._pagesRefCache[destRef.num + ' ' + destRef.gen + ' R'] :
 |  | 
 | 
											
												
													
														|  | -          (destRef + 1);
 |  | 
 | 
											
												
													
														|  | -        if (pageNumber) {
 |  | 
 | 
											
												
													
														|  | -          var pdfOpenParams = this.getAnchorUrl('#page=' + pageNumber);
 |  | 
 | 
											
												
													
														|  | -          var destKind = dest[1];
 |  | 
 | 
											
												
													
														|  | -          if (typeof destKind === 'object' && 'name' in destKind &&
 |  | 
 | 
											
												
													
														|  | -              destKind.name === 'XYZ') {
 |  | 
 | 
											
												
													
														|  | -            var scale = (dest[4] || this.pdfViewer.currentScaleValue);
 |  | 
 | 
											
												
													
														|  | -            var scaleNumber = parseFloat(scale);
 |  | 
 | 
											
												
													
														|  | -            if (scaleNumber) {
 |  | 
 | 
											
												
													
														|  | -              scale = scaleNumber * 100;
 |  | 
 | 
											
												
													
														|  | -            }
 |  | 
 | 
											
												
													
														|  | -            pdfOpenParams += '&zoom=' + scale;
 |  | 
 | 
											
												
													
														|  | -            if (dest[2] || dest[3]) {
 |  | 
 | 
											
												
													
														|  | -              pdfOpenParams += ',' + (dest[2] || 0) + ',' + (dest[3] || 0);
 |  | 
 | 
											
												
													
														|  | -            }
 |  | 
 | 
											
												
													
														|  | -          }
 |  | 
 | 
											
												
													
														|  | -          return pdfOpenParams;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +        var str = JSON.stringify(dest);
 | 
											
												
													
														|  | 
 |  | +        return this.getAnchorUrl('#' + escape(str));
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  |        return this.getAnchorUrl('');
 |  |        return this.getAnchorUrl('');
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
										
											
												
													
														|  | @@ -2002,6 +1992,7 @@ var PDFLinkService = (function () {
 | 
											
												
													
														|  |       * @param {string} hash
 |  |       * @param {string} hash
 | 
											
												
													
														|  |       */
 |  |       */
 | 
											
												
													
														|  |      setHash: function PDFLinkService_setHash(hash) {
 |  |      setHash: function PDFLinkService_setHash(hash) {
 | 
											
												
													
														|  | 
 |  | +      var pageNumber, dest;
 | 
											
												
													
														|  |        if (hash.indexOf('=') >= 0) {
 |  |        if (hash.indexOf('=') >= 0) {
 | 
											
												
													
														|  |          var params = parseQueryString(hash);
 |  |          var params = parseQueryString(hash);
 | 
											
												
													
														|  |          if ('search' in params) {
 |  |          if ('search' in params) {
 | 
											
										
											
												
													
														|  | @@ -2019,7 +2010,6 @@ var PDFLinkService = (function () {
 | 
											
												
													
														|  |            this.navigateTo(params.nameddest);
 |  |            this.navigateTo(params.nameddest);
 | 
											
												
													
														|  |            return;
 |  |            return;
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  | -        var pageNumber, dest;
 |  | 
 | 
											
												
													
														|  |          if ('page' in params) {
 |  |          if ('page' in params) {
 | 
											
												
													
														|  |            pageNumber = (params.page | 0) || 1;
 |  |            pageNumber = (params.page | 0) || 1;
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
										
											
												
													
														|  | @@ -2069,13 +2059,23 @@ var PDFLinkService = (function () {
 | 
											
												
													
														|  |              mode: params.pagemode
 |  |              mode: params.pagemode
 | 
											
												
													
														|  |            });
 |  |            });
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  | -      } else if (/^\d+$/.test(hash)) { // page number
 |  | 
 | 
											
												
													
														|  | -        this.page = hash;
 |  | 
 | 
											
												
													
														|  | -      } else { // named destination
 |  | 
 | 
											
												
													
														|  | -        if (this.pdfHistory) {
 |  | 
 | 
											
												
													
														|  | -          this.pdfHistory.updateNextHashParam(unescape(hash));
 |  | 
 | 
											
												
													
														|  | 
 |  | +      } else if (isPageNumber(hash)) { // Page number.
 | 
											
												
													
														|  | 
 |  | +        this.page = hash | 0;
 | 
											
												
													
														|  | 
 |  | +      } else { // Named (or explicit) destination.
 | 
											
												
													
														|  | 
 |  | +        dest = unescape(hash);
 | 
											
												
													
														|  | 
 |  | +        try {
 | 
											
												
													
														|  | 
 |  | +          dest = JSON.parse(dest);
 | 
											
												
													
														|  | 
 |  | +        } catch (ex) {}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +        if (typeof dest === 'string' || isValidExplicitDestination(dest)) {
 | 
											
												
													
														|  | 
 |  | +          if (this.pdfHistory) {
 | 
											
												
													
														|  | 
 |  | +            this.pdfHistory.updateNextHashParam(dest);
 | 
											
												
													
														|  | 
 |  | +          }
 | 
											
												
													
														|  | 
 |  | +          this.navigateTo(dest);
 | 
											
												
													
														|  | 
 |  | +          return;
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  | -        this.navigateTo(unescape(hash));
 |  | 
 | 
											
												
													
														|  | 
 |  | +        console.error('PDFLinkService_setHash: \'' + unescape(hash) +
 | 
											
												
													
														|  | 
 |  | +                      '\' is not a valid destination.');
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  |      },
 |  |      },
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -2133,6 +2133,60 @@ var PDFLinkService = (function () {
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |    };
 |  |    };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +  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 === 'object' &&
 | 
											
												
													
														|  | 
 |  | +          typeof page.num === 'number' && (page.num | 0) === page.num &&
 | 
											
												
													
														|  | 
 |  | +          typeof page.gen === 'number' && (page.gen | 0) === page.gen) &&
 | 
											
												
													
														|  | 
 |  | +        !(typeof page === 'number' && (page | 0) === page && page >= 0)) {
 | 
											
												
													
														|  | 
 |  | +      return false;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    var zoom = dest[1];
 | 
											
												
													
														|  | 
 |  | +    if (!(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;
 | 
											
												
													
														|  | 
 |  | +  }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |    return PDFLinkService;
 |  |    return PDFLinkService;
 | 
											
												
													
														|  |  })();
 |  |  })();
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -3794,6 +3848,8 @@ var PDFViewer = (function pdfViewer() {
 | 
											
												
													
														|  |            scale = Math.min(Math.abs(widthScale), Math.abs(heightScale));
 |  |            scale = Math.min(Math.abs(widthScale), Math.abs(heightScale));
 | 
											
												
													
														|  |            break;
 |  |            break;
 | 
											
												
													
														|  |          default:
 |  |          default:
 | 
											
												
													
														|  | 
 |  | +          console.error('PDFViewer_scrollPageIntoView: \'' + dest[1].name +
 | 
											
												
													
														|  | 
 |  | +                        '\' is not a valid destination type.');
 | 
											
												
													
														|  |            return;
 |  |            return;
 | 
											
												
													
														|  |        }
 |  |        }
 | 
											
												
													
														|  |  
 |  |  
 |