11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci'use strict';
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/**
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Creates a new OpenPDFParamsParser. This parses the open pdf parameters
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * passed in the url to set initial viewport settings for opening the pdf.
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param {string} url to be parsed.
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifunction OpenPDFParamsParser(url) {
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  this.url_ = url;
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  this.urlParams = {};
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  this.parseOpenPDFParams_();
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciOpenPDFParamsParser.prototype = {
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /**
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * @private
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * Parse zoom parameter of open PDF parameters. If this
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * parameter is passed while opening PDF then PDF should be opened
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * at the specified zoom level.
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * @param {number} zoom value.
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   */
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  parseZoomParam_: function(paramValue) {
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var paramValueSplit = paramValue.split(',');
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if ((paramValueSplit.length != 1) && (paramValueSplit.length != 3))
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return;
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // User scale of 100 means zoom value of 100% i.e. zoom factor of 1.0.
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var zoomFactor = parseFloat(paramValueSplit[0]) / 100;
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (isNaN(zoomFactor))
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return;
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Handle #zoom=scale.
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (paramValueSplit.length == 1) {
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      this.urlParams['zoom'] = zoomFactor;
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return;
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Handle #zoom=scale,left,top.
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var position = {x: parseFloat(paramValueSplit[1]),
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    y: parseFloat(paramValueSplit[2])};
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    this.urlParams['position'] = position;
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    this.urlParams['zoom'] = zoomFactor;
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  /**
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * @private
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * Parse open PDF parameters. These parameters are mentioned in the url
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * and specify actions to be performed when opening pdf files.
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * See http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   * pdfs/pdf_open_parameters.pdf for details.
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci   */
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  parseOpenPDFParams_: function() {
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var originalUrl = this.url_;
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var paramIndex = originalUrl.search('#');
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (paramIndex == -1)
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return;
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var paramTokens = originalUrl.substring(paramIndex + 1).split('&');
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var paramsDictionary = {};
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (var i = 0; i < paramTokens.length; ++i) {
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      var keyValueSplit = paramTokens[i].split('=');
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (keyValueSplit.length != 2)
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        continue;
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      paramsDictionary[keyValueSplit[0]] = keyValueSplit[1];
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if ('page' in paramsDictionary) {
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // |pageNumber| is 1-based, but goToPage() take a zero-based page number.
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      var pageNumber = parseInt(paramsDictionary['page']);
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!isNaN(pageNumber))
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        this.urlParams['page'] = pageNumber - 1;
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if ('zoom' in paramsDictionary)
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      this.parseZoomParam_(paramsDictionary['zoom']);
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
82