diff --git a/web/app.js b/web/app.js index 50ae47585..18ec38c64 100644 --- a/web/app.js +++ b/web/app.js @@ -451,7 +451,7 @@ var PDFViewerApplication = { return this.externalServices.supportedMouseWheelZoomModifierKeys; }, -//#if (FIREFOX || MOZCENTRAL) +//#if (FIREFOX || MOZCENTRAL || CHROME) initPassiveLoading: function pdfViewInitPassiveLoading() { this.externalServices.initPassiveLoading({ onOpenWithTransport: function (url, length, transport) { @@ -464,6 +464,16 @@ var PDFViewerApplication = { onOpenWithData: function (data) { PDFViewerApplication.open(data); }, + onOpenWithURL: function (url, length, originalURL) { + var file = url, args = null; + if (length !== undefined) { + args = {length: length}; + } + if (originalURL !== undefined) { + file = {file: url, originalURL: originalURL}; + } + PDFViewerApplication.open(file, args); + }, onError: function (e) { PDFViewerApplication.error(mozL10n.get('loading_error', null, 'An error occurred while loading the PDF.'), e); @@ -1445,7 +1455,7 @@ function webViewerInitialized() { appConfig.toolbar.download.addEventListener('click', SecondaryToolbar.downloadClick.bind(SecondaryToolbar)); -//#if (FIREFOX || MOZCENTRAL) +//#if (FIREFOX || MOZCENTRAL || CHROME) //PDFViewerApplication.setTitleUsingUrl(file); //PDFViewerApplication.initPassiveLoading(); //return; @@ -1476,11 +1486,6 @@ function webViewerInitialized() { PDFViewerApplication.open(file); } //#endif -//#if CHROME -//if (file) { -// ChromeCom.openPDFFile(file); -//} -//#endif } document.addEventListener('pagerendered', function (e) { @@ -2141,6 +2146,7 @@ window.addEventListener('afterprint', function afterPrint(evt) { })(); exports.PDFViewerApplication = PDFViewerApplication; +exports.DefaultExernalServices = DefaultExernalServices; // TODO remove circular reference of pdfjs-web/secondary_toolbar on app. secondaryToolbarLib._setApp(exports); diff --git a/web/chromecom.js b/web/chromecom.js index 1d6734c52..a31343585 100644 --- a/web/chromecom.js +++ b/web/chromecom.js @@ -13,27 +13,28 @@ * limitations under the License. */ -/* globals chrome */ +/* globals chrome, DEFAULT_PREFERENCES, DEFAULT_URL */ 'use strict'; (function (root, factory) { if (typeof define === 'function' && define.amd) { define('pdfjs-web/chromecom', ['exports', 'pdfjs-web/app', - 'pdfjs-web/overlay_manager', 'pdfjs-web/pdfjs'], factory); + 'pdfjs-web/overlay_manager', 'pdfjs-web/preferences', 'pdfjs-web/pdfjs'], + factory); } else if (typeof exports !== 'undefined') { factory(exports, require('./app.js'), require('./overlay_manager.js'), - require('./pdfjs.js')); + require('./preferences.js'), require('./pdfjs.js')); } else { factory((root.pdfjsWebChromeCom = {}), root.pdfjsWebApp, - root.pdfjsWebOverlayManager, root.pdfjsWebPDFJS); + root.pdfjsWebOverlayManager, root.pdfjsWebPreferences, + root.pdfjsWebPDFJS); } -}(this, function (exports, app, overlayManager, pdfjsLib) { +}(this, function (exports, app, overlayManager, preferences, pdfjsLib) { //#if CHROME -//#if !CHROME - if (true) { return; } // TODO ensure nothing depends on this module. -//#endif var PDFViewerApplication = app.PDFViewerApplication; + var DefaultExernalServices = app.DefaultExernalServices; var OverlayManager = overlayManager.OverlayManager; + var Preferences = preferences.Preferences; var ChromeCom = {}; /** @@ -64,11 +65,12 @@ }; /** - * Opens a PDF file with the PDF viewer. + * Resolves a PDF file path and attempts to detects length. * * @param {String} file Absolute URL of PDF file. + * @param {Function} callback A callback with resolved URL and file length. */ - ChromeCom.openPDFFile = function ChromeCom_openPDFFile(file) { + ChromeCom.resolvePDFFile = function ChromeCom_resolvePDFFile(file, callback) { // Expand drive:-URLs to filesystem URLs (Chrome OS) file = file.replace(/^drive:/i, 'filesystem:' + location.origin + '/external/'); @@ -81,10 +83,7 @@ var streamUrl = response.streamUrl; if (streamUrl) { console.log('Found data stream for ' + file); - PDFViewerApplication.open(streamUrl, { - length: response.contentLength - }); - PDFViewerApplication.setTitleUsingUrl(file); + callback(streamUrl, response.contentLength, file); return; } if (isFTPFile && !response.extensionSupportsFTP) { @@ -108,16 +107,14 @@ resolveLocalFileSystemURL(file, function onResolvedFSURL(fileEntry) { fileEntry.file(function(fileObject) { var blobUrl = URL.createObjectURL(fileObject); - PDFViewerApplication.open(blobUrl, { - length: fileObject.size - }); + callback(blobUrl, 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); - PDFViewerApplication.open(file); + callback(file); }); return; } @@ -126,7 +123,7 @@ // There is no UI to input a different URL, so this assumption will hold // for now. setReferer(file, function() { - PDFViewerApplication.open(file); + callback(file); }); return; } @@ -145,7 +142,7 @@ } isAllowedFileSchemeAccess(function(isAllowedAccess) { if (isAllowedAccess) { - PDFViewerApplication.open(file); + callback(file); } else { requestAccessToLocalFile(file); } @@ -153,7 +150,7 @@ }); return; } - PDFViewerApplication.open(file); + callback(file); }); }; @@ -324,6 +321,55 @@ } } + Preferences._writeToStorage = function (prefObj) { + return new Promise(function (resolve) { + if (prefObj === DEFAULT_PREFERENCES) { + var keysToRemove = Object.keys(DEFAULT_PREFERENCES); + // If the storage is reset, remove the keys so that the values from + // managed storage are applied again. + chrome.storage.local.remove(keysToRemove, function() { + resolve(); + }); + } else { + chrome.storage.local.set(prefObj, function() { + resolve(); + }); + } + }); + }; + + Preferences._readFromStorage = function (prefObj) { + return new Promise(function (resolve) { + if (chrome.storage.managed) { + // Get preferences as set by the system administrator. + // See extensions/chromium/preferences_schema.json for more information. + // These preferences can be overridden by the user. + chrome.storage.managed.get(DEFAULT_PREFERENCES, getPreferences); + } else { + // Managed storage not supported, e.g. in old Chromium versions. + getPreferences(DEFAULT_PREFERENCES); + } + + function getPreferences(defaultPrefs) { + if (chrome.runtime.lastError) { + // Managed storage not supported, e.g. in Opera. + defaultPrefs = DEFAULT_PREFERENCES; + } + chrome.storage.local.get(defaultPrefs, function(readPrefs) { + resolve(readPrefs); + }); + } + }); + }; + + var ChromeExternalServices = Object.create(DefaultExernalServices); + ChromeExternalServices.initPassiveLoading = function (callbacks) { + ChromeCom.resolvePDFFile(DEFAULT_URL, function (url, length, originalURL) { + callbacks.onOpenWithURL(url, length, originalURL); + }); + }; + PDFViewerApplication.externalServices = ChromeExternalServices; + exports.ChromeCom = ChromeCom; //#endif })); diff --git a/web/preferences.js b/web/preferences.js index e3c28f39a..ec43653f3 100644 --- a/web/preferences.js +++ b/web/preferences.js @@ -161,49 +161,6 @@ var Preferences = { } }; -//#if CHROME -//Preferences._writeToStorage = function (prefObj) { -// return new Promise(function (resolve) { -// if (prefObj == DEFAULT_PREFERENCES) { -// var keysToRemove = Object.keys(DEFAULT_PREFERENCES); -// // If the storage is reset, remove the keys so that the values from -// // managed storage are applied again. -// chrome.storage.local.remove(keysToRemove, function() { -// resolve(); -// }); -// } else { -// chrome.storage.local.set(prefObj, function() { -// resolve(); -// }); -// } -// }); -//}; -// -//Preferences._readFromStorage = function (prefObj) { -// return new Promise(function (resolve) { -// if (chrome.storage.managed) { -// // Get preferences as set by the system administrator. -// // See extensions/chromium/preferences_schema.json for more information. -// // These preferences can be overridden by the user. -// chrome.storage.managed.get(DEFAULT_PREFERENCES, getPreferences); -// } else { -// // Managed storage not supported, e.g. in old Chromium versions. -// getPreferences(DEFAULT_PREFERENCES); -// } -// -// function getPreferences(defaultPrefs) { -// if (chrome.runtime.lastError) { -// // Managed storage not supported, e.g. in Opera. -// defaultPrefs = DEFAULT_PREFERENCES; -// } -// chrome.storage.local.get(defaultPrefs, function(readPrefs) { -// resolve(readPrefs); -// }); -// } -// }); -//}; -//#endif - //#if !(FIREFOX || MOZCENTRAL || CHROME) Preferences._writeToStorage = function (prefObj) { return new Promise(function (resolve) {