| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 NavigatorDelegate for calling browser-specific functions to | 8 * Creates a new NavigatorDelegate for calling browser-specific functions to |
| 9 * do the actual navigating. | 9 * do the actual navigating. |
| 10 * @param {boolean} isInTab Indicates if the PDF viewer is displayed in a tab. | 10 * @param {boolean} isInTab Indicates if the PDF viewer is displayed in a tab. |
| 11 * @param {boolean} isSourceFileUrl Indicates if the navigation source is a | |
| 12 * file:// URL. | |
| 13 */ | 11 */ |
| 14 function NavigatorDelegate(isInTab, isSourceFileUrl) { | 12 function NavigatorDelegate(isInTab) { |
| 15 this.isInTab_ = isInTab; | 13 this.isInTab_ = isInTab; |
| 16 this.isSourceFileUrl_ = isSourceFileUrl; | |
| 17 } | 14 } |
| 18 | 15 |
| 19 /** | 16 /** |
| 20 * Creates a new Navigator for navigating to links inside or outside the PDF. | 17 * Creates a new Navigator for navigating to links inside or outside the PDF. |
| 21 * @param {string} originalUrl The original page URL. | 18 * @param {string} originalUrl The original page URL. |
| 22 * @param {Object} viewport The viewport info of the page. | 19 * @param {Object} viewport The viewport info of the page. |
| 23 * @param {Object} paramsParser The object for URL parsing. | 20 * @param {Object} paramsParser The object for URL parsing. |
| 24 * @param {Object} navigatorDelegate The object with callback functions that | 21 * @param {Object} navigatorDelegate The object with callback functions that |
| 25 * get called when navigation happens in the current tab, a new tab, | 22 * get called when navigation happens in the current tab, a new tab, |
| 26 * and a new window. | 23 * and a new window. |
| 27 */ | 24 */ |
| 28 function Navigator(originalUrl, viewport, paramsParser, navigatorDelegate) { | 25 function Navigator(originalUrl, viewport, paramsParser, navigatorDelegate) { |
| 29 this.originalUrl_ = originalUrl; | 26 this.originalUrl_ = originalUrl; |
| 30 this.viewport_ = viewport; | 27 this.viewport_ = viewport; |
| 31 this.paramsParser_ = paramsParser; | 28 this.paramsParser_ = paramsParser; |
| 32 this.navigatorDelegate_ = navigatorDelegate; | 29 this.navigatorDelegate_ = navigatorDelegate; |
| 33 } | 30 } |
| 34 | 31 |
| 35 NavigatorDelegate.prototype = { | 32 NavigatorDelegate.prototype = { |
| 36 /** | 33 /** |
| 37 * @public | 34 * @public |
| 38 * Called when navigation should happen in the current tab. | 35 * Called when navigation should happen in the current tab. |
| 39 * @param {string} url The url to be opened in the current tab. | 36 * @param {string} url The url to be opened in the current tab. |
| 40 */ | 37 */ |
| 41 navigateInCurrentTab: function(url) { | 38 navigateInCurrentTab: function(url) { |
| 42 // When the PDFviewer is inside a browser tab, prefer the tabs API because | 39 // When the PDFviewer is inside a browser tab, prefer the tabs API because |
| 43 // it can navigate from one file:// URL to another. | 40 // it can navigate from one file:// URL to another. |
| 44 if (chrome.tabs && this.isInTab_ && this.isSourceFileUrl_) | 41 if (chrome.tabs && this.isInTab_) |
| 45 chrome.tabs.update({url: url}); | 42 chrome.tabs.update({url: url}); |
| 46 else | 43 else |
| 47 window.location.href = url; | 44 window.location.href = url; |
| 48 }, | 45 }, |
| 49 | 46 |
| 50 /** | 47 /** |
| 51 * @public | 48 * @public |
| 52 * Called when navigation should happen in the new tab. | 49 * Called when navigation should happen in the new tab. |
| 53 * @param {string} url The url to be opened in the new tab. | 50 * @param {string} url The url to be opened in the new tab. |
| 54 * @param {boolean} active Indicates if the new tab should be the active tab. | 51 * @param {boolean} active Indicates if the new tab should be the active tab. |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 | 164 |
| 168 var pageNumber = viewportPosition.page; | 165 var pageNumber = viewportPosition.page; |
| 169 if (pageNumber != undefined && originalUrl == newUrl) | 166 if (pageNumber != undefined && originalUrl == newUrl) |
| 170 this.viewport_.goToPage(pageNumber); | 167 this.viewport_.goToPage(pageNumber); |
| 171 else | 168 else |
| 172 this.navigatorDelegate_.navigateInCurrentTab(viewportPosition.url); | 169 this.navigatorDelegate_.navigateInCurrentTab(viewportPosition.url); |
| 173 }, | 170 }, |
| 174 | 171 |
| 175 /** | 172 /** |
| 176 * @private | 173 * @private |
| 177 * Checks if the URL starts with a scheme and s not just a scheme. | 174 * Checks if the URL starts with a scheme and is not just a scheme. |
| 178 * @param {string} The input URL | 175 * @param {string} The input URL |
| 179 * @return {boolean} Whether the url is valid. | 176 * @return {boolean} Whether the url is valid. |
| 180 */ | 177 */ |
| 181 isValidUrl_: function(url) { | 178 isValidUrl_: function(url) { |
| 182 // Make sure |url| starts with a valid scheme. | 179 // Make sure |url| starts with a valid scheme. |
| 183 if (!url.startsWith('http://') && | 180 if (!url.startsWith('http://') && |
| 184 !url.startsWith('https://') && | 181 !url.startsWith('https://') && |
| 185 !url.startsWith('ftp://') && | 182 !url.startsWith('ftp://') && |
| 186 !url.startsWith('file://') && | 183 !url.startsWith('file://') && |
| 187 !url.startsWith('mailto:')) { | 184 !url.startsWith('mailto:')) { |
| 188 return false; | 185 return false; |
| 189 } | 186 } |
| 190 | 187 |
| 188 // Navigations to file:-URLs are only allowed from file:-URLs. |
| 189 if (url.startsWith('file:') && !this.originalUrl_.startsWith('file:')) |
| 190 return false; |
| 191 |
| 192 |
| 191 // Make sure |url| is not only a scheme. | 193 // Make sure |url| is not only a scheme. |
| 192 if (url == 'http://' || | 194 if (url == 'http://' || |
| 193 url == 'https://' || | 195 url == 'https://' || |
| 194 url == 'ftp://' || | 196 url == 'ftp://' || |
| 195 url == 'file://' || | 197 url == 'file://' || |
| 196 url == 'mailto:') { | 198 url == 'mailto:') { |
| 197 return false; | 199 return false; |
| 198 } | 200 } |
| 199 | 201 |
| 200 return true; | 202 return true; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 if (isRelative) { | 252 if (isRelative) { |
| 251 var slashIndex = this.originalUrl_.lastIndexOf('/'); | 253 var slashIndex = this.originalUrl_.lastIndexOf('/'); |
| 252 var path = slashIndex != -1 ? | 254 var path = slashIndex != -1 ? |
| 253 this.originalUrl_.substr(0, slashIndex) : this.originalUrl_; | 255 this.originalUrl_.substr(0, slashIndex) : this.originalUrl_; |
| 254 return path + '/' + url; | 256 return path + '/' + url; |
| 255 } | 257 } |
| 256 | 258 |
| 257 return 'http://' + url; | 259 return 'http://' + url; |
| 258 } | 260 } |
| 259 }; | 261 }; |
| OLD | NEW |