Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / chrome / browser / resources / pdf / open_pdf_params_parser.js
blobddd18be4164d846383de82610efae8653dc1155e
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 'use strict';
7 /**
8  * Creates a new OpenPDFParamsParser. This parses the open pdf parameters
9  * passed in the url to set initial viewport settings for opening the pdf.
10  * @param {Object} getNamedDestinationsFunction The function called to fetch
11  *     the page number for a named destination.
12  */
13 function OpenPDFParamsParser(getNamedDestinationsFunction) {
14   this.outstandingRequests_ = [];
15   this.getNamedDestinationsFunction_ = getNamedDestinationsFunction;
18 OpenPDFParamsParser.prototype = {
19   /**
20    * @private
21    * Parse zoom parameter of open PDF parameters. If this
22    * parameter is passed while opening PDF then PDF should be opened
23    * at the specified zoom level.
24    * @param {number} zoom value.
25    * @param {Object} viewportPosition to store zoom and position value.
26    */
27   parseZoomParam_: function(paramValue, viewportPosition) {
28     var paramValueSplit = paramValue.split(',');
29     if ((paramValueSplit.length != 1) && (paramValueSplit.length != 3))
30       return;
32     // User scale of 100 means zoom value of 100% i.e. zoom factor of 1.0.
33     var zoomFactor = parseFloat(paramValueSplit[0]) / 100;
34     if (isNaN(zoomFactor))
35       return;
37     // Handle #zoom=scale.
38     if (paramValueSplit.length == 1) {
39       viewportPosition['zoom'] = zoomFactor;
40       return;
41     }
43     // Handle #zoom=scale,left,top.
44     var position = {x: parseFloat(paramValueSplit[1]),
45                     y: parseFloat(paramValueSplit[2])};
46     viewportPosition['position'] = position;
47     viewportPosition['zoom'] = zoomFactor;
48   },
50   /**
51    * @private
52    * Parse PDF url parameters. These parameters are mentioned in the url
53    * and specify actions to be performed when opening pdf files.
54    * See http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/
55    * pdfs/pdf_open_parameters.pdf for details.
56    * @param {string} url that needs to be parsed.
57    * @param {Function} callback function to be called with viewport info.
58    */
59   getViewportFromUrlParams: function(url, callback) {
60     var viewportPosition = {};
61     viewportPosition['url'] = url;
62     var paramIndex = url.search('#');
63     if (paramIndex == -1) {
64       callback(viewportPosition);
65       return;
66     }
68     var paramTokens = url.substring(paramIndex + 1).split('&');
69     if ((paramTokens.length == 1) && (paramTokens[0].search('=') == -1)) {
70       // Handle the case of http://foo.com/bar#NAMEDDEST. This is not
71       // explicitly mentioned except by example in the Adobe
72       // "PDF Open Parameters" document.
73       this.outstandingRequests_.push({
74         callback: callback,
75         viewportPosition: viewportPosition
76       });
77       this.getNamedDestinationsFunction_(paramTokens[0]);
78       return;
79     }
81     var paramsDictionary = {};
82     for (var i = 0; i < paramTokens.length; ++i) {
83       var keyValueSplit = paramTokens[i].split('=');
84       if (keyValueSplit.length != 2)
85         continue;
86       paramsDictionary[keyValueSplit[0]] = keyValueSplit[1];
87     }
89     if ('page' in paramsDictionary) {
90       // |pageNumber| is 1-based, but goToPage() take a zero-based page number.
91       var pageNumber = parseInt(paramsDictionary['page']);
92       if (!isNaN(pageNumber) && pageNumber > 0)
93         viewportPosition['page'] = pageNumber - 1;
94     }
96     if ('zoom' in paramsDictionary)
97       this.parseZoomParam_(paramsDictionary['zoom'], viewportPosition);
99     if (viewportPosition.page === undefined &&
100         'nameddest' in paramsDictionary) {
101       this.outstandingRequests_.push({
102         callback: callback,
103         viewportPosition: viewportPosition
104       });
105       this.getNamedDestinationsFunction_(paramsDictionary['nameddest']);
106     } else {
107       callback(viewportPosition);
108     }
109   },
111   /**
112    * This is called when a named destination is received and the page number
113    * corresponding to the request for which a named destination is passed.
114    * @param {number} pageNumber The page corresponding to the named destination
115    *    requested.
116    */
117   onNamedDestinationReceived: function(pageNumber) {
118     var outstandingRequest = this.outstandingRequests_.shift();
119     if (pageNumber != -1)
120       outstandingRequest.viewportPosition.page = pageNumber;
121     outstandingRequest.callback(outstandingRequest.viewportPosition);
122   },