2012-09-01 07:48:21 +09:00
|
|
|
/* Copyright 2012 Mozilla Foundation
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
2016-04-09 04:15:48 +09:00
|
|
|
/* globals DEFAULT_URL, PDFBug, Stats */
|
2011-05-26 23:02:52 +09:00
|
|
|
|
2011-07-06 15:06:45 +09:00
|
|
|
'use strict';
|
2011-06-19 09:35:28 +09:00
|
|
|
|
2016-04-09 02:34:27 +09:00
|
|
|
(function (root, factory) {
|
|
|
|
if (typeof define === 'function' && define.amd) {
|
|
|
|
define('pdfjs-web/app', ['exports', 'pdfjs-web/ui_utils',
|
2016-04-14 06:21:05 +09:00
|
|
|
'pdfjs-web/download_manager', 'pdfjs-web/pdf_history',
|
|
|
|
'pdfjs-web/preferences', 'pdfjs-web/pdf_sidebar',
|
2016-04-09 02:34:27 +09:00
|
|
|
'pdfjs-web/view_history', 'pdfjs-web/pdf_thumbnail_viewer',
|
|
|
|
'pdfjs-web/secondary_toolbar', 'pdfjs-web/password_prompt',
|
|
|
|
'pdfjs-web/pdf_presentation_mode', 'pdfjs-web/pdf_document_properties',
|
|
|
|
'pdfjs-web/hand_tool', 'pdfjs-web/pdf_viewer',
|
|
|
|
'pdfjs-web/pdf_rendering_queue', 'pdfjs-web/pdf_link_service',
|
|
|
|
'pdfjs-web/pdf_outline_viewer', 'pdfjs-web/overlay_manager',
|
|
|
|
'pdfjs-web/pdf_attachment_viewer', 'pdfjs-web/pdf_find_controller',
|
2016-04-26 07:57:15 +09:00
|
|
|
'pdfjs-web/pdf_find_bar', 'pdfjs-web/dom_events', 'pdfjs-web/pdfjs'],
|
2016-04-09 02:34:27 +09:00
|
|
|
factory);
|
|
|
|
} else if (typeof exports !== 'undefined') {
|
2016-04-14 06:21:05 +09:00
|
|
|
factory(exports, require('./ui_utils.js'), require('./download_manager.js'),
|
|
|
|
require('./pdf_history.js'), require('./preferences.js'),
|
|
|
|
require('./pdf_sidebar.js'), require('./view_history.js'),
|
|
|
|
require('./pdf_thumbnail_viewer.js'), require('./secondary_toolbar.js'),
|
|
|
|
require('./password_prompt.js'), require('./pdf_presentation_mode.js'),
|
2016-04-09 02:34:27 +09:00
|
|
|
require('./pdf_document_properties.js'), require('./hand_tool.js'),
|
|
|
|
require('./pdf_viewer.js'), require('./pdf_rendering_queue.js'),
|
|
|
|
require('./pdf_link_service.js'), require('./pdf_outline_viewer.js'),
|
|
|
|
require('./overlay_manager.js'), require('./pdf_attachment_viewer.js'),
|
|
|
|
require('./pdf_find_controller.js'), require('./pdf_find_bar.js'),
|
2016-04-26 07:57:15 +09:00
|
|
|
require('./dom_events.js'), require('./pdfjs.js'));
|
2016-04-09 02:34:27 +09:00
|
|
|
} else {
|
|
|
|
factory((root.pdfjsWebApp = {}), root.pdfjsWebUIUtils,
|
2016-04-14 06:21:05 +09:00
|
|
|
root.pdfjsWebDownloadManager, root.pdfjsWebPDFHistory,
|
|
|
|
root.pdfjsWebPreferences, root.pdfjsWebPDFSidebar,
|
|
|
|
root.pdfjsWebViewHistory, root.pdfjsWebPDFThumbnailViewer,
|
|
|
|
root.pdfjsWebSecondaryToolbar, root.pdfjsWebPasswordPrompt,
|
|
|
|
root.pdfjsWebPDFPresentationMode, root.pdfjsWebPDFDocumentProperties,
|
|
|
|
root.pdfjsWebHandTool, root.pdfjsWebPDFViewer,
|
|
|
|
root.pdfjsWebPDFRenderingQueue, root.pdfjsWebPDFLinkService,
|
|
|
|
root.pdfjsWebPDFOutlineViewer, root.pdfjsWebOverlayManager,
|
|
|
|
root.pdfjsWebPDFAttachmentViewer, root.pdfjsWebPDFFindController,
|
2016-04-26 07:57:15 +09:00
|
|
|
root.pdfjsWebPDFFindBar, root.pdfjsWebDOMEvents, root.pdfjsWebPDFJS);
|
2016-04-09 02:34:27 +09:00
|
|
|
}
|
2016-04-14 06:21:05 +09:00
|
|
|
}(this, function (exports, uiUtilsLib, downloadManagerLib, pdfHistoryLib,
|
|
|
|
preferencesLib, pdfSidebarLib, viewHistoryLib,
|
2016-04-09 02:34:27 +09:00
|
|
|
pdfThumbnailViewerLib, secondaryToolbarLib, passwordPromptLib,
|
|
|
|
pdfPresentationModeLib, pdfDocumentPropertiesLib, handToolLib,
|
|
|
|
pdfViewerLib, pdfRenderingQueueLib, pdfLinkServiceLib,
|
|
|
|
pdfOutlineViewerLib, overlayManagerLib,
|
|
|
|
pdfAttachmentViewerLib, pdfFindControllerLib, pdfFindBarLib,
|
2016-04-26 07:57:15 +09:00
|
|
|
domEventsLib, pdfjsLib) {
|
2016-04-09 02:34:27 +09:00
|
|
|
|
|
|
|
var UNKNOWN_SCALE = uiUtilsLib.UNKNOWN_SCALE;
|
|
|
|
var DEFAULT_SCALE_VALUE = uiUtilsLib.DEFAULT_SCALE_VALUE;
|
|
|
|
var ProgressBar = uiUtilsLib.ProgressBar;
|
|
|
|
var getPDFFileNameFromURL = uiUtilsLib.getPDFFileNameFromURL;
|
|
|
|
var noContextMenuHandler = uiUtilsLib.noContextMenuHandler;
|
|
|
|
var mozL10n = uiUtilsLib.mozL10n;
|
|
|
|
var parseQueryString = uiUtilsLib.parseQueryString;
|
|
|
|
var PDFHistory = pdfHistoryLib.PDFHistory;
|
|
|
|
var Preferences = preferencesLib.Preferences;
|
|
|
|
var SidebarView = pdfSidebarLib.SidebarView;
|
|
|
|
var PDFSidebar = pdfSidebarLib.PDFSidebar;
|
|
|
|
var ViewHistory = viewHistoryLib.ViewHistory;
|
|
|
|
var PDFThumbnailViewer = pdfThumbnailViewerLib.PDFThumbnailViewer;
|
|
|
|
var SecondaryToolbar = secondaryToolbarLib.SecondaryToolbar;
|
|
|
|
var PasswordPrompt = passwordPromptLib.PasswordPrompt;
|
|
|
|
var PDFPresentationMode = pdfPresentationModeLib.PDFPresentationMode;
|
|
|
|
var PDFDocumentProperties = pdfDocumentPropertiesLib.PDFDocumentProperties;
|
|
|
|
var HandTool = handToolLib.HandTool;
|
|
|
|
var PresentationModeState = pdfViewerLib.PresentationModeState;
|
|
|
|
var PDFViewer = pdfViewerLib.PDFViewer;
|
|
|
|
var RenderingStates = pdfRenderingQueueLib.RenderingStates;
|
|
|
|
var PDFRenderingQueue = pdfRenderingQueueLib.PDFRenderingQueue;
|
|
|
|
var PDFLinkService = pdfLinkServiceLib.PDFLinkService;
|
|
|
|
var PDFOutlineViewer = pdfOutlineViewerLib.PDFOutlineViewer;
|
|
|
|
var OverlayManager = overlayManagerLib.OverlayManager;
|
|
|
|
var PDFAttachmentViewer = pdfAttachmentViewerLib.PDFAttachmentViewer;
|
|
|
|
var PDFFindController = pdfFindControllerLib.PDFFindController;
|
|
|
|
var PDFFindBar = pdfFindBarLib.PDFFindBar;
|
2016-04-26 07:57:15 +09:00
|
|
|
var getGlobalEventBus = domEventsLib.getGlobalEventBus;
|
2016-04-09 02:34:27 +09:00
|
|
|
|
2012-11-10 06:34:11 +09:00
|
|
|
var DEFAULT_SCALE_DELTA = 1.1;
|
|
|
|
var MIN_SCALE = 0.25;
|
2014-05-24 10:43:43 +09:00
|
|
|
var MAX_SCALE = 10.0;
|
2013-06-02 21:31:28 +09:00
|
|
|
var SCALE_SELECT_CONTAINER_PADDING = 8;
|
|
|
|
var SCALE_SELECT_PADDING = 22;
|
2014-07-18 20:53:04 +09:00
|
|
|
var PAGE_NUMBER_LOADING_INDICATOR = 'visiblePageIsLoading';
|
2014-08-17 08:06:03 +09:00
|
|
|
var DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT = 5000;
|
2012-06-19 01:48:47 +09:00
|
|
|
|
2015-12-17 06:03:06 +09:00
|
|
|
function configure(PDFJS) {
|
|
|
|
PDFJS.imageResourcesPath = './images/';
|
2015-06-20 00:53:03 +09:00
|
|
|
//#if (FIREFOX || MOZCENTRAL || GENERIC || CHROME)
|
2013-08-13 02:48:06 +09:00
|
|
|
//PDFJS.workerSrc = '../build/pdf.worker.js';
|
2012-09-11 09:39:51 +09:00
|
|
|
//#endif
|
2014-02-12 03:27:09 +09:00
|
|
|
//#if !PRODUCTION
|
2015-12-17 06:03:06 +09:00
|
|
|
PDFJS.cMapUrl = '../external/bcmaps/';
|
|
|
|
PDFJS.cMapPacked = true;
|
|
|
|
PDFJS.workerSrc = '../src/worker_loader.js';
|
2014-02-12 03:27:09 +09:00
|
|
|
//#else
|
|
|
|
//PDFJS.cMapUrl = '../web/cmaps/';
|
2014-03-15 03:22:02 +09:00
|
|
|
//PDFJS.cMapPacked = true;
|
2014-02-12 03:27:09 +09:00
|
|
|
//#endif
|
2015-12-17 06:03:06 +09:00
|
|
|
}
|
2011-07-29 20:26:43 +09:00
|
|
|
|
2016-04-14 06:21:05 +09:00
|
|
|
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,
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2014-09-22 20:41:17 +09:00
|
|
|
var PDFViewerApplication = {
|
2011-10-02 03:54:37 +09:00
|
|
|
initialBookmark: document.location.hash.substring(1),
|
2015-04-27 23:04:11 +09:00
|
|
|
initialDestination: null,
|
2012-05-01 05:05:32 +09:00
|
|
|
initialized: false,
|
2012-05-15 09:19:09 +09:00
|
|
|
fellback: false,
|
2016-04-22 01:39:11 +09:00
|
|
|
appConfig: null,
|
2012-06-02 06:17:09 +09:00
|
|
|
pdfDocument: null,
|
2015-10-23 22:49:02 +09:00
|
|
|
pdfLoadingTask: null,
|
2014-06-25 07:23:42 +09:00
|
|
|
printing: false,
|
2014-09-21 02:21:49 +09:00
|
|
|
/** @type {PDFViewer} */
|
2014-09-13 11:27:45 +09:00
|
|
|
pdfViewer: null,
|
2014-09-21 02:21:49 +09:00
|
|
|
/** @type {PDFThumbnailViewer} */
|
2014-09-13 04:48:44 +09:00
|
|
|
pdfThumbnailViewer: null,
|
2014-09-21 02:21:49 +09:00
|
|
|
/** @type {PDFRenderingQueue} */
|
2014-09-16 01:18:28 +09:00
|
|
|
pdfRenderingQueue: null,
|
2015-02-04 02:09:11 +09:00
|
|
|
/** @type {PDFPresentationMode} */
|
|
|
|
pdfPresentationMode: null,
|
2015-04-25 03:47:38 +09:00
|
|
|
/** @type {PDFDocumentProperties} */
|
|
|
|
pdfDocumentProperties: null,
|
2015-04-28 00:25:32 +09:00
|
|
|
/** @type {PDFLinkService} */
|
|
|
|
pdfLinkService: null,
|
2015-04-27 23:04:11 +09:00
|
|
|
/** @type {PDFHistory} */
|
|
|
|
pdfHistory: null,
|
2016-02-22 01:54:23 +09:00
|
|
|
/** @type {PDFSidebar} */
|
|
|
|
pdfSidebar: null,
|
2016-02-21 21:36:24 +09:00
|
|
|
/** @type {PDFOutlineViewer} */
|
|
|
|
pdfOutlineViewer: null,
|
|
|
|
/** @type {PDFAttachmentViewer} */
|
|
|
|
pdfAttachmentViewer: null,
|
2016-03-12 21:07:43 +09:00
|
|
|
/** @type {ViewHistory} */
|
|
|
|
store: null,
|
2016-04-14 06:21:05 +09:00
|
|
|
/** @type {DownloadManager} */
|
|
|
|
downloadManager: null,
|
2016-04-26 07:57:15 +09:00
|
|
|
/** @type {EventBus} */
|
|
|
|
eventBus: null,
|
2012-09-08 08:05:14 +09:00
|
|
|
pageRotation: 0,
|
2014-09-22 20:41:17 +09:00
|
|
|
isInitialViewSet: false,
|
|
|
|
animationStartedPromise: null,
|
2014-10-01 18:42:06 +09:00
|
|
|
preferenceSidebarViewOnLoad: SidebarView.NONE,
|
|
|
|
preferencePdfBugEnabled: false,
|
2015-01-28 07:57:46 +09:00
|
|
|
preferenceShowPreviousViewOnLoad: true,
|
2015-03-31 22:33:21 +09:00
|
|
|
preferenceDefaultZoomValue: '',
|
2013-07-20 23:33:40 +09:00
|
|
|
isViewerEmbedded: (window.parent !== window),
|
2014-07-25 06:37:31 +09:00
|
|
|
url: '',
|
2016-04-14 06:21:05 +09:00
|
|
|
externalServices: DefaultExernalServices,
|
2012-06-19 01:48:47 +09:00
|
|
|
|
2012-04-26 03:34:28 +09:00
|
|
|
// called once when the document is loaded
|
2016-04-22 01:39:11 +09:00
|
|
|
initialize: function pdfViewInitialize(appConfig) {
|
2016-03-29 06:44:27 +09:00
|
|
|
configure(pdfjsLib.PDFJS);
|
2016-04-22 01:39:11 +09:00
|
|
|
this.appConfig = appConfig;
|
2016-04-02 00:29:44 +09:00
|
|
|
|
2016-04-26 07:57:15 +09:00
|
|
|
var eventBus = appConfig.eventBus || getGlobalEventBus();
|
|
|
|
this.eventBus = eventBus;
|
|
|
|
this.bindEvents();
|
|
|
|
|
2014-09-16 01:18:28 +09:00
|
|
|
var pdfRenderingQueue = new PDFRenderingQueue();
|
|
|
|
pdfRenderingQueue.onIdle = this.cleanup.bind(this);
|
|
|
|
this.pdfRenderingQueue = pdfRenderingQueue;
|
2012-06-19 01:48:47 +09:00
|
|
|
|
2016-04-26 07:57:15 +09:00
|
|
|
var pdfLinkService = new PDFLinkService({
|
|
|
|
eventBus: eventBus
|
|
|
|
});
|
2015-04-28 00:25:32 +09:00
|
|
|
this.pdfLinkService = pdfLinkService;
|
|
|
|
|
2016-04-14 06:21:05 +09:00
|
|
|
var downloadManager = this.externalServices.createDownloadManager();
|
|
|
|
this.downloadManager = downloadManager;
|
|
|
|
|
2016-04-22 01:39:11 +09:00
|
|
|
var container = appConfig.mainContainer;
|
|
|
|
var viewer = appConfig.viewerContainer;
|
2014-09-13 11:27:45 +09:00
|
|
|
this.pdfViewer = new PDFViewer({
|
|
|
|
container: container,
|
|
|
|
viewer: viewer,
|
2016-04-26 07:57:15 +09:00
|
|
|
eventBus: eventBus,
|
2014-09-16 01:18:28 +09:00
|
|
|
renderingQueue: pdfRenderingQueue,
|
2016-02-15 04:44:00 +09:00
|
|
|
linkService: pdfLinkService,
|
2016-04-14 06:21:05 +09:00
|
|
|
downloadManager: downloadManager
|
2014-09-13 11:27:45 +09:00
|
|
|
});
|
2014-09-16 01:18:28 +09:00
|
|
|
pdfRenderingQueue.setViewer(this.pdfViewer);
|
2015-04-28 00:25:32 +09:00
|
|
|
pdfLinkService.setViewer(this.pdfViewer);
|
2012-06-19 01:48:47 +09:00
|
|
|
|
2016-04-22 01:39:11 +09:00
|
|
|
var thumbnailContainer = appConfig.sidebar.thumbnailView;
|
2014-09-13 04:48:44 +09:00
|
|
|
this.pdfThumbnailViewer = new PDFThumbnailViewer({
|
|
|
|
container: thumbnailContainer,
|
2014-09-16 01:18:28 +09:00
|
|
|
renderingQueue: pdfRenderingQueue,
|
2015-04-28 00:25:32 +09:00
|
|
|
linkService: pdfLinkService
|
2014-09-13 04:48:44 +09:00
|
|
|
});
|
2014-09-16 01:18:28 +09:00
|
|
|
pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer);
|
2012-06-19 01:48:47 +09:00
|
|
|
|
2014-03-17 06:33:39 +09:00
|
|
|
Preferences.initialize();
|
2016-04-16 18:26:10 +09:00
|
|
|
this.preferences = Preferences;
|
2014-03-17 06:33:39 +09:00
|
|
|
|
2015-04-27 23:04:11 +09:00
|
|
|
this.pdfHistory = new PDFHistory({
|
2016-04-26 07:57:15 +09:00
|
|
|
linkService: pdfLinkService,
|
|
|
|
eventBus: this.eventBus
|
2015-04-27 23:04:11 +09:00
|
|
|
});
|
|
|
|
pdfLinkService.setHistory(this.pdfHistory);
|
|
|
|
|
2014-06-26 07:15:22 +09:00
|
|
|
this.findController = new PDFFindController({
|
2016-04-14 04:39:29 +09:00
|
|
|
pdfViewer: this.pdfViewer
|
2014-06-26 07:15:22 +09:00
|
|
|
});
|
2016-04-14 04:39:29 +09:00
|
|
|
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) {
|
2016-04-14 06:21:05 +09:00
|
|
|
this.externalServices.updateFindControlState(
|
|
|
|
{result: state, findPrevious: previous});
|
2016-04-14 04:39:29 +09:00
|
|
|
} else {
|
|
|
|
this.findBar.updateUIState(state, previous, matchCount);
|
|
|
|
}
|
|
|
|
}.bind(this);
|
|
|
|
|
2014-09-16 04:57:12 +09:00
|
|
|
this.pdfViewer.setFindController(this.findController);
|
2014-06-26 07:15:22 +09:00
|
|
|
|
2016-04-22 01:39:11 +09:00
|
|
|
// FIXME better PDFFindBar constructor parameters
|
|
|
|
var findBarConfig = Object.create(appConfig.findBar);
|
|
|
|
findBarConfig.findController = this.findController;
|
2016-04-26 07:57:15 +09:00
|
|
|
findBarConfig.eventBus = this.eventBus;
|
2016-04-22 01:39:11 +09:00
|
|
|
this.findBar = new PDFFindBar(findBarConfig);
|
2013-10-02 06:11:46 +09:00
|
|
|
|
2016-04-16 18:26:10 +09:00
|
|
|
this.overlayManager = OverlayManager;
|
|
|
|
|
2016-04-16 23:47:48 +09:00
|
|
|
this.handTool = new HandTool({
|
2013-10-03 05:09:43 +09:00
|
|
|
container: container,
|
2016-04-26 07:57:15 +09:00
|
|
|
eventBus: this.eventBus,
|
2013-10-03 05:09:43 +09:00
|
|
|
});
|
|
|
|
|
2016-04-22 01:39:11 +09:00
|
|
|
this.pdfDocumentProperties =
|
|
|
|
new PDFDocumentProperties(appConfig.documentProperties);
|
2015-04-25 03:47:38 +09:00
|
|
|
|
2016-05-11 08:31:03 +09:00
|
|
|
this.secondaryToolbar =
|
|
|
|
new SecondaryToolbar(appConfig.secondaryToolbar, eventBus);
|
2013-09-05 06:48:31 +09:00
|
|
|
|
2015-01-29 21:37:49 +09:00
|
|
|
if (this.supportsFullscreen) {
|
2015-02-04 02:09:11 +09:00
|
|
|
this.pdfPresentationMode = new PDFPresentationMode({
|
2015-01-29 21:37:49 +09:00
|
|
|
container: container,
|
2015-02-02 06:53:59 +09:00
|
|
|
viewer: viewer,
|
2015-07-06 16:45:40 +09:00
|
|
|
pdfViewer: this.pdfViewer,
|
2016-04-26 07:57:15 +09:00
|
|
|
eventBus: this.eventBus,
|
2016-04-29 05:04:09 +09:00
|
|
|
contextMenuItems: appConfig.fullscreen
|
2015-01-29 21:37:49 +09:00
|
|
|
});
|
|
|
|
}
|
2013-10-07 03:05:13 +09:00
|
|
|
|
2016-04-22 01:39:11 +09:00
|
|
|
this.passwordPrompt = new PasswordPrompt(appConfig.passwordOverlay);
|
2014-05-13 19:08:39 +09:00
|
|
|
|
2016-02-21 21:36:24 +09:00
|
|
|
this.pdfOutlineViewer = new PDFOutlineViewer({
|
2016-04-22 01:39:11 +09:00
|
|
|
container: appConfig.sidebar.outlineView,
|
2016-04-26 07:57:15 +09:00
|
|
|
eventBus: this.eventBus,
|
2016-02-21 21:36:24 +09:00
|
|
|
linkService: pdfLinkService,
|
|
|
|
});
|
|
|
|
|
|
|
|
this.pdfAttachmentViewer = new PDFAttachmentViewer({
|
2016-04-22 01:39:11 +09:00
|
|
|
container: appConfig.sidebar.attachmentsView,
|
2016-04-26 07:57:15 +09:00
|
|
|
eventBus: this.eventBus,
|
2016-04-14 06:21:05 +09:00
|
|
|
downloadManager: downloadManager
|
2016-02-21 21:36:24 +09:00
|
|
|
});
|
|
|
|
|
2016-04-22 01:39:11 +09:00
|
|
|
// FIXME better PDFSidebar constructor parameters
|
|
|
|
var sidebarConfig = Object.create(appConfig.sidebar);
|
|
|
|
sidebarConfig.pdfViewer = this.pdfViewer;
|
|
|
|
sidebarConfig.pdfThumbnailViewer = this.pdfThumbnailViewer;
|
|
|
|
sidebarConfig.pdfOutlineViewer = this.pdfOutlineViewer;
|
2016-04-26 07:57:15 +09:00
|
|
|
sidebarConfig.eventBus = this.eventBus;
|
2016-04-22 01:39:11 +09:00
|
|
|
this.pdfSidebar = new PDFSidebar(sidebarConfig);
|
2016-02-22 01:54:23 +09:00
|
|
|
this.pdfSidebar.onToggled = this.forceRendering.bind(this);
|
|
|
|
|
2014-10-01 05:19:39 +09:00
|
|
|
var self = this;
|
2016-03-29 06:44:27 +09:00
|
|
|
var PDFJS = pdfjsLib.PDFJS;
|
2014-04-04 02:20:53 +09:00
|
|
|
var initializedPromise = Promise.all([
|
2014-04-27 18:55:45 +09:00
|
|
|
Preferences.get('enableWebGL').then(function resolved(value) {
|
2014-04-04 02:20:53 +09:00
|
|
|
PDFJS.disableWebGL = !value;
|
2014-05-30 07:44:41 +09:00
|
|
|
}),
|
2014-04-28 23:07:53 +09:00
|
|
|
Preferences.get('sidebarViewOnLoad').then(function resolved(value) {
|
|
|
|
self.preferenceSidebarViewOnLoad = value;
|
2014-05-30 07:44:41 +09:00
|
|
|
}),
|
2014-06-17 04:46:39 +09:00
|
|
|
Preferences.get('pdfBugEnabled').then(function resolved(value) {
|
2014-10-01 18:42:06 +09:00
|
|
|
self.preferencePdfBugEnabled = value;
|
2014-06-17 04:46:39 +09:00
|
|
|
}),
|
2015-01-28 07:57:46 +09:00
|
|
|
Preferences.get('showPreviousViewOnLoad').then(function resolved(value) {
|
|
|
|
self.preferenceShowPreviousViewOnLoad = value;
|
|
|
|
}),
|
2015-03-31 22:33:21 +09:00
|
|
|
Preferences.get('defaultZoomValue').then(function resolved(value) {
|
|
|
|
self.preferenceDefaultZoomValue = value;
|
|
|
|
}),
|
2014-05-30 07:44:41 +09:00
|
|
|
Preferences.get('disableTextLayer').then(function resolved(value) {
|
2014-06-13 02:40:59 +09:00
|
|
|
if (PDFJS.disableTextLayer === true) {
|
|
|
|
return;
|
|
|
|
}
|
2014-05-30 07:44:41 +09:00
|
|
|
PDFJS.disableTextLayer = value;
|
|
|
|
}),
|
|
|
|
Preferences.get('disableRange').then(function resolved(value) {
|
2014-06-13 02:40:59 +09:00
|
|
|
if (PDFJS.disableRange === true) {
|
|
|
|
return;
|
|
|
|
}
|
2014-05-30 07:44:41 +09:00
|
|
|
PDFJS.disableRange = value;
|
|
|
|
}),
|
2015-08-18 19:35:42 +09:00
|
|
|
Preferences.get('disableStream').then(function resolved(value) {
|
|
|
|
if (PDFJS.disableStream === true) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
PDFJS.disableStream = value;
|
|
|
|
}),
|
2014-05-30 07:44:41 +09:00
|
|
|
Preferences.get('disableAutoFetch').then(function resolved(value) {
|
|
|
|
PDFJS.disableAutoFetch = value;
|
|
|
|
}),
|
|
|
|
Preferences.get('disableFontFace').then(function resolved(value) {
|
2014-06-13 02:40:59 +09:00
|
|
|
if (PDFJS.disableFontFace === true) {
|
|
|
|
return;
|
|
|
|
}
|
2014-05-30 07:44:41 +09:00
|
|
|
PDFJS.disableFontFace = value;
|
|
|
|
}),
|
|
|
|
Preferences.get('useOnlyCssZoom').then(function resolved(value) {
|
|
|
|
PDFJS.useOnlyCssZoom = value;
|
2015-04-19 19:40:46 +09:00
|
|
|
}),
|
|
|
|
Preferences.get('externalLinkTarget').then(function resolved(value) {
|
|
|
|
if (PDFJS.isExternalLinkTargetSet()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
PDFJS.externalLinkTarget = value;
|
|
|
|
}),
|
2014-04-04 02:20:53 +09:00
|
|
|
// TODO move more preferences and other async stuff here
|
2014-05-30 07:44:41 +09:00
|
|
|
]).catch(function (reason) { });
|
2014-04-04 02:20:53 +09:00
|
|
|
|
|
|
|
return initializedPromise.then(function () {
|
2015-04-19 19:40:46 +09:00
|
|
|
if (self.isViewerEmbedded && !PDFJS.isExternalLinkTargetSet()) {
|
|
|
|
// Prevent external links from "replacing" the viewer,
|
|
|
|
// when it's embedded in e.g. an iframe or an object.
|
|
|
|
PDFJS.externalLinkTarget = PDFJS.LinkTarget.TOP;
|
|
|
|
}
|
|
|
|
|
|
|
|
self.initialized = true;
|
2014-04-04 02:20:53 +09:00
|
|
|
});
|
2012-04-26 03:34:28 +09:00
|
|
|
},
|
2011-07-29 02:48:05 +09:00
|
|
|
|
2016-04-22 01:39:11 +09:00
|
|
|
run: function pdfViewRun(config) {
|
|
|
|
this.initialize(config).then(webViewerInitialized);
|
2016-04-02 00:29:44 +09:00
|
|
|
},
|
|
|
|
|
2013-08-27 04:00:35 +09:00
|
|
|
zoomIn: function pdfViewZoomIn(ticks) {
|
2014-09-13 11:27:45 +09:00
|
|
|
var newScale = this.pdfViewer.currentScale;
|
2013-08-27 04:00:35 +09:00
|
|
|
do {
|
|
|
|
newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2);
|
|
|
|
newScale = Math.ceil(newScale * 10) / 10;
|
|
|
|
newScale = Math.min(MAX_SCALE, newScale);
|
2015-05-14 12:27:56 +09:00
|
|
|
} while (--ticks > 0 && newScale < MAX_SCALE);
|
2015-07-11 18:47:45 +09:00
|
|
|
this.pdfViewer.currentScaleValue = newScale;
|
2011-09-03 10:16:52 +09:00
|
|
|
},
|
|
|
|
|
2013-08-27 04:00:35 +09:00
|
|
|
zoomOut: function pdfViewZoomOut(ticks) {
|
2014-09-13 11:27:45 +09:00
|
|
|
var newScale = this.pdfViewer.currentScale;
|
2013-08-27 04:00:35 +09:00
|
|
|
do {
|
|
|
|
newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2);
|
|
|
|
newScale = Math.floor(newScale * 10) / 10;
|
|
|
|
newScale = Math.max(MIN_SCALE, newScale);
|
2015-05-14 12:27:56 +09:00
|
|
|
} while (--ticks > 0 && newScale > MIN_SCALE);
|
2015-07-11 18:47:45 +09:00
|
|
|
this.pdfViewer.currentScaleValue = newScale;
|
2011-09-03 10:16:52 +09:00
|
|
|
},
|
|
|
|
|
2014-09-13 11:27:45 +09:00
|
|
|
get pagesCount() {
|
|
|
|
return this.pdfDocument.numPages;
|
|
|
|
},
|
2011-10-15 11:05:57 +09:00
|
|
|
|
2014-09-13 11:27:45 +09:00
|
|
|
set page(val) {
|
2015-04-28 00:25:32 +09:00
|
|
|
this.pdfLinkService.page = val;
|
2011-07-29 02:48:05 +09:00
|
|
|
},
|
|
|
|
|
2015-04-28 00:25:32 +09:00
|
|
|
get page() { // TODO remove
|
|
|
|
return this.pdfLinkService.page;
|
2011-07-29 02:48:05 +09:00
|
|
|
},
|
|
|
|
|
2012-06-29 01:50:25 +09:00
|
|
|
get supportsPrinting() {
|
|
|
|
var canvas = document.createElement('canvas');
|
2012-07-13 02:31:20 +09:00
|
|
|
var value = 'mozPrintCallback' in canvas;
|
2015-02-01 06:43:30 +09:00
|
|
|
|
2016-03-29 06:44:27 +09:00
|
|
|
return pdfjsLib.shadow(this, 'supportsPrinting', value);
|
2012-06-29 01:50:25 +09:00
|
|
|
},
|
|
|
|
|
2012-07-31 00:12:49 +09:00
|
|
|
get supportsFullscreen() {
|
2016-04-29 23:34:07 +09:00
|
|
|
//#if MOZCENTRAL
|
2016-07-01 21:02:38 +09:00
|
|
|
// var support = document.fullscreenEnabled === true ||
|
|
|
|
// document.mozFullScreenEnabled === true;
|
2016-04-29 23:34:07 +09:00
|
|
|
//#else
|
2012-07-31 00:12:49 +09:00
|
|
|
var doc = document.documentElement;
|
2015-02-01 19:31:18 +09:00
|
|
|
var support = !!(doc.requestFullscreen || doc.mozRequestFullScreen ||
|
|
|
|
doc.webkitRequestFullScreen || doc.msRequestFullscreen);
|
2012-11-10 22:59:25 +09:00
|
|
|
|
2013-06-06 01:01:09 +09:00
|
|
|
if (document.fullscreenEnabled === false ||
|
|
|
|
document.mozFullScreenEnabled === false ||
|
2013-09-11 04:40:14 +09:00
|
|
|
document.webkitFullscreenEnabled === false ||
|
|
|
|
document.msFullscreenEnabled === false) {
|
2012-11-10 22:59:25 +09:00
|
|
|
support = false;
|
2013-03-02 05:54:02 +09:00
|
|
|
}
|
2016-04-29 23:34:07 +09:00
|
|
|
//#endif
|
2016-03-29 06:44:27 +09:00
|
|
|
if (support && pdfjsLib.PDFJS.disableFullscreen === true) {
|
2014-12-03 23:38:25 +09:00
|
|
|
support = false;
|
|
|
|
}
|
2012-11-10 22:59:25 +09:00
|
|
|
|
2016-03-29 06:44:27 +09:00
|
|
|
return pdfjsLib.shadow(this, 'supportsFullscreen', support);
|
2012-07-31 00:12:49 +09:00
|
|
|
},
|
|
|
|
|
2012-10-06 05:59:13 +09:00
|
|
|
get supportsIntegratedFind() {
|
2016-04-14 06:21:05 +09:00
|
|
|
return this.externalServices.supportsIntegratedFind;
|
2012-10-06 05:59:13 +09:00
|
|
|
},
|
|
|
|
|
2012-12-01 07:59:51 +09:00
|
|
|
get supportsDocumentFonts() {
|
2016-04-14 06:21:05 +09:00
|
|
|
return this.externalServices.supportsDocumentFonts;
|
2012-12-01 07:59:51 +09:00
|
|
|
},
|
|
|
|
|
2013-04-04 01:49:03 +09:00
|
|
|
get supportsDocumentColors() {
|
2016-04-14 06:21:05 +09:00
|
|
|
return this.externalServices.supportsDocumentColors;
|
2013-04-04 01:49:03 +09:00
|
|
|
},
|
|
|
|
|
2013-07-19 01:28:59 +09:00
|
|
|
get loadingBar() {
|
|
|
|
var bar = new ProgressBar('#loadingBar', {});
|
2015-02-01 06:43:30 +09:00
|
|
|
|
2016-03-29 06:44:27 +09:00
|
|
|
return pdfjsLib.shadow(this, 'loadingBar', bar);
|
2013-07-19 01:28:59 +09:00
|
|
|
},
|
|
|
|
|
2015-06-02 20:17:02 +09:00
|
|
|
get supportedMouseWheelZoomModifierKeys() {
|
2016-04-14 06:21:05 +09:00
|
|
|
return this.externalServices.supportedMouseWheelZoomModifierKeys;
|
2015-06-02 20:17:02 +09:00
|
|
|
},
|
|
|
|
|
2016-04-16 00:02:14 +09:00
|
|
|
//#if (FIREFOX || MOZCENTRAL || CHROME)
|
2012-08-01 02:21:07 +09:00
|
|
|
initPassiveLoading: function pdfViewInitPassiveLoading() {
|
2016-04-14 06:21:05 +09:00
|
|
|
this.externalServices.initPassiveLoading({
|
|
|
|
onOpenWithTransport: function (url, length, transport) {
|
|
|
|
PDFViewerApplication.open(url, {range: transport});
|
2013-02-07 08:19:29 +09:00
|
|
|
|
2016-04-14 06:21:05 +09:00
|
|
|
if (length) {
|
|
|
|
PDFViewerApplication.pdfDocumentProperties.setFileSize(length);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
onOpenWithData: function (data) {
|
|
|
|
PDFViewerApplication.open(data);
|
|
|
|
},
|
2016-04-16 00:02:14 +09:00
|
|
|
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);
|
|
|
|
},
|
2016-04-14 06:21:05 +09:00
|
|
|
onError: function (e) {
|
|
|
|
PDFViewerApplication.error(mozL10n.get('loading_error', null,
|
|
|
|
'An error occurred while loading the PDF.'), e);
|
|
|
|
},
|
|
|
|
onProgress: function (loaded, total) {
|
|
|
|
PDFViewerApplication.progress(loaded / total);
|
2012-08-01 02:21:07 +09:00
|
|
|
}
|
|
|
|
});
|
|
|
|
},
|
2014-01-26 20:55:48 +09:00
|
|
|
//#endif
|
2012-08-01 02:21:07 +09:00
|
|
|
|
|
|
|
setTitleUsingUrl: function pdfViewSetTitleUsingUrl(url) {
|
|
|
|
this.url = url;
|
2012-08-27 08:49:07 +09:00
|
|
|
try {
|
2016-03-29 06:44:27 +09:00
|
|
|
this.setTitle(decodeURIComponent(
|
|
|
|
pdfjsLib.getFilenameFromUrl(url)) || url);
|
2012-08-27 16:02:10 +09:00
|
|
|
} catch (e) {
|
|
|
|
// decodeURIComponent may throw URIError,
|
|
|
|
// fall back to using the unprocessed url in that case
|
2012-11-29 04:02:56 +09:00
|
|
|
this.setTitle(url);
|
2012-08-27 08:49:07 +09:00
|
|
|
}
|
2012-08-01 02:21:07 +09:00
|
|
|
},
|
|
|
|
|
2012-11-29 04:02:56 +09:00
|
|
|
setTitle: function pdfViewSetTitle(title) {
|
2015-03-06 12:36:08 +09:00
|
|
|
if (this.isViewerEmbedded) {
|
|
|
|
// Embedded PDF viewers should not be changing their parent page's title.
|
|
|
|
return;
|
|
|
|
}
|
2012-11-29 04:02:56 +09:00
|
|
|
document.title = title;
|
|
|
|
},
|
|
|
|
|
2015-10-23 22:49:02 +09:00
|
|
|
/**
|
|
|
|
* Closes opened PDF document.
|
|
|
|
* @returns {Promise} - Returns the promise, which is resolved when all
|
|
|
|
* destruction is completed.
|
|
|
|
*/
|
2014-03-27 05:18:53 +09:00
|
|
|
close: function pdfViewClose() {
|
2016-04-22 01:39:11 +09:00
|
|
|
var errorWrapper = this.appConfig.errorWrapper.container;
|
2014-04-15 19:00:46 +09:00
|
|
|
errorWrapper.setAttribute('hidden', 'true');
|
|
|
|
|
2015-10-23 22:49:02 +09:00
|
|
|
if (!this.pdfLoadingTask) {
|
|
|
|
return Promise.resolve();
|
2014-03-27 05:18:53 +09:00
|
|
|
}
|
|
|
|
|
2015-10-23 22:49:02 +09:00
|
|
|
var promise = this.pdfLoadingTask.destroy();
|
|
|
|
this.pdfLoadingTask = null;
|
|
|
|
|
|
|
|
if (this.pdfDocument) {
|
|
|
|
this.pdfDocument = null;
|
2014-03-27 05:18:53 +09:00
|
|
|
|
2015-10-23 22:49:02 +09:00
|
|
|
this.pdfThumbnailViewer.setDocument(null);
|
|
|
|
this.pdfViewer.setDocument(null);
|
|
|
|
this.pdfLinkService.setDocument(null, null);
|
|
|
|
}
|
2016-03-12 21:07:43 +09:00
|
|
|
this.store = null;
|
|
|
|
this.isInitialViewSet = false;
|
2014-03-27 05:18:53 +09:00
|
|
|
|
2016-02-22 01:54:23 +09:00
|
|
|
this.pdfSidebar.reset();
|
2016-02-21 21:36:24 +09:00
|
|
|
this.pdfOutlineViewer.reset();
|
|
|
|
this.pdfAttachmentViewer.reset();
|
|
|
|
|
2016-02-27 02:06:59 +09:00
|
|
|
this.findController.reset();
|
2016-02-27 02:22:08 +09:00
|
|
|
this.findBar.reset();
|
2016-02-27 02:06:59 +09:00
|
|
|
|
2014-03-27 05:18:53 +09:00
|
|
|
if (typeof PDFBug !== 'undefined') {
|
|
|
|
PDFBug.cleanup();
|
|
|
|
}
|
2015-10-23 22:49:02 +09:00
|
|
|
return promise;
|
2014-03-27 05:18:53 +09:00
|
|
|
},
|
|
|
|
|
2015-10-23 22:49:02 +09:00
|
|
|
/**
|
|
|
|
* Opens PDF document specified by URL or array with additional arguments.
|
|
|
|
* @param {string|TypedArray|ArrayBuffer} file - PDF location or binary data.
|
|
|
|
* @param {Object} args - (optional) Additional arguments for the getDocument
|
|
|
|
* call, e.g. HTTP headers ('httpHeaders') or
|
|
|
|
* alternative data transport ('range').
|
|
|
|
* @returns {Promise} - Returns the promise, which is resolved when document
|
|
|
|
* is opened.
|
|
|
|
*/
|
|
|
|
open: function pdfViewOpen(file, args) {
|
2016-07-02 18:03:00 +09:00
|
|
|
//#if GENERIC
|
2015-10-23 22:49:02 +09:00
|
|
|
if (arguments.length > 2 || typeof args === 'number') {
|
2016-07-02 18:03:00 +09:00
|
|
|
return Promise.reject(
|
|
|
|
new Error('Call of open() with obsolete signature.'));
|
2015-10-23 22:49:02 +09:00
|
|
|
}
|
2016-07-02 18:03:00 +09:00
|
|
|
//#endif
|
2015-10-23 22:49:02 +09:00
|
|
|
if (this.pdfLoadingTask) {
|
|
|
|
// We need to destroy already opened document.
|
|
|
|
return this.close().then(function () {
|
|
|
|
// Reload the preferences if a document was previously opened.
|
|
|
|
Preferences.reload();
|
|
|
|
// ... and repeat the open() call.
|
|
|
|
return this.open(file, args);
|
|
|
|
}.bind(this));
|
2014-03-27 05:18:53 +09:00
|
|
|
}
|
|
|
|
|
2016-07-02 18:03:00 +09:00
|
|
|
var parameters = Object.create(null), scale;
|
2014-09-10 15:17:19 +09:00
|
|
|
if (typeof file === 'string') { // URL
|
|
|
|
this.setTitleUsingUrl(file);
|
|
|
|
parameters.url = file;
|
|
|
|
} else if (file && 'byteLength' in file) { // ArrayBuffer
|
|
|
|
parameters.data = file;
|
|
|
|
} else if (file.url && file.originalUrl) {
|
|
|
|
this.setTitleUsingUrl(file.originalUrl);
|
|
|
|
parameters.url = file.url;
|
2012-05-15 03:45:07 +09:00
|
|
|
}
|
2013-02-07 08:19:29 +09:00
|
|
|
if (args) {
|
|
|
|
for (var prop in args) {
|
|
|
|
parameters[prop] = args[prop];
|
|
|
|
}
|
2016-07-02 18:03:00 +09:00
|
|
|
|
|
|
|
if (args.scale) {
|
|
|
|
scale = args.scale;
|
|
|
|
}
|
|
|
|
if (args.length) {
|
|
|
|
this.pdfDocumentProperties.setFileSize(args.length);
|
|
|
|
}
|
2013-02-07 08:19:29 +09:00
|
|
|
}
|
2011-07-29 02:48:05 +09:00
|
|
|
|
2011-10-20 05:14:34 +09:00
|
|
|
var self = this;
|
2014-03-14 12:23:47 +09:00
|
|
|
self.downloadComplete = false;
|
|
|
|
|
2016-03-29 06:44:27 +09:00
|
|
|
var loadingTask = pdfjsLib.getDocument(parameters);
|
2015-10-23 22:49:02 +09:00
|
|
|
this.pdfLoadingTask = loadingTask;
|
2015-10-21 22:54:31 +09:00
|
|
|
|
2016-04-19 06:59:46 +09:00
|
|
|
loadingTask.onPassword = function passwordNeeded(updateCallback, reason) {
|
|
|
|
self.passwordPrompt.setUpdateCallback(updateCallback, reason);
|
|
|
|
self.passwordPrompt.open();
|
2013-05-10 07:35:23 +09:00
|
|
|
};
|
|
|
|
|
2015-10-21 22:54:31 +09:00
|
|
|
loadingTask.onProgress = function getDocumentProgress(progressData) {
|
2013-06-06 04:28:31 +09:00
|
|
|
self.progress(progressData.loaded / progressData.total);
|
2015-10-21 22:54:31 +09:00
|
|
|
};
|
2013-06-06 04:28:31 +09:00
|
|
|
|
2015-12-01 05:42:47 +09:00
|
|
|
// Listen for unsupported features to trigger the fallback UI.
|
|
|
|
loadingTask.onUnsupportedFeature = this.fallback.bind(this);
|
|
|
|
|
2016-07-02 18:03:00 +09:00
|
|
|
return loadingTask.promise.then(
|
2012-04-10 14:20:57 +09:00
|
|
|
function getDocumentCallback(pdfDocument) {
|
|
|
|
self.load(pdfDocument, scale);
|
2011-09-28 20:21:07 +09:00
|
|
|
},
|
2014-08-23 23:03:49 +09:00
|
|
|
function getDocumentError(exception) {
|
2014-09-09 05:32:14 +09:00
|
|
|
var message = exception && exception.message;
|
2012-10-16 19:10:37 +09:00
|
|
|
var loadingErrorMessage = mozL10n.get('loading_error', null,
|
|
|
|
'An error occurred while loading the PDF.');
|
|
|
|
|
2016-03-29 06:44:27 +09:00
|
|
|
if (exception instanceof pdfjsLib.InvalidPDFException) {
|
2012-10-16 19:10:37 +09:00
|
|
|
// change error message also for other builds
|
2014-04-08 05:34:03 +09:00
|
|
|
loadingErrorMessage = mozL10n.get('invalid_file_error', null,
|
2014-08-23 23:03:49 +09:00
|
|
|
'Invalid or corrupted PDF file.');
|
2016-03-29 06:44:27 +09:00
|
|
|
} else if (exception instanceof pdfjsLib.MissingPDFException) {
|
2013-01-30 03:13:28 +09:00
|
|
|
// special message for missing PDF's
|
2014-04-08 05:34:03 +09:00
|
|
|
loadingErrorMessage = mozL10n.get('missing_file_error', null,
|
2014-08-23 23:03:49 +09:00
|
|
|
'Missing PDF file.');
|
2016-03-29 06:44:27 +09:00
|
|
|
} else if (exception instanceof pdfjsLib.UnexpectedResponseException) {
|
2014-09-13 23:47:16 +09:00
|
|
|
loadingErrorMessage = mozL10n.get('unexpected_response_error', null,
|
|
|
|
'Unexpected server response.');
|
|
|
|
}
|
2013-01-30 03:13:28 +09:00
|
|
|
|
2012-04-10 14:20:57 +09:00
|
|
|
var moreInfo = {
|
|
|
|
message: message
|
|
|
|
};
|
2012-10-16 19:10:37 +09:00
|
|
|
self.error(loadingErrorMessage, moreInfo);
|
2015-10-23 22:49:02 +09:00
|
|
|
|
|
|
|
throw new Error(loadingErrorMessage);
|
2012-04-10 14:20:57 +09:00
|
|
|
}
|
|
|
|
);
|
2011-07-29 02:48:05 +09:00
|
|
|
},
|
|
|
|
|
2011-10-19 13:29:14 +09:00
|
|
|
download: function pdfViewDownload() {
|
2014-03-14 12:23:47 +09:00
|
|
|
function downloadByUrl() {
|
2013-07-13 03:14:13 +09:00
|
|
|
downloadManager.downloadUrl(url, filename);
|
2013-03-25 02:25:57 +09:00
|
|
|
}
|
2013-07-13 03:14:13 +09:00
|
|
|
|
|
|
|
var url = this.url.split('#')[0];
|
|
|
|
var filename = getPDFFileNameFromURL(url);
|
2016-04-14 06:21:05 +09:00
|
|
|
var downloadManager = this.downloadManager;
|
2013-07-13 03:14:13 +09:00
|
|
|
downloadManager.onerror = function (err) {
|
|
|
|
// This error won't really be helpful because it's likely the
|
|
|
|
// fallback won't work either (or is already open).
|
2014-09-22 20:41:17 +09:00
|
|
|
PDFViewerApplication.error('PDF failed to download.');
|
2013-07-13 03:14:13 +09:00
|
|
|
};
|
|
|
|
|
|
|
|
if (!this.pdfDocument) { // the PDF is not ready yet
|
2014-03-14 12:23:47 +09:00
|
|
|
downloadByUrl();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!this.downloadComplete) { // the PDF is still downloading
|
|
|
|
downloadByUrl();
|
2013-07-13 03:14:13 +09:00
|
|
|
return;
|
2013-07-03 00:15:32 +09:00
|
|
|
}
|
2013-07-13 03:14:13 +09:00
|
|
|
|
2013-07-03 00:15:32 +09:00
|
|
|
this.pdfDocument.getData().then(
|
|
|
|
function getDataSuccess(data) {
|
2016-03-29 06:44:27 +09:00
|
|
|
var blob = pdfjsLib.createBlob(data, 'application/pdf');
|
2013-07-13 03:14:13 +09:00
|
|
|
downloadManager.download(blob, url, filename);
|
2013-07-03 00:15:32 +09:00
|
|
|
},
|
2014-03-14 12:23:47 +09:00
|
|
|
downloadByUrl // Error occurred try downloading with just the url.
|
|
|
|
).then(null, downloadByUrl);
|
2011-10-19 13:29:14 +09:00
|
|
|
},
|
|
|
|
|
2014-01-04 02:34:13 +09:00
|
|
|
fallback: function pdfViewFallback(featureId) {
|
2015-04-30 02:09:58 +09:00
|
|
|
//#if !PRODUCTION
|
|
|
|
if (true) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
//#endif
|
|
|
|
//#if (FIREFOX || MOZCENTRAL)
|
2015-04-26 08:49:37 +09:00
|
|
|
// Only trigger the fallback once so we don't spam the user with messages
|
|
|
|
// for one PDF.
|
|
|
|
if (this.fellback) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.fellback = true;
|
|
|
|
var url = this.url.split('#')[0];
|
2016-04-14 06:21:05 +09:00
|
|
|
this.externalServices.fallback({ featureId: featureId, url: url },
|
2015-04-26 08:49:37 +09:00
|
|
|
function response(download) {
|
|
|
|
if (!download) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
PDFViewerApplication.download();
|
|
|
|
});
|
2012-08-02 03:29:13 +09:00
|
|
|
//#endif
|
2012-05-11 07:54:58 +09:00
|
|
|
},
|
|
|
|
|
2011-11-30 04:28:05 +09:00
|
|
|
/**
|
|
|
|
* Show the error box.
|
|
|
|
* @param {String} message A message that is human readable.
|
|
|
|
* @param {Object} moreInfo (optional) Further information about the error
|
|
|
|
* that is more technical. Should have a 'message'
|
|
|
|
* and optionally a 'stack' property.
|
|
|
|
*/
|
|
|
|
error: function pdfViewError(message, moreInfo) {
|
2013-01-05 02:01:31 +09:00
|
|
|
var moreInfoText = mozL10n.get('error_version_info',
|
2016-03-29 06:44:27 +09:00
|
|
|
{version: pdfjsLib.version || '?', build: pdfjsLib.build || '?'},
|
2013-01-05 02:01:31 +09:00
|
|
|
'PDF.js v{{version}} (build: {{build}})') + '\n';
|
2012-05-15 09:19:09 +09:00
|
|
|
if (moreInfo) {
|
|
|
|
moreInfoText +=
|
|
|
|
mozL10n.get('error_message', {message: moreInfo.message},
|
|
|
|
'Message: {{message}}');
|
|
|
|
if (moreInfo.stack) {
|
|
|
|
moreInfoText += '\n' +
|
|
|
|
mozL10n.get('error_stack', {stack: moreInfo.stack},
|
|
|
|
'Stack: {{stack}}');
|
|
|
|
} else {
|
|
|
|
if (moreInfo.filename) {
|
|
|
|
moreInfoText += '\n' +
|
|
|
|
mozL10n.get('error_file', {file: moreInfo.filename},
|
|
|
|
'File: {{file}}');
|
|
|
|
}
|
|
|
|
if (moreInfo.lineNumber) {
|
|
|
|
moreInfoText += '\n' +
|
|
|
|
mozL10n.get('error_line', {line: moreInfo.lineNumber},
|
|
|
|
'Line: {{line}}');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2012-08-23 00:48:56 +09:00
|
|
|
|
2012-08-02 03:29:13 +09:00
|
|
|
//#if !(FIREFOX || MOZCENTRAL)
|
2016-04-22 01:39:11 +09:00
|
|
|
var errorWrapperConfig = this.appConfig.errorWrapper;
|
|
|
|
var errorWrapper = errorWrapperConfig.container;
|
2011-11-29 09:55:09 +09:00
|
|
|
errorWrapper.removeAttribute('hidden');
|
|
|
|
|
2016-04-22 01:39:11 +09:00
|
|
|
var errorMessage = errorWrapperConfig.errorMessage;
|
2012-01-21 07:48:57 +09:00
|
|
|
errorMessage.textContent = message;
|
2011-11-29 09:55:09 +09:00
|
|
|
|
2016-04-22 01:39:11 +09:00
|
|
|
var closeButton = errorWrapperConfig.closeButton;
|
2011-11-30 04:28:05 +09:00
|
|
|
closeButton.onclick = function() {
|
|
|
|
errorWrapper.setAttribute('hidden', 'true');
|
|
|
|
};
|
|
|
|
|
2016-04-22 01:39:11 +09:00
|
|
|
var errorMoreInfo = errorWrapperConfig.errorMoreInfo;
|
|
|
|
var moreInfoButton = errorWrapperConfig.moreInfoButton;
|
|
|
|
var lessInfoButton = errorWrapperConfig.lessInfoButton;
|
2011-11-30 04:28:05 +09:00
|
|
|
moreInfoButton.onclick = function() {
|
|
|
|
errorMoreInfo.removeAttribute('hidden');
|
|
|
|
moreInfoButton.setAttribute('hidden', 'true');
|
|
|
|
lessInfoButton.removeAttribute('hidden');
|
2013-07-18 07:40:15 +09:00
|
|
|
errorMoreInfo.style.height = errorMoreInfo.scrollHeight + 'px';
|
2011-11-30 04:28:05 +09:00
|
|
|
};
|
|
|
|
lessInfoButton.onclick = function() {
|
|
|
|
errorMoreInfo.setAttribute('hidden', 'true');
|
2011-11-29 09:55:09 +09:00
|
|
|
moreInfoButton.removeAttribute('hidden');
|
2011-11-30 04:28:05 +09:00
|
|
|
lessInfoButton.setAttribute('hidden', 'true');
|
|
|
|
};
|
2013-07-31 06:36:45 +09:00
|
|
|
moreInfoButton.oncontextmenu = noContextMenuHandler;
|
|
|
|
lessInfoButton.oncontextmenu = noContextMenuHandler;
|
|
|
|
closeButton.oncontextmenu = noContextMenuHandler;
|
2011-11-30 04:28:05 +09:00
|
|
|
moreInfoButton.removeAttribute('hidden');
|
|
|
|
lessInfoButton.setAttribute('hidden', 'true');
|
2012-05-15 09:19:09 +09:00
|
|
|
errorMoreInfo.value = moreInfoText;
|
2012-08-02 03:29:13 +09:00
|
|
|
//#else
|
|
|
|
// console.error(message + '\n' + moreInfoText);
|
|
|
|
// this.fallback();
|
|
|
|
//#endif
|
2011-09-28 19:53:53 +09:00
|
|
|
},
|
|
|
|
|
2011-10-05 04:21:40 +09:00
|
|
|
progress: function pdfViewProgress(level) {
|
2011-09-28 19:53:53 +09:00
|
|
|
var percent = Math.round(level * 100);
|
2013-04-24 02:00:31 +09:00
|
|
|
// When we transition from full request to range requests, it's possible
|
|
|
|
// that we discard some of the loaded data. This can cause the loading
|
|
|
|
// bar to move backwards. So prevent this by only updating the bar if it
|
|
|
|
// increases.
|
2014-09-22 20:41:17 +09:00
|
|
|
if (percent > this.loadingBar.percent || isNaN(percent)) {
|
|
|
|
this.loadingBar.percent = percent;
|
2014-08-17 08:06:03 +09:00
|
|
|
|
|
|
|
// When disableAutoFetch is enabled, it's not uncommon for the entire file
|
|
|
|
// to never be fetched (depends on e.g. the file structure). In this case
|
|
|
|
// the loading bar will not be completely filled, nor will it be hidden.
|
|
|
|
// To prevent displaying a partially filled loading bar permanently, we
|
|
|
|
// hide it when no data has been loaded during a certain amount of time.
|
2016-03-29 06:44:27 +09:00
|
|
|
if (pdfjsLib.PDFJS.disableAutoFetch && percent) {
|
2014-08-17 08:06:03 +09:00
|
|
|
if (this.disableAutoFetchLoadingBarTimeout) {
|
|
|
|
clearTimeout(this.disableAutoFetchLoadingBarTimeout);
|
|
|
|
this.disableAutoFetchLoadingBarTimeout = null;
|
|
|
|
}
|
|
|
|
this.loadingBar.show();
|
|
|
|
|
|
|
|
this.disableAutoFetchLoadingBarTimeout = setTimeout(function () {
|
|
|
|
this.loadingBar.hide();
|
|
|
|
this.disableAutoFetchLoadingBarTimeout = null;
|
|
|
|
}.bind(this), DISABLE_AUTO_FETCH_LOADING_BAR_TIMEOUT);
|
|
|
|
}
|
2013-04-24 02:00:31 +09:00
|
|
|
}
|
2011-09-28 19:53:53 +09:00
|
|
|
},
|
|
|
|
|
2012-04-10 14:20:57 +09:00
|
|
|
load: function pdfViewLoad(pdfDocument, scale) {
|
2013-11-27 06:55:50 +09:00
|
|
|
var self = this;
|
2014-09-21 02:15:18 +09:00
|
|
|
scale = scale || UNKNOWN_SCALE;
|
2011-11-25 03:53:11 +09:00
|
|
|
|
2012-06-02 06:17:09 +09:00
|
|
|
this.pdfDocument = pdfDocument;
|
|
|
|
|
2015-04-25 04:01:03 +09:00
|
|
|
this.pdfDocumentProperties.setDocumentAndUrl(pdfDocument, this.url);
|
2014-04-01 06:12:48 +09:00
|
|
|
|
2014-04-14 11:07:36 +09:00
|
|
|
var downloadedPromise = pdfDocument.getDownloadInfo().then(function() {
|
2014-03-14 12:23:47 +09:00
|
|
|
self.downloadComplete = true;
|
2014-09-22 20:41:17 +09:00
|
|
|
self.loadingBar.hide();
|
2013-02-07 08:19:29 +09:00
|
|
|
});
|
2011-09-28 19:53:53 +09:00
|
|
|
|
2016-06-27 19:32:28 +09:00
|
|
|
this._updateUIToolbar({
|
|
|
|
resetNumPages: true,
|
|
|
|
});
|
2012-10-11 02:26:41 +09:00
|
|
|
|
2014-07-18 20:53:04 +09:00
|
|
|
var id = this.documentFingerprint = pdfDocument.fingerprint;
|
2014-09-22 20:41:17 +09:00
|
|
|
var store = this.store = new ViewHistory(id);
|
2011-07-29 02:48:05 +09:00
|
|
|
|
2015-06-20 00:53:03 +09:00
|
|
|
//#if GENERIC
|
2015-04-28 00:25:32 +09:00
|
|
|
var baseDocumentUrl = null;
|
|
|
|
//#endif
|
|
|
|
//#if (FIREFOX || MOZCENTRAL)
|
|
|
|
// var baseDocumentUrl = this.url.split('#')[0];
|
|
|
|
//#endif
|
|
|
|
//#if CHROME
|
|
|
|
// var baseDocumentUrl = location.href.split('#')[0];
|
|
|
|
//#endif
|
|
|
|
this.pdfLinkService.setDocument(pdfDocument, baseDocumentUrl);
|
|
|
|
|
2014-09-15 23:49:24 +09:00
|
|
|
var pdfViewer = this.pdfViewer;
|
|
|
|
pdfViewer.currentScale = scale;
|
|
|
|
pdfViewer.setDocument(pdfDocument);
|
|
|
|
var firstPagePromise = pdfViewer.firstPagePromise;
|
|
|
|
var pagesPromise = pdfViewer.pagesPromise;
|
[api-minor] Let `LinkAnnotation`/`PDFLinkService_getDestinationHash` return a stringified version of the destination array for explicit destinations
Currently for explicit destinations, compared to named destinations, we manually try to build a hash that often times is a quite poor representation of the *actual* destination. (Currently this only, kind of, works for `\XYZ` destinations.)
For PDF files using explicit destinations, this can make it difficult/impossible to obtain a link to a specific section of the document through the URL.
Note that in practice most PDF files, especially newer ones, use named destinations and these are thus unnaffected by this patch.
This patch also fixes an existing issue in `PDFLinkService_getDestinationHash`, where a named destination consisting of only a number would not be handled correctly.
With the added, and already existing, type checks in place for destinations, I really don't think that this patch exposes any "sensitive" internal destination code not already accessible through normal hash parameters.
*Please note:* Just trying to improve the algorithm that generates the hash is unfortunately not possible in general, since there are a number of cases where it will simply never work well.
- First of all, note that `getDestinationHash` currently relies on the `_pagesRefCache`, hence it's possible that the hash returned is empty during e.g. ranged/streamed loading of a PDF file.
- Second of all, the currently computed hash is actually dependent on the document rotation. With named destinations, the fetched internal destination array is rotational invariant (as it should be), but this will not hold in general for the hash. We can easily avoid this issue by using a stringified destination array.
- Third of all, note that according to the PDF specification[1], `GoToR` destinations may actually contain explicit destination arrays. Since we cannot really construct a hash in `annotation.js`, we currently have no good way to support those. Even though this case seems *very* rare in practice (I've not actually seen such a PDF file), it's in the specification, and this patch allows us to support that for "free".
---
[1] http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf#G11.1951685
2016-05-15 19:12:47 +09:00
|
|
|
var onePageRendered = pdfViewer.onePageRendered;
|
2012-09-08 08:05:14 +09:00
|
|
|
|
2014-09-15 23:49:24 +09:00
|
|
|
this.pageRotation = 0;
|
2013-03-09 11:08:37 +09:00
|
|
|
|
2014-09-15 23:49:24 +09:00
|
|
|
this.pdfThumbnailViewer.setDocument(pdfDocument);
|
2012-04-10 14:20:57 +09:00
|
|
|
|
2013-03-09 11:08:37 +09:00
|
|
|
firstPagePromise.then(function(pdfPage) {
|
2014-04-14 11:07:36 +09:00
|
|
|
downloadedPromise.then(function () {
|
2016-04-26 07:57:15 +09:00
|
|
|
self.eventBus.dispatch('documentload', {source: self});
|
2014-04-14 11:07:36 +09:00
|
|
|
});
|
2013-03-09 11:08:37 +09:00
|
|
|
|
2016-04-22 01:39:11 +09:00
|
|
|
self.loadingBar.setWidth(self.appConfig.viewerContainer);
|
2013-07-19 01:28:59 +09:00
|
|
|
|
2016-03-29 06:44:27 +09:00
|
|
|
if (!pdfjsLib.PDFJS.disableHistory && !self.isViewerEmbedded) {
|
2014-09-22 20:41:17 +09:00
|
|
|
// The browsing history is only enabled when the viewer is standalone,
|
|
|
|
// i.e. not when it is embedded in a web page.
|
2015-03-10 23:22:32 +09:00
|
|
|
if (!self.preferenceShowPreviousViewOnLoad) {
|
2015-06-16 20:16:12 +09:00
|
|
|
self.pdfHistory.clearHistoryState();
|
2015-04-01 00:14:08 +09:00
|
|
|
}
|
2015-04-27 23:04:11 +09:00
|
|
|
self.pdfHistory.initialize(self.documentFingerprint);
|
2015-06-04 20:58:45 +09:00
|
|
|
|
|
|
|
if (self.pdfHistory.initialDestination) {
|
|
|
|
self.initialDestination = self.pdfHistory.initialDestination;
|
|
|
|
} else if (self.pdfHistory.initialBookmark) {
|
|
|
|
self.initialBookmark = self.pdfHistory.initialBookmark;
|
|
|
|
}
|
2014-09-22 20:41:17 +09:00
|
|
|
}
|
2013-03-09 11:08:37 +09:00
|
|
|
|
For documents with different page sizes, ensure that the correct page becomes visible on load when e.g. the 'page' hash parameter was provided (bug 1191279, issue 6393)
This issue is actually, in a sense, "caused" by the fact that the API/viewer supports partial loading/rendering. Previously when the *entire* document was always fetched before rendering begun, we knew all page sizes in advance and this issue didn't exist.
Now we use the size of *one* page in order to set the initial size of every page, until we've fetched the pages and thus know their correct sizes.
This means that during loading the size of the pages can change, which may cause the initial position to become scrolled out of view.
The most naive solution to this problem would perhaps be to delay setting the initial position on load for all documents, until all pages are fetched. However I think that would be a *really* bad idea, since doing so would make the initial rendering slower and make it feel sluggish for most documents.
Since there is generally no way of knowing if a document has different sized pages prior to loading it, we can only check once the pages are available.
Hence this patch, which treats documents with different sized pages as a special case, by re-applying the initial position when all pages have become available.
2015-08-06 00:35:41 +09:00
|
|
|
var initialParams = {
|
|
|
|
destination: self.initialDestination,
|
|
|
|
bookmark: self.initialBookmark,
|
|
|
|
hash: null,
|
|
|
|
};
|
|
|
|
|
2015-04-01 01:17:56 +09:00
|
|
|
store.initializedPromise.then(function resolved() {
|
2016-04-13 22:28:53 +09:00
|
|
|
var storedHash = null, sidebarView = null;
|
2015-04-01 01:17:56 +09:00
|
|
|
if (self.preferenceShowPreviousViewOnLoad &&
|
|
|
|
store.get('exists', false)) {
|
|
|
|
var pageNum = store.get('page', '1');
|
|
|
|
var zoom = self.preferenceDefaultZoomValue ||
|
2015-07-23 06:58:30 +09:00
|
|
|
store.get('zoom', DEFAULT_SCALE_VALUE);
|
2015-04-01 01:17:56 +09:00
|
|
|
var left = store.get('scrollLeft', '0');
|
|
|
|
var top = store.get('scrollTop', '0');
|
|
|
|
|
|
|
|
storedHash = 'page=' + pageNum + '&zoom=' + zoom + ',' +
|
|
|
|
left + ',' + top;
|
2016-04-13 22:28:53 +09:00
|
|
|
|
|
|
|
sidebarView = store.get('sidebarView', SidebarView.NONE);
|
2015-04-01 01:17:56 +09:00
|
|
|
} else if (self.preferenceDefaultZoomValue) {
|
|
|
|
storedHash = 'page=1&zoom=' + self.preferenceDefaultZoomValue;
|
|
|
|
}
|
2016-04-13 22:28:53 +09:00
|
|
|
self.setInitialView(storedHash,
|
|
|
|
{ scale: scale, sidebarView: sidebarView });
|
2013-04-30 23:44:51 +09:00
|
|
|
|
For documents with different page sizes, ensure that the correct page becomes visible on load when e.g. the 'page' hash parameter was provided (bug 1191279, issue 6393)
This issue is actually, in a sense, "caused" by the fact that the API/viewer supports partial loading/rendering. Previously when the *entire* document was always fetched before rendering begun, we knew all page sizes in advance and this issue didn't exist.
Now we use the size of *one* page in order to set the initial size of every page, until we've fetched the pages and thus know their correct sizes.
This means that during loading the size of the pages can change, which may cause the initial position to become scrolled out of view.
The most naive solution to this problem would perhaps be to delay setting the initial position on load for all documents, until all pages are fetched. However I think that would be a *really* bad idea, since doing so would make the initial rendering slower and make it feel sluggish for most documents.
Since there is generally no way of knowing if a document has different sized pages prior to loading it, we can only check once the pages are available.
Hence this patch, which treats documents with different sized pages as a special case, by re-applying the initial position when all pages have become available.
2015-08-06 00:35:41 +09:00
|
|
|
initialParams.hash = storedHash;
|
|
|
|
|
2015-04-01 01:17:56 +09:00
|
|
|
// Make all navigation keys work on document load,
|
|
|
|
// unless the viewer is embedded in a web page.
|
|
|
|
if (!self.isViewerEmbedded) {
|
|
|
|
self.pdfViewer.focus();
|
|
|
|
}
|
|
|
|
}, function rejected(reason) {
|
|
|
|
console.error(reason);
|
2016-04-13 22:28:53 +09:00
|
|
|
self.setInitialView(null, { scale: scale });
|
2014-03-17 06:33:39 +09:00
|
|
|
});
|
For documents with different page sizes, ensure that the correct page becomes visible on load when e.g. the 'page' hash parameter was provided (bug 1191279, issue 6393)
This issue is actually, in a sense, "caused" by the fact that the API/viewer supports partial loading/rendering. Previously when the *entire* document was always fetched before rendering begun, we knew all page sizes in advance and this issue didn't exist.
Now we use the size of *one* page in order to set the initial size of every page, until we've fetched the pages and thus know their correct sizes.
This means that during loading the size of the pages can change, which may cause the initial position to become scrolled out of view.
The most naive solution to this problem would perhaps be to delay setting the initial position on load for all documents, until all pages are fetched. However I think that would be a *really* bad idea, since doing so would make the initial rendering slower and make it feel sluggish for most documents.
Since there is generally no way of knowing if a document has different sized pages prior to loading it, we can only check once the pages are available.
Hence this patch, which treats documents with different sized pages as a special case, by re-applying the initial position when all pages have become available.
2015-08-06 00:35:41 +09:00
|
|
|
|
|
|
|
// For documents with different page sizes,
|
|
|
|
// ensure that the correct location becomes visible on load.
|
|
|
|
pagesPromise.then(function resolved() {
|
|
|
|
if (!initialParams.destination && !initialParams.bookmark &&
|
|
|
|
!initialParams.hash) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (self.hasEqualPageSizes) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
self.initialDestination = initialParams.destination;
|
|
|
|
self.initialBookmark = initialParams.bookmark;
|
|
|
|
|
|
|
|
self.pdfViewer.currentScaleValue = self.pdfViewer.currentScaleValue;
|
2016-03-12 21:07:43 +09:00
|
|
|
self.setInitialView(initialParams.hash);
|
For documents with different page sizes, ensure that the correct page becomes visible on load when e.g. the 'page' hash parameter was provided (bug 1191279, issue 6393)
This issue is actually, in a sense, "caused" by the fact that the API/viewer supports partial loading/rendering. Previously when the *entire* document was always fetched before rendering begun, we knew all page sizes in advance and this issue didn't exist.
Now we use the size of *one* page in order to set the initial size of every page, until we've fetched the pages and thus know their correct sizes.
This means that during loading the size of the pages can change, which may cause the initial position to become scrolled out of view.
The most naive solution to this problem would perhaps be to delay setting the initial position on load for all documents, until all pages are fetched. However I think that would be a *really* bad idea, since doing so would make the initial rendering slower and make it feel sluggish for most documents.
Since there is generally no way of knowing if a document has different sized pages prior to loading it, we can only check once the pages are available.
Hence this patch, which treats documents with different sized pages as a special case, by re-applying the initial position when all pages have become available.
2015-08-06 00:35:41 +09:00
|
|
|
});
|
2013-03-09 11:08:37 +09:00
|
|
|
});
|
|
|
|
|
|
|
|
pagesPromise.then(function() {
|
2014-09-22 20:41:17 +09:00
|
|
|
if (self.supportsPrinting) {
|
2013-03-01 08:29:07 +09:00
|
|
|
pdfDocument.getJavaScript().then(function(javaScript) {
|
|
|
|
if (javaScript.length) {
|
2013-03-17 00:13:08 +09:00
|
|
|
console.warn('Warning: JavaScript is not supported');
|
2016-03-29 06:44:27 +09:00
|
|
|
self.fallback(pdfjsLib.UNSUPPORTED_FEATURES.javaScript);
|
2013-03-01 08:29:07 +09:00
|
|
|
}
|
|
|
|
// Hack to support auto printing.
|
2015-07-21 01:25:02 +09:00
|
|
|
var regex = /\bprint\s*\(/;
|
2013-03-01 08:29:07 +09:00
|
|
|
for (var i = 0, ii = javaScript.length; i < ii; i++) {
|
|
|
|
var js = javaScript[i];
|
|
|
|
if (js && regex.test(js)) {
|
|
|
|
setTimeout(function() {
|
|
|
|
window.print();
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2012-04-10 14:20:57 +09:00
|
|
|
});
|
2011-12-01 10:04:45 +09:00
|
|
|
|
[api-minor] Let `LinkAnnotation`/`PDFLinkService_getDestinationHash` return a stringified version of the destination array for explicit destinations
Currently for explicit destinations, compared to named destinations, we manually try to build a hash that often times is a quite poor representation of the *actual* destination. (Currently this only, kind of, works for `\XYZ` destinations.)
For PDF files using explicit destinations, this can make it difficult/impossible to obtain a link to a specific section of the document through the URL.
Note that in practice most PDF files, especially newer ones, use named destinations and these are thus unnaffected by this patch.
This patch also fixes an existing issue in `PDFLinkService_getDestinationHash`, where a named destination consisting of only a number would not be handled correctly.
With the added, and already existing, type checks in place for destinations, I really don't think that this patch exposes any "sensitive" internal destination code not already accessible through normal hash parameters.
*Please note:* Just trying to improve the algorithm that generates the hash is unfortunately not possible in general, since there are a number of cases where it will simply never work well.
- First of all, note that `getDestinationHash` currently relies on the `_pagesRefCache`, hence it's possible that the hash returned is empty during e.g. ranged/streamed loading of a PDF file.
- Second of all, the currently computed hash is actually dependent on the document rotation. With named destinations, the fetched internal destination array is rotational invariant (as it should be), but this will not hold in general for the hash. We can easily avoid this issue by using a stringified destination array.
- Third of all, note that according to the PDF specification[1], `GoToR` destinations may actually contain explicit destination arrays. Since we cannot really construct a hash in `annotation.js`, we currently have no good way to support those. Even though this case seems *very* rare in practice (I've not actually seen such a PDF file), it's in the specification, and this patch allows us to support that for "free".
---
[1] http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf#G11.1951685
2016-05-15 19:12:47 +09:00
|
|
|
Promise.all([onePageRendered, this.animationStartedPromise]).then(
|
|
|
|
function() {
|
2012-04-10 14:20:57 +09:00
|
|
|
pdfDocument.getOutline().then(function(outline) {
|
2016-02-21 21:36:24 +09:00
|
|
|
self.pdfOutlineViewer.render({ outline: outline });
|
2012-04-10 14:20:57 +09:00
|
|
|
});
|
2014-03-19 05:32:47 +09:00
|
|
|
pdfDocument.getAttachments().then(function(attachments) {
|
2016-02-21 21:36:24 +09:00
|
|
|
self.pdfAttachmentViewer.render({ attachments: attachments });
|
2014-03-19 05:32:47 +09:00
|
|
|
});
|
2012-04-10 14:20:57 +09:00
|
|
|
});
|
|
|
|
|
2012-04-13 07:56:17 +09:00
|
|
|
pdfDocument.getMetadata().then(function(data) {
|
|
|
|
var info = data.info, metadata = data.metadata;
|
2012-04-10 14:20:57 +09:00
|
|
|
self.documentInfo = info;
|
|
|
|
self.metadata = metadata;
|
|
|
|
|
2012-11-06 02:12:17 +09:00
|
|
|
// Provides some basic debug information
|
|
|
|
console.log('PDF ' + pdfDocument.fingerprint + ' [' +
|
2014-04-10 19:20:39 +09:00
|
|
|
info.PDFFormatVersion + ' ' + (info.Producer || '-').trim() +
|
|
|
|
' / ' + (info.Creator || '-').trim() + ']' +
|
2016-03-29 06:44:27 +09:00
|
|
|
' (PDF.js: ' + (pdfjsLib.version || '-') +
|
|
|
|
(!pdfjsLib.PDFJS.disableWebGL ? ' [WebGL]' : '') + ')');
|
2012-11-06 02:12:17 +09:00
|
|
|
|
2012-04-10 14:20:57 +09:00
|
|
|
var pdfTitle;
|
2014-03-09 20:20:32 +09:00
|
|
|
if (metadata && metadata.has('dc:title')) {
|
2014-09-11 10:05:04 +09:00
|
|
|
var title = metadata.get('dc:title');
|
|
|
|
// Ghostscript sometimes return 'Untitled', sets the title to 'Untitled'
|
|
|
|
if (title !== 'Untitled') {
|
|
|
|
pdfTitle = title;
|
|
|
|
}
|
2012-04-10 14:20:57 +09:00
|
|
|
}
|
2011-10-02 03:54:37 +09:00
|
|
|
|
2014-03-09 20:20:32 +09:00
|
|
|
if (!pdfTitle && info && info['Title']) {
|
2012-04-10 14:20:57 +09:00
|
|
|
pdfTitle = info['Title'];
|
2014-03-09 20:20:32 +09:00
|
|
|
}
|
2012-04-10 14:20:57 +09:00
|
|
|
|
2014-03-09 20:20:32 +09:00
|
|
|
if (pdfTitle) {
|
2012-11-29 04:02:56 +09:00
|
|
|
self.setTitle(pdfTitle + ' - ' + document.title);
|
2014-03-09 20:20:32 +09:00
|
|
|
}
|
2013-02-01 06:46:44 +09:00
|
|
|
|
|
|
|
if (info.IsAcroFormPresent) {
|
2013-03-17 00:13:08 +09:00
|
|
|
console.warn('Warning: AcroForm/XFA is not supported');
|
2016-03-29 06:44:27 +09:00
|
|
|
self.fallback(pdfjsLib.UNSUPPORTED_FEATURES.forms);
|
2013-02-01 06:46:44 +09:00
|
|
|
}
|
2013-08-16 23:53:05 +09:00
|
|
|
|
2015-04-26 08:49:37 +09:00
|
|
|
//#if !PRODUCTION
|
2015-04-30 02:09:58 +09:00
|
|
|
if (true) {
|
|
|
|
return;
|
|
|
|
}
|
2015-04-26 08:49:37 +09:00
|
|
|
//#endif
|
2013-08-16 23:53:05 +09:00
|
|
|
//#if (FIREFOX || MOZCENTRAL)
|
2015-04-26 08:49:37 +09:00
|
|
|
var versionId = String(info.PDFFormatVersion).slice(-1) | 0;
|
|
|
|
var generatorId = 0;
|
|
|
|
var KNOWN_GENERATORS = [
|
|
|
|
'acrobat distiller', 'acrobat pdfwriter', 'adobe livecycle',
|
|
|
|
'adobe pdf library', 'adobe photoshop', 'ghostscript', 'tcpdf',
|
|
|
|
'cairo', 'dvipdfm', 'dvips', 'pdftex', 'pdfkit', 'itext', 'prince',
|
|
|
|
'quarkxpress', 'mac os x', 'microsoft', 'openoffice', 'oracle',
|
|
|
|
'luradocument', 'pdf-xchange', 'antenna house', 'aspose.cells', 'fpdf'
|
|
|
|
];
|
|
|
|
if (info.Producer) {
|
|
|
|
KNOWN_GENERATORS.some(function (generator, s, i) {
|
|
|
|
if (generator.indexOf(s) < 0) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
generatorId = i + 1;
|
|
|
|
return true;
|
|
|
|
}.bind(null, info.Producer.toLowerCase()));
|
|
|
|
}
|
|
|
|
var formType = !info.IsAcroFormPresent ? null : info.IsXFAPresent ?
|
|
|
|
'xfa' : 'acroform';
|
2016-04-14 06:21:05 +09:00
|
|
|
self.externalServices.reportTelemetry({
|
2015-04-26 08:49:37 +09:00
|
|
|
type: 'documentInfo',
|
|
|
|
version: versionId,
|
|
|
|
generator: generatorId,
|
|
|
|
formType: formType
|
2016-04-14 06:21:05 +09:00
|
|
|
});
|
2013-08-16 23:53:05 +09:00
|
|
|
//#endif
|
2012-04-10 14:20:57 +09:00
|
|
|
});
|
|
|
|
},
|
|
|
|
|
2016-04-13 22:28:53 +09:00
|
|
|
setInitialView: function pdfViewSetInitialView(storedHash, options) {
|
|
|
|
var scale = options && options.scale;
|
|
|
|
var sidebarView = options && options.sidebarView;
|
|
|
|
|
2014-09-22 20:41:17 +09:00
|
|
|
this.isInitialViewSet = true;
|
|
|
|
|
2016-04-13 22:28:53 +09:00
|
|
|
this.pdfSidebar.setInitialView(this.preferenceSidebarViewOnLoad ||
|
|
|
|
(sidebarView | 0));
|
2016-02-22 01:54:23 +09:00
|
|
|
|
2015-04-27 23:04:11 +09:00
|
|
|
if (this.initialDestination) {
|
|
|
|
this.pdfLinkService.navigateTo(this.initialDestination);
|
|
|
|
this.initialDestination = null;
|
2013-05-16 07:31:17 +09:00
|
|
|
} else if (this.initialBookmark) {
|
2015-04-28 00:25:32 +09:00
|
|
|
this.pdfLinkService.setHash(this.initialBookmark);
|
2015-04-27 23:04:11 +09:00
|
|
|
this.pdfHistory.push({ hash: this.initialBookmark }, true);
|
2011-10-02 03:54:37 +09:00
|
|
|
this.initialBookmark = null;
|
2013-05-16 07:31:17 +09:00
|
|
|
} else if (storedHash) {
|
2015-04-28 00:25:32 +09:00
|
|
|
this.pdfLinkService.setHash(storedHash);
|
2013-05-16 07:31:17 +09:00
|
|
|
} else if (scale) {
|
2015-07-11 18:47:45 +09:00
|
|
|
this.pdfViewer.currentScaleValue = scale;
|
2011-10-02 03:54:37 +09:00
|
|
|
this.page = 1;
|
2011-12-29 10:18:55 +09:00
|
|
|
}
|
2012-01-26 12:52:10 +09:00
|
|
|
|
2015-03-15 04:07:17 +09:00
|
|
|
if (!this.pdfViewer.currentScaleValue) {
|
2012-01-26 12:52:10 +09:00
|
|
|
// Scale was not initialized: invalid bookmark or scale was not specified.
|
|
|
|
// Setting the default one.
|
2015-07-11 18:47:45 +09:00
|
|
|
this.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE;
|
2012-01-26 12:52:10 +09:00
|
|
|
}
|
2011-10-02 03:54:37 +09:00
|
|
|
},
|
|
|
|
|
2013-11-15 06:43:38 +09:00
|
|
|
cleanup: function pdfViewCleanup() {
|
2015-10-23 22:49:02 +09:00
|
|
|
if (!this.pdfDocument) {
|
|
|
|
return; // run cleanup when document is loaded
|
|
|
|
}
|
2014-09-13 11:27:45 +09:00
|
|
|
this.pdfViewer.cleanup();
|
2014-09-13 04:48:44 +09:00
|
|
|
this.pdfThumbnailViewer.cleanup();
|
2013-11-15 06:43:38 +09:00
|
|
|
this.pdfDocument.cleanup();
|
2012-06-19 01:48:47 +09:00
|
|
|
},
|
|
|
|
|
2014-09-16 01:18:28 +09:00
|
|
|
forceRendering: function pdfViewForceRendering() {
|
|
|
|
this.pdfRenderingQueue.printing = this.printing;
|
2016-02-22 01:54:23 +09:00
|
|
|
this.pdfRenderingQueue.isThumbnailViewEnabled =
|
|
|
|
this.pdfSidebar.isThumbnailViewVisible;
|
2014-09-16 01:18:28 +09:00
|
|
|
this.pdfRenderingQueue.renderHighestPriority();
|
2012-06-19 01:48:47 +09:00
|
|
|
},
|
|
|
|
|
2012-06-29 01:50:25 +09:00
|
|
|
beforePrint: function pdfViewSetupBeforePrint() {
|
|
|
|
if (!this.supportsPrinting) {
|
2012-07-10 08:04:55 +09:00
|
|
|
var printMessage = mozL10n.get('printing_not_supported', null,
|
2012-07-13 02:31:20 +09:00
|
|
|
'Warning: Printing is not fully supported by this browser.');
|
2012-07-13 03:58:06 +09:00
|
|
|
this.error(printMessage);
|
2012-06-29 01:50:25 +09:00
|
|
|
return;
|
|
|
|
}
|
2013-03-09 11:08:37 +09:00
|
|
|
|
|
|
|
var alertNotReady = false;
|
2014-04-08 05:34:03 +09:00
|
|
|
var i, ii;
|
2015-06-06 06:55:08 +09:00
|
|
|
if (!this.pdfDocument || !this.pagesCount) {
|
2013-03-09 11:08:37 +09:00
|
|
|
alertNotReady = true;
|
|
|
|
} else {
|
2014-09-13 11:27:45 +09:00
|
|
|
for (i = 0, ii = this.pagesCount; i < ii; ++i) {
|
2014-09-30 21:13:46 +09:00
|
|
|
if (!this.pdfViewer.getPageView(i).pdfPage) {
|
2013-03-09 11:08:37 +09:00
|
|
|
alertNotReady = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (alertNotReady) {
|
|
|
|
var notReadyMessage = mozL10n.get('printing_not_ready', null,
|
|
|
|
'Warning: The PDF is not fully loaded for printing.');
|
|
|
|
window.alert(notReadyMessage);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-06-25 07:23:42 +09:00
|
|
|
this.printing = true;
|
2014-09-16 01:18:28 +09:00
|
|
|
this.forceRendering();
|
2014-06-25 07:23:42 +09:00
|
|
|
|
2016-04-22 01:39:11 +09:00
|
|
|
var printContainer = this.appConfig.printContainer;
|
2012-07-13 02:31:20 +09:00
|
|
|
var body = document.querySelector('body');
|
|
|
|
body.setAttribute('data-mozPrintCallback', true);
|
2015-03-19 07:15:43 +09:00
|
|
|
|
|
|
|
if (!this.hasEqualPageSizes) {
|
|
|
|
console.warn('Not all pages have the same size. The printed result ' +
|
|
|
|
'may be incorrect!');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Insert a @page + size rule to make sure that the page size is correctly
|
|
|
|
// set. Note that we assume that all pages have the same size, because
|
|
|
|
// variable-size pages are not supported yet (at least in Chrome & Firefox).
|
|
|
|
// TODO(robwu): Use named pages when size calculation bugs get resolved
|
|
|
|
// (e.g. https://crbug.com/355116) AND when support for named pages is
|
|
|
|
// added (http://www.w3.org/TR/css3-page/#using-named-pages).
|
|
|
|
// In browsers where @page + size is not supported (such as Firefox,
|
|
|
|
// https://bugzil.la/851441), the next stylesheet will be ignored and the
|
|
|
|
// user has to select the correct paper size in the UI if wanted.
|
|
|
|
this.pageStyleSheet = document.createElement('style');
|
|
|
|
var pageSize = this.pdfViewer.getPageView(0).pdfPage.getViewport(1);
|
|
|
|
this.pageStyleSheet.textContent =
|
|
|
|
// "size:<width> <height>" is what we need. But also add "A4" because
|
|
|
|
// Firefox incorrectly reports support for the other value.
|
|
|
|
'@supports ((size:A4) and (size:1pt 1pt)) {' +
|
|
|
|
'@page { size: ' + pageSize.width + 'pt ' + pageSize.height + 'pt;}' +
|
|
|
|
'}';
|
|
|
|
body.appendChild(this.pageStyleSheet);
|
|
|
|
|
2014-09-13 11:27:45 +09:00
|
|
|
for (i = 0, ii = this.pagesCount; i < ii; ++i) {
|
2016-04-22 01:39:11 +09:00
|
|
|
this.pdfViewer.getPageView(i).beforePrint(printContainer);
|
2012-06-29 01:50:25 +09:00
|
|
|
}
|
2014-06-15 05:55:21 +09:00
|
|
|
|
2015-04-26 08:49:37 +09:00
|
|
|
//#if !PRODUCTION
|
2015-04-30 02:09:58 +09:00
|
|
|
if (true) {
|
|
|
|
return;
|
|
|
|
}
|
2015-04-26 08:49:37 +09:00
|
|
|
//#endif
|
2014-06-15 05:55:21 +09:00
|
|
|
//#if (FIREFOX || MOZCENTRAL)
|
2016-04-14 06:21:05 +09:00
|
|
|
this.externalServices.reportTelemetry({
|
2015-04-26 08:49:37 +09:00
|
|
|
type: 'print'
|
2016-04-14 06:21:05 +09:00
|
|
|
});
|
2014-06-15 05:55:21 +09:00
|
|
|
//#endif
|
2012-06-29 01:50:25 +09:00
|
|
|
},
|
|
|
|
|
2015-03-19 07:15:43 +09:00
|
|
|
// Whether all pages of the PDF have the same width and height.
|
|
|
|
get hasEqualPageSizes() {
|
|
|
|
var firstPage = this.pdfViewer.getPageView(0);
|
|
|
|
for (var i = 1, ii = this.pagesCount; i < ii; ++i) {
|
|
|
|
var pageView = this.pdfViewer.getPageView(i);
|
|
|
|
if (pageView.width !== firstPage.width ||
|
|
|
|
pageView.height !== firstPage.height) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
},
|
|
|
|
|
2012-06-29 01:50:25 +09:00
|
|
|
afterPrint: function pdfViewSetupAfterPrint() {
|
2016-04-22 01:39:11 +09:00
|
|
|
var div = this.appConfig.printContainer;
|
2014-03-09 20:20:32 +09:00
|
|
|
while (div.hasChildNodes()) {
|
2012-06-29 01:50:25 +09:00
|
|
|
div.removeChild(div.lastChild);
|
2014-03-09 20:20:32 +09:00
|
|
|
}
|
2014-06-25 07:23:42 +09:00
|
|
|
|
2015-03-19 07:15:43 +09:00
|
|
|
if (this.pageStyleSheet && this.pageStyleSheet.parentNode) {
|
|
|
|
this.pageStyleSheet.parentNode.removeChild(this.pageStyleSheet);
|
|
|
|
this.pageStyleSheet = null;
|
|
|
|
}
|
|
|
|
|
2014-06-25 07:23:42 +09:00
|
|
|
this.printing = false;
|
2014-09-16 01:18:28 +09:00
|
|
|
this.forceRendering();
|
2012-07-31 00:12:49 +09:00
|
|
|
},
|
|
|
|
|
2014-09-13 11:27:45 +09:00
|
|
|
rotatePages: function pdfViewRotatePages(delta) {
|
2014-09-30 21:13:46 +09:00
|
|
|
var pageNumber = this.page;
|
2014-09-13 11:27:45 +09:00
|
|
|
this.pageRotation = (this.pageRotation + 360 + delta) % 360;
|
2014-09-21 02:15:18 +09:00
|
|
|
this.pdfViewer.pagesRotation = this.pageRotation;
|
|
|
|
this.pdfThumbnailViewer.pagesRotation = this.pageRotation;
|
2012-09-08 08:05:14 +09:00
|
|
|
|
2014-09-16 01:18:28 +09:00
|
|
|
this.forceRendering();
|
2012-09-08 08:05:14 +09:00
|
|
|
|
2014-09-30 21:13:46 +09:00
|
|
|
this.pdfViewer.scrollPageIntoView(pageNumber);
|
2012-09-14 05:23:44 +09:00
|
|
|
},
|
|
|
|
|
2015-01-29 21:37:49 +09:00
|
|
|
requestPresentationMode: function pdfViewRequestPresentationMode() {
|
2015-02-04 02:09:11 +09:00
|
|
|
if (!this.pdfPresentationMode) {
|
2015-01-29 21:37:49 +09:00
|
|
|
return;
|
|
|
|
}
|
2015-02-04 02:09:11 +09:00
|
|
|
this.pdfPresentationMode.request();
|
2015-01-29 21:37:49 +09:00
|
|
|
},
|
|
|
|
|
2015-02-02 06:53:59 +09:00
|
|
|
/**
|
|
|
|
* @param {number} delta - The delta value from the mouse event.
|
|
|
|
*/
|
2015-02-01 00:46:23 +09:00
|
|
|
scrollPresentationMode: function pdfViewScrollPresentationMode(delta) {
|
2015-02-04 02:09:11 +09:00
|
|
|
if (!this.pdfPresentationMode) {
|
2012-09-14 05:23:44 +09:00
|
|
|
return;
|
2014-03-09 20:20:32 +09:00
|
|
|
}
|
2015-02-04 02:09:11 +09:00
|
|
|
this.pdfPresentationMode.mouseScroll(delta);
|
2016-04-26 07:57:15 +09:00
|
|
|
},
|
|
|
|
|
2016-06-27 19:32:28 +09:00
|
|
|
/**
|
|
|
|
* @typedef UpdateUIToolbarParameters
|
|
|
|
* @property {number} pageNumber
|
|
|
|
* @property {string} scaleValue
|
|
|
|
* @property {scale} scale
|
|
|
|
* @property {boolean} resetNumPages
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param {Object} UpdateUIToolbarParameters
|
|
|
|
* @private
|
|
|
|
*/
|
|
|
|
_updateUIToolbar: function (params) {
|
|
|
|
function selectScaleOption(value, scale) {
|
|
|
|
var options = toolbarConfig.scaleSelect.options;
|
|
|
|
var predefinedValueFound = false;
|
|
|
|
for (var i = 0, ii = options.length; i < ii; i++) {
|
|
|
|
var option = options[i];
|
|
|
|
if (option.value !== value) {
|
|
|
|
option.selected = false;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
option.selected = true;
|
|
|
|
predefinedValueFound = true;
|
|
|
|
}
|
|
|
|
if (!predefinedValueFound) {
|
|
|
|
var customScale = Math.round(scale * 10000) / 100;
|
|
|
|
toolbarConfig.customScaleOption.textContent =
|
|
|
|
mozL10n.get('page_scale_percent', {scale: customScale}, '{{scale}}%');
|
|
|
|
toolbarConfig.customScaleOption.selected = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var pageNumber = params.pageNumber || this.pdfViewer.currentPageNumber;
|
|
|
|
var scaleValue = (params.scaleValue || params.scale ||
|
|
|
|
this.pdfViewer.currentScaleValue || DEFAULT_SCALE_VALUE).toString();
|
|
|
|
var scale = params.scale || this.pdfViewer.currentScale;
|
|
|
|
var resetNumPages = params.resetNumPages || false;
|
|
|
|
|
|
|
|
var toolbarConfig = this.appConfig.toolbar;
|
|
|
|
var pagesCount = this.pagesCount;
|
|
|
|
|
|
|
|
if (resetNumPages) {
|
|
|
|
toolbarConfig.numPages.textContent =
|
|
|
|
mozL10n.get('page_of', { pageCount: pagesCount }, 'of {{pageCount}}');
|
|
|
|
toolbarConfig.pageNumber.max = pagesCount;
|
|
|
|
}
|
|
|
|
toolbarConfig.pageNumber.value = pageNumber;
|
|
|
|
|
|
|
|
toolbarConfig.previous.disabled = (pageNumber <= 1);
|
|
|
|
toolbarConfig.next.disabled = (pageNumber >= pagesCount);
|
|
|
|
|
|
|
|
toolbarConfig.firstPage.disabled = (pageNumber <= 1);
|
|
|
|
toolbarConfig.lastPage.disabled = (pageNumber >= pagesCount);
|
|
|
|
|
|
|
|
toolbarConfig.zoomOut.disabled = (scale === MIN_SCALE);
|
|
|
|
toolbarConfig.zoomIn.disabled = (scale === MAX_SCALE);
|
|
|
|
|
|
|
|
selectScaleOption(scaleValue, scale);
|
|
|
|
},
|
|
|
|
|
2016-04-26 07:57:15 +09:00
|
|
|
bindEvents: function pdfViewBindEvents() {
|
|
|
|
var eventBus = this.eventBus;
|
|
|
|
|
|
|
|
eventBus.on('resize', webViewerResize);
|
|
|
|
eventBus.on('localized', webViewerLocalized);
|
|
|
|
eventBus.on('hashchange', webViewerHashchange);
|
|
|
|
eventBus.on('beforeprint', this.beforePrint.bind(this));
|
|
|
|
eventBus.on('afterprint', this.afterPrint.bind(this));
|
|
|
|
eventBus.on('pagerendered', webViewerPageRendered);
|
|
|
|
eventBus.on('textlayerrendered', webViewerTextLayerRendered);
|
|
|
|
eventBus.on('updateviewarea', webViewerUpdateViewarea);
|
2016-04-30 00:05:04 +09:00
|
|
|
eventBus.on('pagechanging', webViewerPageChanging);
|
|
|
|
eventBus.on('scalechanging', webViewerScaleChanging);
|
2016-04-26 07:57:15 +09:00
|
|
|
eventBus.on('sidebarviewchanged', webViewerSidebarViewChanged);
|
|
|
|
eventBus.on('pagemode', webViewerPageMode);
|
|
|
|
eventBus.on('namedaction', webViewerNamedAction);
|
|
|
|
eventBus.on('presentationmodechanged', webViewerPresentationModeChanged);
|
2016-04-29 05:04:09 +09:00
|
|
|
eventBus.on('presentationmode', webViewerPresentationMode);
|
|
|
|
eventBus.on('openfile', webViewerOpenFile);
|
|
|
|
eventBus.on('print', webViewerPrint);
|
|
|
|
eventBus.on('download', webViewerDownload);
|
|
|
|
eventBus.on('firstpage', webViewerFirstPage);
|
|
|
|
eventBus.on('lastpage', webViewerLastPage);
|
|
|
|
eventBus.on('rotatecw', webViewerRotateCw);
|
|
|
|
eventBus.on('rotateccw', webViewerRotateCcw);
|
|
|
|
eventBus.on('documentproperties', webViewerDocumentProperties);
|
2016-04-28 21:11:40 +09:00
|
|
|
eventBus.on('find', webViewerFind);
|
2016-05-26 22:24:58 +09:00
|
|
|
eventBus.on('findfromurlhash', webViewerFindFromUrlHash);
|
2016-04-26 07:57:15 +09:00
|
|
|
//#if GENERIC
|
|
|
|
eventBus.on('fileinputchange', webViewerFileInputChange);
|
|
|
|
//#endif
|
2011-08-09 05:13:32 +09:00
|
|
|
}
|
2011-07-29 02:48:05 +09:00
|
|
|
};
|
|
|
|
|
2016-01-23 02:54:19 +09:00
|
|
|
//#if GENERIC
|
|
|
|
var HOSTED_VIEWER_ORIGINS = ['null',
|
|
|
|
'http://mozilla.github.io', 'https://mozilla.github.io'];
|
|
|
|
function validateFileURL(file) {
|
|
|
|
try {
|
|
|
|
var viewerOrigin = new URL(window.location.href).origin || 'null';
|
|
|
|
if (HOSTED_VIEWER_ORIGINS.indexOf(viewerOrigin) >= 0) {
|
|
|
|
// Hosted or local viewer, allow for any file locations
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
var fileOrigin = new URL(file, window.location.href).origin;
|
|
|
|
// Removing of the following line will not guarantee that the viewer will
|
|
|
|
// start accepting URLs from foreign origin -- CORS headers on the remote
|
|
|
|
// server must be properly configured.
|
|
|
|
if (fileOrigin !== viewerOrigin) {
|
|
|
|
throw new Error('file origin does not match viewer\'s');
|
|
|
|
}
|
|
|
|
} catch (e) {
|
|
|
|
var message = e && e.message;
|
|
|
|
var loadingErrorMessage = mozL10n.get('loading_error', null,
|
|
|
|
'An error occurred while loading the PDF.');
|
|
|
|
|
|
|
|
var moreInfo = {
|
|
|
|
message: message
|
|
|
|
};
|
|
|
|
PDFViewerApplication.error(loadingErrorMessage, moreInfo);
|
|
|
|
throw e;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//#endif
|
|
|
|
|
2016-05-10 08:18:43 +09:00
|
|
|
function loadAndEnablePDFBug(enabledTabs) {
|
|
|
|
return new Promise(function (resolve, reject) {
|
|
|
|
var appConfig = PDFViewerApplication.appConfig;
|
|
|
|
var script = document.createElement('script');
|
|
|
|
script.src = appConfig.debuggerScriptPath;
|
|
|
|
script.onload = function () {
|
|
|
|
PDFBug.enable(enabledTabs);
|
|
|
|
PDFBug.init(pdfjsLib, appConfig.mainContainer);
|
|
|
|
resolve();
|
|
|
|
};
|
|
|
|
script.onerror = function () {
|
|
|
|
reject(new Error('Cannot load debugger at ' + script.src));
|
|
|
|
};
|
|
|
|
(document.getElementsByTagName('head')[0] || document.body).
|
|
|
|
appendChild(script);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2014-04-04 02:20:53 +09:00
|
|
|
function webViewerInitialized() {
|
2015-06-20 00:53:03 +09:00
|
|
|
//#if GENERIC
|
2014-09-22 20:41:17 +09:00
|
|
|
var queryString = document.location.search.substring(1);
|
2015-04-28 00:25:32 +09:00
|
|
|
var params = parseQueryString(queryString);
|
2014-02-28 02:45:02 +09:00
|
|
|
var file = 'file' in params ? params.file : DEFAULT_URL;
|
2016-01-23 02:54:19 +09:00
|
|
|
validateFileURL(file);
|
2013-10-18 05:55:25 +09:00
|
|
|
//#endif
|
|
|
|
//#if (FIREFOX || MOZCENTRAL)
|
2013-07-27 19:31:51 +09:00
|
|
|
//var file = window.location.href.split('#')[0];
|
2012-08-02 03:29:13 +09:00
|
|
|
//#endif
|
2013-10-18 05:55:25 +09:00
|
|
|
//#if CHROME
|
|
|
|
//var file = DEFAULT_URL;
|
2013-08-15 06:36:40 +09:00
|
|
|
//#endif
|
|
|
|
|
2016-05-10 08:18:43 +09:00
|
|
|
var waitForBeforeOpening = [];
|
2016-04-22 01:39:11 +09:00
|
|
|
var appConfig = PDFViewerApplication.appConfig;
|
2015-04-26 08:49:37 +09:00
|
|
|
//#if GENERIC
|
2013-07-31 06:36:45 +09:00
|
|
|
var fileInput = document.createElement('input');
|
2016-04-22 01:39:11 +09:00
|
|
|
fileInput.id = appConfig.openFileInputName;
|
2013-07-31 06:36:45 +09:00
|
|
|
fileInput.className = 'fileInput';
|
|
|
|
fileInput.setAttribute('type', 'file');
|
|
|
|
fileInput.oncontextmenu = noContextMenuHandler;
|
|
|
|
document.body.appendChild(fileInput);
|
|
|
|
|
2012-08-02 03:29:13 +09:00
|
|
|
if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
|
2016-04-22 01:39:11 +09:00
|
|
|
appConfig.toolbar.openFile.setAttribute('hidden', 'true');
|
2016-05-11 08:31:03 +09:00
|
|
|
appConfig.secondaryToolbar.openFileButton.setAttribute('hidden', 'true');
|
2012-01-25 08:13:50 +09:00
|
|
|
} else {
|
2016-04-22 01:39:11 +09:00
|
|
|
fileInput.value = null;
|
2012-01-25 08:13:50 +09:00
|
|
|
}
|
2016-04-22 01:39:11 +09:00
|
|
|
|
2012-08-02 03:29:13 +09:00
|
|
|
//#else
|
2016-04-22 01:39:11 +09:00
|
|
|
//appConfig.toolbar.openFile.setAttribute('hidden', 'true');
|
2016-05-11 08:31:03 +09:00
|
|
|
//appConfig.secondaryToolbar.openFileButton.setAttribute('hidden', 'true');
|
2012-08-02 03:29:13 +09:00
|
|
|
//#endif
|
2011-12-10 03:17:48 +09:00
|
|
|
|
2016-03-29 06:44:27 +09:00
|
|
|
var PDFJS = pdfjsLib.PDFJS;
|
2014-01-11 20:57:33 +09:00
|
|
|
|
2014-03-18 03:20:24 +09:00
|
|
|
//#if !PRODUCTION
|
2014-06-17 05:18:12 +09:00
|
|
|
if (true) {
|
|
|
|
//#else
|
2014-10-01 18:42:06 +09:00
|
|
|
//if (PDFViewerApplication.preferencePdfBugEnabled) {
|
2014-03-18 03:20:24 +09:00
|
|
|
//#endif
|
2014-06-17 05:18:12 +09:00
|
|
|
// Special debugging flags in the hash section of the URL.
|
|
|
|
var hash = document.location.hash.substring(1);
|
2015-04-28 00:25:32 +09:00
|
|
|
var hashParams = parseQueryString(hash);
|
2014-03-18 03:20:24 +09:00
|
|
|
|
2014-09-20 08:25:11 +09:00
|
|
|
if ('disableworker' in hashParams) {
|
|
|
|
PDFJS.disableWorker = (hashParams['disableworker'] === 'true');
|
2014-06-17 05:18:12 +09:00
|
|
|
}
|
2014-09-20 08:25:11 +09:00
|
|
|
if ('disablerange' in hashParams) {
|
|
|
|
PDFJS.disableRange = (hashParams['disablerange'] === 'true');
|
2014-06-17 05:18:12 +09:00
|
|
|
}
|
2014-09-06 10:02:54 +09:00
|
|
|
if ('disablestream' in hashParams) {
|
|
|
|
PDFJS.disableStream = (hashParams['disablestream'] === 'true');
|
|
|
|
}
|
2014-09-20 08:25:11 +09:00
|
|
|
if ('disableautofetch' in hashParams) {
|
|
|
|
PDFJS.disableAutoFetch = (hashParams['disableautofetch'] === 'true');
|
2014-06-17 05:18:12 +09:00
|
|
|
}
|
2014-09-20 08:25:11 +09:00
|
|
|
if ('disablefontface' in hashParams) {
|
|
|
|
PDFJS.disableFontFace = (hashParams['disablefontface'] === 'true');
|
2014-06-17 05:18:12 +09:00
|
|
|
}
|
2014-09-20 08:25:11 +09:00
|
|
|
if ('disablehistory' in hashParams) {
|
|
|
|
PDFJS.disableHistory = (hashParams['disablehistory'] === 'true');
|
2014-06-17 05:18:12 +09:00
|
|
|
}
|
|
|
|
if ('webgl' in hashParams) {
|
|
|
|
PDFJS.disableWebGL = (hashParams['webgl'] !== 'true');
|
|
|
|
}
|
2014-09-20 08:25:11 +09:00
|
|
|
if ('useonlycsszoom' in hashParams) {
|
|
|
|
PDFJS.useOnlyCssZoom = (hashParams['useonlycsszoom'] === 'true');
|
2014-06-17 05:18:12 +09:00
|
|
|
}
|
|
|
|
if ('verbosity' in hashParams) {
|
|
|
|
PDFJS.verbosity = hashParams['verbosity'] | 0;
|
|
|
|
}
|
2014-09-20 08:25:11 +09:00
|
|
|
if ('ignorecurrentpositiononzoom' in hashParams) {
|
2016-03-29 06:44:27 +09:00
|
|
|
PDFJS.ignoreCurrentPositionOnZoom =
|
2014-09-20 08:25:11 +09:00
|
|
|
(hashParams['ignorecurrentpositiononzoom'] === 'true');
|
2014-06-17 05:18:12 +09:00
|
|
|
}
|
|
|
|
//#if !PRODUCTION
|
2014-09-20 08:25:11 +09:00
|
|
|
if ('disablebcmaps' in hashParams && hashParams['disablebcmaps']) {
|
2014-06-17 05:18:12 +09:00
|
|
|
PDFJS.cMapUrl = '../external/cmaps/';
|
|
|
|
PDFJS.cMapPacked = false;
|
|
|
|
}
|
|
|
|
//#endif
|
2012-08-02 03:29:13 +09:00
|
|
|
//#if !(FIREFOX || MOZCENTRAL)
|
2014-06-17 05:18:12 +09:00
|
|
|
if ('locale' in hashParams) {
|
2016-03-29 06:44:27 +09:00
|
|
|
PDFJS.locale = hashParams['locale'];
|
2014-06-17 05:18:12 +09:00
|
|
|
}
|
|
|
|
//#endif
|
2014-09-20 08:25:11 +09:00
|
|
|
if ('textlayer' in hashParams) {
|
|
|
|
switch (hashParams['textlayer']) {
|
2014-06-17 05:18:12 +09:00
|
|
|
case 'off':
|
|
|
|
PDFJS.disableTextLayer = true;
|
|
|
|
break;
|
|
|
|
case 'visible':
|
|
|
|
case 'shadow':
|
|
|
|
case 'hover':
|
2016-04-22 01:39:11 +09:00
|
|
|
var viewer = appConfig.viewerContainer;
|
2014-09-20 08:25:11 +09:00
|
|
|
viewer.classList.add('textLayer-' + hashParams['textlayer']);
|
2014-06-17 05:18:12 +09:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2014-09-20 08:25:11 +09:00
|
|
|
if ('pdfbug' in hashParams) {
|
2014-06-17 05:18:12 +09:00
|
|
|
PDFJS.pdfBug = true;
|
2014-09-20 08:25:11 +09:00
|
|
|
var pdfBug = hashParams['pdfbug'];
|
2014-06-17 05:18:12 +09:00
|
|
|
var enabled = pdfBug.split(',');
|
2016-05-10 08:18:43 +09:00
|
|
|
waitForBeforeOpening.push(loadAndEnablePDFBug(enabled));
|
2014-06-17 05:18:12 +09:00
|
|
|
}
|
2014-03-09 20:20:32 +09:00
|
|
|
}
|
2014-06-17 05:18:12 +09:00
|
|
|
|
|
|
|
//#if !(FIREFOX || MOZCENTRAL)
|
2016-03-29 06:44:27 +09:00
|
|
|
mozL10n.setLanguage(PDFJS.locale);
|
2013-05-16 05:57:27 +09:00
|
|
|
//#endif
|
|
|
|
//#if (FIREFOX || MOZCENTRAL)
|
2015-04-26 08:49:37 +09:00
|
|
|
if (!PDFViewerApplication.supportsDocumentFonts) {
|
|
|
|
PDFJS.disableFontFace = true;
|
|
|
|
console.warn(mozL10n.get('web_fonts_disabled', null,
|
|
|
|
'Web fonts are disabled: unable to use embedded PDF fonts.'));
|
|
|
|
}
|
2012-08-02 03:29:13 +09:00
|
|
|
//#endif
|
2012-05-01 05:29:05 +09:00
|
|
|
|
2014-09-22 20:41:17 +09:00
|
|
|
if (!PDFViewerApplication.supportsPrinting) {
|
2016-04-22 01:39:11 +09:00
|
|
|
appConfig.toolbar.print.classList.add('hidden');
|
2016-05-11 08:31:03 +09:00
|
|
|
appConfig.secondaryToolbar.printButton.classList.add('hidden');
|
2012-07-10 08:04:55 +09:00
|
|
|
}
|
|
|
|
|
2014-09-22 20:41:17 +09:00
|
|
|
if (!PDFViewerApplication.supportsFullscreen) {
|
2016-04-22 01:39:11 +09:00
|
|
|
appConfig.toolbar.presentationModeButton.classList.add('hidden');
|
|
|
|
appConfig.secondaryToolbar.presentationModeButton.classList.add('hidden');
|
2012-07-31 00:12:49 +09:00
|
|
|
}
|
|
|
|
|
2014-09-22 20:41:17 +09:00
|
|
|
if (PDFViewerApplication.supportsIntegratedFind) {
|
2016-04-22 01:39:11 +09:00
|
|
|
appConfig.toolbar.viewFind.classList.add('hidden');
|
2012-10-06 05:59:13 +09:00
|
|
|
}
|
|
|
|
|
2013-07-31 06:36:45 +09:00
|
|
|
// Suppress context menus for some controls
|
2016-04-22 01:39:11 +09:00
|
|
|
appConfig.toolbar.scaleSelect.oncontextmenu = noContextMenuHandler;
|
2013-07-31 06:36:45 +09:00
|
|
|
|
2016-04-22 01:39:11 +09:00
|
|
|
appConfig.sidebar.mainContainer.addEventListener('transitionend',
|
2016-02-22 01:54:23 +09:00
|
|
|
function(e) {
|
|
|
|
if (e.target === /* mainContainer */ this) {
|
2016-04-26 07:57:15 +09:00
|
|
|
PDFViewerApplication.eventBus.dispatch('resize');
|
2015-01-28 05:08:36 +09:00
|
|
|
}
|
2016-02-22 01:54:23 +09:00
|
|
|
}, true);
|
2012-09-07 00:33:07 +09:00
|
|
|
|
2016-04-22 01:39:11 +09:00
|
|
|
appConfig.sidebar.toggleButton.addEventListener('click',
|
2014-03-19 05:32:47 +09:00
|
|
|
function() {
|
2016-02-22 01:54:23 +09:00
|
|
|
PDFViewerApplication.pdfSidebar.toggle();
|
2014-03-19 05:32:47 +09:00
|
|
|
});
|
|
|
|
|
2016-04-22 01:39:11 +09:00
|
|
|
appConfig.toolbar.previous.addEventListener('click',
|
2012-09-07 00:33:07 +09:00
|
|
|
function() {
|
2014-09-22 20:41:17 +09:00
|
|
|
PDFViewerApplication.page--;
|
2012-09-07 00:33:07 +09:00
|
|
|
});
|
|
|
|
|
2016-04-22 01:39:11 +09:00
|
|
|
appConfig.toolbar.next.addEventListener('click',
|
2012-09-07 00:33:07 +09:00
|
|
|
function() {
|
2014-09-22 20:41:17 +09:00
|
|
|
PDFViewerApplication.page++;
|
2012-09-07 00:33:07 +09:00
|
|
|
});
|
|
|
|
|
2016-04-22 01:39:11 +09:00
|
|
|
appConfig.toolbar.zoomIn.addEventListener('click',
|
2012-09-07 00:33:07 +09:00
|
|
|
function() {
|
2014-09-22 20:41:17 +09:00
|
|
|
PDFViewerApplication.zoomIn();
|
2012-09-07 00:33:07 +09:00
|
|
|
});
|
|
|
|
|
2016-04-22 01:39:11 +09:00
|
|
|
appConfig.toolbar.zoomOut.addEventListener('click',
|
2012-09-07 00:33:07 +09:00
|
|
|
function() {
|
2014-09-22 20:41:17 +09:00
|
|
|
PDFViewerApplication.zoomOut();
|
2012-09-07 00:33:07 +09:00
|
|
|
});
|
|
|
|
|
2016-04-22 01:39:11 +09:00
|
|
|
appConfig.toolbar.pageNumber.addEventListener('click', function() {
|
2014-07-18 20:53:04 +09:00
|
|
|
this.select();
|
|
|
|
});
|
2013-01-22 02:30:59 +09:00
|
|
|
|
2016-04-22 01:39:11 +09:00
|
|
|
appConfig.toolbar.pageNumber.addEventListener('change', function() {
|
2014-07-18 20:53:04 +09:00
|
|
|
// Handle the user inputting a floating point number.
|
|
|
|
PDFViewerApplication.page = (this.value | 0);
|
2013-01-22 02:30:59 +09:00
|
|
|
|
2014-07-18 20:53:04 +09:00
|
|
|
if (this.value !== (this.value | 0).toString()) {
|
|
|
|
this.value = PDFViewerApplication.page;
|
|
|
|
}
|
|
|
|
});
|
2012-09-07 00:33:07 +09:00
|
|
|
|
2016-04-22 01:39:11 +09:00
|
|
|
appConfig.toolbar.scaleSelect.addEventListener('change', function() {
|
2015-07-18 17:12:31 +09:00
|
|
|
if (this.value === 'custom') {
|
|
|
|
return;
|
|
|
|
}
|
2015-07-11 18:47:45 +09:00
|
|
|
PDFViewerApplication.pdfViewer.currentScaleValue = this.value;
|
|
|
|
});
|
2012-09-07 00:33:07 +09:00
|
|
|
|
2016-04-22 01:39:11 +09:00
|
|
|
appConfig.toolbar.presentationModeButton.addEventListener('click',
|
2016-04-29 05:04:09 +09:00
|
|
|
function (e) {
|
|
|
|
PDFViewerApplication.eventBus.dispatch('presentationmode');
|
2012-10-11 02:26:41 +09:00
|
|
|
|
2016-04-29 05:04:09 +09:00
|
|
|
});
|
|
|
|
|
|
|
|
appConfig.toolbar.openFile.addEventListener('click', function (e) {
|
|
|
|
PDFViewerApplication.eventBus.dispatch('openfile');
|
|
|
|
});
|
2012-10-11 02:26:41 +09:00
|
|
|
|
2016-04-29 05:04:09 +09:00
|
|
|
appConfig.toolbar.print.addEventListener('click', function (e) {
|
|
|
|
PDFViewerApplication.eventBus.dispatch('print');
|
|
|
|
});
|
2012-09-08 08:05:14 +09:00
|
|
|
|
2016-04-29 05:04:09 +09:00
|
|
|
appConfig.toolbar.download.addEventListener('click', function (e) {
|
|
|
|
PDFViewerApplication.eventBus.dispatch('download');
|
|
|
|
});
|
2013-09-05 06:48:31 +09:00
|
|
|
|
2016-05-10 08:18:43 +09:00
|
|
|
Promise.all(waitForBeforeOpening).then(function () {
|
|
|
|
webViewerOpenFileViaURL(file);
|
|
|
|
}).catch(function (reason) {
|
|
|
|
PDFViewerApplication.error(mozL10n.get('loading_error', null,
|
|
|
|
'An error occurred while opening.'), reason);
|
|
|
|
});
|
|
|
|
}
|
2012-08-16 00:17:30 +09:00
|
|
|
|
2014-07-30 08:28:41 +09:00
|
|
|
//#if GENERIC
|
2016-05-10 08:18:43 +09:00
|
|
|
function webViewerOpenFileViaURL(file) {
|
2014-07-30 08:28:41 +09:00
|
|
|
if (file && file.lastIndexOf('file:', 0) === 0) {
|
|
|
|
// file:-scheme. Load the contents in the main thread because QtWebKit
|
|
|
|
// cannot load file:-URLs in a Web Worker. file:-URLs are usually loaded
|
|
|
|
// very quickly, so there is no need to set up progress event listeners.
|
2014-09-22 20:41:17 +09:00
|
|
|
PDFViewerApplication.setTitleUsingUrl(file);
|
2014-07-30 08:28:41 +09:00
|
|
|
var xhr = new XMLHttpRequest();
|
|
|
|
xhr.onload = function() {
|
2015-10-23 22:49:02 +09:00
|
|
|
PDFViewerApplication.open(new Uint8Array(xhr.response));
|
2014-07-30 08:28:41 +09:00
|
|
|
};
|
|
|
|
try {
|
|
|
|
xhr.open('GET', file);
|
|
|
|
xhr.responseType = 'arraybuffer';
|
|
|
|
xhr.send();
|
|
|
|
} catch (e) {
|
2014-09-22 20:41:17 +09:00
|
|
|
PDFViewerApplication.error(mozL10n.get('loading_error', null,
|
|
|
|
'An error occurred while loading the PDF.'), e);
|
2014-07-30 08:28:41 +09:00
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-02-28 02:45:02 +09:00
|
|
|
if (file) {
|
2015-10-23 22:49:02 +09:00
|
|
|
PDFViewerApplication.open(file);
|
2014-02-28 02:45:02 +09:00
|
|
|
}
|
|
|
|
}
|
2016-05-10 08:18:43 +09:00
|
|
|
//#elif (FIREFOX || MOZCENTRAL || CHROME)
|
|
|
|
//function webViewerOpenFileViaURL(file) {
|
|
|
|
// PDFViewerApplication.setTitleUsingUrl(file);
|
|
|
|
// PDFViewerApplication.initPassiveLoading();
|
|
|
|
//}
|
|
|
|
//#else
|
|
|
|
//function webViewerOpenFileURL(file) {
|
|
|
|
// if (file) {
|
|
|
|
// throw new Error('Not implemented: webViewerOpenFileURL');
|
|
|
|
// }
|
|
|
|
//}
|
|
|
|
//#endif
|
2014-02-28 02:45:02 +09:00
|
|
|
|
2016-04-26 07:57:15 +09:00
|
|
|
function webViewerPageRendered(e) {
|
|
|
|
var pageNumber = e.pageNumber;
|
2014-09-30 01:15:06 +09:00
|
|
|
var pageIndex = pageNumber - 1;
|
2014-09-22 20:41:17 +09:00
|
|
|
var pageView = PDFViewerApplication.pdfViewer.getPageView(pageIndex);
|
2015-01-28 05:13:34 +09:00
|
|
|
|
2016-02-22 01:54:23 +09:00
|
|
|
// Use the rendered page to set the corresponding thumbnail image.
|
|
|
|
if (PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) {
|
2015-01-28 05:13:34 +09:00
|
|
|
var thumbnailView = PDFViewerApplication.pdfThumbnailViewer.
|
|
|
|
getThumbnail(pageIndex);
|
|
|
|
thumbnailView.setImage(pageView);
|
|
|
|
}
|
2012-08-08 08:52:22 +09:00
|
|
|
|
2016-03-29 06:44:27 +09:00
|
|
|
if (pdfjsLib.PDFJS.pdfBug && Stats.enabled && pageView.stats) {
|
2014-09-30 01:15:06 +09:00
|
|
|
Stats.add(pageNumber, pageView.stats);
|
|
|
|
}
|
|
|
|
|
2014-09-16 04:57:12 +09:00
|
|
|
if (pageView.error) {
|
2014-09-22 20:41:17 +09:00
|
|
|
PDFViewerApplication.error(mozL10n.get('rendering_error', null,
|
2014-09-16 04:57:12 +09:00
|
|
|
'An error occurred while rendering the page.'), pageView.error);
|
|
|
|
}
|
2012-08-08 08:52:22 +09:00
|
|
|
|
2014-07-18 20:53:04 +09:00
|
|
|
// If the page is still visible when it has finished rendering,
|
|
|
|
// ensure that the page number input loading indicator is hidden.
|
2014-09-30 01:15:06 +09:00
|
|
|
if (pageNumber === PDFViewerApplication.page) {
|
2016-04-22 01:39:11 +09:00
|
|
|
var pageNumberInput = PDFViewerApplication.appConfig.toolbar.pageNumber;
|
2014-07-18 20:53:04 +09:00
|
|
|
pageNumberInput.classList.remove(PAGE_NUMBER_LOADING_INDICATOR);
|
|
|
|
}
|
2015-04-26 08:49:37 +09:00
|
|
|
|
|
|
|
//#if !PRODUCTION
|
2015-04-30 02:09:58 +09:00
|
|
|
if (true) {
|
|
|
|
return;
|
|
|
|
}
|
2015-04-26 08:49:37 +09:00
|
|
|
//#endif
|
|
|
|
//#if (FIREFOX || MOZCENTRAL)
|
2016-04-14 06:21:05 +09:00
|
|
|
PDFViewerApplication.externalServices.reportTelemetry({
|
2015-04-26 08:49:37 +09:00
|
|
|
type: 'pageInfo'
|
2016-04-14 06:21:05 +09:00
|
|
|
});
|
2015-04-26 08:49:37 +09:00
|
|
|
// It is a good time to report stream and font types.
|
|
|
|
PDFViewerApplication.pdfDocument.getStats().then(function (stats) {
|
2016-04-14 06:21:05 +09:00
|
|
|
PDFViewerApplication.externalServices.reportTelemetry({
|
2015-04-26 08:49:37 +09:00
|
|
|
type: 'documentStats',
|
|
|
|
stats: stats
|
2016-04-14 06:21:05 +09:00
|
|
|
});
|
2015-04-26 08:49:37 +09:00
|
|
|
});
|
|
|
|
//#endif
|
2016-04-26 07:57:15 +09:00
|
|
|
}
|
2012-08-08 08:52:22 +09:00
|
|
|
|
2016-04-26 07:57:15 +09:00
|
|
|
function webViewerTextLayerRendered(e) {
|
|
|
|
var pageIndex = e.pageNumber - 1;
|
2014-12-31 21:10:59 +09:00
|
|
|
var pageView = PDFViewerApplication.pdfViewer.getPageView(pageIndex);
|
|
|
|
|
2015-04-26 08:49:37 +09:00
|
|
|
//#if !PRODUCTION
|
2015-04-30 02:09:58 +09:00
|
|
|
if (true) {
|
|
|
|
return;
|
|
|
|
}
|
2015-04-26 08:49:37 +09:00
|
|
|
//#endif
|
2014-12-31 21:10:59 +09:00
|
|
|
//#if (FIREFOX || MOZCENTRAL)
|
2015-04-26 08:49:37 +09:00
|
|
|
if (pageView.textLayer && pageView.textLayer.textDivs &&
|
|
|
|
pageView.textLayer.textDivs.length > 0 &&
|
|
|
|
!PDFViewerApplication.supportsDocumentColors) {
|
2015-11-22 18:14:25 +09:00
|
|
|
console.error(mozL10n.get('document_colors_not_allowed', null,
|
2015-04-26 08:49:37 +09:00
|
|
|
'PDF documents are not allowed to use their own colors: ' +
|
|
|
|
'\'Allow pages to choose their own colors\' ' +
|
|
|
|
'is deactivated in the browser.'));
|
|
|
|
PDFViewerApplication.fallback();
|
|
|
|
}
|
2014-12-31 21:10:59 +09:00
|
|
|
//#endif
|
2016-04-26 07:57:15 +09:00
|
|
|
}
|
2014-12-31 21:10:59 +09:00
|
|
|
|
2016-04-26 07:57:15 +09:00
|
|
|
function webViewerPageMode(e) {
|
2015-08-05 05:57:51 +09:00
|
|
|
if (!PDFViewerApplication.initialized) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
// Handle the 'pagemode' hash parameter, see also `PDFLinkService_setHash`.
|
2016-04-26 07:57:15 +09:00
|
|
|
var mode = e.mode, view;
|
2015-08-05 05:57:51 +09:00
|
|
|
switch (mode) {
|
|
|
|
case 'thumbs':
|
2016-02-22 01:54:23 +09:00
|
|
|
view = SidebarView.THUMBS;
|
|
|
|
break;
|
|
|
|
case 'bookmarks':
|
|
|
|
case 'outline':
|
|
|
|
view = SidebarView.OUTLINE;
|
|
|
|
break;
|
2015-08-05 05:57:51 +09:00
|
|
|
case 'attachments':
|
2016-02-22 01:54:23 +09:00
|
|
|
view = SidebarView.ATTACHMENTS;
|
2015-08-05 05:57:51 +09:00
|
|
|
break;
|
|
|
|
case 'none':
|
2016-02-22 01:54:23 +09:00
|
|
|
view = SidebarView.NONE;
|
2015-08-05 05:57:51 +09:00
|
|
|
break;
|
2016-02-22 01:54:23 +09:00
|
|
|
default:
|
|
|
|
console.error('Invalid "pagemode" hash parameter: ' + mode);
|
|
|
|
return;
|
2015-08-05 05:57:51 +09:00
|
|
|
}
|
2016-02-22 01:54:23 +09:00
|
|
|
PDFViewerApplication.pdfSidebar.switchView(view, /* forceOpen = */ true);
|
2016-04-26 07:57:15 +09:00
|
|
|
}
|
2015-08-05 05:57:51 +09:00
|
|
|
|
2016-04-26 07:57:15 +09:00
|
|
|
function webViewerNamedAction(e) {
|
2015-08-05 06:07:44 +09:00
|
|
|
if (!PDFViewerApplication.initialized) {
|
|
|
|
return;
|
|
|
|
}
|
2015-04-28 00:25:32 +09:00
|
|
|
// Processing couple of named actions that might be useful.
|
|
|
|
// See also PDFLinkService.executeNamedAction
|
2016-04-26 07:57:15 +09:00
|
|
|
var action = e.action;
|
2015-04-28 00:25:32 +09:00
|
|
|
switch (action) {
|
|
|
|
case 'GoToPage':
|
2016-04-22 01:39:11 +09:00
|
|
|
PDFViewerApplication.appConfig.toolbar.pageNumber.focus();
|
2015-04-28 00:25:32 +09:00
|
|
|
break;
|
|
|
|
|
|
|
|
case 'Find':
|
2015-08-05 06:07:44 +09:00
|
|
|
if (!PDFViewerApplication.supportsIntegratedFind) {
|
|
|
|
PDFViewerApplication.findBar.toggle();
|
2015-04-28 00:25:32 +09:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
2016-04-26 07:57:15 +09:00
|
|
|
}
|
2015-04-28 00:25:32 +09:00
|
|
|
|
2016-04-26 07:57:15 +09:00
|
|
|
function webViewerPresentationModeChanged(e) {
|
|
|
|
var active = e.active;
|
|
|
|
var switchInProgress = e.switchInProgress;
|
2014-09-22 20:41:17 +09:00
|
|
|
PDFViewerApplication.pdfViewer.presentationModeState =
|
2014-09-16 02:37:03 +09:00
|
|
|
switchInProgress ? PresentationModeState.CHANGING :
|
|
|
|
active ? PresentationModeState.FULLSCREEN : PresentationModeState.NORMAL;
|
2016-04-26 07:57:15 +09:00
|
|
|
}
|
2012-08-08 08:52:22 +09:00
|
|
|
|
2016-04-26 07:57:15 +09:00
|
|
|
function webViewerSidebarViewChanged(e) {
|
2016-03-12 21:07:43 +09:00
|
|
|
if (!PDFViewerApplication.initialized) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
PDFViewerApplication.pdfRenderingQueue.isThumbnailViewEnabled =
|
|
|
|
PDFViewerApplication.pdfSidebar.isThumbnailViewVisible;
|
|
|
|
|
|
|
|
var store = PDFViewerApplication.store;
|
|
|
|
if (!store || !PDFViewerApplication.isInitialViewSet) {
|
|
|
|
// Only update the storage when the document has been loaded *and* rendered.
|
|
|
|
return;
|
|
|
|
}
|
2016-04-13 22:28:53 +09:00
|
|
|
store.initializedPromise.then(function() {
|
2016-04-26 07:57:15 +09:00
|
|
|
store.set('sidebarView', e.view).catch(function() {});
|
2016-04-13 22:28:53 +09:00
|
|
|
});
|
2016-04-26 07:57:15 +09:00
|
|
|
}
|
2016-03-12 21:07:43 +09:00
|
|
|
|
2016-04-26 07:57:15 +09:00
|
|
|
function webViewerUpdateViewarea(e) {
|
2014-09-22 20:41:17 +09:00
|
|
|
if (!PDFViewerApplication.initialized) {
|
2014-09-13 11:27:45 +09:00
|
|
|
return;
|
2014-02-10 21:43:26 +09:00
|
|
|
}
|
2016-04-26 07:57:15 +09:00
|
|
|
var location = e.location, store = PDFViewerApplication.store;
|
2016-03-12 21:07:43 +09:00
|
|
|
|
|
|
|
if (store) {
|
|
|
|
store.initializedPromise.then(function() {
|
|
|
|
store.setMultiple({
|
|
|
|
'exists': true,
|
|
|
|
'page': location.pageNumber,
|
|
|
|
'zoom': location.scale,
|
|
|
|
'scrollLeft': location.left,
|
|
|
|
'scrollTop': location.top,
|
|
|
|
}).catch(function() { /* unable to write to storage */ });
|
2014-04-26 03:28:26 +09:00
|
|
|
});
|
2016-03-12 21:07:43 +09:00
|
|
|
}
|
2015-04-28 00:25:32 +09:00
|
|
|
var href =
|
|
|
|
PDFViewerApplication.pdfLinkService.getAnchorUrl(location.pdfOpenParams);
|
2016-04-22 01:39:11 +09:00
|
|
|
PDFViewerApplication.appConfig.toolbar.viewBookmark.href = href;
|
2016-05-11 08:31:03 +09:00
|
|
|
PDFViewerApplication.appConfig.secondaryToolbar.viewBookmarkButton.href =
|
|
|
|
href;
|
2013-05-16 07:31:17 +09:00
|
|
|
|
2013-05-19 01:18:44 +09:00
|
|
|
// Update the current bookmark in the browsing history.
|
2015-04-27 23:04:11 +09:00
|
|
|
PDFViewerApplication.pdfHistory.updateCurrentBookmark(location.pdfOpenParams,
|
|
|
|
location.pageNumber);
|
2014-07-18 20:53:04 +09:00
|
|
|
|
|
|
|
// Show/hide the loading indicator in the page number input element.
|
2016-04-22 01:39:11 +09:00
|
|
|
var pageNumberInput = PDFViewerApplication.appConfig.toolbar.pageNumber;
|
2014-07-18 20:53:04 +09:00
|
|
|
var currentPage =
|
|
|
|
PDFViewerApplication.pdfViewer.getPageView(PDFViewerApplication.page - 1);
|
|
|
|
|
|
|
|
if (currentPage.renderingState === RenderingStates.FINISHED) {
|
|
|
|
pageNumberInput.classList.remove(PAGE_NUMBER_LOADING_INDICATOR);
|
|
|
|
} else {
|
|
|
|
pageNumberInput.classList.add(PAGE_NUMBER_LOADING_INDICATOR);
|
|
|
|
}
|
2016-04-26 07:57:15 +09:00
|
|
|
}
|
2011-09-03 10:16:52 +09:00
|
|
|
|
2011-10-05 04:21:40 +09:00
|
|
|
window.addEventListener('resize', function webViewerResize(evt) {
|
2016-04-26 07:57:15 +09:00
|
|
|
PDFViewerApplication.eventBus.dispatch('resize');
|
|
|
|
});
|
|
|
|
|
|
|
|
function webViewerResize() {
|
2015-07-06 23:13:41 +09:00
|
|
|
if (PDFViewerApplication.initialized) {
|
|
|
|
var currentScaleValue = PDFViewerApplication.pdfViewer.currentScaleValue;
|
2015-07-23 06:40:38 +09:00
|
|
|
if (currentScaleValue === 'auto' ||
|
|
|
|
currentScaleValue === 'page-fit' ||
|
|
|
|
currentScaleValue === 'page-width') {
|
|
|
|
// Note: the scale is constant for 'page-actual'.
|
|
|
|
PDFViewerApplication.pdfViewer.currentScaleValue = currentScaleValue;
|
|
|
|
} else if (!currentScaleValue) {
|
|
|
|
// Normally this shouldn't happen, but if the scale wasn't initialized
|
|
|
|
// we set it to the default value in order to prevent any issues.
|
|
|
|
// (E.g. the document being rendered with the wrong scale on load.)
|
|
|
|
PDFViewerApplication.pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE;
|
2015-07-06 23:13:41 +09:00
|
|
|
}
|
2015-07-23 23:02:39 +09:00
|
|
|
PDFViewerApplication.pdfViewer.update();
|
2013-08-01 02:43:03 +09:00
|
|
|
}
|
2013-09-05 06:48:31 +09:00
|
|
|
|
|
|
|
// Set the 'max-height' CSS property of the secondary toolbar.
|
2016-05-11 08:31:03 +09:00
|
|
|
var mainContainer = PDFViewerApplication.appConfig.mainContainer;
|
|
|
|
PDFViewerApplication.secondaryToolbar.setMaxHeight(mainContainer);
|
2016-04-26 07:57:15 +09:00
|
|
|
}
|
2011-09-03 10:16:52 +09:00
|
|
|
|
2011-10-05 04:21:40 +09:00
|
|
|
window.addEventListener('hashchange', function webViewerHashchange(evt) {
|
2016-04-26 07:57:15 +09:00
|
|
|
var hash = document.location.hash.substring(1);
|
|
|
|
PDFViewerApplication.eventBus.dispatch('hashchange', {hash: hash});
|
|
|
|
});
|
|
|
|
|
|
|
|
function webViewerHashchange(e) {
|
2015-04-27 23:04:11 +09:00
|
|
|
if (PDFViewerApplication.pdfHistory.isHashChangeUnlocked) {
|
2016-04-26 07:57:15 +09:00
|
|
|
var hash = e.hash;
|
2015-04-28 00:25:32 +09:00
|
|
|
if (!hash) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (!PDFViewerApplication.isInitialViewSet) {
|
|
|
|
PDFViewerApplication.initialBookmark = hash;
|
|
|
|
} else {
|
|
|
|
PDFViewerApplication.pdfLinkService.setHash(hash);
|
|
|
|
}
|
2013-05-16 07:31:17 +09:00
|
|
|
}
|
2016-04-26 07:57:15 +09:00
|
|
|
}
|
2011-07-29 02:48:05 +09:00
|
|
|
|
2015-04-30 02:09:58 +09:00
|
|
|
//#if GENERIC
|
2011-10-05 04:21:40 +09:00
|
|
|
window.addEventListener('change', function webViewerChange(evt) {
|
2011-07-29 02:48:05 +09:00
|
|
|
var files = evt.target.files;
|
2014-03-09 20:20:32 +09:00
|
|
|
if (!files || files.length === 0) {
|
2011-07-29 02:48:05 +09:00
|
|
|
return;
|
2014-03-09 20:20:32 +09:00
|
|
|
}
|
2016-04-26 07:57:15 +09:00
|
|
|
PDFViewerApplication.eventBus.dispatch('fileinputchange',
|
|
|
|
{fileInput: evt.target});
|
|
|
|
}, true);
|
|
|
|
|
|
|
|
function webViewerFileInputChange(e) {
|
|
|
|
var file = e.fileInput.files[0];
|
2014-01-28 04:11:02 +09:00
|
|
|
|
2016-03-29 06:44:27 +09:00
|
|
|
if (!pdfjsLib.PDFJS.disableCreateObjectURL &&
|
2014-01-28 04:11:02 +09:00
|
|
|
typeof URL !== 'undefined' && URL.createObjectURL) {
|
2015-10-23 22:49:02 +09:00
|
|
|
PDFViewerApplication.open(URL.createObjectURL(file));
|
2014-01-28 04:11:02 +09:00
|
|
|
} else {
|
|
|
|
// Read the local file into a Uint8Array.
|
|
|
|
var fileReader = new FileReader();
|
|
|
|
fileReader.onload = function webViewerChangeFileReaderOnload(evt) {
|
|
|
|
var buffer = evt.target.result;
|
|
|
|
var uint8Array = new Uint8Array(buffer);
|
2015-10-23 22:49:02 +09:00
|
|
|
PDFViewerApplication.open(uint8Array);
|
2014-01-28 04:11:02 +09:00
|
|
|
};
|
|
|
|
fileReader.readAsArrayBuffer(file);
|
|
|
|
}
|
|
|
|
|
2014-09-22 20:41:17 +09:00
|
|
|
PDFViewerApplication.setTitleUsingUrl(file.name);
|
2011-10-15 11:05:57 +09:00
|
|
|
|
2011-10-19 10:20:50 +09:00
|
|
|
// URL does not reflect proper document location - hiding some icons.
|
2016-04-22 01:39:11 +09:00
|
|
|
var appConfig = PDFViewerApplication.appConfig;
|
|
|
|
appConfig.toolbar.viewBookmark.setAttribute('hidden', 'true');
|
2016-05-11 08:31:03 +09:00
|
|
|
appConfig.secondaryToolbar.viewBookmarkButton.setAttribute('hidden', 'true');
|
2016-04-22 01:39:11 +09:00
|
|
|
appConfig.toolbar.download.setAttribute('hidden', 'true');
|
2016-05-11 08:31:03 +09:00
|
|
|
appConfig.secondaryToolbar.downloadButton.setAttribute('hidden', 'true');
|
2016-04-26 07:57:15 +09:00
|
|
|
}
|
2014-01-28 04:11:02 +09:00
|
|
|
//#endif
|
2011-07-29 02:48:05 +09:00
|
|
|
|
2012-05-02 07:08:30 +09:00
|
|
|
window.addEventListener('localized', function localized(evt) {
|
2016-04-26 07:57:15 +09:00
|
|
|
PDFViewerApplication.eventBus.dispatch('localized');
|
|
|
|
});
|
|
|
|
|
|
|
|
function webViewerLocalized() {
|
2012-11-30 05:02:33 +09:00
|
|
|
document.getElementsByTagName('html')[0].dir = mozL10n.getDirection();
|
2013-01-27 06:17:37 +09:00
|
|
|
|
2014-09-22 20:41:17 +09:00
|
|
|
PDFViewerApplication.animationStartedPromise.then(function() {
|
2013-09-05 06:48:31 +09:00
|
|
|
// Adjust the width of the zoom box to fit the content.
|
2014-08-21 20:02:19 +09:00
|
|
|
// Note: If the window is narrow enough that the zoom box is not visible,
|
|
|
|
// we temporarily show it to be able to adjust its width.
|
2016-04-22 01:39:11 +09:00
|
|
|
var container = PDFViewerApplication.appConfig.toolbar.scaleSelectContainer;
|
2014-08-21 20:02:19 +09:00
|
|
|
if (container.clientWidth === 0) {
|
|
|
|
container.setAttribute('style', 'display: inherit;');
|
|
|
|
}
|
2013-06-02 21:31:28 +09:00
|
|
|
if (container.clientWidth > 0) {
|
2016-04-22 01:39:11 +09:00
|
|
|
var select = PDFViewerApplication.appConfig.toolbar.scaleSelect;
|
2013-02-27 02:46:50 +09:00
|
|
|
select.setAttribute('style', 'min-width: inherit;');
|
2013-06-02 21:31:28 +09:00
|
|
|
var width = select.clientWidth + SCALE_SELECT_CONTAINER_PADDING;
|
|
|
|
select.setAttribute('style', 'min-width: ' +
|
|
|
|
(width + SCALE_SELECT_PADDING) + 'px;');
|
2013-02-27 02:46:50 +09:00
|
|
|
container.setAttribute('style', 'min-width: ' + width + 'px; ' +
|
|
|
|
'max-width: ' + width + 'px;');
|
2013-06-02 21:31:28 +09:00
|
|
|
}
|
2013-09-05 06:48:31 +09:00
|
|
|
|
|
|
|
// Set the 'max-height' CSS property of the secondary toolbar.
|
2016-05-11 08:31:03 +09:00
|
|
|
var mainContainer = PDFViewerApplication.appConfig.mainContainer;
|
|
|
|
PDFViewerApplication.secondaryToolbar.setMaxHeight(mainContainer);
|
2013-02-27 02:46:50 +09:00
|
|
|
});
|
2016-04-26 07:57:15 +09:00
|
|
|
}
|
2012-05-02 07:08:30 +09:00
|
|
|
|
2016-04-29 05:04:09 +09:00
|
|
|
function webViewerPresentationMode() {
|
|
|
|
PDFViewerApplication.requestPresentationMode();
|
|
|
|
}
|
|
|
|
function webViewerOpenFile() {
|
|
|
|
var openFileInputName = PDFViewerApplication.appConfig.openFileInputName;
|
|
|
|
document.getElementById(openFileInputName).click();
|
|
|
|
}
|
|
|
|
function webViewerPrint() {
|
|
|
|
window.print();
|
|
|
|
}
|
|
|
|
function webViewerDownload() {
|
|
|
|
PDFViewerApplication.download();
|
|
|
|
}
|
|
|
|
function webViewerFirstPage() {
|
|
|
|
if (PDFViewerApplication.pdfDocument) {
|
|
|
|
PDFViewerApplication.page = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function webViewerLastPage() {
|
|
|
|
if (PDFViewerApplication.pdfDocument) {
|
|
|
|
PDFViewerApplication.page = PDFViewerApplication.pagesCount;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function webViewerRotateCw() {
|
|
|
|
PDFViewerApplication.rotatePages(90);
|
|
|
|
}
|
|
|
|
function webViewerRotateCcw() {
|
|
|
|
PDFViewerApplication.rotatePages(-90);
|
|
|
|
}
|
|
|
|
function webViewerDocumentProperties() {
|
|
|
|
PDFViewerApplication.pdfDocumentProperties.open();
|
|
|
|
}
|
|
|
|
|
2016-04-28 21:11:40 +09:00
|
|
|
function webViewerFind(e) {
|
|
|
|
PDFViewerApplication.findController.executeCommand('find' + e.type, {
|
|
|
|
query: e.query,
|
2016-05-26 22:24:58 +09:00
|
|
|
phraseSearch: e.phraseSearch,
|
2016-04-28 21:11:40 +09:00
|
|
|
caseSensitive: e.caseSensitive,
|
|
|
|
highlightAll: e.highlightAll,
|
|
|
|
findPrevious: e.findPrevious
|
|
|
|
});
|
|
|
|
}
|
2012-05-02 07:08:30 +09:00
|
|
|
|
2016-05-26 22:24:58 +09:00
|
|
|
function webViewerFindFromUrlHash(e) {
|
|
|
|
PDFViewerApplication.findController.executeCommand('find', {
|
|
|
|
query: e.query,
|
|
|
|
phraseSearch: e.phraseSearch,
|
|
|
|
caseSensitive: false,
|
|
|
|
highlightAll: true,
|
|
|
|
findPrevious: false
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2016-04-30 00:05:04 +09:00
|
|
|
function webViewerScaleChanging(e) {
|
2016-06-27 19:32:28 +09:00
|
|
|
PDFViewerApplication._updateUIToolbar({
|
|
|
|
scaleValue: e.presetValue,
|
|
|
|
scale: e.scale,
|
|
|
|
});
|
|
|
|
|
2015-07-23 23:02:39 +09:00
|
|
|
if (!PDFViewerApplication.initialized) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
PDFViewerApplication.pdfViewer.update();
|
2016-04-26 07:57:15 +09:00
|
|
|
}
|
2011-07-30 01:17:04 +09:00
|
|
|
|
2016-04-30 00:05:04 +09:00
|
|
|
function webViewerPageChanging(e) {
|
2016-04-26 07:57:15 +09:00
|
|
|
var page = e.pageNumber;
|
2016-02-22 01:54:23 +09:00
|
|
|
|
2016-06-27 19:32:28 +09:00
|
|
|
PDFViewerApplication._updateUIToolbar({
|
|
|
|
pageNumber: page,
|
|
|
|
});
|
|
|
|
if (e.previousPageNumber !== page &&
|
|
|
|
PDFViewerApplication.pdfSidebar.isThumbnailViewVisible) {
|
|
|
|
PDFViewerApplication.pdfThumbnailViewer.scrollThumbnailIntoView(page);
|
2012-04-14 06:14:05 +09:00
|
|
|
}
|
2014-09-13 11:27:45 +09:00
|
|
|
|
2014-09-30 01:15:06 +09:00
|
|
|
// we need to update stats
|
2016-03-29 06:44:27 +09:00
|
|
|
if (pdfjsLib.PDFJS.pdfBug && Stats.enabled) {
|
2014-09-30 01:15:06 +09:00
|
|
|
var pageView = PDFViewerApplication.pdfViewer.getPageView(page - 1);
|
|
|
|
if (pageView.stats) {
|
|
|
|
Stats.add(page, pageView.stats);
|
|
|
|
}
|
|
|
|
}
|
2016-04-26 07:57:15 +09:00
|
|
|
}
|
2011-09-03 10:16:52 +09:00
|
|
|
|
2016-04-08 01:48:46 +09:00
|
|
|
var zoomDisabled = false, zoomDisabledTimeout;
|
2014-01-29 04:52:25 +09:00
|
|
|
function handleMouseWheel(evt) {
|
|
|
|
var MOUSE_WHEEL_DELTA_FACTOR = 40;
|
|
|
|
var ticks = (evt.type === 'DOMMouseScroll') ? -evt.detail :
|
|
|
|
evt.wheelDelta / MOUSE_WHEEL_DELTA_FACTOR;
|
|
|
|
var direction = (ticks < 0) ? 'zoomOut' : 'zoomIn';
|
2012-06-08 04:27:26 +09:00
|
|
|
|
2015-07-03 06:20:37 +09:00
|
|
|
var pdfViewer = PDFViewerApplication.pdfViewer;
|
|
|
|
if (pdfViewer.isInPresentationMode) {
|
2014-01-29 04:52:25 +09:00
|
|
|
evt.preventDefault();
|
2015-02-01 00:46:23 +09:00
|
|
|
PDFViewerApplication.scrollPresentationMode(ticks *
|
|
|
|
MOUSE_WHEEL_DELTA_FACTOR);
|
2015-04-10 08:51:16 +09:00
|
|
|
} else if (evt.ctrlKey || evt.metaKey) {
|
2015-06-02 20:17:02 +09:00
|
|
|
var support = PDFViewerApplication.supportedMouseWheelZoomModifierKeys;
|
|
|
|
if ((evt.ctrlKey && !support.ctrlKey) ||
|
2016-04-08 04:03:04 +09:00
|
|
|
(evt.metaKey && !support.metaKey)) {
|
2015-06-02 20:17:02 +09:00
|
|
|
return;
|
|
|
|
}
|
2015-02-01 00:46:23 +09:00
|
|
|
// Only zoom the pages, not the entire viewer.
|
2014-10-16 05:03:13 +09:00
|
|
|
evt.preventDefault();
|
2016-04-08 04:03:04 +09:00
|
|
|
// NOTE: this check must be placed *after* preventDefault.
|
|
|
|
if (zoomDisabled) {
|
|
|
|
return;
|
|
|
|
}
|
2015-07-03 06:20:37 +09:00
|
|
|
|
|
|
|
var previousScale = pdfViewer.currentScale;
|
|
|
|
|
2014-10-16 05:03:13 +09:00
|
|
|
PDFViewerApplication[direction](Math.abs(ticks));
|
2015-07-03 06:20:37 +09:00
|
|
|
|
|
|
|
var currentScale = pdfViewer.currentScale;
|
|
|
|
if (previousScale !== currentScale) {
|
|
|
|
// After scaling the page via zoomIn/zoomOut, the position of the upper-
|
|
|
|
// left corner is restored. When the mouse wheel is used, the position
|
|
|
|
// under the cursor should be restored instead.
|
|
|
|
var scaleCorrectionFactor = currentScale / previousScale - 1;
|
|
|
|
var rect = pdfViewer.container.getBoundingClientRect();
|
|
|
|
var dx = evt.clientX - rect.left;
|
|
|
|
var dy = evt.clientY - rect.top;
|
|
|
|
pdfViewer.container.scrollLeft += dx * scaleCorrectionFactor;
|
|
|
|
pdfViewer.container.scrollTop += dy * scaleCorrectionFactor;
|
|
|
|
}
|
2016-04-08 01:48:46 +09:00
|
|
|
} else {
|
|
|
|
zoomDisabled = true;
|
|
|
|
clearTimeout(zoomDisabledTimeout);
|
|
|
|
zoomDisabledTimeout = setTimeout(function () {
|
|
|
|
zoomDisabled = false;
|
|
|
|
}, 1000);
|
2012-06-08 04:27:26 +09:00
|
|
|
}
|
2014-01-29 04:52:25 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
window.addEventListener('DOMMouseScroll', handleMouseWheel);
|
|
|
|
window.addEventListener('mousewheel', handleMouseWheel);
|
2012-06-08 04:27:26 +09:00
|
|
|
|
2013-02-28 23:35:41 +09:00
|
|
|
window.addEventListener('click', function click(evt) {
|
2016-05-11 08:31:03 +09:00
|
|
|
if (!PDFViewerApplication.secondaryToolbar.isOpen) {
|
2016-04-29 05:04:09 +09:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
var appConfig = PDFViewerApplication.appConfig;
|
|
|
|
if (PDFViewerApplication.pdfViewer.containsElement(evt.target) ||
|
|
|
|
(appConfig.toolbar.container.contains(evt.target) &&
|
|
|
|
evt.target !== appConfig.secondaryToolbar.toggleButton)) {
|
2016-05-11 08:31:03 +09:00
|
|
|
PDFViewerApplication.secondaryToolbar.close();
|
2012-10-06 11:55:47 +09:00
|
|
|
}
|
2016-04-29 05:04:09 +09:00
|
|
|
}, true);
|
2012-10-06 11:55:47 +09:00
|
|
|
|
2011-09-05 23:07:18 +09:00
|
|
|
window.addEventListener('keydown', function keydown(evt) {
|
2014-05-13 19:08:39 +09:00
|
|
|
if (OverlayManager.active) {
|
2013-09-25 00:46:54 +09:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-04-12 07:47:11 +09:00
|
|
|
var handled = false;
|
2012-04-20 03:13:56 +09:00
|
|
|
var cmd = (evt.ctrlKey ? 1 : 0) |
|
|
|
|
(evt.altKey ? 2 : 0) |
|
|
|
|
(evt.shiftKey ? 4 : 0) |
|
|
|
|
(evt.metaKey ? 8 : 0);
|
2012-04-12 07:47:11 +09:00
|
|
|
|
2015-01-29 21:37:49 +09:00
|
|
|
var pdfViewer = PDFViewerApplication.pdfViewer;
|
|
|
|
var isViewerInPresentationMode = pdfViewer && pdfViewer.isInPresentationMode;
|
|
|
|
|
2012-04-12 07:47:11 +09:00
|
|
|
// First, handle the key bindings that are independent whether an input
|
|
|
|
// control is selected or not.
|
2013-03-12 01:04:43 +09:00
|
|
|
if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) {
|
|
|
|
// either CTRL or META key with optional SHIFT.
|
2012-04-12 07:47:11 +09:00
|
|
|
switch (evt.keyCode) {
|
2013-07-18 20:37:55 +09:00
|
|
|
case 70: // f
|
2014-09-22 20:41:17 +09:00
|
|
|
if (!PDFViewerApplication.supportsIntegratedFind) {
|
|
|
|
PDFViewerApplication.findBar.open();
|
2012-10-06 05:59:13 +09:00
|
|
|
handled = true;
|
|
|
|
}
|
2012-09-12 01:30:44 +09:00
|
|
|
break;
|
2013-07-18 20:37:55 +09:00
|
|
|
case 71: // g
|
2014-09-22 20:41:17 +09:00
|
|
|
if (!PDFViewerApplication.supportsIntegratedFind) {
|
2016-04-28 21:11:40 +09:00
|
|
|
var findState = PDFViewerApplication.findController.state;
|
|
|
|
if (findState) {
|
|
|
|
PDFViewerApplication.findController.executeCommand('findagain', {
|
|
|
|
query: findState.query,
|
2016-05-26 22:24:58 +09:00
|
|
|
phraseSearch: findState.phraseSearch,
|
2016-04-28 21:11:40 +09:00
|
|
|
caseSensitive: findState.caseSensitive,
|
|
|
|
highlightAll: findState.highlightAll,
|
|
|
|
findPrevious: cmd === 5 || cmd === 12
|
|
|
|
});
|
|
|
|
}
|
2013-07-18 20:37:55 +09:00
|
|
|
handled = true;
|
|
|
|
}
|
|
|
|
break;
|
2012-04-12 07:47:11 +09:00
|
|
|
case 61: // FF/Mac '='
|
|
|
|
case 107: // FF '+' and '='
|
|
|
|
case 187: // Chrome '+'
|
2012-12-11 06:39:35 +09:00
|
|
|
case 171: // FF with German keyboard
|
2015-01-29 21:37:49 +09:00
|
|
|
if (!isViewerInPresentationMode) {
|
2014-10-16 05:03:13 +09:00
|
|
|
PDFViewerApplication.zoomIn();
|
|
|
|
}
|
2012-04-12 07:47:11 +09:00
|
|
|
handled = true;
|
|
|
|
break;
|
2012-09-11 01:28:45 +09:00
|
|
|
case 173: // FF/Mac '-'
|
2012-04-12 07:47:11 +09:00
|
|
|
case 109: // FF '-'
|
|
|
|
case 189: // Chrome '-'
|
2015-01-29 21:37:49 +09:00
|
|
|
if (!isViewerInPresentationMode) {
|
2014-10-16 05:03:13 +09:00
|
|
|
PDFViewerApplication.zoomOut();
|
|
|
|
}
|
2012-04-12 07:47:11 +09:00
|
|
|
handled = true;
|
|
|
|
break;
|
|
|
|
case 48: // '0'
|
2012-12-12 07:59:33 +09:00
|
|
|
case 96: // '0' on Numpad of Swedish keyboard
|
2015-01-29 21:37:49 +09:00
|
|
|
if (!isViewerInPresentationMode) {
|
2014-10-16 05:03:13 +09:00
|
|
|
// keeping it unhandled (to restore page zoom to 100%)
|
|
|
|
setTimeout(function () {
|
|
|
|
// ... and resetting the scale after browser adjusts its scale
|
2015-07-11 18:47:45 +09:00
|
|
|
pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE;
|
2014-10-16 05:03:13 +09:00
|
|
|
});
|
|
|
|
handled = false;
|
|
|
|
}
|
2012-04-12 07:47:11 +09:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-02-28 00:08:43 +09:00
|
|
|
//#if !(FIREFOX || MOZCENTRAL)
|
|
|
|
// CTRL or META without shift
|
|
|
|
if (cmd === 1 || cmd === 8) {
|
|
|
|
switch (evt.keyCode) {
|
|
|
|
case 83: // s
|
2014-09-22 20:41:17 +09:00
|
|
|
PDFViewerApplication.download();
|
2014-02-28 00:08:43 +09:00
|
|
|
handled = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//#endif
|
|
|
|
|
2013-07-18 23:28:06 +09:00
|
|
|
// CTRL+ALT or Option+Command
|
|
|
|
if (cmd === 3 || cmd === 10) {
|
|
|
|
switch (evt.keyCode) {
|
|
|
|
case 80: // p
|
2015-01-29 21:37:49 +09:00
|
|
|
PDFViewerApplication.requestPresentationMode();
|
2013-07-18 23:28:06 +09:00
|
|
|
handled = true;
|
|
|
|
break;
|
2013-11-12 13:47:03 +09:00
|
|
|
case 71: // g
|
|
|
|
// focuses input#pageNumber field
|
2016-04-22 01:39:11 +09:00
|
|
|
PDFViewerApplication.appConfig.toolbar.pageNumber.select();
|
2013-11-12 13:47:03 +09:00
|
|
|
handled = true;
|
|
|
|
break;
|
2013-07-18 23:28:06 +09:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-04-12 07:47:11 +09:00
|
|
|
if (handled) {
|
|
|
|
evt.preventDefault();
|
2011-12-26 06:18:52 +09:00
|
|
|
return;
|
2012-04-12 07:47:11 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
// Some shortcuts should not get handled if a control/input element
|
|
|
|
// is selected.
|
2013-03-31 02:12:32 +09:00
|
|
|
var curElement = document.activeElement || document.querySelector(':focus');
|
2014-01-31 00:54:12 +09:00
|
|
|
var curElementTagName = curElement && curElement.tagName.toUpperCase();
|
|
|
|
if (curElementTagName === 'INPUT' ||
|
|
|
|
curElementTagName === 'TEXTAREA' ||
|
|
|
|
curElementTagName === 'SELECT') {
|
2013-09-05 06:48:31 +09:00
|
|
|
// Make sure that the secondary toolbar is closed when Escape is pressed.
|
|
|
|
if (evt.keyCode !== 27) { // 'Esc'
|
|
|
|
return;
|
|
|
|
}
|
2012-10-02 06:32:02 +09:00
|
|
|
}
|
2015-07-23 19:25:19 +09:00
|
|
|
var ensureViewerFocused = false;
|
2012-04-11 01:55:52 +09:00
|
|
|
|
2013-02-05 03:01:19 +09:00
|
|
|
if (cmd === 0) { // no control key pressed at all.
|
2012-04-11 01:55:52 +09:00
|
|
|
switch (evt.keyCode) {
|
2012-10-06 11:55:47 +09:00
|
|
|
case 38: // up arrow
|
|
|
|
case 33: // pg up
|
|
|
|
case 8: // backspace
|
2015-01-29 21:37:49 +09:00
|
|
|
if (!isViewerInPresentationMode &&
|
2015-07-07 16:17:05 +09:00
|
|
|
pdfViewer.currentScaleValue !== 'page-fit') {
|
2012-10-06 11:55:47 +09:00
|
|
|
break;
|
|
|
|
}
|
2013-03-02 05:54:02 +09:00
|
|
|
/* in presentation mode */
|
2013-02-05 03:01:19 +09:00
|
|
|
/* falls through */
|
2012-04-11 01:55:52 +09:00
|
|
|
case 37: // left arrow
|
2012-12-14 05:10:21 +09:00
|
|
|
// horizontal scrolling using arrow keys
|
2015-01-29 21:37:49 +09:00
|
|
|
if (pdfViewer.isHorizontalScrollbarEnabled) {
|
2012-12-14 05:10:21 +09:00
|
|
|
break;
|
|
|
|
}
|
2013-02-05 03:01:19 +09:00
|
|
|
/* falls through */
|
2012-04-11 01:55:52 +09:00
|
|
|
case 75: // 'k'
|
|
|
|
case 80: // 'p'
|
2014-09-22 20:41:17 +09:00
|
|
|
PDFViewerApplication.page--;
|
2012-04-11 01:55:52 +09:00
|
|
|
handled = true;
|
|
|
|
break;
|
2013-02-11 00:14:17 +09:00
|
|
|
case 27: // esc key
|
2016-05-11 08:31:03 +09:00
|
|
|
if (PDFViewerApplication.secondaryToolbar.isOpen) {
|
|
|
|
PDFViewerApplication.secondaryToolbar.close();
|
2013-09-05 06:48:31 +09:00
|
|
|
handled = true;
|
|
|
|
}
|
2014-09-22 20:41:17 +09:00
|
|
|
if (!PDFViewerApplication.supportsIntegratedFind &&
|
|
|
|
PDFViewerApplication.findBar.opened) {
|
|
|
|
PDFViewerApplication.findBar.close();
|
2013-02-11 00:14:17 +09:00
|
|
|
handled = true;
|
|
|
|
}
|
|
|
|
break;
|
2012-10-06 11:55:47 +09:00
|
|
|
case 40: // down arrow
|
|
|
|
case 34: // pg down
|
|
|
|
case 32: // spacebar
|
2015-01-29 21:37:49 +09:00
|
|
|
if (!isViewerInPresentationMode &&
|
2015-07-07 16:17:05 +09:00
|
|
|
pdfViewer.currentScaleValue !== 'page-fit') {
|
2012-10-06 11:55:47 +09:00
|
|
|
break;
|
|
|
|
}
|
2013-02-05 03:01:19 +09:00
|
|
|
/* falls through */
|
2012-04-11 01:55:52 +09:00
|
|
|
case 39: // right arrow
|
2012-12-14 05:10:21 +09:00
|
|
|
// horizontal scrolling using arrow keys
|
2015-01-29 21:37:49 +09:00
|
|
|
if (pdfViewer.isHorizontalScrollbarEnabled) {
|
2012-12-14 05:10:21 +09:00
|
|
|
break;
|
|
|
|
}
|
2013-02-05 03:01:19 +09:00
|
|
|
/* falls through */
|
2012-04-11 01:55:52 +09:00
|
|
|
case 74: // 'j'
|
|
|
|
case 78: // 'n'
|
2014-09-22 20:41:17 +09:00
|
|
|
PDFViewerApplication.page++;
|
2012-04-11 01:55:52 +09:00
|
|
|
handled = true;
|
|
|
|
break;
|
2012-07-31 00:12:49 +09:00
|
|
|
|
2012-10-06 11:55:47 +09:00
|
|
|
case 36: // home
|
2015-01-29 21:37:49 +09:00
|
|
|
if (isViewerInPresentationMode || PDFViewerApplication.page > 1) {
|
2014-09-22 20:41:17 +09:00
|
|
|
PDFViewerApplication.page = 1;
|
2012-10-06 11:55:47 +09:00
|
|
|
handled = true;
|
2015-07-23 19:25:19 +09:00
|
|
|
ensureViewerFocused = true;
|
2012-10-06 11:55:47 +09:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 35: // end
|
2015-01-29 21:37:49 +09:00
|
|
|
if (isViewerInPresentationMode || (PDFViewerApplication.pdfDocument &&
|
2014-09-22 20:41:17 +09:00
|
|
|
PDFViewerApplication.page < PDFViewerApplication.pagesCount)) {
|
|
|
|
PDFViewerApplication.page = PDFViewerApplication.pagesCount;
|
2012-07-31 00:12:49 +09:00
|
|
|
handled = true;
|
2015-07-23 19:25:19 +09:00
|
|
|
ensureViewerFocused = true;
|
2012-07-31 00:12:49 +09:00
|
|
|
}
|
|
|
|
break;
|
2012-09-08 08:05:14 +09:00
|
|
|
|
2013-10-03 05:09:43 +09:00
|
|
|
case 72: // 'h'
|
2015-01-29 21:37:49 +09:00
|
|
|
if (!isViewerInPresentationMode) {
|
2016-04-16 23:47:48 +09:00
|
|
|
PDFViewerApplication.handTool.toggle();
|
2013-10-03 05:09:43 +09:00
|
|
|
}
|
|
|
|
break;
|
2012-09-08 08:05:14 +09:00
|
|
|
case 82: // 'r'
|
2014-09-22 20:41:17 +09:00
|
|
|
PDFViewerApplication.rotatePages(90);
|
2012-09-08 08:05:14 +09:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-05-16 07:31:17 +09:00
|
|
|
if (cmd === 4) { // shift-key
|
2012-09-08 08:05:14 +09:00
|
|
|
switch (evt.keyCode) {
|
2013-06-27 05:25:47 +09:00
|
|
|
case 32: // spacebar
|
2015-01-29 21:37:49 +09:00
|
|
|
if (!isViewerInPresentationMode &&
|
2015-07-07 16:17:05 +09:00
|
|
|
pdfViewer.currentScaleValue !== 'page-fit') {
|
2013-06-27 05:25:47 +09:00
|
|
|
break;
|
|
|
|
}
|
2014-09-22 20:41:17 +09:00
|
|
|
PDFViewerApplication.page--;
|
2013-06-27 05:25:47 +09:00
|
|
|
handled = true;
|
|
|
|
break;
|
|
|
|
|
2012-09-08 08:05:14 +09:00
|
|
|
case 82: // 'r'
|
2014-09-22 20:41:17 +09:00
|
|
|
PDFViewerApplication.rotatePages(-90);
|
2012-09-08 08:05:14 +09:00
|
|
|
break;
|
2012-04-11 01:55:52 +09:00
|
|
|
}
|
2011-09-03 10:16:52 +09:00
|
|
|
}
|
2011-12-19 04:42:06 +09:00
|
|
|
|
2015-01-29 21:37:49 +09:00
|
|
|
if (!handled && !isViewerInPresentationMode) {
|
2014-02-27 21:33:35 +09:00
|
|
|
// 33=Page Up 34=Page Down 35=End 36=Home
|
|
|
|
// 37=Left 38=Up 39=Right 40=Down
|
|
|
|
// 32=Spacebar
|
2015-07-23 19:25:19 +09:00
|
|
|
if ((evt.keyCode >= 33 && evt.keyCode <= 40) ||
|
|
|
|
(evt.keyCode === 32 && curElementTagName !== 'BUTTON')) {
|
|
|
|
ensureViewerFocused = true;
|
2014-02-27 21:33:35 +09:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-05-16 07:31:17 +09:00
|
|
|
if (cmd === 2) { // alt-key
|
|
|
|
switch (evt.keyCode) {
|
|
|
|
case 37: // left arrow
|
2015-01-29 21:37:49 +09:00
|
|
|
if (isViewerInPresentationMode) {
|
2015-04-27 23:04:11 +09:00
|
|
|
PDFViewerApplication.pdfHistory.back();
|
2013-05-16 07:31:17 +09:00
|
|
|
handled = true;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 39: // right arrow
|
2015-01-29 21:37:49 +09:00
|
|
|
if (isViewerInPresentationMode) {
|
2015-04-27 23:04:11 +09:00
|
|
|
PDFViewerApplication.pdfHistory.forward();
|
2013-05-16 07:31:17 +09:00
|
|
|
handled = true;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-07-23 19:25:19 +09:00
|
|
|
if (ensureViewerFocused && !pdfViewer.containsElement(curElement)) {
|
|
|
|
// The page container is not focused, but a page navigation key has been
|
|
|
|
// pressed. Change the focus to the viewer container to make sure that
|
|
|
|
// navigation by keyboard works as expected.
|
|
|
|
pdfViewer.focus();
|
|
|
|
}
|
|
|
|
|
2011-12-19 04:42:06 +09:00
|
|
|
if (handled) {
|
|
|
|
evt.preventDefault();
|
|
|
|
}
|
2011-09-03 10:16:52 +09:00
|
|
|
});
|
2012-06-29 01:50:25 +09:00
|
|
|
|
|
|
|
window.addEventListener('beforeprint', function beforePrint(evt) {
|
2016-04-26 07:57:15 +09:00
|
|
|
PDFViewerApplication.eventBus.dispatch('beforeprint');
|
2012-06-29 01:50:25 +09:00
|
|
|
});
|
|
|
|
|
|
|
|
window.addEventListener('afterprint', function afterPrint(evt) {
|
2016-04-26 07:57:15 +09:00
|
|
|
PDFViewerApplication.eventBus.dispatch('afterprint');
|
2012-06-29 01:50:25 +09:00
|
|
|
});
|
2012-07-31 00:12:49 +09:00
|
|
|
|
2013-01-26 04:58:49 +09:00
|
|
|
(function animationStartedClosure() {
|
|
|
|
// The offsetParent is not set until the pdf.js iframe or object is visible.
|
|
|
|
// Waiting for first animation.
|
2014-09-22 20:41:17 +09:00
|
|
|
PDFViewerApplication.animationStartedPromise = new Promise(
|
|
|
|
function (resolve) {
|
2014-05-09 21:00:47 +09:00
|
|
|
window.requestAnimationFrame(resolve);
|
2013-01-26 04:58:49 +09:00
|
|
|
});
|
|
|
|
})();
|
2016-04-09 02:34:27 +09:00
|
|
|
|
|
|
|
exports.PDFViewerApplication = PDFViewerApplication;
|
2016-04-16 00:02:14 +09:00
|
|
|
exports.DefaultExernalServices = DefaultExernalServices;
|
2016-04-09 02:34:27 +09:00
|
|
|
}));
|