Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(314)

Side by Side Diff: chrome/browser/resources/pdf/open_pdf_params_parser.js

Issue 918953002: Fix for PDFs with lots of named destinations take a long time to load. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressing nit Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 'use strict'; 5 'use strict';
6 6
7 /** 7 /**
8 * Creates a new OpenPDFParamsParser. This parses the open pdf parameters 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. 9 * passed in the url to set initial viewport settings for opening the pdf.
10 * @param {Object} getNamedDestination to fetch page number for
11 * namedDestination.
10 */ 12 */
11 function OpenPDFParamsParser() { 13 function OpenPDFParamsParser(getNamedDestination) {
raymes 2015/02/16 22:44:04 nit: getNamedDestinationsFunction
Deepak 2015/02/17 07:12:12 Done.
12 // A dictionary of all the named destinations in the PDF. 14 // A dictionary of all the named destinations in the PDF for testing.
13 this.namedDestinations = {}; 15 this.namedDestinations = {};
16 this.outstandingRequests_ = [];
17 this.getNamedDestinationFunction_ = getNamedDestination;
raymes 2015/02/16 22:44:04 nit: this.getNamedDestinationsFunction_ = getNamed
Deepak 2015/02/17 07:12:12 Done.
14 } 18 }
15 19
16 OpenPDFParamsParser.prototype = { 20 OpenPDFParamsParser.prototype = {
17 /** 21 /**
18 * @private 22 * @private
19 * Parse zoom parameter of open PDF parameters. If this 23 * Parse zoom parameter of open PDF parameters. If this
20 * parameter is passed while opening PDF then PDF should be opened 24 * parameter is passed while opening PDF then PDF should be opened
21 * at the specified zoom level. 25 * at the specified zoom level.
22 * @param {number} zoom value. 26 * @param {number} zoom value.
23 * @param {Object} viewportPosition to store zoom and position value. 27 * @param {Object} viewportPosition to store zoom and position value.
(...skipping 21 matching lines...) Expand all
45 viewportPosition['zoom'] = zoomFactor; 49 viewportPosition['zoom'] = zoomFactor;
46 }, 50 },
47 51
48 /** 52 /**
49 * @private 53 * @private
50 * Parse PDF url parameters. These parameters are mentioned in the url 54 * Parse PDF url parameters. These parameters are mentioned in the url
51 * and specify actions to be performed when opening pdf files. 55 * and specify actions to be performed when opening pdf files.
52 * See http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/ 56 * See http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/
53 * pdfs/pdf_open_parameters.pdf for details. 57 * pdfs/pdf_open_parameters.pdf for details.
54 * @param {string} url that needs to be parsed. 58 * @param {string} url that needs to be parsed.
55 * @return {Object} A dictionary containing the viewport which should be 59 * @param {Function} callback function to be called with viewport info.
56 * displayed based on the URL.
57 */ 60 */
58 getViewportFromUrlParams: function(url) { 61 getViewportFromUrlParams: function(url, callback) {
59 var viewportPosition = {}; 62 var viewportPosition = {};
60 var paramIndex = url.search('#'); 63 var paramIndex = url.search('#');
61 if (paramIndex == -1) 64 if (paramIndex == -1) {
62 return viewportPosition; 65 callback(viewportPosition);
66 return;
67 }
63 68
64 var paramTokens = url.substring(paramIndex + 1).split('&'); 69 var paramTokens = url.substring(paramIndex + 1).split('&');
65 if ((paramTokens.length == 1) && (paramTokens[0].search('=') == -1)) { 70 if ((paramTokens.length == 1) && (paramTokens[0].search('=') == -1)) {
66 // Handle the case of http://foo.com/bar#NAMEDDEST. This is not 71 // Handle the case of http://foo.com/bar#NAMEDDEST. This is not
67 // explicitlymentioned except by example in the Adobe 72 // explicitlymentioned except by example in the Adobe
68 // "PDF Open Parameters" document. 73 // "PDF Open Parameters" document.
74 // This code will be used in running testcases only.
69 viewportPosition['page'] = this.namedDestinations[paramTokens[0]]; 75 viewportPosition['page'] = this.namedDestinations[paramTokens[0]];
70 return viewportPosition; 76 if (viewportPosition['page'] != undefined) {
77 callback(viewportPosition);
78 return;
79 }
80
81 this.outstandingRequests_.push({
82 callback: callback,
83 viewportPosition: viewportPosition
84 });
85 this.getNamedDestinationFunction_(paramTokens[0]);
86 return;
71 } 87 }
72 88
73 var paramsDictionary = {}; 89 var paramsDictionary = {};
74 for (var i = 0; i < paramTokens.length; ++i) { 90 for (var i = 0; i < paramTokens.length; ++i) {
75 var keyValueSplit = paramTokens[i].split('='); 91 var keyValueSplit = paramTokens[i].split('=');
76 if (keyValueSplit.length != 2) 92 if (keyValueSplit.length != 2)
77 continue; 93 continue;
78 paramsDictionary[keyValueSplit[0]] = keyValueSplit[1]; 94 paramsDictionary[keyValueSplit[0]] = keyValueSplit[1];
79 } 95 }
80 96
81 if ('nameddest' in paramsDictionary) {
82 var page = this.namedDestinations[paramsDictionary['nameddest']];
83 if (page != undefined)
84 viewportPosition['page'] = page;
85 }
86
87 if ('page' in paramsDictionary) { 97 if ('page' in paramsDictionary) {
88 // |pageNumber| is 1-based, but goToPage() take a zero-based page number. 98 // |pageNumber| is 1-based, but goToPage() take a zero-based page number.
89 var pageNumber = parseInt(paramsDictionary['page']); 99 var pageNumber = parseInt(paramsDictionary['page']);
90 if (!isNaN(pageNumber) && pageNumber > 0) 100 if (!isNaN(pageNumber) && pageNumber > 0)
91 viewportPosition['page'] = pageNumber - 1; 101 viewportPosition['page'] = pageNumber - 1;
92 } 102 }
93 103
94 if ('zoom' in paramsDictionary) 104 if ('zoom' in paramsDictionary)
95 this.parseZoomParam_(paramsDictionary['zoom'], viewportPosition); 105 this.parseZoomParam_(paramsDictionary['zoom'], viewportPosition);
96 106
97 return viewportPosition; 107 if ('nameddest' in paramsDictionary) {
98 } 108 // This code will be used in running testcases only.
109 viewportPosition['page'] =
110 this.namedDestinations[paramsDictionary['nameddest']];
111 if (viewportPosition['page'] != undefined) {
112 callback(viewportPosition);
113 return;
114 }
115
116 this.outstandingRequests_.push({
117 callback: callback,
118 viewportPosition: viewportPosition
119 });
120 this.getNamedDestinationFunction_(paramsDictionary['nameddest']);
121 return;
122 }
123 callback(viewportPosition);
124 return;
125 },
126
127 /**
128 * This is called when a named destination is received and the page number
129 * corresponding to the request for which a named destination is passed.
130 * @param {number} pageNumber The page corresponding to the named destination
131 * requested.
132 */
133 onNamedDestinationReceived: function(pageNumber) {
134 var outstandingRequest = this.outstandingRequests_.shift();
135 if (!outstandingRequest)
136 return;
137 if (!outstandingRequest.viewportPosition.page)
138 outstandingRequest.viewportPosition.page = pageNumber;
139 outstandingRequest.callback(outstandingRequest.viewportPosition);
140 },
99 }; 141 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698