From bfcc8af6edcd40933f5e996279a7c9519201e19c Mon Sep 17 00:00:00 2001 From: Rob Wu Date: Fri, 11 Apr 2014 17:28:35 +0200 Subject: [PATCH] Move logic from viewer.js to chromecom.js and also default to '' instead of DEFAULT_URL to avoid trying to load a non-existent file when no file has been specified. --- web/chromecom.js | 113 ++++++++++++++++++++++++++++++++++++----------- web/viewer.js | 59 ++----------------------- 2 files changed, 92 insertions(+), 80 deletions(-) diff --git a/web/chromecom.js b/web/chromecom.js index 655e96b4c..f1739860b 100644 --- a/web/chromecom.js +++ b/web/chromecom.js @@ -14,35 +14,98 @@ * limitations under the License. */ -/* globals chrome */ +/* globals chrome, PDFJS, PDFView */ 'use strict'; var ChromeCom = (function ChromeComClosure() { - return { - /** - * Creates an event that the extension is listening for and will - * asynchronously respond by calling the callback. - * @param {String} action The action to trigger. - * @param {String} data Optional data to send. - * @param {Function} callback Optional response callback that will be called - * with one data argument. When the request cannot be handled, the callback - * is immediately invoked with no arguments. - */ - request: function(action, data, callback) { - var message = { - action: action, - data: data - }; - if (!chrome.runtime) { - console.error('chrome.runtime is undefined.'); - if (callback) { - callback(); - } - } else if (callback) { - chrome.runtime.sendMessage(message, callback); - } else { - chrome.runtime.sendMessage(message); + var ChromeCom = {}; + /** + * Creates an event that the extension is listening for and will + * asynchronously respond by calling the callback. + * + * @param {String} action The action to trigger. + * @param {String} data Optional data to send. + * @param {Function} callback Optional response callback that will be called + * with one data argument. When the request cannot be handled, the callback + * is immediately invoked with no arguments. + */ + ChromeCom.request = function ChromeCom_request(action, data, callback) { + var message = { + action: action, + data: data + }; + if (!chrome.runtime) { + console.error('chrome.runtime is undefined.'); + if (callback) { + callback(); } + } else if (callback) { + chrome.runtime.sendMessage(message, callback); + } else { + chrome.runtime.sendMessage(message); } }; + + /** + * Opens a PDF file with the PDF viewer. + * + * @param {String} file Absolute URL of PDF file. + */ + ChromeCom.openPDFFile = function ChromeCom_openPDFFile(file) { + // Expand drive:-URLs to filesystem URLs (Chrome OS) + file = file.replace(/^drive:/i, + 'filesystem:' + location.origin + '/external/'); + + ChromeCom.request('getPDFStream', file, function(response) { + if (response) { + // We will only get a response when the streamsPrivate API is available. + + var isFTPFile = /^ftp:/i.test(file); + var streamUrl = response.streamUrl; + if (streamUrl) { + console.log('Found data stream for ' + file); + PDFView.open(streamUrl, 0, undefined, undefined, { + length: response.contentLength + }); + PDFView.setTitleUsingUrl(file); + return; + } + if (isFTPFile && !response.extensionSupportsFTP) { + // Stream not found, and it's loaded from FTP. + // When the browser does not support loading ftp resources over + // XMLHttpRequest, just reload the page. + // NOTE: This will not lead to an infinite redirect loop, because + // if the file exists, then the streamsPrivate API will capture the + // stream and send back the response. If the stream does not exist, + // a "Webpage not available" error will be shown (not the PDF Viewer). + location.replace(file); + return; + } + } + if (/^filesystem:/.test(file) && !PDFJS.disableWorker) { + // The security origin of filesystem:-URLs are not preserved when the + // URL is passed to a Web worker, (http://crbug.com/362061), so we have + // to create an intermediate blob:-URL as a work-around. + var resolveLocalFileSystemURL = window.resolveLocalFileSystemURL || + window.webkitResolveLocalFileSystemURL; + resolveLocalFileSystemURL(file, function onResolvedFSURL(fileEntry) { + fileEntry.file(function(fileObject) { + var blobUrl = URL.createObjectURL(fileObject); + PDFView.open(blobUrl, 0, undefined, undefined, { + length: fileObject.size + }); + }); + }, function onFileSystemError(error) { + // This should not happen. When it happens, just fall back to the + // usual way of getting the File's data (via the Web worker). + console.warn('Cannot resolve file ' + file + ', ' + error.name + ' ' + + error.message); + PDFView.open(file, 0); + }); + return; + } + PDFView.open(file, 0); + }); + }; + return ChromeCom; })(); diff --git a/web/viewer.js b/web/viewer.js index 2355c4015..8cc94cd62 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -1660,7 +1660,7 @@ var DocumentOutlineView = function documentOutlineView(outline) { // // Run this code outside DOMContentLoaded to make sure that the URL // // is rewritten as soon as possible. // var params = PDFView.parseQueryString(document.location.search.slice(1)); -// DEFAULT_URL = params.file || DEFAULT_URL; +// DEFAULT_URL = params.file || ''; // // // Example: chrome-extension://.../http://example.com/file.pdf // var humanReadableUrl = '/' + DEFAULT_URL + location.hash; @@ -1685,9 +1685,6 @@ function webViewerInitialized() { //#endif //#if CHROME //var file = DEFAULT_URL; -//// XHR cannot get data from drive:-URLs, so expand to filesystem: (Chrome OS) -//file = file.replace(/^drive:/i, -// 'filesystem:' + location.origin + '/external/'); //#endif //#if !(FIREFOX || MOZCENTRAL || CHROME || B2G) @@ -1913,58 +1910,10 @@ function webViewerInitialized() { PDFView.open(file, 0); } //#endif - //#if CHROME -//ChromeCom.request('getPDFStream', file, function(response) { -// if (response) { -// // We will only get a response when the streamsPrivate API is available. -// -// var isFTPFile = /^ftp:/i.test(file); -// var streamUrl = response.streamUrl; -// if (streamUrl) { -// console.log('Found data stream for ' + file); -// PDFView.open(streamUrl, 0, undefined, undefined, { -// length: response.contentLength -// }); -// PDFView.setTitleUsingUrl(file); -// return; -// } -// if (isFTPFile && !response.extensionSupportsFTP) { -// // Stream not found, and it's loaded from FTP. -// // When the browser does not support loading ftp resources over -// // XMLHttpRequest, just reload the page. -// // NOTE: This will not lead to an infinite redirect loop, because -// // if the file exists, then the streamsPrivate API will capture the -// // stream and send back the response. If the stream does not exist, then -// // a "Webpage not available" error will be shown (not the PDF Viewer). -// location.replace(file); -// return; -// } -// } -// if (/^filesystem:/.test(file) && !PDFJS.disableWorker) { -// // The security origin of filesystem:-URLs are not preserved when the URL -// // is passed to a Web worker, (http://crbug.com/362061), so we have to -// // create an intermediate blob:-URL as a work-around. -// var resolveLocalFileSystemURL = window.resolveLocalFileSystemURL || -// window.webkitResolveLocalFileSystemURL; -// resolveLocalFileSystemURL(file, function onFileSystemSuccess(fileEntry) { -// fileEntry.file(function(fileObject) { -// var blobUrl = URL.createObjectURL(fileObject); -// PDFView.open(blobUrl, 0, undefined, undefined, { -// length: fileObject.size -// }); -// }); -// }, function onFileSystemError(error) { -// // This should not happen. When it happens, just fall back to the normal -// // way of getting the File's data (via the Web worker). -// console.warn('Cannot resolve file ' + file + ', ' + error.name + ' ' + -// error.message); -// PDFView.open(file, 0); -// }); -// return; -// } -// PDFView.open(file, 0); -//}); +//if (file) { +// ChromeCom.openPDFFile(file); +//} //#endif }