Merge pull request #7202 from yurydelendik/firefox-deps

Refactors dependencies of PDFViewerApplication on external services
This commit is contained in:
Yury Delendik 2016-04-24 08:32:17 -05:00
commit 55581b162e
10 changed files with 359 additions and 257 deletions

View File

@ -30,6 +30,7 @@ PDFJS.workerSrc = '../../build/pdf.worker.js';
// PDFJS.cMapPacked = true; // PDFJS.cMapPacked = true;
var DEFAULT_URL = '../../web/compressed.tracemonkey-pldi-09.pdf'; var DEFAULT_URL = '../../web/compressed.tracemonkey-pldi-09.pdf';
var SEARCH_FOR = ''; // try 'Mozilla';
var container = document.getElementById('viewerContainer'); var container = document.getElementById('viewerContainer');
@ -42,9 +43,19 @@ var pdfViewer = new PDFJS.PDFViewer({
}); });
pdfLinkService.setViewer(pdfViewer); pdfLinkService.setViewer(pdfViewer);
// (Optionally) enable find controller.
var pdfFindController = new PDFJS.PDFFindController({
pdfViewer: pdfViewer
});
pdfViewer.setFindController(pdfFindController);
container.addEventListener('pagesinit', function () { container.addEventListener('pagesinit', function () {
// We can use pdfViewer now, e.g. let's change default scale. // We can use pdfViewer now, e.g. let's change default scale.
pdfViewer.currentScaleValue = 'page-width'; pdfViewer.currentScaleValue = 'page-width';
if (SEARCH_FOR) { // We can try search for things
pdfFindController.executeCommand('find', {query: SEARCH_FOR});
}
}); });
// Loading document. // Loading document.

View File

@ -1,14 +1,14 @@
/* globals FirefoxCom */
'use strict'; 'use strict';
// Small subset of the webL10n API by Fabien Cazenave for pdf.js extension. // Small subset of the webL10n API by Fabien Cazenave for pdf.js extension.
(function(window) { (function(window) {
var gLanguage = ''; var gLanguage = '';
var gExternalLocalizerServices = null;
// fetch an l10n objects // fetch an l10n objects
function getL10nData(key) { function getL10nData(key) {
var response = FirefoxCom.requestSync('getStrings', key); var response = gExternalLocalizerServices.getStrings(key);
var data = JSON.parse(response); var data = JSON.parse(response);
if (!data) { if (!data) {
console.warn('[l10n] #' + key + ' missing for [' + gLanguage + ']'); console.warn('[l10n] #' + key + ' missing for [' + gLanguage + ']');
@ -94,8 +94,8 @@
} }
} }
window.addEventListener('DOMContentLoaded', function() { function translateDocument() {
gLanguage = FirefoxCom.requestSync('getLocale', null); gLanguage = gExternalLocalizerServices.getLocale();
translateFragment(); translateFragment();
@ -104,6 +104,13 @@
evtObject.initEvent('localized', false, false); evtObject.initEvent('localized', false, false);
evtObject.language = gLanguage; evtObject.language = gLanguage;
window.dispatchEvent(evtObject); window.dispatchEvent(evtObject);
}
window.addEventListener('DOMContentLoaded', function() {
if (gExternalLocalizerServices) {
translateDocument();
}
// ... else see setExternalLocalizerServices below
}); });
// Public API // Public API
@ -128,6 +135,16 @@
return (rtlList.indexOf(shortCode) >= 0) ? 'rtl' : 'ltr'; return (rtlList.indexOf(shortCode) >= 0) ? 'rtl' : 'ltr';
}, },
setExternalLocalizerServices: function (externalLocalizerServices) {
gExternalLocalizerServices = externalLocalizerServices;
// ... in case if we missed DOMContentLoaded above.
if (window.document.readyState === 'interactive' ||
window.document.readyState === 'complete') {
translateDocument();
}
},
// translate an element or document fragment // translate an element or document fragment
translate: translateFragment translate: translateFragment
}; };

View File

@ -129,7 +129,7 @@ target.generic = function() {
var TMP_VIEWER = GENERIC_DIR + '/web/viewer.js.tmp'; var TMP_VIEWER = GENERIC_DIR + '/web/viewer.js.tmp';
cd('web/'); cd('web/');
var viewerBundleFiles = ['app.js']; var viewerBundleFiles = ['app.js', 'mozPrintCallback_polyfill.js'];
bundle('viewer.js', ROOT_DIR + TMP_VIEWER, viewerBundleFiles, bundle('viewer.js', ROOT_DIR + TMP_VIEWER, viewerBundleFiles,
'pdfjs-dist/web/viewer', defines, true); 'pdfjs-dist/web/viewer', defines, true);
cd(ROOT_DIR); cd(ROOT_DIR);
@ -179,6 +179,7 @@ target.components = function() {
var bundleFiles = [ var bundleFiles = [
'pdf_viewer.js', 'pdf_viewer.js',
'pdf_history.js', 'pdf_history.js',
'pdf_find_controller.js',
'download_manager.js' 'download_manager.js'
]; ];
bundle('pdf_viewer.component.js', ROOT_DIR + TMP_PDF_VIEWER, bundleFiles, bundle('pdf_viewer.component.js', ROOT_DIR + TMP_PDF_VIEWER, bundleFiles,
@ -1131,7 +1132,8 @@ target.chromium = function() {
var TMP_VIEWER = CHROME_BUILD_CONTENT_DIR + '/web/viewer.js.tmp'; var TMP_VIEWER = CHROME_BUILD_CONTENT_DIR + '/web/viewer.js.tmp';
cd('web/'); cd('web/');
var viewerBundleFiles = ['app.js', 'chromecom.js']; var viewerBundleFiles = ['app.js', 'chromecom.js',
'mozPrintCallback_polyfill.js'];
bundle('viewer.js', ROOT_DIR + TMP_VIEWER, viewerBundleFiles, bundle('viewer.js', ROOT_DIR + TMP_VIEWER, viewerBundleFiles,
'pdfjs-dist/web/viewer', defines, true); 'pdfjs-dist/web/viewer', defines, true);
cd(ROOT_DIR); cd(ROOT_DIR);

View File

@ -19,8 +19,8 @@
(function (root, factory) { (function (root, factory) {
if (typeof define === 'function' && define.amd) { if (typeof define === 'function' && define.amd) {
define('pdfjs-web/app', ['exports', 'pdfjs-web/ui_utils', define('pdfjs-web/app', ['exports', 'pdfjs-web/ui_utils',
'pdfjs-web/firefoxcom', 'pdfjs-web/download_manager', 'pdfjs-web/download_manager', 'pdfjs-web/pdf_history',
'pdfjs-web/pdf_history', 'pdfjs-web/preferences', 'pdfjs-web/pdf_sidebar', 'pdfjs-web/preferences', 'pdfjs-web/pdf_sidebar',
'pdfjs-web/view_history', 'pdfjs-web/pdf_thumbnail_viewer', 'pdfjs-web/view_history', 'pdfjs-web/pdf_thumbnail_viewer',
'pdfjs-web/secondary_toolbar', 'pdfjs-web/password_prompt', 'pdfjs-web/secondary_toolbar', 'pdfjs-web/password_prompt',
'pdfjs-web/pdf_presentation_mode', 'pdfjs-web/pdf_document_properties', 'pdfjs-web/pdf_presentation_mode', 'pdfjs-web/pdf_document_properties',
@ -28,46 +28,42 @@
'pdfjs-web/pdf_rendering_queue', 'pdfjs-web/pdf_link_service', 'pdfjs-web/pdf_rendering_queue', 'pdfjs-web/pdf_link_service',
'pdfjs-web/pdf_outline_viewer', 'pdfjs-web/overlay_manager', 'pdfjs-web/pdf_outline_viewer', 'pdfjs-web/overlay_manager',
'pdfjs-web/pdf_attachment_viewer', 'pdfjs-web/pdf_find_controller', 'pdfjs-web/pdf_attachment_viewer', 'pdfjs-web/pdf_find_controller',
'pdfjs-web/pdf_find_bar', 'pdfjs-web/mozPrintCallback_polyfill', 'pdfjs-web/pdf_find_bar', 'pdfjs-web/pdfjs'],
'pdfjs-web/pdfjs'],
factory); factory);
} else if (typeof exports !== 'undefined') { } else if (typeof exports !== 'undefined') {
factory(exports, require('./ui_utils.js'), require('./firefoxcom.js'), factory(exports, require('./ui_utils.js'), require('./download_manager.js'),
require('./download_manager.js'), require('./pdf_history.js'), require('./pdf_history.js'), require('./preferences.js'),
require('./preferences.js'), require('./pdf_sidebar.js'), require('./pdf_sidebar.js'), require('./view_history.js'),
require('./view_history.js'), require('./pdf_thumbnail_viewer.js'), require('./pdf_thumbnail_viewer.js'), require('./secondary_toolbar.js'),
require('./secondary_toolbar.js'), require('./password_prompt.js'), require('./password_prompt.js'), require('./pdf_presentation_mode.js'),
require('./pdf_presentation_mode.js'),
require('./pdf_document_properties.js'), require('./hand_tool.js'), require('./pdf_document_properties.js'), require('./hand_tool.js'),
require('./pdf_viewer.js'), require('./pdf_rendering_queue.js'), require('./pdf_viewer.js'), require('./pdf_rendering_queue.js'),
require('./pdf_link_service.js'), require('./pdf_outline_viewer.js'), require('./pdf_link_service.js'), require('./pdf_outline_viewer.js'),
require('./overlay_manager.js'), require('./pdf_attachment_viewer.js'), require('./overlay_manager.js'), require('./pdf_attachment_viewer.js'),
require('./pdf_find_controller.js'), require('./pdf_find_bar.js'), require('./pdf_find_controller.js'), require('./pdf_find_bar.js'),
require('./mozPrintCallback_polyfill.js'), require('./pdfjs.js')); require('./pdfjs.js'));
} else { } else {
factory((root.pdfjsWebApp = {}), root.pdfjsWebUIUtils, factory((root.pdfjsWebApp = {}), root.pdfjsWebUIUtils,
root.pdfjsWebFirefoxCom, root.pdfjsWebDownloadManager, root.pdfjsWebDownloadManager, root.pdfjsWebPDFHistory,
root.pdfjsWebPDFHistory, root.pdfjsWebPreferences, root.pdfjsWebPreferences, root.pdfjsWebPDFSidebar,
root.pdfjsWebPDFSidebar, root.pdfjsWebViewHistory, root.pdfjsWebViewHistory, root.pdfjsWebPDFThumbnailViewer,
root.pdfjsWebPDFThumbnailViewer, root.pdfjsWebSecondaryToolbar, root.pdfjsWebSecondaryToolbar, root.pdfjsWebPasswordPrompt,
root.pdfjsWebPasswordPrompt, root.pdfjsWebPDFPresentationMode, root.pdfjsWebPDFPresentationMode, root.pdfjsWebPDFDocumentProperties,
root.pdfjsWebPDFDocumentProperties, root.pdfjsWebHandTool, root.pdfjsWebHandTool, root.pdfjsWebPDFViewer,
root.pdfjsWebPDFViewer, root.pdfjsWebPDFRenderingQueue, root.pdfjsWebPDFRenderingQueue, root.pdfjsWebPDFLinkService,
root.pdfjsWebPDFLinkService, root.pdfjsWebPDFOutlineViewer, root.pdfjsWebPDFOutlineViewer, root.pdfjsWebOverlayManager,
root.pdfjsWebOverlayManager, root.pdfjsWebPDFAttachmentViewer, root.pdfjsWebPDFAttachmentViewer, root.pdfjsWebPDFFindController,
root.pdfjsWebPDFFindController, root.pdfjsWebPDFFindBar, root.pdfjsWebPDFFindBar, root.pdfjsWebPDFJS);
root.pdfjsWebMozPrintCallbackPolyfill, root.pdfjsWebPDFJS);
} }
}(this, function (exports, uiUtilsLib, firefoxComLib, downloadManagerLib, }(this, function (exports, uiUtilsLib, downloadManagerLib, pdfHistoryLib,
pdfHistoryLib, preferencesLib, pdfSidebarLib, viewHistoryLib, preferencesLib, pdfSidebarLib, viewHistoryLib,
pdfThumbnailViewerLib, secondaryToolbarLib, passwordPromptLib, pdfThumbnailViewerLib, secondaryToolbarLib, passwordPromptLib,
pdfPresentationModeLib, pdfDocumentPropertiesLib, handToolLib, pdfPresentationModeLib, pdfDocumentPropertiesLib, handToolLib,
pdfViewerLib, pdfRenderingQueueLib, pdfLinkServiceLib, pdfViewerLib, pdfRenderingQueueLib, pdfLinkServiceLib,
pdfOutlineViewerLib, overlayManagerLib, pdfOutlineViewerLib, overlayManagerLib,
pdfAttachmentViewerLib, pdfFindControllerLib, pdfFindBarLib, pdfAttachmentViewerLib, pdfFindControllerLib, pdfFindBarLib,
mozPrintCallbackPolyfillLib, pdfjsLib) { pdfjsLib) {
var FirefoxCom = firefoxComLib.FirefoxCom;
var UNKNOWN_SCALE = uiUtilsLib.UNKNOWN_SCALE; var UNKNOWN_SCALE = uiUtilsLib.UNKNOWN_SCALE;
var DEFAULT_SCALE_VALUE = uiUtilsLib.DEFAULT_SCALE_VALUE; var DEFAULT_SCALE_VALUE = uiUtilsLib.DEFAULT_SCALE_VALUE;
var ProgressBar = uiUtilsLib.ProgressBar; var ProgressBar = uiUtilsLib.ProgressBar;
@ -75,8 +71,6 @@ var getPDFFileNameFromURL = uiUtilsLib.getPDFFileNameFromURL;
var noContextMenuHandler = uiUtilsLib.noContextMenuHandler; var noContextMenuHandler = uiUtilsLib.noContextMenuHandler;
var mozL10n = uiUtilsLib.mozL10n; var mozL10n = uiUtilsLib.mozL10n;
var parseQueryString = uiUtilsLib.parseQueryString; var parseQueryString = uiUtilsLib.parseQueryString;
var DownloadManager = downloadManagerLib.DownloadManager ||
firefoxComLib.DownloadManager;
var PDFHistory = pdfHistoryLib.PDFHistory; var PDFHistory = pdfHistoryLib.PDFHistory;
var Preferences = preferencesLib.Preferences; var Preferences = preferencesLib.Preferences;
var SidebarView = pdfSidebarLib.SidebarView; var SidebarView = pdfSidebarLib.SidebarView;
@ -122,6 +116,23 @@ function configure(PDFJS) {
//#endif //#endif
} }
var DefaultExernalServices = {
updateFindControlState: function (data) {},
initPassiveLoading: function (callbacks) {},
fallback: function (data, callback) {},
reportTelemetry: function (data) {},
createDownloadManager: function () {
return new downloadManagerLib.DownloadManager();
},
supportsIntegratedFind: false,
supportsDocumentFonts: true,
supportsDocumentColors: true,
supportedMouseWheelZoomModifierKeys: {
ctrlKey: true,
metaKey: true,
}
};
var PDFViewerApplication = { var PDFViewerApplication = {
initialBookmark: document.location.hash.substring(1), initialBookmark: document.location.hash.substring(1),
initialDestination: null, initialDestination: null,
@ -153,6 +164,8 @@ var PDFViewerApplication = {
pdfAttachmentViewer: null, pdfAttachmentViewer: null,
/** @type {ViewHistory} */ /** @type {ViewHistory} */
store: null, store: null,
/** @type {DownloadManager} */
downloadManager: null,
pageRotation: 0, pageRotation: 0,
isInitialViewSet: false, isInitialViewSet: false,
animationStartedPromise: null, animationStartedPromise: null,
@ -162,6 +175,7 @@ var PDFViewerApplication = {
preferenceDefaultZoomValue: '', preferenceDefaultZoomValue: '',
isViewerEmbedded: (window.parent !== window), isViewerEmbedded: (window.parent !== window),
url: '', url: '',
externalServices: DefaultExernalServices,
// called once when the document is loaded // called once when the document is loaded
initialize: function pdfViewInitialize(appConfig) { initialize: function pdfViewInitialize(appConfig) {
@ -175,6 +189,9 @@ var PDFViewerApplication = {
var pdfLinkService = new PDFLinkService(); var pdfLinkService = new PDFLinkService();
this.pdfLinkService = pdfLinkService; this.pdfLinkService = pdfLinkService;
var downloadManager = this.externalServices.createDownloadManager();
this.downloadManager = downloadManager;
var container = appConfig.mainContainer; var container = appConfig.mainContainer;
var viewer = appConfig.viewerContainer; var viewer = appConfig.viewerContainer;
this.pdfViewer = new PDFViewer({ this.pdfViewer = new PDFViewer({
@ -182,7 +199,7 @@ var PDFViewerApplication = {
viewer: viewer, viewer: viewer,
renderingQueue: pdfRenderingQueue, renderingQueue: pdfRenderingQueue,
linkService: pdfLinkService, linkService: pdfLinkService,
downloadManager: new DownloadManager() downloadManager: downloadManager
}); });
pdfRenderingQueue.setViewer(this.pdfViewer); pdfRenderingQueue.setViewer(this.pdfViewer);
pdfLinkService.setViewer(this.pdfViewer); pdfLinkService.setViewer(this.pdfViewer);
@ -204,9 +221,24 @@ var PDFViewerApplication = {
pdfLinkService.setHistory(this.pdfHistory); pdfLinkService.setHistory(this.pdfHistory);
this.findController = new PDFFindController({ this.findController = new PDFFindController({
pdfViewer: this.pdfViewer, pdfViewer: this.pdfViewer
integratedFind: this.supportsIntegratedFind
}); });
this.findController.onUpdateResultsCount = function (matchCount) {
if (this.supportsIntegratedFind) {
return;
}
this.findBar.updateResultsCount(matchCount);
}.bind(this);
this.findController.onUpdateState = function (state, previous, matchCount) {
if (this.supportsIntegratedFind) {
this.externalServices.updateFindControlState(
{result: state, findPrevious: previous});
} else {
this.findBar.updateUIState(state, previous, matchCount);
}
}.bind(this);
this.findController.listenWindowEvents();
this.pdfViewer.setFindController(this.findController); this.pdfViewer.setFindController(this.findController);
// FIXME better PDFFindBar constructor parameters // FIXME better PDFFindBar constructor parameters
@ -214,8 +246,6 @@ var PDFViewerApplication = {
findBarConfig.findController = this.findController; findBarConfig.findController = this.findController;
this.findBar = new PDFFindBar(findBarConfig); this.findBar = new PDFFindBar(findBarConfig);
this.findController.setFindBar(this.findBar);
this.overlayManager = OverlayManager; this.overlayManager = OverlayManager;
this.handTool = new HandTool({ this.handTool = new HandTool({
@ -257,7 +287,7 @@ var PDFViewerApplication = {
this.pdfAttachmentViewer = new PDFAttachmentViewer({ this.pdfAttachmentViewer = new PDFAttachmentViewer({
container: appConfig.sidebar.attachmentsView, container: appConfig.sidebar.attachmentsView,
downloadManager: new DownloadManager(), downloadManager: downloadManager
}); });
// FIXME better PDFSidebar constructor parameters // FIXME better PDFSidebar constructor parameters
@ -398,30 +428,15 @@ var PDFViewerApplication = {
}, },
get supportsIntegratedFind() { get supportsIntegratedFind() {
var support = false; return this.externalServices.supportsIntegratedFind;
//#if (FIREFOX || MOZCENTRAL)
// support = FirefoxCom.requestSync('supportsIntegratedFind');
//#endif
return pdfjsLib.shadow(this, 'supportsIntegratedFind', support);
}, },
get supportsDocumentFonts() { get supportsDocumentFonts() {
var support = true; return this.externalServices.supportsDocumentFonts;
//#if (FIREFOX || MOZCENTRAL)
// support = FirefoxCom.requestSync('supportsDocumentFonts');
//#endif
return pdfjsLib.shadow(this, 'supportsDocumentFonts', support);
}, },
get supportsDocumentColors() { get supportsDocumentColors() {
var support = true; return this.externalServices.supportsDocumentColors;
//#if (FIREFOX || MOZCENTRAL)
// support = FirefoxCom.requestSync('supportsDocumentColors');
//#endif
return pdfjsLib.shadow(this, 'supportsDocumentColors', support);
}, },
get loadingBar() { get loadingBar() {
@ -431,84 +446,40 @@ var PDFViewerApplication = {
}, },
get supportedMouseWheelZoomModifierKeys() { get supportedMouseWheelZoomModifierKeys() {
var support = { return this.externalServices.supportedMouseWheelZoomModifierKeys;
ctrlKey: true,
metaKey: true,
};
//#if (FIREFOX || MOZCENTRAL)
// support = FirefoxCom.requestSync('supportedMouseWheelZoomModifierKeys');
//#endif
return pdfjsLib.shadow(this, 'supportedMouseWheelZoomModifierKeys',
support);
}, },
//#if (FIREFOX || MOZCENTRAL) //#if (FIREFOX || MOZCENTRAL || CHROME)
initPassiveLoading: function pdfViewInitPassiveLoading() { initPassiveLoading: function pdfViewInitPassiveLoading() {
function FirefoxComDataRangeTransport(length, initialData) { this.externalServices.initPassiveLoading({
pdfjsLib.PDFDataRangeTransport.call(this, length, initialData); onOpenWithTransport: function (url, length, transport) {
} PDFViewerApplication.open(url, {range: transport});
FirefoxComDataRangeTransport.prototype =
Object.create(pdfjsLib.PDFDataRangeTransport.prototype);
FirefoxComDataRangeTransport.prototype.requestDataRange =
function FirefoxComDataRangeTransport_requestDataRange(begin, end) {
FirefoxCom.request('requestDataRange', { begin: begin, end: end });
};
FirefoxComDataRangeTransport.prototype.abort =
function FirefoxComDataRangeTransport_abort() {
// Sync call to ensure abort is really started.
FirefoxCom.requestSync('abortLoading', null);
};
var pdfDataRangeTransport; if (length) {
PDFViewerApplication.pdfDocumentProperties.setFileSize(length);
window.addEventListener('message', function windowMessage(e) { }
if (e.source !== null) { },
// The message MUST originate from Chrome code. onOpenWithData: function (data) {
console.warn('Rejected untrusted message from ' + e.origin); PDFViewerApplication.open(data);
return; },
} onOpenWithURL: function (url, length, originalURL) {
var args = e.data; var file = url, args = null;
if (length !== undefined) {
if (typeof args !== 'object' || !('pdfjsLoadAction' in args)) { args = {length: length};
return; }
} if (originalURL !== undefined) {
switch (args.pdfjsLoadAction) { file = {file: url, originalURL: originalURL};
case 'supportsRangedLoading': }
pdfDataRangeTransport = PDFViewerApplication.open(file, args);
new FirefoxComDataRangeTransport(args.length, args.data); },
onError: function (e) {
PDFViewerApplication.open(args.pdfUrl, PDFViewerApplication.error(mozL10n.get('loading_error', null,
{range: pdfDataRangeTransport}); 'An error occurred while loading the PDF.'), e);
},
if (args.length) { onProgress: function (loaded, total) {
PDFViewerApplication.pdfDocumentProperties PDFViewerApplication.progress(loaded / total);
.setFileSize(args.length);
}
break;
case 'range':
pdfDataRangeTransport.onDataRange(args.begin, args.chunk);
break;
case 'rangeProgress':
pdfDataRangeTransport.onDataProgress(args.loaded);
break;
case 'progressiveRead':
pdfDataRangeTransport.onDataProgressiveRead(args.chunk);
break;
case 'progress':
PDFViewerApplication.progress(args.loaded / args.total);
break;
case 'complete':
if (!args.data) {
PDFViewerApplication.error(mozL10n.get('loading_error', null,
'An error occurred while loading the PDF.'), e);
break;
}
PDFViewerApplication.open(args.data);
break;
} }
}); });
FirefoxCom.requestSync('initPassiveLoading', null);
}, },
//#endif //#endif
@ -688,7 +659,7 @@ var PDFViewerApplication = {
var url = this.url.split('#')[0]; var url = this.url.split('#')[0];
var filename = getPDFFileNameFromURL(url); var filename = getPDFFileNameFromURL(url);
var downloadManager = new DownloadManager(); var downloadManager = this.downloadManager;
downloadManager.onerror = function (err) { downloadManager.onerror = function (err) {
// This error won't really be helpful because it's likely the // This error won't really be helpful because it's likely the
// fallback won't work either (or is already open). // fallback won't work either (or is already open).
@ -728,7 +699,7 @@ var PDFViewerApplication = {
} }
this.fellback = true; this.fellback = true;
var url = this.url.split('#')[0]; var url = this.url.split('#')[0];
FirefoxCom.request('fallback', { featureId: featureId, url: url }, this.externalServices.fallback({ featureId: featureId, url: url },
function response(download) { function response(download) {
if (!download) { if (!download) {
return; return;
@ -1056,12 +1027,12 @@ var PDFViewerApplication = {
} }
var formType = !info.IsAcroFormPresent ? null : info.IsXFAPresent ? var formType = !info.IsAcroFormPresent ? null : info.IsXFAPresent ?
'xfa' : 'acroform'; 'xfa' : 'acroform';
FirefoxCom.request('reportTelemetry', JSON.stringify({ self.externalServices.reportTelemetry({
type: 'documentInfo', type: 'documentInfo',
version: versionId, version: versionId,
generator: generatorId, generator: generatorId,
formType: formType formType: formType
})); });
//#endif //#endif
}); });
}, },
@ -1184,9 +1155,9 @@ var PDFViewerApplication = {
} }
//#endif //#endif
//#if (FIREFOX || MOZCENTRAL) //#if (FIREFOX || MOZCENTRAL)
FirefoxCom.request('reportTelemetry', JSON.stringify({ this.externalServices.reportTelemetry({
type: 'print' type: 'print'
})); });
//#endif //#endif
}, },
@ -1482,7 +1453,7 @@ function webViewerInitialized() {
appConfig.toolbar.download.addEventListener('click', appConfig.toolbar.download.addEventListener('click',
SecondaryToolbar.downloadClick.bind(SecondaryToolbar)); SecondaryToolbar.downloadClick.bind(SecondaryToolbar));
//#if (FIREFOX || MOZCENTRAL) //#if (FIREFOX || MOZCENTRAL || CHROME)
//PDFViewerApplication.setTitleUsingUrl(file); //PDFViewerApplication.setTitleUsingUrl(file);
//PDFViewerApplication.initPassiveLoading(); //PDFViewerApplication.initPassiveLoading();
//return; //return;
@ -1513,11 +1484,6 @@ function webViewerInitialized() {
PDFViewerApplication.open(file); PDFViewerApplication.open(file);
} }
//#endif //#endif
//#if CHROME
//if (file) {
// ChromeCom.openPDFFile(file);
//}
//#endif
} }
document.addEventListener('pagerendered', function (e) { document.addEventListener('pagerendered', function (e) {
@ -1554,15 +1520,15 @@ document.addEventListener('pagerendered', function (e) {
} }
//#endif //#endif
//#if (FIREFOX || MOZCENTRAL) //#if (FIREFOX || MOZCENTRAL)
FirefoxCom.request('reportTelemetry', JSON.stringify({ PDFViewerApplication.externalServices.reportTelemetry({
type: 'pageInfo' type: 'pageInfo'
})); });
// It is a good time to report stream and font types. // It is a good time to report stream and font types.
PDFViewerApplication.pdfDocument.getStats().then(function (stats) { PDFViewerApplication.pdfDocument.getStats().then(function (stats) {
FirefoxCom.request('reportTelemetry', JSON.stringify({ PDFViewerApplication.externalServices.reportTelemetry({
type: 'documentStats', type: 'documentStats',
stats: stats stats: stats
})); });
}); });
//#endif //#endif
}, true); }, true);
@ -2178,6 +2144,7 @@ window.addEventListener('afterprint', function afterPrint(evt) {
})(); })();
exports.PDFViewerApplication = PDFViewerApplication; exports.PDFViewerApplication = PDFViewerApplication;
exports.DefaultExernalServices = DefaultExernalServices;
// TODO remove circular reference of pdfjs-web/secondary_toolbar on app. // TODO remove circular reference of pdfjs-web/secondary_toolbar on app.
secondaryToolbarLib._setApp(exports); secondaryToolbarLib._setApp(exports);

View File

@ -13,27 +13,28 @@
* limitations under the License. * limitations under the License.
*/ */
/* globals chrome */ /* globals chrome, DEFAULT_PREFERENCES, DEFAULT_URL */
'use strict'; 'use strict';
(function (root, factory) { (function (root, factory) {
if (typeof define === 'function' && define.amd) { if (typeof define === 'function' && define.amd) {
define('pdfjs-web/chromecom', ['exports', 'pdfjs-web/app', 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') { } else if (typeof exports !== 'undefined') {
factory(exports, require('./app.js'), require('./overlay_manager.js'), factory(exports, require('./app.js'), require('./overlay_manager.js'),
require('./pdfjs.js')); require('./preferences.js'), require('./pdfjs.js'));
} else { } else {
factory((root.pdfjsWebChromeCom = {}), root.pdfjsWebApp, 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 !CHROME
if (true) { return; } // TODO ensure nothing depends on this module.
//#endif
var PDFViewerApplication = app.PDFViewerApplication; var PDFViewerApplication = app.PDFViewerApplication;
var DefaultExernalServices = app.DefaultExernalServices;
var OverlayManager = overlayManager.OverlayManager; var OverlayManager = overlayManager.OverlayManager;
var Preferences = preferences.Preferences;
var ChromeCom = {}; 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 {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) // Expand drive:-URLs to filesystem URLs (Chrome OS)
file = file.replace(/^drive:/i, file = file.replace(/^drive:/i,
'filesystem:' + location.origin + '/external/'); 'filesystem:' + location.origin + '/external/');
@ -81,10 +83,7 @@
var streamUrl = response.streamUrl; var streamUrl = response.streamUrl;
if (streamUrl) { if (streamUrl) {
console.log('Found data stream for ' + file); console.log('Found data stream for ' + file);
PDFViewerApplication.open(streamUrl, { callback(streamUrl, response.contentLength, file);
length: response.contentLength
});
PDFViewerApplication.setTitleUsingUrl(file);
return; return;
} }
if (isFTPFile && !response.extensionSupportsFTP) { if (isFTPFile && !response.extensionSupportsFTP) {
@ -108,16 +107,14 @@
resolveLocalFileSystemURL(file, function onResolvedFSURL(fileEntry) { resolveLocalFileSystemURL(file, function onResolvedFSURL(fileEntry) {
fileEntry.file(function(fileObject) { fileEntry.file(function(fileObject) {
var blobUrl = URL.createObjectURL(fileObject); var blobUrl = URL.createObjectURL(fileObject);
PDFViewerApplication.open(blobUrl, { callback(blobUrl, fileObject.size);
length: fileObject.size
});
}); });
}, function onFileSystemError(error) { }, function onFileSystemError(error) {
// This should not happen. When it happens, just fall back to the // This should not happen. When it happens, just fall back to the
// usual way of getting the File's data (via the Web worker). // usual way of getting the File's data (via the Web worker).
console.warn('Cannot resolve file ' + file + ', ' + error.name + ' ' + console.warn('Cannot resolve file ' + file + ', ' + error.name + ' ' +
error.message); error.message);
PDFViewerApplication.open(file); callback(file);
}); });
return; return;
} }
@ -126,7 +123,7 @@
// There is no UI to input a different URL, so this assumption will hold // There is no UI to input a different URL, so this assumption will hold
// for now. // for now.
setReferer(file, function() { setReferer(file, function() {
PDFViewerApplication.open(file); callback(file);
}); });
return; return;
} }
@ -145,7 +142,7 @@
} }
isAllowedFileSchemeAccess(function(isAllowedAccess) { isAllowedFileSchemeAccess(function(isAllowedAccess) {
if (isAllowedAccess) { if (isAllowedAccess) {
PDFViewerApplication.open(file); callback(file);
} else { } else {
requestAccessToLocalFile(file); requestAccessToLocalFile(file);
} }
@ -153,7 +150,7 @@
}); });
return; 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; exports.ChromeCom = ChromeCom;
//#endif //#endif
})); }));

View File

@ -18,19 +18,18 @@
(function (root, factory) { (function (root, factory) {
if (typeof define === 'function' && define.amd) { if (typeof define === 'function' && define.amd) {
define('pdfjs-web/firefoxcom', ['exports', 'pdfjs-web/preferences', define('pdfjs-web/firefoxcom', ['exports', 'pdfjs-web/preferences',
'pdfjs-web/pdfjs'], factory); 'pdfjs-web/app', 'pdfjs-web/pdfjs'], factory);
} else if (typeof exports !== 'undefined') { } else if (typeof exports !== 'undefined') {
factory(exports, require('./preferences.js'), require('./pdfjs.js')); factory(exports, require('./preferences.js'), require('./app.js'),
require('./pdfjs.js'));
} else { } else {
factory((root.pdfjsWebFirefoxCom = {}), root.pdfjsWebPreferences, factory((root.pdfjsWebFirefoxCom = {}), root.pdfjsWebPreferences,
root.pdfjsWebPDFJS); root.pdfjsWebApp, root.pdfjsWebPDFJS);
} }
}(this, function (exports, preferences, pdfjsLib) { }(this, function (exports, preferences, app, pdfjsLib) {
//#if FIREFOX || MOZCENTRAL //#if FIREFOX || MOZCENTRAL
//#if !(FIREFOX || MOZCENTRAL)
if (true) { return; } // TODO ensure nothing depends on this module.
//#endif
var Preferences = preferences.Preferences; var Preferences = preferences.Preferences;
var PDFViewerApplication = app.PDFViewerApplication;
var FirefoxCom = (function FirefoxComClosure() { var FirefoxCom = (function FirefoxComClosure() {
return { return {
@ -149,6 +148,117 @@ Preferences._readFromStorage = function (prefObj) {
}); });
}; };
function FirefoxComDataRangeTransport(length, initialData) {
pdfjsLib.PDFDataRangeTransport.call(this, length, initialData);
}
FirefoxComDataRangeTransport.prototype =
Object.create(pdfjsLib.PDFDataRangeTransport.prototype);
FirefoxComDataRangeTransport.prototype.requestDataRange =
function FirefoxComDataRangeTransport_requestDataRange(begin, end) {
FirefoxCom.request('requestDataRange', { begin: begin, end: end });
};
FirefoxComDataRangeTransport.prototype.abort =
function FirefoxComDataRangeTransport_abort() {
// Sync call to ensure abort is really started.
FirefoxCom.requestSync('abortLoading', null);
};
PDFViewerApplication.externalServices = {
updateFindControlState: function (data) {
FirefoxCom.request('updateFindControlState', data);
},
initPassiveLoading: function (callbacks) {
var pdfDataRangeTransport;
window.addEventListener('message', function windowMessage(e) {
if (e.source !== null) {
// The message MUST originate from Chrome code.
console.warn('Rejected untrusted message from ' + e.origin);
return;
}
var args = e.data;
if (typeof args !== 'object' || !('pdfjsLoadAction' in args)) {
return;
}
switch (args.pdfjsLoadAction) {
case 'supportsRangedLoading':
pdfDataRangeTransport =
new FirefoxComDataRangeTransport(args.length, args.data);
callbacks.onOpenWithTransport(args.pdfUrl, args.length,
pdfDataRangeTransport);
break;
case 'range':
pdfDataRangeTransport.onDataRange(args.begin, args.chunk);
break;
case 'rangeProgress':
pdfDataRangeTransport.onDataProgress(args.loaded);
break;
case 'progressiveRead':
pdfDataRangeTransport.onDataProgressiveRead(args.chunk);
break;
case 'progress':
callbacks.onProgress(args.loaded, args.total);
break;
case 'complete':
if (!args.data) {
callbacks.onError(args.errorCode);
break;
}
callbacks.onOpenWithData(args.data);
break;
}
});
FirefoxCom.requestSync('initPassiveLoading', null);
},
fallback: function (data, callback) {
FirefoxCom.request('fallback', data, callback);
},
reportTelemetry: function (data) {
FirefoxCom.request('reportTelemetry', JSON.stringify(data));
},
createDownloadManager: function () {
return new DownloadManager();
},
get supportsIntegratedFind() {
var support = FirefoxCom.requestSync('supportsIntegratedFind');
return pdfjsLib.shadow(this, 'supportsIntegratedFind', support);
},
get supportsDocumentFonts() {
var support = FirefoxCom.requestSync('supportsDocumentFonts');
return pdfjsLib.shadow(this, 'supportsDocumentFonts', support);
},
get supportsDocumentColors() {
var support = FirefoxCom.requestSync('supportsDocumentColors');
return pdfjsLib.shadow(this, 'supportsDocumentColors', support);
},
get supportedMouseWheelZoomModifierKeys() {
var support = FirefoxCom.requestSync('supportedMouseWheelZoomModifierKeys');
return pdfjsLib.shadow(this, 'supportedMouseWheelZoomModifierKeys',
support);
},
};
//// l10n.js for Firefox extension expects services to be set.
document.mozL10n.setExternalLocalizerServices({
getLocale: function () {
return FirefoxCom.requestSync('getLocale', null);
},
getStrings: function (key) {
return FirefoxCom.requestSync('getStrings', key);
}
});
exports.DownloadManager = DownloadManager; exports.DownloadManager = DownloadManager;
exports.FirefoxCom = FirefoxCom; exports.FirefoxCom = FirefoxCom;
//#endif //#endif

View File

@ -17,18 +17,16 @@
(function (root, factory) { (function (root, factory) {
if (typeof define === 'function' && define.amd) { if (typeof define === 'function' && define.amd) {
define('pdfjs-web/pdf_find_controller', ['exports', define('pdfjs-web/pdf_find_controller', ['exports', 'pdfjs-web/ui_utils'],
'pdfjs-web/ui_utils', 'pdfjs-web/firefoxcom'], factory); factory);
} else if (typeof exports !== 'undefined') { } else if (typeof exports !== 'undefined') {
factory(exports, require('./ui_utils.js'), require('./firefoxcom.js')); factory(exports, require('./ui_utils.js'));
} else { } else {
factory((root.pdfjsWebPDFFindController = {}), root.pdfjsWebUIUtils, factory((root.pdfjsWebPDFFindController = {}), root.pdfjsWebUIUtils);
root.pdfjsWebFirefoxCom);
} }
}(this, function (exports, uiUtils, firefoxCom) { }(this, function (exports, uiUtils, firefoxCom) {
var scrollIntoView = uiUtils.scrollIntoView; var scrollIntoView = uiUtils.scrollIntoView;
var FirefoxCom = firefoxCom.FirefoxCom;
var FindStates = { var FindStates = {
FIND_FOUND: 0, FIND_FOUND: 0,
@ -61,31 +59,32 @@ var CHARACTERS_TO_NORMALIZE = {
var PDFFindController = (function PDFFindControllerClosure() { var PDFFindController = (function PDFFindControllerClosure() {
function PDFFindController(options) { function PDFFindController(options) {
this.pdfViewer = options.pdfViewer || null; this.pdfViewer = options.pdfViewer || null;
this.integratedFind = options.integratedFind || false;
this.findBar = options.findBar || null; this.onUpdateResultsCount = null;
this.onUpdateState = null;
this.reset(); this.reset();
// Compile the regular expression for text normalization once. // Compile the regular expression for text normalization once.
var replace = Object.keys(CHARACTERS_TO_NORMALIZE).join(''); var replace = Object.keys(CHARACTERS_TO_NORMALIZE).join('');
this.normalizationRegex = new RegExp('[' + replace + ']', 'g'); this.normalizationRegex = new RegExp('[' + replace + ']', 'g');
var events = [
'find',
'findagain',
'findhighlightallchange',
'findcasesensitivitychange'
];
this.handleEvent = this.handleEvent.bind(this);
for (var i = 0, len = events.length; i < len; i++) {
window.addEventListener(events[i], this.handleEvent);
}
} }
PDFFindController.prototype = { PDFFindController.prototype = {
setFindBar: function PDFFindController_setFindBar(findBar) { listenWindowEvents: function PDFFindController_listenWindowEvents() {
this.findBar = findBar; var events = [
'find',
'findagain',
'findhighlightallchange',
'findcasesensitivitychange'
];
var handleEvent = function (e) {
this.executeCommand(e.type, e.detail);
}.bind(this);
for (var i = 0, len = events.length; i < len; i++) {
window.addEventListener(events[i], handleEvent);
}
}, },
reset: function PDFFindController_reset() { reset: function PDFFindController_reset() {
@ -199,18 +198,18 @@ var PDFFindController = (function PDFFindControllerClosure() {
extractPageText(0); extractPageText(0);
}, },
handleEvent: function PDFFindController_handleEvent(e) { executeCommand: function PDFFindController_executeCommand(cmd, state) {
if (this.state === null || e.type !== 'findagain') { if (this.state === null || cmd !== 'findagain') {
this.dirtyMatch = true; this.dirtyMatch = true;
} }
this.state = e.detail; this.state = state;
this.updateUIState(FindStates.FIND_PENDING); this.updateUIState(FindStates.FIND_PENDING);
this.firstPagePromise.then(function() { this.firstPagePromise.then(function() {
this.extractText(); this.extractText();
clearTimeout(this.findTimeout); clearTimeout(this.findTimeout);
if (e.type === 'find') { if (cmd === 'find') {
// Only trigger the find action after 250ms of silence. // Only trigger the find action after 250ms of silence.
this.findTimeout = setTimeout(this.nextMatch.bind(this), 250); this.findTimeout = setTimeout(this.nextMatch.bind(this), 250);
} else { } else {
@ -408,24 +407,15 @@ var PDFFindController = (function PDFFindControllerClosure() {
updateUIResultsCount: updateUIResultsCount:
function PDFFindController_updateUIResultsCount() { function PDFFindController_updateUIResultsCount() {
if (this.findBar === null) { if (this.onUpdateResultsCount) {
throw new Error('PDFFindController is not initialized with a ' + this.onUpdateResultsCount(this.matchCount);
'PDFFindBar instance.');
} }
this.findBar.updateResultsCount(this.matchCount);
}, },
updateUIState: function PDFFindController_updateUIState(state, previous) { updateUIState: function PDFFindController_updateUIState(state, previous) {
if (this.integratedFind) { if (this.onUpdateState) {
FirefoxCom.request('updateFindControlState', this.onUpdateState(state, previous, this.matchCount);
{ result: state, findPrevious: previous });
return;
} }
if (this.findBar === null) {
throw new Error('PDFFindController is not initialized with a ' +
'PDFFindBar instance.');
}
this.findBar.updateUIState(state, previous, this.matchCount);
} }
}; };
return PDFFindController; return PDFFindController;

View File

@ -50,6 +50,8 @@
PDFJS.DefaultAnnotationLayerFactory = PDFJS.DefaultAnnotationLayerFactory =
pdfViewerLibs.pdfjsWebAnnotationLayerBuilder.DefaultAnnotationLayerFactory; pdfViewerLibs.pdfjsWebAnnotationLayerBuilder.DefaultAnnotationLayerFactory;
PDFJS.PDFHistory = pdfViewerLibs.pdfjsWebPDFHistory.PDFHistory; PDFJS.PDFHistory = pdfViewerLibs.pdfjsWebPDFHistory.PDFHistory;
PDFJS.PDFFindController =
pdfViewerLibs.pdfjsWebPDFFindController.PDFFindController;
PDFJS.DownloadManager = pdfViewerLibs.pdfjsWebDownloadManager.DownloadManager; PDFJS.DownloadManager = pdfViewerLibs.pdfjsWebDownloadManager.DownloadManager;
PDFJS.ProgressBar = pdfViewerLibs.pdfjsWebUIUtils.ProgressBar; PDFJS.ProgressBar = pdfViewerLibs.pdfjsWebUIUtils.ProgressBar;

View File

@ -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) //#if !(FIREFOX || MOZCENTRAL || CHROME)
Preferences._writeToStorage = function (prefObj) { Preferences._writeToStorage = function (prefObj) {
return new Promise(function (resolve) { return new Promise(function (resolve) {

View File

@ -166,7 +166,7 @@ function webViewerLoad() {
var config = getViewerConfiguration(); var config = getViewerConfiguration();
//#if !PRODUCTION //#if !PRODUCTION
require.config({paths: {'pdfjs': '../src', 'pdfjs-web': '.'}}); require.config({paths: {'pdfjs': '../src', 'pdfjs-web': '.'}});
require(['pdfjs-web/app'], function (web) { require(['pdfjs-web/app', 'mozPrintCallback_polyfill.js'], function (web) {
window.PDFViewerApplication = web.PDFViewerApplication; window.PDFViewerApplication = web.PDFViewerApplication;
web.PDFViewerApplication.run(config); web.PDFViewerApplication.run(config);
}); });